Skip to content

Commit f69b3a4

Browse files
authored
Merge pull request #849 from pacampbell/fix_emblem_errors
fix: Fix issues found with emblem
2 parents 4b91529 + a87f611 commit f69b3a4

9 files changed

Lines changed: 81 additions & 51 deletions

File tree

Arrowgene.Ddon.GameServer/Characters/DungeonManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ private static void StartBonusDungeon(DdonGameServer server, PartyGroup party, u
173173
var itemUpdateList = new List<CDataItemUpdateResult>();
174174
foreach (var item in dungeonInfo.EntryCostList)
175175
{
176-
itemUpdateList.Add(server.ItemManager.ConsumeItemByIdFromMultipleStorages(server, memberClient.Character, ItemManager.BothStorageTypes, item.ItemId, item.Num));
176+
itemUpdateList.AddRange(server.ItemManager.ConsumeItemByIdFromMultipleStorages(server, memberClient.Character, ItemManager.BothStorageTypes, item.ItemId, item.Num));
177177
}
178178

179179
memberClient.Send(new S2CItemUpdateCharacterItemNtc()

Arrowgene.Ddon.GameServer/Characters/ItemManager.cs

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -331,8 +331,12 @@ public List<CDataItemUpdateResult> ConsumeItemByUIdFromMultipleStorages(DdonServ
331331
return results.Count > 0 ? results[0] : null;
332332
}
333333

334-
public CDataItemUpdateResult? ConsumeItemByIdFromMultipleStorages(DdonServer<GameClient> server, Character character, List<StorageType> storages, uint itemId, uint consumeNum, DbConnection? connectionIn = null)
334+
public List<CDataItemUpdateResult> ConsumeItemByIdFromMultipleStorages(DdonServer<GameClient> server, Character character, List<StorageType> storages, uint itemId, uint consumeNum, DbConnection? connectionIn = null)
335335
{
336+
uint amountToConsume = consumeNum;
337+
var results = new List<CDataItemUpdateResult>();
338+
339+
var stacks = new List<(StorageType StorageType, string UID, uint amount)>();
336340
foreach (StorageType storageType in storages)
337341
{
338342
var items = character.Storage.GetStorage(storageType).FindItemsById(itemId);
@@ -343,19 +347,38 @@ public List<CDataItemUpdateResult> ConsumeItemByUIdFromMultipleStorages(DdonServ
343347

344348
foreach (var item in items)
345349
{
346-
if (item.Item3 < consumeNum)
350+
var amount = Math.Min(item.Item3, amountToConsume);
351+
stacks.Add((storageType, item.Item2.UId, amount));
352+
353+
amountToConsume -= amount;
354+
if (amountToConsume == 0)
347355
{
348-
continue;
356+
break;
349357
}
358+
}
350359

351-
return ConsumeItemByUId(server, character, storageType, item.Item2.UId, consumeNum, connectionIn);
360+
if (amountToConsume == 0)
361+
{
362+
break;
352363
}
353364
}
354365

355-
return null;
366+
if (amountToConsume > 0)
367+
{
368+
throw new ResponseErrorException(ErrorCode.ERROR_CODE_CHARACTER_ITEM_NOT_FOUND, $"Unable to locate {(ItemId)itemId} x{consumeNum} in the player inventories");
369+
}
370+
371+
foreach (var stack in stacks)
372+
{
373+
var result = ConsumeItemByUId(server, character, stack.StorageType, stack.UID, stack.amount, connectionIn) ??
374+
throw new ResponseErrorException(ErrorCode.ERROR_CODE_CHARACTER_ITEM_NOT_FOUND, $"Failed to comsume {stack.amount} from {stack.UID}");
375+
results.Add(result);
376+
}
377+
378+
return results;
356379
}
357380

358-
public CDataItemUpdateResult? ConsumeItemByIdFromItemBag(DdonServer<GameClient> server, Character character, uint itemId, uint consumeNum, DbConnection? connectionIn = null)
381+
public List<CDataItemUpdateResult> ConsumeItemByIdFromItemBag(DdonServer<GameClient> server, Character character, uint itemId, uint consumeNum, DbConnection? connectionIn = null)
359382
{
360383
return ConsumeItemByIdFromMultipleStorages(server, character, ItemBagStorageTypes, itemId, consumeNum, connectionIn);
361384
}
@@ -419,6 +442,26 @@ public void EmbodyItem(DdonGameServer server, Character character, StorageType s
419442
InsertItem(server, character, item, destinationStorage, slot, amount, connectionIn);
420443
}
421444

445+
public CDataItemUpdateResult AddNewItem(DdonGameServer server, Character character, bool itemBag, Item item, uint amount, DbConnection connectionIn)
446+
{
447+
Storage destinationStorage;
448+
449+
ClientItemInfo clientItemInfo = ClientItemInfo.GetInfoForItemId(server.AssetRepository.ClientItemInfos, item.ItemId);
450+
if (itemBag)
451+
{
452+
destinationStorage = character.Storage.GetStorage(clientItemInfo.StorageType);
453+
}
454+
else
455+
{
456+
destinationStorage = character.Storage.GetStorage(StorageType.StorageBoxNormal);
457+
}
458+
459+
ushort slotNo = destinationStorage.AddItem(item, amount);
460+
InsertItem(server, character, item, destinationStorage, slotNo, amount, connectionIn);
461+
462+
return CreateItemUpdateResult(character, item, destinationStorage, slotNo, amount, amount);
463+
}
464+
422465
public List<CDataItemUpdateResult> AddItem(DdonServer<GameClient> server, Character character, bool itemBag, uint itemId, uint num, byte plusvalue = 0, DbConnection? connectionIn = null)
423466
{
424467
ClientItemInfo clientItemInfo = ClientItemInfo.GetInfoForItemId(server.AssetRepository.ClientItemInfos, itemId);

Arrowgene.Ddon.GameServer/Handler/DispelExchangeDispelItemHandler.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,28 +75,9 @@ public override PacketQueue Handle(GameClient client, C2SDispelExchangeDispelIte
7575
}
7676
else
7777
{
78-
List<CDataItemUpdateResult> itemUpdateResults = Server.ItemManager.AddItem(Server, client.Character, toBag, purchase.ItemId, purchase.ItemNum, connectionIn: connection);
79-
if (itemUpdateResults.Count != 1)
80-
{
81-
throw new ResponseErrorException(ErrorCode.ERROR_CODE_ITEM_INTERNAL_ERROR);
82-
}
83-
84-
var newItem = client.Character.Storage.FindItemByUIdInStorage(ItemManager.BothStorageTypes, itemUpdateResults[0].ItemList.ItemUId).Item2.Item2;
85-
if (purchase.EquipElementParamList.Count > 0)
86-
{
87-
foreach (var elementParam in purchase.EquipElementParamList)
88-
{
89-
Server.Database.InsertCrest(client.Character.CommonId, itemUpdateResults[0].ItemList.ItemUId, elementParam.SlotNo, elementParam.CrestId, elementParam.Add, connection);
90-
newItem.EquipElementParamList.Add(elementParam);
91-
}
92-
93-
itemUpdateResults[0].ItemList.EquipElementParamList = purchase.EquipElementParamList;
94-
}
95-
96-
updateCharacterItemNtc.UpdateItemList.AddRange(itemUpdateResults);
78+
updateCharacterItemNtc.UpdateItemList.AddRange(Server.ItemManager.AddNewItem(Server, client.Character, toBag, purchase.ToItem(), purchase.ItemNum, connection));
9779
}
9880

99-
10081
client.Enqueue(updateCharacterItemNtc, queue);
10182
res.DispelItemResultList.Add(purchase);
10283

Arrowgene.Ddon.GameServer/Handler/EquipEnhancedEnhanceItemHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public override PacketQueue Handle(GameClient client, C2SEquipEnhancedEnhanceIte
3737
{
3838
foreach (var itemCost in request.UpgradeItemCostList)
3939
{
40-
updateCharacterItemNtc.UpdateItemList.Add(Server.ItemManager.ConsumeItemByIdFromItemBag(Server, client.Character, (uint) itemCost.ItemId, itemCost.Amount, connection));
40+
updateCharacterItemNtc.UpdateItemList.AddRange(Server.ItemManager.ConsumeItemByIdFromMultipleStorages(Server, client.Character, ItemManager.AllItemStorages, (uint) itemCost.ItemId, itemCost.Amount, connection));
4141
}
4242

4343
bool forceGreatSuccess = false;

Arrowgene.Ddon.GameServer/Handler/JobEmblemAttachElementHandler.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public override PacketQueue Handle(GameClient client, C2SJobEmblemAttachElementR
4141
{
4242
foreach (var item in request.AttachChanceItems)
4343
{
44-
itemUpdateNtc.UpdateItemList.Add(Server.ItemManager.ConsumeItemByIdFromMultipleStorages(Server, client.Character, ItemManager.ItemBagStorageTypes, (uint) item.ItemId, item.Num, connection));
44+
itemUpdateNtc.UpdateItemList.AddRange(Server.ItemManager.ConsumeItemByIdFromMultipleStorages(Server, client.Character, ItemManager.BothStorageTypes, (uint) item.ItemId, item.Num, connection));
4545
}
4646

4747
foreach (var currency in request.PremiumCurrencyCost)
@@ -51,18 +51,16 @@ public override PacketQueue Handle(GameClient client, C2SJobEmblemAttachElementR
5151

5252
if (isSuccess)
5353
{
54-
var crestIds = request.JewelryUIDs.Select(x => client.Character.Storage.FindItemByUIdInStorage(ItemManager.EquipmentStorages, x).Item2.Item2.EquipElementParamList)
54+
var crests = request.JewelryUIDs.Select(x => client.Character.Storage.FindItemByUIdInStorage(ItemManager.EquipmentStorages, x).Item2.Item2.EquipElementParamList)
5555
.SelectMany(x => x)
56-
.Select(x => x.CrestId)
57-
.ToHashSet()
5856
.ToList();
59-
if (crestIds.Count == 0)
57+
if (crests.Count == 0)
6058
{
6159
throw new ResponseErrorException(ErrorCode.ERROR_CODE_ITEM_INTERNAL_ERROR, "Failed to locate crest ids for emblem inheritance");
6260
}
6361

6462
// Select a random crest to inherit if there are multiple
65-
var crestId = crestIds[Random.Shared.Next(0, crestIds.Count)];
63+
var crest = crests[Random.Shared.Next(0, crests.Count)];
6664
foreach (var uid in request.EmblemUIDs)
6765
{
6866
var (storageType, storageInfo) = client.Character.Storage.FindItemByUIdInStorage(ItemManager.EquipmentStorages, uid);
@@ -78,24 +76,23 @@ public override PacketQueue Handle(GameClient client, C2SJobEmblemAttachElementR
7876
relativeSlotNo = EquipManager.DeterminePawnEquipSlot(relativeSlotNo);
7977
}
8078

81-
// itemUpdateNtc.UpdateItemList.Add(Server.ItemManager.CreateItemUpdateResult(characterCommon, item, storageType, relativeSlotNo, 0, 0));
82-
8379
var match = item.EquipElementParamList.Where(x => x.SlotNo == request.InheritanceSlot).FirstOrDefault();
8480
if (match == null)
8581
{
8682
item.EquipElementParamList.Add(new CDataEquipElementParam()
8783
{
8884
SlotNo = request.InheritanceSlot,
89-
CrestId = crestId,
85+
CrestId = crest.CrestId,
86+
Add = crest.Add
9087
});
9188
}
9289
else
9390
{
94-
match.CrestId = crestId;
95-
match.Add = 0;
91+
match.CrestId = crest.CrestId;
92+
match.Add = crest.Add;
9693
}
9794

98-
Server.Database.InsertCrest(characterCommon.CommonId, uid, request.InheritanceSlot, crestId, 0, connection);
95+
Server.Database.InsertCrest(characterCommon.CommonId, uid, request.InheritanceSlot, crest.CrestId, crest.Add, connection);
9996
itemUpdateNtc.UpdateItemList.Add(Server.ItemManager.CreateItemUpdateResult(characterCommon, item, storageType, relativeSlotNo, 1, 1));
10097
}
10198
}

Arrowgene.Ddon.GameServer/Handler/PawnCreatePawnHandler.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,7 @@ public override S2CPawnCreatePawnRes Handle(GameClient client, C2SPawnCreatePawn
7272
client.Send(new S2CItemUpdateCharacterItemNtc()
7373
{
7474
UpdateType = ItemNoticeType.CreatePawn,
75-
UpdateItemList = new()
76-
{
77-
result
78-
}
75+
UpdateItemList = result
7976
});
8077
}
8178

Arrowgene.Ddon.GameServer/Quests/GenericQuest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,7 @@ public override List<CDataQuestProcessState> StateMachineExecute(DdonGameServer
275275
packets.Enqueue(client, new S2CItemUpdateCharacterItemNtc()
276276
{
277277
UpdateType = 0,
278-
UpdateItemList = new List<CDataItemUpdateResult>() { result }
278+
UpdateItemList = result
279279
});
280280
}
281281
}

Arrowgene.Ddon.Shared/Entity/Structure/CDataDispelResultInfo.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Arrowgene.Buffers;
2+
using Arrowgene.Ddon.Shared.Model;
23
using System.Collections.Generic;
34

45
namespace Arrowgene.Ddon.Shared.Entity.Structure
@@ -13,11 +14,11 @@ public CDataDispelResultInfo()
1314
public uint ItemId { get; set; }
1415
public uint ItemNum { get; set; }
1516
public byte Color { get; set; }
16-
public byte Plus { get; set; }
17+
public byte Plus { get; set; } // +0, +1, +2, +3
1718
public List<CDataEquipElementParam> EquipElementParamList { get; set; }
18-
public byte Unk0 { get; set; }
19-
public uint Unk1 { get; set; }
20-
public uint Unk2 { get; set; }
19+
public byte Unk0 { get; set; } // Safety Setting?
20+
public uint Unk1 { get; set; } // Equip Points?
21+
public uint Unk2 { get; set; } // Equip Points?
2122

2223
public class Serializer : EntitySerializer<CDataDispelResultInfo>
2324
{
@@ -47,6 +48,17 @@ public override CDataDispelResultInfo Read(IBuffer buffer)
4748
return obj;
4849
}
4950
}
51+
52+
public Item ToItem()
53+
{
54+
return new Item()
55+
{
56+
ItemId = ItemId,
57+
Color = Color,
58+
PlusValue = Plus,
59+
EquipElementParamList = EquipElementParamList,
60+
};
61+
}
5062
}
5163
}
5264

Arrowgene.Ddon.Shared/Entity/Structure/CDataItemUpdateResult.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ public class CDataItemUpdateResult
66
{
77
public CDataItemUpdateResult()
88
{
9-
ItemList=new CDataItemList();
9+
ItemList = new CDataItemList();
1010
UpdateItemNum=0;
1111
}
1212

@@ -17,7 +17,7 @@ public class Serializer : EntitySerializer<CDataItemUpdateResult>
1717
{
1818
public override void Write(IBuffer buffer, CDataItemUpdateResult obj)
1919
{
20-
WriteEntity<CDataItemList>(buffer, obj.ItemList);
20+
WriteEntity(buffer, obj.ItemList);
2121
WriteInt32(buffer, obj.UpdateItemNum);
2222
}
2323

0 commit comments

Comments
 (0)