Posted February 23, 20169 yr Hello everyone, what I am triing to is code an Entity that will construct something (e.g. a building) and im starting to question if my approach is the right one. The information about what he should be building is called the "ConstructionTask", which is storing nothing but an ArrayList of the BlockInformations needed public class ConstructionTask { private ArrayList<BlockInf> blocksToPlace; public ConstructionTask(ArrayList<BlockInf> blocksToPlace) { this.blocksToPlace = blocksToPlace; } public BlockInf getNextBlock(BlockPos myPos) { if(blocksToPlace.size()==0) return null; return blocksToPlace.remove(0); } } public class BlockInf { private final BlockPos pos; private final IBlockState state; public BlockInf(BlockPos pos, IBlockState state) { this.pos = pos; this.state= state; } public BlockPos getPos() { return pos; } public IBlockState getState() { return state; } } First question is it a good idea to store a building that way while constructing it? Now comes the bigger problem. Creating the building. My idea was that the engineer takes the next task from the list, tries to move near the position (e.g. max distance = 3) and then places the block. Problem nr.1 what if there is no position that is close enough to stand on a block and have the desired distance Problem nr.2 if there is such a block, how to find it? If my approach is total bs please tell me, since this part of the project beeing messy can kill the performance of the mod. My first attempt on creating a construction task private class BuildVillageTask extends EntityAIBase { //The task the Engineer is working on private ConstructionTask task; //The next block the Engineer should place private BlockInf nextBlock; public BuildVillageTask() { } @Override public boolean shouldExecute() { //Always execute the task if the home has a new task for us return home.hasConstructionTask(); } @Override public boolean isInterruptible() { //Not interruptable. Maybe change this later return false; } @Override public void startExecuting() { //Get the task from home task = home.getNextConstructionTask(); //Get the first block to place nextBlock = task.getNextBlock(new BlockPos(EntityVillagerCustom.this)); } @Override public boolean continueExecuting() { //If we reached our path if(getNavigator().noPath()) { //What we should do here: //Place the black //Get the next task //Set the navigator path to that place } else { //Do nothing since we are waiting to reach our place } //this will be changed later to "when building is done" return true; } }
February 23, 20169 yr The nice thing here is that, if I'm remembering correctly, you should be able to just use Minecrafts built-in pathing via "this.theCreature.getNavigator().tryMoveToXYZ" within an EntityAI class. That will bring your Engineer as close as possible to the target block (which you know the position of) and when he arrives, you can check his distance. If the distance is too large, then you don't place the block. Otherwise, place the block and move on. Makes sense, hopefully? Have a modding question? PM me and hopefully I'll be able to help. Good at 2d Pixel Art? We need your help! http://www.minecraftforum.net/topic/1806355-looking-for-2d-pixel-artist/
February 23, 20169 yr Author Sadly thats not how tryMoveToXYZ works (If i get it right) This method will only try to find a way to the specific XYZ, and if it cant it will return false Or am I wrong with that? Because the last time I tried to make that work it was returning me false all the time ( because the blocks I wanted him to build were out of range I guess)
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.