item acquisition work

This commit is contained in:
austin 2025-05-10 18:27:07 -04:00
parent 75ec43a54f
commit 6692e9261f
9 changed files with 39 additions and 44 deletions

View File

@ -1710,6 +1710,7 @@ Start moving character goal logic from behavior trees to macro level simulation
Goal macro data work Goal macro data work
Shuffle where macro data is stored Shuffle where macro data is stored
Structures are stored in character data as IDs into macro data now Structures are stored in character data as IDs into macro data now
Item acquisition tree can be triggered by setting macro goal correctly

View File

@ -45,6 +45,11 @@ public class BlackboardKeys {
*/ */
public static final String BUILDING_MATERIAL_CURRENT = "buildingMaterialCurrent"; 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 * The type of item to scan the inventory for
*/ */

View File

@ -46,7 +46,7 @@ public class BeginStructureNode implements AITreeNode {
Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position); Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position);
//add to macro data //add to macro data
Structure struct = Structure.createStructure(structureData, placementPos); Structure struct = Structure.createStructure(macroData, structureData, placementPos);
struct.setRepairable(true); struct.setRepairable(true);
struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath()))); struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath())));
// macroData.getStructures().add(struct); // macroData.getStructures().add(struct);

View File

@ -8,9 +8,11 @@ import electrosphere.entity.state.server.ServerCharacterData;
import electrosphere.server.ai.blackboard.Blackboard; import electrosphere.server.ai.blackboard.Blackboard;
import electrosphere.server.ai.blackboard.BlackboardKeys; import electrosphere.server.ai.blackboard.BlackboardKeys;
import electrosphere.server.ai.nodes.AITreeNode; 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.Character;
import electrosphere.server.macro.character.goal.CharacterGoal; import electrosphere.server.macro.character.goal.CharacterGoal;
import electrosphere.server.macro.character.goal.CharacterGoal.CharacterGoalType; import electrosphere.server.macro.character.goal.CharacterGoal.CharacterGoalType;
import electrosphere.server.macro.structure.Structure;
/** /**
* Node for interacting with macro character goals * Node for interacting with macro character goals
@ -69,11 +71,19 @@ public class MacroCharacterGoalNode implements AITreeNode {
blackboard.put(BlackboardKeys.POINT_TARGET, targetPos); blackboard.put(BlackboardKeys.POINT_TARGET, targetPos);
} break; } break;
case BUILD_STRUCTURE: { case BUILD_STRUCTURE: {
throw new Error("Not implemented yet"); Object targetRaw = goal.getTarget();
} //break; if(!(targetRaw instanceof Structure)){
throw new Error("Target is not a structure " + targetRaw);
}
BeginStructureNode.setStructureTarget(blackboard, (Structure)goal.getTarget());
} break;
case ACQUIRE_ITEM: { case ACQUIRE_ITEM: {
throw new Error("Not implemented yet"); Object targetRaw = goal.getTarget();
} //break; 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()){ if(type == goal.getType()){
return AITreeNodeResult.SUCCESS; return AITreeNodeResult.SUCCESS;

View File

@ -53,7 +53,7 @@ public class CharacterGoalTree {
MacroCharacterGoalNode.create(CharacterGoalType.ACQUIRE_ITEM), MacroCharacterGoalNode.create(CharacterGoalType.ACQUIRE_ITEM),
new PublishStatusNode("Acquire building material"), new PublishStatusNode("Acquire building material"),
//try to find building materials //try to find building materials
AcquireItemTree.create(BlackboardKeys.BUILDING_MATERIAL_CURRENT) AcquireItemTree.create(BlackboardKeys.GOAL_ITEM_ACQUISITION_TARGET)
) )
) )
); );

View File

@ -55,7 +55,7 @@ public class BuildStructureTree {
), ),
//does not have building materials //does not have building materials
new SequenceNode( 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")) 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 //has building materials AND we've already built the structure

View File

@ -1,12 +1,8 @@
package electrosphere.server.macro.character.goal; 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.Character;
import electrosphere.server.macro.character.data.CharacterData; import electrosphere.server.macro.character.data.CharacterData;
import electrosphere.server.macro.character.data.CharacterDataStrings; import electrosphere.server.macro.character.data.CharacterDataStrings;
import electrosphere.server.macro.structure.Structure;
import electrosphere.util.annotation.Exclude; import electrosphere.util.annotation.Exclude;
/** /**
@ -38,28 +34,10 @@ public class CharacterGoal extends CharacterData {
CharacterGoalType type; CharacterGoalType type;
/** /**
* The target structure * The target
*/ */
@Exclude @Exclude
Structure structureTarget; Object target;
/**
* 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;
/** /**
* Constructor * Constructor
@ -94,17 +72,15 @@ public class CharacterGoal extends CharacterData {
* @param target The target * @param target The target
*/ */
public void setTarget(Object target){ public void setTarget(Object target){
if(target instanceof Structure){ this.target = target;
this.structureTarget = (Structure)target; }
} else if(target instanceof Entity){
this.entityTarget = (Entity)target; /**
} else if(target instanceof String){ * Gets the target of the goal
this.idTarget = (String)target; * @return The target of the goal
} else if(target instanceof Vector3d){ */
this.pointTarget = (Vector3d)target; public Object getTarget(){
} else { return this.target;
throw new Error("Trying to set target to unsupported type " + target);
}
} }
/** /**

View File

@ -5,6 +5,7 @@ import org.joml.Vector3d;
import electrosphere.game.data.block.BlockFab; import electrosphere.game.data.block.BlockFab;
import electrosphere.game.data.struct.StructureData; import electrosphere.game.data.struct.StructureData;
import electrosphere.server.macro.MacroData;
import electrosphere.server.macro.spatial.MacroAreaObject; import electrosphere.server.macro.spatial.MacroAreaObject;
import electrosphere.util.annotation.Exclude; import electrosphere.util.annotation.Exclude;
@ -51,16 +52,18 @@ public class Structure implements MacroAreaObject {
/** /**
* Creates a structure * Creates a structure
* @param macroData The macro data
* @param data The data * @param data The data
* @param position The position * @param position The position
* @return The structure * @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(); Structure rVal = new Structure();
rVal.fabPath = data.getFabPath(); rVal.fabPath = data.getFabPath();
rVal.type = data.getId(); rVal.type = data.getId();
rVal.position = position; rVal.position = position;
rVal.aabb = new AABBd(new Vector3d(position), new Vector3d(position).add(data.getDimensions())); rVal.aabb = new AABBd(new Vector3d(position), new Vector3d(position).add(data.getDimensions()));
macroData.addStructure(rVal);
return rVal; return rVal;
} }

View File

@ -92,7 +92,7 @@ public class MacroSimulation {
Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position); Vector3d placementPos = StructurePlacementUtils.getPlacementPosition(macroData, structureData, position);
//add to macro data //add to macro data
Structure struct = Structure.createStructure(structureData, placementPos); Structure struct = Structure.createStructure(macroData, structureData, placementPos);
struct.setRepairable(true); struct.setRepairable(true);
struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath()))); struct.setFab(BlockFab.read(FileUtils.getAssetFile(struct.getFabPath())));
CharacterUtils.addShelter(chara, struct); CharacterUtils.addShelter(chara, struct);