From 653822f4f861000aee536f6ba41de93201a5675b Mon Sep 17 00:00:00 2001 From: austin Date: Sun, 18 May 2025 13:29:27 -0400 Subject: [PATCH] structure selection --- docs/src/progress/renderertodo.md | 1 + .../server/ai/blackboard/BlackboardKeys.java | 5 +++++ .../checks/spatial/BeginStructureNode.java | 19 +++++++++++-------- .../character/goals/CharacterGoalTree.java | 3 +-- .../safety/shelter/ConstructShelterTree.java | 3 +-- .../electrosphere/server/macro/MacroData.java | 2 +- .../electrosphere/server/macro/race/Race.java | 2 +- .../server/macro/race/RaceMap.java | 2 +- 8 files changed, 22 insertions(+), 15 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 5cb5b99b..f09000ee 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1873,6 +1873,7 @@ Rename structure -> virtualstructure Update hometown storage on characters Filter test scenes out of level selection Visualize interaction engine collidables +AIs build structures based on their character's race diff --git a/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java b/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java index 4f9df4d6..9927cf18 100644 --- a/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java +++ b/src/main/java/electrosphere/server/ai/blackboard/BlackboardKeys.java @@ -90,4 +90,9 @@ public class BlackboardKeys { */ public static final String POINT_TARGET = "pointTarget"; + /** + * A town that the entity is targeting + */ + public static final String TOWN_TARGET = "townTarget"; + } 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 874c73a2..d541ecb7 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 @@ -7,11 +7,13 @@ import electrosphere.data.struct.StructureData; import electrosphere.engine.Globals; import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; +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.datacell.Realm; import electrosphere.server.macro.MacroData; +import electrosphere.server.macro.race.Race; import electrosphere.server.macro.structure.VirtualStructure; import electrosphere.server.macro.utils.StructurePlacementUtils; import electrosphere.util.FileUtils; @@ -21,17 +23,10 @@ import electrosphere.util.FileUtils; */ public class BeginStructureNode implements AITreeNode { - /** - * The data for the structure to place - */ - StructureData structureData; - /** * Constructor - * @param structureData The type of structure to place */ - public BeginStructureNode(StructureData structureData){ - this.structureData = structureData; + public BeginStructureNode(){ } @Override @@ -42,6 +37,14 @@ public class BeginStructureNode implements AITreeNode { MacroData macroData = realm.getMacroData(); Vector3d position = EntityUtils.getPosition(entity); + //get the structures this race can build + ServerCharacterData charData = ServerCharacterData.getServerCharacterData(entity); + Race race = Race.getRace(charData.getCharacterData()); + if(race.getStructureIds().size() < 1){ + throw new Error("Race has no associated structures! " + race.getId()); + } + StructureData structureData = Globals.gameConfigCurrent.getStructureData().getType(race.getStructureIds().get(0)); + //solve where to place Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position); 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 111765f5..1458b1d0 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 @@ -1,6 +1,5 @@ package electrosphere.server.ai.trees.character.goals; -import electrosphere.engine.Globals; import electrosphere.entity.state.movement.groundmove.ClientGroundMovementTree.MovementRelativeFacing; import electrosphere.server.ai.blackboard.BlackboardKeys; import electrosphere.server.ai.nodes.AITreeNode; @@ -44,7 +43,7 @@ public class CharacterGoalTree { new SequenceNode( MacroCharacterGoalNode.create(CharacterGoalType.BUILD_STRUCTURE), new PublishStatusNode("Construct a shelter"), - new BeginStructureNode(Globals.gameConfigCurrent.getStructureData().getTypes().iterator().next()), + new BeginStructureNode(), BuildStructureTree.create() ), diff --git a/src/main/java/electrosphere/server/ai/trees/hierarchy/safety/shelter/ConstructShelterTree.java b/src/main/java/electrosphere/server/ai/trees/hierarchy/safety/shelter/ConstructShelterTree.java index 64a9dd7d..d98d6a30 100644 --- a/src/main/java/electrosphere/server/ai/trees/hierarchy/safety/shelter/ConstructShelterTree.java +++ b/src/main/java/electrosphere/server/ai/trees/hierarchy/safety/shelter/ConstructShelterTree.java @@ -1,6 +1,5 @@ package electrosphere.server.ai.trees.hierarchy.safety.shelter; -import electrosphere.engine.Globals; import electrosphere.server.ai.nodes.AITreeNode; import electrosphere.server.ai.nodes.checks.spatial.BeginStructureNode; import electrosphere.server.ai.nodes.meta.collections.SequenceNode; @@ -25,7 +24,7 @@ public class ConstructShelterTree { public static AITreeNode create(){ return new SequenceNode( new PublishStatusNode("Construct a shelter"), - new BeginStructureNode(Globals.gameConfigCurrent.getStructureData().getTypes().iterator().next()), + new BeginStructureNode(), BuildStructureTree.create(), new SucceederNode(null) ); diff --git a/src/main/java/electrosphere/server/macro/MacroData.java b/src/main/java/electrosphere/server/macro/MacroData.java index cc2fe03d..79309a97 100644 --- a/src/main/java/electrosphere/server/macro/MacroData.java +++ b/src/main/java/electrosphere/server/macro/MacroData.java @@ -260,7 +260,7 @@ public class MacroData { LoggerInterface.loggerEngine.WARNING("Initial races"); LoggerInterface.loggerEngine.WARNING("=========================="); for(Race race : races){ - LoggerInterface.loggerEngine.WARNING(race.getName()); + LoggerInterface.loggerEngine.WARNING(race.getId()); int numCharsOfRace = 0; //n*m complexity - yikes! - as long as we're not making a million chars at start this should be _ok_ for(Character chara : Globals.serverState.characterService.getAllCharacters()){ diff --git a/src/main/java/electrosphere/server/macro/race/Race.java b/src/main/java/electrosphere/server/macro/race/Race.java index ff50ad5d..7b02a599 100644 --- a/src/main/java/electrosphere/server/macro/race/Race.java +++ b/src/main/java/electrosphere/server/macro/race/Race.java @@ -42,7 +42,7 @@ public class Race extends CharacterData { * Gets the name of the race * @return The name of the race */ - public String getName() { + public String getId() { return raceId; } diff --git a/src/main/java/electrosphere/server/macro/race/RaceMap.java b/src/main/java/electrosphere/server/macro/race/RaceMap.java index e9bfeae7..90b15bfb 100644 --- a/src/main/java/electrosphere/server/macro/race/RaceMap.java +++ b/src/main/java/electrosphere/server/macro/race/RaceMap.java @@ -27,7 +27,7 @@ public class RaceMap { */ public Race getRace(String raceName){ for(Race race : raceMap){ - if(race.getName().equals(raceName)){ + if(race.getId().equals(raceName)){ return race; } }