From cdee2581aa015138f6c34ac8506ca9d8dd27b5b9 Mon Sep 17 00:00:00 2001 From: Major- Date: Thu, 13 Feb 2014 22:44:52 +0000 Subject: [PATCH] Add support for dialogue interfaces; Change interface comments. --- data/events.xml | 7 ++ .../handler/impl/DialogueButtonHandler.java | 27 ++++++++ .../impl/DialogueContinueEventHandler.java | 23 +++++++ .../event/impl/DialogueContinueEvent.java | 36 ++++++++++ .../impl/OpenDialogueInterfaceEvent.java | 35 ++++++++++ .../game/event/impl/OpenInterfaceEvent.java | 2 +- .../apollo/game/model/inter/InterfaceSet.java | 69 ++++++++++++++++++- .../model/inter/dialogue/DialogueAdapter.java | 25 +++++++ .../inter/dialogue/DialogueListener.java | 29 ++++++++ .../model/inter/dialogue/package-info.java | 4 ++ .../r317/DialogueContinueEventEncoder.java | 23 +++++++ .../OpenDialogueInterfaceEventEncoder.java | 24 +++++++ .../apollo/net/release/r317/Release317.java | 3 + .../r377/DialogueContinueEventDecoder.java | 23 +++++++ .../OpenDialogueInterfaceEventEncoder.java | 23 +++++++ .../apollo/net/release/r377/Release377.java | 3 + 16 files changed, 353 insertions(+), 3 deletions(-) create mode 100644 src/org/apollo/game/event/handler/impl/DialogueButtonHandler.java create mode 100644 src/org/apollo/game/event/handler/impl/DialogueContinueEventHandler.java create mode 100644 src/org/apollo/game/event/impl/DialogueContinueEvent.java create mode 100644 src/org/apollo/game/event/impl/OpenDialogueInterfaceEvent.java create mode 100644 src/org/apollo/game/model/inter/dialogue/DialogueAdapter.java create mode 100644 src/org/apollo/game/model/inter/dialogue/DialogueListener.java create mode 100644 src/org/apollo/game/model/inter/dialogue/package-info.java create mode 100644 src/org/apollo/net/release/r317/DialogueContinueEventEncoder.java create mode 100644 src/org/apollo/net/release/r317/OpenDialogueInterfaceEventEncoder.java create mode 100644 src/org/apollo/net/release/r377/DialogueContinueEventDecoder.java create mode 100644 src/org/apollo/net/release/r377/OpenDialogueInterfaceEventEncoder.java diff --git a/data/events.xml b/data/events.xml index 5113379b..a894cc4c 100644 --- a/data/events.xml +++ b/data/events.xml @@ -22,9 +22,16 @@ org.apollo.game.event.impl.ButtonEvent + org.apollo.game.event.handler.impl.DialogueButtonHandler org.apollo.game.event.handler.impl.BankButtonEventHandler + + org.apollo.game.event.impl.DialogueContinueEvent + + org.apollo.game.event.handler.impl.DialogueContinueEventHandler + + org.apollo.game.event.impl.CommandEvent diff --git a/src/org/apollo/game/event/handler/impl/DialogueButtonHandler.java b/src/org/apollo/game/event/handler/impl/DialogueButtonHandler.java new file mode 100644 index 00000000..2668d582 --- /dev/null +++ b/src/org/apollo/game/event/handler/impl/DialogueButtonHandler.java @@ -0,0 +1,27 @@ +package org.apollo.game.event.handler.impl; + +import org.apollo.game.event.handler.EventHandler; +import org.apollo.game.event.handler.EventHandlerContext; +import org.apollo.game.event.impl.ButtonEvent; +import org.apollo.game.model.inter.InterfaceType; +import org.apollo.game.model.Player; + +/** + * An {@link EventHandler} which intercepts button clicks on dialogues, and forwards the event to the current listener. + * + * @author Chris Fletcher + */ +public final class DialogueButtonHandler extends EventHandler { + + @Override + public void handle(EventHandlerContext ctx, Player player, ButtonEvent event) { + if (player.getInterfaceSet().contains(InterfaceType.DIALOGUE)) { + boolean breakChain = player.getInterfaceSet().buttonClicked(event.getWidgetId()); + + if (breakChain) { + ctx.breakHandlerChain(); + } + } + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/event/handler/impl/DialogueContinueEventHandler.java b/src/org/apollo/game/event/handler/impl/DialogueContinueEventHandler.java new file mode 100644 index 00000000..7f43bb7a --- /dev/null +++ b/src/org/apollo/game/event/handler/impl/DialogueContinueEventHandler.java @@ -0,0 +1,23 @@ +package org.apollo.game.event.handler.impl; + +import org.apollo.game.event.handler.EventHandler; +import org.apollo.game.event.handler.EventHandlerContext; +import org.apollo.game.event.impl.DialogueContinueEvent; +import org.apollo.game.model.inter.InterfaceType; +import org.apollo.game.model.Player; + +/** + * An {@link EventHandler} for the {@link DialogueContinueEvent}. + * + * @author Chris Fletcher + */ +public final class DialogueContinueEventHandler extends EventHandler { + + @Override + public void handle(EventHandlerContext ctx, Player player, DialogueContinueEvent event) { + if (player.getInterfaceSet().contains(InterfaceType.DIALOGUE)) { + player.getInterfaceSet().continueRequested(); + } + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/event/impl/DialogueContinueEvent.java b/src/org/apollo/game/event/impl/DialogueContinueEvent.java new file mode 100644 index 00000000..c2bbdaeb --- /dev/null +++ b/src/org/apollo/game/event/impl/DialogueContinueEvent.java @@ -0,0 +1,36 @@ +package org.apollo.game.event.impl; + +import org.apollo.game.event.Event; + +/** + * An {@link Event} that is sent by the client when the player clicks "Click here to continue" button on a dialogue + * interface. + * + * @author Chris Fletcher + */ +public final class DialogueContinueEvent extends Event { + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * Creates a new dialogue continue event. + * + * @param interfaceId The interface id. + */ + public DialogueContinueEvent(int interfaceId) { + this.interfaceId = interfaceId; + } + + /** + * Gets the interface id of the button. + * + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/event/impl/OpenDialogueInterfaceEvent.java b/src/org/apollo/game/event/impl/OpenDialogueInterfaceEvent.java new file mode 100644 index 00000000..ff45b2f5 --- /dev/null +++ b/src/org/apollo/game/event/impl/OpenDialogueInterfaceEvent.java @@ -0,0 +1,35 @@ +package org.apollo.game.event.impl; + +import org.apollo.game.event.Event; + +/** + * An {@link Event} that opens a dialogue interface (an interface that appears in the chat box). + * + * @author Chris Fletcher + */ +public final class OpenDialogueInterfaceEvent extends Event { + + /** + * The interface id. + */ + private final int interfaceId; + + /** + * Creates a new event with the specified interface id. + * + * @param interfaceId The interface id. + */ + public OpenDialogueInterfaceEvent(int interfaceId) { + this.interfaceId = interfaceId; + } + + /** + * Gets the interface id. + * + * @return The interface id. + */ + public int getInterfaceId() { + return interfaceId; + } + +} \ No newline at end of file diff --git a/src/org/apollo/game/event/impl/OpenInterfaceEvent.java b/src/org/apollo/game/event/impl/OpenInterfaceEvent.java index 4f93b9c3..943d3846 100644 --- a/src/org/apollo/game/event/impl/OpenInterfaceEvent.java +++ b/src/org/apollo/game/event/impl/OpenInterfaceEvent.java @@ -3,7 +3,7 @@ package org.apollo.game.event.impl; import org.apollo.game.event.Event; /** - * An event which opens an interface. + * An {@link Event} that opens an interface. * * @author Graham */ diff --git a/src/org/apollo/game/model/inter/InterfaceSet.java b/src/org/apollo/game/model/inter/InterfaceSet.java index be6f6520..251fcb09 100644 --- a/src/org/apollo/game/model/inter/InterfaceSet.java +++ b/src/org/apollo/game/model/inter/InterfaceSet.java @@ -5,9 +5,11 @@ import java.util.Map; import org.apollo.game.event.impl.CloseInterfaceEvent; import org.apollo.game.event.impl.EnterAmountEvent; +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.model.Player; +import org.apollo.game.model.inter.dialogue.DialogueListener; /** * Represents the set of interfaces the player has open. @@ -34,10 +36,15 @@ public final class InterfaceSet { */ private EnterAmountListener amountListener; + /** + * The current chat box dialogue listener. + */ + private DialogueListener dialogueListener; + /** * A map of open interfaces. */ - private Map interfaces = new HashMap(); + private Map 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());