package net.minecraft.inventory; import java.util.Iterator; import java.util.Map; import net.minecraft.block.BlockAnvil; import net.minecraft.block.state.IBlockState; import net.minecraft.enchantment.Enchantment; 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.ItemStack; import net.minecraft.util.BlockPos; import net.minecraft.world.World; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class ContainerRepair extends Container { private static final Logger logger = LogManager.getLogger(); /** Here comes out item you merged and/or renamed. */ private IInventory outputSlot = new InventoryCraftResult(); /** * The 2slots where you put your items in that you want to merge and/or rename. */ private IInventory inputSlots = new InventoryBasic("Repair", true, 2) { private static final String __OBFID = "CL_00001733"; public void markDirty() { super.markDirty(); ContainerRepair.this.onCraftMatrixChanged(this); } }; private World theWorld; private BlockPos field_178156_j; /** The maximum cost of repairing/renaming in the anvil. */ public int maximumCost; /** determined by damage of input item and stackSize of repair materials */ private int materialCost; private String repairedItemName; /** The player that has this container open. */ private final EntityPlayer thePlayer; private static final String __OBFID = "CL_00001732"; public ContainerRepair(InventoryPlayer p_i45807_1_, final World worldIn, final BlockPos p_i45807_3_, EntityPlayer p_i45807_4_) { this.field_178156_j = p_i45807_3_; this.theWorld = worldIn; this.thePlayer = p_i45807_4_; this.addSlotToContainer(new Slot(this.inputSlots, 0, 27, 47)); this.addSlotToContainer(new Slot(this.inputSlots, 1, 76, 47)); this.addSlotToContainer(new Slot(this.outputSlot, 2, 134, 47) { private static final String __OBFID = "CL_00001734"; public boolean isItemValid(ItemStack stack) { return false; } public boolean canTakeStack(EntityPlayer p_82869_1_) { return (p_82869_1_.capabilities.isCreativeMode || p_82869_1_.experienceLevel >= ContainerRepair.this.maximumCost) && ContainerRepair.this.maximumCost > 0 && this.getHasStack(); } public void onPickupFromSlot(EntityPlayer playerIn, ItemStack stack) { if (!playerIn.capabilities.isCreativeMode) { playerIn.addExperienceLevel(-ContainerRepair.this.maximumCost); } ContainerRepair.this.inputSlots.setInventorySlotContents(0, (ItemStack)null); if (ContainerRepair.this.materialCost > 0) { ItemStack var3 = ContainerRepair.this.inputSlots.getStackInSlot(1); if (var3 != null && var3.stackSize > ContainerRepair.this.materialCost) { var3.stackSize -= ContainerRepair.this.materialCost; ContainerRepair.this.inputSlots.setInventorySlotContents(1, var3); } else { ContainerRepair.this.inputSlots.setInventorySlotContents(1, (ItemStack)null); } } else { ContainerRepair.this.inputSlots.setInventorySlotContents(1, (ItemStack)null); } ContainerRepair.this.maximumCost = 0; IBlockState var5 = worldIn.getBlockState(p_i45807_3_); if (!playerIn.capabilities.isCreativeMode && !worldIn.isRemote && var5.getBlock() == Blocks.anvil && playerIn.getRNG().nextFloat() < 0.12F) { int var4 = ((Integer)var5.getValue(BlockAnvil.DAMAGE)).intValue(); ++var4; if (var4 > 2) { worldIn.setBlockToAir(p_i45807_3_); worldIn.playAuxSFX(1020, p_i45807_3_, 0); } else { worldIn.setBlockState(p_i45807_3_, var5.withProperty(BlockAnvil.DAMAGE, Integer.valueOf(var4)), 2); worldIn.playAuxSFX(1021, p_i45807_3_, 0); } } else if (!worldIn.isRemote) { worldIn.playAuxSFX(1021, p_i45807_3_, 0); } } }); int var5; for (var5 = 0; var5 < 3; ++var5) { for (int var6 = 0; var6 < 9; ++var6) { this.addSlotToContainer(new Slot(p_i45807_1_, var6 + var5 * 9 + 9, 8 + var6 * 18, 84 + var5 * 18)); } } for (var5 = 0; var5 < 9; ++var5) { this.addSlotToContainer(new Slot(p_i45807_1_, var5, 8 + var5 * 18, 142)); } } /** * Callback for when the crafting matrix is changed. */ public void onCraftMatrixChanged(IInventory p_75130_1_) { super.onCraftMatrixChanged(p_75130_1_); if (p_75130_1_ == this.inputSlots) { this.updateRepairOutput(); } } /** * called when the Anvil Input Slot changes, calculates the new result and puts it in the output slot */ public void updateRepairOutput() { boolean var1 = false; boolean var2 = true; boolean var3 = true; boolean var4 = true; boolean var5 = true; boolean var6 = true; boolean var7 = true; ItemStack var8 = this.inputSlots.getStackInSlot(0); this.maximumCost = 1; int var9 = 0; byte var10 = 0; byte var11 = 0; if (var8 == null) { this.outputSlot.setInventorySlotContents(0, (ItemStack)null); this.maximumCost = 0; } else { ItemStack var12 = var8.copy(); ItemStack var13 = this.inputSlots.getStackInSlot(1); Map var14 = EnchantmentHelper.getEnchantments(var12); boolean var15 = false; int var25 = var10 + var8.getRepairCost() + (var13 == null ? 0 : var13.getRepairCost()); this.materialCost = 0; int var16; if (var13 != null) { var15 = var13.getItem() == Items.enchanted_book && Items.enchanted_book.func_92110_g(var13).tagCount() > 0; int var17; int var18; if (var12.isItemStackDamageable() && var12.getItem().getIsRepairable(var8, var13)) { var16 = Math.min(var12.getItemDamage(), var12.getMaxDamage() / 4); if (var16 <= 0) { this.outputSlot.setInventorySlotContents(0, (ItemStack)null); this.maximumCost = 0; return; } for (var17 = 0; var16 > 0 && var17 < var13.stackSize; ++var17) { var18 = var12.getItemDamage() - var16; var12.setItemDamage(var18); ++var9; var16 = Math.min(var12.getItemDamage(), var12.getMaxDamage() / 4); } this.materialCost = var17; } else { if (!var15 && (var12.getItem() != var13.getItem() || !var12.isItemStackDamageable())) { this.outputSlot.setInventorySlotContents(0, (ItemStack)null); this.maximumCost = 0; return; } int var20; if (var12.isItemStackDamageable() && !var15) { var16 = var8.getMaxDamage() - var8.getItemDamage(); var17 = var13.getMaxDamage() - var13.getItemDamage(); var18 = var17 + var12.getMaxDamage() * 12 / 100; int var19 = var16 + var18; var20 = var12.getMaxDamage() - var19; if (var20 < 0) { var20 = 0; } if (var20 < var12.getMetadata()) { var12.setItemDamage(var20); var9 += 2; } } Map var26 = EnchantmentHelper.getEnchantments(var13); Iterator var27 = var26.keySet().iterator(); while (var27.hasNext()) { var18 = ((Integer)var27.next()).intValue(); Enchantment var28 = Enchantment.func_180306_c(var18); if (var28 != null) { var20 = var14.containsKey(Integer.valueOf(var18)) ? ((Integer)var14.get(Integer.valueOf(var18))).intValue() : 0; int var21 = ((Integer)var26.get(Integer.valueOf(var18))).intValue(); int var10000; if (var20 == var21) { ++var21; var10000 = var21; } else { var10000 = Math.max(var21, var20); } var21 = var10000; boolean var22 = var28.canApply(var8); if (this.thePlayer.capabilities.isCreativeMode || var8.getItem() == Items.enchanted_book) { var22 = true; } Iterator var23 = var14.keySet().iterator(); while (var23.hasNext()) { int var24 = ((Integer)var23.next()).intValue(); if (var24 != var18 && !var28.canApplyTogether(Enchantment.func_180306_c(var24))) { var22 = false; ++var9; } } if (var22) { if (var21 > var28.getMaxLevel()) { var21 = var28.getMaxLevel(); } var14.put(Integer.valueOf(var18), Integer.valueOf(var21)); int var29 = 0; switch (var28.getWeight()) { case 1: var29 = 8; break; case 2: var29 = 4; case 3: case 4: case 6: case 7: case 8: case 9: default: break; case 5: var29 = 2; break; case 10: var29 = 1; } if (var15) { var29 = Math.max(1, var29 / 2); } var9 += var29 * var21; } } } } } if (StringUtils.isBlank(this.repairedItemName)) { if (var8.hasDisplayName()) { var11 = 1; var9 += var11; var12.clearCustomName(); } } else if (!this.repairedItemName.equals(var8.getDisplayName())) { var11 = 1; var9 += var11; var12.setStackDisplayName(this.repairedItemName); } this.maximumCost = var25 + var9; if (var9 <= 0) { var12 = null; } if (var11 == var9 && var11 > 0 && this.maximumCost >= 40) { this.maximumCost = 39; } if (this.maximumCost >= 40 && !this.thePlayer.capabilities.isCreativeMode) { var12 = null; } if (var12 != null) { var16 = var12.getRepairCost(); if (var13 != null && var16 < var13.getRepairCost()) { var16 = var13.getRepairCost(); } var16 = var16 * 2 + 1; var12.setRepairCost(var16); EnchantmentHelper.setEnchantments(var14, var12); } this.outputSlot.setInventorySlotContents(0, var12); this.detectAndSendChanges(); } } public void onCraftGuiOpened(ICrafting p_75132_1_) { super.onCraftGuiOpened(p_75132_1_); p_75132_1_.sendProgressBarUpdate(this, 0, this.maximumCost); } /** * Called when the container is closed. */ public void onContainerClosed(EntityPlayer p_75134_1_) { super.onContainerClosed(p_75134_1_); if (!this.theWorld.isRemote) { for (int var2 = 0; var2 < this.inputSlots.getSizeInventory(); ++var2) { ItemStack var3 = this.inputSlots.getStackInSlotOnClosing(var2); if (var3 != null) { p_75134_1_.dropPlayerItemWithRandomChoice(var3, false); } } } } public boolean canInteractWith(EntityPlayer playerIn) { return this.theWorld.getBlockState(this.field_178156_j).getBlock() != Blocks.anvil ? false : playerIn.getDistanceSq((double)this.field_178156_j.getX() + 0.5D, (double)this.field_178156_j.getY() + 0.5D, (double)this.field_178156_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 == 2) { if (!this.mergeItemStack(var5, 3, 39, true)) { return null; } var4.onSlotChange(var5, var3); } else if (index != 0 && index != 1) { if (index >= 3 && index < 39 && !this.mergeItemStack(var5, 0, 2, false)) { return null; } } else if (!this.mergeItemStack(var5, 3, 39, false)) { return null; } if (var5.stackSize == 0) { var4.putStack((ItemStack)null); } else { var4.onSlotChanged(); } if (var5.stackSize == var3.stackSize) { return null; } var4.onPickupFromSlot(playerIn, var5); } return var3; } /** * used by the Anvil GUI to update the Item Name being typed by the player */ public void updateItemName(String p_82850_1_) { this.repairedItemName = p_82850_1_; if (this.getSlot(2).getHasStack()) { ItemStack var2 = this.getSlot(2).getStack(); if (StringUtils.isBlank(p_82850_1_)) { var2.clearCustomName(); } else { var2.setStackDisplayName(this.repairedItemName); } } this.updateRepairOutput(); } }