2023-02-23 10:02:41 -08:00

197 lines
4.9 KiB
Java

package com.hbm.tileentity.machine;
import com.hbm.blocks.machine.MachineDiFurnaceRTG;
import com.hbm.inventory.container.ContainerMachineDiFurnaceRTG;
import com.hbm.inventory.gui.GUIMachineDiFurnaceRTG;
import com.hbm.inventory.recipes.BlastFurnaceRecipes;
import com.hbm.tileentity.IGUIProvider;
import com.hbm.tileentity.TileEntityMachineBase;
import com.hbm.util.RTGUtil;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.world.World;
public class TileEntityDiFurnaceRTG extends TileEntityMachineBase implements IGUIProvider
{
public short progress;
private short processSpeed = 0;
// Edit as needed
private static final short timeRequired = 1200;
private static final int[] rtgIn = new int[] {3, 4, 5, 6, 7, 8};
private String name;
public TileEntityDiFurnaceRTG() {
super(9);
}
public boolean canProcess() {
if ((slots[0] == null || slots[1] == null) && !hasPower())
return false;
ItemStack recipeResult = BlastFurnaceRecipes.getOutput(slots[0], slots[1]);
if (recipeResult == null)
return false;
else if (slots[2] == null)
return true;
else if (!slots[2].isItemEqual(recipeResult))
return false;
else if (slots[2].stackSize + recipeResult.stackSize > getInventoryStackLimit())
return false;
else if (slots[2].stackSize < getInventoryStackLimit() && slots[2].stackSize < slots[2].getMaxStackSize())
return true;
else
return slots[2].stackSize < recipeResult.getMaxStackSize();
}
@Override
public void updateEntity() {
if(worldObj.isRemote)
return;
if(canProcess() && hasPower()) {
progress += processSpeed;
if(progress >= timeRequired) {
processItem();
progress = 0;
}
} else {
progress = 0;
}
MachineDiFurnaceRTG.updateBlockState(isProcessing() || (canProcess() && hasPower()), getWorldObj(), xCoord, yCoord, zCoord);
NBTTagCompound data = new NBTTagCompound();
data.setShort("progress", progress);
data.setShort("speed", processSpeed);
networkPack(data, 10);
}
@Override
public void networkUnpack(NBTTagCompound nbt) {
progress = nbt.getShort("progress");
processSpeed = nbt.getShort("speed");
}
private void processItem() {
if(canProcess()) {
ItemStack recipeOut = BlastFurnaceRecipes.getOutput(slots[0], slots[1]);
if(slots[2] == null)
slots[2] = recipeOut.copy();
else if(slots[2].isItemEqual(recipeOut))
slots[2].stackSize += recipeOut.stackSize;
for(int i = 0; i < 2; i++) {
if(slots[i].stackSize <= 0)
slots[i] = new ItemStack(slots[i].getItem().setFull3D());
else
slots[i].stackSize--;
if(slots[i].stackSize <= 0)
slots[i] = null;
}
markDirty();
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
progress = nbt.getShort("progress");
processSpeed = nbt.getShort("speed");
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
nbt.setShort("progress", progress);
nbt.setShort("speed", processSpeed);
}
public int getDiFurnaceProgressScaled(int i) {
return (progress * i) / timeRequired;
}
@Override
public void setInventorySlotContents(int i, ItemStack stack) {
slots[i] = stack;
if(stack != null && stack.stackSize > getInventoryStackLimit()) {
stack.stackSize = getInventoryStackLimit();
}
}
@Override
public void setCustomName(String name) {
this.name = name;
}
public boolean hasPower() {
processSpeed = (short) RTGUtil.updateRTGs(slots, rtgIn);
return processSpeed >= 15;
}
public int getPower() {
return processSpeed;
}
public boolean isProcessing() {
return progress > 0;
}
@Override
public String getInventoryName() {
return this.hasCustomInventoryName() ? this.name : "container.diFurnaceRTG";
}
@Override
public boolean hasCustomInventoryName() {
return this.name != null && this.name.length() > 0;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack stack) {
if(i == 2) {
return false;
}
return true;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return side == 0 ? new int[] {2} : side == 1 ? new int[] {0} : new int[] {1};
}
@Override
public boolean canExtractItem(int slot, ItemStack stack, int side) {
return slot == 2;
}
@Override
public String getName() {
return "container.diFurnaceRTG";
}
@Override
public Container provideContainer(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new ContainerMachineDiFurnaceRTG(player.inventory, this);
}
@Override
@SideOnly(Side.CLIENT)
public GuiScreen provideGUI(int ID, EntityPlayer player, World world, int x, int y, int z) {
return new GUIMachineDiFurnaceRTG(player.inventory, this);
}
}