import java.util.List;
import java.util.Random;
public abstract class OEntity {
private static int a = 0;
public int aB = a++;
public double aC = 1.0D;
public boolean aD = false;
public OEntity aE;
public OEntity aF;
public OWorld aG;
public double aH;
public double aI;
public double aJ;
public double aK;
public double aL;
public double aM;
public double aN;
public double aO;
public double aP;
public float aQ;
public float aR;
public float aS;
public float aT;
public final OAxisAlignedBB aU = OAxisAlignedBB.a(0.0D, 0.0D, 0.0D, 0.0D, 0.0D, 0.0D);
public boolean aV = false;
public boolean aW;
public boolean aX;
public boolean aY = false;
public boolean aZ = false;
public boolean ba = true;
public boolean bb = false;
public float bc = 0.0F;
public float bd = 0.6F;
public float be = 1.8F;
public float bf = 0.0F;
public float bg = 0.0F;
protected float bh = 0.0F;
private int b = 1;
public double bi;
public double bj;
public double bk;
public float bl = 0.0F;
public float bm = 0.0F;
public boolean bn = false;
public float bo = 0.0F;
public boolean bp = false;
protected Random bq = new Random();
public int br = 0;
public int bs = 1;
public int bt = 0;
protected int bu = 300;
protected boolean bv = false;
public int bw = 0;
public int bx = 300;
private boolean c = true;
protected boolean by = false;
protected ODataWatcher bz = new ODataWatcher();
private double d;
private double e;
public boolean bA = false;
public int bB;
public int bC;
public int bD;
// hMod Start
BaseEntity entity = new BaseEntity(this);
public static PluginLoader manager = etc.getLoader();
// hMod end
public OEntity(OWorld paramOWorld) {
aG = paramOWorld;
a(0.0D, 0.0D, 0.0D);
bz.a(0, (byte) 0);
a();
}
protected abstract void a();
public ODataWatcher T() {
return bz;
}
@Override
public boolean equals(Object paramObject) {
if ((paramObject instanceof OEntity))
return ((OEntity) paramObject).aB == aB;
return false;
}
@Override
public int hashCode() {
return aB;
}
public void D() {
bb = true;
}
protected void b(float paramFloat1, float paramFloat2) {
bd = paramFloat1;
be = paramFloat2;
}
protected void c(float paramFloat1, float paramFloat2) {
aQ = paramFloat1;
aR = paramFloat2;
}
public void a(double paramDouble1, double paramDouble2, double paramDouble3) {
aK = paramDouble1;
aL = paramDouble2;
aM = paramDouble3;
float f1 = bd / 2.0F;
float f2 = be;
aU.c(paramDouble1 - f1, paramDouble2 - bc + bl, paramDouble3 - f1, paramDouble1 + f1, paramDouble2 - bc + bl + f2, paramDouble3 + f1);
}
public void f_() {
L();
}
public void L() {
if ((aF != null) && (aF.bb))
aF = null;
br += 1;
bf = bg;
aH = aK;
aI = aL;
aJ = aM;
aT = aR;
aS = aQ;
if (g_()) {
if ((!bv) && (!c)) {
float f1 = OMathHelper.a(aN * aN * 0.2000000029802322D + aO * aO + aP * aP * 0.2000000029802322D) * 0.2F;
if (f1 > 1.0F)
f1 = 1.0F;
aG.a(this, "random.splash", f1, 1.0F + (bq.nextFloat() - bq.nextFloat()) * 0.4F);
float f2 = OMathHelper.b(aU.b);
float f3;
float f4;
for (int i = 0; i < 1.0F + bd * 20.0F; i++) {
f3 = (bq.nextFloat() * 2.0F - 1.0F) * bd;
f4 = (bq.nextFloat() * 2.0F - 1.0F) * bd;
aG.a("bubble", aK + f3, f2 + 1.0F, aM + f4, aN, aO - bq.nextFloat() * 0.2F, aP);
}
for (int i = 0; i < 1.0F + bd * 20.0F; i++) {
f3 = (bq.nextFloat() * 2.0F - 1.0F) * bd;
f4 = (bq.nextFloat() * 2.0F - 1.0F) * bd;
aG.a("splash", aK + f3, f2 + 1.0F, aM + f4, aN, aO, aP);
}
}
bh = 0.0F;
bv = true;
bt = 0;
} else
bv = false;
if (aG.t)
bt = 0;
else if (bt > 0)
if (by) {
bt -= 4;
if (bt < 0)
bt = 0;
} else {
if (bt % 20 == 0)
// hMod Damage hook: Periodic burn damage
if (!(Boolean) manager.callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.FIRE_TICK, null, entity, 1))
a((OEntity) null, 1);
bt -= 1;
}
if (V())
U();
if (aL < -64.0D)
R();
if (!aG.t) {
a(0, bt > 0);
a(2, aF != null);
}
c = false;
}
protected void U() {
if (!by) {
// hMod Damage hook: Lava
if (this instanceof OEntityLiving)
if ((Boolean) manager.callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.LAVA, null, entity, 4))
return;
a((OEntity) null, 4);
bt = 600;
}
}
protected void R() {
D();
}
public boolean b(double paramDouble1, double paramDouble2, double paramDouble3) {
OAxisAlignedBB localOAxisAlignedBB = aU.c(paramDouble1, paramDouble2, paramDouble3);
List localList = aG.a(this, localOAxisAlignedBB);
if (localList.size() > 0)
return false;
return !aG.b(localOAxisAlignedBB);
}
public void c(double paramDouble1, double paramDouble2, double paramDouble3) {
if (bn) {
aU.d(paramDouble1, paramDouble2, paramDouble3);
aK = ((aU.a + aU.d) / 2.0D);
aL = (aU.b + bc - bl);
aM = ((aU.c + aU.f) / 2.0D);
return;
}
double d1 = aK;
double d2 = aM;
double d3 = paramDouble1;
double d4 = paramDouble2;
double d5 = paramDouble3;
OAxisAlignedBB localOAxisAlignedBB1 = aU.b();
int i = (aV) && (Z()) ? 1 : 0;
if (i != 0) {
double d6 = 0.05D;
while ((paramDouble1 != 0.0D) && (aG.a(this, aU.c(paramDouble1, -1.0D, 0.0D)).size() == 0)) {
if ((paramDouble1 < d6) && (paramDouble1 >= -d6))
paramDouble1 = 0.0D;
else if (paramDouble1 > 0.0D)
paramDouble1 -= d6;
else
paramDouble1 += d6;
d3 = paramDouble1;
}
while ((paramDouble3 != 0.0D) && (aG.a(this, aU.c(0.0D, -1.0D, paramDouble3)).size() == 0)) {
if ((paramDouble3 < d6) && (paramDouble3 >= -d6))
paramDouble3 = 0.0D;
else if (paramDouble3 > 0.0D)
paramDouble3 -= d6;
else
paramDouble3 += d6;
d5 = paramDouble3;
}
}
List localList = aG.a(this, aU.a(paramDouble1, paramDouble2, paramDouble3));
for (int j = 0; j < localList.size(); j++)
paramDouble2 = ((OAxisAlignedBB) localList.get(j)).b(aU, paramDouble2);
aU.d(0.0D, paramDouble2, 0.0D);
if ((!ba) && (d4 != paramDouble2))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
int j = (aV) || ((d4 != paramDouble2) && (d4 < 0.0D)) ? 1 : 0;
for (int k = 0; k < localList.size(); k++)
paramDouble1 = ((OAxisAlignedBB) localList.get(k)).a(aU, paramDouble1);
aU.d(paramDouble1, 0.0D, 0.0D);
if ((!ba) && (d3 != paramDouble1))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
for (int k = 0; k < localList.size(); k++)
paramDouble3 = ((OAxisAlignedBB) localList.get(k)).c(aU, paramDouble3);
aU.d(0.0D, 0.0D, paramDouble3);
if ((!ba) && (d5 != paramDouble3))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
if ((bm > 0.0F) && (j != 0) && (bl < 0.05F) && ((d3 != paramDouble1) || (d5 != paramDouble3))) {
double d7 = paramDouble1;
double d8 = paramDouble2;
double d9 = paramDouble3;
paramDouble1 = d3;
paramDouble2 = bm;
paramDouble3 = d5;
OAxisAlignedBB localOAxisAlignedBB2 = aU.b();
aU.b(localOAxisAlignedBB1);
localList = aG.a(this, aU.a(paramDouble1, paramDouble2, paramDouble3));
for (int n = 0; n < localList.size(); n++)
paramDouble2 = ((OAxisAlignedBB) localList.get(n)).b(aU, paramDouble2);
aU.d(0.0D, paramDouble2, 0.0D);
if ((!ba) && (d4 != paramDouble2))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
for (int n = 0; n < localList.size(); n++)
paramDouble1 = ((OAxisAlignedBB) localList.get(n)).a(aU, paramDouble1);
aU.d(paramDouble1, 0.0D, 0.0D);
if ((!ba) && (d3 != paramDouble1))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
for (int n = 0; n < localList.size(); n++)
paramDouble3 = ((OAxisAlignedBB) localList.get(n)).c(aU, paramDouble3);
aU.d(0.0D, 0.0D, paramDouble3);
if ((!ba) && (d5 != paramDouble3))
paramDouble1 = paramDouble2 = paramDouble3 = 0.0D;
if (d7 * d7 + d9 * d9 >= paramDouble1 * paramDouble1 + paramDouble3 * paramDouble3) {
paramDouble1 = d7;
paramDouble2 = d8;
paramDouble3 = d9;
aU.b(localOAxisAlignedBB2);
} else
bl = (float) (bl + 0.5D);
}
aK = ((aU.a + aU.d) / 2.0D);
aL = (aU.b + bc - bl);
aM = ((aU.c + aU.f) / 2.0D);
aW = ((d3 != paramDouble1) || (d5 != paramDouble3));
aX = (d4 != paramDouble2);
aV = ((d4 != paramDouble2) && (d4 < 0.0D));
aY = ((aW) || (aX));
a(paramDouble2, aV);
if (d3 != paramDouble1)
aN = 0.0D;
if (d4 != paramDouble2)
aO = 0.0D;
if (d5 != paramDouble3)
aP = 0.0D;
double d7 = aK - d1;
double d8 = aM - d2;
if ((l()) && (i == 0)) {
bg = (float) (bg + OMathHelper.a(d7 * d7 + d8 * d8) * 0.6D);
int i1 = OMathHelper.b(aK);
int i2 = OMathHelper.b(aL - 0.2000000029802322D - bc);
int m = OMathHelper.b(aM);
int n = aG.a(i1, i2, m);
if ((bg > b) && (n > 0)) {
b += 1;
OStepSound localOStepSound = OBlock.m[n].bu;
if (aG.a(i1, i2 + 1, m) == OBlock.aS.bl) {
localOStepSound = OBlock.aS.bu;
aG.a(this, localOStepSound.c(), localOStepSound.a() * 0.15F, localOStepSound.b());
} else if (!OBlock.m[n].bw.d())
aG.a(this, localOStepSound.c(), localOStepSound.a() * 0.15F, localOStepSound.b());
OBlock.m[n].b(aG, i1, i2, m, this);
}
}
int i1 = OMathHelper.b(aU.a);
int i2 = OMathHelper.b(aU.b);
int m = OMathHelper.b(aU.c);
int n = OMathHelper.b(aU.d);
int i3 = OMathHelper.b(aU.e);
int i4 = OMathHelper.b(aU.f);
if (aG.a(i1, i2, m, n, i3, i4))
for (int i5 = i1; i5 <= n; i5++)
for (int i6 = i2; i6 <= i3; i6++)
for (int i7 = m; i7 <= i4; i7++) {
int i8 = aG.a(i5, i6, i7);
if (i8 > 0)
OBlock.m[i8].a(aG, i5, i6, i7, this);
}
bl *= 0.4F;
boolean bool = g_();
if (aG.c(aU)) {
a(1);
if (!bool) {
bt += 1;
if (bt == 0)
bt = 300;
}
} else if (bt <= 0)
bt = (-bs);
if ((bool) && (bt > 0)) {
aG.a(this, "random.fizz", 0.7F, 1.6F + (bq.nextFloat() - bq.nextFloat()) * 0.4F);
bt = (-bs);
}
}
protected boolean l() {
return true;
}
protected void a(double paramDouble, boolean paramBoolean) {
if (paramBoolean) {
if (bh > 0.0F) {
a(bh);
bh = 0.0F;
}
} else if (paramDouble < 0.0D)
bh = (float) (bh - paramDouble);
}
public OAxisAlignedBB d() {
return null;
}
protected void a(int paramInt) {
if (!by)
if (!(Boolean) manager.callHook(PluginLoader.Hook.DAMAGE, PluginLoader.DamageType.FIRE, null, entity, paramInt))
a((OEntity) null, paramInt);
}
protected void a(float paramFloat) {
}
public boolean g_() {
return aG.a(aU.b(0.0D, -0.4000000059604645D, 0.0D), OMaterial.f, this);
}
public boolean a(OMaterial paramOMaterial) {
double d1 = aL + q();
int i = OMathHelper.b(aK);
int j = OMathHelper.d(OMathHelper.b(d1));
int k = OMathHelper.b(aM);
int m = aG.a(i, j, k);
if ((m != 0) && (OBlock.m[m].bw == paramOMaterial)) {
float f1 = OBlockFluids.c(aG.b(i, j, k)) - 0.1111111F;
float f2 = j + 1 - f1;
return d1 < f2;
}
return false;
}
public float q() {
return 0.0F;
}
public boolean V() {
return aG.a(aU.b(-0.1000000014901161D, -0.4000000059604645D, -0.1000000014901161D), OMaterial.g);
}
public void a(float paramFloat1, float paramFloat2, float paramFloat3) {
float f1 = OMathHelper.c(paramFloat1 * paramFloat1 + paramFloat2 * paramFloat2);
if (f1 < 0.01F)
return;
if (f1 < 1.0F)
f1 = 1.0F;
f1 = paramFloat3 / f1;
paramFloat1 *= f1;
paramFloat2 *= f1;
float f2 = OMathHelper.a(aQ * 3.141593F / 180.0F);
float f3 = OMathHelper.b(aQ * 3.141593F / 180.0F);
aN += paramFloat1 * f3 - paramFloat2 * f2;
aP += paramFloat2 * f3 + paramFloat1 * f2;
}
public float c(float paramFloat) {
int i = OMathHelper.b(aK);
double d1 = (aU.e - aU.b) * 0.66D;
int j = OMathHelper.b(aL - bc + d1);
int k = OMathHelper.b(aM);
if (aG.a(OMathHelper.b(aU.a), OMathHelper.b(aU.b), OMathHelper.b(aU.c), OMathHelper.b(aU.d), OMathHelper.b(aU.e), OMathHelper.b(aU.f)))
return aG.l(i, j, k);
return 0.0F;
}
public void b(double paramDouble1, double paramDouble2, double paramDouble3, float paramFloat1, float paramFloat2) {
aH = (aK = paramDouble1);
aI = (aL = paramDouble2);
aJ = (aM = paramDouble3);
aS = (aQ = paramFloat1);
aT = (aR = paramFloat2);
bl = 0.0F;
double d1 = aS - paramFloat1;
if (d1 < -180.0D)
aS += 360.0F;
if (d1 >= 180.0D)
aS -= 360.0F;
a(aK, aL, aM);
c(paramFloat1, paramFloat2);
}
public void c(double paramDouble1, double paramDouble2, double paramDouble3, float paramFloat1, float paramFloat2) {
bi = (aH = aK = paramDouble1);
bj = (aI = aL = paramDouble2 + bc);
bk = (aJ = aM = paramDouble3);
aQ = paramFloat1;
aR = paramFloat2;
a(aK, aL, aM);
}
public float f(OEntity paramOEntity) {
float f1 = (float) (aK - paramOEntity.aK);
float f2 = (float) (aL - paramOEntity.aL);
float f3 = (float) (aM - paramOEntity.aM);
return OMathHelper.c(f1 * f1 + f2 * f2 + f3 * f3);
}
public double d(double paramDouble1, double paramDouble2, double paramDouble3) {
double d1 = aK - paramDouble1;
double d2 = aL - paramDouble2;
double d3 = aM - paramDouble3;
return d1 * d1 + d2 * d2 + d3 * d3;
}
public double e(double paramDouble1, double paramDouble2, double paramDouble3) {
double d1 = aK - paramDouble1;
double d2 = aL - paramDouble2;
double d3 = aM - paramDouble3;
return OMathHelper.a(d1 * d1 + d2 * d2 + d3 * d3);
}
public double g(OEntity paramOEntity) {
double d1 = aK - paramOEntity.aK;
double d2 = aL - paramOEntity.aL;
double d3 = aM - paramOEntity.aM;
return d1 * d1 + d2 * d2 + d3 * d3;
}
public void b(OEntityPlayer paramOEntityPlayer) {
}
public void h(OEntity paramOEntity) {
if ((paramOEntity.aE == this) || (paramOEntity.aF == this))
return;
double d1 = paramOEntity.aK - aK;
double d2 = paramOEntity.aM - aM;
double d3 = OMathHelper.a(d1, d2);
if (d3 >= 0.009999999776482582D) {
d3 = OMathHelper.a(d3);
d1 /= d3;
d2 /= d3;
double d4 = 1.0D / d3;
if (d4 > 1.0D)
d4 = 1.0D;
d1 *= d4;
d2 *= d4;
d1 *= 0.0500000007450581D;
d2 *= 0.0500000007450581D;
d1 *= (1.0F - bo);
d2 *= (1.0F - bo);
f(-d1, 0.0D, -d2);
paramOEntity.f(d1, 0.0D, d2);
}
}
public void f(double paramDouble1, double paramDouble2, double paramDouble3) {
aN += paramDouble1;
aO += paramDouble2;
aP += paramDouble3;
}
protected void W() {
aZ = true;
}
public boolean a(OEntity paramOEntity, int paramInt) {
W();
return false;
}
public boolean d_() {
return false;
}
public boolean e_() {
return false;
}
public void c(OEntity paramOEntity, int paramInt) {
}
public boolean c(ONBTTagCompound paramONBTTagCompound) {
String str = X();
if ((bb) || (str == null))
return false;
paramONBTTagCompound.a("id", str);
d(paramONBTTagCompound);
return true;
}
public void d(ONBTTagCompound paramONBTTagCompound) {
paramONBTTagCompound.a("Pos", a(new double[] { aK, aL, aM }));
paramONBTTagCompound.a("Motion", a(new double[] { aN, aO, aP }));
paramONBTTagCompound.a("Rotation", a(new float[] { aQ, aR }));
paramONBTTagCompound.a("FallDistance", bh);
paramONBTTagCompound.a("Fire", (short) bt);
paramONBTTagCompound.a("Air", (short) bx);
paramONBTTagCompound.a("OnGround", aV);
a(paramONBTTagCompound);
}
public void e(ONBTTagCompound paramONBTTagCompound) {
ONBTTagList localONBTTagList1 = paramONBTTagCompound.l("Pos");
ONBTTagList localONBTTagList2 = paramONBTTagCompound.l("Motion");
ONBTTagList localONBTTagList3 = paramONBTTagCompound.l("Rotation");
a(0.0D, 0.0D, 0.0D);
aN = ((ONBTTagDouble) localONBTTagList2.a(0)).a;
aO = ((ONBTTagDouble) localONBTTagList2.a(1)).a;
aP = ((ONBTTagDouble) localONBTTagList2.a(2)).a;
if (Math.abs(aN) > 10.0D)
aN = 0.0D;
if (Math.abs(aO) > 10.0D)
aO = 0.0D;
if (Math.abs(aP) > 10.0D)
aP = 0.0D;
aH = (bi = aK = ((ONBTTagDouble) localONBTTagList1.a(0)).a);
aI = (bj = aL = ((ONBTTagDouble) localONBTTagList1.a(1)).a);
aJ = (bk = aM = ((ONBTTagDouble) localONBTTagList1.a(2)).a);
aS = (aQ = ((ONBTTagFloat) localONBTTagList3.a(0)).a % 6.283186F);
aT = (aR = ((ONBTTagFloat) localONBTTagList3.a(1)).a % 6.283186F);
bh = paramONBTTagCompound.g("FallDistance");
bt = paramONBTTagCompound.d("Fire");
bx = paramONBTTagCompound.d("Air");
aV = paramONBTTagCompound.m("OnGround");
a(aK, aL, aM);
b(paramONBTTagCompound);
}
protected final String X() {
return OEntityList.b(this);
}
protected abstract void b(ONBTTagCompound paramONBTTagCompound);
protected abstract void a(ONBTTagCompound paramONBTTagCompound);
protected ONBTTagList a(double[] paramArrayOfDouble) {
ONBTTagList localONBTTagList = new ONBTTagList();
for (double d1 : paramArrayOfDouble)
localONBTTagList.a(new ONBTTagDouble(d1));
return localONBTTagList;
}
protected ONBTTagList a(float[] paramArrayOfFloat) {
ONBTTagList localONBTTagList = new ONBTTagList();
for (float f : paramArrayOfFloat)
localONBTTagList.a(new ONBTTagFloat(f));
return localONBTTagList;
}
public OEntityItem b(int paramInt1, int paramInt2) {
return a(paramInt1, paramInt2, 0.0F);
}
public OEntityItem a(int paramInt1, int paramInt2, float paramFloat) {
return a(new OItemStack(paramInt1, paramInt2, 0), paramFloat);
}
public OEntityItem a(OItemStack paramOItemStack, float paramFloat) {
OEntityItem localOEntityItem = new OEntityItem(aG, aK, aL + paramFloat, aM, paramOItemStack);
localOEntityItem.c = 10;
aG.a(localOEntityItem);
return localOEntityItem;
}
public boolean N() {
return !bb;
}
public boolean E() {
int i = OMathHelper.b(aK);
int j = OMathHelper.b(aL + q());
int k = OMathHelper.b(aM);
return aG.d(i, j, k);
}
public boolean a(OEntityPlayer paramOEntityPlayer) {
return false;
}
public OAxisAlignedBB a_(OEntity paramOEntity) {
return null;
}
public void o_() {
if (aF.bb) {
aF = null;
return;
}
aN = 0.0D;
aO = 0.0D;
aP = 0.0D;
f_();
aF.h_();
e += aF.aQ - aF.aS;
d += aF.aR - aF.aT;
while (e >= 180.0D)
e -= 360.0D;
while (e < -180.0D)
e += 360.0D;
while (d >= 180.0D)
d -= 360.0D;
while (d < -180.0D)
d += 360.0D;
double d1 = e * 0.5D;
double d2 = d * 0.5D;
float f = 10.0F;
if (d1 > f)
d1 = f;
if (d1 < -f)
d1 = -f;
if (d2 > f)
d2 = f;
if (d2 < -f)
d2 = -f;
e -= d1;
d -= d2;
aQ = (float) (aQ + d1);
aR = (float) (aR + d2);
}
public void h_() {
aE.a(aK, aL + k() + aE.C(), aM);
}
public double C() {
return bc;
}
public double k() {
return be * 0.75D;
}
public void b(OEntity paramOEntity) {
d = 0.0D;
e = 0.0D;
if (paramOEntity == null) {
if (aF != null) {
c(aF.aK, aF.aU.b + aF.be, aF.aM, aQ, aR);
aF.aE = null;
}
aF = null;
return;
}
if (aF == paramOEntity) {
aF.aE = null;
aF = null;
c(paramOEntity.aK, paramOEntity.aU.b + paramOEntity.be, paramOEntity.aM, aQ, aR);
return;
}
if (aF != null)
aF.aE = null;
if (paramOEntity.aE != null)
paramOEntity.aE.aF = null;
aF = paramOEntity;
paramOEntity.aE = this;
}
public OVec3D S() {
return null;
}
public void Y() {
}
public OItemStack[] k_() {
return null;
}
public boolean Z() {
return d(1);
}
public void e(boolean paramBoolean) {
a(1, paramBoolean);
}
protected boolean d(int paramInt) {
return (bz.a(0) & 1 << paramInt) != 0;
}
protected void a(int paramInt, boolean paramBoolean) {
int i = bz.a(0);
if (paramBoolean)
bz.b(0, Byte.valueOf((byte) (i | 1 << paramInt)));
else
bz.b(0, Byte.valueOf((byte) (i & (1 << paramInt ^ 0xFFFFFFFF))));
}
}