diff options
Diffstat (limited to 'src/main/java/net/minecraft/server/Explosion.java')
-rw-r--r-- | src/main/java/net/minecraft/server/Explosion.java | 320 |
1 files changed, 160 insertions, 160 deletions
diff --git a/src/main/java/net/minecraft/server/Explosion.java b/src/main/java/net/minecraft/server/Explosion.java index 3344eb35..3dd9a4fd 100644 --- a/src/main/java/net/minecraft/server/Explosion.java +++ b/src/main/java/net/minecraft/server/Explosion.java @@ -1,127 +1,127 @@ package net.minecraft.server; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Random; +import java.util.Set; + // CraftBukkit start import org.bukkit.Server; import org.bukkit.craftbukkit.CraftServer; import org.bukkit.event.entity.EntityDamageByBlockEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; - import org.bukkit.event.entity.EntityExplodeEvent; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.event.entity.EntityDamageEvent.DamageCause; - import org.bukkit.Location; - // CraftBukkit end -import java.util.*; - public class Explosion { - public boolean a; - private Random h; + public boolean a = false; + private Random h = new Random(); private World i; public double b; public double c; public double d; public Entity e; public float f; - public Set g; - - public Explosion(World world, Entity entity, double d1, double d2, double d3, float f1) { - a = false; - h = new Random(); - g = ((Set) (new HashSet())); - i = world; - e = entity; - f = f1; - b = d1; - c = d2; - d = d3; - + public Set g = new HashSet(); + + public Explosion(World world, Entity entity, double d0, double d1, double d2, float f) { + this.i = world; + this.e = entity; + this.f = f; + this.b = d0; + this.c = d1; + this.d = d2; } public void a() { - float f1 = f; - int j = 16; - - for (int k = 0; k < j; k++) { - for (int i1 = 0; i1 < j; i1++) { - label0: - for (int k1 = 0; k1 < j; k1++) { - if (k != 0 && k != j - 1 && i1 != 0 && i1 != j - 1 && k1 != 0 && k1 != j - 1) { - continue; - } - double d1 = ((float) k / ((float) j - 1.0F)) * 2.0F - 1.0F; - double d2 = ((float) i1 / ((float) j - 1.0F)) * 2.0F - 1.0F; - double d3 = ((float) k1 / ((float) j - 1.0F)) * 2.0F - 1.0F; - double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); - - d1 /= d4; - d2 /= d4; - d3 /= d4; - float f2 = f * (0.7F + i.l.nextFloat() * 0.6F); - double d5 = b; - double d7 = c; - double d9 = d; - float f3 = 0.3F; - - do { - if (f2 <= 0.0F) { - continue label0; + float f = this.f; + byte b0 = 16; + + int i; + int j; + int k; + double d0; + double d1; + double d2; + + for (i = 0; i < b0; ++i) { + for (j = 0; j < b0; ++j) { + for (k = 0; k < b0; ++k) { + if (i == 0 || i == b0 - 1 || j == 0 || j == b0 - 1 || k == 0 || k == b0 - 1) { + double d3 = (double) ((float) i / ((float) b0 - 1.0F) * 2.0F - 1.0F); + double d4 = (double) ((float) j / ((float) b0 - 1.0F) * 2.0F - 1.0F); + double d5 = (double) ((float) k / ((float) b0 - 1.0F) * 2.0F - 1.0F); + double d6 = Math.sqrt(d3 * d3 + d4 * d4 + d5 * d5); + + d3 /= d6; + d4 /= d6; + d5 /= d6; + float f1 = this.f * (0.7F + this.i.l.nextFloat() * 0.6F); + + d0 = this.b; + d1 = this.c; + d2 = this.d; + + for (float f2 = 0.3F; f1 > 0.0F; f1 -= f2 * 0.75F) { + int l = MathHelper.b(d0); + int i1 = MathHelper.b(d1); + int j1 = MathHelper.b(d2); + int k1 = this.i.getTypeId(l, i1, j1); + + if (k1 > 0) { + f1 -= (Block.byId[k1].a(this.e) + 0.3F) * f2; + } + + if (f1 > 0.0F) { + this.g.add(new ChunkPosition(l, i1, j1)); + } + + d0 += d3 * (double) f2; + d1 += d4 * (double) f2; + d2 += d5 * (double) f2; } - int j2 = MathHelper.b(d5); - int k2 = MathHelper.b(d7); - int l2 = MathHelper.b(d9); - int i3 = i.a(j2, k2, l2); - - if (i3 > 0) { - f2 -= (Block.m[i3].a(e) + 0.3F) * f3; - } - if (f2 > 0.0F) { - g.add(((new ChunkPosition(j2, k2, l2)))); - } - d5 += d1 * (double) f3; - d7 += d2 * (double) f3; - d9 += d3 * (double) f3; - f2 -= f3 * 0.75F; - } while (true); + } } } } - f *= 2.0F; - int l = MathHelper.b(b - (double) f - 1.0D); - int j1 = MathHelper.b(b + (double) f + 1.0D); - int l1 = MathHelper.b(c - (double) f - 1.0D); - int j3 = MathHelper.b(c + (double) f + 1.0D); - int k3 = MathHelper.b(d - (double) f - 1.0D); - int l3 = MathHelper.b(d + (double) f + 1.0D); - List list = i.b(e, AxisAlignedBB.b(l, l1, k3, j1, j3, l3)); - Vec3D vec3d = Vec3D.b(b, c, d); - - for (int i4 = 0; i4 < list.size(); i4++) { - Entity entity = (Entity) list.get(i4); - double d11 = entity.e(b, c, d) / (double) f; - - if (d11 <= 1.0D) { - double d6 = entity.p - b; - double d8 = entity.q - c; - double d10 = entity.r - d; - double d12 = MathHelper.a(d6 * d6 + d8 * d8 + d10 * d10); - - d6 /= d12; - d8 /= d12; - d10 /= d12; - double d13 = i.a(vec3d, entity.z); - double d14 = (1.0D - d11) * d13; + this.f *= 2.0F; + i = MathHelper.b(this.b - (double) this.f - 1.0D); + j = MathHelper.b(this.b + (double) this.f + 1.0D); + k = MathHelper.b(this.c - (double) this.f - 1.0D); + int l1 = MathHelper.b(this.c + (double) this.f + 1.0D); + int i2 = MathHelper.b(this.d - (double) this.f - 1.0D); + int j2 = MathHelper.b(this.d + (double) this.f + 1.0D); + List list = this.i.b(this.e, AxisAlignedBB.b((double) i, (double) k, (double) i2, (double) j, (double) l1, (double) j2)); + Vec3D vec3d = Vec3D.b(this.b, this.c, this.d); + + for (int k2 = 0; k2 < list.size(); ++k2) { + Entity entity = (Entity) list.get(k2); + double d7 = entity.e(this.b, this.c, this.d) / (double) this.f; + + if (d7 <= 1.0D) { + d0 = entity.locX - this.b; + d1 = entity.locY - this.c; + d2 = entity.locZ - this.d; + double d8 = (double) MathHelper.a(d0 * d0 + d1 * d1 + d2 * d2); + + d0 /= d8; + d1 /= d8; + d2 /= d8; + double d9 = (double) this.i.a(vec3d, entity.boundingBox); + double d10 = (1.0D - d7) * d9; // CraftBukkit start - explosion damage hook - CraftServer server = ((WorldServer) i).getServer(); - org.bukkit.entity.Entity damagee = (entity == null)?null:entity.getBukkitEntity(); + CraftServer server = ((WorldServer) this.i).getServer(); + org.bukkit.entity.Entity damagee = (entity == null) ? null : entity.getBukkitEntity(); DamageCause damageType; - int damageDone = (int) (((d14 * d14 + d14) / 2D) * 8D * (double) f + 1.0D); + int damageDone = (int) ((d10 * d10 + d10) / 2.0D * 8.0D * (double) this.f + 1.0D); if(damagee == null){ // nothing was hurt @@ -129,62 +129,61 @@ public class 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); - if (!edbbe.isCancelled()) { - entity.a(e, edbbe.getDamage()); + EntityDamageByBlockEvent event = new EntityDamageByBlockEvent(null, damagee, damageType, damageDone); + server.getPluginManager().callEvent(event); + if (!event.isCancelled()) { + entity.a(this.e, event.getDamage()); } } else { - org.bukkit.entity.Entity damager = e.getBukkitEntity(); + org.bukkit.entity.Entity damager = this.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; + EntityDamageByEntityEvent event = new EntityDamageByEntityEvent(damager, damagee, damageType, damageDone); + server.getPluginManager().callEvent(event); + + if (!event.isCancelled()) { + entity.a(this.e, event.getDamage()); - entity.s += d6 * d15; - entity.t += d8 * d15; - entity.u += d10 * d15; + entity.motX += d0 * d10; + entity.motY += d1 * d10; + entity.motZ += d2 * d10; } } // CraftBukkit end } } - f = f1; + this.f = f; ArrayList arraylist = new ArrayList(); - ((List) (arraylist)).addAll(((java.util.Collection) (g))); - if (a) { - for (int j4 = ((List) (arraylist)).size() - 1; j4 >= 0; j4--) { - ChunkPosition chunkposition = (ChunkPosition) ((List) (arraylist)).get(j4); - int i2 = chunkposition.a; - int k4 = chunkposition.b; - int l4 = chunkposition.c; - int i5 = i.a(i2, k4, l4); - int j5 = i.a(i2, k4 - 1, l4); - - if (i5 == 0 && Block.o[j5] && h.nextInt(3) == 0) { - i.e(i2, k4, l4, Block.ar.bi); + arraylist.addAll(this.g); + if (this.a) { + for (int l2 = arraylist.size() - 1; l2 >= 0; --l2) { + ChunkPosition chunkposition = (ChunkPosition) arraylist.get(l2); + int i3 = chunkposition.a; + int j3 = chunkposition.b; + int k3 = chunkposition.c; + int l3 = this.i.getTypeId(i3, j3, k3); + int i4 = this.i.getTypeId(i3, j3 - 1, k3); + + if (l3 == 0 && Block.o[i4] && this.h.nextInt(3) == 0) { + this.i.e(i3, j3, k3, Block.FIRE.id); } } } } public void b() { - i.a(b, c, d, "random.explode", 4F, (1.0F + (i.l.nextFloat() - i.l.nextFloat()) * 0.2F) * 0.7F); + this.i.a(this.b, this.c, this.d, "random.explode", 4.0F, (1.0F + (this.i.l.nextFloat() - this.i.l.nextFloat()) * 0.2F) * 0.7F); ArrayList arraylist = new ArrayList(); - ((List) (arraylist)).addAll(((java.util.Collection) (g))); + arraylist.addAll(this.g); // CraftBukkit start - Server server = ((WorldServer) i).getServer(); - CraftWorld world = ((WorldServer) i).getWorld(); - org.bukkit.entity.Entity splode = (e == null) ? null : e.getBukkitEntity(); - Location location = new Location(world, b, c, d); + Server server = ((WorldServer) this.i).getServer(); + CraftWorld world = ((WorldServer) this.i).getWorld(); + org.bukkit.entity.Entity splode = (this.e == null) ? null : this.e.getBukkitEntity(); + Location location = new Location(world, this.b, this.c, this.d); List<org.bukkit.block.Block> blocklist = new ArrayList<org.bukkit.block.Block>(); for (int j = arraylist.size() - 1; j >= 0; j--) { @@ -194,48 +193,49 @@ public class Explosion { blocklist.add(blox); } } - + org.bukkit.event.Event.Type eventType = EntityExplodeEvent.Type.ENTITY_EXPLODE; - EntityExplodeEvent eee = new EntityExplodeEvent(eventType, splode, location, blocklist); - server.getPluginManager().callEvent(eee); - - if (eee.isCancelled()) { + EntityExplodeEvent event = new EntityExplodeEvent(eventType, splode, location, blocklist); + server.getPluginManager().callEvent(event); + + if (event.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); + + for (int i = arraylist.size() - 1; i >= 0; --i) { + ChunkPosition chunkposition = (ChunkPosition) arraylist.get(i); + int j = chunkposition.a; + int k = chunkposition.b; + int l = chunkposition.c; + int i1 = this.i.getTypeId(j, k, l); + + for (int j1 = 0; j1 < 1; ++j1) { + double d0 = (double) ((float) j + this.i.l.nextFloat()); + double d1 = (double) ((float) k + this.i.l.nextFloat()); + double d2 = (double) ((float) l + this.i.l.nextFloat()); + double d3 = d0 - this.b; + double d4 = d1 - this.c; + double d5 = d2 - this.d; + double d6 = (double) MathHelper.a(d3 * d3 + d4 * d4 + d5 * d5); + + d3 /= d6; + d4 /= d6; + d5 /= d6; + double d7 = 0.5D / (d6 / (double) this.f + 0.1D); + + d7 *= (double) (this.i.l.nextFloat() * this.i.l.nextFloat() + 0.3F); + d3 *= d7; + d4 *= d7; + d5 *= d7; + this.i.a("explode", (d0 + this.b * 1.0D) / 2.0D, (d1 + this.c * 1.0D) / 2.0D, (d2 + this.d * 1.0D) / 2.0D, d3, d4, d5); + this.i.a("smoke", d0, d1, d2, d3, d4, d5); } - 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); + if (i1 > 0) { + Block.byId[i1].a(this.i, j, k, l, this.i.getData(j, k, l), 0.3F); + this.i.e(j, k, l, 0); + Block.byId[i1].a_(this.i, j, k, l); } } } |