001    import java.util.List;
002    import java.util.Random;
003    
004    public abstract class mj extends fe
005    {
006      public int aF = 20;
007      public float aG;
008      public float aH;
009      public float aI = 0.0F; public float aJ = 0.0F;
010      protected float aK;
011      protected float aL;
012      protected float aM;
013      protected float aN;
014      protected boolean aO = true;
015      protected String aP = "/mob/char.png";
016      protected boolean aQ = true;
017      protected float aR = 0.0F;
018      protected String aS = null;
019      protected float aT = 1.0F;
020      protected int aU = 0;
021      protected float aV = 0.0F;
022      public boolean aW = false;
023      public float aX;
024      public float aY;
025      public int aZ;
026      public int ba;
027      private int a;
028      public int bb;
029      public int bc;
030      public float bd = 0.0F;
031      public int be = 0;
032      public int bf = 0;
033      public float bg;
034      public float bh;
035      protected boolean bi = false;
036    
037      public int bj = -1;
038      public float bk = (float)(Math.random() * 0.8999999761581421D + 0.1000000014901161D);
039      public float bl;
040      public float bm;
041      public float bn;
042      protected int bo;
043      protected double bp;
044      protected double bq;
045      protected double br;
046      protected double bs;
047      protected double bt;
048      float bu = 0.0F;
049    
050      protected int bv = 0;
051    
052      protected int bw = 0;
053      protected float bx;
054      protected float by;
055      protected float bz;
056      protected boolean bA = false;
057      protected float bB = 0.0F;
058      protected float bC = 0.7F;
059      private fe b;
060      private int c = 0;
061    
062      public mj(fv paramfv)
063      {
064        super(paramfv);
065        aZ = 10;
066        i = true;
067    
068        aH = ((float)(Math.random() + 1.0D) * 0.01F);
069        a(p, q, r);
070        aG = ((float)Math.random() * 12398.0F);
071        v = (float)(Math.random() * 3.141592741012573D * 2.0D);
072    
073        S = 0.5F;
074      }
075    
076      protected void a()
077      {
078      }
079    
080      public boolean i(fe paramfe)
081      {
082          // hMod fix the static reference here with a null element.
083            bu bu = null;
084        return l.a(bu.b(p, q + w(), r), bu.b(paramfe.p, paramfe.q + paramfe.w(), paramfe.r)) == null;
085      }
086    
087      public boolean c_()
088      {
089        return !G;
090      }
091    
092      public boolean z() {
093        return !G;
094      }
095    
096      public float w() {
097        return J * 0.85F;
098      }
099    
100      public int c() {
101        return 80;
102      }
103    
104      public void r() {
105        aX = aY;
106        super.r();
107    
108        if (W.nextInt(1000) < a++) {
109          a = (-c());
110          String str = e();
111          if (str != null) {
112            l.a(this, str, i(), (W.nextFloat() - W.nextFloat()) * 0.2F + 1.0F);
113          }
114        }
115    
116        if ((B()) && (C())) {
117          a((fe)null, 1);
118        }
119    
120        if ((ae) || (l.z)) Z = 0;
121        int i;
122        if ((B()) && (a(mh.f)) && (!d_())) {
123          ad -= 1;
124          if (ad == -20) {
125            ad = 0;
126            for (i = 0; i < 8; i++) {
127              float f1 = W.nextFloat() - W.nextFloat();
128              float f2 = W.nextFloat() - W.nextFloat();
129              float f3 = W.nextFloat() - W.nextFloat();
130              l.a("bubble", p + f1, q + f2, r + f3, s, t, u);
131            }
132            // hMod Damage hook: Drowning
133                    LivingEntity defender = new LivingEntity(this);
134                    if (!(Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.WATER, null, defender, 2)) {
135            a((fe)null, 2);
136            }
137          }
138    
139          Z = 0;
140        } else {
141          ad = aa;
142        }
143    
144        bg = bh;
145    
146        if (bf > 0) bf -= 1;
147        if (bb > 0) bb -= 1;
148        if (ac > 0) ac -= 1;
149        if (aZ <= 0) {
150          be += 1;
151          if (be > 20) {
152            T();
153            q();
154            for (i = 0; i < 20; i++) {
155              double d1 = W.nextGaussian() * 0.02D;
156              double d2 = W.nextGaussian() * 0.02D;
157              double d3 = W.nextGaussian() * 0.02D;
158              l.a("explode", p + W.nextFloat() * I * 2.0F - I, q + W.nextFloat() * J, r + W.nextFloat() * I * 2.0F - I, d1, d2, d3);
159            }
160          }
161        }
162    
163        aN = aM;
164    
165        aJ = aI;
166        x = v;
167        y = w;
168      }
169    
170      public void R() {
171        for (int i = 0; i < 20; i++) {
172          double d1 = W.nextGaussian() * 0.02D;
173          double d2 = W.nextGaussian() * 0.02D;
174          double d3 = W.nextGaussian() * 0.02D;
175          double d4 = 10.0D;
176          l.a("explode", p + W.nextFloat() * I * 2.0F - I - d1 * d4, q + W.nextFloat() * J - d2 * d4, r + W.nextFloat() * I * 2.0F - I - d3 * d4, d1, d2, d3);
177        }
178      }
179    
180      public void D()
181      {
182        super.D();
183        aK = aL;
184        aL = 0.0F;
185      }
186    
187      public void b_()
188      {
189        super.b_();
190    
191        o();
192    
193        double d1 = p - m;
194        double d2 = r - o;
195    
196        float f1 = iz.a(d1 * d1 + d2 * d2);
197    
198        float f2 = aI;
199    
200        float f3 = 0.0F;
201        aK = aL;
202        float f4 = 0.0F;
203        if (f1 > 0.05F)
204        {
205          f4 = 1.0F;
206          f3 = f1 * 3.0F;
207          f2 = (float)Math.atan2(d2, d1) * 180.0F / 3.141593F - 90.0F;
208        }
209        if (aY > 0.0F) {
210          f2 = v;
211        }
212        if (!A) {
213          f4 = 0.0F;
214        }
215        aL += (f4 - aL) * 0.3F;
216    
217        float f5 = f2 - aI;
218        while (f5 < -180.0F)
219          f5 += 360.0F;
220        while (f5 >= 180.0F)
221          f5 -= 360.0F;
222        aI += f5 * 0.3F;
223    
224        float f6 = v - aI;
225        while (f6 < -180.0F)
226          f6 += 360.0F;
227        while (f6 >= 180.0F)
228          f6 -= 360.0F;
229        int i = (f6 < -90.0F) || (f6 >= 90.0F) ? 1 : 0;
230        if (f6 < -75.0F) f6 = -75.0F;
231        if (f6 >= 75.0F) f6 = 75.0F;
232        aI = (v - f6);
233        if (f6 * f6 > 2500.0F) {
234          aI += f6 * 0.2F;
235        }
236    
237        if (i != 0) {
238          f3 *= -1.0F;
239        }
240        while (v - x < -180.0F)
241          x -= 360.0F;
242        while (v - x >= 180.0F) {
243          x += 360.0F;
244        }
245        while (aI - aJ < -180.0F)
246          aJ -= 360.0F;
247        while (aI - aJ >= 180.0F) {
248          aJ += 360.0F;
249        }
250        while (w - y < -180.0F)
251          y -= 360.0F;
252        while (w - y >= 180.0F)
253          y += 360.0F;
254        aM += f3;
255      }
256    
257      protected void a(float paramFloat1, float paramFloat2) {
258        super.a(paramFloat1, paramFloat2);
259      }
260    
261      public void d(int paramInt) {
262        if (aZ <= 0) return;
263        aZ += paramInt;
264        if (aZ > 20) aZ = 20;
265        ac = (aF / 2);
266      }
267    
268      public boolean a(fe paramfe, int paramInt)
269      {
270        if (l.z) return false;
271        bw = 0;
272        if (aZ <= 0) return false;
273    
274        bm = 1.5F;
275    
276        // hMod damage entities.
277            LivingEntity attacker = (paramfe != null && paramfe instanceof mj) ? new LivingEntity((mj) paramfe) : null;
278            LivingEntity defender = new LivingEntity(this);
279    
280            // hMod attack by entity, but it might not do damage!
281            if (attacker != null && (Boolean) etc.getLoader().callHook(PluginLoader.Hook.ATTACK, attacker, defender, paramInt)) {
282                return false;
283            }
284    
285        int i = 1;
286        if (ac > aF / 2.0F) {
287          if (paramInt <= bv) return false;
288          // hMod: partial damage
289                if (attacker != null && (Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.ENTITY, attacker, defender, paramInt - bw)) {
290                    return false;
291                }
292          e(paramInt - bv);
293          bv = paramInt;
294          i = 0;
295        } else {
296            // hMod: full damage
297                if (attacker != null && (Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.ENTITY, attacker, defender, paramInt)) {
298                    return false;
299                }
300          bv = paramInt;
301          ba = aZ;
302          ac = aF;
303          e(paramInt);
304          bb = (this.bc = 10);
305        }
306    
307        bd = 0.0F;
308    
309        if (i != 0) {
310          l.a(this, (byte)2);
311          y();
312          if (paramfe != null) {
313            double d1 = paramfe.p - p;
314            double d2 = paramfe.r - r;
315            while (d1 * d1 + d2 * d2 < 0.0001D) {
316              d1 = (Math.random() - Math.random()) * 0.01D;
317              d2 = (Math.random() - Math.random()) * 0.01D;
318            }
319            bd = ((float)(Math.atan2(d2, d1) * 180.0D / 3.141592741012573D) - v);
320            a(paramfe, paramInt, d1, d2);
321          } else {
322            bd = ((int)(Math.random() * 2.0D) * 180);
323          }
324        }
325    
326        if (aZ <= 0) {
327          if (i != 0) l.a(this, g(), i(), (W.nextFloat() - W.nextFloat()) * 0.2F + 1.0F);
328          f(paramfe);
329        }
330        else if (i != 0) { l.a(this, f(), i(), (W.nextFloat() - W.nextFloat()) * 0.2F + 1.0F);
331        }
332    
333        return true;
334      }
335    
336      protected void e(int paramInt)
337      {
338        aZ -= paramInt;
339      }
340    
341      protected float i()
342      {
343        return 1.0F;
344      }
345    
346      protected String e() {
347        return null;
348      }
349    
350      protected String f() {
351        return "random.hurt";
352      }
353    
354      protected String g() {
355        return "random.hurt";
356      }
357    
358      public void a(fe paramfe, int paramInt, double paramDouble1, double paramDouble2) {
359        float f1 = iz.a(paramDouble1 * paramDouble1 + paramDouble2 * paramDouble2);
360        float f2 = 0.4F;
361    
362        s /= 2.0D;
363        t /= 2.0D;
364        u /= 2.0D;
365    
366        s -= paramDouble1 / f1 * f2;
367        t += 0.4000000059604645D;
368        u -= paramDouble2 / f1 * f2;
369    
370        if (t > 0.4000000059604645D) t = 0.4000000059604645D; 
371      }
372    
373      public void f(fe paramfe)
374      {
375        if ((aU > 0) && (paramfe != null)) paramfe.b(this, aU);
376        bi = true;
377    
378        if (!l.z) {
379          g_();
380        }
381        // hMod: Forced cast to play Death Animations.
382        l.a(this, (byte)3);
383      }
384    
385      protected void g_() {
386        int i = h();
387        if (i > 0) {
388          int j = W.nextInt(3);
389          for (int k = 0; k < j; k++)
390            a(i, 1);
391        }
392      }
393    
394      protected int h() {
395        return 0;
396      }
397    
398      protected void a(float paramFloat) {
399        int i = (int)Math.ceil(paramFloat - 3.0F);
400        if (i > 0) {
401            // hMod Damage hook: Falling
402                LivingEntity defender = new LivingEntity(this);
403                if (!(Boolean) etc.getLoader().callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.FALL, null, defender, i)) {
404    
405    
406          a((fe)null, i);}
407    
408          int j = l.a(iz.b(p), iz.b(q - 0.2000000029802322D - H), iz.b(r));
409          if (j > 0) {
410            cy localcy = hr.m[j].br;
411            l.a(this, localcy.c(), localcy.a() * 0.5F, localcy.b() * 0.75F);
412          }
413        }
414      }
415    
416      public void c(float paramFloat1, float paramFloat2)
417      {
418        double d1;
419        if (v()) {
420          d1 = q;
421          a(paramFloat1, paramFloat2, 0.02F);
422          c(s, t, u);
423    
424          s *= 0.800000011920929D;
425          t *= 0.800000011920929D;
426          u *= 0.800000011920929D;
427          t -= 0.02D;
428    
429          if ((B) && (b(s, t + 0.6000000238418579D - q + d1, u)))
430            t = 0.300000011920929D;
431        }
432        else if (x()) {
433          d1 = q;
434          a(paramFloat1, paramFloat2, 0.02F);
435          c(s, t, u);
436          s *= 0.5D;
437          t *= 0.5D;
438          u *= 0.5D;
439          t -= 0.02D;
440    
441          if ((B) && (b(s, t + 0.6000000238418579D - q + d1, u)))
442            t = 0.300000011920929D;
443        }
444        else {
445          float f1 = 0.91F;
446          if (A) {
447            f1 = 0.5460001F;
448            int i = l.a(iz.b(p), iz.b(z.b) - 1, iz.b(r));
449            if (i > 0) {
450              f1 = hr.m[i].bu * 0.91F;
451            }
452          }
453    
454          float f2 = 0.1627714F / (f1 * f1 * f1);
455          a(paramFloat1, paramFloat2, A ? 0.1F * f2 : 0.02F);
456    
457          f1 = 0.91F;
458          if (A) {
459            f1 = 0.5460001F;
460            int j = l.a(iz.b(p), iz.b(z.b) - 1, iz.b(r));
461            if (j > 0) {
462              f1 = hr.m[j].bu * 0.91F;
463            }
464          }
465    
466          if (m()) {
467            N = 0.0F;
468            if (t < -0.15D) t = -0.15D;
469    
470          }
471    
472          c(s, t, u);
473    
474          if ((B) && (m())) {
475            t = 0.2D;
476          }
477    
478          t -= 0.08D;
479          t *= 0.9800000190734863D;
480          s *= f1;
481          u *= f1;
482        }
483        bl = bm;
484        double d2 = p - m;
485        double d3 = r - o;
486        float f3 = iz.a(d2 * d2 + d3 * d3) * 4.0F;
487        if (f3 > 1.0F) f3 = 1.0F;
488        bm += (f3 - bm) * 0.4F;
489        bn += bm;
490      }
491    
492      public boolean m() {
493        int i = iz.b(p);
494        int j = iz.b(z.b);
495        int k = iz.b(r);
496        return (l.a(i, j, k) == hr.aF.bi) || (l.a(i, j + 1, k) == hr.aF.bi);
497      }
498    
499      public void a(ah paramah)
500      {
501        paramah.a("Health", (short)aZ);
502        paramah.a("HurtTime", (short)bb);
503        paramah.a("DeathTime", (short)be);
504        paramah.a("AttackTime", (short)bf);
505      }
506    
507      public void b(ah paramah) {
508        aZ = paramah.c("Health");
509        if (!paramah.a("Health")) aZ = 10;
510        bb = paramah.c("HurtTime");
511        be = paramah.c("DeathTime");
512        bf = paramah.c("AttackTime");
513      }
514    
515      public boolean B() {
516        return (!G) && (aZ > 0);
517      }
518    
519      public boolean d_() {
520        return false;
521      }
522    
523      public void o()
524      {
525        if (bo > 0) {
526          double d1 = p + (bp - p) / bo;
527          double d2 = q + (bq - q) / bo;
528          double d3 = r + (br - r) / bo;
529    
530          double d4 = bs - v;
531          while (d4 < -180.0D)
532            d4 += 360.0D;
533          while (d4 >= 180.0D) {
534            d4 -= 360.0D;
535          }
536          v = (float)(v + d4 / bo);
537          w = (float)(w + (bt - w) / bo);
538    
539          bo -= 1;
540          a(d1, d2, d3);
541          b(v, w);
542        }
543    
544        if (aZ <= 0) {
545          bA = false;
546          bx = 0.0F;
547          by = 0.0F;
548          bz = 0.0F;
549        }
550        else if (!aW) { d();
551        }
552    
553        boolean bool1 = v();
554        boolean bool2 = x();
555    
556        if (bA) {
557          if (bool1)
558            t += 0.03999999910593033D;
559          else if (bool2)
560            t += 0.03999999910593033D;
561          else if (A) {
562            S();
563          }
564    
565        }
566    
567        bx *= 0.98F;
568        by *= 0.98F;
569        bz *= 0.9F;
570        c(bx, by);
571    
572        List localList = l.b(this, z.b(0.2000000029802322D, 0.0D, 0.2000000029802322D));
573        if ((localList != null) && (localList.size() > 0))
574          for (int i = 0; i < localList.size(); i++) {
575            fe localfe = (fe)localList.get(i);
576            if (!localfe.z()) continue; localfe.c(this);
577          }
578      }
579    
580      protected void S()
581      {
582        t = 0.4199999868869782D;
583      }
584    
585      protected void d()
586      {
587        bw += 1;
588    
589        hl localhl = l.a(this, -1.0D);
590    
591        if (localhl != null) {
592          double d1 = localhl.p - p;
593          double d2 = localhl.q - q;
594          double d3 = localhl.r - r;
595          double d4 = d1 * d1 + d2 * d2 + d3 * d3;
596    
597          if (d4 > 16384.0D) {
598            q();
599          }
600    
601          if ((bw > 600) && (W.nextInt(800) == 0)) {
602            if (d4 < 1024.0D)
603              bw = 0;
604            else {
605              q();
606            }
607          }
608        }
609    
610        bx = 0.0F;
611        by = 0.0F;
612    
613        float f = 8.0F;
614        if (W.nextFloat() < 0.02F) {
615          localhl = l.a(this, f);
616          if (localhl != null) {
617            b = localhl;
618            c = (10 + W.nextInt(20));
619          } else {
620            bz = ((W.nextFloat() - 0.5F) * 20.0F);
621          }
622        }
623    
624        if (b != null) {
625          b(b, 10.0F);
626          if ((c-- <= 0) || (b.G) || (b.b(this) > f * f))
627            b = null;
628        }
629        else {
630          if (W.nextFloat() < 0.05F) {
631            bz = ((W.nextFloat() - 0.5F) * 20.0F);
632          }
633          v += bz;
634          w = bB;
635        }
636    
637        boolean bool1 = v();
638        boolean bool2 = x();
639        if ((bool1) || (bool2)) bA = (W.nextFloat() < 0.8F); 
640      }
641    
642      public void b(fe paramfe, float paramFloat)
643      {
644        double d1 = paramfe.p - p;
645    
646        double d3 = paramfe.r - r;
647        double d2;
648        if ((paramfe instanceof mj)) {
649          mj localmj = (mj)paramfe;
650          d2 = localmj.q + localmj.w() - (q + w());
651        } else {
652          d2 = (paramfe.z.b + paramfe.z.e) / 2.0D - (q + w());
653        }
654    
655        double d4 = iz.a(d1 * d1 + d3 * d3);
656    
657        float f1 = (float)(Math.atan2(d3, d1) * 180.0D / 3.141592741012573D) - 90.0F;
658        float f2 = (float)(Math.atan2(d2, d4) * 180.0D / 3.141592741012573D);
659        w = (-b(w, f2, paramFloat));
660        v = b(v, f1, paramFloat);
661      }
662    
663      private float b(float paramFloat1, float paramFloat2, float paramFloat3) {
664        float f = paramFloat2 - paramFloat1;
665        while (f < -180.0F)
666          f += 360.0F;
667        while (f >= 180.0F)
668          f -= 360.0F;
669        if (f > paramFloat3) {
670          f = paramFloat3;
671        }
672        if (f < -paramFloat3) {
673          f = -paramFloat3;
674        }
675        return paramFloat1 + f;
676      }
677    
678      public void T() {
679      }
680    
681      public boolean b() {
682        return (l.a(z)) && (l.a(this, z).size() == 0) && (!l.b(z));
683      }
684    
685      protected void t() {
686        a((fe)null, 4);
687      }
688    
689      public bu G()
690      {
691        return c(1.0F);
692      }
693    
694      public bu c(float paramFloat) {
695          // hMod fix the static reference here with a null element.
696            bu bu = null;
697    
698        if (paramFloat == 1.0F) {
699          float f1 = iz.b(-v * 0.01745329F - 3.141593F);
700          float f2 = iz.a(-v * 0.01745329F - 3.141593F);
701          float f3 = -iz.b(-w * 0.01745329F);
702          float f4 = iz.a(-w * 0.01745329F);
703    
704          return bu.b(f2 * f3, f4, f1 * f3);
705        }
706        float f1 = y + (w - y) * paramFloat;
707        float f2 = x + (v - x) * paramFloat;
708    
709        float f3 = iz.b(-f2 * 0.01745329F - 3.141593F);
710        float f4 = iz.a(-f2 * 0.01745329F - 3.141593F);
711        float f5 = -iz.b(-f1 * 0.01745329F);
712        float f6 = iz.a(-f1 * 0.01745329F);
713    
714        return bu.b(f4 * f5, f6, f3 * f5);
715      }
716    
717      public int j()
718      {
719        return 4;
720      }
721    }