Соединение одинаковых итемов в инвентаре в стопки

Пример реализации функции, которая объединяет одинаковые предметы в инвентаре в единые стаки, с учетом максимально допустимого количества.

function JoinAllItems(): Boolean;
var 
  i, j, k: Integer; 
  SearchFlag: Boolean;  
  Item: TItem;   
begin
  for i:= Inv.Count-1 downto 1 do begin   // пробегаем по всему инвентарю

    if (Inv(i).Count = Inv(i).MaxStackSize) or    // если фулстак или
    (Inv(i).Count = Inv.ItemCount(Inv(i).ID)) then Continue;    // или это и есть все итемы, то пропускаем
    SearchFlag:= True;    // включаем флаг поиска совпадений в других слотах

    while (Inv(i).Count < Inv(i).MaxStackSize) and (SearchFlag) do begin    // пока не забили до фулстака и включен флаг
      if (Inv(i).Count = Inv.ItemCount(Inv(i).ID)) then Break;    // если кол-во итемов в этом слоте = кол-ву всех итемов то прекращаем

      for k:= i-1 downto 0 do begin   // пробегаем инвентарь с найденного итема
        if (not ((Inv(k).ID = Inv(i).ID) and (Inv(k).Count < Inv(k).MaxStackSize))) then begin    // если нет хотя бы 1 не фул стака
          SearchFlag:= False;   // то вырубаем флаг поиска соответствий
          Break;  // выходим из цикла
        end;
      end;
      
      for j:= i-1 downto 0 do begin   // пробегаем инвентарь с найденного итема
        if (Inv(j).ID <> Inv(i).ID) or    // если ID не совпадает или
        (Inv(j).Count = Inv(i).MaxStackSize) or   // мы нашли фулстак или
        (Inv(j) = Inv(i)) then Continue;    // сей объект совпадает с предыдущим, то пропускаем такие
        
        if (Inv(j).ID = Inv(i).ID) then begin   //если же нашли совпадение по ID, то
          if (Inv(j).Count = Inv(i).MaxStackSize) then Break;   // пропускаем фулстаки
          Inv.BySlot(Inv(j).Slot, Item);    // инициализируем итем по его слоту
          
          if (Inv(j).Count <= Inv(i).MaxStackSize - Inv(i).Count) then begin    // если кол-во найденного итема <= того, что нужно добавить, то
            Engine.SplitItem(Item, Inv(j).Count, Inv(i).Slot)   // добавляем сколько есть 
          end else begin
            Engine.SplitItem(Item, Inv(i).MaxStackSize - Inv(i).Count, Inv(i).Slot);   // иначе добавляем сколько нужно до фулстака
          end;
        end else SearchFlag:= False; //если же НЕ нашли совпадение по ID, то выключаем флаг, чтобы выключить while и перейти на следующий i
        
      end;
    end;  
  end;
end;

begin
  JoinAllItems();
end.
Структура классов ArcheAngel бота
  • Classes
    • TGameControl
    • TPaxEngine
    • TGameObject
      • TSpawn
        • TLive
          • TPlayer
            • TUser
          • TNpc
            • TMount
          • TDoodad
      • TEffect
        • TBuff
        • TSkill
          • TCast
      • TItem
        • TAucItem
      • TMailItem
    • TGameList
      • TSpawnList
        • TPlayers
        • TNpcs
        • TMobs
        • TDoodads
        • TMounts
      • TInventory
      • TSkills
      • TSlotList
      • TZoneList
      • TBuffs
      • TMail
      • TAuction
    • TChatMessage
    • TAccount
    • TAccounts
    • THistoryMessage
    • TMessages