@@ -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 ) ;
0 commit comments