From 2173f96b0bbdbdd83df3e0d65036c17164731cbb Mon Sep 17 00:00:00 2001 From: austin Date: Wed, 14 May 2025 11:41:56 -0400 Subject: [PATCH] flip inventory util error checking paradigm --- .../state/inventory/ClientInventoryState.java | 45 ++-- .../state/inventory/ServerInventoryState.java | 221 +++++++++--------- 2 files changed, 130 insertions(+), 136 deletions(-) diff --git a/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java index d39f9e47..df403849 100644 --- a/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/ClientInventoryState.java @@ -369,31 +369,28 @@ public class ClientInventoryState implements BehaviorTree { * @return The in-inventory item entity */ public static Entity clientConstructInInventoryItem(Entity parentContainer, String type){ - //sanity checks - boolean hasInventory = InventoryUtils.hasNaturalInventory(parentContainer); - if(hasInventory){ - //if we pass sanity checks, actually perform transform - //get inventory - //for the moment we're just gonna get natural inventory - //later we'll need to search through all creature inventories to find the item - UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(parentContainer); - //create item - //TODO: optimize by directly creating the container item instead of first spawning regular item - LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawning temporary in-world item before placing into inventory"); - Entity spawnedItem = ItemUtils.clientSpawnBasicItem(type); - //convert to in-inventory - Entity inventoryItem = ItemUtils.clientRecreateContainerItem(spawnedItem, parentContainer); - //destroy the item that was left over - ClientEntityUtils.destroyEntity(spawnedItem); - //store item in inventory - inventory.addItem(inventoryItem); - //set item containing parent - ItemUtils.setContainingParent(inventoryItem, parentContainer); - //return - return inventoryItem; + if(!InventoryUtils.hasNaturalInventory(parentContainer)){ + return null; } - //if we fail, return null - return null; + //if we pass sanity checks, actually perform transform + //get inventory + //for the moment we're just gonna get natural inventory + //later we'll need to search through all creature inventories to find the item + UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(parentContainer); + //create item + //TODO: optimize by directly creating the container item instead of first spawning regular item + LoggerInterface.loggerNetworking.DEBUG("[CLIENT] Spawning temporary in-world item before placing into inventory"); + Entity spawnedItem = ItemUtils.clientSpawnBasicItem(type); + //convert to in-inventory + Entity inventoryItem = ItemUtils.clientRecreateContainerItem(spawnedItem, parentContainer); + //destroy the item that was left over + ClientEntityUtils.destroyEntity(spawnedItem); + //store item in inventory + inventory.addItem(inventoryItem); + //set item containing parent + ItemUtils.setContainingParent(inventoryItem, parentContainer); + //return + return inventoryItem; } /** diff --git a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java index 6fbcfbc4..fa57df20 100644 --- a/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java +++ b/src/main/java/electrosphere/entity/state/inventory/ServerInventoryState.java @@ -426,54 +426,53 @@ public class ServerInventoryState implements BehaviorTree { * @return The in-inventory item */ public static Entity serverAddToNatural(Entity creature, Entity item){ - boolean itemIsItem = ItemUtils.isItem(item); - boolean hasInventory = InventoryUtils.hasNaturalInventory(creature); - //check if the item is already in an inventory - boolean itemIsInInventory = ItemUtils.itemIsInInventory(item); - if(itemIsItem && hasInventory){ - //get inventory - //for the moment we're just gonna get natural inventory - //later we'll need to search through all creature inventories to find the item - UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(creature); - //destroy in-world entity and create in-inventory item - //we're doing this so that we're not constantly sending networking messages for invisible entities attached to the player - Entity inventoryItem = item; - if(!itemIsInInventory){ - inventoryItem = ItemUtils.serverRecreateContainerItem(item, creature); - ServerEntityUtils.destroyEntity(item); - } - if(InventoryUtils.hasEquipInventory(creature) && InventoryUtils.getEquipInventory(creature).containsItem(item)){ - InventoryUtils.getEquipInventory(creature).tryRemoveItem(item); - } - if(InventoryUtils.hasToolbarInventory(creature) && InventoryUtils.getToolbarInventory(creature).containsItem(item)){ - if(ServerToolbarState.getServerToolbarState(creature) != null){ - ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(creature); - serverToolbarState.unequip(item); - } - InventoryUtils.getToolbarInventory(creature).tryRemoveItem(item); - } - //store item in inventory - inventory.addItem(inventoryItem); - //set item containing parent - ItemUtils.setContainingParent(inventoryItem, creature); - - //tell entities watching this inventory that they have an item in their inventory - ServerInventoryState serverInventoryState = ServerInventoryState.getServerInventoryState(creature); - for(Entity watcher : serverInventoryState.getWatchers()){ - if(CreatureUtils.hasControllerPlayerId(watcher)){ - //get the player - int controllerPlayerID = CreatureUtils.getControllerPlayerId(watcher); - Player controllerPlayer = Globals.playerManager.getPlayerFromId(controllerPlayerID); - //send message - controllerPlayer.addMessage(InventoryMessage.constructaddItemToInventoryMessage(creature.getId(), inventoryItem.getId(), ItemUtils.getType(inventoryItem))); - } - } - - //alert script engine - ServerScriptUtils.fireSignalOnEntity(creature, "itemAddToNatural", item.getId(), inventoryItem.getId()); - return inventoryItem; + if(!ItemUtils.isItem(item)){ + return null; } - return null; + if(InventoryUtils.hasNaturalInventory(creature)){ + return null; + } + //get inventory + //for the moment we're just gonna get natural inventory + //later we'll need to search through all creature inventories to find the item + UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(creature); + //destroy in-world entity and create in-inventory item + //we're doing this so that we're not constantly sending networking messages for invisible entities attached to the player + Entity inventoryItem = item; + if(!ItemUtils.itemIsInInventory(item)){ + inventoryItem = ItemUtils.serverRecreateContainerItem(item, creature); + ServerEntityUtils.destroyEntity(item); + } + if(InventoryUtils.hasEquipInventory(creature) && InventoryUtils.getEquipInventory(creature).containsItem(item)){ + InventoryUtils.getEquipInventory(creature).tryRemoveItem(item); + } + if(InventoryUtils.hasToolbarInventory(creature) && InventoryUtils.getToolbarInventory(creature).containsItem(item)){ + if(ServerToolbarState.getServerToolbarState(creature) != null){ + ServerToolbarState serverToolbarState = ServerToolbarState.getServerToolbarState(creature); + serverToolbarState.unequip(item); + } + InventoryUtils.getToolbarInventory(creature).tryRemoveItem(item); + } + //store item in inventory + inventory.addItem(inventoryItem); + //set item containing parent + ItemUtils.setContainingParent(inventoryItem, creature); + + //tell entities watching this inventory that they have an item in their inventory + ServerInventoryState serverInventoryState = ServerInventoryState.getServerInventoryState(creature); + for(Entity watcher : serverInventoryState.getWatchers()){ + if(CreatureUtils.hasControllerPlayerId(watcher)){ + //get the player + int controllerPlayerID = CreatureUtils.getControllerPlayerId(watcher); + Player controllerPlayer = Globals.playerManager.getPlayerFromId(controllerPlayerID); + //send message + controllerPlayer.addMessage(InventoryMessage.constructaddItemToInventoryMessage(creature.getId(), inventoryItem.getId(), ItemUtils.getType(inventoryItem))); + } + } + + //alert script engine + ServerScriptUtils.fireSignalOnEntity(creature, "itemAddToNatural", item.getId(), inventoryItem.getId()); + return inventoryItem; } /** @@ -488,72 +487,70 @@ public class ServerInventoryState implements BehaviorTree { if(item == null){ throw new Error("Provided null item!"); } - //verify creature is creature, item is item, inventory exists, and item is in inventory - boolean itemIsItem = ItemUtils.isItem(item); - boolean hasNaturalInventory = InventoryUtils.hasNaturalInventory(creature); - boolean hasEquipInventory = InventoryUtils.hasEquipInventory(creature); - //check if the item is in an inventory - boolean itemIsInInventory = ItemUtils.itemIsInInventory(item); - if(itemIsItem && itemIsInInventory){ - if(hasNaturalInventory){ - //get inventory - UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(creature); - //remove item from inventory - inventory.removeItem(item); - } - if(hasEquipInventory){ - //get inventory - RelationalInventoryState inventory = InventoryUtils.getEquipInventory(creature); - //get inventory slot - String inventorySlot = inventory.getItemSlot(item); - //remove item from inventory - if(inventory.tryRemoveItem(item) != null){ - //get real world item - Entity realWorldItem = ItemUtils.getRealWorldEntity(item); - if(realWorldItem != null){ - //Tell players to unequip the item - Realm realm = Globals.realmManager.getEntityRealm(realWorldItem); - if(realm != null){ - //get closest chunk - ServerDataCell dataCell = Globals.entityDataCellMapper.getEntityDataCell(realWorldItem); - //broadcast destroy item - NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), InventoryProtocol.INVENTORY_TYPE_EQUIP, inventorySlot); - dataCell.broadcastNetworkMessage(unequipMessage); - } - //drop item - ServerEquipState equipState = ServerEquipState.getEquipState(creature); - equipState.serverTransformUnequipPoint(inventorySlot); - } - } - } - ServerInventoryState.serverRemoveItemFromInventories(creature, item); - //get parent realm - Realm realm = Globals.realmManager.getEntityRealm(creature); - //find "in front of creature" - Vector3d dropSpot = new Vector3d(EntityUtils.getPosition(creature)); - if(CreatureUtils.getFacingVector(creature) != null){ - dropSpot.add(CreatureUtils.getFacingVector(creature)); - } - // - //tell player that the item is no longer in their inventory - ServerInventoryState serverInventoryState = ServerInventoryState.getServerInventoryState(creature); - for(Entity watcher : serverInventoryState.getWatchers()){ - if(CreatureUtils.hasControllerPlayerId(watcher)){ - //get player - int playerId = CreatureUtils.getControllerPlayerId(watcher); - Player controllerPlayer = Globals.playerManager.getPlayerFromId(playerId); - //tell the player to destroy the item - controllerPlayer.addMessage(EntityMessage.constructDestroyMessage(item.getId())); - } - } - // - //compose item into in-world entity - Entity inWorldItem = ItemUtils.serverSpawnBasicItem(realm,dropSpot,ItemUtils.getType(item)); - //destroy the entity on server side - ServerEntityUtils.destroyEntity(item); - //activate gravity - GravityUtils.serverAttemptActivateGravity(inWorldItem); + if(!ItemUtils.isItem(item)){ + return; } + if(!ItemUtils.itemIsInInventory(item)){ + return; + } + if(InventoryUtils.hasNaturalInventory(creature)){ + //get inventory + UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(creature); + //remove item from inventory + inventory.removeItem(item); + } + if(InventoryUtils.hasEquipInventory(creature)){ + //get inventory + RelationalInventoryState inventory = InventoryUtils.getEquipInventory(creature); + //get inventory slot + String inventorySlot = inventory.getItemSlot(item); + //remove item from inventory + if(inventory.tryRemoveItem(item) != null){ + //get real world item + Entity realWorldItem = ItemUtils.getRealWorldEntity(item); + if(realWorldItem != null){ + //Tell players to unequip the item + Realm realm = Globals.realmManager.getEntityRealm(realWorldItem); + if(realm != null){ + //get closest chunk + ServerDataCell dataCell = Globals.entityDataCellMapper.getEntityDataCell(realWorldItem); + //broadcast destroy item + NetworkMessage unequipMessage = InventoryMessage.constructserverCommandUnequipItemMessage(creature.getId(), InventoryProtocol.INVENTORY_TYPE_EQUIP, inventorySlot); + dataCell.broadcastNetworkMessage(unequipMessage); + } + //drop item + ServerEquipState equipState = ServerEquipState.getEquipState(creature); + equipState.serverTransformUnequipPoint(inventorySlot); + } + } + } + ServerInventoryState.serverRemoveItemFromInventories(creature, item); + //get parent realm + Realm realm = Globals.realmManager.getEntityRealm(creature); + //find "in front of creature" + Vector3d dropSpot = new Vector3d(EntityUtils.getPosition(creature)); + if(CreatureUtils.getFacingVector(creature) != null){ + dropSpot.add(CreatureUtils.getFacingVector(creature)); + } + // + //tell player that the item is no longer in their inventory + ServerInventoryState serverInventoryState = ServerInventoryState.getServerInventoryState(creature); + for(Entity watcher : serverInventoryState.getWatchers()){ + if(CreatureUtils.hasControllerPlayerId(watcher)){ + //get player + int playerId = CreatureUtils.getControllerPlayerId(watcher); + Player controllerPlayer = Globals.playerManager.getPlayerFromId(playerId); + //tell the player to destroy the item + controllerPlayer.addMessage(EntityMessage.constructDestroyMessage(item.getId())); + } + } + // + //compose item into in-world entity + Entity inWorldItem = ItemUtils.serverSpawnBasicItem(realm,dropSpot,ItemUtils.getType(item)); + //destroy the entity on server side + ServerEntityUtils.destroyEntity(item); + //activate gravity + GravityUtils.serverAttemptActivateGravity(inWorldItem); } //need creature so we can figure out where to drop the item