package game.inventory; import java.util.List; import game.enchantment.EnchantmentHelper; import game.enchantment.RngEnchantment; import game.entity.npc.EntityNPC; import game.init.Blocks; import game.init.Items; import game.item.ItemStack; import game.rng.Random; import game.world.BlockPos; import game.world.World; public class ContainerEnchantment extends Container { /** SlotEnchantmentTable object with ItemStack to be enchanted */ public IInventory tableInventory; /** current world (for bookshelf counting) */ private World worldPointer; private BlockPos position; private Random rand; public int xpSeed; /** 3-member array storing the enchantment levels of each slot */ public int[] enchantLevels; public int[] enchantmentIds; public ContainerEnchantment(InventoryPlayer playerInv, World worldIn) { this(playerInv, worldIn, BlockPos.ORIGIN); } public ContainerEnchantment(InventoryPlayer playerInv, World worldIn, BlockPos pos) { this.tableInventory = new InventoryBasic("Enchant", true, 1) { public int getInventoryStackLimit() { return ItemStack.MAX_SIZE; } public void markDirty() { super.markDirty(); ContainerEnchantment.this.onCraftMatrixChanged(this); } }; this.rand = new Random(); this.enchantLevels = new int[3]; this.enchantmentIds = new int[] { -1, -1, -1}; this.worldPointer = worldIn; this.position = pos; this.xpSeed = playerInv.player.getXPSeed(); this.addSlotToContainer(new Slot(this.tableInventory, 0, 25, 47) { public boolean isItemValid(ItemStack stack) { return true; } public int getSlotStackLimit() { return 1; } }); // this.addSlotToContainer(new Slot(this.tableInventory, 1, 35, 47) // { // public boolean isItemValid(ItemStack stack) // { // return stack.getItem() == Items.dye && EnumDyeColor.byDyeDamage(stack.getMetadata()) == EnumDyeColor.BLUE; // } // }); for (int i = 0; i < 3; ++i) { for (int j = 0; j < 9; ++j) { this.addSlotToContainer(new Slot(playerInv, j + i * 9 + 9, 8 + j * 18, 84 + i * 18)); } } for (int k = 0; k < 9; ++k) { this.addSlotToContainer(new Slot(playerInv, k, 8 + k * 18, 142)); } } public void onCraftGuiOpened(ICrafting listener) { super.onCraftGuiOpened(listener); listener.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); listener.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); listener.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); listener.sendProgressBarUpdate(this, 3, this.xpSeed & -16); listener.sendProgressBarUpdate(this, 4, this.enchantmentIds[0]); listener.sendProgressBarUpdate(this, 5, this.enchantmentIds[1]); listener.sendProgressBarUpdate(this, 6, this.enchantmentIds[2]); } /** * Looks for changes made in the container, sends them to every listener. */ public void detectAndSendChanges() { super.detectAndSendChanges(); for (int i = 0; i < this.crafters.size(); ++i) { ICrafting icrafting = (ICrafting)this.crafters.get(i); icrafting.sendProgressBarUpdate(this, 0, this.enchantLevels[0]); icrafting.sendProgressBarUpdate(this, 1, this.enchantLevels[1]); icrafting.sendProgressBarUpdate(this, 2, this.enchantLevels[2]); icrafting.sendProgressBarUpdate(this, 3, this.xpSeed & -16); icrafting.sendProgressBarUpdate(this, 4, this.enchantmentIds[0]); icrafting.sendProgressBarUpdate(this, 5, this.enchantmentIds[1]); icrafting.sendProgressBarUpdate(this, 6, this.enchantmentIds[2]); } } public void updateProgressBar(int id, int data) { if (id >= 0 && id <= 2) { this.enchantLevels[id] = data; } else if (id == 3) { this.xpSeed = data; } else if (id >= 4 && id <= 6) { this.enchantmentIds[id - 4] = data; } else { super.updateProgressBar(id, data); } } /** * Callback for when the crafting matrix is changed. */ public void onCraftMatrixChanged(IInventory inventoryIn) { if (inventoryIn == this.tableInventory) { ItemStack itemstack = inventoryIn.getStackInSlot(0); if (itemstack != null && itemstack.isItemEnchantable()) { if (!this.worldPointer.client) { int l = 0; for (int j = -1; j <= 1; ++j) { for (int k = -1; k <= 1; ++k) { if ((j != 0 || k != 0) && this.worldPointer.isAirBlock(this.position.add(k, 0, j)) && this.worldPointer.isAirBlock(this.position.add(k, 1, j))) { if (this.worldPointer.getState(this.position.add(k * 2, 0, j * 2)).getBlock() == Blocks.bookshelf) { ++l; } if (this.worldPointer.getState(this.position.add(k * 2, 1, j * 2)).getBlock() == Blocks.bookshelf) { ++l; } if (k != 0 && j != 0) { if (this.worldPointer.getState(this.position.add(k * 2, 0, j)).getBlock() == Blocks.bookshelf) { ++l; } if (this.worldPointer.getState(this.position.add(k * 2, 1, j)).getBlock() == Blocks.bookshelf) { ++l; } if (this.worldPointer.getState(this.position.add(k, 0, j * 2)).getBlock() == Blocks.bookshelf) { ++l; } if (this.worldPointer.getState(this.position.add(k, 1, j * 2)).getBlock() == Blocks.bookshelf) { ++l; } } } } } this.rand.setSeed((long)this.xpSeed); for (int i1 = 0; i1 < 3; ++i1) { this.enchantLevels[i1] = EnchantmentHelper.calcItemStackEnchantability(this.rand, i1, l, itemstack); this.enchantmentIds[i1] = -1; if (this.enchantLevels[i1] < i1 + 1) { this.enchantLevels[i1] = 0; } } for (int j1 = 0; j1 < 3; ++j1) { if (this.enchantLevels[j1] > 0) { List list = this.getRandomEnchantments(itemstack, j1, this.enchantLevels[j1]); if (list != null && !list.isEmpty()) { RngEnchantment enchantmentdata = (RngEnchantment)list.get(this.rand.zrange(list.size())); this.enchantmentIds[j1] = enchantmentdata.enchantmentobj.effectId | enchantmentdata.enchantmentLevel << 8; } } } this.detectAndSendChanges(); } } else { for (int i = 0; i < 3; ++i) { this.enchantLevels[i] = 0; this.enchantmentIds[i] = -1; } } } } /** * Handles the given Button-click on the server, currently only used by enchanting. Name is for legacy. */ public boolean enchantItem(EntityNPC playerIn, int id) { ItemStack itemstack = this.tableInventory.getStackInSlot(0); // ItemStack itemstack1 = this.tableInventory.getStackInSlot(1); int i = id + 1; // if ((itemstack1 == null || itemstack1.stackSize < i) && !playerIn.capabilities.isCreativeMode) // { // return false; // } // else if (this.enchantLevels[id] > 0 && itemstack != null && /* ( */ playerIn.experienceLevel >= i && playerIn.experienceLevel >= this.enchantLevels[id]) // || playerIn.creative)) { if (!this.worldPointer.client) { List list = this.getRandomEnchantments(itemstack, id, this.enchantLevels[id]); boolean flag = itemstack.getItem() == Items.book; if (list != null) { playerIn.removeExperienceLevel(i); if (flag) { itemstack.setItem(Items.enchanted_book); } for (int j = 0; j < list.size(); ++j) { RngEnchantment enchantmentdata = (RngEnchantment)list.get(j); if (flag) { Items.enchanted_book.addEnchantment(itemstack, enchantmentdata); } else { itemstack.addEnchantment(enchantmentdata.enchantmentobj, enchantmentdata.enchantmentLevel); } } // if (!playerIn.capabilities.isCreativeMode) // { // itemstack1.stackSize -= i; // // if (itemstack1.stackSize <= 0) // { // this.tableInventory.setInventorySlotContents(1, (ItemStack)null); // } // } // playerIn.triggerAchievement(StatRegistry.enchantedStat); this.tableInventory.markDirty(); this.xpSeed = playerIn.getXPSeed(); this.onCraftMatrixChanged(this.tableInventory); } } return true; } else { return false; } } private List getRandomEnchantments(ItemStack stack, int id, int level) { this.rand.setSeed((long)(this.xpSeed + id)); List list = EnchantmentHelper.buildEnchantmentList(this.rand, stack, level); if (stack.getItem() == Items.book && list != null && list.size() > 1) { list.remove(this.rand.zrange(list.size())); } return list; } // public int getLapisAmount() // { // ItemStack itemstack = this.tableInventory.getStackInSlot(1); // return itemstack == null ? 0 : itemstack.stackSize; // } /** * Called when the container is closed. */ public void onContainerClosed(EntityNPC playerIn) { super.onContainerClosed(playerIn); if (!this.worldPointer.client) { for (int i = 0; i < this.tableInventory.getSizeInventory(); ++i) { ItemStack itemstack = this.tableInventory.removeStackFromSlot(i); if (itemstack != null) { playerIn.dropPlayerItemWithRandomChoice(itemstack, false); } } } } public boolean canInteractWith(EntityNPC playerIn) { return this.worldPointer.getState(this.position).getBlock() != Blocks.enchanting_table ? false : playerIn.getDistanceSq((double)this.position.getX() + 0.5D, (double)this.position.getY() + 0.5D, (double)this.position.getZ() + 0.5D) <= 64.0D; } /** * Take a stack from the specified inventory slot. */ public ItemStack transferStackInSlot(EntityNPC playerIn, int index) { ItemStack itemstack = null; Slot slot = (Slot)this.inventorySlots.get(index); if (slot != null && slot.getHasStack()) { ItemStack itemstack1 = slot.getStack(); itemstack = itemstack1.copy(); if (index == 0) { if (!this.mergeItemStack(itemstack1, 1, 37, true)) { return null; } } // else if (index == 1) // { // if (!this.mergeItemStack(itemstack1, 2, 38, true)) // { // return null; // } // } // else if (itemstack1.getItem() == Items.dye && EnumDyeColor.byDyeDamage(itemstack1.getMetadata()) == EnumDyeColor.BLUE) // { // if (!this.mergeItemStack(itemstack1, 1, 2, true)) // { // return null; // } // } else { if (((Slot)this.inventorySlots.get(0)).getHasStack() || !((Slot)this.inventorySlots.get(0)).isItemValid(itemstack1)) { return null; } if (itemstack1.hasTagCompound() && itemstack1.stackSize == 1) { ((Slot)this.inventorySlots.get(0)).putStack(itemstack1.copy()); itemstack1.stackSize = 0; } else if (itemstack1.stackSize >= 1) { ((Slot)this.inventorySlots.get(0)).putStack(new ItemStack(itemstack1.getItem(), 1, itemstack1.getMetadata())); --itemstack1.stackSize; } } if (itemstack1.stackSize == 0) { slot.putStack((ItemStack)null); } else { slot.onSlotChanged(); } if (itemstack1.stackSize == itemstack.stackSize) { return null; } slot.onPickupFromSlot(playerIn, itemstack1); } return itemstack; } }