mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
261 lines
9.3 KiB
Java
261 lines
9.3 KiB
Java
package com.hbm.entity.missile;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.blocks.bomb.BlockTaint;
|
|
import com.hbm.entity.effect.EntityNukeTorex;
|
|
import com.hbm.entity.logic.EntityBalefire;
|
|
import com.hbm.entity.logic.EntityNukeExplosionMK5;
|
|
import com.hbm.entity.logic.IChunkLoader;
|
|
import com.hbm.entity.projectile.EntityBulletBaseNT;
|
|
import com.hbm.explosion.ExplosionChaos;
|
|
import com.hbm.explosion.ExplosionLarge;
|
|
import com.hbm.handler.BulletConfigSyncingUtil;
|
|
import com.hbm.handler.MissileStruct;
|
|
import com.hbm.items.ModItems;
|
|
import com.hbm.items.weapon.ItemCustomMissilePart;
|
|
import com.hbm.items.weapon.ItemCustomMissilePart.FuelType;
|
|
import com.hbm.items.weapon.ItemCustomMissilePart.PartSize;
|
|
import com.hbm.items.weapon.ItemCustomMissilePart.WarheadType;
|
|
import com.hbm.main.MainRegistry;
|
|
|
|
import api.hbm.entity.IRadarDetectableNT;
|
|
import net.minecraft.item.Item;
|
|
import net.minecraft.item.ItemStack;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.Vec3;
|
|
import net.minecraft.world.World;
|
|
|
|
public class EntityMissileCustom extends EntityMissileBaseNT implements IChunkLoader {
|
|
|
|
protected float fuel;
|
|
protected float consumption;
|
|
|
|
public EntityMissileCustom(World world) {
|
|
super(world);
|
|
}
|
|
|
|
public EntityMissileCustom(World world, float x, float y, float z, int a, int b, MissileStruct template) {
|
|
super(world);
|
|
this.ignoreFrustumCheck = true;
|
|
this.setLocationAndAngles(x, y, z, 0, 0);
|
|
startX = (int) x;
|
|
startZ = (int) z;
|
|
targetX = a;
|
|
targetZ = b;
|
|
this.motionY = 2;
|
|
|
|
Vec3 vector = Vec3.createVectorHelper(targetX - startX, 0, targetZ - startZ);
|
|
accelXZ = decelY = 1 / vector.lengthVector();
|
|
decelY *= 2;
|
|
velocity = 0;
|
|
|
|
this.dataWatcher.updateObject(9, Item.getIdFromItem(template.warhead));
|
|
this.dataWatcher.updateObject(10, Item.getIdFromItem(template.fuselage));
|
|
this.dataWatcher.updateObject(12, Item.getIdFromItem(template.thruster));
|
|
if(template.fins != null) {
|
|
this.dataWatcher.updateObject(11, Item.getIdFromItem(template.fins));
|
|
} else {
|
|
this.dataWatcher.updateObject(11, Integer.valueOf(0));
|
|
}
|
|
|
|
ItemCustomMissilePart fuselage = (ItemCustomMissilePart) template.fuselage;
|
|
ItemCustomMissilePart thruster = (ItemCustomMissilePart) template.thruster;
|
|
|
|
this.fuel = (Float) fuselage.attributes[1];
|
|
this.consumption = (Float) thruster.attributes[1];
|
|
|
|
this.setSize(1.5F, 1.5F);
|
|
}
|
|
|
|
@Override
|
|
protected void killMissile() {
|
|
ExplosionLarge.explode(worldObj, posX, posY, posZ, 5, true, false, true);
|
|
ExplosionLarge.spawnShrapnelShower(worldObj, posX, posY, posZ, motionX, motionY, motionZ, 15, 0.075);
|
|
}
|
|
|
|
@Override
|
|
public void onUpdate() {
|
|
|
|
if(!worldObj.isRemote) {
|
|
if(this.hasPropulsion()) this.fuel -= this.consumption;
|
|
}
|
|
|
|
super.onUpdate();
|
|
}
|
|
|
|
@Override
|
|
public boolean hasPropulsion() {
|
|
return this.fuel > 0;
|
|
}
|
|
|
|
@Override
|
|
protected void entityInit() {
|
|
super.entityInit();
|
|
this.dataWatcher.addObject(8, Integer.valueOf(this.health));
|
|
this.dataWatcher.addObject(9, Integer.valueOf(0));
|
|
this.dataWatcher.addObject(10, Integer.valueOf(0));
|
|
this.dataWatcher.addObject(11, Integer.valueOf(0));
|
|
this.dataWatcher.addObject(12, Integer.valueOf(0));
|
|
}
|
|
|
|
@Override
|
|
public void readEntityFromNBT(NBTTagCompound nbt) {
|
|
super.readEntityFromNBT(nbt);
|
|
fuel = nbt.getFloat("fuel");
|
|
consumption = nbt.getFloat("consumption");
|
|
this.dataWatcher.updateObject(9, nbt.getInteger("warhead"));
|
|
this.dataWatcher.updateObject(10, nbt.getInteger("fuselage"));
|
|
this.dataWatcher.updateObject(11, nbt.getInteger("fins"));
|
|
this.dataWatcher.updateObject(12, nbt.getInteger("thruster"));
|
|
}
|
|
|
|
@Override
|
|
public void writeEntityToNBT(NBTTagCompound nbt) {
|
|
super.writeEntityToNBT(nbt);
|
|
nbt.setFloat("fuel", fuel);
|
|
nbt.setFloat("consumption", consumption);
|
|
nbt.setInteger("warhead", this.dataWatcher.getWatchableObjectInt(9));
|
|
nbt.setInteger("fuselage", this.dataWatcher.getWatchableObjectInt(10));
|
|
nbt.setInteger("fins", this.dataWatcher.getWatchableObjectInt(11));
|
|
nbt.setInteger("thruster", this.dataWatcher.getWatchableObjectInt(12));
|
|
}
|
|
|
|
@Override
|
|
protected void spawnContrail() {
|
|
|
|
Vec3 v = Vec3.createVectorHelper(motionX, motionY, motionZ).normalize();
|
|
String smoke = "";
|
|
ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(10));
|
|
FuelType type = (FuelType) part.attributes[0];
|
|
|
|
switch(type) {
|
|
case BALEFIRE: smoke = "exBalefire"; break;
|
|
case HYDROGEN: smoke = "exHydrogen"; break;
|
|
case KEROSENE: smoke = "exKerosene"; break;
|
|
case SOLID: smoke = "exSolid"; break;
|
|
case XENON: break;
|
|
}
|
|
|
|
if(!smoke.isEmpty()) for(int i = 0; i < velocity; i++) MainRegistry.proxy.spawnParticle(posX - v.xCoord * i, posY - v.yCoord * i, posZ - v.zCoord * i, smoke, null);
|
|
}
|
|
|
|
@Override
|
|
public void onImpact() { //TODO: demolish this steaming pile of shit
|
|
|
|
ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(9));
|
|
|
|
WarheadType type = (WarheadType) part.attributes[0];
|
|
float strength = (Float) part.attributes[1];
|
|
|
|
switch(type) {
|
|
case HE:
|
|
ExplosionLarge.explode(worldObj, posX, posY, posZ, strength, true, false, true);
|
|
ExplosionLarge.jolt(worldObj, posX, posY, posZ, strength, (int) (strength * 50), 0.25);
|
|
break;
|
|
case INC:
|
|
ExplosionLarge.explodeFire(worldObj, posX, posY, posZ, strength, true, false, true);
|
|
ExplosionLarge.jolt(worldObj, posX, posY, posZ, strength * 1.5, (int) (strength * 50), 0.25);
|
|
break;
|
|
case CLUSTER:
|
|
break;
|
|
case BUSTER:
|
|
ExplosionLarge.buster(worldObj, posX, posY, posZ, Vec3.createVectorHelper(motionX, motionY, motionZ), strength, strength * 4);
|
|
break;
|
|
case NUCLEAR:
|
|
case TX:
|
|
worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFac(worldObj, (int) strength, posX, posY, posZ));
|
|
EntityNukeTorex.statFac(worldObj, posX, posY, posZ, strength);
|
|
break;
|
|
case BALEFIRE:
|
|
EntityBalefire bf = new EntityBalefire(worldObj);
|
|
bf.posX = this.posX;
|
|
bf.posY = this.posY;
|
|
bf.posZ = this.posZ;
|
|
bf.destructionRange = (int) strength;
|
|
worldObj.spawnEntityInWorld(bf);
|
|
EntityNukeTorex.statFacBale(worldObj, posX, posY, posZ, strength);
|
|
break;
|
|
case N2:
|
|
worldObj.spawnEntityInWorld(EntityNukeExplosionMK5.statFacNoRad(worldObj, (int) strength, posX, posY, posZ));
|
|
EntityNukeTorex.statFac(worldObj, posX, posY, posZ, strength);
|
|
break;
|
|
case TAINT:
|
|
int r = (int) strength;
|
|
for(int i = 0; i < r * 10; i++) {
|
|
int a = rand.nextInt(r) + (int) posX - (r / 2 - 1);
|
|
int b = rand.nextInt(r) + (int) posY - (r / 2 - 1);
|
|
int c = rand.nextInt(r) + (int) posZ - (r / 2 - 1);
|
|
if(worldObj.getBlock(a, b, c).isReplaceable(worldObj, a, b, c) && BlockTaint.hasPosNeightbour(worldObj, a, b, c)) {
|
|
worldObj.setBlock(a, b, c, ModBlocks.taint, rand.nextInt(3) + 4, 2);
|
|
}
|
|
}
|
|
break;
|
|
case CLOUD:
|
|
this.worldObj.playAuxSFX(2002, (int) Math.round(this.posX), (int) Math.round(this.posY), (int) Math.round(this.posZ), 0);
|
|
ExplosionChaos.spawnChlorine(worldObj, posX - motionX, posY - motionY, posZ - motionZ, 750, 2.5, 2);
|
|
break;
|
|
case TURBINE:
|
|
ExplosionLarge.explode(worldObj, posX, posY, posZ, 10, true, false, true);
|
|
int count = (int) strength;
|
|
Vec3 vec = Vec3.createVectorHelper(0.5, 0, 0);
|
|
|
|
for(int i = 0; i < count; i++) {
|
|
EntityBulletBaseNT blade = new EntityBulletBaseNT(worldObj, BulletConfigSyncingUtil.TURBINE);
|
|
blade.setPositionAndRotation(this.posX - this.motionX, this.posY - this.motionY + rand.nextGaussian(), this.posZ - this.motionZ, 0, 0);
|
|
blade.motionX = vec.xCoord;
|
|
blade.motionZ = vec.zCoord;
|
|
worldObj.spawnEntityInWorld(blade);
|
|
vec.rotateAroundY((float) (Math.PI * 2F / (float) count));
|
|
}
|
|
|
|
break;
|
|
default:
|
|
break;
|
|
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String getUnlocalizedName() {
|
|
|
|
ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(10));
|
|
PartSize top = part.top;
|
|
PartSize bottom = part.bottom;
|
|
|
|
if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_10) return "radar.target.custom10";
|
|
if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_15) return "radar.target.custom1015";
|
|
if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return "radar.target.custom15";
|
|
if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return "radar.target.custom1520";
|
|
if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return "radar.target.custom20";
|
|
|
|
return "radar.target.custom";
|
|
}
|
|
|
|
@Override
|
|
public int getBlipLevel() {
|
|
|
|
ItemCustomMissilePart part = (ItemCustomMissilePart) Item.getItemById(this.dataWatcher.getWatchableObjectInt(10));
|
|
PartSize top = part.top;
|
|
PartSize bottom = part.bottom;
|
|
|
|
if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_10) return IRadarDetectableNT.TIER10;
|
|
if(top == PartSize.SIZE_10 && bottom == PartSize.SIZE_15) return IRadarDetectableNT.TIER10_15;
|
|
if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_15) return IRadarDetectableNT.TIER15;
|
|
if(top == PartSize.SIZE_15 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER15_20;
|
|
if(top == PartSize.SIZE_20 && bottom == PartSize.SIZE_20) return IRadarDetectableNT.TIER20;
|
|
|
|
return IRadarDetectableNT.TIER1;
|
|
}
|
|
|
|
@Override public List<ItemStack> getDebris() { return new ArrayList(); }
|
|
@Override public ItemStack getDebrisRareDrop() { return null; }
|
|
|
|
@Override
|
|
public ItemStack getMissileItemForInfo() {
|
|
return new ItemStack(ModItems.missile_custom);
|
|
}
|
|
}
|