001 002 import java.util.ArrayList; 003 import java.util.HashSet; 004 import java.util.List; 005 import java.util.Random; 006 import java.util.Set; 007 008 public class dg { 009 010 public boolean a = false; 011 private Random h = new Random(); 012 private fv i; 013 public double b; 014 public double c; 015 public double d; 016 public fe e; 017 public float f; 018 public Set g = new HashSet(); 019 020 public dg(fv paramfv, fe paramfe, double paramDouble1, double paramDouble2, double paramDouble3, float paramFloat) { 021 i = paramfv; 022 e = paramfe; 023 f = paramFloat; 024 b = paramDouble1; 025 c = paramDouble2; 026 d = paramDouble3; 027 } 028 029 public void a() { 030 // hMod: allow explosion 031 Block block = new Block(this.i.a((int) Math.floor(this.b), (int) Math.floor(this.c), (int) Math.floor(this.d)), (int) Math.floor(this.b), (int) Math.floor(this.c), (int) Math.floor(this.d)); 032 033 // hMod: preserve source through blockstatus. 034 if (this.e == null) { 035 block.setStatus(1); // TNT 036 } else if (this.e instanceof gy) { 037 block.setStatus(2); //Creeper 038 } 039 040 // hMod: call explode hook. 041 if ((Boolean) etc.getLoader().callHook(PluginLoader.Hook.EXPLODE, block)) { 042 return; 043 } 044 045 float f1 = f; 046 047 int j = 16; 048 double d6; 049 double d7; 050 double d8; 051 for (int k = 0; k < j; k++) { 052 for (int m = 0; m < j; m++) { 053 for (int n = 0; n < j; n++) { 054 if ((k != 0) && (k != j - 1) && (m != 0) && (m != j - 1) && (n != 0) && (n != j - 1)) { 055 continue; 056 } 057 double d1 = k / (j - 1.0F) * 2.0F - 1.0F; 058 double d2 = m / (j - 1.0F) * 2.0F - 1.0F; 059 double d3 = n / (j - 1.0F) * 2.0F - 1.0F; 060 double d4 = Math.sqrt(d1 * d1 + d2 * d2 + d3 * d3); 061 062 d1 /= d4; 063 d2 /= d4; 064 d3 /= d4; 065 066 float f2 = f * (0.7F + i.l.nextFloat() * 0.6F); 067 d6 = b; 068 d7 = c; 069 d8 = d; 070 071 float f3 = 0.3F; 072 while (f2 > 0.0F) { 073 int i11 = iz.b(d6); 074 int i12 = iz.b(d7); 075 int i13 = iz.b(d8); 076 int i14 = i.a(i11, i12, i13); 077 if (i14 > 0) { 078 f2 -= (hr.m[i14].a(e) + 0.3F) * f3; 079 } 080 if (f2 > 0.0F) { 081 g.add(new jq(i11, i12, i13)); 082 } 083 084 d6 += d1 * f3; 085 d7 += d2 * f3; 086 d8 += d3 * f3; 087 f2 -= f3 * 0.75F; 088 } 089 } 090 } 091 092 } 093 094 f *= 2.0F; 095 int k = iz.b(b - f - 1.0D); 096 int m = iz.b(b + f + 1.0D); 097 int n = iz.b(c - f - 1.0D); 098 int i1 = iz.b(c + f + 1.0D); 099 int i2 = iz.b(d - f - 1.0D); 100 int i3 = iz.b(d + f + 1.0D); 101 List localList = i.b(e, fa.b(k, n, i2, m, i1, i3)); 102 bu localbu = bu.b(b, c, d); 103 for (int i4 = 0; i4 < localList.size(); i4++) { 104 fe localfe = (fe) localList.get(i4); 105 double d5 = localfe.e(b, c, d) / f; 106 if (d5 <= 1.0D) { 107 d6 = localfe.p - b; 108 d7 = localfe.q - c; 109 d8 = localfe.r - d; 110 111 double d9 = iz.a(d6 * d6 + d7 * d7 + d8 * d8); 112 113 d6 /= d9; 114 d7 /= d9; 115 d8 /= d9; 116 117 double d10 = i.a(localbu, localfe.z); 118 double d11 = (1.0D - d5) * d10; 119 // hMod Damage hook: Explosions 120 int damage = (int) ((d11 * d11 + d11) / 2.0D * 8.0D * this.f + 1.0D); 121 BaseEntity exploder = new BaseEntity(localfe); 122 PluginLoader.DamageType dmgType = (this.e instanceof gy) ? PluginLoader.DamageType.CREEPER_EXPLOSION : PluginLoader.DamageType.EXPLOSION; 123 if (!(Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, dmgType, null, exploder, damage)) { 124 localfe.a(this.e, damage); 125 } 126 127 double d12 = d11; 128 localfe.s += d6 * d12; 129 localfe.t += d7 * d12; 130 localfe.u += d8 * d12; 131 } 132 } 133 f = f1; 134 135 ArrayList localArrayList = new ArrayList(); 136 localArrayList.addAll(g); 137 138 if (a) { 139 for (int i5 = localArrayList.size() - 1; i5 >= 0; i5--) { 140 jq localjq = (jq) localArrayList.get(i5); 141 int i6 = localjq.a; 142 int i7 = localjq.b; 143 int i8 = localjq.c; 144 int i9 = i.a(i6, i7, i8); 145 int i10 = i.a(i6, i7 - 1, i8); 146 if ((i9 == 0) && (hr.o[i10]) && (h.nextInt(3) == 0)) { 147 i.e(i6, i7, i8, hr.ar.bi); 148 } 149 } 150 } 151 } 152 153 public void b() { 154 i.a(b, c, d, "random.explode", 4.0F, (1.0F + (i.l.nextFloat() - i.l.nextFloat()) * 0.2F) * 0.7F); 155 156 ArrayList localArrayList = new ArrayList(); 157 localArrayList.addAll(g); 158 for (int j = localArrayList.size() - 1; j >= 0; j--) { 159 jq localjq = (jq) localArrayList.get(j); 160 int k = localjq.a; 161 int m = localjq.b; 162 int n = localjq.c; 163 164 int i1 = i.a(k, m, n); 165 166 for (int i2 = 0; i2 < 1; i2++) { 167 double d1 = k + i.l.nextFloat(); 168 double d2 = m + i.l.nextFloat(); 169 double d3 = n + i.l.nextFloat(); 170 171 double d4 = d1 - b; 172 double d5 = d2 - c; 173 double d6 = d3 - d; 174 175 double d7 = iz.a(d4 * d4 + d5 * d5 + d6 * d6); 176 177 d4 /= d7; 178 d5 /= d7; 179 d6 /= d7; 180 181 double d8 = 0.5D / (d7 / f + 0.1D); 182 d8 *= (i.l.nextFloat() * i.l.nextFloat() + 0.3F); 183 d4 *= d8; 184 d5 *= d8; 185 d6 *= d8; 186 187 i.a("explode", (d1 + b * 1.0D) / 2.0D, (d2 + c * 1.0D) / 2.0D, (d3 + d * 1.0D) / 2.0D, d4, d5, d6); 188 i.a("smoke", d1, d2, d3, d4, d5, d6); 189 } 190 191 if (i1 > 0) { 192 hr.m[i1].a(i, k, m, n, i.b(k, m, n), 0.3F); 193 i.e(k, m, n, 0); 194 hr.m[i1].a_(i, k, m, n); 195 } 196 } 197 } 198 }