/* * This file is part of Applied Energistics 2. * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Applied Energistics 2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Applied Energistics 2. If not, see . */ package appeng.container.implementations; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.implementations.ICraftingPatternItem; import appeng.api.implementations.IUpgradeableCellContainer; import appeng.api.networking.crafting.ICraftingPatternDetails; import appeng.api.storage.data.IAEItemStack; import appeng.container.interfaces.IInventorySlotAware; import appeng.container.slot.OptionalSlotFake; import appeng.container.slot.SlotFakeCraftingMatrix; import appeng.container.slot.SlotPatternOutputs; import appeng.container.slot.SlotPatternTerm; import appeng.container.slot.SlotRestrictedInput; import appeng.core.AEConfig; import appeng.core.localization.PlayerMessages; import appeng.helpers.WirelessTerminalGuiObject; import appeng.parts.automation.StackUpgradeInventory; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.Platform; import appeng.util.helpers.ItemHandlerUtil; import appeng.util.inv.InvOperation; import baubles.api.BaublesApi; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.ClickType; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.IItemHandler; import static appeng.helpers.PatternHelper.CRAFTING_GRID_DIMENSION; public class ContainerWirelessPatternTerminal extends ContainerPatternEncoder implements IUpgradeableCellContainer, IInventorySlotAware { private final WirelessTerminalGuiObject wirelessTerminalGUIObject; private final int slot; protected AppEngInternalInventory output; protected AppEngInternalInventory pattern; protected AppEngInternalInventory upgrades; protected SlotRestrictedInput magnetSlot; private double powerMultiplier = 0.5; private int ticks = 0; public ContainerWirelessPatternTerminal(final InventoryPlayer ip, final WirelessTerminalGuiObject gui) { super(ip, gui, gui, false); this.crafting = new AppEngInternalInventory(this, CRAFTING_GRID_DIMENSION * CRAFTING_GRID_DIMENSION); this.output = new AppEngInternalInventory(this, 3); this.pattern = new AppEngInternalInventory(this, 2); this.craftingSlots = new SlotFakeCraftingMatrix[9]; this.outputSlots = new OptionalSlotFake[3]; if (gui != null) { final int slotIndex = gui.getInventorySlot(); if (!((IInventorySlotAware) gui).isBaubleSlot()) { this.lockPlayerInventorySlot(slotIndex); } this.slot = slotIndex; } else { this.slot = -1; this.lockPlayerInventorySlot(ip.currentItem); } this.wirelessTerminalGUIObject = gui; upgrades = new StackUpgradeInventory(wirelessTerminalGUIObject.getItemStack(), this, 2); this.loadFromNBT(); for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) { this.addSlotToContainer(this.craftingSlots[x + y * 3] = new SlotFakeCraftingMatrix(this.crafting, x + y * 3, 18 + x * 18, -76 + y * 18)); } } this.addSlotToContainer(this.craftSlot = new SlotPatternTerm(ip.player, this.getActionSource(), this .getPowerSource(), gui, this.crafting, pattern, this.cOut, 110, -76 + 18, this, 2, this)); this.craftSlot.setIIcon(-1); for (int y = 0; y < this.outputSlots.length; y++) { this.addSlotToContainer(this.outputSlots[y] = new SlotPatternOutputs(output, this, y, 110, -76 + y * 18, 0, 0, 1)); this.outputSlots[y].setRenderDisabled(false); this.outputSlots[y].setIIcon(-1); } this.addSlotToContainer( this.patternSlotIN = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.BLANK_PATTERN, pattern, 0, 147, -72 - 9, this .getInventoryPlayer())); this.addSlotToContainer( this.patternSlotOUT = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.ENCODED_PATTERN, pattern, 1, 147, -72 + 34, this .getInventoryPlayer())); this.patternSlotOUT.setStackLimit(1); this.updateOrderOfOutputSlots(); this.bindPlayerInventory(ip, 0, 0); this.setupUpgrades(); } @Override public void detectAndSendChanges() { if (Platform.isServer()) { final ItemStack currentItem; if (wirelessTerminalGUIObject.isBaubleSlot()) { currentItem = BaublesApi.getBaublesHandler(this.getPlayerInv().player).getStackInSlot(this.slot); } else { currentItem = this.slot < 0 ? this.getPlayerInv().getCurrentItem() : this.getPlayerInv().getStackInSlot(this.slot); } if (currentItem.isEmpty()) { this.setValidContainer(false); } else if (!this.wirelessTerminalGUIObject.getItemStack().isEmpty() && currentItem != this.wirelessTerminalGUIObject.getItemStack()) { if (ItemStack.areItemsEqual(this.wirelessTerminalGUIObject.getItemStack(), currentItem)) { if (wirelessTerminalGUIObject.isBaubleSlot()) { BaublesApi.getBaublesHandler(this.getPlayerInv().player).setStackInSlot(this.slot, this.wirelessTerminalGUIObject.getItemStack()); } else { this.getPlayerInv().setInventorySlotContents(this.getPlayerInv().currentItem, this.wirelessTerminalGUIObject.getItemStack()); } } else { this.setValidContainer(false); } } // drain 1 ae t this.ticks++; if (this.ticks > 10) { double ext = this.wirelessTerminalGUIObject.extractAEPower(this.getPowerMultiplier() * this.ticks, Actionable.MODULATE, PowerMultiplier.CONFIG); if (ext < this.getPowerMultiplier() * this.ticks) { if (Platform.isServer() && this.isValidContainer()) { this.getPlayerInv().player.sendMessage(PlayerMessages.DeviceNotPowered.get()); } this.setValidContainer(false); } this.ticks = 0; } if (!this.wirelessTerminalGUIObject.rangeCheck()) { if (Platform.isServer() && this.isValidContainer()) { this.getPlayerInv().player.sendMessage(PlayerMessages.OutOfRange.get()); } this.setValidContainer(false); } else { this.setPowerMultiplier(AEConfig.instance().wireless_getDrainRate(this.wirelessTerminalGUIObject.getRange())); } super.detectAndSendChanges(); } } @Override public ItemStack slotClick(int slotId, int dragType, ClickType clickTypeIn, EntityPlayer player) { if (slotId >= 0 && slotId < this.inventorySlots.size()) { if (clickTypeIn == ClickType.PICKUP && dragType == 1) { if (this.inventorySlots.get(slotId) == magnetSlot) { ItemStack itemStack = magnetSlot.getStack(); if (!magnetSlot.getStack().isEmpty()) { NBTTagCompound tag = itemStack.getTagCompound(); if (tag == null) { tag = new NBTTagCompound(); } if (tag.hasKey("enabled")) { boolean e = tag.getBoolean("enabled"); tag.setBoolean("enabled", !e); } else { tag.setBoolean("enabled", false); } magnetSlot.getStack().setTagCompound(tag); magnetSlot.onSlotChanged(); return ItemStack.EMPTY; } } } } return super.slotClick(slotId, dragType, clickTypeIn, player); } private double getPowerMultiplier() { return this.powerMultiplier; } void setPowerMultiplier(final double powerMultiplier) { this.powerMultiplier = powerMultiplier; } @Override public boolean isSlotEnabled(final int idx) { boolean crafting = false; if (Platform.isServer()) { NBTTagCompound nbtTagCompound = iGuiItemObject.getItemStack().getTagCompound(); if (nbtTagCompound != null) { if (nbtTagCompound.hasKey("isCraftingMode")) { crafting = nbtTagCompound.getBoolean("isCraftingMode"); } } } if (idx == 1) { return Platform.isServer() ? !crafting : !this.isCraftingMode(); } else if (idx == 2) { return Platform.isServer() ? crafting : this.isCraftingMode(); } else { return false; } } @Override public void saveChanges() { if (Platform.isServer()) { NBTTagCompound tag = new NBTTagCompound(); ((AppEngInternalInventory) crafting).writeToNBT(tag, "craftingGrid"); this.output.writeToNBT(tag, "output"); this.pattern.writeToNBT(tag, "patterns"); this.upgrades.writeToNBT(tag, "upgrades"); this.wirelessTerminalGUIObject.saveChanges(tag); } } private void loadFromNBT() { NBTTagCompound data = wirelessTerminalGUIObject.getItemStack().getTagCompound(); if (data != null) { ((AppEngInternalInventory) crafting).readFromNBT(data, "craftingGrid"); this.output.readFromNBT(data, "output"); this.pattern.readFromNBT(data, "patterns"); upgrades.readFromNBT(wirelessTerminalGUIObject.getItemStack().getTagCompound().getCompoundTag("upgrades")); } } @Override public void onChangeInventory(final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removedStack, final ItemStack newStack) { if (inv == this.pattern && slot == 1) { final ItemStack is = this.pattern.getStackInSlot(1); if (!is.isEmpty() && is.getItem() instanceof ICraftingPatternItem) { final ICraftingPatternItem pattern = (ICraftingPatternItem) is.getItem(); final ICraftingPatternDetails details = pattern.getPatternForItem(is, this.getPlayerInv().player.world); if (details != null) { this.setCraftingMode(details.isCraftable()); this.setSubstitute(details.canSubstitute()); for (int x = 0; x < this.crafting.getSlots() && x < details.getInputs().length; x++) { final IAEItemStack item = details.getInputs()[x]; ItemHandlerUtil.setStackInSlot(this.crafting, x, item == null ? ItemStack.EMPTY : item.createItemStack()); } for (int x = 0; x < this.output.getSlots(); x++) { final IAEItemStack item; if (x < details.getOutputs().length) { item = details.getOutputs()[x]; } else { item = null; } this.output.setStackInSlot(x, item == null ? ItemStack.EMPTY : item.createItemStack()); } } } } super.onChangeInventory(inv, slot, mc, removedStack, newStack); } @Override public IItemHandler getInventoryByName(String name) { if (name.equals("crafting")) { return this.crafting; } else if (name.equals("output")) { return this.output; } return super.getInventoryByName(name); } @Override public boolean useRealItems() { return false; } @Override public int availableUpgrades() { return 1; } @Override public void setupUpgrades() { if (wirelessTerminalGUIObject != null) { for (int upgradeSlot = 0; upgradeSlot < availableUpgrades(); upgradeSlot++) { this.magnetSlot = new SlotRestrictedInput(SlotRestrictedInput.PlacableItemType.UPGRADES, upgrades, upgradeSlot, 206, 135 + upgradeSlot * 18, this.getInventoryPlayer()); this.magnetSlot.setNotDraggable(); this.addSlotToContainer(magnetSlot); } } } @Override public int getInventorySlot() { return wirelessTerminalGUIObject.getInventorySlot(); } @Override public boolean isBaubleSlot() { return wirelessTerminalGUIObject.isBaubleSlot(); } }