From d70f423a10650a2632a8c17256bab26bb92b64b0 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Fri, 13 May 2016 16:50:07 -0700 Subject: [PATCH] Fix NPE in Crusher ritual (#739) Also adds a utility for spawning an itemstack at a specific block location --- .../bloodmagic/ritual/RitualCrushing.java | 18 ++++-- .../java/WayofTime/bloodmagic/util/Utils.java | 55 +++++++++++++++++++ 2 files changed, 69 insertions(+), 4 deletions(-) diff --git a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java index 7b4b0ed1..d9a9bc2e 100644 --- a/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java +++ b/src/main/java/WayofTime/bloodmagic/ritual/RitualCrushing.java @@ -78,11 +78,14 @@ public class RitualCrushing extends Ritual ItemStack item = new ItemStack(block, 1, meta); ItemStack copyStack = ItemStack.copyItemStack(item); - Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + if (tile != null) + Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + else + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); if (copyStack.stackSize > 0) { - world.spawnEntityInWorld(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2, pos.getZ() + 0.5, copyStack)); + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } } else { @@ -94,10 +97,17 @@ public class RitualCrushing extends Ritual { ItemStack copyStack = ItemStack.copyItemStack(item); - copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + if (tile != null) + { + copyStack = Utils.insertStackIntoTile(copyStack, tile, EnumFacing.DOWN); + } else + { + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); + continue; + } if (copyStack != null && copyStack.stackSize > 0) { - world.spawnEntityInWorld(new EntityItem(world, pos.getX() + 0.5, pos.getY() + 2, pos.getZ() + 0.5, copyStack)); + Utils.spawnStackAtBlock(world, pos, EnumFacing.UP, copyStack); } } } diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index ca982085..fc1eda7f 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -44,6 +44,8 @@ import WayofTime.bloodmagic.tile.TileInventory; import com.google.common.collect.Iterables; +import javax.annotation.Nullable; + public class Utils { public static NBTTagCompound getPersistentDataTag(EntityPlayer player) @@ -686,6 +688,59 @@ public class Utils return (state instanceof IFluidBlock || state.getMaterial().isLiquid()); } + public static boolean spawnStackAtBlock(World world, BlockPos pos, @Nullable EnumFacing pushDirection, ItemStack stack) + { + EntityItem entityItem = new EntityItem(world); + BlockPos spawnPos = new BlockPos(pos); + double velocity = 0.15D; + if (pushDirection != null) + { + spawnPos.offset(pushDirection); + + switch (pushDirection) { + case DOWN: + { + entityItem.motionY = -velocity; + entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() - 1.0D, spawnPos.getZ() + 0.5D); + break; + } + case UP: + { + entityItem.motionY = velocity; + entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 1.0D, spawnPos.getZ() + 0.5D); + break; + } + case NORTH: + { + entityItem.motionZ = -velocity; + entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 0.5D, spawnPos.getZ() - 1.0D); + break; + } + case SOUTH: + { + entityItem.motionZ = velocity; + entityItem.setPosition(spawnPos.getX() + 0.5D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 1.0D); + break; + } + case WEST: + { + entityItem.motionX = -velocity; + entityItem.setPosition(spawnPos.getX() - 1.0D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 0.5D); + break; + } + case EAST: + { + entityItem.motionX = velocity; + entityItem.setPosition(spawnPos.getX() + 1.0D, spawnPos.getY() + 0.5D, spawnPos.getZ() + 0.5D); + break; + } + } + } + + entityItem.setEntityItemStack(stack); + return world.spawnEntityInWorld(entityItem); + } + public static boolean swapLocations(World initialWorld, BlockPos initialPos, World finalWorld, BlockPos finalPos) { TileEntity initialTile = initialWorld.getTileEntity(initialPos);