From ea86e06734a9b689e8f153e9a883a455468704d8 Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 14 May 2025 12:31:07 -0400 Subject: [PATCH] work on unifying inventory transforms --- .../state/inventory/ClientInventoryState.java | 101 ++++++++-------- .../state/inventory/ServerInventoryState.java | 65 ++++------ .../entity/types/creature/CreatureUtils.java | 6 +- .../client/protocol/InventoryProtocol.java | 9 ++ .../parser/net/message/InventoryMessage.java | 111 ++++++++++++++++++ .../parser/net/message/NetworkMessage.java | 5 + .../net/parser/net/message/TypeBytes.java | 17 +-- .../server/protocol/InventoryProtocol.java | 1 + .../actions/interact/CollectItemNode.java | 2 +- .../server/entity/unit/UnitUtils.java | 8 +- src/net/inventory.json | 11 ++ .../state/attack/ServerAttackTreeTests.java | 4 +- .../state/equip/ClientEquipStateTests.java | 2 +- .../state/equip/ServerEquipStateTests.java | 6 +- 14 files changed, 237 insertions(+), 111 deletions(-) diff --git a/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java index df403849..11088725 100644 --- a/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java @@ -61,21 +61,28 @@ public class ClientInventoryState implements BehaviorTree { for(InventoryMessage message : networkMessageQueue){ networkMessageQueue.remove(message); switch(message.getMessageSubtype()){ - case ADDITEMTOINVENTORY: { + case SERVERCOMMANDSTOREITEM: { + LoggerInterface.loggerNetworking.WARNING("Client create/move item " + message.getitemEntId()); + Entity clientSideContainer = Globals.clientSceneWrapper.getEntityFromServerId(message.gettargetEntId()); + Entity clientSideItem = null; if(Globals.clientSceneWrapper.containsServerId(message.getitemEntId())){ - LoggerInterface.loggerNetworking.WARNING("Client move item " + message.getitemEntId()); - Entity clientSideContainer = Globals.clientSceneWrapper.getEntityFromServerId(message.gettargetEntId()); - Entity clientSideItem = Globals.clientSceneWrapper.getEntityFromServerId(message.getitemEntId()); - ClientInventoryState.moveItem(clientSideContainer, clientSideItem, message.getcontainerType(), message.getequipPointId()); + clientSideItem = Globals.clientSceneWrapper.getEntityFromServerId(message.getitemEntId()); } else { - LoggerInterface.loggerNetworking.WARNING("Client create item " + message.getitemEntId()); - Entity clientSideContainer = Globals.clientSceneWrapper.getEntityFromServerId(message.gettargetEntId()); - //the ID we get is of the in-inventory item - Entity inInventorySpawnedItem = ClientInventoryState.clientConstructInInventoryItem(clientSideContainer,message.getitemTemplate()); - //map id - if(inInventorySpawnedItem != null){ - Globals.clientSceneWrapper.mapIdToId(inInventorySpawnedItem.getId(), message.getitemEntId()); - } + clientSideItem = ClientInventoryState.clientConstructInInventoryItem(clientSideContainer,message.getitemTemplate()); + Globals.clientSceneWrapper.mapIdToId(clientSideItem.getId(), message.getitemEntId()); + } + ClientInventoryState.moveItem(clientSideContainer, clientSideItem, message.getcontainerType(), message.getequipPointId()); + //attempt re-render ui + WindowUtils.attemptRedrawInventoryWindows(); + } break; + case ADDITEMTOINVENTORY: { + LoggerInterface.loggerNetworking.WARNING("Client create item " + message.getitemEntId()); + Entity clientSideContainer = Globals.clientSceneWrapper.getEntityFromServerId(message.gettargetEntId()); + //the ID we get is of the in-inventory item + Entity inInventorySpawnedItem = ClientInventoryState.clientConstructInInventoryItem(clientSideContainer,message.getitemTemplate()); + //map id + if(inInventorySpawnedItem != null){ + Globals.clientSceneWrapper.mapIdToId(inInventorySpawnedItem.getId(), message.getitemEntId()); } //attempt re-render ui WindowUtils.attemptRedrawInventoryWindows(); @@ -246,6 +253,8 @@ public class ClientInventoryState implements BehaviorTree { * @param targetSlot (Optional) The slot within the container */ private static void moveItem(Entity containerEnt, Entity itemEnt, int targetContainer, String targetSlot){ + // + //remove from existing container if relevant if(ItemUtils.getContainingParent(itemEnt) != null){ Entity existingContainerEnt = ItemUtils.getContainingParent(itemEnt); if(InventoryUtils.hasNaturalInventory(existingContainerEnt)){ @@ -269,68 +278,66 @@ public class ClientInventoryState implements BehaviorTree { equipInventory.tryRemoveItem(itemEnt); } } + // + //remove from inventories on existing container + if(InventoryUtils.hasNaturalInventory(containerEnt)){ + UnrelationalInventoryState naturalInventory = InventoryUtils.getNaturalInventory(containerEnt); + naturalInventory.removeItem(itemEnt); + } + if(InventoryUtils.hasEquipInventory(containerEnt)){ + RelationalInventoryState equipInventory = InventoryUtils.getEquipInventory(containerEnt); + equipInventory.tryRemoveItem(itemEnt); + } + if(ClientEquipState.getClientEquipState(containerEnt) != null){ + ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(containerEnt); + clientEquipState.clientTransformUnequip(itemEnt); + } + if(InventoryUtils.hasToolbarInventory(containerEnt)){ + RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(containerEnt); + toolbarInventory.tryRemoveItem(itemEnt); + } + if(ClientToolbarState.hasClientToolbarState(containerEnt)){ + ClientToolbarState toolbarState = ClientToolbarState.getClientToolbarState(containerEnt); + toolbarState.update(); + } + // + //store in new container switch(targetContainer){ case InventoryProtocol.INVENTORY_TYPE_EQUIP: { String equipPointId = targetSlot; - if(InventoryUtils.hasNaturalInventory(containerEnt)){ - UnrelationalInventoryState naturalInventory = InventoryUtils.getNaturalInventory(containerEnt); - naturalInventory.removeItem(itemEnt); - } if(InventoryUtils.hasEquipInventory(containerEnt)){ RelationalInventoryState equipInventory = InventoryUtils.getEquipInventory(containerEnt); - equipInventory.tryRemoveItem(itemEnt); equipInventory.addItem(equipPointId, itemEnt); } if(ClientEquipState.getClientEquipState(containerEnt) != null){ ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(containerEnt); clientEquipState.attemptEquip(itemEnt, clientEquipState.getEquipPoint(equipPointId)); } - if(InventoryUtils.hasToolbarInventory(containerEnt)){ - RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(containerEnt); - toolbarInventory.tryRemoveItem(itemEnt); - } } break; case InventoryProtocol.INVENTORY_TYPE_NATURAL: { if(InventoryUtils.hasNaturalInventory(containerEnt)){ UnrelationalInventoryState naturalInventory = InventoryUtils.getNaturalInventory(containerEnt); - naturalInventory.removeItem(itemEnt); naturalInventory.addItem(itemEnt); } - if(InventoryUtils.hasEquipInventory(containerEnt)){ - RelationalInventoryState equipInventory = InventoryUtils.getEquipInventory(containerEnt); - if(ClientEquipState.getClientEquipState(containerEnt) != null){ - ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(containerEnt); - clientEquipState.clientTransformUnequipPoint(equipInventory.getItemSlot(itemEnt)); - } - equipInventory.tryRemoveItem(itemEnt); - } - if(InventoryUtils.hasToolbarInventory(containerEnt)){ - RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(containerEnt); - toolbarInventory.tryRemoveItem(itemEnt); - } } break; case InventoryProtocol.INVENTORY_TYPE_TOOLBAR: { - if(InventoryUtils.hasNaturalInventory(containerEnt)){ - UnrelationalInventoryState naturalInventory = InventoryUtils.getNaturalInventory(containerEnt); - naturalInventory.removeItem(itemEnt); - } - if(InventoryUtils.hasEquipInventory(containerEnt)){ - RelationalInventoryState equipInventory = InventoryUtils.getEquipInventory(containerEnt); - if(ClientEquipState.getClientEquipState(containerEnt) != null){ - ClientEquipState clientEquipState = ClientEquipState.getClientEquipState(containerEnt); - clientEquipState.clientTransformUnequipPoint(equipInventory.getItemSlot(itemEnt)); - } - equipInventory.tryRemoveItem(itemEnt); - } if(InventoryUtils.hasToolbarInventory(containerEnt)){ RelationalInventoryState toolbarInventory = InventoryUtils.getToolbarInventory(containerEnt); toolbarInventory.tryRemoveItem(itemEnt); toolbarInventory.addItem(targetSlot, itemEnt); } + if(ClientToolbarState.hasClientToolbarState(containerEnt)){ + ClientToolbarState toolbarState = ClientToolbarState.getClientToolbarState(containerEnt); + toolbarState.update(); + } } } } + /** + * Adds a network message to the client inventory state + * @param networkMessage The message + */ public void addNetworkMessage(InventoryMessage networkMessage) { networkMessageQueue.add(networkMessage); } diff --git a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java index fa57df20..63cef3e6 100644 --- a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java @@ -81,40 +81,30 @@ public class ServerInventoryState implements BehaviorTree { networkMessageQueue.remove(message); switch(message.getMessageSubtype()){ case ADDITEMTOINVENTORY: { - ServerInventoryState.serverAttemptStoreItemTransform(parent, EntityLookupUtils.getEntityById(message.getitemEntId())); + Entity itemEnt = EntityLookupUtils.getEntityById(message.getitemEntId()); + ServerInventoryState.attemptStoreItemAnyInventory(parent,itemEnt); } break; case REMOVEITEMFROMINVENTORY: { - ServerInventoryState.serverAttemptEjectItem(parent, EntityLookupUtils.getEntityById(message.getentityId())); + ServerInventoryState.serverAttemptEjectItemTransform(parent, EntityLookupUtils.getEntityById(message.getentityId())); } break; case CLIENTREQUESTEQUIPITEM: { //item to equip - Entity target = EntityLookupUtils.getEntityById(message.getentityId()); - //perform transform if it makes sense - if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && ServerEquipState.hasEquipState(parent)){ - ServerEquipState equipState = ServerEquipState.getEquipState(parent); - EquipPoint point = equipState.getEquipPoint(message.getequipPointId()); - equipState.commandAttemptEquip(target, point); - } + Entity itemEnt = EntityLookupUtils.getEntityById(message.getentityId()); + ServerInventoryState.attemptStoreItemTransform(parent,itemEnt,InventoryProtocol.INVENTORY_TYPE_EQUIP,message.getequipPointId()); } break; case CLIENTREQUESTUNEQUIPITEM: { - //make sure can unequip - if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && ServerEquipState.hasEquipState(parent)){ - ServerEquipState equipState = ServerEquipState.getEquipState(parent); - // EquipPoint point = equipState.getEquipPoint(message.getequipPointId()); - if(equipState.hasEquippedAtPoint(message.getequipPointId())){ - equipState.commandAttemptUnequip(message.getequipPointId()); - //tell player - } - } + Entity itemEnt = EntityLookupUtils.getEntityById(message.getentityId()); + ServerInventoryState.serverAttemptEjectItemTransform(parent, itemEnt); } break; case CLIENTREQUESTADDNATURAL: { - ServerInventoryState.serverAddToNatural(parent, EntityLookupUtils.getEntityById(message.getentityId())); + Entity itemEnt = EntityLookupUtils.getEntityById(message.getitemEntId()); + ServerInventoryState.attemptStoreItemTransform(parent,itemEnt,InventoryProtocol.INVENTORY_TYPE_NATURAL,""); } break; case CLIENTREQUESTADDTOOLBAR: { - Entity itemEnt = EntityLookupUtils.getEntityById(message.getentityId()); - ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(parent); - serverToolbarState.attemptEquip(itemEnt, message.gettoolbarId()); + Entity itemEnt = EntityLookupUtils.getEntityById(message.getitemEntId()); + String toolbarSlot = message.gettoolbarId() + ""; + ServerInventoryState.attemptStoreItemTransform(parent,itemEnt,InventoryProtocol.INVENTORY_TYPE_TOOLBAR,toolbarSlot); } break; case CLIENTUPDATETOOLBAR: { ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(parent); @@ -136,12 +126,12 @@ public class ServerInventoryState implements BehaviorTree { if(container != this.parent){ LoggerInterface.loggerEngine.WARNING("A client is trying to pick up an item for another entity!"); } else { - ServerInventoryState.serverAttemptStoreItemTransform(parent, itemEnt, message.getcontainerType(), message.getequipPointId()); + ServerInventoryState.attemptStoreItemTransform(parent, itemEnt, message.getcontainerType(), message.getequipPointId()); } } //transfering from one container to another if(currentParent != null){ - ServerInventoryState.serverAttemptStoreItemTransform(container, itemEnt, message.getcontainerType(), message.getequipPointId()); + ServerInventoryState.attemptStoreItemTransform(container, itemEnt, message.getcontainerType(), message.getequipPointId()); } } break; case CLIENTREQUESTWATCHINVENTORY: { @@ -158,6 +148,7 @@ public class ServerInventoryState implements BehaviorTree { } break; case CLIENTREQUESTCRAFT: case CLIENTREQUESTPERFORMITEMACTION: + case SERVERCOMMANDSTOREITEM: case SERVERCOMMANDUNEQUIPITEM: case SERVERCOMMANDEQUIPITEM: case SERVERCOMMANDMOVEITEMCONTAINER: @@ -266,7 +257,7 @@ public class ServerInventoryState implements BehaviorTree { * @param item The item to store * @return The in-inventory item */ - public static Entity serverAttemptStoreItemTransform(Entity creature, Entity item){ + public static Entity attemptStoreItemAnyInventory(Entity creature, Entity item){ if(item == null){ throw new Error("Null item provided! " + item); } @@ -390,7 +381,7 @@ public class ServerInventoryState implements BehaviorTree { * @param slotId (Optional) The slot within the container to store into * @return The in-inventory item */ - public static void serverAttemptStoreItemTransform(Entity container, Entity itemEnt, int containerType, String slotId){ + public static void attemptStoreItemTransform(Entity container, Entity itemEnt, int containerType, String slotId){ if(itemEnt == null){ throw new Error("Null item provided! " + itemEnt); } @@ -429,7 +420,7 @@ public class ServerInventoryState implements BehaviorTree { if(!ItemUtils.isItem(item)){ return null; } - if(InventoryUtils.hasNaturalInventory(creature)){ + if(!InventoryUtils.hasNaturalInventory(creature)){ return null; } //get inventory @@ -466,7 +457,13 @@ public class ServerInventoryState implements BehaviorTree { int controllerPlayerID = CreatureUtils.getControllerPlayerId(watcher); Player controllerPlayer = Globals.playerManager.getPlayerFromId(controllerPlayerID); //send message - controllerPlayer.addMessage(InventoryMessage.constructaddItemToInventoryMessage(creature.getId(), inventoryItem.getId(), ItemUtils.getType(inventoryItem))); + controllerPlayer.addMessage(InventoryMessage.constructserverCommandStoreItemMessage( + creature.getId(), + inventoryItem.getId(), + ItemUtils.getType(inventoryItem), + InventoryProtocol.INVENTORY_TYPE_NATURAL, + "" + )); } } @@ -553,18 +550,6 @@ public class ServerInventoryState implements BehaviorTree { GravityUtils.serverAttemptActivateGravity(inWorldItem); } - //need creature so we can figure out where to drop the item - public static void serverAttemptEjectItem(Entity creature, Entity item){ - if(creature == null){ - throw new Error("Provided null creature!"); - } - if(item == null){ - throw new Error("Provided null item!"); - } - //if we're the server, immediately attempt the transform - ServerInventoryState.serverAttemptEjectItemTransform(creature,item); - } - /** * [SERVER ONLY] Called when the server says to remove an item from all inventories * Only does the remove, doesn't create the in-world item diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index ca056f00..a450b5ca 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -324,7 +324,7 @@ public class CreatureUtils { Entity itemInWorld = ContentSerialization.serverHydrateEntitySerialization(realm, serialization); //add the item to the creature's inventory - Entity itemInInventory = ServerInventoryState.serverAttemptStoreItemTransform(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); + Entity itemInInventory = ServerInventoryState.attemptStoreItemAnyInventory(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); //equip the item to the slot defined in the template ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(creature); @@ -338,7 +338,7 @@ public class CreatureUtils { Entity itemInWorld = ItemUtils.serverSpawnBasicItem(realm, EntityUtils.getPosition(creature), serialization.getSubtype()); //add the item to the creature's inventory - Entity itemInInventory = ServerInventoryState.serverAttemptStoreItemTransform(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); + Entity itemInInventory = ServerInventoryState.attemptStoreItemAnyInventory(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); //equip the item to the slot defined in the template ServerEquipState serverEquipState = ServerEquipState.getEquipState(creature); @@ -349,7 +349,7 @@ public class CreatureUtils { Entity itemInWorld = ItemUtils.serverSpawnBasicItem(realm, EntityUtils.getPosition(creature), naturalItem.getSubtype()); //add the item to the creature's inventory - ServerInventoryState.serverAttemptStoreItemTransform(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); + ServerInventoryState.attemptStoreItemAnyInventory(creature, EntityLookupUtils.getEntityById(itemInWorld.getId())); } } } diff --git a/src/main/java/electrosphere/net/client/protocol/InventoryProtocol.java b/src/main/java/electrosphere/net/client/protocol/InventoryProtocol.java index d4069ffb..1d88dc02 100644 --- a/src/main/java/electrosphere/net/client/protocol/InventoryProtocol.java +++ b/src/main/java/electrosphere/net/client/protocol/InventoryProtocol.java @@ -73,6 +73,15 @@ public class InventoryProtocol implements ClientProtocolTemplate= TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY_SIZE){ return true; @@ -780,6 +783,79 @@ public class InventoryMessage extends NetworkMessage { return rVal; } + /** + * Checks if a message of type serverCommandStoreItem can be parsed from the byte stream + */ + public static boolean canParseserverCommandStoreItemMessage(CircularByteBuffer byteBuffer){ + int currentStreamLength = byteBuffer.getRemaining(); + List temporaryByteQueue = new LinkedList(); + if(currentStreamLength < 6){ + return false; + } + if(currentStreamLength < 10){ + return false; + } + int itemTemplateSize = 0; + if(currentStreamLength < 14){ + return false; + } else { + temporaryByteQueue.add(byteBuffer.peek(10 + 0)); + temporaryByteQueue.add(byteBuffer.peek(10 + 1)); + temporaryByteQueue.add(byteBuffer.peek(10 + 2)); + temporaryByteQueue.add(byteBuffer.peek(10 + 3)); + itemTemplateSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue); + } + if(currentStreamLength < 14 + itemTemplateSize){ + return false; + } + if(currentStreamLength < 18 + itemTemplateSize){ + return false; + } + int equipPointIdSize = 0; + if(currentStreamLength < 22){ + return false; + } else { + temporaryByteQueue.add(byteBuffer.peek(18 + itemTemplateSize + 0)); + temporaryByteQueue.add(byteBuffer.peek(18 + itemTemplateSize + 1)); + temporaryByteQueue.add(byteBuffer.peek(18 + itemTemplateSize + 2)); + temporaryByteQueue.add(byteBuffer.peek(18 + itemTemplateSize + 3)); + equipPointIdSize = ByteStreamUtils.popIntFromByteQueue(temporaryByteQueue); + } + if(currentStreamLength < 22 + itemTemplateSize + equipPointIdSize){ + return false; + } + return true; + } + + /** + * Parses a message of type serverCommandStoreItem + */ + public static InventoryMessage parseserverCommandStoreItemMessage(CircularByteBuffer byteBuffer, MessagePool pool){ + InventoryMessage rVal = (InventoryMessage)pool.get(MessageType.INVENTORY_MESSAGE); + rVal.messageType = InventoryMessageType.SERVERCOMMANDSTOREITEM; + InventoryMessage.stripPacketHeader(byteBuffer); + rVal.settargetEntId(ByteStreamUtils.popIntFromByteQueue(byteBuffer)); + rVal.setitemEntId(ByteStreamUtils.popIntFromByteQueue(byteBuffer)); + rVal.setitemTemplate(ByteStreamUtils.popStringFromByteQueue(byteBuffer)); + rVal.setcontainerType(ByteStreamUtils.popIntFromByteQueue(byteBuffer)); + rVal.setequipPointId(ByteStreamUtils.popStringFromByteQueue(byteBuffer)); + return rVal; + } + + /** + * Constructs a message of type serverCommandStoreItem + */ + public static InventoryMessage constructserverCommandStoreItemMessage(int targetEntId,int itemEntId,String itemTemplate,int containerType,String equipPointId){ + InventoryMessage rVal = new InventoryMessage(InventoryMessageType.SERVERCOMMANDSTOREITEM); + rVal.settargetEntId(targetEntId); + rVal.setitemEntId(itemEntId); + rVal.setitemTemplate(itemTemplate); + rVal.setcontainerType(containerType); + rVal.setequipPointId(equipPointId); + rVal.serialize(); + return rVal; + } + /** * Parses a message of type clientRequestWatchInventory */ @@ -1184,6 +1260,41 @@ public class InventoryMessage extends NetworkMessage { rawBytes[14+equipPointId.length()+i] = intValues[i]; } break; + case SERVERCOMMANDSTOREITEM: + rawBytes = new byte[2+4+4+4+itemTemplate.length()+4+4+equipPointId.length()]; + //message header + rawBytes[0] = TypeBytes.MESSAGE_TYPE_INVENTORY; + //entity messaage header + rawBytes[1] = TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDSTOREITEM; + intValues = ByteStreamUtils.serializeIntToBytes(targetEntId); + for(int i = 0; i < 4; i++){ + rawBytes[2+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(itemEntId); + for(int i = 0; i < 4; i++){ + rawBytes[6+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(itemTemplate.length()); + for(int i = 0; i < 4; i++){ + rawBytes[10+i] = intValues[i]; + } + stringBytes = itemTemplate.getBytes(); + for(int i = 0; i < itemTemplate.length(); i++){ + rawBytes[14+i] = stringBytes[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(containerType); + for(int i = 0; i < 4; i++){ + rawBytes[14+itemTemplate.length()+i] = intValues[i]; + } + intValues = ByteStreamUtils.serializeIntToBytes(equipPointId.length()); + for(int i = 0; i < 4; i++){ + rawBytes[18+itemTemplate.length()+i] = intValues[i]; + } + stringBytes = equipPointId.getBytes(); + for(int i = 0; i < equipPointId.length(); i++){ + rawBytes[22+itemTemplate.length()+i] = stringBytes[i]; + } + break; case CLIENTREQUESTWATCHINVENTORY: rawBytes = new byte[2+4]; //message header diff --git a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java index 39f7c8d1..f621d96d 100644 --- a/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java +++ b/src/main/java/electrosphere/net/parser/net/message/NetworkMessage.java @@ -390,6 +390,11 @@ public abstract class NetworkMessage { rVal = InventoryMessage.parseclientRequestStoreItemMessage(byteBuffer,pool); } break; + case TypeBytes.INVENTORY_MESSAGE_TYPE_SERVERCOMMANDSTOREITEM: + if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){ + rVal = InventoryMessage.parseserverCommandStoreItemMessage(byteBuffer,pool); + } + break; case TypeBytes.INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY: if(InventoryMessage.canParseMessage(byteBuffer,secondByte)){ rVal = InventoryMessage.parseclientRequestWatchInventoryMessage(byteBuffer,pool); diff --git a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java index 629af21a..18b2c7dc 100644 --- a/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java +++ b/src/main/java/electrosphere/net/parser/net/message/TypeBytes.java @@ -160,14 +160,15 @@ public class TypeBytes { public static final byte INVENTORY_MESSAGE_TYPE_SERVERCOMMANDUNEQUIPITEM = 5; public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNEQUIPITEM = 6; public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTSTOREITEM = 7; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY = 8; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNWATCHINVENTORY = 9; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDTOOLBAR = 10; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDNATURAL = 11; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTUPDATETOOLBAR = 12; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTPERFORMITEMACTION = 13; - public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTCRAFT = 14; - public static final byte INVENTORY_MESSAGE_TYPE_SERVERUPDATEITEMCHARGES = 15; + public static final byte INVENTORY_MESSAGE_TYPE_SERVERCOMMANDSTOREITEM = 8; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTWATCHINVENTORY = 9; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTUNWATCHINVENTORY = 10; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDTOOLBAR = 11; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTADDNATURAL = 12; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTUPDATETOOLBAR = 13; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTPERFORMITEMACTION = 14; + public static final byte INVENTORY_MESSAGE_TYPE_CLIENTREQUESTCRAFT = 15; + public static final byte INVENTORY_MESSAGE_TYPE_SERVERUPDATEITEMCHARGES = 16; /* Inventory packet sizes */ diff --git a/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java b/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java index c5e701c8..ec9b6030 100644 --- a/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java +++ b/src/main/java/electrosphere/net/server/protocol/InventoryProtocol.java @@ -110,6 +110,7 @@ public class InventoryProtocol implements ServerProtocolTemplate CollisionEngine.DEFAULT_INTERACT_DISTANCE){ return AITreeNodeResult.FAILURE; } - ServerInventoryState.serverAttemptStoreItemTransform(entity, target); + ServerInventoryState.attemptStoreItemAnyInventory(entity, target); TargetEntityCategoryNode.setTarget(blackboard, null); return AITreeNodeResult.SUCCESS; } diff --git a/src/main/java/electrosphere/server/entity/unit/UnitUtils.java b/src/main/java/electrosphere/server/entity/unit/UnitUtils.java index 751c8ccc..54d14793 100644 --- a/src/main/java/electrosphere/server/entity/unit/UnitUtils.java +++ b/src/main/java/electrosphere/server/entity/unit/UnitUtils.java @@ -7,13 +7,13 @@ import electrosphere.data.units.UnitEquippedItem; import electrosphere.data.units.UnitLoader; import electrosphere.engine.Globals; import electrosphere.entity.Entity; -import electrosphere.entity.state.equip.ServerEquipState; import electrosphere.entity.state.inventory.ServerInventoryState; import electrosphere.entity.types.creature.ObjectTemplate; import electrosphere.entity.types.EntityTypes.EntityType; import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.logger.LoggerInterface; +import electrosphere.net.server.protocol.InventoryProtocol; import electrosphere.server.datacell.Realm; /** @@ -61,11 +61,7 @@ public class UnitUtils { Entity itemInWorld = ItemUtils.serverSpawnBasicItem(realm, position, equippedItem.getItemId()); //add the item to the creature's inventory - Entity itemInInventory = ServerInventoryState.serverAttemptStoreItemTransform(rVal, itemInWorld); - - //equip the item to the slot defined in the template - ServerEquipState serverEquipState = ServerEquipState.getEquipState(rVal); - serverEquipState.commandAttemptEquip(itemInInventory,serverEquipState.getEquipPoint(equippedItem.getPointId())); + ServerInventoryState.attemptStoreItemTransform(rVal, itemInWorld, InventoryProtocol.INVENTORY_TYPE_EQUIP, equippedItem.getPointId()); } } diff --git a/src/net/inventory.json b/src/net/inventory.json index 28775eb4..60895040 100644 --- a/src/net/inventory.json +++ b/src/net/inventory.json @@ -140,6 +140,17 @@ "itemEntId" ] }, + { + "messageName" : "serverCommandStoreItem", + "description" : "Commands that a given item be placed in a given container type on a given container", + "data" : [ + "targetEntId", + "itemEntId", + "itemTemplate", + "containerType", + "equipPointId" + ] + }, { "messageName" : "clientRequestWatchInventory", "description" : "Requests to watch the inventory of another entity", diff --git a/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java b/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java index 2ce7bda3..bcd494d4 100644 --- a/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java +++ b/src/test/java/electrosphere/entity/state/attack/ServerAttackTreeTests.java @@ -40,7 +40,7 @@ public class ServerAttackTreeTests extends EntityTestTemplate { Entity katana = ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //equip - Entity inInventoryItem = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana); + Entity inInventoryItem = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana); ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(creature); serverToolbarState.attemptEquip(inInventoryItem, 0); @@ -75,7 +75,7 @@ public class ServerAttackTreeTests extends EntityTestTemplate { Entity katana = ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //equip - Entity inInventoryItem = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana); + Entity inInventoryItem = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana); ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(creature); serverToolbarState.attemptEquip(inInventoryItem, 0); diff --git a/src/test/java/electrosphere/entity/state/equip/ClientEquipStateTests.java b/src/test/java/electrosphere/entity/state/equip/ClientEquipStateTests.java index 406a4e11..b166e71b 100644 --- a/src/test/java/electrosphere/entity/state/equip/ClientEquipStateTests.java +++ b/src/test/java/electrosphere/entity/state/equip/ClientEquipStateTests.java @@ -56,7 +56,7 @@ public class ClientEquipStateTests extends EntityTestTemplate { assertEquals(1, clientSideItems.size()); //equip - Entity inInventoryItem = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana); + Entity inInventoryItem = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana); ServerEquipState serverEquipState = ServerEquipState.getServerEquipState(creature); serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); diff --git a/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java b/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java index 0c5b2c8e..5eccce9c 100644 --- a/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java +++ b/src/test/java/electrosphere/entity/state/equip/ServerEquipStateTests.java @@ -37,7 +37,7 @@ public class ServerEquipStateTests extends EntityTestTemplate { Entity katana = ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //equip - Entity inInventoryItem = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana); + Entity inInventoryItem = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana); ServerEquipState serverEquipState = ServerEquipState.getServerEquipState(creature); serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); @@ -70,7 +70,7 @@ public class ServerEquipStateTests extends EntityTestTemplate { Entity katana2 = ItemUtils.serverSpawnBasicItem(Globals.realmManager.first(), new Vector3d(0,0,0), "Katana2H"); //equip - Entity inInventoryItem = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana); + Entity inInventoryItem = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana); ServerEquipState serverEquipState = ServerEquipState.getServerEquipState(creature); serverEquipState.commandAttemptEquip(inInventoryItem, serverEquipState.getEquipPoint("handsCombined")); @@ -78,7 +78,7 @@ public class ServerEquipStateTests extends EntityTestTemplate { TestEngineUtils.simulateFrames(1); //attempt to equip second katana - Entity inInventoryItem2 = ServerInventoryState.serverAttemptStoreItemTransform(creature, katana2); + Entity inInventoryItem2 = ServerInventoryState.attemptStoreItemAnyInventory(creature, katana2); serverEquipState.commandAttemptEquip(inInventoryItem2, serverEquipState.getEquipPoint("handsCombined")); //propagate to client