package crazypants.enderio.machine.enchanter;
import java.util.List;
import net.minecraft.enchantment.EnchantmentData;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.init.Items;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import com.enderio.core.client.gui.widget.GhostBackgroundItemSlot;
import com.enderio.core.client.gui.widget.GhostSlot;
import com.enderio.core.common.ContainerEnder;
import crazypants.enderio.EnderIO;
public class ContainerEnchanter extends ContainerEnder<TileEnchanter> {
public ContainerEnchanter(EntityPlayer player, InventoryPlayer playerInv, TileEnchanter te) {
super(playerInv, te);
}
@Override
protected void addSlots(InventoryPlayer playerInv) {
final TileEnchanter te = getInv();
addSlotToContainer(new Slot(te, 0, 27, 35) {
@Override
public int getSlotStackLimit() {
return 1;
}
@Override
public boolean isItemValid(ItemStack itemStack) {
return te.isItemValidForSlot(0, itemStack);
}
@Override
public void onSlotChanged() {
updateOutput();
}
});
addSlotToContainer(new Slot(te, 1, 76, 35) {
@Override
public boolean isItemValid(ItemStack itemStack) {
return te.isItemValidForSlot(1, itemStack);
}
@Override
public void onSlotChanged() {
updateOutput();
}
});
addSlotToContainer(new Slot(te, 2, 134, 35) {
@Override
public int getSlotStackLimit() {
return 1;
}
@Override
public boolean isItemValid(ItemStack itemStack) {
return false;
}
@Override
public void onPickupFromSlot(EntityPlayer player, ItemStack stack) {
if(!player.capabilities.isCreativeMode) {
player.addExperienceLevel(-te.getCurrentEnchantmentCost());
}
EnchantmentData enchData = te.getCurrentEnchantmentData();
EnchanterRecipe recipe = te.getCurrentEnchantmentRecipe();
ItemStack curStack = te.getStackInSlot(1);
if(recipe == null || enchData == null || curStack == null || enchData.enchantmentLevel >= curStack.stackSize) {
te.setInventorySlotContents(1, (ItemStack) null);
} else {
curStack = curStack.copy();
curStack.stackSize -= recipe.getItemsPerLevel() * enchData.enchantmentLevel;
if(curStack.stackSize > 0) {
te.setInventorySlotContents(1, curStack);
} else {
te.setInventorySlotContents(1, null);
}
te.markDirty();
}
te.setInventorySlotContents(0, (ItemStack) null);
if (!te.getWorldObj().isRemote) {
te.getWorldObj().playAuxSFX(1021, te.xCoord, te.yCoord, te.zCoord, 0);
}
}
@Override
public boolean canTakeStack(EntityPlayer player) {
return playerHasEnoughLevels(player);
}
});
}
public void createGhostSlots(List<GhostSlot> slots) {
slots.add(new GhostBackgroundItemSlot(Items.writable_book, 27, 35));
}
public boolean playerHasEnoughLevels(EntityPlayer player) {
if(player.capabilities.isCreativeMode) {
return true;
}
return player.experienceLevel >= getInv().getCurrentEnchantmentCost();
}
private void updateOutput() {
ItemStack output = null;
EnchantmentData enchantment = getInv().getCurrentEnchantmentData();
if(enchantment != null) {
output = new ItemStack(Items.enchanted_book);
Items.enchanted_book.addEnchantment(output, enchantment);
}
getInv().setOutput(output);
}
@Override
public ItemStack transferStackInSlot(EntityPlayer par1EntityPlayer, int par2) {
ItemStack copyStack = null;
Slot slot = (Slot) inventorySlots.get(par2);
if (slot != null && slot.getHasStack()) {
ItemStack origStack = slot.getStack();
copyStack = origStack.copy();
if (par2 <= 2) {
if (!mergeItemStack(origStack, 2, inventorySlots.size(), true)) {
return null;
}
} else {
if (!getInv().isItemValidForSlot(0, origStack) || !mergeItemStack(origStack, 0, 1, false)) {
if (!getInv().isItemValidForSlot(1, origStack) || !mergeItemStack(origStack, 1, 2, false)) {
return null;
}
}
}
if (origStack.stackSize == 0) {
slot.putStack((ItemStack) null);
} else {
slot.onSlotChanged();
}
slot.onPickupFromSlot(par1EntityPlayer, origStack);
}
return copyStack;
}
}