summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrei Karas <akaras@inbox.ru>2011-07-28 23:30:51 +0300
committerAndrei Karas <akaras@inbox.ru>2011-07-29 04:26:04 +0300
commitc8b18b47abbb325b6cc4b34abbad52b03825e4f9 (patch)
tree3fbca23dda0c1c1ec31c54373e4faa74c998bb76
parent0cc6167c407c1cf18158ca0e154a3b1cab48853d (diff)
downloadmv-c8b18b47abbb325b6cc4b34abbad52b03825e4f9.tar.gz
mv-c8b18b47abbb325b6cc4b34abbad52b03825e4f9.tar.bz2
mv-c8b18b47abbb325b6cc4b34abbad52b03825e4f9.tar.xz
mv-c8b18b47abbb325b6cc4b34abbad52b03825e4f9.zip
Extract shared logic from chathandler and gamehandler netcode to ea namespace.
-rw-r--r--src/CMakeLists.txt6
-rw-r--r--src/Makefile.am6
-rw-r--r--src/net/ea/charserverhandler.cpp8
-rw-r--r--src/net/ea/chathandler.cpp359
-rw-r--r--src/net/ea/chathandler.h94
-rw-r--r--src/net/ea/gamehandler.cpp101
-rw-r--r--src/net/ea/gamehandler.h76
-rw-r--r--src/net/ea/loginhandler.cpp4
-rw-r--r--src/net/ea/loginhandler.h2
-rw-r--r--src/net/tmwa/charserverhandler.cpp5
-rw-r--r--src/net/tmwa/chathandler.cpp309
-rw-r--r--src/net/tmwa/chathandler.h29
-rw-r--r--src/net/tmwa/gamehandler.cpp49
-rw-r--r--src/net/tmwa/gamehandler.h24
-rw-r--r--src/net/tmwa/loginhandler.cpp4
15 files changed, 658 insertions, 418 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 0c476e4d2..5d2cea383 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -684,9 +684,13 @@ SET(SRCS_EVOL
net/ea/buysellhandler.h
net/ea/charserverhandler.cpp
net/ea/charserverhandler.h
+ net/ea/chathandler.cpp
+ net/ea/chathandler.h
+ net/ea/eaprotocol.h
+ net/ea/gamehandler.cpp
+ net/ea/gamehandler.h
net/ea/loginhandler.cpp
net/ea/loginhandler.h
- net/ea/eaprotocol.h
net/ea/token.h
)
diff --git a/src/Makefile.am b/src/Makefile.am
index f410bde31..44212fab8 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -668,9 +668,13 @@ manaplus_SOURCES += \
net/ea/buysellhandler.h \
net/ea/charserverhandler.cpp \
net/ea/charserverhandler.h \
+ net/ea/chathandler.cpp \
+ net/ea/chathandler.h \
+ net/ea/gamehandler.cpp \
+ net/ea/gamehandler.h \
+ net/ea/eaprotocol.h \
net/ea/loginhandler.cpp \
net/ea/loginhandler.h \
- net/ea/eaprotocol.h \
net/ea/token.h \
net/tmwa/gui/guildtab.cpp \
net/tmwa/gui/guildtab.h \
diff --git a/src/net/ea/charserverhandler.cpp b/src/net/ea/charserverhandler.cpp
index e1fcfda66..c69d8a5be 100644
--- a/src/net/ea/charserverhandler.cpp
+++ b/src/net/ea/charserverhandler.cpp
@@ -23,25 +23,17 @@
#include "net/ea/charserverhandler.h"
#include "client.h"
-#include "configuration.h"
-#include "game.h"
#include "log.h"
#include "gui/charcreatedialog.h"
#include "gui/okdialog.h"
-#include "net/logindata.h"
-#include "net/messageout.h"
#include "net/net.h"
#include "net/ea/loginhandler.h"
#include "net/ea/eaprotocol.h"
-#include "resources/colordb.h"
-
-#include "utils/dtor.h"
#include "utils/gettext.h"
-#include "utils/stringutils.h"
#include "debug.h"
diff --git a/src/net/ea/chathandler.cpp b/src/net/ea/chathandler.cpp
new file mode 100644
index 000000000..658ed9a5d
--- /dev/null
+++ b/src/net/ea/chathandler.cpp
@@ -0,0 +1,359 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/ea/chathandler.h"
+
+#include "actorspritemanager.h"
+#include "being.h"
+#include "configuration.h"
+#include "localplayer.h"
+#include "playerrelations.h"
+#include "log.h"
+
+#include "gui/chatwindow.h"
+#include "gui/shopwindow.h"
+
+#include "gui/widgets/chattab.h"
+
+#include "utils/gettext.h"
+#include "utils/stringutils.h"
+
+#include <string>
+
+#include "debug.h"
+
+namespace Ea
+{
+
+ChatHandler::ChatHandler()
+{
+}
+
+void ChatHandler::me(const std::string &text)
+{
+ std::string action = strprintf("*%s*", text.c_str());
+
+ talk(action);
+}
+
+void ChatHandler::channelList()
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::enterChannel(const std::string &channel A_UNUSED,
+ const std::string &password A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::quitChannel(int channelId A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::sendToChannel(int channelId A_UNUSED,
+ const std::string &text A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::userList(const std::string &channel A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::setChannelTopic(int channelId A_UNUSED,
+ const std::string &text A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::setUserMode(int channelId A_UNUSED,
+ const std::string &name A_UNUSED,
+ int mode A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::kickUser(int channelId A_UNUSED,
+ const std::string &name A_UNUSED)
+{
+ SERVER_NOTICE(_("Channels are not supported!"))
+}
+
+void ChatHandler::processWhisperResponse(Net::MessageIn &msg)
+{
+ std::string nick;
+
+ if (mSentWhispers.empty())
+ {
+ nick = "user";
+ }
+ else
+ {
+ nick = mSentWhispers.front();
+ mSentWhispers.pop();
+ }
+
+ int type = msg.readInt8();
+ switch (type)
+ {
+ case 0x00:
+ // Success (don't need to report)
+ break;
+ case 0x01:
+ if (chatWindow)
+ {
+ chatWindow->whisper(nick,
+ strprintf(_("Whisper could not be "
+ "sent, %s is offline."), nick.c_str()), BY_SERVER);
+ }
+ break;
+ case 0x02:
+ if (chatWindow)
+ {
+ chatWindow->whisper(nick,
+ strprintf(_("Whisper could not "
+ "be sent, ignored by %s."), nick.c_str()),
+ BY_SERVER);
+ }
+ break;
+ default:
+ if (logger)
+ {
+ logger->log("QQQ SMSG_WHISPER_RESPONSE:"
+ + toString(type));
+ }
+ }
+}
+
+void ChatHandler::processWhisper(Net::MessageIn &msg)
+{
+ int chatMsgLength = msg.readInt16() - 28;
+ std::string nick = msg.readString(24);
+
+ if (chatMsgLength <= 0)
+ return;
+
+ std::string chatMsg = msg.readString(chatMsgLength);
+ if (chatMsg.find("\302\202!") == 0)
+ chatMsg = chatMsg.substr(2);
+
+ if (nick != "Server")
+ {
+ if (player_relations.hasPermission(
+ nick, PlayerRelation::WHISPER))
+ {
+ bool tradeBot = config.getBoolValue("tradebot");
+ bool showMsg = !config.getBoolValue("hideShopMessages");
+ if (player_relations.hasPermission(
+ nick, PlayerRelation::TRADE))
+ {
+ if (shopWindow)
+ { //commands to shop from player
+ if (chatMsg.find("!selllist ") == 0)
+ {
+ if (tradeBot)
+ {
+ if (showMsg && chatWindow)
+ chatWindow->whisper(nick, chatMsg);
+ shopWindow->giveList(nick,
+ ShopWindow::SELL);
+ }
+ }
+ else if (chatMsg.find("!buylist ") == 0)
+ {
+ if (tradeBot)
+ {
+ if (showMsg && chatWindow)
+ chatWindow->whisper(nick, chatMsg);
+ shopWindow->giveList(nick,
+ ShopWindow::BUY);
+ }
+ }
+ else if (chatMsg.find("!buyitem ") == 0)
+ {
+ if (showMsg && chatWindow)
+ chatWindow->whisper(nick, chatMsg);
+ if (tradeBot)
+ {
+ shopWindow->processRequest(nick, chatMsg,
+ ShopWindow::BUY);
+ }
+ }
+ else if (chatMsg.find("!sellitem ") == 0)
+ {
+ if (showMsg && chatWindow)
+ chatWindow->whisper(nick, chatMsg);
+ if (tradeBot)
+ {
+ shopWindow->processRequest(nick, chatMsg,
+ ShopWindow::SELL);
+ }
+ }
+ else if (chatMsg.length() > 3
+ && chatMsg.find("\302\202") == 0)
+ {
+ chatMsg = chatMsg.erase(0, 2);
+ if (showMsg && chatWindow)
+ chatWindow->whisper(nick, chatMsg);
+ if (chatMsg.find("B1") == 0
+ || chatMsg.find("S1") == 0)
+ {
+ shopWindow->showList(nick, chatMsg);
+ }
+ }
+ else if (chatWindow)
+ {
+ chatWindow->whisper(nick, chatMsg);
+ }
+ }
+ else if (chatWindow)
+ {
+ chatWindow->whisper(nick, chatMsg);
+ }
+ }
+ else
+ {
+ if (chatWindow && (showMsg
+ || (chatMsg.find("!selllist")
+ != 0 && chatMsg.find("!buylist") != 0)))
+ {
+ chatWindow->whisper(nick, chatMsg);
+ }
+ }
+ }
+ }
+ else if (localChatTab)
+ {
+ localChatTab->chatLog(chatMsg, BY_SERVER);
+ }
+}
+
+void ChatHandler::processBeingChat(Net::MessageIn &msg)
+{
+ if (!actorSpriteManager)
+ return;
+
+ int chatMsgLength = msg.readInt16() - 8;
+ Being *being = actorSpriteManager->findBeing(msg.readInt32());
+
+ if (!being || chatMsgLength <= 0)
+ return;
+
+ std::string chatMsg = msg.readRawString(chatMsgLength);
+
+ if (being->getType() == Being::PLAYER)
+ being->setTalkTime();
+
+ std::string::size_type pos = chatMsg.find(" : ", 0);
+ std::string sender_name = ((pos == std::string::npos)
+ ? "" : chatMsg.substr(0, pos));
+
+ if (sender_name != being->getName()
+ && being->getType() == Being::PLAYER)
+ {
+ if (!being->getName().empty())
+ sender_name = being->getName();
+ }
+ else
+ {
+ chatMsg.erase(0, pos + 3);
+ }
+
+ trim(chatMsg);
+
+ // We use getIgnorePlayer instead of ignoringPlayer here
+ // because ignorePlayer' side effects are triggered
+ // right below for Being::IGNORE_SPEECH_FLOAT.
+ if (player_relations.checkPermissionSilently(sender_name,
+ PlayerRelation::SPEECH_LOG) && chatWindow)
+ {
+ chatWindow->resortChatLog(removeColors(sender_name) + " : "
+ + chatMsg, BY_OTHER);
+ }
+
+ if (player_relations.hasPermission(sender_name,
+ PlayerRelation::SPEECH_FLOAT))
+ {
+ being->setSpeech(chatMsg);
+ }
+}
+
+void ChatHandler::processChat(Net::MessageIn &msg, bool normalChat)
+{
+ int chatMsgLength = msg.readInt16() - 4;
+
+ if (chatMsgLength <= 0)
+ return;
+
+ std::string chatMsg = msg.readRawString(chatMsgLength);
+ std::string::size_type pos = chatMsg.find(" : ", 0);
+
+ if (normalChat)
+ {
+ if (chatWindow)
+ chatWindow->resortChatLog(chatMsg, BY_PLAYER);
+
+ const std::string senseStr = "You sense the following: ";
+ if (actorSpriteManager && !chatMsg.find(senseStr))
+ {
+ actorSpriteManager->parseLevels(
+ chatMsg.substr(senseStr.size()));
+ }
+
+ if (pos != std::string::npos)
+ chatMsg.erase(0, pos + 3);
+
+ trim(chatMsg);
+
+ if (player_node)
+ player_node->setSpeech(chatMsg);
+ }
+ else if (localChatTab)
+ {
+ localChatTab->chatLog(chatMsg, BY_GM);
+ }
+}
+
+void ChatHandler::processMVP(Net::MessageIn &msg)
+{
+ // Display MVP player
+ int id = msg.readInt32(); // id
+ if (localChatTab && actorSpriteManager)
+ {
+ Being *being = actorSpriteManager->findBeing(id);
+ if (!being)
+ {
+ localChatTab->chatLog(_("MVP player."), BY_SERVER);
+ }
+ else
+ {
+ localChatTab->chatLog(_("MVP player: ")
+ + being->getName(), BY_SERVER);
+ }
+ }
+}
+
+} // namespace Ea
+
diff --git a/src/net/ea/chathandler.h b/src/net/ea/chathandler.h
new file mode 100644
index 000000000..d000b673d
--- /dev/null
+++ b/src/net/ea/chathandler.h
@@ -0,0 +1,94 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2004-2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EA_CHATHANDLER_H
+#define NET_EA_CHATHANDLER_H
+
+#include "net/chathandler.h"
+#include "net/messagein.h"
+#include "net/messageout.h"
+#include "net/net.h"
+
+#include <queue>
+
+#ifdef __GNUC__
+#define A_UNUSED __attribute__ ((unused))
+#else
+#define A_UNUSED
+#endif
+
+namespace Ea
+{
+
+class ChatHandler : public Net::ChatHandler
+{
+ public:
+ ChatHandler();
+
+ virtual void talk(const std::string &text) = 0;
+
+ virtual void talkRaw(const std::string &text) = 0;
+
+ void me(const std::string &text);
+
+ virtual void privateMessage(const std::string &recipient,
+ const std::string &text) = 0;
+
+ void channelList();
+
+ void enterChannel(const std::string &channel,
+ const std::string &password);
+
+ void quitChannel(int channelId);
+
+ void sendToChannel(int channelId, const std::string &text);
+
+ void userList(const std::string &channel);
+
+ void setChannelTopic(int channelId, const std::string &text);
+
+ void setUserMode(int channelId, const std::string &name, int mode);
+
+ void kickUser(int channelId, const std::string &name);
+
+ virtual void who() = 0;
+
+ virtual void sendRaw(const std::string &args) = 0;
+
+ virtual void processWhisperResponse(Net::MessageIn &msg);
+
+ virtual void processWhisper(Net::MessageIn &msg);
+
+ virtual void processBeingChat(Net::MessageIn &msg);
+
+ virtual void processChat(Net::MessageIn &msg, bool normalChat);
+
+ virtual void processMVP(Net::MessageIn &msg);
+
+ protected:
+ typedef std::queue<std::string> WhisperQueue;
+ WhisperQueue mSentWhispers;
+};
+
+} // namespace Ea
+
+#endif // NET_EA_CHATHANDLER_H
diff --git a/src/net/ea/gamehandler.cpp b/src/net/ea/gamehandler.cpp
new file mode 100644
index 000000000..694600322
--- /dev/null
+++ b/src/net/ea/gamehandler.cpp
@@ -0,0 +1,101 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "net/ea/gamehandler.h"
+
+#include "client.h"
+#include "event.h"
+#include "game.h"
+#include "localplayer.h"
+#include "log.h"
+
+#include "gui/okdialog.h"
+
+#include "net/messagein.h"
+
+#include "utils/gettext.h"
+
+#include "debug.h"
+
+namespace Ea
+{
+
+GameHandler::GameHandler()
+{
+ mCharID = 0;
+
+ listen(Mana::CHANNEL_GAME);
+}
+
+void GameHandler::event(Mana::Channels channel, const Mana::Event &event)
+{
+ if (channel == Mana::CHANNEL_GAME)
+ {
+ if (event.getName() == Mana::EVENT_ENGINESINITALIZED)
+ Game::instance()->changeMap(mMap);
+ else if (event.getName() == Mana::EVENT_MAPLOADED)
+ mapLoadedEvent();
+ }
+}
+
+void GameHandler::who()
+{
+}
+
+void GameHandler::setMap(const std::string map)
+{
+ mMap = map.substr(0, map.rfind("."));
+}
+
+void GameHandler::processMapLogin(Net::MessageIn &msg)
+{
+ unsigned char direction;
+ Uint16 x, y;
+ msg.readInt32(); // server tick
+ msg.readCoordinates(x, y, direction);
+ msg.skip(2); // unknown
+ logger->log("Protocol: Player start position: (%d, %d),"
+ " Direction: %d", x, y, direction);
+ // Switch now or we'll have problems
+ Client::setState(STATE_GAME);
+ if (player_node)
+ player_node->setTileCoords(x, y);
+}
+
+void GameHandler::processWhoAnswer(Net::MessageIn &msg)
+{
+ SERVER_NOTICE(strprintf(_("Online users: %d"), msg.readInt32()))
+}
+
+void GameHandler::processCharSwitchResponse(Net::MessageIn &msg)
+{
+ if (msg.readInt8())
+ Client::setState(STATE_SWITCH_CHARACTER);
+}
+
+void GameHandler::processMapQuitResponse(Net::MessageIn &msg)
+{
+ if (msg.readInt8())
+ new OkDialog(_("Game"), _("Request to quit denied!"), NULL);
+}
+
+} // namespace TmwAthena
diff --git a/src/net/ea/gamehandler.h b/src/net/ea/gamehandler.h
new file mode 100644
index 000000000..16168636b
--- /dev/null
+++ b/src/net/ea/gamehandler.h
@@ -0,0 +1,76 @@
+/*
+ * The ManaPlus Client
+ * Copyright (C) 2009 The Mana World Development Team
+ * Copyright (C) 2009-2010 The Mana Developers
+ * Copyright (C) 2011 The ManaPlus Developers
+ *
+ * This file is part of The ManaPlus Client.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef NET_EA_GAMEHANDLER_H
+#define NET_EA_GAMEHANDLER_H
+
+#include "listener.h"
+
+#include "net/gamehandler.h"
+#include "net/messagein.h"
+#include "net/net.h"
+
+#ifdef __GNUC__
+#define A_UNUSED __attribute__ ((unused))
+#else
+#define A_UNUSED
+#endif
+
+namespace Ea
+{
+
+class GameHandler : public Net::GameHandler, public Mana::Listener
+{
+ public:
+ GameHandler();
+
+ virtual void event(Mana::Channels channel, const Mana::Event &event);
+
+ virtual void who();
+
+ virtual bool removeDeadBeings() const
+ { return true; }
+
+ virtual void setMap(const std::string map);
+
+ /** The tmwAthena protocol is making use of the MP status bar. */
+ virtual bool canUseMagicBar() const
+ { return true; }
+
+ virtual void mapLoadedEvent() = 0;
+
+ virtual void processMapLogin(Net::MessageIn &msg);
+
+ virtual void processWhoAnswer(Net::MessageIn &msg);
+
+ virtual void processCharSwitchResponse(Net::MessageIn &msg);
+
+ virtual void processMapQuitResponse(Net::MessageIn &msg);
+
+ protected:
+ std::string mMap;
+ int mCharID; /// < Saved for map-server switching
+};
+
+} // namespace Ea
+
+#endif // NET_EA_GAMEHANDLER_H
diff --git a/src/net/ea/loginhandler.cpp b/src/net/ea/loginhandler.cpp
index f6d8e5cf7..2bce6c251 100644
--- a/src/net/ea/loginhandler.cpp
+++ b/src/net/ea/loginhandler.cpp
@@ -26,12 +26,8 @@
#include "log.h"
#include "configuration.h"
-#include "net/logindata.h"
-#include "net/messageout.h"
-
#include "utils/dtor.h"
#include "utils/gettext.h"
-#include "utils/stringutils.h"
#include "debug.h"
diff --git a/src/net/ea/loginhandler.h b/src/net/ea/loginhandler.h
index 3b035b530..06c47ad5d 100644
--- a/src/net/ea/loginhandler.h
+++ b/src/net/ea/loginhandler.h
@@ -102,6 +102,6 @@ class LoginHandler : public Net::LoginHandler
Token mToken;
};
-} // namespace TmwAthena
+} // namespace Ea
#endif // NET_TA_LOGINHANDLER_H
diff --git a/src/net/tmwa/charserverhandler.cpp b/src/net/tmwa/charserverhandler.cpp
index 57f65cbd4..fe803dc62 100644
--- a/src/net/tmwa/charserverhandler.cpp
+++ b/src/net/tmwa/charserverhandler.cpp
@@ -24,15 +24,12 @@
#include "client.h"
#include "configuration.h"
-#include "game.h"
#include "log.h"
#include "gui/charcreatedialog.h"
-#include "gui/okdialog.h"
#include "net/logindata.h"
#include "net/messagein.h"
-#include "net/messageout.h"
#include "net/net.h"
#include "net/tmwa/gamehandler.h"
@@ -43,8 +40,6 @@
#include "resources/colordb.h"
#include "utils/dtor.h"
-#include "utils/gettext.h"
-#include "utils/stringutils.h"
#include "debug.h"
diff --git a/src/net/tmwa/chathandler.cpp b/src/net/tmwa/chathandler.cpp
index 3ce30ce84..0f23f6412 100644
--- a/src/net/tmwa/chathandler.cpp
+++ b/src/net/tmwa/chathandler.cpp
@@ -41,9 +41,6 @@
#include "net/tmwa/protocol.h"
-#include "utils/gettext.h"
-#include "utils/stringutils.h"
-
#include <string>
#include "debug.h"
@@ -74,273 +71,30 @@ void ChatHandler::handleMessage(Net::MessageIn &msg)
if (!localChatTab)
return;
- Being *being;
- std::string chatMsg;
- std::string nick;
- int chatMsgLength;
-
switch (msg.getId())
{
case SMSG_WHISPER_RESPONSE:
- {
- if (mSentWhispers.empty())
- {
- nick = "user";
- }
- else
- {
- nick = mSentWhispers.front();
- mSentWhispers.pop();
- }
-
- int type = msg.readInt8();
- switch (type)
- {
- case 0x00:
- // Success (don't need to report)
- break;
- case 0x01:
- if (chatWindow)
- {
- chatWindow->whisper(nick,
- strprintf(_("Whisper could not be "
- "sent, %s is offline."), nick.c_str()), BY_SERVER);
- }
- break;
- case 0x02:
- if (chatWindow)
- {
- chatWindow->whisper(nick,
- strprintf(_("Whisper could not "
- "be sent, ignored by %s."), nick.c_str()),
- BY_SERVER);
- }
- break;
- default:
- if (logger)
- {
- logger->log("QQQ SMSG_WHISPER_RESPONSE:"
- + toString(type));
- }
- }
+ processWhisperResponse(msg);
break;
- }
// Received whisper
case SMSG_WHISPER:
- {
- chatMsgLength = msg.readInt16() - 28;
- nick = msg.readString(24);
-
- if (chatMsgLength <= 0)
- break;
-
- chatMsg = msg.readString(chatMsgLength);
- if (chatMsg.find("\302\202!") == 0)
- chatMsg = chatMsg.substr(2);
-
- if (nick != "Server")
- {
- if (player_relations.hasPermission(
- nick, PlayerRelation::WHISPER))
- {
- bool tradeBot = config.getBoolValue("tradebot");
- bool showMsg = !config.getBoolValue("hideShopMessages");
- if (player_relations.hasPermission(
- nick, PlayerRelation::TRADE))
- {
- if (shopWindow)
- { //commands to shop from player
- if (chatMsg.find("!selllist ") == 0)
- {
- if (tradeBot)
- {
- if (showMsg && chatWindow)
- chatWindow->whisper(nick, chatMsg);
- shopWindow->giveList(nick,
- ShopWindow::SELL);
- }
- }
- else if (chatMsg.find("!buylist ") == 0)
- {
- if (tradeBot)
- {
- if (showMsg && chatWindow)
- chatWindow->whisper(nick, chatMsg);
- shopWindow->giveList(nick,
- ShopWindow::BUY);
- }
- }
- else if (chatMsg.find("!buyitem ") == 0)
- {
- if (showMsg && chatWindow)
- chatWindow->whisper(nick, chatMsg);
- if (tradeBot)
- {
- shopWindow->processRequest(nick, chatMsg,
- ShopWindow::BUY);
- }
- }
- else if (chatMsg.find("!sellitem ") == 0)
- {
- if (showMsg && chatWindow)
- chatWindow->whisper(nick, chatMsg);
- if (tradeBot)
- {
- shopWindow->processRequest(nick, chatMsg,
- ShopWindow::SELL);
- }
- }
- else if (chatMsg.length() > 3
- && chatMsg.find("\302\202") == 0)
- {
- chatMsg = chatMsg.erase(0, 2);
- if (showMsg && chatWindow)
- chatWindow->whisper(nick, chatMsg);
- if (chatMsg.find("B1") == 0
- || chatMsg.find("S1") == 0)
- {
- shopWindow->showList(nick, chatMsg);
- }
- }
- else if (chatWindow)
- {
- chatWindow->whisper(nick, chatMsg);
- }
- }
- else if (chatWindow)
- {
- chatWindow->whisper(nick, chatMsg);
- }
- }
- else
- {
- if (chatWindow && (showMsg
- || (chatMsg.find("!selllist")
- != 0 && chatMsg.find("!buylist") != 0)))
- {
- chatWindow->whisper(nick, chatMsg);
- }
- }
- }
- }
- else if (localChatTab)
- {
- localChatTab->chatLog(chatMsg, BY_SERVER);
- }
-
+ processWhisper(msg);
break;
- }
// Received speech from being
case SMSG_BEING_CHAT:
- {
- if (!actorSpriteManager)
- return;
-
- chatMsgLength = msg.readInt16() - 8;
- being = actorSpriteManager->findBeing(msg.readInt32());
-
- if (!being || chatMsgLength <= 0)
- break;
-
- chatMsg = msg.readRawString(chatMsgLength);
-
- if (being->getType() == Being::PLAYER)
- being->setTalkTime();
-
- std::string::size_type pos = chatMsg.find(" : ", 0);
- std::string sender_name = ((pos == std::string::npos)
- ? "" : chatMsg.substr(0, pos));
-
- if (sender_name != being->getName()
- && being->getType() == Being::PLAYER)
- {
- if (!being->getName().empty())
- sender_name = being->getName();
- }
- else
- {
- chatMsg.erase(0, pos + 3);
- }
-
- trim(chatMsg);
-
- // We use getIgnorePlayer instead of ignoringPlayer here
- // because ignorePlayer' side effects are triggered
- // right below for Being::IGNORE_SPEECH_FLOAT.
- if (player_relations.checkPermissionSilently(sender_name,
- PlayerRelation::SPEECH_LOG) && chatWindow)
- {
- chatWindow->resortChatLog(removeColors(sender_name) + " : "
- + chatMsg, BY_OTHER);
- }
-
- if (player_relations.hasPermission(sender_name,
- PlayerRelation::SPEECH_FLOAT))
- {
- being->setSpeech(chatMsg);
- }
+ processBeingChat(msg);
break;
- }
case SMSG_PLAYER_CHAT:
case SMSG_GM_CHAT:
- {
- chatMsgLength = msg.readInt16() - 4;
-
- if (chatMsgLength <= 0)
- break;
-
- chatMsg = msg.readRawString(chatMsgLength);
- std::string::size_type pos = chatMsg.find(" : ", 0);
-
- if (msg.getId() == SMSG_PLAYER_CHAT)
- {
- if (chatWindow)
- chatWindow->resortChatLog(chatMsg, BY_PLAYER);
-
- const std::string senseStr = "You sense the following: ";
- if (actorSpriteManager && !chatMsg.find(senseStr))
- {
- actorSpriteManager->parseLevels(
- chatMsg.substr(senseStr.size()));
- }
-
- if (pos != std::string::npos)
- chatMsg.erase(0, pos + 3);
-
- trim(chatMsg);
-
- if (player_node)
- player_node->setSpeech(chatMsg);
- }
- else if (localChatTab)
- {
- localChatTab->chatLog(chatMsg, BY_GM);
- }
+ processChat(msg, msg.getId() == SMSG_PLAYER_CHAT);
break;
- }
case SMSG_MVP:
- {
- // Display MVP player
- int id = msg.readInt32(); // id
- if (localChatTab && actorSpriteManager)
- {
- being = actorSpriteManager->findBeing(id);
- if (!being)
- {
- localChatTab->chatLog(_("MVP player."), BY_SERVER);
- }
- else
- {
- localChatTab->chatLog(_("MVP player: ")
- + being->getName(), BY_SERVER);
- }
- }
+ processMVP(msg);
break;
- }
default:
break;
@@ -369,13 +123,6 @@ void ChatHandler::talkRaw(const std::string &mes)
outMsg.writeString(mes, static_cast<int>(mes.length() + 1));
}
-void ChatHandler::me(const std::string &text)
-{
- std::string action = strprintf("*%s*", text.c_str());
-
- talk(action);
-}
-
void ChatHandler::privateMessage(const std::string &recipient,
const std::string &text)
{
@@ -386,52 +133,6 @@ void ChatHandler::privateMessage(const std::string &recipient,
mSentWhispers.push(recipient);
}
-void ChatHandler::channelList()
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::enterChannel(const std::string &channel A_UNUSED,
- const std::string &password A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::quitChannel(int channelId A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::sendToChannel(int channelId A_UNUSED,
- const std::string &text A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::userList(const std::string &channel A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::setChannelTopic(int channelId A_UNUSED,
- const std::string &text A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::setUserMode(int channelId A_UNUSED,
- const std::string &name A_UNUSED,
- int mode A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
-void ChatHandler::kickUser(int channelId A_UNUSED,
- const std::string &name A_UNUSED)
-{
- SERVER_NOTICE(_("Channels are not supported!"))
-}
-
void ChatHandler::who()
{
MessageOut outMsg(CMSG_WHO_REQUEST);
diff --git a/src/net/tmwa/chathandler.h b/src/net/tmwa/chathandler.h
index c1b1f26fa..d9e927e03 100644
--- a/src/net/tmwa/chathandler.h
+++ b/src/net/tmwa/chathandler.h
@@ -26,9 +26,9 @@
#include "net/chathandler.h"
#include "net/net.h"
-#include "net/tmwa/messagehandler.h"
+#include "net/ea/chathandler.h"
-#include <queue>
+#include "net/tmwa/messagehandler.h"
#ifdef __GNUC__
#define A_UNUSED __attribute__ ((unused))
@@ -39,7 +39,7 @@
namespace TmwAthena
{
-class ChatHandler : public MessageHandler, public Net::ChatHandler
+class ChatHandler : public MessageHandler, public Ea::ChatHandler
{
public:
ChatHandler();
@@ -50,37 +50,14 @@ class ChatHandler : public MessageHandler, public Net::ChatHandler
void talkRaw(const std::string &text);
- void me(const std::string &text);
-
void privateMessage(const std::string &recipient,
const std::string &text);
- void channelList();
-
- void enterChannel(const std::string &channel,
- const std::string &password);
-
- void quitChannel(int channelId);
-
- void sendToChannel(int channelId, const std::string &text);
-
- void userList(const std::string &channel);
-
- void setChannelTopic(int channelId, const std::string &text);
-
- void setUserMode(int channelId, const std::string &name, int mode);
-
- void kickUser(int channelId, const std::string &name);
-
void who();
void sendRaw(const std::string &args);
void processRaw(MessageOut &outMsg, std::string &line);
-
- private:
- typedef std::queue<std::string> WhisperQueue;
- WhisperQueue mSentWhispers;
};
} // namespace TmwAthena
diff --git a/src/net/tmwa/gamehandler.cpp b/src/net/tmwa/gamehandler.cpp
index 99d4841b2..cc0a37c57 100644
--- a/src/net/tmwa/gamehandler.cpp
+++ b/src/net/tmwa/gamehandler.cpp
@@ -28,8 +28,6 @@
#include "localplayer.h"
#include "log.h"
-#include "gui/okdialog.h"
-
#include "net/messagein.h"
#include "net/messageout.h"
@@ -37,9 +35,6 @@
#include "net/tmwa/network.h"
#include "net/tmwa/protocol.h"
-#include "utils/gettext.h"
-#include "utils/stringutils.h"
-
#include "debug.h"
extern Net::GameHandler *gameHandler;
@@ -62,9 +57,6 @@ GameHandler::GameHandler()
};
handledMessages = _messages;
gameHandler = this;
- mCharID = 0;
-
- listen(Mana::CHANNEL_GAME);
}
void GameHandler::handleMessage(Net::MessageIn &msg)
@@ -72,20 +64,8 @@ void GameHandler::handleMessage(Net::MessageIn &msg)
switch (msg.getId())
{
case SMSG_MAP_LOGIN_SUCCESS:
- {
- unsigned char direction;
- Uint16 x, y;
- msg.readInt32(); // server tick
- msg.readCoordinates(x, y, direction);
- msg.skip(2); // unknown
- logger->log("Protocol: Player start position: (%d, %d),"
- " Direction: %d", x, y, direction);
- // Switch now or we'll have problems
- Client::setState(STATE_GAME);
- if (player_node)
- player_node->setTileCoords(x, y);
+ processMapLogin(msg);
break;
- }
case SMSG_SERVER_PING:
// We ignore this for now
@@ -93,17 +73,15 @@ void GameHandler::handleMessage(Net::MessageIn &msg)
break;
case SMSG_WHO_ANSWER:
- SERVER_NOTICE(strprintf(_("Online users: %d"), msg.readInt32()))
+ processWhoAnswer(msg);
break;
case SMSG_CHAR_SWITCH_RESPONSE:
- if (msg.readInt8())
- Client::setState(STATE_SWITCH_CHARACTER);
+ processCharSwitchResponse(msg);
break;
case SMSG_MAP_QUIT_RESPONSE:
- if (msg.readInt8())
- new OkDialog(_("Game"), _("Request to quit denied!"), NULL);
+ processMapQuitResponse(msg);
break;
default:
@@ -111,15 +89,9 @@ void GameHandler::handleMessage(Net::MessageIn &msg)
}
}
-void GameHandler::event(Mana::Channels channel, const Mana::Event &event)
+void GameHandler::mapLoadedEvent()
{
- if (channel == Mana::CHANNEL_GAME)
- {
- if (event.getName() == Mana::EVENT_ENGINESINITALIZED)
- Game::instance()->changeMap(mMap);
- else if (event.getName() == Mana::EVENT_MAPLOADED)
- MessageOut outMsg(CMSG_MAP_LOADED);
- }
+ MessageOut outMsg(CMSG_MAP_LOADED);
}
void GameHandler::connect()
@@ -172,10 +144,6 @@ void GameHandler::disconnect()
mNetwork->disconnect();
}
-void GameHandler::who()
-{
-}
-
void GameHandler::quit()
{
MessageOut outMsg(CMSG_CLIENT_QUIT);
@@ -187,11 +155,6 @@ void GameHandler::ping(int tick)
msg.writeInt32(tick);
}
-void GameHandler::setMap(const std::string map)
-{
- mMap = map.substr(0, map.rfind("."));
-}
-
void GameHandler::disconnect2()
{
MessageOut outMsg(CMSG_CLIENT_DISCONNECT);
diff --git a/src/net/tmwa/gamehandler.h b/src/net/tmwa/gamehandler.h
index 4abfd43c0..6824ee672 100644
--- a/src/net/tmwa/gamehandler.h
+++ b/src/net/tmwa/gamehandler.h
@@ -23,15 +23,13 @@
#ifndef NET_TA_MAPHANDLER_H
#define NET_TA_MAPHANDLER_H
-#include "listener.h"
-
#include "net/gamehandler.h"
#include "net/net.h"
#include "net/serverinfo.h"
#include "net/tmwa/messagehandler.h"
-#include "net/ea/token.h"
+#include "net/ea/gamehandler.h"
#ifdef __GNUC__
#define A_UNUSED __attribute__ ((unused))
@@ -42,44 +40,28 @@
namespace TmwAthena
{
-class GameHandler : public MessageHandler, public Net::GameHandler,
- public Mana::Listener
+class GameHandler : public MessageHandler, public Ea::GameHandler
{
public:
GameHandler();
void handleMessage(Net::MessageIn &msg);
- void event(Mana::Channels channel, const Mana::Event &event);
-
void connect();
bool isConnected();
void disconnect();
- void who();
-
void quit();
void ping(int tick);
- bool removeDeadBeings() const
- { return true; }
-
void clear();
- void setMap(const std::string map);
-
- /** The tmwAthena protocol is making use of the MP status bar. */
- bool canUseMagicBar() const
- { return true; }
-
void disconnect2();
- private:
- std::string mMap;
- int mCharID; /// < Saved for map-server switching
+ void mapLoadedEvent();
};
} // namespace TmwAthena
diff --git a/src/net/tmwa/loginhandler.cpp b/src/net/tmwa/loginhandler.cpp
index 62d8833ec..15ed2f27c 100644
--- a/src/net/tmwa/loginhandler.cpp
+++ b/src/net/tmwa/loginhandler.cpp
@@ -26,16 +26,12 @@
#include "log.h"
#include "configuration.h"
-#include "net/logindata.h"
#include "net/messagein.h"
-#include "net/messageout.h"
#include "net/tmwa/network.h"
#include "net/tmwa/protocol.h"
-#include "utils/dtor.h"
#include "utils/gettext.h"
-#include "utils/stringutils.h"
#include "debug.h"