mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
338 lines
11 KiB
Java
338 lines
11 KiB
Java
package com.hbm.tileentity.machine.oil;
|
|
|
|
import java.util.List;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.handler.pollution.PollutionHandler;
|
|
import com.hbm.handler.pollution.PollutionHandler.PollutionType;
|
|
import com.hbm.interfaces.IControlReceiver;
|
|
import com.hbm.interfaces.IFluidAcceptor;
|
|
import com.hbm.interfaces.IFluidContainer;
|
|
import com.hbm.inventory.UpgradeManager;
|
|
import com.hbm.inventory.container.ContainerMachineGasFlare;
|
|
import com.hbm.inventory.fluid.FluidType;
|
|
import com.hbm.inventory.fluid.Fluids;
|
|
import com.hbm.inventory.fluid.tank.FluidTank;
|
|
import com.hbm.inventory.fluid.trait.FT_Flammable;
|
|
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous;
|
|
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous_ART;
|
|
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Leaded;
|
|
import com.hbm.inventory.gui.GUIMachineGasFlare;
|
|
import com.hbm.items.machine.ItemMachineUpgrade.UpgradeType;
|
|
import com.hbm.lib.Library;
|
|
import com.hbm.main.MainRegistry;
|
|
import com.hbm.tileentity.IGUIProvider;
|
|
import com.hbm.tileentity.IUpgradeInfoProvider;
|
|
import com.hbm.tileentity.TileEntityMachineBase;
|
|
import com.hbm.util.I18nUtil;
|
|
import com.hbm.util.ParticleUtil;
|
|
import com.hbm.util.fauxpointtwelve.DirPos;
|
|
|
|
import api.hbm.energy.IEnergyGenerator;
|
|
import api.hbm.fluid.IFluidStandardReceiver;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.client.gui.GuiScreen;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.entity.player.EntityPlayer;
|
|
import net.minecraft.inventory.Container;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.tileentity.TileEntity;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
import net.minecraft.util.DamageSource;
|
|
import net.minecraft.util.EnumChatFormatting;
|
|
import net.minecraft.world.World;
|
|
|
|
public class TileEntityMachineGasFlare extends TileEntityMachineBase implements IEnergyGenerator, IFluidContainer, IFluidAcceptor, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider {
|
|
|
|
public long power;
|
|
public static final long maxPower = 100000;
|
|
public FluidTank tank;
|
|
public boolean isOn = false;
|
|
public boolean doesBurn = false;
|
|
|
|
public TileEntityMachineGasFlare() {
|
|
super(6);
|
|
tank = new FluidTank(Fluids.GAS, 64000, 0);
|
|
}
|
|
|
|
@Override
|
|
public String getName() {
|
|
return "container.gasFlare";
|
|
}
|
|
|
|
@Override
|
|
public void readFromNBT(NBTTagCompound nbt) {
|
|
super.readFromNBT(nbt);
|
|
this.power = nbt.getLong("powerTime");
|
|
tank.readFromNBT(nbt, "gas");
|
|
isOn = nbt.getBoolean("isOn");
|
|
doesBurn = nbt.getBoolean("doesBurn");
|
|
}
|
|
|
|
@Override
|
|
public void writeToNBT(NBTTagCompound nbt) {
|
|
super.writeToNBT(nbt);
|
|
nbt.setLong("powerTime", power);
|
|
tank.writeToNBT(nbt, "gas");
|
|
nbt.setBoolean("isOn", isOn);
|
|
nbt.setBoolean("doesBurn", doesBurn);
|
|
}
|
|
|
|
public long getPowerScaled(long i) {
|
|
return (power * i) / maxPower;
|
|
}
|
|
|
|
@Override
|
|
public boolean hasPermission(EntityPlayer player) {
|
|
return player.getDistanceSq(xCoord, yCoord, zCoord) <= 256;
|
|
}
|
|
|
|
@Override
|
|
public void receiveControl(NBTTagCompound data) {
|
|
if(data.hasKey("valve")) this.isOn = !this.isOn;
|
|
if(data.hasKey("dial")) this.doesBurn = !this.doesBurn;
|
|
this.worldObj.markTileEntityChunkModified(this.xCoord, this.yCoord, this.zCoord, this);
|
|
}
|
|
|
|
@Override
|
|
public void updateEntity() {
|
|
|
|
if(!worldObj.isRemote) {
|
|
|
|
for(DirPos pos : getConPos()) {
|
|
this.sendPower(worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
|
|
this.trySubscribe(tank.getTankType(), worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
|
|
}
|
|
|
|
tank.setType(3, slots);
|
|
tank.loadTank(1, 2, slots);
|
|
tank.updateTank(xCoord, yCoord, zCoord, worldObj.provider.dimensionId);
|
|
|
|
int maxVent = 50;
|
|
int maxBurn = 10;
|
|
|
|
if(isOn && tank.getFill() > 0) {
|
|
|
|
UpgradeManager.eval(slots, 4, 5);
|
|
int burn = Math.min(UpgradeManager.getLevel(UpgradeType.SPEED), 3);
|
|
int yield = Math.min(UpgradeManager.getLevel(UpgradeType.EFFECT), 3);
|
|
|
|
maxVent += maxVent * burn;
|
|
maxBurn += maxBurn * burn;
|
|
|
|
if(!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) {
|
|
|
|
if(tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class)) {
|
|
int eject = Math.min(maxVent, tank.getFill());
|
|
tank.setFill(tank.getFill() - eject);
|
|
tank.getTankType().onFluidRelease(this, tank, eject);
|
|
|
|
if(worldObj.getTotalWorldTime() % 7 == 0)
|
|
this.worldObj.playSoundEffect(this.xCoord, this.yCoord + 11, this.zCoord, "random.fizz", 1.5F, 0.5F);
|
|
}
|
|
} else {
|
|
|
|
if(tank.getTankType().hasTrait(FT_Flammable.class)) {
|
|
int eject = Math.min(maxBurn, tank.getFill());
|
|
tank.setFill(tank.getFill() - eject);
|
|
|
|
int penalty = 5;
|
|
if(!tank.getTankType().hasTrait(FT_Gaseous.class) && !tank.getTankType().hasTrait(FT_Gaseous_ART.class))
|
|
penalty = 10;
|
|
|
|
long powerProd = tank.getTankType().getTrait(FT_Flammable.class).getHeatEnergy() * eject / 1_000; // divided by 1000 per mB
|
|
powerProd /= penalty;
|
|
powerProd += powerProd * yield / 3;
|
|
|
|
power += powerProd;
|
|
|
|
if(power > maxPower)
|
|
power = maxPower;
|
|
|
|
ParticleUtil.spawnGasFlame(worldObj, this.xCoord + 0.5F, this.yCoord + 11.75F, this.zCoord + 0.5F, worldObj.rand.nextGaussian() * 0.15, 0.2, worldObj.rand.nextGaussian() * 0.15);
|
|
|
|
List<Entity> list = worldObj.getEntitiesWithinAABB(Entity.class, AxisAlignedBB.getBoundingBox(xCoord - 1, yCoord + 12, zCoord - 2, xCoord + 2, yCoord + 17, zCoord + 2));
|
|
for(Entity e : list) {
|
|
e.setFire(5);
|
|
e.attackEntityFrom(DamageSource.onFire, 5F);
|
|
}
|
|
|
|
if(worldObj.getTotalWorldTime() % 3 == 0)
|
|
this.worldObj.playSoundEffect(this.xCoord, this.yCoord + 11, this.zCoord, "hbm:weapon.flamethrowerShoot", 1.5F, 0.75F);
|
|
|
|
if(worldObj.getTotalWorldTime() % 20 == 0) {
|
|
PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.SOOT, PollutionHandler.SOOT_PER_SECOND * 5);
|
|
if(tank.getTankType().hasTrait(FT_Leaded.class)) PollutionHandler.incrementPollution(worldObj, xCoord, yCoord, zCoord, PollutionType.HEAVYMETAL, PollutionHandler.HEAVY_METAL_PER_SECOND * 5);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
power = Library.chargeItemsFromTE(slots, 0, power, maxPower);
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setLong("power", this.power);
|
|
data.setBoolean("isOn", isOn);
|
|
data.setBoolean("doesBurn", doesBurn);
|
|
this.networkPack(data, 50);
|
|
|
|
} else {
|
|
|
|
if(isOn && tank.getFill() > 0) {
|
|
|
|
if((!doesBurn || !(tank.getTankType().hasTrait(FT_Flammable.class))) && (tank.getTankType().hasTrait(FT_Gaseous.class) || tank.getTankType().hasTrait(FT_Gaseous_ART.class))) {
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setString("type", "tower");
|
|
data.setFloat("lift", 1F);
|
|
data.setFloat("base", 0.25F);
|
|
data.setFloat("max", 3F);
|
|
data.setInteger("life", 150 + worldObj.rand.nextInt(20));
|
|
data.setInteger("color", tank.getTankType().getColor());
|
|
|
|
data.setDouble("posX", xCoord + 0.5);
|
|
data.setDouble("posZ", zCoord + 0.5);
|
|
data.setDouble("posY", yCoord + 11);
|
|
|
|
MainRegistry.proxy.effectNT(data);
|
|
|
|
}
|
|
|
|
if(doesBurn && tank.getTankType().hasTrait(FT_Flammable.class) && MainRegistry.proxy.me().getDistanceSq(xCoord, yCoord + 10, zCoord) <= 1024) {
|
|
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setString("type", "vanillaExt");
|
|
data.setString("mode", "smoke");
|
|
data.setBoolean("noclip", true);
|
|
data.setInteger("overrideAge", 50);
|
|
|
|
if(worldObj.getTotalWorldTime() % 2 == 0) {
|
|
data.setDouble("posX", xCoord + 1.5);
|
|
data.setDouble("posZ", zCoord + 1.5);
|
|
data.setDouble("posY", yCoord + 10.75);
|
|
} else {
|
|
data.setDouble("posX", xCoord + 1.125);
|
|
data.setDouble("posZ", zCoord - 0.5);
|
|
data.setDouble("posY", yCoord + 11.75);
|
|
}
|
|
|
|
MainRegistry.proxy.effectNT(data);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public DirPos[] getConPos() {
|
|
return new DirPos[] {
|
|
new DirPos(xCoord + 2, yCoord, zCoord, Library.POS_X),
|
|
new DirPos(xCoord - 2, yCoord, zCoord, Library.NEG_X),
|
|
new DirPos(xCoord, yCoord, zCoord + 2, Library.POS_Z),
|
|
new DirPos(xCoord, yCoord, zCoord - 2, Library.NEG_Z)
|
|
};
|
|
}
|
|
|
|
@Override
|
|
public void networkUnpack(NBTTagCompound nbt) {
|
|
this.power = nbt.getLong("power");
|
|
this.isOn = nbt.getBoolean("isOn");
|
|
this.doesBurn = nbt.getBoolean("doesBurn");
|
|
}
|
|
|
|
@Override
|
|
public AxisAlignedBB getRenderBoundingBox() {
|
|
return TileEntity.INFINITE_EXTENT_AABB;
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public double getMaxRenderDistanceSquared() {
|
|
return 65536.0D;
|
|
}
|
|
|
|
@Override
|
|
public long getPower() {
|
|
return this.power;
|
|
}
|
|
|
|
@Override
|
|
public long getMaxPower() {
|
|
return this.maxPower;
|
|
}
|
|
|
|
@Override
|
|
public void setPower(long i) {
|
|
this.power = i;
|
|
}
|
|
|
|
@Override
|
|
public void setFillForSync(int fill, int index) {
|
|
tank.setFill(fill);
|
|
}
|
|
|
|
@Override
|
|
public void setTypeForSync(FluidType type, int index) {
|
|
tank.setTankType(type);
|
|
}
|
|
|
|
@Override
|
|
public int getMaxFluidFill(FluidType type) {
|
|
return type.name().equals(this.tank.getTankType().name()) ? tank.getMaxFill() : 0;
|
|
}
|
|
|
|
@Override
|
|
public int getFluidFill(FluidType type) {
|
|
return type.name().equals(this.tank.getTankType().name()) ? tank.getFill() : 0;
|
|
}
|
|
|
|
@Override
|
|
public void setFluidFill(int i, FluidType type) {
|
|
if(type.name().equals(tank.getTankType().name()))
|
|
tank.setFill(i);
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getReceivingTanks() {
|
|
return new FluidTank[] { tank };
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getAllTanks() {
|
|
return new FluidTank[] { tank };
|
|
}
|
|
|
|
@Override
|
|
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new ContainerMachineGasFlare(player.inventory, this);
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
|
|
return new GUIMachineGasFlare(player.inventory, this);
|
|
}
|
|
|
|
@Override
|
|
public boolean canProvideInfo(UpgradeType type, int level, boolean extendedInfo) {
|
|
return type == UpgradeType.SPEED || type == UpgradeType.EFFECT;
|
|
}
|
|
|
|
@Override
|
|
public void provideInfo(UpgradeType type, int level, List<String> info, boolean extendedInfo) {
|
|
info.add(IUpgradeInfoProvider.getStandardLabel(ModBlocks.machine_flare));
|
|
if(type == UpgradeType.SPEED) {
|
|
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_CONSUMPTION, "+" + (level * 100) + "%"));
|
|
}
|
|
if(type == UpgradeType.EFFECT) {
|
|
info.add(EnumChatFormatting.GREEN + I18nUtil.resolveKey(this.KEY_EFFICIENCY, "+" + (100 * level / 3) + "%"));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public int getMaxLevel(UpgradeType type) {
|
|
if(type == UpgradeType.SPEED) return 3;
|
|
if(type == UpgradeType.EFFECT) return 3;
|
|
return 0;
|
|
}
|
|
}
|