package net.scapeemulator.game.msg;
import java.util.HashMap;
import java.util.Map;
import net.scapeemulator.game.dispatcher.button.ButtonDispatcher;
import net.scapeemulator.game.dispatcher.command.CommandDispatcher;
import net.scapeemulator.game.dispatcher.grounditem.GroundItemDispatcher;
import net.scapeemulator.game.dispatcher.item.*;
import net.scapeemulator.game.dispatcher.npc.NPCDispatcher;
import net.scapeemulator.game.dispatcher.object.ObjectDispatcher;
import net.scapeemulator.game.dispatcher.player.PlayerDispatcher;
import net.scapeemulator.game.model.player.Player;
import net.scapeemulator.game.msg.handler.*;
import net.scapeemulator.game.msg.handler.inter.*;
import net.scapeemulator.game.msg.handler.item.*;
import net.scapeemulator.game.msg.handler.npc.*;
import net.scapeemulator.game.msg.handler.object.ObjectExamineMessageHandler;
import net.scapeemulator.game.msg.handler.object.ObjectOptionMessageHandler;
import net.scapeemulator.game.msg.impl.*;
import net.scapeemulator.game.msg.impl.button.ButtonOptionMessage;
import net.scapeemulator.game.msg.impl.camera.CameraAngleMessage;
import net.scapeemulator.game.msg.impl.grounditem.GroundItemOptionMessage;
import net.scapeemulator.game.msg.impl.inter.InterfaceClosedMessage;
import net.scapeemulator.game.msg.impl.inter.InterfaceInputMessage;
import net.scapeemulator.game.msg.impl.item.*;
import net.scapeemulator.game.msg.impl.npc.*;
import net.scapeemulator.game.msg.impl.object.ObjectExamineMessage;
import net.scapeemulator.game.msg.impl.object.ObjectOptionMessage;
import net.scapeemulator.game.msg.impl.player.PlayerOptionMessage;
import net.scapeemulator.game.plugin.ScriptContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public final class MessageDispatcher {
private static final Logger logger = LoggerFactory.getLogger(MessageDispatcher.class);
private final Map<Class<?>, MessageHandler<?>> handlers = new HashMap<>();
private final ButtonDispatcher buttonDispatcher = new ButtonDispatcher();
private final CommandDispatcher commandDispatcher = new CommandDispatcher();
private final GroundItemDispatcher groundItemDispatcher = new GroundItemDispatcher();
private final ItemOnItemDispatcher itemOnItemDispatcher = new ItemOnItemDispatcher();
private final ItemOnObjectDispatcher itemOnObjectDispatcher = new ItemOnObjectDispatcher();
private final ItemDispatcher itemDispatcher = new ItemDispatcher();
private final ItemOnNPCDispatcher itemOnNPCDispatcher = new ItemOnNPCDispatcher();
private final ItemOnGroundItemDispatcher itemOnGroundItemDispatcher = new ItemOnGroundItemDispatcher();
private final ObjectDispatcher objectDispatcher = new ObjectDispatcher();
private final PlayerDispatcher playerDispatcher = new PlayerDispatcher();
private final NPCDispatcher npcDispatcher = new NPCDispatcher();
public MessageDispatcher() {
bind(PingMessage.class, new PingMessageHandler());
bind(IdleLogoutMessage.class, new IdleLogoutMessageHandler());
bind(WalkMessage.class, new WalkMessageHandler());
bind(ChatMessage.class, new ChatMessageHandler());
bind(CommandMessage.class, new CommandMessageHandler(commandDispatcher));
bind(SwapItemsMessage.class, new SwapItemsMessageHandler());
bind(DisplayMessage.class, new DisplayMessageHandler());
bind(RemoveItemMessage.class, new RemoveItemMessageHandler());
bind(RegionChangedMessage.class, new RegionChangedMessageHandler());
bind(ClickMessage.class, new ClickMessageHandler());
bind(FocusMessage.class, new FocusMessageHandler());
bind(GrandExchangeSearchMessage.class, new GrandExchangeSearchMessageHandler());
bind(CameraAngleMessage.class, new CameraAngleMessageHandler());
bind(FlagsMessage.class, new FlagsMessageHandler());
bind(PrivacySettingsUpdateMessage.class, new PrivacySettingsUpdateMessageHandler());
bind(PrivateChatSentMessage.class, new PrivateChatSentMessageHandler());
bind(FriendListOperationMessage.class, new FriendListOperationMessageHandler());
bind(SequenceNumberMessage.class, new SequenceNumberMessageHandler());
bind(InterfaceClosedMessage.class, new InterfaceClosedMessageHandler());
bind(SceneRebuiltMessage.class, new SceneRebuiltMessageHandler());
bind(ScriptInputMessage.class, new ScriptInputMessageHandler());
bind(GroundItemOptionMessage.class, new GroundItemOptionMessageHandler(groundItemDispatcher));
bind(ItemOnItemMessage.class, new ItemOnItemMessageHandler(itemOnItemDispatcher));
bind(MagicOnItemMessage.class, new MagicOnItemMessageHandler(itemDispatcher));
bind(ItemOnObjectMessage.class, new ItemOnObjectMessageHandler(itemOnObjectDispatcher));
bind(ItemOptionMessage.class, new ItemOptionMessageHandler(itemDispatcher));
bind(ItemOnNPCMessage.class, new ItemOnNPCMessageHandler(itemOnNPCDispatcher));
bind(ItemOnGroundItemMessage.class, new ItemOnGroundItemMessageHandler(itemOnGroundItemDispatcher));
bind(ItemExamineMessage.class, new ItemExamineMessageHandler());
bind(ItemDropMessage.class, new ItemDropMessageHandler());
bind(ButtonOptionMessage.class, new ButtonOptionMessageHandler(buttonDispatcher));
bind(ObjectOptionMessage.class, new ObjectOptionMessageHandler(objectDispatcher));
bind(ObjectExamineMessage.class, new ObjectExamineMessageHandler());
bind(PlayerOptionMessage.class, new PlayerOptionMessageHandler(playerDispatcher));
bind(NPCOptionMessage.class, new NPCOptionMessageHandler(npcDispatcher));
bind(MagicOnNPCMessage.class, new MagicOnNPCMessageHandler(npcDispatcher));
bind(NPCExamineMessage.class, new NPCExamineMessageHandler());
bind(InterfaceInputMessage.class, new InterfaceInputMessageHandler());
}
public void decorateDispatchers(ScriptContext context) {
context.decorateButtonDispatcher(buttonDispatcher);
context.decorateCommandDispatcher(commandDispatcher);
context.decorateItemOnItemDispatcher(itemOnItemDispatcher);
context.decorateItemOnObjectDispatcher(itemOnObjectDispatcher);
context.decorateItemDispatcher(itemDispatcher);
context.decorateObjectDispatcher(objectDispatcher);
context.decoratePlayerDispatcher(playerDispatcher);
context.decorateNPCDispatcher(npcDispatcher);
}
public <T extends Message> void bind(Class<T> clazz, MessageHandler<T> handler) {
handlers.put(clazz, handler);
}
@SuppressWarnings("unchecked")
public void dispatch(Player player, Message message) {
MessageHandler<Message> handler = (MessageHandler<Message>) handlers.get(message.getClass());
if (handler != null) {
try {
handler.handle(player, message);
} catch (Throwable t) {
logger.warn("Error processing packet.", t);
}
} else {
logger.warn("Cannot dispatch message (no handler): " + message.getClass().getName() + ".");
}
}
public ButtonDispatcher getButtonDispatcher() {
return buttonDispatcher;
}
public CommandDispatcher getCommandDispatcher() {
return commandDispatcher;
}
public GroundItemDispatcher getGroundItemDispatcher() {
return groundItemDispatcher;
}
public ItemOnItemDispatcher getItemOnItemDispatcher() {
return itemOnItemDispatcher;
}
public ItemOnObjectDispatcher getItemOnObjectDispatcher() {
return itemOnObjectDispatcher;
}
public ItemOnNPCDispatcher getItemOnNPCDispatcher() {
return itemOnNPCDispatcher;
}
public ItemOnGroundItemDispatcher getItemOnGroundItemDispatcher() {
return itemOnGroundItemDispatcher;
}
public ItemDispatcher getItemDispatcher() {
return itemDispatcher;
}
public ObjectDispatcher getObjectDispatcher() {
return objectDispatcher;
}
public PlayerDispatcher getPlayerDispatcher() {
return playerDispatcher;
}
public NPCDispatcher getNpcDispatcher() {
return npcDispatcher;
}
}