mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
hopefully all fluid impls done outside of the rbmk stuff Also implemented copy pasting of molten metals, copying from anything that holds molten metal, and pasting into outlets for filters
360 lines
11 KiB
Java
360 lines
11 KiB
Java
package com.hbm.tileentity.machine.oil;
|
|
|
|
import java.util.List;
|
|
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.interfaces.IControlReceiver;
|
|
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.FT_Polluting;
|
|
import com.hbm.inventory.fluid.trait.FluidTrait.FluidReleaseType;
|
|
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous;
|
|
import com.hbm.inventory.fluid.trait.FluidTraitSimple.FT_Gaseous_ART;
|
|
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.IFluidCopiable;
|
|
import com.hbm.tileentity.IGUIProvider;
|
|
import com.hbm.tileentity.IUpgradeInfoProvider;
|
|
import com.hbm.tileentity.TileEntityMachineBase;
|
|
import com.hbm.util.CompatEnergyControl;
|
|
import com.hbm.util.I18nUtil;
|
|
import com.hbm.util.ParticleUtil;
|
|
import com.hbm.util.fauxpointtwelve.DirPos;
|
|
|
|
import api.hbm.energymk2.IEnergyProviderMK2;
|
|
import api.hbm.fluid.IFluidStandardReceiver;
|
|
import api.hbm.tile.IInfoProviderEC;
|
|
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 IEnergyProviderMK2, IFluidContainer, IFluidStandardReceiver, IControlReceiver, IGUIProvider, IUpgradeInfoProvider, IInfoProviderEC, IFluidCopiable {
|
|
|
|
public long power;
|
|
public static final long maxPower = 100000;
|
|
public FluidTank tank;
|
|
public boolean isOn = false;
|
|
public boolean doesBurn = false;
|
|
protected int fluidUsed = 0;
|
|
protected int output = 0;
|
|
|
|
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) {
|
|
|
|
this.fluidUsed = 0;
|
|
this.output = 0;
|
|
|
|
for(DirPos pos : getConPos()) {
|
|
this.tryProvide(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());
|
|
this.fluidUsed = eject;
|
|
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", getVolume(1.5F), 0.5F);
|
|
|
|
if(worldObj.getTotalWorldTime() % 5 == 0 && eject > 0) {
|
|
FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.SPILL, eject * 5);
|
|
}
|
|
}
|
|
} else {
|
|
|
|
if(tank.getTankType().hasTrait(FT_Flammable.class)) {
|
|
int eject = Math.min(maxBurn, tank.getFill());
|
|
this.fluidUsed = eject;
|
|
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;
|
|
|
|
this.output = (int) powerProd;
|
|
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", getVolume(1.5F), 0.75F);
|
|
|
|
if(worldObj.getTotalWorldTime() % 5 == 0 && eject > 0) {
|
|
FT_Polluting.pollute(worldObj, xCoord, yCoord, zCoord, tank.getTankType(), FluidReleaseType.BURN, eject * 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) {
|
|
super.networkUnpack(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 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;
|
|
}
|
|
|
|
@Override
|
|
public void provideExtraInfo(NBTTagCompound data) {
|
|
data.setBoolean(CompatEnergyControl.B_ACTIVE, this.fluidUsed > 0);
|
|
data.setDouble(CompatEnergyControl.D_CONSUMPTION_MB, this.fluidUsed);
|
|
data.setDouble(CompatEnergyControl.D_OUTPUT_HE, this.output);
|
|
}
|
|
|
|
@Override
|
|
public NBTTagCompound getSettings(World world, int x, int y, int z) {
|
|
NBTTagCompound tag = new NBTTagCompound();
|
|
tag.setIntArray("fluidID", new int[]{tank.getTankType().getID()});
|
|
tag.setBoolean("isOn", isOn);
|
|
tag.setBoolean("doesBurn", doesBurn);
|
|
return tag;
|
|
}
|
|
|
|
@Override
|
|
public void pasteSettings(NBTTagCompound nbt, int index, World world, EntityPlayer player, int x, int y, int z) {
|
|
int id = nbt.getIntArray("fluidID")[index];
|
|
tank.setTankType(Fluids.fromID(id));
|
|
if(nbt.hasKey("isOn")) isOn = nbt.getBoolean("isOn");
|
|
if(nbt.hasKey("doesBurn")) doesBurn = nbt.getBoolean("doesBurn");
|
|
}
|
|
}
|