diff --git a/src/engine/net/client/ClientMessagePump.java b/src/engine/net/client/ClientMessagePump.java index a7864bcb..35c66319 100644 --- a/src/engine/net/client/ClientMessagePump.java +++ b/src/engine/net/client/ClientMessagePump.java @@ -446,6 +446,7 @@ public class ClientMessagePump implements NetMsgHandler { dispatch = Dispatch.borrow(player, msg); DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); + itemManager.StackResources(); } private static void transferItemFromVaultToInventory(TransferItemFromVaultToInventoryMsg msg, ClientConnection origin) { @@ -460,7 +461,7 @@ public class ClientMessagePump implements NetMsgHandler { return; player.getAccount().transferItemFromVaultToInventory(msg, origin); - + player.getCharItemManager().StackResources(); } //call this if the transfer fails server side to kick the item back to inventory from vault @@ -489,7 +490,6 @@ public class ClientMessagePump implements NetMsgHandler { if (player.getAccount() == null) return; - player.getAccount().transferItemFromInventoryToVault(msg, origin); } @@ -507,6 +507,7 @@ public class ClientMessagePump implements NetMsgHandler { DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); ChatManager.chatInfoError(player, "Can't transfer to vault: " + reason); + player.getAccount().transferItemFromInventoryToVault(msg, origin); } private static void transferGoldFromVaultToInventory(TransferGoldFromVaultToInventoryMsg msg, ClientConnection origin) { @@ -992,6 +993,11 @@ public class ClientMessagePump implements NetMsgHandler { String text = player.getFirstName() + " has looted " + name + '.'; ChatManager.chatGroupInfoCanSee(player, text); } + + if(item.getItemBase().getType().equals(ItemType.RESOURCE)){ + player.getCharItemManager().StackResources(); + } + } catch (Exception e) { Logger.info(e.getMessage()); } finally { @@ -1608,7 +1614,9 @@ public class ClientMessagePump implements NetMsgHandler { DispatchMessage.dispatchMsgDispatch(dispatch, DispatchChannel.SECONDARY); itemMan.updateInventory(); } - + if(buy.getItemBase().getType().equals(ItemType.RESOURCE)){ + itemMan.StackResources(); + } } finally { origin.buyLock.unlock(); } diff --git a/src/engine/objects/CharacterItemManager.java b/src/engine/objects/CharacterItemManager.java index 80c8950b..82e92101 100644 --- a/src/engine/objects/CharacterItemManager.java +++ b/src/engine/objects/CharacterItemManager.java @@ -12,6 +12,7 @@ package engine.objects; import engine.Enum; import engine.Enum.GameObjectType; import engine.Enum.ItemType; +import engine.devcmd.cmds.MakeItemCmd; import engine.gameManager.*; import engine.math.Vector3fImmutable; import engine.net.Dispatch; @@ -23,10 +24,7 @@ import engine.powers.poweractions.AbstractPowerAction; import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; @@ -778,6 +776,8 @@ public class CharacterItemManager { this.commitTrade(); this.closeTradeWindow(ctwm1, false); other.getCharItemManager().closeTradeWindow(ctwm2, false); + other.getCharItemManager().StackResources(); + this.StackResources(); } return true; } @@ -1254,18 +1254,12 @@ public class CharacterItemManager { } return false; } - } //else if (i.getItemBase().getType().equals(ItemType.RESOURCE)) { - // if(this.inventoryContainsResource(i)){ - // Item resource = getResource(i); - // if(resource != null){ - // resource.setNumOfItems(resource.getNumOfItems() + i.getNumOfItems()); - // return true; - // } - //} - // } - + } this.inventory.add(i); this.itemIDtoType.put(i.getObjectUUID(), i.getObjectType().ordinal()); + if(i.getItemBase().getType().equals(ItemType.RESOURCE)){ + this.StackResources(); + } return true; } @@ -2626,4 +2620,57 @@ public class CharacterItemManager { } + public void StackResources(){ + if(this.getOwner().getObjectType().equals(GameObjectType.PlayerCharacter) == false) + return; + //create hashmap of all resources in inventory sorted by type + HashMap> resources = new HashMap<>(); + //populate resources hashmap with items currently in inventory + for(Item item : this.getInventory()){ + if(Warehouse.getMaxResources().get(item.getItemBaseID()) != null && Warehouse.getMaxResources().get(item.getItemBaseID()) != 0){ + if(resources.containsKey(item.getItemBaseID())){ + resources.get(item.getItemBase()).add(item); + } else{ + resources.put(item.getItemBase(),new ArrayList<>()); + } + } + } + //create a purge list to remove form inventory after we compile all the stacks together + ArrayList purgeList = new ArrayList<>(); + ArrayList newStacks = new ArrayList<>(); + //now we have all our resources sorted, lets combine them into one single stack for each type + for(ItemBase resourceBase : resources.keySet()){ + int count = 0; + for(Item resource : resources.get(resourceBase)){ + count += resource.getNumOfItems(); + purgeList.add(resource); + } + Item item = new Item(resourceBase, this.getOwner().getObjectUUID(), + Enum.OwnerType.PlayerCharacter, (byte) 0, (byte) 0, (short) resourceBase.getDurability(), (short) resourceBase.getDurability(), + true, false, Enum.ItemContainerType.INVENTORY, (byte) 0, + new ArrayList<>(), ""); + + item.setNumOfItems(count); + newStacks.add(item); + } + //create new stacks in database, add to inventory and update window + for(Item item : newStacks){ + try { + item = DbManager.ItemQueries.ADD_ITEM(item); + if(item != null){ + this.addItemToInventory(item); + this.updateInventory(); + } + } catch (Exception e) { + ChatManager.chatSystemError((PlayerCharacter)this.getOwner(), "Resource Stack Error: Unable to create item. " + e.getMessage()); + } + } + + for (Item purged : purgeList){ + this.delete(purged); + } + + this.updateInventory(); + } + } diff --git a/src/engine/objects/Warehouse.java b/src/engine/objects/Warehouse.java index c24513fc..7b3adebb 100644 --- a/src/engine/objects/Warehouse.java +++ b/src/engine/objects/Warehouse.java @@ -217,6 +217,8 @@ public class Warehouse extends AbstractWorldObject { vrm.configure(); dispatch = Dispatch.borrow(player, vrm); DispatchMessage.dispatchMsgDispatch(dispatch, Enum.DispatchChannel.SECONDARY); + + player.getCharItemManager().StackResources(); } public static void warehouseLock(MerchantMsg msg, PlayerCharacter player, NPC npc, ClientConnection origin) {