generated from tilera/1710mod
287 lines
9.7 KiB
Java
287 lines
9.7 KiB
Java
package icbm.zhapin.zhapin;
|
|
|
|
import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
|
|
import icbm.api.explosion.IExplosive;
|
|
import icbm.api.explosion.IExplosiveContainer;
|
|
import icbm.zhapin.ICBMExplosion;
|
|
import io.netty.buffer.ByteBuf;
|
|
import net.minecraft.block.material.Material;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.item.EntityItem;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.world.World;
|
|
import universalelectricity.core.vector.Vector3;
|
|
|
|
public class EGrenade
|
|
extends Entity implements IExplosiveContainer, IEntityAdditionalSpawnData {
|
|
protected EntityLivingBase thrower;
|
|
public int haoMa;
|
|
|
|
public EGrenade(final World par1World) {
|
|
super(par1World);
|
|
this.setSize(0.3f, 0.3f);
|
|
super.renderDistanceWeight = 10.0;
|
|
}
|
|
|
|
public EGrenade(
|
|
final World par1World, final Vector3 position, final int explosiveID
|
|
) {
|
|
this(par1World);
|
|
this.setPosition(position.x, position.y, position.z);
|
|
this.haoMa = explosiveID;
|
|
}
|
|
|
|
public EGrenade(
|
|
final World par1World,
|
|
final EntityLivingBase par2EntityLiving,
|
|
final int explosiveID,
|
|
final float nengLiang
|
|
) {
|
|
this(par1World);
|
|
this.thrower = par2EntityLiving;
|
|
this.setSize(0.25f, 0.25f);
|
|
this.setLocationAndAngles(
|
|
((Entity) par2EntityLiving).posX,
|
|
((Entity) par2EntityLiving).posY + par2EntityLiving.getEyeHeight(),
|
|
((Entity) par2EntityLiving).posZ,
|
|
((Entity) par2EntityLiving).rotationYaw,
|
|
((Entity) par2EntityLiving).rotationPitch
|
|
);
|
|
super.posX -= MathHelper.cos(super.rotationYaw / 180.0f * 3.1415927f) * 0.16f;
|
|
super.posY -= 0.10000000149011612;
|
|
super.posZ -= MathHelper.sin(super.rotationYaw / 180.0f * 3.1415927f) * 0.16f;
|
|
this.setPosition(super.posX, super.posY, super.posZ);
|
|
super.yOffset = 0.0f;
|
|
final float var3 = 0.4f;
|
|
super.motionX = -MathHelper.sin(super.rotationYaw / 180.0f * 3.1415927f)
|
|
* MathHelper.cos(super.rotationPitch / 180.0f * 3.1415927f) * var3;
|
|
super.motionZ = MathHelper.cos(super.rotationYaw / 180.0f * 3.1415927f)
|
|
* MathHelper.cos(super.rotationPitch / 180.0f * 3.1415927f) * var3;
|
|
super.motionY = -MathHelper.sin(super.rotationPitch / 180.0f * 3.1415927f) * var3;
|
|
this.setThrowableHeading(
|
|
super.motionX, super.motionY, super.motionZ, 1.8f * nengLiang, 1.0f
|
|
);
|
|
this.haoMa = explosiveID;
|
|
}
|
|
|
|
@Override
|
|
public String getCommandSenderName() {
|
|
return "Grenade";
|
|
}
|
|
|
|
@Override
|
|
public void writeSpawnData(final ByteBuf data) {
|
|
data.writeInt(this.haoMa);
|
|
}
|
|
|
|
@Override
|
|
public void readSpawnData(final ByteBuf data) {
|
|
this.haoMa = data.readInt();
|
|
}
|
|
|
|
public void setThrowableHeading(
|
|
double par1, double par3, double par5, final float par7, final float par8
|
|
) {
|
|
final float var9
|
|
= MathHelper.sqrt_double(par1 * par1 + par3 * par3 + par5 * par5);
|
|
par1 /= var9;
|
|
par3 /= var9;
|
|
par5 /= var9;
|
|
par1 += super.rand.nextGaussian() * 0.007499999832361937 * par8;
|
|
par3 += super.rand.nextGaussian() * 0.007499999832361937 * par8;
|
|
par5 += super.rand.nextGaussian() * 0.007499999832361937 * par8;
|
|
par1 *= par7;
|
|
par3 *= par7;
|
|
par5 *= par7;
|
|
super.motionX = par1;
|
|
super.motionY = par3;
|
|
super.motionZ = par5;
|
|
final float var10 = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
|
|
final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793);
|
|
super.rotationYaw = n;
|
|
super.prevRotationYaw = n;
|
|
final float n2 = (float) (Math.atan2(par3, var10) * 180.0 / 3.141592653589793);
|
|
super.rotationPitch = n2;
|
|
super.prevRotationPitch = n2;
|
|
}
|
|
|
|
@Override
|
|
public void setVelocity(final double par1, final double par3, final double par5) {
|
|
super.motionX = par1;
|
|
super.motionY = par3;
|
|
super.motionZ = par5;
|
|
|
|
if (super.prevRotationPitch == 0.0f && super.prevRotationYaw == 0.0f) {
|
|
final float var7 = MathHelper.sqrt_double(par1 * par1 + par5 * par5);
|
|
final float n = (float) (Math.atan2(par1, par5) * 180.0 / 3.141592653589793);
|
|
super.rotationYaw = n;
|
|
super.prevRotationYaw = n;
|
|
final float n2 = (float) (Math.atan2(par3, var7) * 180.0 / 3.141592653589793);
|
|
super.rotationPitch = n2;
|
|
super.prevRotationPitch = n2;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected boolean canTriggerWalking() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
protected void entityInit() {}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
if (!super.worldObj.isRemote
|
|
&& ICBMExplosion.shiBaoHu(
|
|
super.worldObj,
|
|
new Vector3(this),
|
|
ZhaPin.ZhaPinType.SHOU_LIU_DAN,
|
|
this.haoMa
|
|
)) {
|
|
final float var6 = 0.7f;
|
|
final double var7
|
|
= super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5;
|
|
final double var8
|
|
= super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5;
|
|
final double var9
|
|
= super.worldObj.rand.nextFloat() * var6 + (1.0f - var6) * 0.5;
|
|
final EntityItem var10 = new EntityItem(
|
|
super.worldObj,
|
|
super.posX + var7,
|
|
super.posY + var8,
|
|
super.posZ + var9,
|
|
new ItemStack(ICBMExplosion.itShouLiuDan, this.haoMa, 1)
|
|
);
|
|
var10.delayBeforeCanPickup = 10;
|
|
super.worldObj.spawnEntityInWorld((Entity) var10);
|
|
this.setDead();
|
|
return;
|
|
}
|
|
|
|
super.lastTickPosX = super.posX;
|
|
super.lastTickPosY = super.posY;
|
|
super.lastTickPosZ = super.posZ;
|
|
super.onUpdate();
|
|
this.moveEntity(super.motionX, super.motionY, super.motionZ);
|
|
final float var11 = MathHelper.sqrt_double(
|
|
super.motionX * super.motionX + super.motionZ * super.motionZ
|
|
);
|
|
super.rotationYaw = (float
|
|
) (Math.atan2(super.motionX, super.motionZ) * 180.0 / 3.141592653589793);
|
|
super.rotationPitch
|
|
= (float) (Math.atan2(super.motionY, var11) * 180.0 / 3.141592653589793);
|
|
|
|
while (super.rotationPitch - super.prevRotationPitch < -180.0f) {
|
|
super.prevRotationPitch -= 360.0f;
|
|
}
|
|
|
|
while (super.rotationPitch - super.prevRotationPitch >= 180.0f) {
|
|
super.prevRotationPitch += 360.0f;
|
|
}
|
|
|
|
while (super.rotationYaw - super.prevRotationYaw < -180.0f) {
|
|
super.prevRotationYaw -= 360.0f;
|
|
}
|
|
|
|
while (super.rotationYaw - super.prevRotationYaw >= 180.0f) {
|
|
super.prevRotationYaw += 360.0f;
|
|
}
|
|
|
|
super.rotationPitch = super.prevRotationPitch
|
|
+ (super.rotationPitch - super.prevRotationPitch) * 0.2f;
|
|
super.rotationYaw
|
|
= super.prevRotationYaw + (super.rotationYaw - super.prevRotationYaw) * 0.2f;
|
|
float var12 = 0.98f;
|
|
final float gravity = 0.03f;
|
|
|
|
if (this.isInWater()) {
|
|
for (int var13 = 0; var13 < 4; ++var13) {
|
|
final float var14 = 0.25f;
|
|
super.worldObj.spawnParticle(
|
|
"bubble",
|
|
super.posX - super.motionX * var14,
|
|
super.posY - super.motionY * var14,
|
|
super.posZ - super.motionZ * var14,
|
|
super.motionX,
|
|
super.motionY,
|
|
super.motionZ
|
|
);
|
|
}
|
|
|
|
var12 = 0.8f;
|
|
}
|
|
|
|
super.motionX *= var12;
|
|
super.motionY *= var12;
|
|
super.motionZ *= var12;
|
|
|
|
if (super.onGround) {
|
|
super.motionX *= 0.5;
|
|
super.motionZ *= 0.5;
|
|
super.motionY *= 0.5;
|
|
} else {
|
|
super.motionY -= gravity;
|
|
this.func_145771_j(
|
|
super.posX,
|
|
(super.boundingBox.minY + super.boundingBox.maxY) / 2.0,
|
|
super.posZ
|
|
);
|
|
}
|
|
|
|
if (super.ticksExisted > Math.max(60, ZhaPin.list[this.haoMa].getYinXin())) {
|
|
super.worldObj.spawnParticle(
|
|
"hugeexplosion", super.posX, super.posY, super.posZ, 0.0, 0.0, 0.0
|
|
);
|
|
ZhaPin.createExplosion(
|
|
super.worldObj,
|
|
new Vector3(super.posX, super.posY, super.posZ),
|
|
this,
|
|
this.haoMa
|
|
);
|
|
this.setDead();
|
|
} else {
|
|
ZhaPin.list[this.haoMa].onYinZha(
|
|
super.worldObj,
|
|
new Vector3(super.posX, super.posY + 0.5, super.posZ),
|
|
super.ticksExisted
|
|
);
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public boolean handleWaterMovement() {
|
|
return super.worldObj.handleMaterialAcceleration(
|
|
super.boundingBox, Material.water, (Entity) this
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public boolean canBeCollidedWith() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean canBePushed() {
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
protected void readEntityFromNBT(final NBTTagCompound par1NBTTagCompound) {
|
|
this.haoMa = par1NBTTagCompound.getInteger("haoMa");
|
|
}
|
|
|
|
@Override
|
|
protected void writeEntityToNBT(final NBTTagCompound par1NBTTagCompound) {
|
|
par1NBTTagCompound.setInteger("haoMa", this.haoMa);
|
|
}
|
|
|
|
@Override
|
|
public IExplosive getExplosiveType() {
|
|
return ZhaPin.list[this.haoMa];
|
|
}
|
|
}
|