mirror of
https://github.com/HbmMods/Hbm-s-Nuclear-Tech-GIT.git
synced 2026-01-25 10:32:49 +00:00
191 lines
4.5 KiB
Java
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[] {};
|
|
}
|
|
}
|