Add support for dialogue interfaces; Change interface comments.

This commit is contained in:
Major-
2014-02-13 22:44:52 +00:00
parent a2c744a7a9
commit cdee2581aa
16 changed files with 353 additions and 3 deletions
+7
View File
@@ -22,9 +22,16 @@
<event>
<type>org.apollo.game.event.impl.ButtonEvent</type>
<chain>
<handler>org.apollo.game.event.handler.impl.DialogueButtonHandler</handler>
<handler>org.apollo.game.event.handler.impl.BankButtonEventHandler</handler>
</chain>
</event>
<event>
<type>org.apollo.game.event.impl.DialogueContinueEvent</type>
<chain>
<handler>org.apollo.game.event.handler.impl.DialogueContinueEventHandler</handler>
</chain>
</event>
<event>
<type>org.apollo.game.event.impl.CommandEvent</type>
<chain>
@@ -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<ButtonEvent> {
@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();
}
}
}
}
@@ -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<DialogueContinueEvent> {
@Override
public void handle(EventHandlerContext ctx, Player player, DialogueContinueEvent event) {
if (player.getInterfaceSet().contains(InterfaceType.DIALOGUE)) {
player.getInterfaceSet().continueRequested();
}
}
}
@@ -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;
}
}
@@ -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;
}
}
@@ -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
*/
@@ -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<InterfaceType, Integer> interfaces = new HashMap<InterfaceType, Integer>();
private Map<InterfaceType, Integer> 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.
*
@@ -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() {
}
}
@@ -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.
* <p>
* 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.
* </p>
*
* @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();
}
@@ -0,0 +1,4 @@
/**
* Contains dialogue-related classes.
*/
package org.apollo.game.model.inter.dialogue;
@@ -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<DialogueContinueEvent> {
@Override
public DialogueContinueEvent decode(GamePacket packet) {
GamePacketReader reader = new GamePacketReader(packet);
int interfaceId = (int) reader.getUnsigned(DataType.SHORT);
return new DialogueContinueEvent(interfaceId);
}
}
@@ -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<OpenDialogueInterfaceEvent> {
@Override
public GamePacket encode(OpenDialogueInterfaceEvent event) {
GamePacketBuilder builder = new GamePacketBuilder(164);
builder.put(DataType.SHORT, DataOrder.LITTLE, event.getInterfaceId());
return builder.toGamePacket();
}
}
@@ -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());
@@ -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<DialogueContinueEvent> {
@Override
public DialogueContinueEvent decode(GamePacket packet) {
GamePacketReader reader = new GamePacketReader(packet);
int interfaceId = (int) reader.getUnsigned(DataType.SHORT);
return new DialogueContinueEvent(interfaceId);
}
}
@@ -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<OpenDialogueInterfaceEvent> {
@Override
public GamePacket encode(OpenDialogueInterfaceEvent event) {
GamePacketBuilder builder = new GamePacketBuilder(109);
builder.put(DataType.SHORT, event.getInterfaceId());
return builder.toGamePacket();
}
}
@@ -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());