3
0
Mirror von https://github.com/PaperMC/Paper.git synchronisiert 2024-12-18 20:40:08 +01:00

fixes some explosion events to stop accessing null entities.

Placed some tags against some spammy events.
Dieser Commit ist enthalten in:
Andrew Ardill 2011-01-19 16:07:56 +08:00
Ursprung e93061be48
Commit 8bbb0749ef
2 geänderte Dateien mit 69 neuen und 82 gelöschten Zeilen

Datei anzeigen

@ -218,6 +218,7 @@ public abstract class Entity {
} else { } else {
if (Z % 20 == 0) { if (Z % 20 == 0) {
// CraftBukkit start // CraftBukkit start
// TODO: this event spams!
if(this instanceof EntityLiving) { if(this instanceof EntityLiving) {
CraftServer server = ((WorldServer) l).getServer(); CraftServer server = ((WorldServer) l).getServer();
org.bukkit.entity.Entity damagee = this.getBukkitEntity(); org.bukkit.entity.Entity damagee = this.getBukkitEntity();
@ -254,8 +255,10 @@ public abstract class Entity {
protected void s() { protected void s() {
if (!ae) { if (!ae) {
// CraftBukkit start // CraftBukkit start
// TODO: this event spams!
if(this instanceof EntityLiving) { if(this instanceof EntityLiving) {
CraftServer server = ((WorldServer) l).getServer(); 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.block.Block damager = null;//((WorldServer) l).getWorld().getBlockAt(i, j, k);
org.bukkit.entity.Entity damagee = this.getBukkitEntity(); org.bukkit.entity.Entity damagee = this.getBukkitEntity();
DamageCause damageType = EntityDamageEvent.DamageCause.LAVA; DamageCause damageType = EntityDamageEvent.DamageCause.LAVA;

Datei anzeigen

@ -1,9 +1,7 @@
package net.minecraft.server; package net.minecraft.server;
// CraftBukkit start // CraftBukkit start
import org.bukkit.craftbukkit.entity.CraftEntity; import org.bukkit.Server;
import org.bukkit.craftbukkit.entity.CraftLivingEntity;
import org.bukkit.craftbukkit.entity.CraftPlayer;
import org.bukkit.craftbukkit.CraftServer; import org.bukkit.craftbukkit.CraftServer;
import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageByBlockEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent; 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.event.entity.EntityExplodeEvent;
import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.CraftWorld;
import org.bukkit.craftbukkit.block.CraftBlock;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
// CraftBukkit end // CraftBukkit end
@ -120,16 +116,15 @@ public class Explosion {
// CraftBukkit start - explosion damage hook // CraftBukkit start - explosion damage hook
CraftServer server = ((WorldServer) i).getServer(); CraftServer server = ((WorldServer) i).getServer();
org.bukkit.entity.Entity damagee = null; org.bukkit.entity.Entity damagee = (entity == null)?null:entity.getBukkitEntity();
DamageCause damageType; DamageCause damageType;
int damageDone = (int) (((d14 * d14 + d14) / 2D) * 8D * (double) f + 1.0D); int damageDone = (int) (((d14 * d14 + d14) / 2D) * 8D * (double) f + 1.0D);
if(entity instanceof EntityLiving) { if(damagee == null){
damagee = entity.getBukkitEntity(); // nothing was hurt
} } else if (e == null) { // Block explosion
// TODO: get the x/y/z of the tnt block?
if (e == null) { // Block explosion // does this even get called ever? @see EntityTNTPrimed - not BlockTNT or whatever
// Craftbukkit TODO: get the x/y/z of the tnt block?
damageType = EntityDamageEvent.DamageCause.BLOCK_EXPLOSION; damageType = EntityDamageEvent.DamageCause.BLOCK_EXPLOSION;
EntityDamageByBlockEvent edbbe = new EntityDamageByBlockEvent(null, damagee, damageType, damageDone); EntityDamageByBlockEvent edbbe = new EntityDamageByBlockEvent(null, damagee, damageType, damageDone);
server.getPluginManager().callEvent(edbbe); server.getPluginManager().callEvent(edbbe);
@ -137,25 +132,14 @@ public class Explosion {
entity.a(e, edbbe.getDamage()); entity.a(e, edbbe.getDamage());
} }
} else { } else {
CraftEntity damager = null; org.bukkit.entity.Entity damager = e.getBukkitEntity();
//TODO org.bukkit.entity.Entity damager = e.getBukkitEntity(); damageType = EntityDamageEvent.DamageCause.ENTITY_EXPLOSION;
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;
EntityDamageByEntityEvent edbbe = new EntityDamageByEntityEvent(damager, damagee, damageType, damageDone); EntityDamageByEntityEvent edbbe = new EntityDamageByEntityEvent(damager, damagee, damageType, damageDone);
server.getPluginManager().callEvent(edbbe); server.getPluginManager().callEvent(edbbe);
if (!edbbe.isCancelled()) { if (!edbbe.isCancelled()) {
entity.a(e, edbbe.getDamage()); entity.a(e, edbbe.getDamage());
}
}
// Craftbukkit end
double d15 = d14; double d15 = d14;
entity.s += d6 * d15; entity.s += d6 * d15;
@ -163,6 +147,9 @@ public class Explosion {
entity.u += d10 * d15; entity.u += d10 * d15;
} }
} }
// CraftBukkit end
}
}
f = f1; f = f1;
ArrayList arraylist = new ArrayList(); ArrayList arraylist = new ArrayList();
@ -190,28 +177,28 @@ public class Explosion {
((List) (arraylist)).addAll(((java.util.Collection) (g))); ((List) (arraylist)).addAll(((java.util.Collection) (g)));
// Craftbukkit start // CraftBukkit start
CraftServer servr = ((WorldServer) i).getServer(); Server server = ((WorldServer) i).getServer();
CraftWorld wrld = ((WorldServer) i).getWorld(); CraftWorld world = ((WorldServer) i).getWorld();
org.bukkit.entity.Entity splode; org.bukkit.entity.Entity splode = (e == null) ? null : e.getBukkitEntity();
if (this.e instanceof EntityCreeper) {
splode = new CraftLivingEntity(servr, (EntityLiving) e); List<org.bukkit.block.Block> blocklist = new ArrayList<org.bukkit.block.Block>();
} else { for (int j = arraylist.size() - 1; j >= 0; j--) {
splode = (org.bukkit.entity.Entity) this.e; ChunkPosition cpos = (ChunkPosition) arraylist.get(j);
} org.bukkit.block.Block blox = world.getBlockAt(cpos.a, cpos.b, cpos.c);
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());
if (!blox.getType().equals(org.bukkit.Material.AIR)) { if (!blox.getType().equals(org.bukkit.Material.AIR)) {
blocklist.add(blox); blocklist.add(blox);
} }
} }
EntityExplodeEvent eee = new EntityExplodeEvent(EntityExplodeEvent.Type.ENTITY_EXPLODE, splode, blocklist); org.bukkit.event.Event.Type eventType = EntityExplodeEvent.Type.ENTITY_EXPLODE;
servr.getPluginManager().callEvent(eee); EntityExplodeEvent eee = new EntityExplodeEvent(eventType, splode, blocklist);
if (!(eee.isCancelled())) { server.getPluginManager().callEvent(eee);
// Notch start
if (eee.isCancelled()) {
return;
}
// CraftBukkit end
for (int j = ((List) (arraylist)).size() - 1; j >= 0; j--) { for (int j = ((List) (arraylist)).size() - 1; j >= 0; j--) {
ChunkPosition chunkposition = (ChunkPosition) ((List) (arraylist)).get(j); ChunkPosition chunkposition = (ChunkPosition) ((List) (arraylist)).get(j);
int k = chunkposition.a; int k = chunkposition.a;
@ -247,8 +234,5 @@ public class Explosion {
Block.m[j1].a_(i, k, l, i1); Block.m[j1].a_(i, k, l, i1);
} }
} }
// Notch end
}
//Craftbukkit end
} }
} }