mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
252 lines
8.5 KiB
Java
252 lines
8.5 KiB
Java
package com.hbm.entity.grenade;
|
|
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.EntityLivingBase;
|
|
import net.minecraft.entity.IProjectile;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.MathHelper;
|
|
import net.minecraft.util.MovingObjectPosition;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
|
|
public abstract class EntityGrenadeBouncyBase extends Entity implements IProjectile {
|
|
|
|
protected EntityLivingBase thrower;
|
|
protected String throwerName;
|
|
protected int timer = 0;
|
|
|
|
public EntityGrenadeBouncyBase(World world) {
|
|
super(world);
|
|
this.setSize(0.25F, 0.25F);
|
|
}
|
|
|
|
public EntityGrenadeBouncyBase(World world, EntityLivingBase living)
|
|
{
|
|
super(world);
|
|
this.thrower = living;
|
|
this.setSize(0.25F, 0.25F);
|
|
this.setLocationAndAngles(living.posX, living.posY + (double)living.getEyeHeight(), living.posZ, living.rotationYaw, living.rotationPitch);
|
|
this.posX -= (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
|
|
this.posY -= 0.10000000149011612D;
|
|
this.posZ -= (double)(MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * 0.16F);
|
|
this.setPosition(this.posX, this.posY, this.posZ);
|
|
this.yOffset = 0.0F;
|
|
float f = 0.4F;
|
|
this.motionX = (double)(-MathHelper.sin(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f);
|
|
this.motionZ = (double)(MathHelper.cos(this.rotationYaw / 180.0F * (float)Math.PI) * MathHelper.cos(this.rotationPitch / 180.0F * (float)Math.PI) * f);
|
|
this.motionY = (double)(-MathHelper.sin((this.rotationPitch + this.func_70183_g()) / 180.0F * (float)Math.PI) * f);
|
|
this.setThrowableHeading(this.motionX, this.motionY, this.motionZ, this.func_70182_d(), 1.0F);
|
|
}
|
|
|
|
public EntityGrenadeBouncyBase(World world, double posX, double posY, double posZ)
|
|
{
|
|
super(world);
|
|
this.setSize(0.25F, 0.25F);
|
|
this.setPosition(posX, posY, posZ);
|
|
this.yOffset = 0.0F;
|
|
}
|
|
|
|
@Override
|
|
protected void entityInit() { }
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public boolean isInRangeToRenderDist(double p_70112_1_)
|
|
{
|
|
double d1 = this.boundingBox.getAverageEdgeLength() * 4.0D;
|
|
d1 *= 64.0D;
|
|
return p_70112_1_ < d1 * d1;
|
|
}
|
|
|
|
protected float func_70182_d()
|
|
{
|
|
return 1.5F;
|
|
}
|
|
|
|
protected float func_70183_g()
|
|
{
|
|
return 0.0F;
|
|
}
|
|
|
|
protected float getGravityVelocity()
|
|
{
|
|
return 0.03F;
|
|
}
|
|
|
|
public void setThrowableHeading(double motionX, double motionY, double motionZ, float f0, float f1)
|
|
{
|
|
float f2 = MathHelper.sqrt_double(motionX * motionX + motionY * motionY + motionZ * motionZ);
|
|
motionX /= (double)f2;
|
|
motionY /= (double)f2;
|
|
motionZ /= (double)f2;
|
|
motionX += this.rand.nextGaussian() * 0.007499999832361937D * (double)f1;
|
|
motionY += this.rand.nextGaussian() * 0.007499999832361937D * (double)f1;
|
|
motionZ += this.rand.nextGaussian() * 0.007499999832361937D * (double)f1;
|
|
motionX *= (double)f0;
|
|
motionY *= (double)f0;
|
|
motionZ *= (double)f0;
|
|
this.motionX = motionX;
|
|
this.motionY = motionY;
|
|
this.motionZ = motionZ;
|
|
float f3 = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ);
|
|
this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(motionX, motionZ) * 180.0D / Math.PI);
|
|
this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(motionY, (double)f3) * 180.0D / Math.PI);
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public void setVelocity(double motionX, double motionY, double motionZ)
|
|
{
|
|
this.motionX = motionX;
|
|
this.motionY = motionY;
|
|
this.motionZ = motionZ;
|
|
|
|
if (this.prevRotationPitch == 0.0F && this.prevRotationYaw == 0.0F)
|
|
{
|
|
float f = MathHelper.sqrt_double(motionX * motionX + motionZ * motionZ);
|
|
this.prevRotationYaw = this.rotationYaw = (float)(Math.atan2(motionX, motionZ) * 180.0D / Math.PI);
|
|
this.prevRotationPitch = this.rotationPitch = (float)(Math.atan2(motionY, (double)f) * 180.0D / Math.PI);
|
|
}
|
|
}
|
|
|
|
public void onUpdate()
|
|
{
|
|
this.lastTickPosX = this.posX;
|
|
this.lastTickPosY = this.posY;
|
|
this.lastTickPosZ = this.posZ;
|
|
super.onUpdate();
|
|
|
|
//Bounce here
|
|
|
|
boolean bounce = false;
|
|
Vec3 vec3 = Vec3.createVectorHelper(this.posX, this.posY, this.posZ);
|
|
Vec3 vec31 = Vec3.createVectorHelper(this.posX + this.motionX, this.posY + this.motionY, this.posZ + this.motionZ);
|
|
MovingObjectPosition movingobjectposition = this.worldObj.rayTraceBlocks(vec3, vec31);
|
|
|
|
if (movingobjectposition != null)
|
|
{
|
|
vec31 = Vec3.createVectorHelper(movingobjectposition.hitVec.xCoord, movingobjectposition.hitVec.yCoord, movingobjectposition.hitVec.zCoord);
|
|
|
|
this.posX += (movingobjectposition.hitVec.xCoord - this.posX) * 0.6;
|
|
this.posY += (movingobjectposition.hitVec.yCoord - this.posY) * 0.6;
|
|
this.posZ += (movingobjectposition.hitVec.zCoord - this.posZ) * 0.6;
|
|
|
|
switch(movingobjectposition.sideHit) {
|
|
case 0:
|
|
case 1:
|
|
motionY *= -1; break;
|
|
case 2:
|
|
case 3:
|
|
motionZ *= -1; break;
|
|
case 4:
|
|
case 5:
|
|
motionX *= -1; break;
|
|
|
|
}
|
|
|
|
bounce = true;
|
|
|
|
Vec3 mot = Vec3.createVectorHelper(motionX, motionY, motionZ);
|
|
|
|
if(mot.lengthVector() > 0.05)
|
|
worldObj.playSoundAtEntity(this, "hbm:weapon.gBounce", 2.0F, 1.0F);
|
|
|
|
motionX *= getBounceMod();
|
|
motionY *= getBounceMod();
|
|
motionZ *= getBounceMod();
|
|
}
|
|
|
|
//Bounce here [END]
|
|
|
|
if(!bounce) {
|
|
this.posX += this.motionX;
|
|
this.posY += this.motionY;
|
|
this.posZ += this.motionZ;
|
|
}
|
|
|
|
float f1 = MathHelper.sqrt_double(this.motionX * this.motionX + this.motionZ * this.motionZ);
|
|
this.rotationYaw = (float)(Math.atan2(this.motionX, this.motionZ) * 180.0D / Math.PI);
|
|
|
|
for (this.rotationPitch = (float)(Math.atan2(this.motionY, (double)f1) * 180.0D / Math.PI); this.rotationPitch - this.prevRotationPitch < -180.0F; this.prevRotationPitch -= 360.0F)
|
|
{
|
|
;
|
|
}
|
|
|
|
while (this.rotationPitch - this.prevRotationPitch >= 180.0F)
|
|
{
|
|
this.prevRotationPitch += 360.0F;
|
|
}
|
|
|
|
while (this.rotationYaw - this.prevRotationYaw < -180.0F)
|
|
{
|
|
this.prevRotationYaw -= 360.0F;
|
|
}
|
|
|
|
while (this.rotationYaw - this.prevRotationYaw >= 180.0F)
|
|
{
|
|
this.prevRotationYaw += 360.0F;
|
|
}
|
|
|
|
this.rotationPitch = this.prevRotationPitch + (this.rotationPitch - this.prevRotationPitch) * 0.2F;
|
|
this.rotationYaw = this.prevRotationYaw + (this.rotationYaw - this.prevRotationYaw) * 0.2F;
|
|
float f2 = 0.99F;
|
|
float f3 = this.getGravityVelocity();
|
|
|
|
if (this.isInWater())
|
|
{
|
|
for (int i = 0; i < 4; ++i)
|
|
{
|
|
float f4 = 0.25F;
|
|
this.worldObj.spawnParticle("bubble", this.posX - this.motionX * (double)f4, this.posY - this.motionY * (double)f4, this.posZ - this.motionZ * (double)f4, this.motionX, this.motionY, this.motionZ);
|
|
}
|
|
|
|
f2 = 0.8F;
|
|
}
|
|
|
|
this.motionX *= (double)f2;
|
|
this.motionY *= (double)f2;
|
|
this.motionZ *= (double)f2;
|
|
this.motionY -= (double)f3;
|
|
this.setPosition(this.posX, this.posY, this.posZ);
|
|
|
|
timer++;
|
|
|
|
if(timer >= getMaxTimer()) {
|
|
explode();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
protected void readEntityFromNBT(NBTTagCompound nbt) {
|
|
timer = nbt.getInteger("timer");
|
|
}
|
|
|
|
@Override
|
|
protected void writeEntityToNBT(NBTTagCompound nbt) {
|
|
nbt.setInteger("timer", timer);
|
|
}
|
|
|
|
@SideOnly(Side.CLIENT)
|
|
public float getShadowSize()
|
|
{
|
|
return 0.0F;
|
|
}
|
|
|
|
public EntityLivingBase getThrower()
|
|
{
|
|
if (this.thrower == null && this.throwerName != null && this.throwerName.length() > 0)
|
|
{
|
|
this.thrower = this.worldObj.getPlayerEntityByName(this.throwerName);
|
|
}
|
|
|
|
return this.thrower;
|
|
}
|
|
|
|
public abstract void explode();
|
|
|
|
protected abstract int getMaxTimer();
|
|
|
|
protected abstract double getBounceMod();
|
|
|
|
}
|