Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix exception swapping equipment w a full item bag #210

Merged
merged 1 commit into from
Aug 13, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Arrowgene.Ddon.Database/IDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public interface IDatabase

// Equip
bool InsertEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId);
bool ReplaceEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId);
bool UpdateEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId);
bool DeleteEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId);

Expand Down
13 changes: 13 additions & 0 deletions Arrowgene.Ddon.Database/Sql/Core/DdonSqlDbEquipItem.cs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,19 @@ public bool InsertEquipItem(uint commonId, JobId job, EquipType equipType, byte
return this.InsertEquipItem(null, commonId, job, equipType, equipSlot, itemUId);
}

public bool ReplaceEquipItem(TCon conn, uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId)
{
return ExecuteNonQuery(conn, SqlReplaceEquipItem, command =>
{
AddParameter(command, commonId, job, equipType, equipSlot, itemUId);
}) == 1;
}

public bool ReplaceEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId)
{
return this.ReplaceEquipItem(null, commonId, job, equipType, equipSlot, itemUId);
}

public bool UpdateEquipItem(uint commonId, JobId job, EquipType equipType, byte equipSlot, string itemUId)
{
return ExecuteNonQuery(SqlUpdateEquipItem, command =>
Expand Down
111 changes: 77 additions & 34 deletions Arrowgene.Ddon.GameServer/Characters/EquipManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -197,69 +197,112 @@ private void UnequipItem(DdonGameServer server, GameClient client, CharacterComm
});
}

