210 lines
5.9 KiB
Java

package com.hbm.entity.mob;
import java.util.List;
import com.hbm.handler.radiation.ChunkRadiationManager;
import com.hbm.items.ModItems;
import com.hbm.lib.ModDamageSource;
import com.hbm.main.MainRegistry;
import api.hbm.entity.IRadiationImmune;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.entity.Entity;
import net.minecraft.entity.SharedMonsterAttributes;
import net.minecraft.entity.monster.EntityMob;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.util.DamageSource;
import net.minecraft.world.World;
public class EntityRADBeast extends EntityMob implements IRadiationImmune {
private float heightOffset = 0.5F;
private int heightOffsetUpdateTime;
public EntityRADBeast(World world) {
super(world);
this.isImmuneToFire = true;
this.experienceValue = 30;
}
protected void applyEntityAttributes() {
super.applyEntityAttributes();
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(120.0D);
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(16.0D);
}
public EntityRADBeast makeLeader() {
this.setEquipmentDropChance(0, 1F);
this.setCurrentItemOrArmor(0, new ItemStack(ModItems.coin_radiation));
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(360.0D);
this.heal(this.getMaxHealth());
return this;
}
protected boolean canDespawn() {
return false;
}
protected void entityInit() {
super.entityInit();
this.dataWatcher.addObject(16, (int) 0);
}
protected String getLivingSound() {
return "hbm:item.geiger" + (1 + rand.nextInt(6));
}
protected String getHurtSound() {
return "mob.blaze.hit";
}
protected String getDeathSound() {
return "hbm:step.iron";
}
@SideOnly(Side.CLIENT)
public int getBrightnessForRender(float f) {
return 15728880;
}
public float getBrightness(float f) {
return 1.0F;
}
public int getTotalArmorValue() {
return 8;
}
public void onLivingUpdate() {
if(!this.worldObj.isRemote) {
if(this.isWet()) {
this.attackEntityFrom(DamageSource.drown, 1.0F);
}
--this.heightOffsetUpdateTime;
if(this.heightOffsetUpdateTime <= 0) {
this.heightOffsetUpdateTime = 100;
this.heightOffset = 0.5F + (float) this.rand.nextGaussian() * 3.0F;
}
if(this.getEntityToAttack() != null && this.getEntityToAttack().posY + (double) this.getEntityToAttack().getEyeHeight() > this.posY + (double) this.getEyeHeight() + (double) this.heightOffset) {
this.motionY += (0.30000001192092896D - this.motionY) * 0.30000001192092896D;
}
if(this.entityToAttack != null && attackTime < 10) {
if(this.dataWatcher.getWatchableObjectInt(16) != entityToAttack.getEntityId())
this.dataWatcher.updateObject(16, entityToAttack.getEntityId());
} else {
this.dataWatcher.updateObject(16, 0);
}
}
if(!this.onGround && this.motionY < 0.0D) {
this.motionY *= 0.6D;
}
if(this.getMaxHealth() <= 150) {
for(int i = 0; i < 6; i++) {
this.worldObj.spawnParticle("townaura", this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width * 1.5, this.posY + this.rand.nextDouble() * (double) this.height, this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width * 1.5, 0.0D, 0.0D, 0.0D);
}
if(this.rand.nextInt(6) == 0) {
this.worldObj.spawnParticle("flame", this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width, this.posY + this.rand.nextDouble() * (double) this.height * 0.75, this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width, 0.0D, 0.0D, 0.0D);
}
} else {
this.worldObj.spawnParticle("lava", this.posX + (this.rand.nextDouble() - 0.5D) * (double) this.width, this.posY + this.rand.nextDouble() * (double) this.height * 0.75, this.posZ + (this.rand.nextDouble() - 0.5D) * (double) this.width, 0.0D, 0.0D, 0.0D);
}
super.onLivingUpdate();
}
protected void attackEntity(Entity target, float dist) {
if(this.attackTime <= 0 && dist < 2.0F && target.boundingBox.maxY > this.boundingBox.minY && target.boundingBox.minY < this.boundingBox.maxY) {
this.attackTime = 20;
this.attackEntityAsMob(target);
} else if(dist < 30.0F) {
double deltaX = target.posX - this.posX;
double deltaZ = target.posZ - this.posZ;
if(this.attackTime == 0 && getEntityToAttack() != null) {
ChunkRadiationManager.proxy.incrementRad(worldObj, (int) Math.floor(posX), (int) Math.floor(posY), (int) Math.floor(posZ), 100);
target.attackEntityFrom(ModDamageSource.radiation, 16.0F);
this.swingItem();
this.playLivingSound();
this.attackTime = 20;
}
this.rotationYaw = (float) (Math.atan2(deltaZ, deltaX) * 180.0D / Math.PI) - 90.0F;
this.hasAttacked = true;
}
}
public Entity getUnfortunateSoul() {
int id = this.dataWatcher.getWatchableObjectInt(16);
return worldObj.getEntityByID(id);
}
protected void fall(float p_70069_1_) {
}
protected Item getDropItem() {
return ModItems.rod_uranium_fuel_depleted;
}
@Override
public void onDeath(DamageSource p_70645_1_) {
super.onDeath(p_70645_1_);
if(this.getMaxHealth() > 150) {
List<EntityPlayer> players = worldObj.getEntitiesWithinAABB(EntityPlayer.class, this.boundingBox.expand(50, 50, 50));
for(EntityPlayer player : players) {
player.triggerAchievement(MainRegistry.bossMeltdown);
}
}
}
protected void dropFewItems(boolean beenHit, int looting) {
if(beenHit) {
if(looting > 0) {
this.dropItem(ModItems.nugget_polonium, looting);
}
int count = this.rand.nextInt(3) + 1;
for(int i = 0; i < count; i++) {
int r = this.rand.nextInt(3);
if(r == 0) {
this.dropItem(this.isWet() ? ModItems.waste_uranium : ModItems.rod_uranium_fuel_depleted, 1);
} else if(r == 1) {
this.dropItem(this.isWet() ? ModItems.waste_mox : ModItems.rod_mox_fuel_depleted, 1);
} else if(r == 2) {
this.dropItem(this.isWet() ? ModItems.waste_plutonium : ModItems.rod_plutonium_fuel_depleted, 1);
}
}
}
}
}