2024-09-06 21:59:03 -05:00

191 lines
4.5 KiB
Java

package com.hbm.tileentity.machine.rbmk;
import com.hbm.entity.projectile.EntityRBMKDebris.DebrisType;
import com.hbm.handler.CompatHandler;
import com.hbm.handler.neutron.RBMKNeutronHandler.RBMKType;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import io.netty.buffer.ByteBuf;
import li.cil.oc.api.machine.Arguments;
import li.cil.oc.api.machine.Callback;
import li.cil.oc.api.machine.Context;
import li.cil.oc.api.network.SimpleComponent;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
@Optional.InterfaceList({@Optional.Interface(iface = "li.cil.oc.api.network.SimpleComponent", modid = "OpenComputers")})
public abstract class TileEntityRBMKControl extends TileEntityRBMKSlottedBase implements SimpleComponent, CompatHandler.OCComponent {
@SideOnly(Side.CLIENT)
public double lastLevel;
public double level;
public static final double speed = 0.00277D; // it takes around 18 seconds for the thing to fully extend
public double targetLevel;
public TileEntityRBMKControl() {
super(0);
}
@Override
public boolean isLidRemovable() {
return false;
}
@Override
public void updateEntity() {
if(worldObj.isRemote) {
this.lastLevel = this.level;
} else {
if(level < targetLevel) {
level += speed * RBMKDials.getControlSpeed(worldObj);
if(level > targetLevel)
level = targetLevel;
}
if(level > targetLevel) {
level -= speed * RBMKDials.getControlSpeed(worldObj);
if(level < targetLevel)
level = targetLevel;
}
}
super.updateEntity();
}
public void setTarget(double target) {
this.targetLevel = target;
}
public double getMult() {
return this.level;
}
@Override
public int trackingRange() {
return 100;
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
this.level = nbt.getDouble("level");
this.targetLevel = nbt.getDouble("targetLevel");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setDouble("level", this.level);
nbt.setDouble("targetLevel", this.targetLevel);
}
@Override
public void serialize(ByteBuf buf) {
super.serialize(buf);
buf.writeDouble(this.level);
buf.writeDouble(this.targetLevel);
}
@Override
public void deserialize(ByteBuf buf) {
super.deserialize(buf);
this.level = buf.readDouble();
this.targetLevel = buf.readDouble();
}
@Override
@SideOnly(Side.CLIENT)
public double getMaxRenderDistanceSquared() {
return 65536.0D;
}
@Override
public void onMelt(int reduce) {
if(this.isModerated()) {
int count = 2 + worldObj.rand.nextInt(2);
for(int i = 0; i < count; i++) {
spawnDebris(DebrisType.GRAPHITE);
}
}
int count = 2 + worldObj.rand.nextInt(2);
for(int i = 0; i < count; i++) {
spawnDebris(DebrisType.ROD);
}
this.standardMelt(reduce);
}
@Override
public RBMKType getRBMKType() {
return RBMKType.CONTROL_ROD;
}
@Override
public NBTTagCompound getNBTForConsole() {
NBTTagCompound data = new NBTTagCompound();
data.setDouble("level", this.level);
return data;
}
// do some opencomputer stuff
@Override
@Optional.Method(modid = "OpenComputers")
public String getComponentName() {
return "rbmk_control_rod";
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getLevel(Context context, Arguments args) {
return new Object[] {getMult() * 100};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getTargetLevel(Context context, Arguments args) {
return new Object[] {targetLevel * 100};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getCoordinates(Context context, Arguments args) {
return new Object[] {xCoord, yCoord, zCoord};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getHeat(Context context, Arguments args) {
return new Object[] {heat};
}
@Callback(direct = true)
@Optional.Method(modid = "OpenComputers")
public Object[] getInfo(Context context, Arguments args) {
return new Object[] {heat, getMult() * 100, targetLevel * 100, xCoord, yCoord, zCoord};
}
@Callback(direct = true, limit = 4)
@Optional.Method(modid = "OpenComputers")
public Object[] setLevel(Context context, Arguments args) {
double newLevel = args.checkDouble(0)/100.0;
targetLevel = MathHelper.clamp_double(newLevel, 0, 1);
return new Object[] {};
}
}