private void EquipItem(DdonGameServer server, GameClient client, CharacterCommon characterToEquipTo, S2CItemUpdateCharacterItemNtc updateCharacterItemNtc, EquipType equipType, byte equipSlot, StorageType srcStorageType, string itemUId, uint characterId, uint pawnId)
private void EquipItem(DdonGameServer server, GameClient client, CharacterCommon characterToEquipTo, S2CItemUpdateCharacterItemNtc updateCharacterItemNtc, EquipType equipType, byte equipSlot, StorageType storageType, string itemUId, uint characterId, uint pawnId)
{
// Find in the bag the item to equip
var tuple = client.Character.Storage.getStorage(srcStorageType).Items
var tuple = client.Character.Storage.getStorage(storageType).Items
.Select((item, index) => new { item, slot = (ushort) (index+1)})
.Where(tuple => tuple.item?.Item1.UId == itemUId)
.First();
Item item = tuple.item!.Item1;
uint itemNum = tuple.item.Item2;
ushort srcSlotNo = tuple.slot;
Item itemToEquip = tuple.item!.Item1;
uint itemToEquipNum = tuple.item.Item2;
ushort storageSlotNo = tuple.slot;

Item? itemInSlot = characterToEquipTo.Equipment.GetEquipItem(characterToEquipTo.Job, (EquipType) equipType, equipSlot);
if(itemInSlot != null)
Item? previouslyEquippedItem = characterToEquipTo.Equipment.GetEquipItem(characterToEquipTo.Job, equipType, equipSlot);

characterToEquipTo.Equipment.SetEquipItem(itemToEquip, characterToEquipTo.Job, equipType, equipSlot);
server.Database.ReplaceEquipItem(characterToEquipTo.CommonId, characterToEquipTo.Job, equipType, equipSlot, itemToEquip.UId);

if(previouslyEquippedItem != null)
{
// When equipping over an already equipped slot, unequip item first
this.UnequipItem(server, client, characterToEquipTo, updateCharacterItemNtc, equipType, equipSlot, srcStorageType, characterId, pawnId);
// When equipping over an already equipped slot, move item in that slot to storage
client.Character.Storage.setStorageItem(previouslyEquippedItem, 1, storageType, storageSlotNo);
server.Database.ReplaceStorageItem(client.Character.CharacterId, storageType, storageSlotNo, previouslyEquippedItem.UId, 1);
updateCharacterItemNtc.UpdateItemList.Add(new CDataItemUpdateResult() {
UpdateItemNum = 0,
ItemList = new CDataItemList() {
ItemUId = previouslyEquippedItem.UId,
ItemId = previouslyEquippedItem.ItemId,
ItemNum = 0,
Unk3 = previouslyEquippedItem.Unk3,
StorageType = StorageType.Unk14,
SlotNo = 1,
Color = previouslyEquippedItem.Color,
PlusValue = previouslyEquippedItem.PlusValue,
Bind = true,
EquipPoint = 0,
EquipCharacterID = characterId,
EquipPawnID = pawnId,
WeaponCrestDataList = previouslyEquippedItem.WeaponCrestDataList,
ArmorCrestDataList = previouslyEquippedItem.ArmorCrestDataList,
EquipElementParamList = previouslyEquippedItem.EquipElementParamList
}
});
updateCharacterItemNtc.UpdateItemList.Add(new CDataItemUpdateResult() {
UpdateItemNum = 1,
ItemList = new CDataItemList() {
ItemUId = previouslyEquippedItem.UId,
ItemId = previouslyEquippedItem.ItemId,
ItemNum = 1,
Unk3 = previouslyEquippedItem.Unk3,
StorageType = storageType,
SlotNo = storageSlotNo,
Color = previouslyEquippedItem.Color,
PlusValue = previouslyEquippedItem.PlusValue,
Bind = true,
EquipPoint = 0,
EquipCharacterID = 0,
EquipPawnID = 0,
WeaponCrestDataList = previouslyEquippedItem.WeaponCrestDataList,
ArmorCrestDataList = previouslyEquippedItem.ArmorCrestDataList,
EquipElementParamList = previouslyEquippedItem.EquipElementParamList
}
});
}
else
{
client.Character.Storage.setStorageItem(null, 0, storageType, storageSlotNo);
server.Database.DeleteStorageItem(client.Character.CharacterId, storageType, storageSlotNo);
}

characterToEquipTo.Equipment.SetEquipItem(item, characterToEquipTo.Job, (EquipType) equipType, equipSlot);
server.Database.InsertEquipItem(characterToEquipTo.CommonId, characterToEquipTo.Job, equipType, equipSlot, item.UId);

// Find slot from which the item will be taken
client.Character.Storage.setStorageItem(null, 0, srcStorageType, tuple.slot);
server.Database.DeleteStorageItem(client.Character.CharacterId, srcStorageType, tuple.slot);

updateCharacterItemNtc.UpdateItemList.Add(new CDataItemUpdateResult() {
UpdateItemNum = 0, // TODO: ?
ItemList = new CDataItemList() {
ItemUId = item.UId,
ItemId = item.ItemId,
ItemUId = itemToEquip.UId,
ItemId = itemToEquip.ItemId,
ItemNum = 0,
Unk3 = item.Unk3,
StorageType = srcStorageType,
SlotNo = srcSlotNo,
Color = item.Color,
PlusValue = item.PlusValue,
Unk3 = itemToEquip.Unk3,
StorageType = storageType,
SlotNo = storageSlotNo,
Color = itemToEquip.Color,
PlusValue = itemToEquip.PlusValue,
Bind = true,
EquipPoint = 0,
EquipCharacterID = characterId,
EquipPawnID = pawnId,
WeaponCrestDataList = item.WeaponCrestDataList,
ArmorCrestDataList = item.ArmorCrestDataList,
EquipElementParamList = item.EquipElementParamList
WeaponCrestDataList = itemToEquip.WeaponCrestDataList,
ArmorCrestDataList = itemToEquip.ArmorCrestDataList,
EquipElementParamList = itemToEquip.EquipElementParamList
}
});
updateCharacterItemNtc.UpdateItemList.Add(new CDataItemUpdateResult() {
UpdateItemNum = 1,
ItemList = new CDataItemList() {
ItemUId = item.UId,
ItemId = item.ItemId,
ItemUId = itemToEquip.UId,
ItemId = itemToEquip.ItemId,
ItemNum = 1,
Unk3 = item.Unk3,
Unk3 = itemToEquip.Unk3,
StorageType = StorageType.Unk14,
SlotNo = 1,
Color = item.Color,
PlusValue = item.PlusValue,
Color = itemToEquip.Color,
PlusValue = itemToEquip.PlusValue,
Bind = true,
EquipPoint = 0,
EquipCharacterID = characterId,
EquipPawnID = pawnId,
WeaponCrestDataList = item.WeaponCrestDataList,
ArmorCrestDataList = item.ArmorCrestDataList,
EquipElementParamList = item.EquipElementParamList
WeaponCrestDataList = itemToEquip.WeaponCrestDataList,
ArmorCrestDataList = itemToEquip.ArmorCrestDataList,
EquipElementParamList = itemToEquip.EquipElementParamList
}
});
}
Expand Down
Loading