2025-03-11 00:23:54 +01:00
|
|
|
package game.tileentity;
|
|
|
|
|
|
|
|
import game.color.TextColor;
|
|
|
|
import game.entity.npc.EntityNPC;
|
|
|
|
import game.inventory.Container;
|
|
|
|
import game.inventory.ContainerMachine;
|
|
|
|
import game.inventory.InventoryPlayer;
|
|
|
|
import game.item.ItemStack;
|
|
|
|
import game.nbt.NBTTagCompound;
|
|
|
|
import game.nbt.NBTTagList;
|
|
|
|
import game.network.Packet;
|
|
|
|
import game.packet.S35PacketUpdateTileEntity;
|
|
|
|
import game.rng.Random;
|
2025-03-11 10:26:48 +01:00
|
|
|
import game.util.ExtMath;
|
2025-03-11 00:23:54 +01:00
|
|
|
|
|
|
|
public abstract class TileEntityMachine extends TileEntityLockable implements IHopper, ITickable {
|
|
|
|
public static enum Status {
|
|
|
|
OFF(TextColor.DGRAY, "Inaktiv"),
|
|
|
|
COOLING(TextColor.YELLOW, "Abkühlen ..."),
|
|
|
|
RUNNING(TextColor.GREEN, "Aktiv"),
|
|
|
|
OVERHEAT(TextColor.RED, "Überhitzt!"),
|
|
|
|
BROKEN(TextColor.BLACK, "Defekt!");
|
|
|
|
|
|
|
|
public final TextColor color;
|
|
|
|
public final String name;
|
|
|
|
|
|
|
|
private Status(TextColor color, String name) {
|
|
|
|
this.color = color;
|
|
|
|
this.name = name;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected final ItemStack[] inventory;
|
|
|
|
protected final MachineResource[] resources;
|
|
|
|
protected final Random rand = new Random();
|
|
|
|
// protected boolean isCreative;
|
|
|
|
protected int temperature;
|
|
|
|
protected Status status = Status.OFF;
|
|
|
|
|
|
|
|
protected TileEntityMachine(int slots, MachineResource ... resources) {
|
|
|
|
this.inventory = new ItemStack[slots];
|
|
|
|
this.resources = resources;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected abstract int getTempIncrement();
|
|
|
|
protected abstract int getTempDecrement();
|
|
|
|
protected abstract int getMaxTemp();
|
|
|
|
protected abstract boolean executeFunction();
|
|
|
|
|
|
|
|
public MachineResource getResource(int slot) {
|
|
|
|
return this.resources[slot];
|
|
|
|
}
|
|
|
|
|
|
|
|
// public void setCreative(boolean creative) {
|
|
|
|
// this.isCreative = creative;
|
|
|
|
// }
|
|
|
|
//
|
|
|
|
// public boolean isCreative() {
|
|
|
|
// return this.isCreative;
|
|
|
|
// }
|
|
|
|
|
|
|
|
public int getNumResources() {
|
|
|
|
return this.resources.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getTemperature() {
|
|
|
|
return this.temperature;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setTemperature(int temp) {
|
|
|
|
this.temperature = temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Status getStatus() {
|
|
|
|
return this.status;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setStatus(Status status) {
|
|
|
|
this.status = status;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void readFromNBT(NBTTagCompound compound) {
|
|
|
|
super.readFromNBT(compound);
|
|
|
|
|
|
|
|
NBTTagList nbttaglist = compound.getTagList("Items", 10);
|
|
|
|
this.clear();
|
|
|
|
for(int i = 0; i < nbttaglist.tagCount(); ++i) {
|
|
|
|
NBTTagCompound nbttagcompound = nbttaglist.getCompoundTagAt(i);
|
|
|
|
int j = nbttagcompound.getByte("Slot");
|
|
|
|
|
|
|
|
if(j >= 0 && j < this.inventory.length) {
|
|
|
|
this.inventory[j] = ItemStack.loadItemStackFromNBT(nbttagcompound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nbttaglist = compound.getTagList("Resources", 10);
|
|
|
|
for(MachineResource res : this.resources) {
|
|
|
|
res.reset();
|
|
|
|
}
|
|
|
|
for(int i = 0; i < nbttaglist.tagCount() && i < this.inventory.length; ++i) {
|
|
|
|
this.resources[i].readFromNbt(nbttaglist.getCompoundTagAt(i));
|
|
|
|
}
|
|
|
|
|
|
|
|
// this.isCreative = compound.getBoolean("Creative");
|
|
|
|
this.temperature = compound.getInteger("Temperature");
|
|
|
|
this.status = Status.values()[(int)compound.getByte("Status") % Status.values().length];
|
|
|
|
}
|
|
|
|
|
|
|
|
public void writeToNBT(NBTTagCompound compound) {
|
|
|
|
super.writeToNBT(compound);
|
|
|
|
|
|
|
|
NBTTagList nbttaglist = new NBTTagList();
|
|
|
|
for(int i = 0; i < this.inventory.length; ++i) {
|
|
|
|
if(this.inventory[i] != null) {
|
|
|
|
NBTTagCompound nbttagcompound = new NBTTagCompound();
|
|
|
|
nbttagcompound.setByte("Slot", (byte)i);
|
|
|
|
this.inventory[i].writeToNBT(nbttagcompound);
|
|
|
|
nbttaglist.appendTag(nbttagcompound);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
compound.setTag("Items", nbttaglist);
|
|
|
|
|
|
|
|
nbttaglist = new NBTTagList();
|
|
|
|
for(int z = 0; z < this.resources.length; z++) {
|
|
|
|
NBTTagCompound res = new NBTTagCompound();
|
|
|
|
this.resources[z].writeToNbt(res);
|
|
|
|
nbttaglist.appendTag(res);
|
|
|
|
}
|
|
|
|
compound.setTag("Resources", nbttaglist);
|
|
|
|
|
|
|
|
// compound.setBoolean("Creative", this.isCreative);
|
|
|
|
compound.setInteger("Temperature", this.temperature);
|
|
|
|
compound.setByte("Status", (byte)this.status.ordinal());
|
|
|
|
}
|
|
|
|
|
|
|
|
// public void markDirty()
|
|
|
|
// {
|
|
|
|
// super.markDirty();
|
|
|
|
// }
|
|
|
|
|
|
|
|
public int getSizeInventory() {
|
|
|
|
return this.inventory.length;
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemStack getStackInSlot(int index) {
|
|
|
|
return this.inventory[index];
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemStack decrStackSize(int index, int count) {
|
|
|
|
if(this.inventory[index] != null) {
|
|
|
|
if(this.inventory[index].stackSize <= count) {
|
|
|
|
ItemStack itemstack1 = this.inventory[index];
|
|
|
|
this.inventory[index] = null;
|
|
|
|
return itemstack1;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
ItemStack itemstack = this.inventory[index].splitStack(count);
|
|
|
|
|
|
|
|
if(this.inventory[index].stackSize == 0) {
|
|
|
|
this.inventory[index] = null;
|
|
|
|
}
|
|
|
|
|
|
|
|
return itemstack;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public ItemStack removeStackFromSlot(int index) {
|
|
|
|
if(this.inventory[index] != null) {
|
|
|
|
ItemStack itemstack = this.inventory[index];
|
|
|
|
this.inventory[index] = null;
|
|
|
|
return itemstack;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setInventorySlotContents(int index, ItemStack stack) {
|
|
|
|
this.inventory[index] = stack;
|
|
|
|
|
|
|
|
if(stack != null && stack.stackSize > this.getInventoryStackLimit()) {
|
|
|
|
stack.stackSize = this.getInventoryStackLimit();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasCustomName() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getInventoryStackLimit() {
|
|
|
|
return ItemStack.MAX_SIZE;
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isUseableByPlayer(EntityNPC player) {
|
|
|
|
return this.worldObj.getTileEntity(this.pos) != this ? false
|
|
|
|
: player.getDistanceSq((double)this.pos.getX() + 0.5D, (double)this.pos.getY() + 0.5D, (double)this.pos.getZ() + 0.5D) <= 64.0D;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void openInventory(EntityNPC player) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public void closeInventory(EntityNPC player) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isItemValidForSlot(int index, ItemStack stack) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void detonate() {
|
|
|
|
this.worldObj.newExplosion(null, this.getXPos(), this.getYPos(), this.getZPos(), 5.0f, true, true, false);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void update() {
|
|
|
|
if(this.worldObj != null && !this.worldObj.client && this.status != Status.BROKEN) {
|
|
|
|
int envTemp = (int)this.worldObj.getTemperatureC(this.getPos());
|
|
|
|
if(this.executeFunction()) {
|
|
|
|
this.temperature += this.getTempIncrement();
|
|
|
|
this.status = this.temperature >= (this.getMaxTemp() * 9) / 10 ? Status.OVERHEAT : Status.RUNNING;
|
|
|
|
if(this.temperature > this.getMaxTemp()) {
|
|
|
|
this.status = Status.BROKEN;
|
|
|
|
this.markDirty();
|
|
|
|
this.detonate();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
this.markDirty();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
int dec = this.getTempDecrement();
|
|
|
|
if(dec != 0) {
|
|
|
|
int prev = this.temperature;
|
|
|
|
this.temperature -= dec;
|
|
|
|
this.temperature = ExtMath.clampi(this.temperature, envTemp, Integer.MAX_VALUE);
|
|
|
|
if(prev != this.temperature)
|
|
|
|
this.markDirty();
|
|
|
|
else
|
|
|
|
dec = 0;
|
|
|
|
}
|
|
|
|
Status prev = this.status;
|
|
|
|
this.status = this.temperature >= (this.getMaxTemp() * 9) / 10 ? Status.OVERHEAT :
|
|
|
|
(this.temperature == envTemp ? Status.OFF : Status.COOLING);
|
|
|
|
if(dec == 0 && prev != this.status) {
|
|
|
|
this.markDirty();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(this.temperature < envTemp) {
|
|
|
|
this.temperature = envTemp;
|
|
|
|
this.markDirty();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isEmpty(int slot) {
|
|
|
|
if(slot == -1) {
|
|
|
|
for(ItemStack itemstack : this.inventory) {
|
|
|
|
if(itemstack != null)
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return this.inventory[slot] == null || this.inventory[slot].stackSize <= 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean hasAmount(int slot, int amount) {
|
|
|
|
if(slot == -1) {
|
|
|
|
int n = 0;
|
|
|
|
for(ItemStack itemstack : this.inventory) {
|
|
|
|
if(itemstack != null && itemstack.stackSize >= 1)
|
|
|
|
n += itemstack.stackSize;
|
|
|
|
}
|
|
|
|
return n >= amount;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
return this.inventory[slot] != null && this.inventory[slot].stackSize >= amount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public boolean isFull() {
|
|
|
|
for(ItemStack itemstack : this.inventory) {
|
|
|
|
if(itemstack == null || itemstack.stackSize != itemstack.getMaxStackSize()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
public double getXPos() {
|
|
|
|
return (double)this.pos.getX() + 0.5D;
|
|
|
|
}
|
|
|
|
|
|
|
|
public double getYPos() {
|
|
|
|
return (double)this.pos.getY() + 0.5D;
|
|
|
|
}
|
|
|
|
|
|
|
|
public double getZPos() {
|
|
|
|
return (double)this.pos.getZ() + 0.5D;
|
|
|
|
}
|
|
|
|
|
|
|
|
public Container createContainer(InventoryPlayer playerInventory, EntityNPC playerIn) {
|
|
|
|
return new ContainerMachine(playerInventory, this, this, playerIn);
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getField(int id) {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setField(int id, int value) {
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getFieldCount() {
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void clear() {
|
|
|
|
for(int i = 0; i < this.inventory.length; ++i) {
|
|
|
|
this.inventory[i] = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public Packet getDescriptionPacket()
|
|
|
|
{
|
|
|
|
return new S35PacketUpdateTileEntity(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
public int getColor() {
|
|
|
|
return 0x8080ff;
|
|
|
|
}
|
|
|
|
|
|
|
|
public abstract String formatDisplay();
|
|
|
|
}
|