From 8bbb0749efd099d7075d6de11dec257cdab1b888 Mon Sep 17 00:00:00 2001 From: Andrew Ardill Date: Wed, 19 Jan 2011 16:07:56 +0800 Subject: [PATCH] fixes some explosion events to stop accessing null entities. Placed some tags against some spammy events. --- .../java/net/minecraft/server/Entity.java | 3 + .../java/net/minecraft/server/Explosion.java | 148 ++++++++---------- 2 files changed, 69 insertions(+), 82 deletions(-) diff --git a/src/main/java/net/minecraft/server/Entity.java b/src/main/java/net/minecraft/server/Entity.java index 69c619dc3d..f29af59e44 100644 --- a/src/main/java/net/minecraft/server/Entity.java +++ b/src/main/java/net/minecraft/server/Entity.java @@ -218,6 +218,7 @@ public abstract class Entity { } else { if (Z % 20 == 0) { // CraftBukkit start + // TODO: this event spams! if(this instanceof EntityLiving) { CraftServer server = ((WorldServer) l).getServer(); org.bukkit.entity.Entity damagee = this.getBukkitEntity(); @@ -254,8 +255,10 @@ public abstract class Entity { protected void s() { if (!ae) { // CraftBukkit start + // TODO: this event spams! if(this instanceof EntityLiving) { CraftServer server = ((WorldServer) l).getServer(); + // TODO: shouldn't be sending null for the block. org.bukkit.block.Block damager = null;//((WorldServer) l).getWorld().getBlockAt(i, j, k); org.bukkit.entity.Entity damagee = this.getBukkitEntity(); DamageCause damageType = EntityDamageEvent.DamageCause.LAVA; diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java index 68879d8a19..8154670de3 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -1,9 +1,7 @@ package net.minecraft.server; // CraftBukkit start -import org.bukkit.craftbukkit.entity.CraftEntity; -import org.bukkit.craftbukkit.entity.CraftLivingEntity; -import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.Server; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; @@ -11,8 +9,6 @@ import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.craftbukkit.CraftWorld; -import org.bukkit.craftbukkit.block.CraftBlock; - import org.bukkit.event.entity.EntityDamageEvent.DamageCause; // CraftBukkit end @@ -120,16 +116,15 @@ public class Explosion { // CraftBukkit start - explosion damage hook CraftServer server = ((WorldServer) i).getServer(); - org.bukkit.entity.Entity damagee = null; + org.bukkit.entity.Entity damagee = (entity == null)?null:entity.getBukkitEntity(); DamageCause damageType; int damageDone = (int) (((d14 * d14 + d14) / 2D) * 8D * (double) f + 1.0D); - - if(entity instanceof EntityLiving) { - damagee = entity.getBukkitEntity(); - } - if (e == null) { // Block explosion - // Craftbukkit TODO: get the x/y/z of the tnt block? + if(damagee == null){ + // nothing was hurt + } else if (e == null) { // Block explosion + // TODO: get the x/y/z of the tnt block? + // does this even get called ever? @see EntityTNTPrimed - not BlockTNT or whatever damageType = EntityDamageEvent.DamageCause.BLOCK_EXPLOSION; EntityDamageByBlockEvent edbbe = new EntityDamageByBlockEvent(null, damagee, damageType, damageDone); server.getPluginManager().callEvent(edbbe); @@ -137,30 +132,22 @@ public class Explosion { entity.a(e, edbbe.getDamage()); } } else { - CraftEntity damager = null; - //TODO org.bukkit.entity.Entity damager = e.getBukkitEntity(); - if (e instanceof EntityPlayerMP) { - // not possible in normal operations - damager = new CraftPlayer(server, (EntityPlayerMP) e); - } else if (e instanceof EntityLiving) { - damager = new CraftLivingEntity(server, (EntityLiving) e); - } - damageType = EntityDamageEvent.DamageCause.ENTITY_ATTACK; + org.bukkit.entity.Entity damager = e.getBukkitEntity(); + damageType = EntityDamageEvent.DamageCause.ENTITY_EXPLOSION; EntityDamageByEntityEvent edbbe = new EntityDamageByEntityEvent(damager, damagee, damageType, damageDone); server.getPluginManager().callEvent(edbbe); if (!edbbe.isCancelled()) { entity.a(e, edbbe.getDamage()); + double d15 = d14; + + entity.s += d6 * d15; + entity.t += d8 * d15; + entity.u += d10 * d15; } } - // Craftbukkit end - - double d15 = d14; - - entity.s += d6 * d15; - entity.t += d8 * d15; - entity.u += d10 * d15; + // CraftBukkit end } } @@ -190,65 +177,62 @@ public class Explosion { ((List) (arraylist)).addAll(((java.util.Collection) (g))); - // Craftbukkit start - CraftServer servr = ((WorldServer) i).getServer(); - CraftWorld wrld = ((WorldServer) i).getWorld(); - org.bukkit.entity.Entity splode; - if (this.e instanceof EntityCreeper) { - splode = new CraftLivingEntity(servr, (EntityLiving) e); - } else { - splode = (org.bukkit.entity.Entity) this.e; - } - ArrayList blocklist = new ArrayList(); - for (int j = ((List) (arraylist)).size() - 1; j >= 0; j--) { - ChunkPosition cpos = (ChunkPosition) ((List) (arraylist)).get(j); - org.bukkit.craftbukkit.block.CraftBlock blox = new org.bukkit.craftbukkit.block.CraftBlock(wrld, cpos.a, cpos.b, cpos.c, wrld.getBlockTypeIdAt(cpos.a, cpos.b, cpos.c), wrld.getBlockAt(cpos.a, cpos.b, cpos.c).getData()); + // CraftBukkit start + Server server = ((WorldServer) i).getServer(); + CraftWorld world = ((WorldServer) i).getWorld(); + org.bukkit.entity.Entity splode = (e == null) ? null : e.getBukkitEntity(); + + List blocklist = new ArrayList(); + for (int j = arraylist.size() - 1; j >= 0; j--) { + ChunkPosition cpos = (ChunkPosition) arraylist.get(j); + org.bukkit.block.Block blox = world.getBlockAt(cpos.a, cpos.b, cpos.c); if (!blox.getType().equals(org.bukkit.Material.AIR)) { blocklist.add(blox); } } - EntityExplodeEvent eee = new EntityExplodeEvent(EntityExplodeEvent.Type.ENTITY_EXPLODE, splode, blocklist); - servr.getPluginManager().callEvent(eee); - if (!(eee.isCancelled())) { - // Notch start - for (int j = ((List) (arraylist)).size() - 1; j >= 0; j--) { - ChunkPosition chunkposition = (ChunkPosition) ((List) (arraylist)).get(j); - int k = chunkposition.a; - int l = chunkposition.b; - int i1 = chunkposition.c; - int j1 = i.a(k, l, i1); - - for (int k1 = 0; k1 < 1; k1++) { - double d1 = (float) k + i.l.nextFloat(); - double d2 = (float) l + i.l.nextFloat(); - double d3 = (float) i1 + i.l.nextFloat(); - double d4 = d1 - b; - double d5 = d2 - c; - double d6 = d3 - d; - double d7 = MathHelper.a(d4 * d4 + d5 * d5 + d6 * d6); - - d4 /= d7; - d5 /= d7; - d6 /= d7; - double d8 = 0.5D / (d7 / (double) f + 0.10000000000000001D); - - d8 *= i.l.nextFloat() * i.l.nextFloat() + 0.3F; - d4 *= d8; - d5 *= d8; - d6 *= d8; - i.a("explode", (d1 + b * 1.0D) / 2D, (d2 + c * 1.0D) / 2D, (d3 + d * 1.0D) / 2D, d4, d5, d6); - i.a("smoke", d1, d2, d3, d4, d5, d6); - } - - if (j1 > 0) { - Block.m[j1].a(i, k, l, i1, i.b(k, l, i1), 0.3F); - i.e(k, l, i1, 0); - Block.m[j1].a_(i, k, l, i1); - } - } - // Notch end + org.bukkit.event.Event.Type eventType = EntityExplodeEvent.Type.ENTITY_EXPLODE; + EntityExplodeEvent eee = new EntityExplodeEvent(eventType, splode, blocklist); + server.getPluginManager().callEvent(eee); + + if (eee.isCancelled()) { + return; + } + // CraftBukkit end + for (int j = ((List) (arraylist)).size() - 1; j >= 0; j--) { + ChunkPosition chunkposition = (ChunkPosition) ((List) (arraylist)).get(j); + int k = chunkposition.a; + int l = chunkposition.b; + int i1 = chunkposition.c; + int j1 = i.a(k, l, i1); + + for (int k1 = 0; k1 < 1; k1++) { + double d1 = (float) k + i.l.nextFloat(); + double d2 = (float) l + i.l.nextFloat(); + double d3 = (float) i1 + i.l.nextFloat(); + double d4 = d1 - b; + double d5 = d2 - c; + double d6 = d3 - d; + double d7 = MathHelper.a(d4 * d4 + d5 * d5 + d6 * d6); + + d4 /= d7; + d5 /= d7; + d6 /= d7; + double d8 = 0.5D / (d7 / (double) f + 0.10000000000000001D); + + d8 *= i.l.nextFloat() * i.l.nextFloat() + 0.3F; + d4 *= d8; + d5 *= d8; + d6 *= d8; + i.a("explode", (d1 + b * 1.0D) / 2D, (d2 + c * 1.0D) / 2D, (d3 + d * 1.0D) / 2D, d4, d5, d6); + i.a("smoke", d1, d2, d3, d4, d5, d6); + } + + if (j1 > 0) { + Block.m[j1].a(i, k, l, i1, i.b(k, l, i1), 0.3F); + i.e(k, l, i1, 0); + Block.m[j1].a_(i, k, l, i1); + } } - //Craftbukkit end } }