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    }