package mcjty.rftools.blocks.infuser;
import mcjty.lib.api.Infusable;
import mcjty.lib.base.GeneralConfig;
import mcjty.lib.container.InventoryHelper;
import mcjty.lib.entity.GenericEnergyReceiverTileEntity;
import mcjty.rftools.blocks.dimlets.DimletConfiguration;
import mcjty.rftools.blocks.dimlets.DimletSetup;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.ISidedInventory;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
public class MachineInfuserTileEntity extends GenericEnergyReceiverTileEntity implements ISidedInventory {
private InventoryHelper inventoryHelper = new InventoryHelper(this, MachineInfuserContainer.factory, 2);
private int infusing = 0;
public MachineInfuserTileEntity() {
super(DimletConfiguration.INFUSER_MAXENERGY, DimletConfiguration.INFUSER_RECEIVEPERTICK);
}
@Override
protected void checkStateServer() {
if (infusing > 0) {
infusing--;
if (infusing == 0) {
ItemStack outputStack = inventoryHelper.getStackInSlot(1);
finishInfusing(outputStack);
}
markDirty();
} else {
ItemStack inputStack = inventoryHelper.getStackInSlot(0);
ItemStack outputStack = inventoryHelper.getStackInSlot(1);
if (inputStack != null && inputStack.getItem() == DimletSetup.dimensionalShard && isInfusable(outputStack)) {
startInfusing();
}
}
}
private boolean isInfusable(ItemStack stack) {
NBTTagCompound tagCompound = getTagCompound(stack);
if (tagCompound == null) {
return false;
}
int infused = tagCompound.getInteger("infused");
if (infused >= GeneralConfig.maxInfuse) {
return false; // Already infused to the maximum.
}
return true;
}
private NBTTagCompound getTagCompound(ItemStack stack) {
if (stack == null) {
return null;
}
if (stack.stackSize != 1) {
return null;
}
Item item = stack.getItem();
if (!(item instanceof ItemBlock)) {
return null;
}
Block block = ((ItemBlock)item).field_150939_a;
if (!(block instanceof Infusable)) {
return null;
}
NBTTagCompound tagCompound = stack.getTagCompound();
if (tagCompound == null) {
return new NBTTagCompound();
} else {
return tagCompound;
}
}
private void finishInfusing(ItemStack stack) {
NBTTagCompound tagCompound = getTagCompound(stack);
if (tagCompound == null) {
return;
}
int infused = tagCompound.getInteger("infused");
tagCompound.setInteger("infused", infused+1);
stack.setTagCompound(tagCompound);
}
private void startInfusing() {
int rf = DimletConfiguration.rfInfuseOperation;
rf = (int) (rf * (2.0f - getInfusedFactor()) / 2.0f);
if (getEnergyStored(ForgeDirection.DOWN) < rf) {
// Not enough energy.
return;
}
consumeEnergy(rf);
inventoryHelper.getStackInSlot(0).splitStack(1);
if (inventoryHelper.getStackInSlot(0).stackSize == 0) {
inventoryHelper.setStackInSlot(0, null);
}
infusing = 5;
markDirty();
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return new int[] { MachineInfuserContainer.SLOT_SHARDINPUT, MachineInfuserContainer.SLOT_MACHINEOUTPUT};
}
@Override
public boolean canInsertItem(int index, ItemStack item, int side) {
return MachineInfuserContainer.factory.isInputSlot(index) || MachineInfuserContainer.factory.isSpecificItemSlot(index);
}
@Override
public boolean canExtractItem(int index, ItemStack item, int side) {
return MachineInfuserContainer.factory.isOutputSlot(index);
}
@Override
public int getSizeInventory() {
return inventoryHelper.getCount();
}
@Override
public ItemStack getStackInSlot(int index) {
return inventoryHelper.getStackInSlot(index);
}
@Override
public ItemStack decrStackSize(int index, int amount) {
return inventoryHelper.decrStackSize(index, amount);
}
@Override
public ItemStack getStackInSlotOnClosing(int index) {
return null;
}
@Override
public void setInventorySlotContents(int index, ItemStack stack) {
inventoryHelper.setInventorySlotContents(getInventoryStackLimit(), index, stack);
}
@Override
public String getInventoryName() {
return "Infuser Inventory";
}
@Override
public boolean hasCustomInventoryName() {
return false;
}
@Override
public int getInventoryStackLimit() {
return 64;
}
@Override
public boolean isUseableByPlayer(EntityPlayer player) {
return canPlayerAccess(player);
}
@Override
public void openInventory() {
}
@Override
public void closeInventory() {
}
@Override
public boolean isItemValidForSlot(int index, ItemStack stack) {
return true;
}
@Override
public void readFromNBT(NBTTagCompound tagCompound) {
super.readFromNBT(tagCompound);
}
@Override
public void readRestorableFromNBT(NBTTagCompound tagCompound) {
super.readRestorableFromNBT(tagCompound);
readBufferFromNBT(tagCompound);
infusing = tagCompound.getInteger("infusing");
}
private void readBufferFromNBT(NBTTagCompound tagCompound) {
NBTTagList bufferTagList = tagCompound.getTagList("Items", Constants.NBT.TAG_COMPOUND);
for (int i = 0 ; i < bufferTagList.tagCount() ; i++) {
NBTTagCompound nbtTagCompound = bufferTagList.getCompoundTagAt(i);
inventoryHelper.setStackInSlot(i, ItemStack.loadItemStackFromNBT(nbtTagCompound));
}
}
@Override
public void writeToNBT(NBTTagCompound tagCompound) {
super.writeToNBT(tagCompound);
}
@Override
public void writeRestorableToNBT(NBTTagCompound tagCompound) {
super.writeRestorableToNBT(tagCompound);
writeBufferToNBT(tagCompound);
tagCompound.setInteger("infusing", infusing);
}
private void writeBufferToNBT(NBTTagCompound tagCompound) {
NBTTagList bufferTagList = new NBTTagList();
for (int i = 0 ; i < inventoryHelper.getCount() ; i++) {
ItemStack stack = inventoryHelper.getStackInSlot(i);
NBTTagCompound nbtTagCompound = new NBTTagCompound();
if (stack != null) {
stack.writeToNBT(nbtTagCompound);
}
bufferTagList.appendTag(nbtTagCompound);
}
tagCompound.setTag("Items", bufferTagList);
}
}