mirror of
https://github.com/GTNewHorizons/ForestryMC.git
synced 2026-11-14 01:04:12 +00:00
Fix #739 Trade station crashes when loaded without name set
This commit is contained in:
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;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user