import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; public class OExplosion { public boolean a = false; private Random h = new Random(); private OWorld i; public double b; public double c; public double d; public OEntity e; public float f; public Set g = new HashSet(); public OExplosion(OWorld paramOWorld, OEntity paramOEntity, double paramDouble1, double paramDouble2, double paramDouble3, float paramFloat) { i = paramOWorld; e = paramOEntity; f = paramFloat; b = paramDouble1; c = paramDouble2; d = paramDouble3; } public void a() { // hMod: allow explosion Block block = new Block(i.a((int) Math.floor(b), (int) Math.floor(c), (int) Math.floor(d)), (int) Math.floor(b), (int) Math.floor(c), (int) Math.floor(d)); // hMod: preserve source through blockstatus. if (e == null) block.setStatus(1); // TNT else if (e instanceof OEntityCreeper) block.setStatus(2); // Creeper // hMod: call explode hook. if ((Boolean) etc.getLoader().callHook(PluginLoader.Hook.EXPLODE, block)) return; float f1 = f; int j = 16; double d5; double d6; double d7; for (int k = 0; k < j; k++) for (int m = 0; m < j; m++) for (int n = 0; n < j; n++) { if ((k != 0) && (k != j - 1) && (m != 0) && (m != j - 1) && (n != 0) && (n != j - 1)) continue; double d1 = k / (j - 1.0F) * 2.0F - 1.0F; double d2 = m / (j - 1.0F) * 2.0F - 1.0F; double d3 = n / (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.k.nextFloat() * 0.6F); d5 = b; d6 = c; d7 = d; float f3 = 0.3F; while (f2 > 0.0F) { int i2 = OMathHelper.b(d5); int i3 = OMathHelper.b(d6); int i4 = OMathHelper.b(d7); int i5 = i.a(i2, i3, i4); if (i5 > 0) f2 -= (OBlock.m[i5].a(e) + 0.3F) * f3; if (f2 > 0.0F) g.add(new OChunkPosition(i2, i3, i4)); d5 += d1 * f3; d6 += d2 * f3; d7 += d3 * f3; f2 -= f3 * 0.75F; } } f *= 2.0F; int k = OMathHelper.b(b - f - 1.0D); int m = OMathHelper.b(b + f + 1.0D); int n = OMathHelper.b(c - f - 1.0D); int i6 = OMathHelper.b(c + f + 1.0D); int i7 = OMathHelper.b(d - f - 1.0D); int i8 = OMathHelper.b(d + f + 1.0D); List localList = i.b(e, OAxisAlignedBB.b(k, n, i7, m, i6, i8)); OVec3D localOVec3D = OVec3D.b(b, c, d); for (int i9 = 0; i9 < localList.size(); i9++) { OEntity localOEntity = (OEntity) localList.get(i9); double d8 = localOEntity.e(b, c, d) / f; if (d8 <= 1.0D) { d5 = localOEntity.aK - b; d6 = localOEntity.aL - c; d7 = localOEntity.aM - d; double d9 = OMathHelper.a(d5 * d5 + d6 * d6 + d7 * d7); d5 /= d9; d6 /= d9; d7 /= d9; double d10 = i.a(localOVec3D, localOEntity.aU); double d11 = (1.0D - d8) * d10; // hMod Damage hook: Explosions int damage = (int) ((d11 * d11 + d11) / 2.0D * 8.0D * f + 1.0D); PluginLoader.DamageType dmgType = (e instanceof OEntityCreeper) ? PluginLoader.DamageType.CREEPER_EXPLOSION : PluginLoader.DamageType.EXPLOSION; if (!(Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, dmgType, null, localOEntity.entity, damage)) localOEntity.a(e, (int) ((d11 * d11 + d11) / 2.0D * 8.0D * f + 1.0D)); double d12 = d11; localOEntity.aN += d5 * d12; localOEntity.aO += d6 * d12; localOEntity.aP += d7 * d12; } } f = f1; ArrayList localArrayList = new ArrayList(); localArrayList.addAll(g); if (a) for (int i10 = localArrayList.size() - 1; i10 >= 0; i10--) { OChunkPosition localOChunkPosition = (OChunkPosition) localArrayList.get(i10); int i1 = localOChunkPosition.a; int i11 = localOChunkPosition.b; int i12 = localOChunkPosition.c; int i13 = i.a(i1, i11, i12); int i14 = i.a(i1, i11 - 1, i12); if ((i13 == 0) && OBlock.o[i14] && (h.nextInt(3) == 0)) i.e(i1, i11, i12, OBlock.ar.bl); } } public void b() { i.a(b, c, d, "random.explode", 4.0F, (1.0F + (i.k.nextFloat() - i.k.nextFloat()) * 0.2F) * 0.7F); ArrayList localArrayList = new ArrayList(); localArrayList.addAll(g); for (int j = localArrayList.size() - 1; j >= 0; j--) { OChunkPosition localOChunkPosition = (OChunkPosition) localArrayList.get(j); int k = localOChunkPosition.a; int m = localOChunkPosition.b; int n = localOChunkPosition.c; int i1 = i.a(k, m, n); for (int i2 = 0; i2 < 1; i2++) { double d1 = k + i.k.nextFloat(); double d2 = m + i.k.nextFloat(); double d3 = n + i.k.nextFloat(); double d4 = d1 - b; double d5 = d2 - c; double d6 = d3 - d; double d7 = OMathHelper.a(d4 * d4 + d5 * d5 + d6 * d6); d4 /= d7; d5 /= d7; d6 /= d7; double d8 = 0.5D / (d7 / f + 0.1D); d8 *= (i.k.nextFloat() * i.k.nextFloat() + 0.3F); d4 *= d8; d5 *= d8; d6 *= d8; i.a("explode", (d1 + b * 1.0D) / 2.0D, (d2 + c * 1.0D) / 2.0D, (d3 + d * 1.0D) / 2.0D, d4, d5, d6); i.a("smoke", d1, d2, d3, d4, d5, d6); } if (i1 > 0) { OBlock.m[i1].a(i, k, m, n, i.b(k, m, n), 0.3F); i.e(k, m, n, 0); OBlock.m[i1].c(i, k, m, n); } } } }