From 4eaf4bb2b267edce73f84fec962c198206159234 Mon Sep 17 00:00:00 2001 From: Hea3veN Date: Sun, 31 May 2015 15:40:50 -0300 Subject: [PATCH] allow for special plating behaviour in the crops api --- api/buildcraft/api/crops/CropManager.java | 29 +++++- api/buildcraft/api/crops/ICropHandler.java | 18 +++- api/buildcraft/api/crops/package-info.java | 2 +- common/buildcraft/BuildCraftCore.java | 2 +- common/buildcraft/BuildCraftRobotics.java | 2 + .../core/crops/CropHandlerPlantable.java | 7 +- .../core/crops/CropHandlerReeds.java | 34 ++----- .../buildcraft/core/lib/utils/BlockUtils.java | 15 ++++ .../buildcraft/robotics/ai/AIRobotPlant.java | 89 +++++++++++++++++++ .../robotics/ai/AIRobotUseToolOnBlock.java | 30 ++++++- .../robotics/boards/BoardRobotPlanter.java | 6 +- .../stripes/StripesHandlerPlant.java | 43 ++++----- .../transport/stripes/StripesHandlerUse.java | 25 +++--- 13 files changed, 229 insertions(+), 73 deletions(-) create mode 100644 common/buildcraft/robotics/ai/AIRobotPlant.java diff --git a/api/buildcraft/api/crops/CropManager.java b/api/buildcraft/api/crops/CropManager.java index 22b1dd7c..62bad729 100644 --- a/api/buildcraft/api/crops/CropManager.java +++ b/api/buildcraft/api/crops/CropManager.java @@ -4,12 +4,14 @@ import java.util.ArrayList; import java.util.List; import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public final class CropManager { private static List handlers = new ArrayList(); + private static ICropHandler defaultHandler; private CropManager() { @@ -19,13 +21,21 @@ public final class CropManager { handlers.add(cropHandler); } + public static void setDefaultHandler(ICropHandler cropHandler) { + defaultHandler = cropHandler; + } + + public static ICropHandler getDefaultHandler() { + return defaultHandler; + } + public static boolean isSeed(ItemStack stack) { for (ICropHandler cropHandler : handlers) { if (cropHandler.isSeed(stack)) { return true; } } - return false; + return defaultHandler.isSeed(stack); } public static boolean canSustainPlant(World world, ItemStack seed, int x, int y, int z) { @@ -34,7 +44,18 @@ public final class CropManager { return true; } } - return false; + return defaultHandler.canSustainPlant(world, seed, x, y, z); + } + + public static boolean plantCrop(World world, EntityPlayer player, ItemStack seed, int x, int y, + int z) { + for (ICropHandler cropHandler : handlers) { + if (cropHandler.isSeed(seed) && cropHandler.canSustainPlant(world, seed, x, y, z) + && cropHandler.plantCrop(world, player, seed, x, y, z)) { + return true; + } + } + return defaultHandler.plantCrop(world, player, seed, x, y, z); } public static boolean isMature(IBlockAccess blockAccess, Block block, int meta, int x, int y, @@ -44,7 +65,7 @@ public final class CropManager { return true; } } - return false; + return defaultHandler.isMature(blockAccess, block, meta, x, y, z); } public static boolean harvestCrop(World world, int x, int y, int z, List drops) { @@ -55,7 +76,7 @@ public final class CropManager { return cropHandler.harvestCrop(world, x, y, z, drops); } } - return false; + return defaultHandler.harvestCrop(world, x, y, z, drops); } } diff --git a/api/buildcraft/api/crops/ICropHandler.java b/api/buildcraft/api/crops/ICropHandler.java index 7bf67030..25f709b8 100644 --- a/api/buildcraft/api/crops/ICropHandler.java +++ b/api/buildcraft/api/crops/ICropHandler.java @@ -3,6 +3,7 @@ package buildcraft.api.crops; import java.util.List; import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; @@ -30,6 +31,20 @@ public interface ICropHandler { */ boolean canSustainPlant(World world, ItemStack seed, int x, int y, int z); + /** + * Plant the item in the block. You can assume plantCrop() will only be + * called if canSustainPlant() returned true. + * + * @param world + * @param player + * @param seed + * @param x + * @param y + * @param z + * @return true if the item was planted at (x, y, z). + */ + boolean plantCrop(World world, EntityPlayer player, ItemStack seed, int x, int y, int z); + /** * Check if a crop is mature and can be harvested. * @@ -51,7 +66,8 @@ public interface ICropHandler { * @param x * @param y * @param z - * @param drops a list to return the harvest's drops. + * @param drops + * a list to return the harvest's drops. * @return true if the block was successfully harvested. */ boolean harvestCrop(World world, int x, int y, int z, List drops); diff --git a/api/buildcraft/api/crops/package-info.java b/api/buildcraft/api/crops/package-info.java index 41beaab2..8149556e 100644 --- a/api/buildcraft/api/crops/package-info.java +++ b/api/buildcraft/api/crops/package-info.java @@ -6,7 +6,7 @@ * Please check the contents of the license, which should be located * as "LICENSE.API" in the BuildCraft source code distribution. */ -@API(apiVersion = "1.0", owner = "BuildCraftAPI|Core", provides = "BuildCraftAPI|crops") +@API(apiVersion = "1.1", owner = "BuildCraftAPI|Core", provides = "BuildCraftAPI|crops") package buildcraft.api.crops; import cpw.mods.fml.common.API; diff --git a/common/buildcraft/BuildCraftCore.java b/common/buildcraft/BuildCraftCore.java index 89e0f8e6..d31ba54f 100644 --- a/common/buildcraft/BuildCraftCore.java +++ b/common/buildcraft/BuildCraftCore.java @@ -433,7 +433,7 @@ public class BuildCraftCore extends BuildCraftMod { FMLCommonHandler.instance().bus().register(new TickHandlerCore()); - CropManager.registerHandler(new CropHandlerPlantable()); + CropManager.setDefaultHandler(new CropHandlerPlantable()); CropManager.registerHandler(new CropHandlerReeds()); BuildCraftAPI.registerWorldProperty("soft", new WorldPropertyIsSoft()); diff --git a/common/buildcraft/BuildCraftRobotics.java b/common/buildcraft/BuildCraftRobotics.java index 1c1ad0d9..2e767ee2 100644 --- a/common/buildcraft/BuildCraftRobotics.java +++ b/common/buildcraft/BuildCraftRobotics.java @@ -90,6 +90,7 @@ import buildcraft.robotics.ai.AIRobotHarvest; import buildcraft.robotics.ai.AIRobotLoad; import buildcraft.robotics.ai.AIRobotLoadFluids; import buildcraft.robotics.ai.AIRobotMain; +import buildcraft.robotics.ai.AIRobotPlant; import buildcraft.robotics.ai.AIRobotPumpBlock; import buildcraft.robotics.ai.AIRobotRecharge; import buildcraft.robotics.ai.AIRobotSearchAndGotoBlock; @@ -314,6 +315,7 @@ public class BuildCraftRobotics extends BuildCraftMod { RobotManager.registerAIRobot(AIRobotHarvest.class, "aiRobotHarvest"); RobotManager.registerAIRobot(AIRobotLoad.class, "aiRobotLoad", "buildcraft.core.robots.AIRobotLoad"); RobotManager.registerAIRobot(AIRobotLoadFluids.class, "aiRobotLoadFluids", "buildcraft.core.robots.AIRobotLoadFluids"); + RobotManager.registerAIRobot(AIRobotPlant.class, "aiRobotPlant"); RobotManager.registerAIRobot(AIRobotPumpBlock.class, "aiRobotPumpBlock", "buildcraft.core.robots.AIRobotPumpBlock"); RobotManager.registerAIRobot(AIRobotRecharge.class, "aiRobotRecharge", "buildcraft.core.robots.AIRobotRecharge"); RobotManager.registerAIRobot(AIRobotSearchAndGotoBlock.class, "aiRobotSearchAndGoToBlock"); diff --git a/common/buildcraft/core/crops/CropHandlerPlantable.java b/common/buildcraft/core/crops/CropHandlerPlantable.java index befcf1c6..cc1f737c 100644 --- a/common/buildcraft/core/crops/CropHandlerPlantable.java +++ b/common/buildcraft/core/crops/CropHandlerPlantable.java @@ -9,6 +9,7 @@ import net.minecraft.block.BlockFlower; import net.minecraft.block.BlockMelon; import net.minecraft.block.BlockMushroom; import net.minecraft.block.BlockTallGrass; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; @@ -55,6 +56,11 @@ public class CropHandlerPlantable implements ICropHandler { } } + @Override + public boolean plantCrop(World world, EntityPlayer player, ItemStack seed, int x, int y, int z) { + return BlockUtils.useItemOnBlock(world, player, seed, x, y, z, ForgeDirection.UP); + } + @Override public boolean isMature(IBlockAccess blockAccess, Block block, int meta, int x, int y, int z) { if (block == null) { @@ -89,5 +95,4 @@ public class CropHandlerPlantable implements ICropHandler { } return false; } - } diff --git a/common/buildcraft/core/crops/CropHandlerReeds.java b/common/buildcraft/core/crops/CropHandlerReeds.java index d93e7a7f..1a11ab69 100644 --- a/common/buildcraft/core/crops/CropHandlerReeds.java +++ b/common/buildcraft/core/crops/CropHandlerReeds.java @@ -3,18 +3,14 @@ package buildcraft.core.crops; import java.util.List; import net.minecraft.block.Block; -import net.minecraft.init.Blocks; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; -import net.minecraft.world.WorldServer; - -import net.minecraftforge.common.IPlantable; -import net.minecraftforge.common.util.ForgeDirection; +import buildcraft.api.crops.CropManager; import buildcraft.api.crops.ICropHandler; -import buildcraft.core.lib.utils.BlockUtils; public class CropHandlerReeds implements ICropHandler { @@ -25,35 +21,21 @@ public class CropHandlerReeds implements ICropHandler { @Override public boolean canSustainPlant(World world, ItemStack seed, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - return block.canSustainPlant(world, x, y, z, ForgeDirection.UP, (IPlantable) Blocks.reeds) - && block != Blocks.reeds && world.isAirBlock(x, y + 1, z); + return CropManager.getDefaultHandler().canSustainPlant(world, seed, x, y, z); + } + + @Override + public boolean plantCrop(World world, EntityPlayer player, ItemStack seed, int x, int y, int z) { + return CropManager.getDefaultHandler().plantCrop(world, player, seed, x, y, z); } @Override public boolean isMature(IBlockAccess blockAccess, Block block, int meta, int x, int y, int z) { - if (block == null) { - return false; - } else if (block == Blocks.reeds) { - if (y > 0 && blockAccess.getBlock(x, y - 1, z) == block) { - return true; - } - } return false; } @Override public boolean harvestCrop(World world, int x, int y, int z, List drops) { - if (!world.isRemote) { - Block block = world.getBlock(x, y, z); - int meta = world.getBlockMetadata(x, y, z); - if (BlockUtils.breakBlock((WorldServer) world, x, y, z, drops)) { - world.playAuxSFXAtEntity(null, 2001, x, y, z, Block.getIdFromBlock(block) - + (meta << 12)); - return true; - } - } return false; } - } diff --git a/common/buildcraft/core/lib/utils/BlockUtils.java b/common/buildcraft/core/lib/utils/BlockUtils.java index 8f043a5a..d8fc937e 100644 --- a/common/buildcraft/core/lib/utils/BlockUtils.java +++ b/common/buildcraft/core/lib/utils/BlockUtils.java @@ -25,8 +25,11 @@ import net.minecraft.world.Explosion; import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; + import cpw.mods.fml.common.FMLCommonHandler; + import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.event.ForgeEventFactory; import net.minecraftforge.event.world.BlockEvent.BreakEvent; import net.minecraftforge.fluids.Fluid; @@ -306,4 +309,16 @@ public final class BlockUtils { return world.getBlockMetadata(x, y, z); } } + + public static boolean useItemOnBlock(World world, EntityPlayer player, ItemStack stack, int x, + int y, int z, ForgeDirection direction) { + boolean done = stack.getItem().onItemUseFirst(stack, player, world, x, y, z, + direction.ordinal(), 0.5F, 0.5F, 0.5F); + + if (!done) { + done = stack.getItem().onItemUse(stack, player, world, x, y, z, direction.ordinal(), + 0.5F, 0.5F, 0.5F); + } + return done; + } } diff --git a/common/buildcraft/robotics/ai/AIRobotPlant.java b/common/buildcraft/robotics/ai/AIRobotPlant.java new file mode 100644 index 00000000..0ca1a1e2 --- /dev/null +++ b/common/buildcraft/robotics/ai/AIRobotPlant.java @@ -0,0 +1,89 @@ +package buildcraft.robotics.ai; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.MathHelper; +import net.minecraft.world.WorldServer; + +import buildcraft.api.core.BlockIndex; +import buildcraft.api.crops.CropManager; +import buildcraft.api.robots.AIRobot; +import buildcraft.api.robots.EntityRobotBase; +import buildcraft.core.lib.utils.BlockUtils; +import buildcraft.core.proxy.CoreProxy; + +public class AIRobotPlant extends AIRobot { + private BlockIndex blockFound; + private int delay = 0; + + public AIRobotPlant(EntityRobotBase iRobot) { + super(iRobot); + } + + public AIRobotPlant(EntityRobotBase iRobot, BlockIndex iBlockFound) { + this(iRobot); + + blockFound = iBlockFound; + } + + @Override + public void start() { + robot.aimItemAt(blockFound.x, blockFound.y, blockFound.z); + robot.setItemActive(true); + } + + @Override + public void update() { + if (blockFound == null) { + setSuccess(false); + terminate(); + } + + if (delay++ > 40) { + EntityPlayer player = CoreProxy.proxy.getBuildCraftPlayer((WorldServer) robot.worldObj) + .get(); + if (CropManager.plantCrop(robot.worldObj, player, robot.getHeldItem(), blockFound.x, + blockFound.y, blockFound.z)) { + } else { + setSuccess(false); + } + if (robot.getHeldItem().stackSize > 0) { + BlockUtils.dropItem((WorldServer) robot.worldObj, + MathHelper.floor_double(robot.posX), MathHelper.floor_double(robot.posY), + MathHelper.floor_double(robot.posZ), 6000, robot.getHeldItem()); + } + robot.setItemInUse(null); + terminate(); + } + } + + @Override + public void end() { + robot.setItemActive(false); + } + + @Override + public boolean canLoadFromNBT() { + return true; + } + + @Override + public void writeSelfToNBT(NBTTagCompound nbt) { + super.writeSelfToNBT(nbt); + + if (blockFound != null) { + NBTTagCompound sub = new NBTTagCompound(); + blockFound.writeTo(sub); + nbt.setTag("blockFound", sub); + } + } + + @Override + public void loadSelfFromNBT(NBTTagCompound nbt) { + super.loadSelfFromNBT(nbt); + + if (nbt.hasKey("blockFound")) { + blockFound = new BlockIndex (nbt.getCompoundTag("blockFound")); + } + } +} diff --git a/common/buildcraft/robotics/ai/AIRobotUseToolOnBlock.java b/common/buildcraft/robotics/ai/AIRobotUseToolOnBlock.java index 68be0714..76822dd9 100755 --- a/common/buildcraft/robotics/ai/AIRobotUseToolOnBlock.java +++ b/common/buildcraft/robotics/ai/AIRobotUseToolOnBlock.java @@ -10,6 +10,7 @@ package buildcraft.robotics.ai; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.MathHelper; import net.minecraft.world.WorldServer; @@ -51,8 +52,8 @@ public class AIRobotUseToolOnBlock extends AIRobot { EntityPlayer player = CoreProxy.proxy.getBuildCraftPlayer((WorldServer) robot.worldObj) .get(); - if (stack.getItem().onItemUse(stack, player, robot.worldObj, useToBlock.x, - useToBlock.y, useToBlock.z, ForgeDirection.UP.ordinal(), 0, 0, 0)) { + if (BlockUtils.useItemOnBlock(robot.worldObj, player, stack, useToBlock.x, + useToBlock.y, useToBlock.z, ForgeDirection.UP)) { if (robot.getHeldItem().isItemStackDamageable()) { robot.getHeldItem().damageItem(1, robot); @@ -86,4 +87,29 @@ public class AIRobotUseToolOnBlock extends AIRobot { public int getEnergyCost() { return 8; } + + @Override + public boolean canLoadFromNBT() { + return true; + } + + @Override + public void writeSelfToNBT(NBTTagCompound nbt) { + super.writeSelfToNBT(nbt); + + if (useToBlock != null) { + NBTTagCompound sub = new NBTTagCompound(); + useToBlock.writeTo(sub); + nbt.setTag("blockFound", sub); + } + } + + @Override + public void loadSelfFromNBT(NBTTagCompound nbt) { + super.loadSelfFromNBT(nbt); + + if (nbt.hasKey("blockFound")) { + useToBlock = new BlockIndex (nbt.getCompoundTag("blockFound")); + } + } } diff --git a/common/buildcraft/robotics/boards/BoardRobotPlanter.java b/common/buildcraft/robotics/boards/BoardRobotPlanter.java index 6952dd9b..8147121f 100644 --- a/common/buildcraft/robotics/boards/BoardRobotPlanter.java +++ b/common/buildcraft/robotics/boards/BoardRobotPlanter.java @@ -24,8 +24,8 @@ import buildcraft.core.lib.inventory.filters.IStackFilter; import buildcraft.core.lib.utils.IBlockFilter; import buildcraft.robotics.ai.AIRobotFetchAndEquipItemStack; import buildcraft.robotics.ai.AIRobotGotoSleep; +import buildcraft.robotics.ai.AIRobotPlant; import buildcraft.robotics.ai.AIRobotSearchAndGotoBlock; -import buildcraft.robotics.ai.AIRobotUseToolOnBlock; import buildcraft.robotics.statements.ActionRobotFilter; public class BoardRobotPlanter extends RedstoneBoardRobot { @@ -71,11 +71,11 @@ public class BoardRobotPlanter extends RedstoneBoardRobot { if (ai instanceof AIRobotSearchAndGotoBlock) { if (ai.success()) { blockFound = ((AIRobotSearchAndGotoBlock) ai).getBlockFound(); - startDelegateAI(new AIRobotUseToolOnBlock(robot, blockFound)); + startDelegateAI(new AIRobotPlant(robot, blockFound)); } else { startDelegateAI(new AIRobotGotoSleep(robot)); } - } else if (ai instanceof AIRobotUseToolOnBlock) { + } else if (ai instanceof AIRobotPlant) { releaseBlockFound(); } else if (ai instanceof AIRobotFetchAndEquipItemStack) { if (robot.getHeldItem() == null) { diff --git a/common/buildcraft/transport/stripes/StripesHandlerPlant.java b/common/buildcraft/transport/stripes/StripesHandlerPlant.java index 9930befb..46714fb1 100644 --- a/common/buildcraft/transport/stripes/StripesHandlerPlant.java +++ b/common/buildcraft/transport/stripes/StripesHandlerPlant.java @@ -1,34 +1,37 @@ package buildcraft.transport.stripes; -import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.world.World; -import net.minecraftforge.common.IPlantable; + import net.minecraftforge.common.util.ForgeDirection; +import buildcraft.api.crops.CropManager; import buildcraft.api.transport.IStripesActivator; import buildcraft.api.transport.IStripesHandler; public class StripesHandlerPlant implements IStripesHandler { - @Override - public StripesHandlerType getType() { - return StripesHandlerType.ITEM_USE; - } + @Override + public StripesHandlerType getType() { + return StripesHandlerType.ITEM_USE; + } - @Override - public boolean shouldHandle(ItemStack stack) { - return stack.getItem() instanceof IPlantable; - } + @Override + public boolean shouldHandle(ItemStack stack) { + return CropManager.isSeed(stack); + } - @Override - public boolean handle(World world, int x, int y, int z, ForgeDirection direction, ItemStack stack, EntityPlayer player, IStripesActivator activator) { - Block b = world.getBlock(x, y - 1, z); - IPlantable plant = (IPlantable) stack.getItem(); - if (b.canSustainPlant(world, x, y - 1, z, ForgeDirection.UP, (IPlantable) stack.getItem())) { - world.setBlock(x, y, z, plant.getPlant(world, x, y, z), plant.getPlantMetadata(world, x, y, z), 3); - return true; - } - return false; - } + @Override + public boolean handle(World world, int x, int y, int z, ForgeDirection direction, + ItemStack stack, EntityPlayer player, IStripesActivator activator) { + if (CropManager.canSustainPlant(world, stack, x, y - 1, z)) { + if (CropManager.plantCrop(world, player, stack, x, y - 1, z)) { + if (stack.stackSize > 0) { + activator.sendItem(stack, direction.getOpposite()); + } + return true; + } + } + return false; + } } diff --git a/common/buildcraft/transport/stripes/StripesHandlerUse.java b/common/buildcraft/transport/stripes/StripesHandlerUse.java index d17f930f..4864d55e 100644 --- a/common/buildcraft/transport/stripes/StripesHandlerUse.java +++ b/common/buildcraft/transport/stripes/StripesHandlerUse.java @@ -6,12 +6,15 @@ import java.util.List; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import net.minecraft.util.MathHelper; import net.minecraft.world.World; + import net.minecraftforge.common.util.ForgeDirection; import buildcraft.api.core.Position; import buildcraft.api.transport.IStripesActivator; import buildcraft.api.transport.IStripesHandler; +import buildcraft.core.lib.utils.BlockUtils; public class StripesHandlerUse implements IStripesHandler { public static final List items = new ArrayList(); @@ -33,21 +36,15 @@ public class StripesHandlerUse implements IStripesHandler { Position target = new Position(x, y, z, direction); target.moveForwards(1.0D); - boolean done = stack.getItem().onItemUseFirst(stack, player, world, - (int) target.x, (int) target.y, (int) target.z, - direction.getOpposite().ordinal(), 0.5F, 0.5F, 0.5F); - - if (!done) { - done = stack.getItem().onItemUse(stack, player, world, - (int) target.x, (int) target.y, (int) target.z, - direction.getOpposite().ordinal(), 0.5F, 0.5F, 0.5F); + if (BlockUtils.useItemOnBlock(world, player, stack, MathHelper.floor_double(target.x), + MathHelper.floor_double(target.y), MathHelper.floor_double(target.z), + direction.getOpposite())) { + if (stack.stackSize > 0) { + activator.sendItem(stack, direction.getOpposite()); + } + return true; } - - if (stack.stackSize > 0) { - activator.sendItem(stack, direction.getOpposite()); - } - - return done; + return false; } }