From 2c4a183c306b9d7039c44a635a0ccd262fa4a4aa Mon Sep 17 00:00:00 2001 From: Kam Date: Mon, 30 Jun 2025 22:05:57 -0400 Subject: [PATCH] Send dialog close packet on GUI shutdown --- .../client/gui/player/GuiDialogInteract.java | 20 +++++++++++++++++++ .../modern/GuiModernDialogInteract.java | 19 ++++++++++++++++++ .../player/modern/GuiModernQuestDialog.java | 18 +++++++++++++++++ 3 files changed, 57 insertions(+) diff --git a/src/main/java/noppes/npcs/client/gui/player/GuiDialogInteract.java b/src/main/java/noppes/npcs/client/gui/player/GuiDialogInteract.java index 1287000e1..a49db2873 100644 --- a/src/main/java/noppes/npcs/client/gui/player/GuiDialogInteract.java +++ b/src/main/java/noppes/npcs/client/gui/player/GuiDialogInteract.java @@ -68,6 +68,13 @@ public class GuiDialogInteract extends GuiNPCInterface implements IGuiClose { private HashMap dialogImages = new HashMap<>(); + /** + * Tracks if a close packet has been sent to the server. This ensures that the + * dialog closed event always triggers even when the gui is closed through + * external means such as key binds that bypass {@link #keyTyped(char, int)}. + */ + private boolean sentClosePacket = false; + public GuiDialogInteract(EntityNPCInterface npc, Dialog dialog) { super(npc); this.dialog = dialog; @@ -647,6 +654,7 @@ public class GuiDialogInteract extends GuiNPCInterface implements IGuiClose { } private void closed() { + sentClosePacket = true; grabMouse(false); PacketClient.sendClient(new CheckPlayerValue(CheckPlayerValue.Type.CheckQuestCompletion)); } @@ -657,6 +665,7 @@ public class GuiDialogInteract extends GuiNPCInterface implements IGuiClose { public void appendDialog(Dialog dialog) { closeOnEsc = !dialog.disableEsc; + sentClosePacket = false; this.dialogImages.clear(); this.dialog = dialog; this.options = new ArrayList(); @@ -701,6 +710,17 @@ public class GuiDialogInteract extends GuiNPCInterface implements IGuiClose { MusicController.Instance.stopAllSounds(); } + @Override + public void onGuiClosed() { + if (!sentClosePacket) { + if (dialog != null) { + PacketClient.sendClient(new DialogSelectPacket(dialog.id, -1)); + } + closed(); + } + super.onGuiClosed(); + } + @Override public void setClose(int i, NBTTagCompound data) { grabMouse(false); diff --git a/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernDialogInteract.java b/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernDialogInteract.java index 6766b7711..fc4a221c7 100644 --- a/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernDialogInteract.java +++ b/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernDialogInteract.java @@ -57,6 +57,12 @@ public class GuiModernDialogInteract extends GuiNPCInterface implements IGuiClos private final HashMap dialogImages = new HashMap<>(); + /** + * Similar to {@link noppes.npcs.client.gui.player.GuiDialogInteract#sentClosePacket} this flag + * tracks if a close packet was already sent to the server. + */ + private boolean sentClosePacket = false; + public GuiModernDialogInteract(EntityNPCInterface npc, Dialog dialog) { super(npc); this.dialog = dialog; @@ -357,6 +363,7 @@ public class GuiModernDialogInteract extends GuiNPCInterface implements IGuiClos } private void closed() { + sentClosePacket = true; grabMouse(false); PacketClient.sendClient(new CheckPlayerValue(CheckPlayerValue.Type.CheckQuestCompletion)); } @@ -367,6 +374,7 @@ public class GuiModernDialogInteract extends GuiNPCInterface implements IGuiClos public void appendDialog(Dialog dialog) { closeOnEsc = !dialog.disableEsc; + sentClosePacket = false; this.dialogImages.clear(); this.dialog = dialog; this.options = new ArrayList(); @@ -423,4 +431,15 @@ public class GuiModernDialogInteract extends GuiNPCInterface implements IGuiClos public void setClose(int i, NBTTagCompound data) { grabMouse(false); } + + @Override + public void onGuiClosed() { + if (!sentClosePacket) { + if (dialog != null) { + PacketClient.sendClient(new DialogSelectPacket(dialog.id, -1)); + } + closed(); + } + super.onGuiClosed(); + } } diff --git a/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernQuestDialog.java b/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernQuestDialog.java index 0def72744..0d4659ebb 100644 --- a/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernQuestDialog.java +++ b/src/main/java/noppes/npcs/client/gui/player/modern/GuiModernQuestDialog.java @@ -54,6 +54,11 @@ public class GuiModernQuestDialog extends GuiNPCInterface implements IGuiClose { private boolean isGrabbed = false; + /** + * Flag to ensure the dialog close packet is only sent once. + */ + private boolean sentClosePacket = false; + private final HashMap dialogImages = new HashMap<>(); private Dialog prevDialog; private int optionId; @@ -70,6 +75,7 @@ public class GuiModernQuestDialog extends GuiNPCInterface implements IGuiClose { public void initGui() { super.initGui(); isGrabbed = false; + sentClosePacket = false; guiTop = (height - ySize); calculateRowHeight(); this.scaledResolution = new ScaledResolution(mc, mc.displayWidth, mc.displayHeight); @@ -353,6 +359,7 @@ public class GuiModernQuestDialog extends GuiNPCInterface implements IGuiClose { } private void closed() { + sentClosePacket = true; grabMouse(false); PacketClient.sendClient(new CheckPlayerValue(CheckPlayerValue.Type.CheckQuestCompletion)); } @@ -403,4 +410,15 @@ public class GuiModernQuestDialog extends GuiNPCInterface implements IGuiClose { public void setClose(int i, NBTTagCompound data) { grabMouse(false); } + + @Override + public void onGuiClosed() { + if (!sentClosePacket) { + if (prevDialog != null) { + PacketClient.sendClient(new DialogSelectPacket(prevDialog.id, -1)); + } + closed(); + } + super.onGuiClosed(); + } }