package buildcraftAdditions.tileEntities.Bases;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile;
import buildcraftAdditions.api.configurableOutput.EnumPriority;
import buildcraftAdditions.api.configurableOutput.EnumSideStatus;
import buildcraftAdditions.api.configurableOutput.IConfigurableOutput;
import buildcraftAdditions.api.configurableOutput.SideConfiguration;
import buildcraftAdditions.api.recipe.BCARecipeManager;
import buildcraftAdditions.utils.Location;
import buildcraftAdditions.utils.Utils;
/**
* Copyright (c) 2014-2015, AEnterprise
* http://buildcraftadditions.wordpress.com/
* Buildcraft Additions is distributed under the terms of GNU GPL v3.0
* Please check the contents of the license located in
* http://buildcraftadditions.wordpress.com/wiki/licensing-stuff/
*/
public abstract class TileDusterWithConfigurableOutput extends TileBaseDuster implements IConfigurableOutput, IPipeConnection {
protected final SideConfiguration configuration = new SideConfiguration();
public TileDusterWithConfigurableOutput(String key, int identifier) {
super(key, identifier);
}
@Override
public void readFromNBT(NBTTagCompound tag) {
super.readFromNBT(tag);
configuration.readFromNBT(tag);
}
@Override
public void writeToNBT(NBTTagCompound tag) {
super.writeToNBT(tag);
configuration.writeToNBT(tag);
}
@Override
public EnumSideStatus getStatus(ForgeDirection side) {
return configuration.getStatus(side);
}
@Override
public void changeStatus(ForgeDirection side) {
configuration.changeStatus(side);
}
@Override
public void writeToByteBuff(ByteBuf buf) {
super.writeToByteBuff(buf);
configuration.writeToByteBuff(buf);
}
@Override
public void readFromByteBuff(ByteBuf buf) {
super.readFromByteBuff(buf);
configuration.readFromByteBuff(buf);
}
@Override
public boolean isItemValidForSlot(int slot, ItemStack stack) {
return BCARecipeManager.duster.getRecipe(stack) != null;
}
@Override
public int[] getAccessibleSlotsFromSide(int side) {
return configuration.canReceive(ForgeDirection.getOrientation(side)) ? new int[]{0} : new int[0];
}
@Override
public boolean canInsertItem(int slot, ItemStack stack, int side) {
return configuration.canReceive(ForgeDirection.getOrientation(side)) && isItemValidForSlot(slot, stack);
}
@Override
public boolean canExtractItem(int slot, ItemStack item, int side) {
return configuration.canSend(ForgeDirection.getOrientation(side));
}
@Override
public EnumPriority getPriority(ForgeDirection side) {
return configuration.getPriority(side);
}
@Override
public void changePriority(ForgeDirection side) {
configuration.changePriority(side);
}
@Override
public void dust() {
if (worldObj.isRemote) return;
ItemStack output = BCARecipeManager.duster.getRecipe(getStackInSlot(0)).getOutput(getStackInSlot(0));
Utils.outputStack(new Location(this), output, configuration);
if (output != null && output.stackSize > 0 && output.getItem() != null)
Utils.dropItemstack(worldObj, xCoord, yCoord, zCoord, output);
setInventorySlotContents(0, null);
}
@Override
public SideConfiguration getSideConfiguration() {
return configuration;
}
@Override
public void setSideConfiguration(SideConfiguration configuration) {
this.configuration.load(configuration);
}
@Override
public ConnectOverride overridePipeConnection(IPipeTile.PipeType type, ForgeDirection with) {
EnumSideStatus status = getStatus(with);
return type == IPipeTile.PipeType.ITEM && (status.canSend() || status.canReceive()) ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
}
}