Hbm-s-Nuclear-Tech-GIT/src/main/java/com/hbm/tileentity/machine/rbmk/TileEntityRBMKControlAuto.java
2025-08-04 19:18:41 +02:00

167 lines
4.7 KiB
Java

package com.hbm.tileentity.machine.rbmk;
import com.hbm.interfaces.IControlReceiver;
import com.hbm.inventory.container.ContainerRBMKControlAuto;
import com.hbm.inventory.gui.GUIRBMKControlAuto;
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKConsole.ColumnType;
import com.hbm.tileentity.machine.rbmk.TileEntityRBMKControlManual.RBMKColor;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.util.Vec3;
import net.minecraft.world.World;
public class TileEntityRBMKControlAuto extends TileEntityRBMKControl implements IControlReceiver {
public RBMKFunction function = RBMKFunction.LINEAR;
public double levelLower;
public double levelUpper;
public double heatLower;
public double heatUpper;
@Override
public String getName() {
return "container.rbmkControlAuto";
}
@Override
public boolean hasPermission(EntityPlayer player) {
return Vec3.createVectorHelper(xCoord - player.posX, yCoord - player.posY, zCoord - player.posZ).lengthVector() < 20;
}
@Override
public void updateEntity() {
if(!worldObj.isRemote) {
double fauxLevel = 0;
double lowerBound = Math.min(this.heatLower, this.heatUpper);
double upperBound = Math.max(this.heatLower, this.heatUpper);
if(this.heat < lowerBound) {
fauxLevel = this.levelLower;
} else if(this.heat > upperBound) {
fauxLevel = this.levelUpper;
} else {
switch(this.function) {
case LINEAR:
// my brain hasn't been this challenged since my math finals in
// '19
fauxLevel = (this.heat - this.heatLower) * ((this.levelUpper - this.levelLower) / (this.heatUpper - this.heatLower)) + this.levelLower;
break;
case QUAD_UP:
// so this is how we roll, huh?
fauxLevel = Math.pow((this.heat - this.heatLower) / (this.heatUpper - this.heatLower), 2) * (this.levelUpper - this.levelLower) + this.levelLower;
break;
case QUAD_DOWN:
// sometimes my genius is almost frightening
fauxLevel = Math.pow((this.heat - this.heatUpper) / (this.heatLower - this.heatUpper), 2) * (this.levelLower - this.levelUpper) + this.levelUpper;
break;
}
}
this.targetLevel = fauxLevel * 0.01D;
this.targetLevel = MathHelper.clamp_double(this.targetLevel, 0D, 1D);
}
super.updateEntity();
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.levelLower = nbt.getDouble("levelLower");
this.levelUpper = nbt.getDouble("levelUpper");
this.heatLower = nbt.getDouble("heatLower");
this.heatUpper = nbt.getDouble("heatUpper");
if(nbt.hasKey("function"))
this.function = RBMKFunction.values()[nbt.getInteger("function")];
else
this.function = null;
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setDouble("levelLower", levelLower);
nbt.setDouble("levelUpper", levelUpper);
nbt.setDouble("heatLower", heatLower);
nbt.setDouble("heatUpper", heatUpper);
if(function != null)
nbt.setInteger("function", function.ordinal());
}
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
buf.writeDouble(this.levelLower);
buf.writeDouble(this.levelUpper);
buf.writeDouble(this.heatLower);
buf.writeDouble(this.heatUpper);
if(function != null) buf.writeInt(function.ordinal());
}
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
this.levelLower = buf.readDouble();
this.levelUpper = buf.readDouble();
this.heatLower = buf.readDouble();
this.heatUpper = buf.readDouble();
this.function = RBMKFunction.values()[buf.readInt()];
}
@Override
public void receiveControl(NBTTagCompound data) {
if(data.hasKey("function")) {
int c = Math.abs(data.getInteger("function")) % RBMKColor.values().length;
this.function = RBMKFunction.values()[c];
} else {
this.levelLower = data.getDouble("levelLower");
this.levelUpper = data.getDouble("levelUpper");
this.heatLower = data.getDouble("heatLower");
this.heatUpper = data.getDouble("heatUpper");
}
this.markDirty();
}
public static enum RBMKFunction {
LINEAR,
QUAD_UP,
QUAD_DOWN
}
@Override
public ColumnType getConsoleType() {
return ColumnType.CONTROL_AUTO;
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerRBMKControlAuto(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public Object provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIRBMKControlAuto(player.inventory, this);
}
}