diff options
author | Andrei Karas <akaras@inbox.ru> | 2011-07-28 23:30:51 +0300 |
---|---|---|
committer | Andrei Karas <akaras@inbox.ru> | 2011-07-29 04:26:04 +0300 |
commit | c8b18b47abbb325b6cc4b34abbad52b03825e4f9 (patch) | |
tree | 3fbca23dda0c1c1ec31c54373e4faa74c998bb76 /src | |
parent | 0cc6167c407c1cf18158ca0e154a3b1cab48853d (diff) | |
download | mv-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.
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/Makefile.am | 6 | ||||
-rw-r--r-- | src/net/ea/charserverhandler.cpp | 8 | ||||
-rw-r--r-- | src/net/ea/chathandler.cpp | 359 | ||||
-rw-r--r-- | src/net/ea/chathandler.h | 94 | ||||
-rw-r--r-- | src/net/ea/gamehandler.cpp | 101 | ||||
-rw-r--r-- | src/net/ea/gamehandler.h | 76 | ||||
-rw-r--r-- | src/net/ea/loginhandler.cpp | 4 | ||||
-rw-r--r-- | src/net/ea/loginhandler.h | 2 | ||||
-rw-r--r-- | src/net/tmwa/charserverhandler.cpp | 5 | ||||
-rw-r--r-- | src/net/tmwa/chathandler.cpp | 309 | ||||
-rw-r--r-- | src/net/tmwa/chathandler.h | 29 | ||||
-rw-r--r-- | src/net/tmwa/gamehandler.cpp | 49 | ||||
-rw-r--r-- | src/net/tmwa/gamehandler.h | 24 | ||||
-rw-r--r-- | src/net/tmwa/loginhandler.cpp | 4 |
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" |