From 60425179476dc7664e1989fc71432e2d018c75a9 Mon Sep 17 00:00:00 2001 From: Brennan Ward Date: Mon, 24 Jul 2017 05:31:09 -0400 Subject: [PATCH] Stuffs (#865) * Resolve dupe glitch Items using custom item entities return false in EntityJoinWorldEvent, making World#spawnEntity return false, making the stackSize not drop properly. * Closes #862 Well, I didn't really check it, but if that returns false that's their fault. * Closes #862 A bit of copypaste from ItemHoe never hurt anyone right? --- .../apiimpl/farmer/DefaultFarmerBehavior.java | 61 ++++++++++++++++++- .../farmer/NetherWartFarmerBehavior.java | 11 ++-- .../mod/tile/TileEntityDropper.java | 3 +- 3 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/DefaultFarmerBehavior.java b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/DefaultFarmerBehavior.java index 570ca4302..96cae975c 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/DefaultFarmerBehavior.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/DefaultFarmerBehavior.java @@ -16,15 +16,21 @@ import de.ellpeck.actuallyadditions.api.internal.IFarmer; import de.ellpeck.actuallyadditions.mod.util.StackUtil; import net.minecraft.block.*; import net.minecraft.block.state.IBlockState; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; +import net.minecraft.init.Items; import net.minecraft.init.SoundEvents; import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumActionResult; +import net.minecraft.util.EnumFacing; import net.minecraft.util.SoundCategory; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraftforge.common.IPlantable; +import net.minecraftforge.common.util.FakePlayerFactory; import java.util.ArrayList; import java.util.List; @@ -46,7 +52,7 @@ public class DefaultFarmerBehavior implements IFarmerBehavior{ } else{ if(farmlandBlock instanceof BlockDirt || farmlandBlock instanceof BlockGrass){ - world.setBlockState(farmland, Blocks.FARMLAND.getDefaultState(), 2); + useHoeAt(world, pos.down()); world.setBlockToAir(pos); world.playSound(null, farmland, SoundEvents.ITEM_HOE_TILL, SoundCategory.BLOCKS, 1.0F, 1.0F); @@ -164,4 +170,57 @@ public class DefaultFarmerBehavior implements IFarmerBehavior{ } return null; } + + private static ItemStack hoe = ItemStack.EMPTY; + + private static ItemStack getHoeStack(){ + if(hoe.isEmpty()) hoe = new ItemStack(Items.DIAMOND_HOE); + return hoe; + } + + public static EnumActionResult useHoeAt(World world, BlockPos pos) + { + + EntityPlayer player = FakePlayerFactory.getMinecraft((WorldServer) world); + + ItemStack itemstack = getHoeStack(); + + if (!player.canPlayerEdit(pos.offset(EnumFacing.UP), EnumFacing.UP, itemstack)) + { + return EnumActionResult.FAIL; + } + else + { + int hook = net.minecraftforge.event.ForgeEventFactory.onHoeUse(itemstack, player, world, pos); + if (hook != 0) return hook > 0 ? EnumActionResult.SUCCESS : EnumActionResult.FAIL; + + IBlockState iblockstate = world.getBlockState(pos); + Block block = iblockstate.getBlock(); + + if (world.isAirBlock(pos.up())) + { + if (block == Blocks.GRASS || block == Blocks.GRASS_PATH) + { + world.setBlockState(pos, Blocks.FARMLAND.getDefaultState()); + return EnumActionResult.SUCCESS; + } + + if (block == Blocks.DIRT) + { + switch (iblockstate.getValue(BlockDirt.VARIANT)) + { + case DIRT: + world.setBlockState(pos, Blocks.FARMLAND.getDefaultState()); + return EnumActionResult.SUCCESS; + case COARSE_DIRT: + world.setBlockState(pos, Blocks.DIRT.getDefaultState().withProperty(BlockDirt.VARIANT, BlockDirt.DirtType.DIRT)); + return EnumActionResult.SUCCESS; + default: break; + } + } + } + + return EnumActionResult.PASS; + } + } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/NetherWartFarmerBehavior.java b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/NetherWartFarmerBehavior.java index 4d1b2d9a6..2a8db8798 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/NetherWartFarmerBehavior.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/misc/apiimpl/farmer/NetherWartFarmerBehavior.java @@ -15,13 +15,15 @@ import de.ellpeck.actuallyadditions.api.farmer.IFarmerBehavior; import de.ellpeck.actuallyadditions.api.internal.IFarmer; import net.minecraft.block.Block; import net.minecraft.block.BlockNetherWart; -import net.minecraft.block.BlockSoulSand; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.NonNullList; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraftforge.common.IPlantable; import java.util.List; @@ -32,9 +34,7 @@ public class NetherWartFarmerBehavior implements IFarmerBehavior{ int use = 500; if(farmer.getEnergy() >= use){ if(seed.getItem() == Items.NETHER_WART){ - BlockPos below = pos.down(); - IBlockState stateBelow = world.getBlockState(below); - if(stateBelow.getBlock() instanceof BlockSoulSand && Blocks.NETHER_BRICK.canPlaceBlockAt(world, pos)){ + if(world.getBlockState(pos.down()).getBlock().canSustainPlant(world.getBlockState(pos.down()), world, pos.down(), EnumFacing.UP, (IPlantable) Items.NETHER_WART)){ world.setBlockState(pos, Blocks.NETHER_WART.getDefaultState(), 2); farmer.extractEnergy(use); return FarmerResult.SUCCESS; @@ -52,7 +52,8 @@ public class NetherWartFarmerBehavior implements IFarmerBehavior{ IBlockState state = world.getBlockState(pos); if(state.getBlock() instanceof BlockNetherWart){ if(state.getValue(BlockNetherWart.AGE) >= 3){ - List output = state.getBlock().getDrops(world, pos, state, 0); + NonNullList output = NonNullList.create(); + state.getBlock().getDrops(output, world, pos, state, 0); if(output != null && !output.isEmpty()){ boolean toInput = farmer.addToSeedInventory(output, false); if(toInput || farmer.addToOutputInventory(output, false)){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityDropper.java b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityDropper.java index 22e629efa..979300b89 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityDropper.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/tile/TileEntityDropper.java @@ -67,9 +67,8 @@ public class TileEntityDropper extends TileEntityInventoryBase{ ItemStack theoreticalRemove = this.removeFromInventory(false); if(StackUtil.isValid(theoreticalRemove)){ IBlockState state = this.world.getBlockState(this.pos); - if(WorldUtil.dropItemAtSide(WorldUtil.getDirectionByPistonRotation(state.getBlock().getMetaFromState(state)), this.world, this.pos, StackUtil.setStackSize(theoreticalRemove.copy(), 1))){ + WorldUtil.dropItemAtSide(WorldUtil.getDirectionByPistonRotation(state.getBlock().getMetaFromState(state)), this.world, this.pos, StackUtil.setStackSize(theoreticalRemove.copy(), 1)); this.removeFromInventory(true); - } } }