Fix #739 Trade station crashes when loaded without name set

This commit is contained in:
mezz committed 2015-06-27 21:17:26 -07:00
1 parent f79a8b3896
commit f0fa49f46c
8 files changed
+135 -70

No files matched your search

@@ -26,6 +26,10 @@ public class ContainerTile<T extends TileForestry> 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;
@@ -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: {
@@ -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;
@@ -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) {
@@ -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
@@ -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<MachineTrader> {
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);
}
}
}
}
}
@@ -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<ContainerTradeName, MachineTrader> {
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<ContainerTradeName, MachineTrader>
// 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<ContainerTradeName, MachineTrader>
@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);
}
}
@@ -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;
}
}