From 83a93937f74ebb30f7b1f28c3ca0557f17b3478c Mon Sep 17 00:00:00 2001 From: md_5 Date: Thu, 5 Dec 2013 18:41:50 +1100 Subject: [PATCH] Fire EntityDamageByEntityEvent for ItemFrames. This allows them to be protected more effectively. --- CraftBukkit-Patches/0002-mc-dev-imports.patch | 154 +++++++++++++++++- ...tyDamageByEntityEvent-for-ItemFrames.patch | 29 ++++ 2 files changed, 182 insertions(+), 1 deletion(-) create mode 100644 CraftBukkit-Patches/0073-Fire-EntityDamageByEntityEvent-for-ItemFrames.patch diff --git a/CraftBukkit-Patches/0002-mc-dev-imports.patch b/CraftBukkit-Patches/0002-mc-dev-imports.patch index 100fd3bb6..2537a05b8 100644 --- a/CraftBukkit-Patches/0002-mc-dev-imports.patch +++ b/CraftBukkit-Patches/0002-mc-dev-imports.patch @@ -1,4 +1,4 @@ -From 820960f77326fbb326aeab226fc1a3859e3eb274 Mon Sep 17 00:00:00 2001 +From cead4c266909b279e8eeeea1d021d1f647b150e5 Mon Sep 17 00:00:00 2001 From: md_5 Date: Sun, 1 Dec 2013 15:10:48 +1100 Subject: [PATCH] mc-dev imports @@ -406,6 +406,158 @@ index 0000000..6d5090b + return false; + } +} +diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java +new file mode 100644 +index 0000000..261d0c1 +--- /dev/null ++++ b/src/main/java/net/minecraft/server/EntityItemFrame.java +@@ -0,0 +1,146 @@ ++package net.minecraft.server; ++ ++public class EntityItemFrame extends EntityHanging { ++ ++ private float e = 1.0F; ++ ++ public EntityItemFrame(World world) { ++ super(world); ++ } ++ ++ public EntityItemFrame(World world, int i, int j, int k, int l) { ++ super(world, i, j, k, l); ++ this.setDirection(l); ++ } ++ ++ protected void c() { ++ this.getDataWatcher().a(2, 5); ++ this.getDataWatcher().a(3, Byte.valueOf((byte) 0)); ++ } ++ ++ public boolean damageEntity(DamageSource damagesource, float f) { ++ if (this.isInvulnerable()) { ++ return false; ++ } else if (this.getItem() != null) { ++ if (!this.world.isStatic) { ++ this.b(damagesource.getEntity(), false); ++ this.setItem((ItemStack) null); ++ } ++ ++ return true; ++ } else { ++ return super.damageEntity(damagesource, f); ++ } ++ } ++ ++ public int f() { ++ return 9; ++ } ++ ++ public int i() { ++ return 9; ++ } ++ ++ public void b(Entity entity) { ++ this.b(entity, true); ++ } ++ ++ public void b(Entity entity, boolean flag) { ++ ItemStack itemstack = this.getItem(); ++ ++ if (entity instanceof EntityHuman) { ++ EntityHuman entityhuman = (EntityHuman) entity; ++ ++ if (entityhuman.abilities.canInstantlyBuild) { ++ this.b(itemstack); ++ return; ++ } ++ } ++ ++ if (flag) { ++ this.a(new ItemStack(Items.ITEM_FRAME), 0.0F); ++ } ++ ++ if (itemstack != null && this.random.nextFloat() < this.e) { ++ itemstack = itemstack.cloneItemStack(); ++ this.b(itemstack); ++ this.a(itemstack, 0.0F); ++ } ++ } ++ ++ private void b(ItemStack itemstack) { ++ if (itemstack != null) { ++ if (itemstack.getItem() == Items.MAP) { ++ WorldMap worldmap = ((ItemWorldMap) itemstack.getItem()).getSavedMap(itemstack, this.world); ++ ++ worldmap.g.remove("frame-" + this.getId()); ++ } ++ ++ itemstack.a((EntityItemFrame) null); ++ } ++ } ++ ++ public ItemStack getItem() { ++ return this.getDataWatcher().getItemStack(2); ++ } ++ ++ public void setItem(ItemStack itemstack) { ++ if (itemstack != null) { ++ itemstack = itemstack.cloneItemStack(); ++ itemstack.count = 1; ++ itemstack.a(this); ++ } ++ ++ this.getDataWatcher().watch(2, itemstack); ++ this.getDataWatcher().h(2); ++ } ++ ++ public int getRotation() { ++ return this.getDataWatcher().getByte(3); ++ } ++ ++ public void setRotation(int i) { ++ this.getDataWatcher().watch(3, Byte.valueOf((byte) (i % 4))); ++ } ++ ++ public void b(NBTTagCompound nbttagcompound) { ++ if (this.getItem() != null) { ++ nbttagcompound.set("Item", this.getItem().save(new NBTTagCompound())); ++ nbttagcompound.setByte("ItemRotation", (byte) this.getRotation()); ++ nbttagcompound.setFloat("ItemDropChance", this.e); ++ } ++ ++ super.b(nbttagcompound); ++ } ++ ++ public void a(NBTTagCompound nbttagcompound) { ++ NBTTagCompound nbttagcompound1 = nbttagcompound.getCompound("Item"); ++ ++ if (nbttagcompound1 != null && !nbttagcompound1.isEmpty()) { ++ this.setItem(ItemStack.createStack(nbttagcompound1)); ++ this.setRotation(nbttagcompound.getByte("ItemRotation")); ++ if (nbttagcompound.hasKeyOfType("ItemDropChance", 99)) { ++ this.e = nbttagcompound.getFloat("ItemDropChance"); ++ } ++ } ++ ++ super.a(nbttagcompound); ++ } ++ ++ public boolean c(EntityHuman entityhuman) { ++ if (this.getItem() == null) { ++ ItemStack itemstack = entityhuman.be(); ++ ++ if (itemstack != null && !this.world.isStatic) { ++ this.setItem(itemstack); ++ if (!entityhuman.abilities.canInstantlyBuild && --itemstack.count <= 0) { ++ entityhuman.inventory.setItem(entityhuman.inventory.itemInHandIndex, (ItemStack) null); ++ } ++ } ++ } else if (!this.world.isStatic) { ++ this.setRotation(this.getRotation() + 1); ++ } ++ ++ return true; ++ } ++} diff --git a/src/main/java/net/minecraft/server/NextTickListEntry.java b/src/main/java/net/minecraft/server/NextTickListEntry.java new file mode 100644 index 0000000..06934a1 diff --git a/CraftBukkit-Patches/0073-Fire-EntityDamageByEntityEvent-for-ItemFrames.patch b/CraftBukkit-Patches/0073-Fire-EntityDamageByEntityEvent-for-ItemFrames.patch new file mode 100644 index 000000000..3dba71856 --- /dev/null +++ b/CraftBukkit-Patches/0073-Fire-EntityDamageByEntityEvent-for-ItemFrames.patch @@ -0,0 +1,29 @@ +From 44a4aeef7c0503db9894cd45b16d0dc8a93848f6 Mon Sep 17 00:00:00 2001 +From: md_5 +Date: Thu, 5 Dec 2013 18:41:32 +1100 +Subject: [PATCH] Fire EntityDamageByEntityEvent for ItemFrames + + +diff --git a/src/main/java/net/minecraft/server/EntityItemFrame.java b/src/main/java/net/minecraft/server/EntityItemFrame.java +index 261d0c1..58d0d26 100644 +--- a/src/main/java/net/minecraft/server/EntityItemFrame.java ++++ b/src/main/java/net/minecraft/server/EntityItemFrame.java +@@ -23,6 +23,15 @@ public class EntityItemFrame extends EntityHanging { + return false; + } else if (this.getItem() != null) { + if (!this.world.isStatic) { ++ // Spigot Start ++ org.bukkit.event.entity.EntityDamageByEntityEvent event = new org.bukkit.event.entity.EntityDamageByEntityEvent( ++ damagesource.getEntity().getBukkitEntity(), getBukkitEntity(), org.bukkit.event.entity.EntityDamageEvent.DamageCause.ENTITY_ATTACK, f ); ++ getBukkitEntity().getServer().getPluginManager().callEvent( event ); ++ if ( event.isCancelled() ) ++ { ++ return false; ++ } ++ // Spigot End + this.b(damagesource.getEntity(), false); + this.setItem((ItemStack) null); + } +-- +1.8.3.2 +