diff options
author | Hitoprl <hito.prl@gmail.com> | 2015-01-03 18:34:33 +0100 |
---|---|---|
committer | md_5 <git@md-5.net> | 2015-01-11 09:46:54 +1100 |
commit | 5e6c347daaf37b9be31ec0eae7bcba7c21e6e028 (patch) | |
tree | 8f22b34df5bdeda4fff92e3e77c421af32b530d2 /src/main/java/org/bukkit | |
parent | 7658819130126f659c5543ae727c9919488bdb23 (diff) | |
download | craftbukkit-5e6c347daaf37b9be31ec0eae7bcba7c21e6e028.tar craftbukkit-5e6c347daaf37b9be31ec0eae7bcba7c21e6e028.tar.gz craftbukkit-5e6c347daaf37b9be31ec0eae7bcba7c21e6e028.tar.lz craftbukkit-5e6c347daaf37b9be31ec0eae7bcba7c21e6e028.tar.xz craftbukkit-5e6c347daaf37b9be31ec0eae7bcba7c21e6e028.zip |
Fix SPIGOT-260: Item drops don't spill in correct place.
Diffstat (limited to 'src/main/java/org/bukkit')
-rw-r--r-- | src/main/java/org/bukkit/craftbukkit/CraftWorld.java | 37 |
1 files changed, 31 insertions, 6 deletions
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java index 4ff9c1ae..066c681c 100644 --- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java +++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java @@ -309,14 +309,39 @@ public class CraftWorld implements World { return new CraftItem(world.getServer(), entity); } + private static void randomLocationWithinBlock(Location loc, double xs, double ys, double zs) { + double prevX = loc.getX(); + double prevY = loc.getY(); + double prevZ = loc.getZ(); + loc.add(xs, ys, zs); + if (loc.getX() < Math.floor(prevX)) { + loc.setX(Math.floor(prevX)); + } + if (loc.getX() >= Math.ceil(prevX)) { + loc.setX(Math.ceil(prevX - 0.01)); + } + if (loc.getY() < Math.floor(prevY)) { + loc.setY(Math.floor(prevY)); + } + if (loc.getY() >= Math.ceil(prevY)) { + loc.setY(Math.ceil(prevY - 0.01)); + } + if (loc.getZ() < Math.floor(prevZ)) { + loc.setZ(Math.floor(prevZ)); + } + if (loc.getZ() >= Math.ceil(prevZ)) { + loc.setZ(Math.ceil(prevZ - 0.01)); + } + } + public org.bukkit.entity.Item dropItemNaturally(Location loc, ItemStack item) { - double xs = world.random.nextFloat() * 0.7F + (1.0F - 0.7F) * 0.5D; - double ys = world.random.nextFloat() * 0.7F + (1.0F - 0.7F) * 0.5D; - double zs = world.random.nextFloat() * 0.7F + (1.0F - 0.7F) * 0.5D; + double xs = world.random.nextFloat() * 0.7F - 0.35D; + double ys = world.random.nextFloat() * 0.7F - 0.35D; + double zs = world.random.nextFloat() * 0.7F - 0.35D; loc = loc.clone(); - loc.setX(loc.getX() + xs); - loc.setY(loc.getY() + ys); - loc.setZ(loc.getZ() + zs); + // Makes sure the new item is created within the block the location points to. + // This prevents item spill in 1-block wide farms. + randomLocationWithinBlock(loc, xs, ys, zs); return dropItem(loc, item); } |