package net.minecraft.inventory; import java.util.List; import java.util.Random; import net.minecraft.enchantment.EnchantmentData; import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.EnumDyeColor; import net.minecraft.item.ItemStack; import net.minecraft.util.BlockPos; import net.minecraft.world.World; public class ContainerEnchantment extends Container { /** SlotEnchantmentTable object with ItemStack to be enchanted */ public IInventory tableInventory = new InventoryBasic("Enchant", true, 2) { private static final String __OBFID = "CL_00001746"; public int getInventoryStackLimit() { return 64; } public void markDirty() { super.markDirty(); ContainerEnchantment.this.onCraftMatrixChanged(this); } }; /** current world (for bookshelf counting) */ private World worldPointer; private BlockPos field_178150_j; private Random rand = new Random(); public int field_178149_f; /** 3-member array storing the enchantment levels of each slot */ public int[] enchantLevels = new int[3]; public int[] field_178151_h = new int[] { -1, -1, -1}; private static final String __OBFID = "CL_00001745"; public ContainerEnchantment(InventoryPlayer p_i45798_1_, World worldIn, BlockPos p_i45798_3_) { this.worldPointer = worldIn; this.field_178150_j = p_i45798_3_; this.field_178149_f = p_i45798_1_.player.func_175138_ci(); this.addSlotToContainer(new Slot(this.tableInventory, 0, 15, 47) { private static final String __OBFID = "CL_00001747"; public boolean isItemValid(ItemStack stack) { return true; } public int getSlotStackLimit() { return 1; } }); this.addSlotToContainer(new Slot(this.tableInventory, 1, 35, 47) { private static final String __OBFID = "CL_00002185"; public boolean isItemValid(ItemStack stack) { return stack.getItem() == Items.dye && EnumDyeColor.func_176766_a(stack.getMetadata()) == EnumDyeColor.BLUE; } }); int var4; for (var4 = 0; var4 < 3; ++var4) { for (int var5 = 0; var5 < 9; ++var5) { this.addSlotToContainer(new Slot(p_i45798_1_, var5 + var4 * 9 + 9, 8 + var5 * 18, 84 + var4 * 18)); } } for (var4 = 0; var4 < 9; ++var4) { this.addSlotToContainer(new Slot(p_i45798_1_, var4, 8 + var4 * 18, 142)); } } public void onCraftGuiOpened(ICrafting p_75132_1_) { super.onCraftGuiOpened(p_75132_1_); p_75132_1_.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); p_75132_1_.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); p_75132_1_.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); p_75132_1_.sendProgressBarUpdate(this, 3, this.field_178149_f & -16); p_75132_1_.sendProgressBarUpdate(this, 4, this.field_178151_h[0]); p_75132_1_.sendProgressBarUpdate(this, 5, this.field_178151_h[1]); p_75132_1_.sendProgressBarUpdate(this, 6, this.field_178151_h[2]); } /** * Looks for changes made in the container, sends them to every listener. */ public void detectAndSendChanges() { super.detectAndSendChanges(); for (int var1 = 0; var1 < this.crafters.size(); ++var1) { ICrafting var2 = (ICrafting)this.crafters.get(var1); var2.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); var2.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); var2.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); var2.sendProgressBarUpdate(this, 3, this.field_178149_f & -16); var2.sendProgressBarUpdate(this, 4, this.field_178151_h[0]); var2.sendProgressBarUpdate(this, 5, this.field_178151_h[1]); var2.sendProgressBarUpdate(this, 6, this.field_178151_h[2]); } } /** * Callback for when the crafting matrix is changed. */ public void onCraftMatrixChanged(IInventory p_75130_1_) { if (p_75130_1_ == this.tableInventory) { ItemStack var2 = p_75130_1_.getStackInSlot(0); int var3; if (var2 != null && var2.isItemEnchantable()) { if (!this.worldPointer.isRemote) { var3 = 0; int var4; for (var4 = -1; var4 <= 1; ++var4) { for (int var5 = -1; var5 <= 1; ++var5) { if ((var4 != 0 || var5 != 0) && this.worldPointer.isAirBlock(this.field_178150_j.add(var5, 0, var4)) && this.worldPointer.isAirBlock(this.field_178150_j.add(var5, 1, var4))) { if (this.worldPointer.getBlockState(this.field_178150_j.add(var5 * 2, 0, var4 * 2)).getBlock() == Blocks.bookshelf) { ++var3; } if (this.worldPointer.getBlockState(this.field_178150_j.add(var5 * 2, 1, var4 * 2)).getBlock() == Blocks.bookshelf) { ++var3; } if (var5 != 0 && var4 != 0) { if (this.worldPointer.getBlockState(this.field_178150_j.add(var5 * 2, 0, var4)).getBlock() == Blocks.bookshelf) { ++var3; } if (this.worldPointer.getBlockState(this.field_178150_j.add(var5 * 2, 1, var4)).getBlock() == Blocks.bookshelf) { ++var3; } if (this.worldPointer.getBlockState(this.field_178150_j.add(var5, 0, var4 * 2)).getBlock() == Blocks.bookshelf) { ++var3; } if (this.worldPointer.getBlockState(this.field_178150_j.add(var5, 1, var4 * 2)).getBlock() == Blocks.bookshelf) { ++var3; } } } } } this.rand.setSeed((long)this.field_178149_f); for (var4 = 0; var4 < 3; ++var4) { this.enchantLevels[var4] = EnchantmentHelper.calcItemStackEnchantability(this.rand, var4, var3, var2); this.field_178151_h[var4] = -1; if (this.enchantLevels[var4] < var4 + 1) { this.enchantLevels[var4] = 0; } } for (var4 = 0; var4 < 3; ++var4) { if (this.enchantLevels[var4] > 0) { List var7 = this.func_178148_a(var2, var4, this.enchantLevels[var4]); if (var7 != null && !var7.isEmpty()) { EnchantmentData var6 = (EnchantmentData)var7.get(this.rand.nextInt(var7.size())); this.field_178151_h[var4] = var6.enchantmentobj.effectId | var6.enchantmentLevel << 8; } } } this.detectAndSendChanges(); } } else { for (var3 = 0; var3 < 3; ++var3) { this.enchantLevels[var3] = 0; this.field_178151_h[var3] = -1; } } } } /** * enchants the item on the table using the specified slot; also deducts XP from player */ public boolean enchantItem(EntityPlayer playerIn, int id) { ItemStack var3 = this.tableInventory.getStackInSlot(0); ItemStack var4 = this.tableInventory.getStackInSlot(1); int var5 = id + 1; if ((var4 == null || var4.stackSize < var5) && !playerIn.capabilities.isCreativeMode) { return false; } else if (this.enchantLevels[id] > 0 && var3 != null && (playerIn.experienceLevel >= var5 && playerIn.experienceLevel >= this.enchantLevels[id] || playerIn.capabilities.isCreativeMode)) { if (!this.worldPointer.isRemote) { List var6 = this.func_178148_a(var3, id, this.enchantLevels[id]); boolean var7 = var3.getItem() == Items.book; if (var6 != null) { playerIn.func_71013_b(var5); if (var7) { var3.setItem(Items.enchanted_book); } for (int var8 = 0; var8 < var6.size(); ++var8) { EnchantmentData var9 = (EnchantmentData)var6.get(var8); if (var7) { Items.enchanted_book.addEnchantment(var3, var9); } else { var3.addEnchantment(var9.enchantmentobj, var9.enchantmentLevel); } } if (!playerIn.capabilities.isCreativeMode) { var4.stackSize -= var5; if (var4.stackSize <= 0) { this.tableInventory.setInventorySlotContents(1, (ItemStack)null); } } this.tableInventory.markDirty(); this.field_178149_f = playerIn.func_175138_ci(); this.onCraftMatrixChanged(this.tableInventory); } } return true; } else { return false; } } private List func_178148_a(ItemStack p_178148_1_, int p_178148_2_, int p_178148_3_) { this.rand.setSeed((long)(this.field_178149_f + p_178148_2_)); List var4 = EnchantmentHelper.buildEnchantmentList(this.rand, p_178148_1_, p_178148_3_); if (p_178148_1_.getItem() == Items.book && var4 != null && var4.size() > 1) { var4.remove(this.rand.nextInt(var4.size())); } return var4; } /** * Called when the container is closed. */ public void onContainerClosed(EntityPlayer p_75134_1_) { super.onContainerClosed(p_75134_1_); if (!this.worldPointer.isRemote) { for (int var2 = 0; var2 < this.tableInventory.getSizeInventory(); ++var2) { ItemStack var3 = this.tableInventory.getStackInSlotOnClosing(var2); if (var3 != null) { p_75134_1_.dropPlayerItemWithRandomChoice(var3, false); } } } } public boolean canInteractWith(EntityPlayer playerIn) { return this.worldPointer.getBlockState(this.field_178150_j).getBlock() != Blocks.enchanting_table ? false : playerIn.getDistanceSq((double)this.field_178150_j.getX() + 0.5D, (double)this.field_178150_j.getY() + 0.5D, (double)this.field_178150_j.getZ() + 0.5D) <= 64.0D; } /** * Take a stack from the specified inventory slot. */ public ItemStack transferStackInSlot(EntityPlayer playerIn, int index) { ItemStack var3 = null; Slot var4 = (Slot)this.inventorySlots.get(index); if (var4 != null && var4.getHasStack()) { ItemStack var5 = var4.getStack(); var3 = var5.copy(); if (index == 0) { if (!this.mergeItemStack(var5, 2, 38, true)) { return null; } } else if (index == 1) { if (!this.mergeItemStack(var5, 2, 38, true)) { return null; } } else if (var5.getItem() == Items.dye && EnumDyeColor.func_176766_a(var5.getMetadata()) == EnumDyeColor.BLUE) { if (!this.mergeItemStack(var5, 1, 2, true)) { return null; } } else { if (((Slot)this.inventorySlots.get(0)).getHasStack() || !((Slot)this.inventorySlots.get(0)).isItemValid(var5)) { return null; } if (var5.hasTagCompound() && var5.stackSize == 1) { ((Slot)this.inventorySlots.get(0)).putStack(var5.copy()); var5.stackSize = 0; } else if (var5.stackSize >= 1) { ((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(var5.getItem(), 1, var5.getMetadata())); --var5.stackSize; } } if (var5.stackSize == 0) { var4.putStack((ItemStack)null); } else { var4.onSlotChanged(); } if (var5.stackSize == var3.stackSize) { return null; } var4.onPickupFromSlot(playerIn, var5); } return var3; } }