package crazypants.enderio.block; import java.lang.reflect.Field; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ContainerRepair; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraft.world.World; import cpw.mods.fml.relauncher.ReflectionHelper; import crazypants.enderio.EnderIO; import crazypants.enderio.config.Config; public class ContainerDarkSteelAnvil extends ContainerRepair { private int x, y, z; private final Field _outputSlot = ReflectionHelper.findField(ContainerRepair.class, "outputSlot", "field_82852_f"); private final Field _inputSlots = ReflectionHelper.findField(ContainerRepair.class, "inputSlots", "field_82853_g"); private final Field _materialCost = ReflectionHelper.findField(ContainerRepair.class, "materialCost", "stackSizeToBeUsedInRepair", "field_82856_l"); @SuppressWarnings("unchecked") public ContainerDarkSteelAnvil(InventoryPlayer playerInv, final World world, final int x, final int y, final int z, EntityPlayer player) { super(playerInv, world, x, y, z, player); final IInventory outputSlot, inputSlots; final int materialCost; try { outputSlot = (IInventory) _outputSlot.get(this); inputSlots = (IInventory) _inputSlots.get(this); materialCost = _materialCost.getInt(this); } catch (Exception e) { throw new RuntimeException(e); } this.x = x; this.y = y; this.z = z; this.inventorySlots.set(2, new Slot(outputSlot, 2, 134, 47) { public boolean isItemValid(ItemStack stack) { return false; } public boolean canTakeStack(EntityPlayer stack) { return (stack.capabilities.isCreativeMode || stack.experienceLevel >= ContainerDarkSteelAnvil.this.maximumCost) && ContainerDarkSteelAnvil.this.maximumCost > 0 && this.getHasStack(); } public void onPickupFromSlot(EntityPlayer player, ItemStack stack) { if(!player.capabilities.isCreativeMode) { player.addExperienceLevel(-ContainerDarkSteelAnvil.this.maximumCost); } inputSlots.setInventorySlotContents(0, (ItemStack) null); if(materialCost > 0) { ItemStack itemstack1 = inputSlots.getStackInSlot(1); if(itemstack1 != null && itemstack1.stackSize > materialCost) { itemstack1.stackSize -= materialCost; inputSlots.setInventorySlotContents(1, itemstack1); } else { inputSlots.setInventorySlotContents(1, (ItemStack) null); } } else { inputSlots.setInventorySlotContents(1, (ItemStack) null); } ContainerDarkSteelAnvil.this.maximumCost = 0; if(!player.capabilities.isCreativeMode && !world.isRemote && world.getBlock(x, y, z) == EnderIO.blockDarkSteelAnvil && player.getRNG().nextFloat() < Config.darkSteelAnvilDamageChance) { int i1 = world.getBlockMetadata(x, y, z); int k = i1 & 3; int l = i1 >> 2; ++l; if(l > 2) { world.setBlockToAir(x, y, z); world.playAuxSFX(1020, x, y, z, 0); } else { world.setBlockMetadataWithNotify(x, y, z, k | l << 2, 2); world.playAuxSFX(1021, x, y, z, 0); } } else if(!world.isRemote) { world.playAuxSFX(1021, x, y, z, 0); } } }); } @Override public boolean canInteractWith(EntityPlayer player) { return player.worldObj.getBlock(this.x, this.y, this.z) == EnderIO.blockDarkSteelAnvil; } }