interfaces = new HashMap<>();
/**
* The current listener.
@@ -58,6 +65,19 @@ public final class InterfaceSet {
this.player = player;
}
+ /**
+ * Called when the player has clicked the specified button. Notifies the current dialogue listener.
+ *
+ * @param button The button.
+ * @return {@code true} if the event handler chain should be broken.
+ */
+ public boolean buttonClicked(int button) {
+ if (dialogueListener != null) {
+ return dialogueListener.buttonClicked(button);
+ }
+ return false;
+ }
+
/**
* Closes the current open interface(s).
*/
@@ -70,7 +90,8 @@ public final class InterfaceSet {
* An internal method for closing the interface, notifying the listener if appropriate, but not sending any events.
*/
private void closeAndNotify() {
- amountListener = null; // TODO should we notify??
+ amountListener = null;
+ dialogueListener = null;
interfaces.clear();
if (listener != null) {
@@ -89,6 +110,25 @@ public final class InterfaceSet {
return interfaces.containsValue(id);
}
+ /**
+ * Checks if this interface set contains the specified interface type.
+ *
+ * @param type The interface's type.
+ * @return {@code true} if so, {@code false} if not.
+ */
+ public boolean contains(InterfaceType type) {
+ return interfaces.containsKey(type);
+ }
+
+ /**
+ * Called when the player has clicked the "Click here to continue" button on a dialogue.
+ */
+ public void continueRequested() {
+ if (dialogueListener != null) {
+ dialogueListener.continued();
+ }
+ }
+
/**
* Called when the client has entered the specified amount. Notifies the current listener.
*
@@ -108,6 +148,31 @@ public final class InterfaceSet {
closeAndNotify();
}
+ /**
+ * Opens a chat box dialogue.
+ *
+ * @param listener The listener for the dialogue.
+ * @param dialogueId The dialogue's id.
+ */
+ public void openDialogue(DialogueListener listener, int dialogueId) {
+ closeAndNotify();
+
+ this.dialogueListener = listener;
+ this.listener = listener;
+
+ interfaces.put(InterfaceType.DIALOGUE, dialogueId);
+ player.send(new OpenDialogueInterfaceEvent(dialogueId));
+ }
+
+ /**
+ * Opens a chat box dialogue.
+ *
+ * @param dialogueId The dialogue's id.
+ */
+ public void openDialogue(int dialogueId) {
+ openDialogue(null, dialogueId);
+ }
+
/**
* Opens the enter amount dialog.
*
diff --git a/src/org/apollo/game/model/inter/dialogue/DialogueAdapter.java b/src/org/apollo/game/model/inter/dialogue/DialogueAdapter.java
new file mode 100644
index 00000000..6c3f0e6e
--- /dev/null
+++ b/src/org/apollo/game/model/inter/dialogue/DialogueAdapter.java
@@ -0,0 +1,25 @@
+package org.apollo.game.model.inter.dialogue;
+
+/**
+ * An adapter for the {@link DialogueListener}.
+ *
+ * @author Chris Fletcher
+ */
+public abstract class DialogueAdapter implements DialogueListener {
+
+ @Override
+ public boolean buttonClicked(int button) {
+ return false;
+ }
+
+ @Override
+ public void continued() {
+
+ }
+
+ @Override
+ public void interfaceClosed() {
+
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/game/model/inter/dialogue/DialogueListener.java b/src/org/apollo/game/model/inter/dialogue/DialogueListener.java
new file mode 100644
index 00000000..43e335fb
--- /dev/null
+++ b/src/org/apollo/game/model/inter/dialogue/DialogueListener.java
@@ -0,0 +1,29 @@
+package org.apollo.game.model.inter.dialogue;
+
+import org.apollo.game.model.inter.InterfaceListener;
+
+/**
+ * An {@link InterfaceListener} that listens for dialogue-specific events (e.g. clicking buttons).
+ *
+ * @author Chris Fletcher
+ */
+public interface DialogueListener extends InterfaceListener {
+
+ /**
+ * Called when the player has clicked the specified button.
+ *
+ * Note that this method is invoked when any button is clicked whilst the dialogue is opened. In case the button is
+ * not being handled by this listener, simply return {@code false} to allow further processing of the event.
+ *
+ *
+ * @param button The button interface id.
+ * @return {@code true} if the event handler chain should be broken, {@code false} if it should be continued.
+ */
+ public boolean buttonClicked(int button);
+
+ /**
+ * Called when the player has clicked the "Click here to continue" button on a chatting dialogue.
+ */
+ public void continued();
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/game/model/inter/dialogue/package-info.java b/src/org/apollo/game/model/inter/dialogue/package-info.java
new file mode 100644
index 00000000..99e4d40f
--- /dev/null
+++ b/src/org/apollo/game/model/inter/dialogue/package-info.java
@@ -0,0 +1,4 @@
+/**
+ * Contains dialogue-related classes.
+ */
+package org.apollo.game.model.inter.dialogue;
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r317/DialogueContinueEventEncoder.java b/src/org/apollo/net/release/r317/DialogueContinueEventEncoder.java
new file mode 100644
index 00000000..b70a8ca5
--- /dev/null
+++ b/src/org/apollo/net/release/r317/DialogueContinueEventEncoder.java
@@ -0,0 +1,23 @@
+package org.apollo.net.release.r317;
+
+import org.apollo.game.event.impl.DialogueContinueEvent;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
+import org.apollo.net.release.EventDecoder;
+
+/**
+ * An {@link EventDecoder} for the {@link DialogueContinueEvent}.
+ *
+ * @author Chris Fletcher
+ */
+final class DialogueContinueEventDecoder extends EventDecoder {
+
+ @Override
+ public DialogueContinueEvent decode(GamePacket packet) {
+ GamePacketReader reader = new GamePacketReader(packet);
+ int interfaceId = (int) reader.getUnsigned(DataType.SHORT);
+ return new DialogueContinueEvent(interfaceId);
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r317/OpenDialogueInterfaceEventEncoder.java b/src/org/apollo/net/release/r317/OpenDialogueInterfaceEventEncoder.java
new file mode 100644
index 00000000..acabd337
--- /dev/null
+++ b/src/org/apollo/net/release/r317/OpenDialogueInterfaceEventEncoder.java
@@ -0,0 +1,24 @@
+package org.apollo.net.release.r317;
+
+import org.apollo.game.event.impl.OpenDialogueInterfaceEvent;
+import org.apollo.net.codec.game.DataOrder;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketBuilder;
+import org.apollo.net.release.EventEncoder;
+
+/**
+ * An {@link EventEncoder} for the {@link OpenDialogueInterfaceEvent}.
+ *
+ * @author Chris Fletcher
+ */
+public final class OpenDialogueInterfaceEventEncoder extends EventEncoder {
+
+ @Override
+ public GamePacket encode(OpenDialogueInterfaceEvent event) {
+ GamePacketBuilder builder = new GamePacketBuilder(164);
+ builder.put(DataType.SHORT, DataOrder.LITTLE, event.getInterfaceId());
+ return builder.toGamePacket();
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r317/Release317.java b/src/org/apollo/net/release/r317/Release317.java
index 347205c0..ba3f4b9a 100644
--- a/src/org/apollo/net/release/r317/Release317.java
+++ b/src/org/apollo/net/release/r317/Release317.java
@@ -10,6 +10,7 @@ import org.apollo.game.event.impl.IdAssignmentEvent;
import org.apollo.game.event.impl.IgnoreListEvent;
import org.apollo.game.event.impl.LogoutEvent;
import org.apollo.game.event.impl.NpcSynchronizationEvent;
+import org.apollo.game.event.impl.OpenDialogueInterfaceEvent;
import org.apollo.game.event.impl.OpenInterfaceEvent;
import org.apollo.game.event.impl.OpenInterfaceSidebarEvent;
import org.apollo.game.event.impl.PlayerSynchronizationEvent;
@@ -133,6 +134,7 @@ public final class Release317 extends Release {
register(155, new SecondNpcActionEventDecoder());
register(17, new ThirdNpcActionEventDecoder());
register(236, new TakeTileItemEventDecoder());
+ register(40, new DialogueContinueEventDecoder());
register(188, new AddFriendEventDecoder());
register(133, new AddIgnoreEventDecoder());
@@ -167,6 +169,7 @@ public final class Release317 extends Release {
register(PositionEvent.class, new PositionEventEncoder());
register(UpdateRunEnergyEvent.class, new UpdateRunEnergyEventEncoder());
register(PrivacyOptionEvent.class, new PrivacyOptionEventEncoder());
+ register(OpenDialogueInterfaceEvent.class, new OpenDialogueInterfaceEventEncoder());
register(ForwardPrivateMessageEvent.class, new ForwardPrivateMessageEventEncoder());
register(FriendServerStatusEvent.class, new FriendServerStatusEventEncoder());
diff --git a/src/org/apollo/net/release/r377/DialogueContinueEventDecoder.java b/src/org/apollo/net/release/r377/DialogueContinueEventDecoder.java
new file mode 100644
index 00000000..ea241b5e
--- /dev/null
+++ b/src/org/apollo/net/release/r377/DialogueContinueEventDecoder.java
@@ -0,0 +1,23 @@
+package org.apollo.net.release.r377;
+
+import org.apollo.game.event.impl.DialogueContinueEvent;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketReader;
+import org.apollo.net.release.EventDecoder;
+
+/**
+ * An {@link EventDecoder} for the {@link DialogueContinueEvent}.
+ *
+ * @author Chris Fletcher
+ */
+final class DialogueContinueEventDecoder extends EventDecoder {
+
+ @Override
+ public DialogueContinueEvent decode(GamePacket packet) {
+ GamePacketReader reader = new GamePacketReader(packet);
+ int interfaceId = (int) reader.getUnsigned(DataType.SHORT);
+ return new DialogueContinueEvent(interfaceId);
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r377/OpenDialogueInterfaceEventEncoder.java b/src/org/apollo/net/release/r377/OpenDialogueInterfaceEventEncoder.java
new file mode 100644
index 00000000..9ac686a8
--- /dev/null
+++ b/src/org/apollo/net/release/r377/OpenDialogueInterfaceEventEncoder.java
@@ -0,0 +1,23 @@
+package org.apollo.net.release.r377;
+
+import org.apollo.game.event.impl.OpenDialogueInterfaceEvent;
+import org.apollo.net.codec.game.DataType;
+import org.apollo.net.codec.game.GamePacket;
+import org.apollo.net.codec.game.GamePacketBuilder;
+import org.apollo.net.release.EventEncoder;
+
+/**
+ * An {@link EventEncoder} for the {@link OpenDialogueInterfaceEvent}.
+ *
+ * @author Chris Fletcher
+ */
+public final class OpenDialogueInterfaceEventEncoder extends EventEncoder {
+
+ @Override
+ public GamePacket encode(OpenDialogueInterfaceEvent event) {
+ GamePacketBuilder builder = new GamePacketBuilder(109);
+ builder.put(DataType.SHORT, event.getInterfaceId());
+ return builder.toGamePacket();
+ }
+
+}
\ No newline at end of file
diff --git a/src/org/apollo/net/release/r377/Release377.java b/src/org/apollo/net/release/r377/Release377.java
index 2a0e4ffe..538fea13 100644
--- a/src/org/apollo/net/release/r377/Release377.java
+++ b/src/org/apollo/net/release/r377/Release377.java
@@ -10,6 +10,7 @@ import org.apollo.game.event.impl.IdAssignmentEvent;
import org.apollo.game.event.impl.IgnoreListEvent;
import org.apollo.game.event.impl.LogoutEvent;
import org.apollo.game.event.impl.NpcSynchronizationEvent;
+import org.apollo.game.event.impl.OpenDialogueInterfaceEvent;
import org.apollo.game.event.impl.OpenInterfaceEvent;
import org.apollo.game.event.impl.OpenInterfaceSidebarEvent;
import org.apollo.game.event.impl.PlayerSynchronizationEvent;
@@ -130,6 +131,7 @@ public final class Release377 extends Release {
register(112, new SecondNpcActionEventDecoder());
register(13, new ThirdNpcActionEventDecoder());
register(71, new TakeTileItemEventDecoder());
+ register(226, new DialogueContinueEventDecoder());
register(120, new AddFriendEventDecoder());
register(217, new AddIgnoreEventDecoder());
@@ -164,6 +166,7 @@ public final class Release377 extends Release {
register(PositionEvent.class, new PositionEventEncoder());
register(UpdateRunEnergyEvent.class, new UpdateRunEnergyEventEncoder());
register(PrivacyOptionEvent.class, new PrivacyOptionEventEncoder());
+ register(OpenDialogueInterfaceEvent.class, new OpenDialogueInterfaceEventEncoder());
register(ForwardPrivateMessageEvent.class, new ForwardPrivateMessageEventEncoder());
register(FriendServerStatusEvent.class, new FriendServerStatusEventEncoder());