diff --git a/src/main/java/kamkeel/npcs/network/packets/request/role/RoleSavePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/role/RoleSavePacket.java index d63f2603c..21d0f2667 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/role/RoleSavePacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/role/RoleSavePacket.java @@ -14,6 +14,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.CustomNpcsPermissions; +import noppes.npcs.roles.RoleTrader; import java.io.IOException; @@ -63,7 +64,13 @@ public final class RoleSavePacket extends AbstractPacket { if (!PacketUtil.verifyItemPacket(packetName, EnumItemPacketType.WAND, player)) return; - npc.roleInterface.readFromNBT(ByteBufUtils.readNBT(in)); + NBTTagCompound roleCompound = ByteBufUtils.readNBT(in); + if (npc.roleInterface instanceof RoleTrader) { + // An admin edit wins over the linked market; the market is written from it afterwards. + ((RoleTrader) npc.roleInterface).readFromNBT(roleCompound, false); + } else { + npc.roleInterface.readFromNBT(roleCompound); + } npc.updateClient = true; } } diff --git a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcTraderSetup.java b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcTraderSetup.java index 7b54518e3..1e5aab8d1 100644 --- a/src/main/java/noppes/npcs/client/gui/roles/GuiNpcTraderSetup.java +++ b/src/main/java/noppes/npcs/client/gui/roles/GuiNpcTraderSetup.java @@ -21,6 +21,7 @@ public class GuiNpcTraderSetup extends GuiContainerNPCInterface2 implements ITex private final ResourceLocation slot = new ResourceLocation("customnpcs", "textures/gui/slot.png"); private RoleTrader role; + private boolean marketRelinked = false; // Currency cost textfield IDs start at 100 (100-117 for slots 0-17) private static final int CURRENCY_FIELD_ID_START = 100; @@ -116,8 +117,14 @@ public class GuiNpcTraderSetup extends GuiContainerNPCInterface2 implements ITex @Override public void save() { - PacketClient.sendClient(new TraderMarketSavePacket(role.marketName, false)); + // Linking to a different market already replaced the server's role with that market's + // data. Pushing this GUI's pre-link state back would overwrite the market being linked to. + if (marketRelinked) + return; + + // Save the role first so the market is written from the edited data, not the stale data. PacketClient.sendClient(new RoleSavePacket(role.writeToNBT(new NBTTagCompound()))); + PacketClient.sendClient(new TraderMarketSavePacket(role.marketName, false)); } @Override @@ -129,6 +136,7 @@ public class GuiNpcTraderSetup extends GuiContainerNPCInterface2 implements ITex String name = guiNpcTextField.getText(); if (!name.equalsIgnoreCase(role.marketName)) { role.marketName = name; + marketRelinked = true; PacketClient.sendClient(new TraderMarketSavePacket(role.marketName, true)); } return; diff --git a/src/main/java/noppes/npcs/roles/RoleTrader.java b/src/main/java/noppes/npcs/roles/RoleTrader.java index 6aa69d357..717754abf 100644 --- a/src/main/java/noppes/npcs/roles/RoleTrader.java +++ b/src/main/java/noppes/npcs/roles/RoleTrader.java @@ -94,6 +94,15 @@ public class RoleTrader extends RoleInterface { @Override public void readFromNBT(NBTTagCompound nbttagcompound) { + readFromNBT(nbttagcompound, true); + } + + /** + * @param loadFromMarket pull the linked market's stored data over the compound just read. + * False when the compound is an admin edit, which is authoritative and + * would otherwise be overwritten by the market it is about to be saved to. + */ + public void readFromNBT(NBTTagCompound nbttagcompound, boolean loadFromMarket) { String oldMarket = marketName; marketName = nbttagcompound.getString("TraderMarket"); readNBT(nbttagcompound); @@ -101,6 +110,9 @@ public class RoleTrader extends RoleInterface { // Register with MarketRegistry for linked market sync MarketRegistry.updateTraderMarket(oldMarket, marketName, this); + if (!loadFromMarket) + return; + try { Market.getMarket(this, marketName); } catch (Exception ex) {