From 36b9793a096db8f3a5f726b8792ddd1315a88081 Mon Sep 17 00:00:00 2001
From: md_5 <md_5@live.com.au>
Date: Fri, 25 Jan 2013 18:24:54 +1100
Subject: [PATCH] Better + more flexible itemstack merging

---
 src/main/java/net/minecraft/server/EntityItem.java | 13 ++++-----
 src/main/java/net/minecraft/server/World.java      | 31 +++-------------------
 2 files changed, 11 insertions(+), 33 deletions(-)

diff --git a/src/main/java/net/minecraft/server/EntityItem.java b/src/main/java/net/minecraft/server/EntityItem.java
index a7baa0f..5e3ac84 100644
--- a/src/main/java/net/minecraft/server/EntityItem.java
+++ b/src/main/java/net/minecraft/server/EntityItem.java
@@ -114,7 +114,8 @@ public class EntityItem extends Entity {
     }
 
     private void g() {
-        Iterator iterator = this.world.a(EntityItem.class, this.boundingBox.grow(0.5D, 0.0D, 0.5D)).iterator();
+        double radius = world.getWorld().itemMergeRadius;
+        Iterator iterator = this.world.a(EntityItem.class, this.boundingBox.grow(radius, radius, radius)).iterator();
 
         while (iterator.hasNext()) {
             EntityItem entityitem = (EntityItem) iterator.next();
@@ -143,11 +144,11 @@ public class EntityItem extends Entity {
             } else if (itemstack1.count + itemstack.count > itemstack1.getMaxStackSize()) {
                 return false;
             } else {
-                itemstack1.count += itemstack.count;
-                entityitem.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay);
-                entityitem.age = Math.min(entityitem.age, this.age);
-                entityitem.setItemStack(itemstack1);
-                this.die();
+                itemstack.count += itemstack1.count;
+                this.pickupDelay = Math.max(entityitem.pickupDelay, this.pickupDelay);
+                this.age = Math.min(entityitem.age, this.age);
+                this.setItemStack(itemstack);
+                entityitem.die();
                 return true;
             }
         } else {
diff --git a/src/main/java/net/minecraft/server/World.java b/src/main/java/net/minecraft/server/World.java
index 9b7bc02..262290f 100644
--- a/src/main/java/net/minecraft/server/World.java
+++ b/src/main/java/net/minecraft/server/World.java
@@ -923,31 +923,8 @@ public abstract class World implements IBlockAccess {
             event = CraftEventFactory.callCreatureSpawnEvent((EntityLiving) entity, spawnReason);
         } else if (entity instanceof EntityItem) {
             event = CraftEventFactory.callItemSpawnEvent((EntityItem) entity);
-            // Spigot start
-            ItemStack item = ((EntityItem) entity).getItemStack();
-            org.bukkit.craftbukkit.inventory.CraftItemStack craft = org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(item);
-            int maxSize = item.getMaxStackSize();
-            if (item.count < maxSize) {
-                double radius = this.getWorld().itemMergeRadius;
-                if (radius > 0) {
-                    List<Entity> entities = this.getEntities(entity, entity.boundingBox.grow(radius, radius, radius));
-                    for (Entity e : entities) {
-                        if (e instanceof EntityItem) {
-                            EntityItem loopItem = (EntityItem) e;
-                            ItemStack loopStack = loopItem.getItemStack();
-                            if (!loopItem.dead && craft.isSimilar(org.bukkit.craftbukkit.inventory.CraftItemStack.asCraftMirror(loopStack))) {
-                                int toAdd = Math.min(loopStack.count, maxSize - item.count);
-                                item.count += toAdd;
-                                loopStack.count -= toAdd;
-                                if (loopStack.count <= 0) {
-                                    loopItem.die();
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        } else if (entity instanceof EntityExperienceOrb) {
+        }   // Spigot start
+        if (entity instanceof EntityExperienceOrb) {
             EntityExperienceOrb xp = (EntityExperienceOrb) entity;
             double radius = this.getWorld().expMergeRadius;
             if (radius > 0) {
@@ -962,8 +939,8 @@ public abstract class World implements IBlockAccess {
                     }
                 }
             }
-            // Spigot end
-        } else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
+        } // Spigot end
+        else if (entity.getBukkitEntity() instanceof org.bukkit.entity.Projectile) {
             // Not all projectiles extend EntityProjectile, so check for Bukkit interface instead
             event = CraftEventFactory.callProjectileLaunchEvent(entity);
         }
-- 
1.8.1-rc2