From 6692e9261f16b3f0adba7ff31e1783fe655ed121 Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 10 May 2025 18:27:07 -0400 Subject: [PATCH] item acquisition work --- docs/src/progress/renderertodo.md | 1 + .../server/ai/blackboard/BlackboardKeys.java | 5 ++ .../checks/spatial/BeginStructureNode.java | 2 +- .../nodes/macro/MacroCharacterGoalNode.java | 18 ++++++-- .../character/goals/CharacterGoalTree.java | 2 +- .../ai/trees/struct/BuildStructureTree.java | 2 +- .../macro/character/goal/CharacterGoal.java | 46 +++++-------------- .../server/macro/structure/Structure.java | 5 +- .../server/simulation/MacroSimulation.java | 2 +- 9 files changed, 39 insertions(+), 44 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 41c0e371..a25c0b2c 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1710,6 +1710,7 @@ Start moving character goal logic from behavior trees to macro level simulation Goal macro data work Shuffle where macro data is stored Structures are stored in character data as IDs into macro data now +Item acquisition tree can be triggered by setting macro goal correctly diff --git a/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java b/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java index 8c44a822..4f9df4d6 100644 --- a/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java +++ b/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java @@ -45,6 +45,11 @@ public class BlackboardKeys { */ public static final String BUILDING_MATERIAL_CURRENT = "buildingMaterialCurrent"; + /** + * The type of item to try to acquire + */ + public static final String GOAL_ITEM_ACQUISITION_TARGET = "goalItemAcquisitionTarget"; + /** * The type of item to scan the inventory for */ diff --git a/src/main/java/electrosphere/server/ai/nodes/checks/spatial/BeginStructureNode.java b/src/main/java/electrosphere/server/ai/nodes/checks/spatial/BeginStructureNode.java index c5cc173e..957cbc29 100644 --- a/src/main/java/electrosphere/server/ai/nodes/checks/spatial/BeginStructureNode.java +++ b/src/main/java/electrosphere/server/ai/nodes/checks/spatial/BeginStructureNode.java @@ -46,7 +46,7 @@ public class BeginStructureNode implements AITreeNode { Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position); //add to macro data - Structure struct = Structure.createStructure(structureData, placementPos); + Structure struct = Structure.createStructure(macroData, structureData, placementPos); struct.setRepairable(true); struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath()))); // macroData.getStructures().add(struct); diff --git a/src/main/java/electrosphere/server/ai/nodes/macro/MacroCharacterGoalNode.java b/src/main/java/electrosphere/server/ai/nodes/macro/MacroCharacterGoalNode.java index 9edc3c6b..e099cf73 100644 --- a/src/main/java/electrosphere/server/ai/nodes/macro/MacroCharacterGoalNode.java +++ b/src/main/java/electrosphere/server/ai/nodes/macro/MacroCharacterGoalNode.java @@ -8,9 +8,11 @@ import electrosphere.entity.state.server.ServerCharacterData; import electrosphere.server.ai.blackboard.Blackboard; import electrosphere.server.ai.blackboard.BlackboardKeys; import electrosphere.server.ai.nodes.AITreeNode; +import electrosphere.server.ai.nodes.checks.spatial.BeginStructureNode; import electrosphere.server.macro.character.Character; import electrosphere.server.macro.character.goal.CharacterGoal; import electrosphere.server.macro.character.goal.CharacterGoal.CharacterGoalType; +import electrosphere.server.macro.structure.Structure; /** * Node for interacting with macro character goals @@ -69,11 +71,19 @@ public class MacroCharacterGoalNode implements AITreeNode { blackboard.put(BlackboardKeys.POINT_TARGET, targetPos); } break; case BUILD_STRUCTURE: { - throw new Error("Not implemented yet"); - } //break; + Object targetRaw = goal.getTarget(); + if(!(targetRaw instanceof Structure)){ + throw new Error("Target is not a structure " + targetRaw); + } + BeginStructureNode.setStructureTarget(blackboard, (Structure)goal.getTarget()); + } break; case ACQUIRE_ITEM: { - throw new Error("Not implemented yet"); - } //break; + Object targetRaw = goal.getTarget(); + if(!(targetRaw instanceof String)){ + throw new Error("Target is not a string " + targetRaw); + } + blackboard.put(BlackboardKeys.GOAL_ITEM_ACQUISITION_TARGET, targetRaw); + } break; } if(type == goal.getType()){ return AITreeNodeResult.SUCCESS; diff --git a/src/main/java/electrosphere/server/ai/trees/character/goals/CharacterGoalTree.java b/src/main/java/electrosphere/server/ai/trees/character/goals/CharacterGoalTree.java index 3b34bf7c..111765f5 100644 --- a/src/main/java/electrosphere/server/ai/trees/character/goals/CharacterGoalTree.java +++ b/src/main/java/electrosphere/server/ai/trees/character/goals/CharacterGoalTree.java @@ -53,7 +53,7 @@ public class CharacterGoalTree { MacroCharacterGoalNode.create(CharacterGoalType.ACQUIRE_ITEM), new PublishStatusNode("Acquire building material"), //try to find building materials - AcquireItemTree.create(BlackboardKeys.BUILDING_MATERIAL_CURRENT) + AcquireItemTree.create(BlackboardKeys.GOAL_ITEM_ACQUISITION_TARGET) ) ) ); diff --git a/src/main/java/electrosphere/server/ai/trees/struct/BuildStructureTree.java b/src/main/java/electrosphere/server/ai/trees/struct/BuildStructureTree.java index a62d5b33..3a56a731 100644 --- a/src/main/java/electrosphere/server/ai/trees/struct/BuildStructureTree.java +++ b/src/main/java/electrosphere/server/ai/trees/struct/BuildStructureTree.java @@ -55,7 +55,7 @@ public class BuildStructureTree { ), //does not have building materials new SequenceNode( - new InverterNode(new SolveBuildMaterialNode()), + new InverterNode(new InventoryContainsNode(BlackboardKeys.BUILDING_MATERIAL_CURRENT)), new RunnerNode(new PublishStatusNode("Waiting on macro character to set goal to find materials to build with")) ), //has building materials AND we've already built the structure diff --git a/src/main/java/electrosphere/server/macro/character/goal/CharacterGoal.java b/src/main/java/electrosphere/server/macro/character/goal/CharacterGoal.java index 046bacf4..4fd32a09 100644 --- a/src/main/java/electrosphere/server/macro/character/goal/CharacterGoal.java +++ b/src/main/java/electrosphere/server/macro/character/goal/CharacterGoal.java @@ -1,12 +1,8 @@ package electrosphere.server.macro.character.goal; -import org.joml.Vector3d; - -import electrosphere.entity.Entity; import electrosphere.server.macro.character.Character; import electrosphere.server.macro.character.data.CharacterData; import electrosphere.server.macro.character.data.CharacterDataStrings; -import electrosphere.server.macro.structure.Structure; import electrosphere.util.annotation.Exclude; /** @@ -38,28 +34,10 @@ public class CharacterGoal extends CharacterData { CharacterGoalType type; /** - * The target structure + * The target */ @Exclude - Structure structureTarget; - - /** - * The entity to target - */ - @Exclude - Entity entityTarget; - - /** - * The id of some piece of data to target - */ - @Exclude - String idTarget; - - /** - * The point to target - */ - @Exclude - Vector3d pointTarget; + Object target; /** * Constructor @@ -94,17 +72,15 @@ public class CharacterGoal extends CharacterData { * @param target The target */ public void setTarget(Object target){ - if(target instanceof Structure){ - this.structureTarget = (Structure)target; - } else if(target instanceof Entity){ - this.entityTarget = (Entity)target; - } else if(target instanceof String){ - this.idTarget = (String)target; - } else if(target instanceof Vector3d){ - this.pointTarget = (Vector3d)target; - } else { - throw new Error("Trying to set target to unsupported type " + target); - } + this.target = target; + } + + /** + * Gets the target of the goal + * @return The target of the goal + */ + public Object getTarget(){ + return this.target; } /** diff --git a/src/main/java/electrosphere/server/macro/structure/Structure.java b/src/main/java/electrosphere/server/macro/structure/Structure.java index b36f1339..3d1cc52e 100644 --- a/src/main/java/electrosphere/server/macro/structure/Structure.java +++ b/src/main/java/electrosphere/server/macro/structure/Structure.java @@ -5,6 +5,7 @@ import org.joml.Vector3d; import electrosphere.game.data.block.BlockFab; import electrosphere.game.data.struct.StructureData; +import electrosphere.server.macro.MacroData; import electrosphere.server.macro.spatial.MacroAreaObject; import electrosphere.util.annotation.Exclude; @@ -51,16 +52,18 @@ public class Structure implements MacroAreaObject { /** * Creates a structure + * @param macroData The macro data * @param data The data * @param position The position * @return The structure */ - public static Structure createStructure(StructureData data, Vector3d position){ + public static Structure createStructure(MacroData macroData, StructureData data, Vector3d position){ Structure rVal = new Structure(); rVal.fabPath = data.getFabPath(); rVal.type = data.getId(); rVal.position = position; rVal.aabb = new AABBd(new Vector3d(position), new Vector3d(position).add(data.getDimensions())); + macroData.addStructure(rVal); return rVal; } diff --git a/src/main/java/electrosphere/server/simulation/MacroSimulation.java b/src/main/java/electrosphere/server/simulation/MacroSimulation.java index 7f38bda9..ca42dfb4 100644 --- a/src/main/java/electrosphere/server/simulation/MacroSimulation.java +++ b/src/main/java/electrosphere/server/simulation/MacroSimulation.java @@ -92,7 +92,7 @@ public class MacroSimulation { Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position); //add to macro data - Structure struct = Structure.createStructure(structureData, placementPos); + Structure struct = Structure.createStructure(macroData, structureData, placementPos); struct.setRepairable(true); struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath()))); CharacterUtils.addShelter(chara, struct);