blob: 6339d20ecdd330fbb7244fff503e3ff56831c6e2 [file] [log] [blame] [raw]
package com.legacy.aether.entities.passive;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.EntityFlying;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.DamageSource;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
import com.legacy.aether.entities.projectile.crystals.EntityCrystal;
import com.legacy.aether.entities.projectile.crystals.EnumCrystalType;
import cpw.mods.fml.common.registry.IEntityAdditionalSpawnData;
public class EntityMiniCloud extends EntityFlying implements IEntityAdditionalSpawnData {
public EntityPlayer owner;
public int shotTimer, lifeSpan;
public boolean direction;
public double targetX, targetY, targetZ;
public EntityMiniCloud(World worldObj) {
super(worldObj);
this.noClip = true;
this.lifeSpan = 3600;
this.entityCollisionReduction = 1.75F;
this.setSize(0.5F, 0.45F);
}
public EntityMiniCloud(World worldObj, EntityPlayer owner, int direction) {
this(worldObj);
this.owner = owner;
this.direction = direction == 0;
this.rotationYaw = this.owner.rotationYaw;
this.rotationPitch = this.owner.rotationPitch;
this.getTargetPos();
this.setPosition(this.targetX, this.targetY, this.targetZ);
}
public boolean isInRangeToRenderDist(double var1) {
return true;
}
public void getTargetPos() {
if (this.getDistanceToEntity(this.owner) > 2.0F) {
this.targetX = this.owner.posX;
this.targetY = this.owner.posY + 1.10000000149011612D;
this.targetZ = this.owner.posZ;
} else {
double var1 = (double) this.owner.rotationYaw;
if (this.direction) {
var1 -= 90.0D;
} else {
var1 += 90.0D;
}
var1 /= -(180D / Math.PI);
this.targetX = this.owner.posX + Math.sin(var1) * 1.05D;
this.targetY = this.owner.posY + 1.10000000149011612D;
this.targetZ = this.owner.posZ + Math.cos(var1) * 1.05D;
}
}
public boolean atShoulder() {
double var1 = this.posX - this.targetX;
double var3 = this.posY - this.targetY;
double var5 = this.posZ - this.targetZ;
return Math.sqrt(var1 * var1 + var3 * var3 + var5 * var5) < 0.3D;
}
public void approachTarget() {
double var1 = this.targetX - this.posX;
double var3 = this.targetY - this.posY;
double var5 = this.targetZ - this.posZ;
double var7 = Math.sqrt(var1 * var1 + var3 * var3 + var5 * var5) * 3.25D;
this.motionX = (this.motionX + var1 / var7) / 2.0D;
this.motionY = (this.motionY + var3 / var7) / 2.0D;
this.motionZ = (this.motionZ + var5 / var7) / 2.0D;
Math.atan2(var1, var5);
}
public void writeEntityToNBT(NBTTagCompound var1) {
super.writeEntityToNBT(var1);
var1.setShort("LifeSpan", (short) this.lifeSpan);
var1.setShort("ShotTimer", (short) this.shotTimer);
var1.setBoolean("direction", this.direction);
}
public void readEntityFromNBT(NBTTagCompound var1) {
super.readEntityFromNBT(var1);
this.lifeSpan = var1.getShort("LifeSpan");
this.shotTimer = var1.getShort("ShotTimer");
this.direction = var1.getBoolean("direction");
}
@Override
public void onEntityUpdate() {
super.onEntityUpdate();
--this.lifeSpan;
if (this.lifeSpan <= 0) {
this.spawnExplosionParticle();
this.isDead = true;
} else {
if (this.owner == null && !this.worldObj.isRemote) {
this.setDead();
return;
}
if (this.shotTimer > 0) {
--this.shotTimer;
}
if (!this.owner.isDead) {
if (this.worldObj.isRemote) {
return;
}
this.getTargetPos();
if (this.atShoulder()) {
this.motionX *= 0.65D;
this.motionY *= 0.65D;
this.motionZ *= 0.65D;
this.rotationYaw = this.owner.rotationYaw + (this.direction ? 1.0F : -1F);
this.rotationPitch = this.owner.rotationPitch;
this.rotationYawHead = this.owner.rotationYawHead;
if (this.shotTimer <= 0 && this.owner.swingProgress > 0.0F) {
float var7 = this.rotationYaw - (this.direction ? 1.0F : -1.0F);
double var1 = this.posX + Math.sin((double) var7 / -(180D / Math.PI)) * 1.6D;
double var3 = this.posY - -1.0D;
double var5 = this.posZ + Math.cos((double) var7 / -(180D / Math.PI)) * 1.6D;
EntityCrystal crystal = new EntityCrystal(this.worldObj, var1, var3, var5, EnumCrystalType.CLOUD);
Vec3 var9 = this.getLookVec();
if (var9 != null) {
crystal.smotionX = var9.xCoord * 1.5D;
crystal.smotionY = var9.yCoord * 1.5D;
crystal.smotionZ = var9.zCoord * 1.5D;
}
crystal.wasHit = true;
if (!this.worldObj.isRemote) {
this.worldObj.spawnEntityInWorld(crystal);
}
this.worldObj.playSoundEffect(this.posX, this.posY, this.posZ, "aether_legacy:aemob.zephyr.shoot", 0.75F, (this.rand.nextFloat() - this.rand.nextFloat()) * 0.2F + 1.0F);
this.shotTimer = 40;
}
} else {
this.approachTarget();
}
} else {
this.spawnExplosionParticle();
this.isDead = true;
}
}
}
@Override
public boolean attackEntityFrom(DamageSource var1, float var2) {
if (var1.getEntity() == this.owner || var1.getDamageType() == "inWall") {
return false;
}
return super.attackEntityFrom(var1, var2);
}
@Override
public void writeSpawnData(ByteBuf buffer) {
buffer.writeBoolean(this.direction);
buffer.writeInt(this.owner.getEntityId());
}
@Override
public void readSpawnData(ByteBuf buffer) {
this.direction = buffer.readBoolean();
this.owner = (EntityPlayer) this.worldObj.getEntityByID(buffer.readInt());
}
}