summaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
authorHitoprl <hito.prl@gmail.com>2015-01-03 18:34:33 +0100
committermd_5 <git@md-5.net>2015-01-11 09:46:54 +1100
commit5e6c347daaf37b9be31ec0eae7bcba7c21e6e028 (patch)
tree8f22b34df5bdeda4fff92e3e77c421af32b530d2 /src/main
parent7658819130126f659c5543ae727c9919488bdb23 (diff)
downloadcraftbukkit-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')
-rw-r--r--src/main/java/org/bukkit/craftbukkit/CraftWorld.java37
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);
}