diff --git a/src/main/java/forestry/core/gui/ContainerTile.java b/src/main/java/forestry/core/gui/ContainerTile.java index 5372c667e..abaa92ca9 100644 --- a/src/main/java/forestry/core/gui/ContainerTile.java +++ b/src/main/java/forestry/core/gui/ContainerTile.java @@ -26,6 +26,10 @@ public class ContainerTile extends ContainerForestry { protected final T tile; + public ContainerTile(T tileForestry) { + this.tile = tileForestry; + } + public ContainerTile(T tileForestry, InventoryPlayer playerInventory, int xInv, int yInv) { this.tile = tileForestry; diff --git a/src/main/java/forestry/core/network/PacketHandler.java b/src/main/java/forestry/core/network/PacketHandler.java index d0bb8b503..9e06aa1e1 100755 --- a/src/main/java/forestry/core/network/PacketHandler.java +++ b/src/main/java/forestry/core/network/PacketHandler.java @@ -61,11 +61,11 @@ public class PacketHandler { @SubscribeEvent public void onPacket(ClientCustomPacketEvent event) { - onPacketData(event.packet, null); + onPacketData(event.packet, Proxies.common.getPlayer()); } /** Returns true if the packet has been handled */ - private static boolean onPacketData(FMLProxyPacket fmlPacket, EntityPlayerMP player) { + private static boolean onPacketData(FMLProxyPacket fmlPacket, EntityPlayer player) { InputStream is = new ByteBufInputStream(fmlPacket.payload()); DataInputStreamForestry data = new DataInputStreamForestry(is); @@ -107,7 +107,7 @@ public class PacketHandler { case PIPETTE_CLICK: { PacketSlotClick packet = new PacketSlotClick(data); - onPipetteClick(packet, player); + onPipetteClick(packet, (EntityPlayerMP) player); return true; } case SOLDERING_IRON_CLICK: { diff --git a/src/main/java/forestry/mail/GuiHandlerMail.java b/src/main/java/forestry/mail/GuiHandlerMail.java index 65f519ca5..2fbcceae4 100755 --- a/src/main/java/forestry/mail/GuiHandlerMail.java +++ b/src/main/java/forestry/mail/GuiHandlerMail.java @@ -76,7 +76,7 @@ public class GuiHandlerMail extends GuiHandlerBase { case TraderGUI: return new GuiTrader(player.inventory, getTileForestry(world, x, y, z, player, MachineTrader.class)); case TraderNameGUI: - return new GuiTradeName(player.inventory, getTileForestry(world, x, y, z, player, MachineTrader.class)); + return new GuiTradeName(getTileForestry(world, x, y, z, player, MachineTrader.class)); default: return null; @@ -122,7 +122,7 @@ public class GuiHandlerMail extends GuiHandlerBase { case TraderGUI: return new ContainerTrader(player.inventory, getTileForestry(world, x, y, z, player, MachineTrader.class)); case TraderNameGUI: - return new ContainerTradeName(player.inventory, getTileForestry(world, x, y, z, player, MachineTrader.class)); + return new ContainerTradeName(getTileForestry(world, x, y, z, player, MachineTrader.class)); default: return null; diff --git a/src/main/java/forestry/mail/PacketHandlerMail.java b/src/main/java/forestry/mail/PacketHandlerMail.java index 7fb2c548c..80bfb2872 100755 --- a/src/main/java/forestry/mail/PacketHandlerMail.java +++ b/src/main/java/forestry/mail/PacketHandlerMail.java @@ -14,19 +14,21 @@ import java.io.IOException; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; +import net.minecraft.tileentity.TileEntity; import forestry.core.network.DataInputStreamForestry; import forestry.core.network.IPacketHandler; import forestry.core.network.PacketId; import forestry.core.network.PacketString; import forestry.core.proxy.Proxies; +import forestry.mail.gadgets.MachineTrader; import forestry.mail.gui.ContainerCatalogue; import forestry.mail.gui.ContainerLetter; -import forestry.mail.gui.ContainerTradeName; import forestry.mail.gui.GuiMailboxInfo; import forestry.mail.network.PacketLetterInfo; import forestry.mail.network.PacketPOBoxInfo; import forestry.mail.network.PacketRequestLetterInfo; +import forestry.mail.network.PacketTraderAddress; public class PacketHandlerMail implements IPacketHandler { @@ -55,8 +57,8 @@ public class PacketHandlerMail implements IPacketHandler { return true; } case TRADING_ADDRESS_SET: { - PacketString packet = new PacketString(data); - onAddressSet(player, packet); + PacketTraderAddress packet = new PacketTraderAddress(data); + handleTradeAddressSet(player, packet); return true; } case POBOX_INFO_REQUEST: { @@ -83,12 +85,15 @@ public class PacketHandlerMail implements IPacketHandler { GuiMailboxInfo.instance.setPOBoxInfo(packet.poboxInfo); } - private static void onAddressSet(EntityPlayer player, PacketString packet) { - if (!(player.openContainer instanceof ContainerTradeName)) { + private static void handleTradeAddressSet(EntityPlayer player, PacketTraderAddress packet) { + TileEntity tile = packet.getTarget(player.worldObj); + if (!(tile instanceof MachineTrader)) { return; } - ((ContainerTradeName) player.openContainer).handleSetAddress(packet); + String addressName = packet.getAddressName(); + + ((MachineTrader) tile).handleSetAddress(addressName); } private static void onLetterText(EntityPlayer player, PacketString packet) { diff --git a/src/main/java/forestry/mail/gadgets/MachineTrader.java b/src/main/java/forestry/mail/gadgets/MachineTrader.java index 18b61c148..56ab148e0 100755 --- a/src/main/java/forestry/mail/gadgets/MachineTrader.java +++ b/src/main/java/forestry/mail/gadgets/MachineTrader.java @@ -36,9 +36,11 @@ import forestry.core.network.DataInputStreamForestry; import forestry.core.network.DataOutputStreamForestry; import forestry.core.network.GuiId; import forestry.core.proxy.Proxies; +import forestry.core.utils.EnumAccess; import forestry.core.utils.StackUtils; import forestry.mail.MailAddress; import forestry.mail.TradeStation; +import forestry.mail.network.PacketTraderAddress; import forestry.mail.triggers.MailTriggers; import buildcraft.api.statements.ITriggerExternal; @@ -94,14 +96,23 @@ public class MachineTrader extends TileBase { @Override public void writeData(DataOutputStreamForestry data) throws IOException { super.writeData(data); - data.writeUTF(address.getName()); + String name = null; + if (address != null) { + name = address.getName(); + } + if (name == null) { + name = ""; + } + data.writeUTF(name); } @Override public void readData(DataInputStreamForestry data) throws IOException { super.readData(data); String address = data.readUTF(); - this.address = PostManager.postRegistry.getMailAddress(address); + if (address.length() > 0) { + this.address = PostManager.postRegistry.getMailAddress(address); + } } /* UPDATING */ @@ -240,6 +251,22 @@ public class MachineTrader extends TileBase { return address; } + public void handleSetAddress(String addressName) { + IMailAddress address = PostManager.postRegistry.getMailAddress(addressName); + setAddress(address); + + if (!worldObj.isRemote) { + IMailAddress newAddress = getAddress(); + if (newAddress != null) { + String newAddressName = newAddress.getName(); + if (newAddressName != null && newAddressName.equals(addressName)) { + PacketTraderAddress packetResponse = new PacketTraderAddress(this, addressName); + Proxies.net.sendNetworkPacket(packetResponse); + } + } + } + } + public void setAddress(IMailAddress address) { if (address == null) { throw new NullPointerException("address must not be null"); @@ -260,6 +287,8 @@ public class MachineTrader extends TileBase { this.address = address; PostManager.postRegistry.getOrCreateTradeStation(worldObj, getOwner(), address); } + } else { + this.address = address; } } @@ -273,6 +302,15 @@ public class MachineTrader extends TileBase { return (TradeStation) PostManager.postRegistry.getOrCreateTradeStation(worldObj, getOwner(), address); } + @Override + public EnumAccess getAccess() { + if (isLinked()) { + return super.getAccess(); + } else { + return EnumAccess.PRIVATE; + } + } + /* ITRIGGERPROVIDER */ @Optional.Method(modid = "BuildCraftAPI|statements") @Override diff --git a/src/main/java/forestry/mail/gui/ContainerTradeName.java b/src/main/java/forestry/mail/gui/ContainerTradeName.java index 6d2348de4..f58100c17 100755 --- a/src/main/java/forestry/mail/gui/ContainerTradeName.java +++ b/src/main/java/forestry/mail/gui/ContainerTradeName.java @@ -10,52 +10,33 @@ ******************************************************************************/ package forestry.mail.gui; -import org.apache.commons.lang3.StringUtils; - import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import forestry.api.mail.IMailAddress; -import forestry.api.mail.PostManager; -import forestry.core.network.PacketId; -import forestry.core.network.PacketString; -import forestry.core.proxy.Proxies; +import forestry.core.gui.ContainerTile; import forestry.mail.gadgets.MachineTrader; -public class ContainerTradeName extends Container { +public class ContainerTradeName extends ContainerTile { - protected final MachineTrader machine; - - public ContainerTradeName(InventoryPlayer player, MachineTrader tile) { - machine = tile; + public ContainerTradeName(MachineTrader tile) { + super(tile); } public IMailAddress getAddress() { - return machine.getAddress(); - } - - public void setAddress(String addressName) { - - if (StringUtils.isBlank(addressName)) { - return; - } - - PacketString packet = new PacketString(PacketId.TRADING_ADDRESS_SET, addressName); - Proxies.net.sendToServer(packet); - - IMailAddress address = PostManager.postRegistry.getMailAddress(addressName); - machine.setAddress(address); - } - - public void handleSetAddress(PacketString packet) { - String addressName = packet.getString(); - IMailAddress address = PostManager.postRegistry.getMailAddress(addressName); - machine.setAddress(address); + return tile.getAddress(); } @Override - public boolean canInteractWith(EntityPlayer entityPlayer) { - return machine.isOwner(entityPlayer); + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + if (tile.isLinked()) { + for (Object crafter : crafters) { + if (crafter instanceof EntityPlayer) { + EntityPlayer player = (EntityPlayer) crafter; + tile.openGui(player, tile); + } + } + } } } diff --git a/src/main/java/forestry/mail/gui/GuiTradeName.java b/src/main/java/forestry/mail/gui/GuiTradeName.java index c729d8c71..80a678f1c 100755 --- a/src/main/java/forestry/mail/gui/GuiTradeName.java +++ b/src/main/java/forestry/mail/gui/GuiTradeName.java @@ -13,23 +13,22 @@ package forestry.mail.gui; import org.apache.commons.lang3.StringUtils; import net.minecraft.client.gui.GuiTextField; -import net.minecraft.entity.player.InventoryPlayer; import org.lwjgl.input.Keyboard; import forestry.core.config.Defaults; import forestry.core.gui.GuiForestry; +import forestry.core.proxy.Proxies; import forestry.core.utils.StringUtil; import forestry.mail.gadgets.MachineTrader; +import forestry.mail.network.PacketTraderAddress; public class GuiTradeName extends GuiForestry { private GuiTextField addressNameField; - private boolean addressNameFocus; - - public GuiTradeName(InventoryPlayer inventoryplayer, MachineTrader tile) { - super(Defaults.TEXTURE_PATH_GUI + "/tradername.png", new ContainerTradeName(inventoryplayer, tile), tile); + public GuiTradeName(MachineTrader tile) { + super(Defaults.TEXTURE_PATH_GUI + "/tradername.png", new ContainerTradeName(tile), tile); this.xSize = 176; this.ySize = 90; } @@ -51,8 +50,7 @@ public class GuiTradeName extends GuiForestry // Set focus or enter text into address if (addressNameField.isFocused()) { if (eventKey == Keyboard.KEY_RETURN) { - addressNameFocus = true; - addressNameField.setFocused(false); + setAddress(); } else { addressNameField.textboxKeyTyped(eventCharacter, eventKey); } @@ -70,36 +68,24 @@ public class GuiTradeName extends GuiForestry @Override protected void drawGuiContainerBackgroundLayer(float var1, int var2, int var3) { - // Close gui screen if we linked up. - if (container.machine.isLinked()) { - this.mc.thePlayer.closeScreen(); - this.mc.setIngameFocus(); - } - - // Check for focus changes - if (addressNameFocus && !addressNameField.isFocused()) { - this.setAddress(); - } - addressNameFocus = addressNameField.isFocused(); - super.drawGuiContainerBackgroundLayer(var1, var2, var3); String prompt = StringUtil.localize("gui.mail.nametrader"); fontRendererObj.drawString(prompt, guiLeft + this.getCenteredOffset(prompt), guiTop + 16, fontColor.get("gui.mail.text")); addressNameField.drawTextBox(); - } @Override public void onGuiClosed() { - setAddress(); super.onGuiClosed(); + setAddress(); } private void setAddress() { String address = addressNameField.getText(); if (StringUtils.isNotBlank(address)) { - container.setAddress(address); + PacketTraderAddress packet = new PacketTraderAddress(inventory, address); + Proxies.net.sendToServer(packet); } } diff --git a/src/main/java/forestry/mail/network/PacketTraderAddress.java b/src/main/java/forestry/mail/network/PacketTraderAddress.java new file mode 100644 index 000000000..05de7d589 --- /dev/null +++ b/src/main/java/forestry/mail/network/PacketTraderAddress.java @@ -0,0 +1,51 @@ +/******************************************************************************* + * Copyright (c) 2011-2014 SirSengir. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the GNU Lesser Public License v3 + * which accompanies this distribution, and is available at + * http://www.gnu.org/licenses/lgpl-3.0.txt + * + * Various Contributors including, but not limited to: + * SirSengir (original work), CovertJaguar, Player, Binnie, MysteriousAges + ******************************************************************************/ +package forestry.mail.network; + +import java.io.IOException; + +import forestry.core.network.DataInputStreamForestry; +import forestry.core.network.DataOutputStreamForestry; +import forestry.core.network.PacketCoordinates; +import forestry.core.network.PacketId; +import forestry.mail.gadgets.MachineTrader; + +public class PacketTraderAddress extends PacketCoordinates { + + private String addressName; + + public PacketTraderAddress(DataInputStreamForestry data) throws IOException { + super(data); + } + + public PacketTraderAddress(MachineTrader tile, String addressName) { + super(PacketId.TRADING_ADDRESS_SET, tile); + + this.addressName = addressName; + } + + @Override + protected void writeData(DataOutputStreamForestry data) throws IOException { + super.writeData(data); + data.writeUTF(addressName); + } + + @Override + protected void readData(DataInputStreamForestry data) throws IOException { + super.readData(data); + + addressName = data.readUTF(); + } + + public String getAddressName() { + return addressName; + } +}