From bf43ca62a65800d1c1ced66d2e018eea28058bf0 Mon Sep 17 00:00:00 2001 From: md_5 Date: Mon, 7 Mar 2016 19:51:42 +1100 Subject: SPIGOT-1816: Rework drop capture. --- nms-patches/Entity.patch | 2 +- nms-patches/EntityCreeper.patch | 48 +++++--------------------------------- nms-patches/EntityInsentient.patch | 40 ++++--------------------------- nms-patches/EntityLiving.patch | 24 ++++++++----------- nms-patches/EntitySkeleton.patch | 16 ++++--------- nms-patches/EntityZombie.patch | 11 +++------ 6 files changed, 29 insertions(+), 112 deletions(-) diff --git a/nms-patches/Entity.patch b/nms-patches/Entity.patch index d33d1882..464dff3a 100644 --- a/nms-patches/Entity.patch +++ b/nms-patches/Entity.patch @@ -364,7 +364,7 @@ public EntityItem a(ItemStack itemstack, float f) { if (itemstack.count != 0 && itemstack.getItem() != null) { + // CraftBukkit start - Capture drops for death event -+ if (this instanceof EntityLiving && ((EntityLiving) this).drops != null) { ++ if (this instanceof EntityLiving) { + ((EntityLiving) this).drops.add(org.bukkit.craftbukkit.inventory.CraftItemStack.asBukkitCopy(itemstack)); + return null; + } diff --git a/nms-patches/EntityCreeper.patch b/nms-patches/EntityCreeper.patch index 121e3955..05a4dd21 100644 --- a/nms-patches/EntityCreeper.patch +++ b/nms-patches/EntityCreeper.patch @@ -11,15 +11,7 @@ public class EntityCreeper extends EntityMonster { private static final DataWatcherObject a = DataWatcher.a(EntityCreeper.class, DataWatcherRegistry.b); -@@ -10,6 +15,7 @@ - private int maxFuseTicks = 30; - private int explosionRadius = 3; - private int bz = 0; -+ private int record = -1; // CraftBukkit - - public EntityCreeper(World world) { - super(world); -@@ -117,21 +123,41 @@ +@@ -117,7 +122,7 @@ } public void die(DamageSource damagesource) { @@ -28,43 +20,15 @@ if (this.world.getGameRules().getBoolean("doMobLoot")) { if (damagesource.getEntity() instanceof EntitySkeleton) { int i = Item.getId(Items.RECORD_13); - int j = Item.getId(Items.RECORD_WAIT); - int k = i + this.random.nextInt(j - i + 1); - -- this.a(Item.getById(k), 1); -+ // CraftBukkit start - Store record for now, drop in dropDeathLoot -+ // this.a(Item.getById(k), 1); -+ this.record = k; -+ // CraftBukkit end - } else if (damagesource.getEntity() instanceof EntityCreeper && damagesource.getEntity() != this && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).canCauseHeadDrop()) { - ((EntityCreeper) damagesource.getEntity()).setCausedHeadDrop(); -- this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, 4); -+ // CraftBukkit end +@@ -130,6 +135,7 @@ + this.a(new ItemStack(Items.SKULL, 1, 4), 0.0F); } } - + super.die(damagesource); // CraftBukkit - Moved from above -+ } -+ -+ // CraftBukkit start - Whole method -+ @Override -+ protected void dropDeathLoot(boolean flag, int i) { -+ super.dropDeathLoot(flag, i); -+ -+ // Drop a music disc? -+ if (this.record != -1) { -+ this.a(Item.getById(this.record), 1); -+ this.record = -1; -+ } + } -+ // CraftBukkit end - public boolean B(Entity entity) { - return true; -@@ -155,8 +181,18 @@ +@@ -155,8 +161,18 @@ public void onLightningStrike(EntityLightning entitylightning) { super.onLightningStrike(entitylightning); @@ -83,7 +47,7 @@ protected boolean a(EntityHuman entityhuman, EnumHand enumhand, ItemStack itemstack) { if (itemstack != null && itemstack.getItem() == Items.FLINT_AND_STEEL) { -@@ -177,9 +213,17 @@ +@@ -177,9 +193,17 @@ boolean flag = this.world.getGameRules().getBoolean("mobGriefing"); float f = this.isPowered() ? 2.0F : 1.0F; diff --git a/nms-patches/EntityInsentient.patch b/nms-patches/EntityInsentient.patch index b5aa5945..dbed31cb 100644 --- a/nms-patches/EntityInsentient.patch +++ b/nms-patches/EntityInsentient.patch @@ -64,28 +64,7 @@ } public boolean d(Class oclass) { -@@ -225,6 +267,7 @@ - return null; - } - -+ protected ItemStack headDrop = null; // CraftBukkit - protected void dropDeathLoot(boolean flag, int i) { - Item item = this.getLoot(); - -@@ -240,6 +283,12 @@ - } - } - -+ // CraftBukkit start -+ if (headDrop != null) { -+ this.a(headDrop, 0.0F); -+ headDrop = null; -+ } -+ // CraftBukkit end - } - - public void b(NBTTagCompound nbttagcompound) { -@@ -321,11 +370,20 @@ +@@ -321,11 +363,20 @@ public void a(NBTTagCompound nbttagcompound) { super.a(nbttagcompound); @@ -108,16 +87,7 @@ NBTTagList nbttaglist; int i; -@@ -406,7 +464,7 @@ - } - - this.dropEquipment(flag, i); -- } else { -+ } { // CraftBukkit - remove else - super.a(flag, i, damagesource); - } - -@@ -549,11 +607,11 @@ +@@ -549,11 +600,11 @@ double d2 = entityhuman.locZ - this.locZ; double d3 = d0 * d0 + d1 * d1 + d2 * d2; @@ -131,7 +101,7 @@ this.die(); } else if (d3 < 1024.0D) { this.ticksFarFromPlayer = 0; -@@ -931,9 +989,21 @@ +@@ -931,9 +982,21 @@ public final boolean a(EntityHuman entityhuman, ItemStack itemstack, EnumHand enumhand) { if (this.isLeashed() && this.getLeashHolder() == entityhuman) { @@ -153,7 +123,7 @@ this.setLeashHolder(entityhuman, true); --itemstack.count; return true; -@@ -953,10 +1023,12 @@ +@@ -953,10 +1016,12 @@ if (this.bC) { if (!this.isAlive()) { @@ -166,7 +136,7 @@ this.unleash(true, true); } } -@@ -1037,6 +1109,7 @@ +@@ -1037,6 +1102,7 @@ this.leashHolder = entityleash; } else { diff --git a/nms-patches/EntityLiving.patch b/nms-patches/EntityLiving.patch index f9e8cac3..44ba66dd 100644 --- a/nms-patches/EntityLiving.patch +++ b/nms-patches/EntityLiving.patch @@ -28,8 +28,8 @@ + // CraftBukkit start + public int expToDrop; + public int maxAirTicks = 300; -+ ArrayList drops; -+ public org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; ++ ArrayList drops = new ArrayList(); ++ public org.bukkit.craftbukkit.attribute.CraftAttributeMap craftAttributes; + // CraftBukkit end public void Q() { @@ -302,24 +302,20 @@ this.az = 0.0F; Entity entity = damagesource.getEntity(); -@@ -822,9 +956,16 @@ - } - - if (this.isDropExperience() && this.world.getGameRules().getBoolean("doMobLoot")) { -+ this.drops = new ArrayList(); // CraftBukkit - Setup drop capture +@@ -825,6 +959,12 @@ boolean flag = this.lastDamageByPlayerTime > 0; this.a(flag, i, damagesource); + // CraftBukkit start - Call death event + CraftEventFactory.callEntityDeathEvent(this, this.drops); -+ this.drops = null; ++ this.drops = new ArrayList(); + } else { + CraftEventFactory.callEntityDeathEvent(this); + // CraftBukkit end } } -@@ -912,8 +1053,13 @@ +@@ -912,8 +1052,13 @@ int i = MathHelper.f((f - 3.0F - f2) * f1); if (i > 0) { @@ -334,7 +330,7 @@ int j = MathHelper.floor(this.locX); int k = MathHelper.floor(this.locY - 0.20000000298023224D); int l = MathHelper.floor(this.locZ); -@@ -940,20 +1086,20 @@ +@@ -940,20 +1085,20 @@ protected float applyArmorModifier(DamageSource damagesource, float f) { if (!damagesource.ignoresArmor()) { @@ -358,7 +354,7 @@ i = (this.getEffect(MobEffects.RESISTANCE).getAmplifier() + 1) * 5; int j = 25 - i; float f1 = f * (float) j; -@@ -974,22 +1120,122 @@ +@@ -974,22 +1119,122 @@ } } @@ -488,7 +484,7 @@ } public CombatTracker getCombatTracker() { -@@ -1055,6 +1301,7 @@ +@@ -1055,6 +1300,7 @@ public AttributeMapBase getAttributeMap() { if (this.bp == null) { this.bp = new AttributeMapServer(); @@ -496,7 +492,7 @@ } return this.bp; -@@ -1702,6 +1949,13 @@ +@@ -1702,6 +1948,13 @@ if (!list.isEmpty()) { for (int i = 0; i < list.size(); ++i) { Entity entity = (Entity) list.get(i); @@ -510,7 +506,7 @@ this.C(entity); } -@@ -1918,7 +2172,22 @@ +@@ -1918,7 +2171,22 @@ protected void v() { if (this.bm != null && this.cs()) { this.a(this.bm, 16); diff --git a/nms-patches/EntitySkeleton.patch b/nms-patches/EntitySkeleton.patch index b606c11c..5dc70cdb 100644 --- a/nms-patches/EntitySkeleton.patch +++ b/nms-patches/EntitySkeleton.patch @@ -41,23 +41,15 @@ if (damagesource.i() instanceof EntityArrow && damagesource.getEntity() instanceof EntityHuman) { EntityHuman entityhuman = (EntityHuman) damagesource.getEntity(); double d0 = entityhuman.locX - this.locX; -@@ -136,9 +145,14 @@ - } - } else if (damagesource.getEntity() instanceof EntityCreeper && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).canCauseHeadDrop()) { +@@ -138,6 +147,7 @@ ((EntityCreeper) damagesource.getEntity()).setCausedHeadDrop(); -- this.a(new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0); -+ // CraftBukkit end + this.a(new ItemStack(Items.SKULL, 1, this.getSkeletonType() == 1 ? 1 : 0), 0.0F); } - + super.die(damagesource); // CraftBukkit - moved from above -+ + } - protected MinecraftKey J() { -@@ -212,11 +226,30 @@ +@@ -212,11 +222,30 @@ } if (EnchantmentManager.a(Enchantments.ARROW_FIRE, (EntityLiving) this) > 0 || this.getSkeletonType() == 1) { diff --git a/nms-patches/EntityZombie.patch b/nms-patches/EntityZombie.patch index d672aaca..c6995929 100644 --- a/nms-patches/EntityZombie.patch +++ b/nms-patches/EntityZombie.patch @@ -104,7 +104,7 @@ entityvillager.addEffect(new MobEffect(MobEffects.CONFUSION, 200, 0)); this.world.a((EntityHuman) null, 1027, new BlockPosition((int) this.locX, (int) this.locY, (int) this.locZ), 0); } -@@ -514,12 +541,16 @@ +@@ -514,11 +541,12 @@ } public void die(DamageSource damagesource) { @@ -112,14 +112,9 @@ + // super.die(damagesource); // CraftBukkit if (damagesource.getEntity() instanceof EntityCreeper && !(this instanceof EntityPigZombie) && ((EntityCreeper) damagesource.getEntity()).isPowered() && ((EntityCreeper) damagesource.getEntity()).canCauseHeadDrop()) { ((EntityCreeper) damagesource.getEntity()).setCausedHeadDrop(); -- this.a(new ItemStack(Items.SKULL, 1, 2), 0.0F); -+ // CraftBukkit start -+ // this.a(new ItemStack(Items.SKULL, 1, 2), 0.0F); -+ headDrop = new ItemStack(Items.SKULL, 1, 2); -+ // CraftBukkit end + this.a(new ItemStack(Items.SKULL, 1, 2), 0.0F); } - + super.die(damagesource); // CraftBukkit - moved from above + } - static class SyntheticClass_1 { } -- cgit v1.2.3