flip inventory util error checking paradigm
Some checks failed
studiorailgun/Renderer/pipeline/head There was a failure building this commit

This commit is contained in:
austin 2025-05-14 11:41:56 -04:00
parent 0cb08e3d42
commit 2173f96b0b
2 changed files with 130 additions and 136 deletions

View File

@ -369,31 +369,28 @@ public class ClientInventoryState implements BehaviorTree {
* @return The in-inventory item entity * @return The in-inventory item entity
*/ */
public static Entity clientConstructInInventoryItem(Entity parentContainer, String type){ public static Entity clientConstructInInventoryItem(Entity parentContainer, String type){
//sanity checks if(!InventoryUtils.hasNaturalInventory(parentContainer)){
boolean hasInventory = InventoryUtils.hasNaturalInventory(parentContainer); return null;
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 we fail, return null //if we pass sanity checks, actually perform transform
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(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;
} }
/** /**

View File

@ -426,54 +426,53 @@ public class ServerInventoryState implements BehaviorTree {
* @return The in-inventory item * @return The in-inventory item
*/ */
public static Entity serverAddToNatural(Entity creature, Entity item){ public static Entity serverAddToNatural(Entity creature, Entity item){
boolean itemIsItem = ItemUtils.isItem(item); if(!ItemUtils.isItem(item)){
boolean hasInventory = InventoryUtils.hasNaturalInventory(creature); return null;
//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;
} }
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){ if(item == null){
throw new Error("Provided null item!"); throw new Error("Provided null item!");
} }
//verify creature is creature, item is item, inventory exists, and item is in inventory if(!ItemUtils.isItem(item)){
boolean itemIsItem = ItemUtils.isItem(item); return;
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.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 //need creature so we can figure out where to drop the item