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
210 lines
5.4 KiB
Java
210 lines
5.4 KiB
Java
package com.hbm.tileentity.machine;
|
|
|
|
import java.io.IOException;
|
|
import java.util.HashSet;
|
|
|
|
import com.google.gson.JsonObject;
|
|
import com.google.gson.stream.JsonWriter;
|
|
import com.hbm.blocks.ModBlocks;
|
|
import com.hbm.inventory.fluid.tank.FluidTank;
|
|
import com.hbm.lib.Library;
|
|
import com.hbm.main.MainRegistry;
|
|
import com.hbm.tileentity.IConfigurableMachine;
|
|
import com.hbm.tileentity.IFluidCopiable;
|
|
import com.hbm.tileentity.INBTPacketReceiver;
|
|
import com.hbm.tileentity.TileEntityLoadedBase;
|
|
import com.hbm.util.fauxpointtwelve.DirPos;
|
|
|
|
import api.hbm.fluid.IFluidStandardTransceiver;
|
|
import cpw.mods.fml.relauncher.Side;
|
|
import cpw.mods.fml.relauncher.SideOnly;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.init.Blocks;
|
|
import net.minecraft.nbt.NBTTagCompound;
|
|
import net.minecraft.util.AxisAlignedBB;
|
|
|
|
public abstract class TileEntityMachinePumpBase extends TileEntityLoadedBase implements IFluidStandardTransceiver, INBTPacketReceiver, IConfigurableMachine, IFluidCopiable {
|
|
|
|
public static final HashSet<Block> validBlocks = new HashSet();
|
|
|
|
static {
|
|
validBlocks.add(Blocks.grass);
|
|
validBlocks.add(Blocks.dirt);
|
|
validBlocks.add(Blocks.sand);
|
|
validBlocks.add(Blocks.mycelium);
|
|
validBlocks.add(ModBlocks.waste_earth);
|
|
validBlocks.add(ModBlocks.dirt_dead);
|
|
validBlocks.add(ModBlocks.dirt_oily);
|
|
validBlocks.add(ModBlocks.sand_dirty);
|
|
validBlocks.add(ModBlocks.sand_dirty_red);
|
|
}
|
|
|
|
public FluidTank water;
|
|
|
|
public boolean isOn = false;
|
|
public float rotor;
|
|
public float lastRotor;
|
|
public boolean onGround = false;
|
|
public int groundCheckDelay = 0;
|
|
|
|
public static int groundHeight = 70;
|
|
public static int groundDepth = 4;
|
|
public static int steamSpeed = 1_000;
|
|
public static int electricSpeed = 10_000;
|
|
|
|
@Override
|
|
public String getConfigName() {
|
|
return "waterpump";
|
|
}
|
|
|
|
@Override
|
|
public void readIfPresent(JsonObject obj) {
|
|
groundHeight = IConfigurableMachine.grab(obj, "I:groundHeight", groundHeight);
|
|
groundDepth = IConfigurableMachine.grab(obj, "I:groundDepth", groundDepth);
|
|
steamSpeed = IConfigurableMachine.grab(obj, "I:steamSpeed", steamSpeed);
|
|
electricSpeed = IConfigurableMachine.grab(obj, "I:electricSpeed", electricSpeed);
|
|
}
|
|
|
|
@Override
|
|
public void writeConfig(JsonWriter writer) throws IOException {
|
|
writer.name("I:groundHeight").value(groundHeight);
|
|
writer.name("I:groundDepth").value(groundDepth);
|
|
writer.name("I:steamSpeed").value(steamSpeed);
|
|
writer.name("I:electricSpeed").value(electricSpeed);
|
|
}
|
|
|
|
public void updateEntity() {
|
|
|
|
if(!worldObj.isRemote) {
|
|
|
|
for(DirPos pos : getConPos()) {
|
|
if(water.getFill() > 0) this.sendFluid(water, worldObj, pos.getX(), pos.getY(), pos.getZ(), pos.getDir());
|
|
}
|
|
|
|
if(groundCheckDelay > 0) {
|
|
groundCheckDelay--;
|
|
} else {
|
|
onGround = this.checkGround();
|
|
}
|
|
|
|
this.isOn = false;
|
|
if(this.canOperate() && yCoord <= groundHeight && onGround) {
|
|
this.isOn = true;
|
|
this.operate();
|
|
}
|
|
|
|
NBTTagCompound data = this.getSync();
|
|
INBTPacketReceiver.networkPack(this, data, 150);
|
|
|
|
} else {
|
|
|
|
this.lastRotor = this.rotor;
|
|
if(this.isOn) this.rotor += 10F;
|
|
|
|
if(this.rotor >= 360F) {
|
|
this.rotor -= 360F;
|
|
this.lastRotor -= 360F;
|
|
|
|
MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "hbm:block.steamEngineOperate", 0.5F, 0.75F);
|
|
MainRegistry.proxy.playSoundClient(xCoord, yCoord, zCoord, "game.neutral.swim.splash", 1F, 0.5F);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected boolean checkGround() {
|
|
|
|
if(worldObj.provider.hasNoSky) return false;
|
|
|
|
int validBlocks = 0;
|
|
int invalidBlocks = 0;
|
|
|
|
for(int x = -1; x <= 1; x++) {
|
|
for(int y = -1; y >= -groundDepth; y--) {
|
|
for(int z = -1; z <= 1; z++) {
|
|
|
|
Block b = worldObj.getBlock(xCoord + x, yCoord + y, zCoord + z);
|
|
|
|
if(y == -1 && !b.isNormalCube()) return false; // first layer has to be full solid
|
|
|
|
if(this.validBlocks.contains(b)) validBlocks++;
|
|
else invalidBlocks ++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return validBlocks >= invalidBlocks; // valid block count has to be at least 50%
|
|
}
|
|
|
|
protected NBTTagCompound getSync() {
|
|
NBTTagCompound data = new NBTTagCompound();
|
|
data.setBoolean("isOn", isOn);
|
|
data.setBoolean("onGround", onGround);
|
|
water.writeToNBT(data, "w");
|
|
return data;
|
|
}
|
|
|
|
@Override
|
|
public void networkUnpack(NBTTagCompound nbt) {
|
|
this.isOn = nbt.getBoolean("isOn");
|
|
this.onGround = nbt.getBoolean("onGround");
|
|
water.readFromNBT(nbt, "w");
|
|
}
|
|
|
|
protected abstract boolean canOperate();
|
|
protected abstract void operate();
|
|
|
|
protected 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 FluidTank[] getAllTanks() {
|
|
return new FluidTank[] {water};
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getSendingTanks() {
|
|
return new FluidTank[] {water};
|
|
}
|
|
|
|
@Override
|
|
public FluidTank[] getReceivingTanks() {
|
|
return new FluidTank[0];
|
|
}
|
|
|
|
AxisAlignedBB bb = null;
|
|
|
|
@Override
|
|
public AxisAlignedBB getRenderBoundingBox() {
|
|
|
|
if(bb == null) {
|
|
bb = AxisAlignedBB.getBoundingBox(
|
|
xCoord - 1,
|
|
yCoord,
|
|
zCoord - 1,
|
|
xCoord + 2,
|
|
yCoord + 5,
|
|
zCoord + 2
|
|
);
|
|
}
|
|
|
|
return bb;
|
|
}
|
|
|
|
@Override
|
|
@SideOnly(Side.CLIENT)
|
|
public double getMaxRenderDistanceSquared() {
|
|
return 65536.0D;
|
|
}
|
|
|
|
@Override
|
|
public FluidTank getTankToPaste() {
|
|
return null;
|
|
}
|
|
}
|