mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
178 lines
5.2 KiB
Java
178 lines
5.2 KiB
Java
package com.hbm.entity.mob;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.entity.logic.EntityWaypoint;
|
|
import com.hbm.explosion.vanillant.ExplosionVNT;
|
|
import com.hbm.explosion.vanillant.standard.BlockAllocatorStandard;
|
|
import com.hbm.explosion.vanillant.standard.BlockMutatorDebris;
|
|
import com.hbm.explosion.vanillant.standard.BlockProcessorStandard;
|
|
import com.hbm.explosion.vanillant.standard.EntityProcessorStandard;
|
|
import com.hbm.explosion.vanillant.standard.PlayerProcessorStandard;
|
|
import com.hbm.main.MainRegistry;
|
|
import com.hbm.main.ResourceManager;
|
|
import com.hbm.packet.AuxParticlePacketNT;
|
|
import com.hbm.packet.PacketDispatcher;
|
|
|
|
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.SharedMonsterAttributes;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.potion.Potion;
|
|
import net.minecraft.potion.PotionEffect;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.ResourceLocation;
|
|
import net.minecraft.world.World;
|
|
|
|
import javax.annotation.Nullable;
|
|
import java.util.List;
|
|
|
|
public class EntityGlyphidNuclear extends EntityGlyphid {
|
|
|
|
public int deathTicks;
|
|
public EntityGlyphidNuclear(World world) {
|
|
super(world);
|
|
this.setSize(2.5F, 1.75F);
|
|
this.isImmuneToFire = true;
|
|
}
|
|
|
|
@Override
|
|
public ResourceLocation getSkin() {
|
|
return ResourceManager.glyphid_nuclear_tex;
|
|
}
|
|
|
|
@Override
|
|
public double getScale() {
|
|
return 2D;
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
super.onUpdate();
|
|
if(ticksExisted % 20 == 0) {
|
|
if(isAtDestination() && getCurrentTask() == TASK_FOLLOW) {
|
|
setCurrentTask(TASK_IDLE, null);
|
|
}
|
|
|
|
if(getCurrentTask() == TASK_BUILD_HIVE && getAITarget() == null) {
|
|
this.addPotionEffect(new PotionEffect(Potion.moveSpeed.id, 10 * 20, 3));
|
|
}
|
|
|
|
if(getCurrentTask() == TASK_TERRAFORM) {
|
|
this.setHealth(0);
|
|
}
|
|
}
|
|
}
|
|
|
|
/** Communicates only with glyphid scouts, unlike the super implementation which does the opposite */
|
|
@Override
|
|
public void communicate(int task, @Nullable EntityWaypoint waypoint) {
|
|
int radius = waypoint != null ? waypoint.radius : 4;
|
|
|
|
AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(
|
|
this.posX - radius,
|
|
this.posY - radius,
|
|
this.posZ - radius,
|
|
this.posX + radius,
|
|
this.posY + radius,
|
|
this.posZ + radius);
|
|
|
|
List<Entity> bugs = worldObj.getEntitiesWithinAABBExcludingEntity(this, bb);
|
|
for (Entity e: bugs){
|
|
if(e instanceof EntityGlyphidScout){
|
|
if(((EntityGlyphid) e).getCurrentTask() != task){
|
|
((EntityGlyphid) e).setCurrentTask(task, waypoint);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
protected void applyEntityAttributes() {
|
|
super.applyEntityAttributes();
|
|
this.getEntityAttribute(SharedMonsterAttributes.maxHealth).setBaseValue(100D);
|
|
this.getEntityAttribute(SharedMonsterAttributes.movementSpeed).setBaseValue(0.8D);
|
|
this.getEntityAttribute(SharedMonsterAttributes.attackDamage).setBaseValue(50D);
|
|
}
|
|
|
|
@Override
|
|
public boolean isArmorBroken(float amount) {
|
|
return this.rand.nextInt(100) <= Math.min(Math.pow(amount * 0.12, 2), 100);
|
|
}
|
|
|
|
@Override
|
|
public float calculateDamage(float amount) {
|
|
|
|
byte armor = this.dataWatcher.getWatchableObjectByte(17);
|
|
int divisor = 1;
|
|
|
|
for(int i = 0; i < 5; i++) {
|
|
if((armor & (1 << i)) > 0) {
|
|
divisor += 5;
|
|
}
|
|
}
|
|
|
|
amount /= divisor;
|
|
|
|
return amount;
|
|
}
|
|
|
|
@Override
|
|
public float getDamageThreshold() {
|
|
return 10F;
|
|
}
|
|
|
|
public boolean hasWaypoint = false;
|
|
@Override
|
|
protected void onDeathUpdate() {
|
|
++this.deathTicks;
|
|
|
|
if(!hasWaypoint) {
|
|
// effectively causes neighboring EntityGlyphidScout to retreat
|
|
communicate(TASK_INITIATE_RETREAT, null);
|
|
hasWaypoint = true;
|
|
}
|
|
|
|
if(deathTicks == 90){
|
|
int radius = 8;
|
|
AxisAlignedBB bb = AxisAlignedBB.getBoundingBox(this.posX, this.posY, this.posZ, this.posX, this.posY, this.posZ).expand(radius, radius, radius);
|
|
|
|
List<Entity> bugs = worldObj.getEntitiesWithinAABBExcludingEntity(this, bb);
|
|
for (Entity e: bugs){
|
|
if(e instanceof EntityGlyphid){
|
|
addPotionEffect(new PotionEffect(Potion.field_76434_w.id, 20, 6));
|
|
addPotionEffect(new PotionEffect(Potion.fireResistance.id, 15 * 20, 1));
|
|
}
|
|
}
|
|
}
|
|
if(this.deathTicks == 100) {
|
|
|
|
if(!worldObj.isRemote) {
|
|
|
|
ExplosionVNT vnt = new ExplosionVNT(worldObj, posX, posY, posZ, 25, this);
|
|
vnt.setBlockAllocator(new BlockAllocatorStandard(24));
|
|
vnt.setBlockProcessor(new BlockProcessorStandard().withBlockEffect(new BlockMutatorDebris(ModBlocks.volcanic_lava_block, 0)).setNoDrop());
|
|
vnt.setEntityProcessor(new EntityProcessorStandard());
|
|
vnt.setPlayerProcessor(new PlayerProcessorStandard());
|
|
vnt.explode();
|
|
|
|
worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.mukeExplosion", 15.0F, 1.0F);
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setString("type", "muke");
|
|
// if the FX type is "muke", apply random BF effect
|
|
if(MainRegistry.polaroidID == 11 || rand.nextInt(100) == 0) {
|
|
data.setBoolean("balefire", true);
|
|
}
|
|
PacketDispatcher.wrapper.sendToAllAround(new AuxParticlePacketNT(data, posX, posY + 0.5, posZ), new TargetPoint(dimension, posX, posY, posZ, 250));
|
|
}
|
|
|
|
this.setDead();
|
|
} else {
|
|
if(!worldObj.isRemote && this.deathTicks % 10 == 0) {
|
|
worldObj.playSoundEffect(posX, posY, posZ, "hbm:weapon.fstbmbPing", 5.0F, 1.0F);
|
|
}
|
|
}
|
|
}
|
|
}
|