diff options
33 files changed, 984 insertions, 399 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index a3356fd2..ce8880de 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -241,6 +241,7 @@ SET(SRCS net/guildhandler.h net/inventoryhandler.h net/loginhandler.h + net/logouthandler.h net/maphandler.h net/messagehandler.cpp net/messagehandler.h @@ -433,12 +434,16 @@ SET(SRCS_EA net/ea/chathandler.h net/ea/equipmenthandler.cpp net/ea/equipmenthandler.h + net/ea/generalhandler.cpp + net/ea/generalhandler.h net/ea/inventoryhandler.cpp net/ea/inventoryhandler.h net/ea/itemhandler.cpp net/ea/itemhandler.h net/ea/loginhandler.cpp net/ea/loginhandler.h + net/ea/logouthandler.cpp + net/ea/logouthandler.h net/ea/maphandler.cpp net/ea/maphandler.h net/ea/network.cpp @@ -518,6 +523,8 @@ SET(SRCS_TMW net/tmwserv/connection.h net/tmwserv/effecthandler.cpp net/tmwserv/effecthandler.h + net/tmwserv/generalhandler.cpp + net/tmwserv/generalhandler.h net/tmwserv/guildhandler.cpp net/tmwserv/guildhandler.h net/tmwserv/internal.cpp diff --git a/src/Makefile.am b/src/Makefile.am index ec767317..12f20620 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -189,6 +189,7 @@ tmw_SOURCES = gui/widgets/avatar.cpp \ net/guildhandler.h \ net/inventoryhandler.h \ net/loginhandler.h \ + net/logouthandler.h \ net/maphandler.h \ net/messagehandler.cpp \ net/messagehandler.h \ @@ -420,6 +421,8 @@ tmw_SOURCES += \ net/tmwserv/connection.h \ net/tmwserv/effecthandler.cpp \ net/tmwserv/effecthandler.h \ + net/tmwserv/generalhandler.cpp \ + net/tmwserv/generalhandler.h \ net/tmwserv/guildhandler.cpp \ net/tmwserv/guildhandler.h \ net/tmwserv/internal.cpp \ @@ -476,12 +479,16 @@ tmw_SOURCES += \ net/ea/chathandler.h \ net/ea/equipmenthandler.cpp \ net/ea/equipmenthandler.h \ + net/ea/generalhandler.cpp \ + net/ea/generalhandler.h \ net/ea/inventoryhandler.cpp \ net/ea/inventoryhandler.h \ net/ea/itemhandler.cpp \ net/ea/itemhandler.h \ net/ea/loginhandler.cpp \ net/ea/loginhandler.h \ + net/ea/logouthandler.cpp \ + net/ea/logouthandler.h \ net/ea/maphandler.cpp \ net/ea/maphandler.h \ net/ea/network.cpp \ diff --git a/src/game.cpp b/src/game.cpp index a181fc2a..71e22dca 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -85,6 +85,7 @@ #include "gui/storagewindow.h" #endif +#include "net/generalhandler.h" #include "net/maphandler.h" #include "net/net.h" @@ -104,7 +105,6 @@ #include "net/tmwserv/guildhandler.h" #include "net/tmwserv/partyhandler.h" #else -#include "net/ea/gui/partytab.h" #include "net/ea/adminhandler.h" #include "net/ea/chathandler.h" #include "net/ea/beinghandler.h" @@ -311,6 +311,8 @@ static void createGuiWindows() { logger->setChatWindow(chatWindow); } + + Net::getGeneralHandler()->guiWindowsLoaded(); } /** @@ -355,38 +357,7 @@ static void destroyGuiWindows() #endif } -#ifdef TMWSERV_SUPPORT Game::Game(): - mBeingHandler(new BeingHandler), - mGuildHandler(new GuildHandler), - mEffectHandler(new EffectHandler), -#else -Game::Game(Network *network): - mNetwork(network), - mBeingHandler(new BeingHandler(config.getValue("EnableSync", 0) == 1)), - mAdminHandler(new EAthena::AdminHandler), - mEquipmentHandler(new EquipmentHandler), - mSkillHandler(new EAthena::SkillHandler), -#endif - mPartyHandler(new PartyHandler), - mBuySellHandler(new BuySellHandler), -#ifdef TMWSERV_SUPPORT - mChatHandler(new TmwServ::ChatHandler), - mInventoryHandler(new TmwServ::InventoryHandler), -#else - mChatHandler(new EAthena::ChatHandler), - mInventoryHandler(new EAthena::InventoryHandler), -#endif - mItemHandler(new ItemHandler), -#ifdef TMWSERV_SUPPORT - mNpcHandler(new TmwServ::NpcHandler), - mPlayerHandler(new TmwServ::PlayerHandler), - mTradeHandler(new TmwServ::TradeHandler), -#else - mNpcHandler(new EAthena::NpcHandler), - mPlayerHandler(new EAthena::PlayerHandler), - mTradeHandler(new EAthena::TradeHandler), -#endif mLastTarget(Being::UNKNOWN), mLogicCounterId(0), mSecondsCounterId(0) { @@ -422,33 +393,12 @@ Game::Game(Network *network): if (Joystick::getNumberOfJoysticks() > 0) joystick = new Joystick(0); -#ifdef TMWSERV_SUPPORT - Net::registerHandler(mBeingHandler.get()); - Net::registerHandler(mBuySellHandler.get()); - Net::registerHandler(mChatHandler.get()); - Net::registerHandler(mGuildHandler.get()); - Net::registerHandler(mInventoryHandler.get()); - Net::registerHandler(mItemHandler.get()); - Net::registerHandler(mNpcHandler.get()); - Net::registerHandler(mPartyHandler.get()); - Net::registerHandler(mPlayerHandler.get()); - Net::registerHandler(mTradeHandler.get()); - Net::registerHandler(mEffectHandler.get()); -#else - network->registerHandler(mAdminHandler.get()); - network->registerHandler(mBeingHandler.get()); - network->registerHandler(mBuySellHandler.get()); - network->registerHandler(mChatHandler.get()); - network->registerHandler(mEquipmentHandler.get()); - network->registerHandler(mInventoryHandler.get()); - network->registerHandler(mItemHandler.get()); - network->registerHandler(mNpcHandler.get()); - network->registerHandler(mPlayerHandler.get()); - network->registerHandler(mSkillHandler.get()); - network->registerHandler(mTradeHandler.get()); - network->registerHandler(mPartyHandler.get()); - - partyTab = new PartyTab(); +#ifdef EATHENA_SUPPORT + map_path = map_path.substr(0, map_path.rfind(".")); + engine->changeMap(map_path); +#endif + + setupWindow->setInGame(true); /* * To prevent the server from sending data before the client @@ -460,20 +410,13 @@ Game::Game(Network *network): * is ignored by the client */ Net::getMapHandler()->ping(tick_time); - - map_path = map_path.substr(0, map_path.rfind(".")); - engine->changeMap(map_path); -#endif - - setupWindow->setInGame(true); } Game::~Game() { + Net::getGeneralHandler()->unload(); #ifdef TMWSERV_SUPPORT Net::clearHandlers(); -#else - delete partyTab; #endif destroyGuiWindows(); @@ -608,14 +551,9 @@ void Game::logic() } // Handle network stuff -#ifdef TMWSERV_SUPPORT - Net::flush(); - // TODO: Fix notification when the connection is lost -#else - mNetwork->flush(); - mNetwork->dispatchMessages(); - - if (!mNetwork->isConnected()) + Net::getGeneralHandler()->flushNetwork(); +#ifdef EATHENA_SUPPORT // TODO: TMWServ notification + if (!Net::getGeneralHandler()->isNetworkConnected()) { if (!disconnectedDialog) { @@ -22,17 +22,12 @@ #ifndef GAME_H #define GAME_H -#include <memory> +//#include <memory> #include "SDL.h" #include "configlistener.h" -class MessageHandler; -#ifdef EATHENA_SUPPORT -class Network; -#endif - extern std::string map_path; extern volatile int fps; extern volatile int tick_time; @@ -40,11 +35,8 @@ extern volatile int tick_time; class Game : public ConfigListener { public: -#ifdef TMWSERV_SUPPORT Game(); -#else - Game(Network *network); -#endif + ~Game(); void logic(); @@ -54,36 +46,12 @@ class Game : public ConfigListener void optionChanged(const std::string &name); private: -#ifdef EATHENA_SUPPORT - Network *mNetwork; -#endif - /** Used to determine whether to draw the next frame. */ int mDrawTime; /** The minimum frame time (used for frame limiting). */ int mMinFrameTime; - typedef const std::auto_ptr<MessageHandler> MessageHandlerPtr; - MessageHandlerPtr mBeingHandler; -#ifdef TMWSERV_SUPPORT - MessageHandlerPtr mGuildHandler; - MessageHandlerPtr mEffectHandler; -#else - MessageHandlerPtr mAdminHandler; - MessageHandlerPtr mEquipmentHandler; - MessageHandlerPtr mSkillHandler; -#endif - MessageHandlerPtr mPartyHandler; - MessageHandlerPtr mBuySellHandler; - MessageHandlerPtr mChatHandler; - MessageHandlerPtr mInventoryHandler; - MessageHandlerPtr mItemHandler; - MessageHandlerPtr mNpcHandler; - MessageHandlerPtr mPlayerHandler; - MessageHandlerPtr mPostHandler; - MessageHandlerPtr mTradeHandler; - int mLastTarget; SDL_TimerID mLogicCounterId; diff --git a/src/main.cpp b/src/main.cpp index a9f37d82..a121dad8 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -61,18 +61,21 @@ #endif #include "gui/updatewindow.h" +#include "net/charhandler.h" +#include "net/generalhandler.h" +#include "net/loginhandler.h" +#include "net/maphandler.h" +#include "net/net.h" #ifdef TMWSERV_SUPPORT #include "net/tmwserv/charserverhandler.h" #include "net/tmwserv/connection.h" +#include "net/tmwserv/generalhandler.h" #include "net/tmwserv/loginhandler.h" #include "net/tmwserv/logouthandler.h" #include "net/tmwserv/network.h" #else -#include "net/ea/charserverhandler.h" -#include "net/ea/loginhandler.h" +#include "net/ea/generalhandler.h" #include "net/ea/network.h" -#include "net/ea/maphandler.h" -#include "net/messageout.h" #endif #ifdef TMWSERV_SUPPORT @@ -137,6 +140,10 @@ namespace #ifdef TMWSERV_SUPPORT std::string token; //used to store magic_token + +extern Net::Connection *gameServerConnection; +extern Net::Connection *chatServerConnection; +extern Net::Connection *accountServerConnection; #else // Account infos char n_server, n_character; @@ -159,20 +166,13 @@ Configuration branding; /**< XML branding information reader */ Logger *logger; /**< Log object */ KeyboardConfig keyboard; -#ifdef TMWSERV_SUPPORT +/*#ifdef TMWSERV_SUPPORT Net::Connection *gameServerConnection = 0; Net::Connection *chatServerConnection = 0; Net::Connection *accountServerConnection = 0; -#endif +#endif*/ LoginData loginData; -#ifdef TMWSERV_SUPPORT -LoginHandler loginHandler; -LogoutHandler logoutHandler; -TmwServ::CharServerHandler charServerHandler; -#else -EAthena::CharServerHandler charServerHandler; -#endif LockedArray<LocalPlayer*> charInfo(maxSlot + 1); Palette *guiPalette; @@ -184,10 +184,6 @@ std::string homeDir; std::string updateHost; std::string updatesDir; -#ifdef EATHENA_SUPPORT -LoginHandler loginHandler; -#endif - SDL_Surface *icon; /** @@ -732,36 +728,15 @@ static void accountLogin(Network *network, LoginData *loginData) logger->log("Username is %s", loginData->username.c_str()); #ifdef EATHENA_SUPPORT network->connect(loginData->hostname, loginData->port); - network->registerHandler(&loginHandler); + // network->registerHandler(&loginHandler); #endif - loginHandler.setLoginData(loginData); -#ifdef TMWSERV_SUPPORT - Net::registerHandler(&loginHandler); - charServerHandler.setCharInfo(&charInfo); - Net::registerHandler(&charServerHandler); +#ifdef TMWSERV_SUPPORT + Net::getCharHandler()->setCharInfo(&charInfo); #endif // Send login infos -#ifdef TMWSERV_SUPPORT - Net::AccountServer::login(accountServerConnection, - 0, // client version - loginData->username, - loginData->password); -#else - MessageOut outMsg(0x0064); - outMsg.writeInt32(0); // client version - outMsg.writeString(loginData->username, 24); - outMsg.writeString(loginData->password, 24); - - /* - * eAthena calls the last byte "client version 2", but it isn't used at - * at all. We're retasking it, with bit 0 to indicate whether the client - * can handle the 0x63 "update host" packet. Clients prior to 0.0.25 send - * 0 here. - */ - outMsg.writeInt8(0x01); -#endif + Net::getLoginHandler()->loginAccount(loginData); // Clear the password, avoids auto login when returning to login loginData->password = ""; @@ -798,22 +773,11 @@ static void charLogin(Network *network, LoginData *loginData) { logger->log("Trying to connect to char server..."); network->connect(loginData->hostname, loginData->port); - network->registerHandler(&charServerHandler); - charServerHandler.setCharInfo(&charInfo); - charServerHandler.setLoginData(loginData); + // network->registerHandler(&charServerHandler); + Net::getCharHandler()->setCharInfo(&charInfo); // Send login infos - MessageOut outMsg(0x0065); - outMsg.writeInt32(loginData->account_ID); - outMsg.writeInt32(loginData->session_ID1); - outMsg.writeInt32(loginData->session_ID2); - // [Fate] The next word is unused by the old char server, so we squeeze in - // tmw client version information - outMsg.writeInt16(CLIENT_PROTOCOL_VERSION); - outMsg.writeInt8(loginData->sex); - - // We get 4 useless bytes before the real answer comes in - network->skip(4); + Net::getCharHandler()->connect(loginData); } static void mapLogin(Network *network, LoginData *loginData) @@ -825,15 +789,10 @@ static void mapLogin(Network *network, LoginData *loginData) logger->log("Trying to connect to map server..."); logger->log("Map: %s", map_path.c_str()); - EAthena::MapHandler *mapHandler = new EAthena::MapHandler; + // EAthena::MapHandler *mapHandler = new EAthena::MapHandler; network->connect(loginData->hostname, loginData->port); - //network->registerHandler(mapHandler); - network->registerHandler(mapHandler); - - mapHandler->connect(loginData); - // We get 4 useless bytes before the real answer comes in (what are these?) - network->skip(4); + Net::getMapHandler()->connect(loginData); } #else @@ -842,132 +801,52 @@ static void accountRegister(LoginData *loginData) { logger->log("Username is %s", loginData->username.c_str()); - Net::registerHandler(&loginHandler); + Net::getCharHandler()->setCharInfo(&charInfo); - charServerHandler.setCharInfo(&charInfo); - Net::registerHandler(&charServerHandler); - - Net::AccountServer::registerAccount(accountServerConnection, - 0, // client version - loginData->username, - loginData->password, - loginData->email); + Net::getLoginHandler()->registerAccount(loginData->username, + loginData->password, loginData->email); } static void accountUnRegister(LoginData *loginData) { - Net::registerHandler(&logoutHandler); - - Net::AccountServer::Account::unregister(loginData->username, + Net::getLoginHandler()->unregisterAccount(loginData->username, loginData->password); } static void accountChangePassword(LoginData *loginData) { - Net::registerHandler(&loginHandler); - - Net::AccountServer::Account::changePassword(loginData->username, + Net::getLoginHandler()->changePassword(loginData->username, loginData->password, loginData->newPassword); } static void accountChangeEmail(LoginData *loginData) { - Net::registerHandler(&loginHandler); - - Net::AccountServer::Account::changeEmail(loginData->newEmail); + Net::getLoginHandler()->changeEmail(loginData->newEmail); } static void switchCharacter(std::string *passToken) { - Net::registerHandler(&logoutHandler); - - logoutHandler.reset(); - logoutHandler.setScenario(LOGOUT_SWITCH_CHARACTER, passToken); - - Net::GameServer::logout(true); - Net::ChatServer::logout(); + Net::getLogoutHandler()->reset(); + Net::getLogoutHandler()->setScenario(LOGOUT_SWITCH_CHARACTER, passToken); } static void switchAccountServer() { - Net::registerHandler(&logoutHandler); - - logoutHandler.reset(); - logoutHandler.setScenario(LOGOUT_SWITCH_ACCOUNTSERVER); - - //Can't logout if we were not logged in ... - if (accountServerConnection->isConnected()) - { - Net::AccountServer::logout(); - } - else - { - logoutHandler.setAccountLoggedOut(); - } - - if (gameServerConnection->isConnected()) - { - Net::GameServer::logout(false); - } - else - { - logoutHandler.setGameLoggedOut(); - } - - if (chatServerConnection->isConnected()) - { - Net::ChatServer::logout(); - } - else - { - logoutHandler.setChatLoggedOut(); - } + Net::getLogoutHandler()->reset(); + Net::getLogoutHandler()->setScenario(LOGOUT_SWITCH_LOGIN); } static void logoutThenExit() { - Net::registerHandler(&logoutHandler); - - logoutHandler.reset(); - logoutHandler.setScenario(LOGOUT_EXIT); - - // Can't logout if we were not logged in ... - if (accountServerConnection->isConnected()) - { - Net::AccountServer::logout(); - } - else - { - logoutHandler.setAccountLoggedOut(); - } - - if (gameServerConnection->isConnected()) - { - Net::GameServer::logout(false); - } - else - { - logoutHandler.setGameLoggedOut(); - } - - if (chatServerConnection->isConnected()) - { - Net::ChatServer::logout(); - } - else - { - logoutHandler.setChatLoggedOut(); - } + Net::getLogoutHandler()->reset(); + Net::getLogoutHandler()->setScenario(LOGOUT_EXIT); } static void reconnectAccount(const std::string &passToken) { - Net::registerHandler(&loginHandler); - - charServerHandler.setCharInfo(&charInfo); - Net::registerHandler(&charServerHandler); + Net::getCharHandler()->setCharInfo(&charInfo); Net::AccountServer::reconnectAccount(accountServerConnection, passToken); } @@ -1113,14 +992,16 @@ int main(int argc, char *argv[]) #ifdef TMWSERV_SUPPORT Net::initialize(); - accountServerConnection = Net::getConnection(); - gameServerConnection = Net::getConnection(); - chatServerConnection = Net::getConnection(); + TmwServ::GeneralHandler *generalHandler = new TmwServ::GeneralHandler; #else SDLNet_Init(); Network *network = new Network; + EAthena::GeneralHandler *generalHandler = new EAthena::GeneralHandler; + network->registerHandler(generalHandler); #endif + Net::getGeneralHandler()->load(); + // Set the most appropriate wallpaper, based on screen width int screenWidth = (int) config.getValue("screenwidth", defaultScreenWidth); #ifdef EATHENA_SUPPORT @@ -1561,7 +1442,6 @@ int main(int argc, char *argv[]) default: network->disconnect(); - network->clearHandlers(); break; } @@ -1686,7 +1566,7 @@ int main(int argc, char *argv[]) login_wallpaper = NULL; logger->log("State: GAME"); - game = new Game(network); + game = new Game(); game->logic(); delete game; state = STATE_EXIT; @@ -1773,18 +1653,8 @@ int main(int argc, char *argv[]) delete setup; delete setupWindow; + Net::getGeneralHandler()->unload(); #ifdef TMWSERV_SUPPORT - if (accountServerConnection) - accountServerConnection->disconnect(); - if (gameServerConnection) - gameServerConnection->disconnect(); - if (chatServerConnection) - chatServerConnection->disconnect(); - - delete accountServerConnection; - delete gameServerConnection; - delete chatServerConnection; - Net::finalize(); #else delete network; SDLNet_Quit(); diff --git a/src/net/charhandler.h b/src/net/charhandler.h index 7d1b9ab2..56bfbbb4 100644 --- a/src/net/charhandler.h +++ b/src/net/charhandler.h @@ -23,16 +23,23 @@ #define CHARHANDLER_H #include "localplayer.h" +#include "lockedarray.h" +#include "logindata.h" #include <iosfwd> #include <vector> class CharCreateDialog; +class LocalPlayer; namespace Net { class CharHandler { public: + virtual void setCharInfo(LockedArray<LocalPlayer*> *charInfo) = 0; + + virtual void connect(LoginData *loginData) = 0; + virtual void setCharCreateDialog(CharCreateDialog *window) = 0; virtual void chooseCharacter(int slot, LocalPlayer* character) = 0; diff --git a/src/net/ea/charserverhandler.cpp b/src/net/ea/charserverhandler.cpp index 377cd2dd..0fcc2cb0 100644 --- a/src/net/ea/charserverhandler.cpp +++ b/src/net/ea/charserverhandler.cpp @@ -21,6 +21,7 @@ #include "net/ea/charserverhandler.h" +#include "net/ea/network.h" #include "net/ea/protocol.h" #include "net/messagein.h" @@ -45,7 +46,6 @@ CharServerHandler::CharServerHandler(): mCharCreateDialog(0) { static const Uint16 _messages[] = { - SMSG_CONNECTION_PROBLEM, 0x006b, 0x006c, 0x006d, @@ -68,33 +68,6 @@ void CharServerHandler::handleMessage(MessageIn &msg) msg.getId(), msg.getLength()); switch (msg.getId()) { - case SMSG_CONNECTION_PROBLEM: - code = msg.readInt8(); - logger->log("Connection problem: %i", code); - - switch (code) { - case 0: - errorMessage = _("Authentication failed"); - break; - case 1: - errorMessage = _("Map server(s) offline"); - break; - case 2: - errorMessage = _("This account is already logged in"); - break; - case 3: - errorMessage = _("Speed hack detected"); - break; - case 8: - errorMessage = _("Duplicated login"); - break; - default: - errorMessage = _("Unknown connection error"); - break; - } - state = STATE_ERROR; - break; - case 0x006b: msg.skip(2); // Length word flags = msg.readInt32(); // Aethyra extensions flags @@ -259,6 +232,23 @@ void CharServerHandler::setCharCreateDialog(CharCreateDialog *window) mCharCreateDialog->setFixedGender(true); } +void CharServerHandler::connect(LoginData *loginData) +{ + mLoginData = loginData; + + MessageOut outMsg(0x0065); + outMsg.writeInt32(loginData->account_ID); + outMsg.writeInt32(loginData->session_ID1); + outMsg.writeInt32(loginData->session_ID2); + // [Fate] The next word is unused by the old char server, so we squeeze in + // tmw client version information + outMsg.writeInt16(CLIENT_PROTOCOL_VERSION); + outMsg.writeInt8(loginData->sex); + + // We get 4 useless bytes before the real answer comes in (what are these?) + mNetwork->skip(4); +} + void CharServerHandler::chooseCharacter(int slot, LocalPlayer* character) { MessageOut outMsg(CMSG_CHAR_SELECT); diff --git a/src/net/ea/charserverhandler.h b/src/net/ea/charserverhandler.h index 48392ac4..3ebac16e 100644 --- a/src/net/ea/charserverhandler.h +++ b/src/net/ea/charserverhandler.h @@ -25,9 +25,6 @@ #include "net/messagehandler.h" #include "net/charhandler.h" -#include "lockedarray.h" - -class LocalPlayer; class LoginData; namespace EAthena { @@ -45,9 +42,6 @@ class CharServerHandler : public MessageHandler, public Net::CharHandler void setCharInfo(LockedArray<LocalPlayer*> *charInfo) { mCharInfo = charInfo; } - void setLoginData(LoginData *loginData) - { mLoginData = loginData; } - /** * Sets the character create dialog. The handler will clean up this * dialog when a new character is succesfully created, and will unlock @@ -55,6 +49,8 @@ class CharServerHandler : public MessageHandler, public Net::CharHandler */ void setCharCreateDialog(CharCreateDialog *window); + void connect(LoginData *loginData); + void chooseCharacter(int slot, LocalPlayer* character); void newCharacter(const std::string &name, int slot, bool gender, diff --git a/src/net/ea/chathandler.cpp b/src/net/ea/chathandler.cpp index 13593ed1..997881f8 100644 --- a/src/net/ea/chathandler.cpp +++ b/src/net/ea/chathandler.cpp @@ -148,7 +148,7 @@ void ChatHandler::handleMessage(MessageIn &msg) if (msg.getId() == SMSG_PLAYER_CHAT) { - localChatTab->chatLog(chatMsg, BY_PLAYER); + if (localChatTab) localChatTab->chatLog(chatMsg, BY_PLAYER); if (pos != std::string::npos) chatMsg.erase(0, pos + 3); diff --git a/src/net/ea/generalhandler.cpp b/src/net/ea/generalhandler.cpp new file mode 100644 index 00000000..5d204ab5 --- /dev/null +++ b/src/net/ea/generalhandler.cpp @@ -0,0 +1,164 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "net/ea/generalhandler.h" + +#include "net/ea/network.h" +#include "net/ea/protocol.h" + +#include "net/ea/adminhandler.h" +#include "net/ea/beinghandler.h" +#include "net/ea/buysellhandler.h" +#include "net/ea/chathandler.h" +#include "net/ea/charserverhandler.h" +#include "net/ea/equipmenthandler.h" +#include "net/ea/inventoryhandler.h" +#include "net/ea/itemhandler.h" +#include "net/ea/loginhandler.h" +#include "net/ea/logouthandler.h" +#include "net/ea/maphandler.h" +#include "net/ea/npchandler.h" +#include "net/ea/playerhandler.h" +#include "net/ea/partyhandler.h" +#include "net/ea/tradehandler.h" +#include "net/ea/skillhandler.h" + +#include "net/ea/gui/partytab.h" + +#include "net/messagein.h" +#include "net/messageout.h" + +#include "configuration.h" +#include "log.h" +#include "main.h" + +#include "utils/gettext.h" + +Net::GeneralHandler *generalHandler; + +namespace EAthena { + +GeneralHandler::GeneralHandler(): + mAdminHandler(new AdminHandler), + mBeingHandler(new BeingHandler(config.getValue("EnableSync", 0) == 1)), + mBuySellHandler(new BuySellHandler), + mCharHandler(new CharServerHandler), + mChatHandler(new ChatHandler), + mEquipmentHandler(new EquipmentHandler), + mInventoryHandler(new InventoryHandler), + mItemHandler(new ItemHandler), + mLoginHandler(new LoginHandler), + mLogoutHandler(new LogoutHandler), + mMapHandler(new MapHandler), + mNpcHandler(new NpcHandler), + mPartyHandler(new PartyHandler), + mPlayerHandler(new PlayerHandler), + mSkillHandler(new SkillHandler), + mTradeHandler(new TradeHandler) +{ + static const Uint16 _messages[] = { + SMSG_CONNECTION_PROBLEM, + 0 + }; + handledMessages = _messages; + generalHandler = this; +} + +void GeneralHandler::handleMessage(MessageIn &msg) +{ + int code; + unsigned char direction; + + switch (msg.getId()) + { + case SMSG_CONNECTION_PROBLEM: + code = msg.readInt8(); + logger->log("Connection problem: %i", code); + + switch (code) { + case 0: + errorMessage = _("Authentication failed"); + break; + case 1: + errorMessage = _("No servers available"); + break; + case 2: + errorMessage = _("This account is already logged in"); + break; + case 3: + errorMessage = _("Speed hack detected"); + break; + case 8: + errorMessage = _("Duplicated login"); + break; + default: + errorMessage = _("Unknown connection error"); + break; + } + state = STATE_ERROR; + break; + } +} + +void GeneralHandler::load() +{ + mNetwork->registerHandler(mAdminHandler.get()); + mNetwork->registerHandler(mBeingHandler.get()); + mNetwork->registerHandler(mBuySellHandler.get()); + mNetwork->registerHandler(mChatHandler.get()); + mNetwork->registerHandler(mCharHandler.get()); + mNetwork->registerHandler(mEquipmentHandler.get()); + mNetwork->registerHandler(mInventoryHandler.get()); + mNetwork->registerHandler(mItemHandler.get()); + mNetwork->registerHandler(mLoginHandler.get()); + mNetwork->registerHandler(mLogoutHandler.get()); + mNetwork->registerHandler(mMapHandler.get()); + mNetwork->registerHandler(mNpcHandler.get()); + mNetwork->registerHandler(mPlayerHandler.get()); + mNetwork->registerHandler(mSkillHandler.get()); + mNetwork->registerHandler(mTradeHandler.get()); + mNetwork->registerHandler(mPartyHandler.get()); +} + +void GeneralHandler::unload() +{ + mNetwork->clearHandlers(); + + delete partyTab; +} + +void GeneralHandler::flushNetwork() +{ + mNetwork->flush(); + mNetwork->dispatchMessages(); +} + +bool GeneralHandler::isNetworkConnected() +{ + return mNetwork->isConnected(); +} + +void GeneralHandler::guiWindowsLoaded() +{ + partyTab = new PartyTab(); +} + +} // namespace EAthena diff --git a/src/net/ea/generalhandler.h b/src/net/ea/generalhandler.h new file mode 100644 index 00000000..3e2a6707 --- /dev/null +++ b/src/net/ea/generalhandler.h @@ -0,0 +1,69 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef NET_EA_GENERALHANDLER_H +#define NET_EA_GENERALHANDLER_H + +#include "net/generalhandler.h" +#include "net/messagehandler.h" +#include "net/net.h" + +namespace EAthena { + +class GeneralHandler : public MessageHandler, public Net::GeneralHandler +{ + public: + GeneralHandler(); + + void handleMessage(MessageIn &msg); + + void load(); + + void unload(); + + void flushNetwork(); + + bool isNetworkConnected(); + + void guiWindowsLoaded(); + + protected: + MessageHandlerPtr mAdminHandler; + MessageHandlerPtr mBeingHandler; + MessageHandlerPtr mBuySellHandler; + MessageHandlerPtr mCharHandler; + MessageHandlerPtr mChatHandler; + MessageHandlerPtr mEquipmentHandler; + MessageHandlerPtr mInventoryHandler; + MessageHandlerPtr mItemHandler; + MessageHandlerPtr mLoginHandler; + MessageHandlerPtr mLogoutHandler; + MessageHandlerPtr mMapHandler; + MessageHandlerPtr mNpcHandler; + MessageHandlerPtr mPartyHandler; + MessageHandlerPtr mPlayerHandler; + MessageHandlerPtr mSkillHandler; + MessageHandlerPtr mTradeHandler; +}; + +} // namespace EAthena + +#endif // NET_EA_GENERALHANDLER_H diff --git a/src/net/ea/loginhandler.cpp b/src/net/ea/loginhandler.cpp index 06bdb4bc..1031ee05 100644 --- a/src/net/ea/loginhandler.cpp +++ b/src/net/ea/loginhandler.cpp @@ -24,6 +24,7 @@ #include "net/ea/protocol.h" #include "net/messagein.h" +#include "net/messageout.h" #include "log.h" #include "logindata.h" @@ -36,16 +37,20 @@ extern SERVER_INFO **server_info; +Net::LoginHandler *loginHandler; + +namespace EAthena { + LoginHandler::LoginHandler() { static const Uint16 _messages[] = { - SMSG_CONNECTION_PROBLEM, SMSG_UPDATE_HOST, 0x0069, 0x006a, 0 }; handledMessages = _messages; + loginHandler = this; } void LoginHandler::handleMessage(MessageIn &msg) @@ -54,27 +59,6 @@ void LoginHandler::handleMessage(MessageIn &msg) switch (msg.getId()) { - case SMSG_CONNECTION_PROBLEM: - code = msg.readInt8(); - logger->log("Connection problem: %i", code); - - switch (code) { - case 0: - errorMessage = _("Authentication failed"); - break; - case 1: - errorMessage = _("No servers available"); - break; - case 2: - errorMessage = _("This account is already logged in"); - break; - default: - errorMessage = _("Unknown connection error"); - break; - } - state = STATE_ERROR; - break; - case SMSG_UPDATE_HOST: int len; @@ -158,3 +142,52 @@ void LoginHandler::handleMessage(MessageIn &msg) break; } } + +void LoginHandler::loginAccount(LoginData *loginData) +{ + mLoginData = loginData; + MessageOut outMsg(0x0064); + outMsg.writeInt32(0); // client version + outMsg.writeString(loginData->username, 24); + outMsg.writeString(loginData->password, 24); + + /* + * eAthena calls the last byte "client version 2", but it isn't used at + * at all. We're retasking it, with bit 0 to indicate whether the client + * can handle the 0x63 "update host" packet. Clients prior to 0.0.25 send + * 0 here. + */ + outMsg.writeInt8(0x01); +} + +void LoginHandler::changeEmail(const std::string &email) +{ + // TODO +} + +void LoginHandler::changePassword(const std::string &username, + const std::string &oldPassword, + const std::string &newPassword) +{ + // TODO +} + +void LoginHandler::chooseServer(int server) +{ + // TODO +} + +void LoginHandler::registerAccount(const std::string &username, + const std::string &password, + const std::string &email = "") +{ + // TODO +} + +void LoginHandler::unregisterAccount(const std::string &username, + const std::string &password) +{ + // TODO +} + +} // namespace EAthena diff --git a/src/net/ea/loginhandler.h b/src/net/ea/loginhandler.h index 9afaab23..cdc59e4a 100644 --- a/src/net/ea/loginhandler.h +++ b/src/net/ea/loginhandler.h @@ -22,24 +22,44 @@ #ifndef NET_EA_LOGINHANDLER_H #define NET_EA_LOGINHANDLER_H +#include "net/loginhandler.h" #include "net/messagehandler.h" #include <string> struct LoginData; -class LoginHandler : public MessageHandler +namespace EAthena { + +class LoginHandler : public MessageHandler, public Net::LoginHandler { public: LoginHandler(); - virtual void handleMessage(MessageIn &msg); + void handleMessage(MessageIn &msg); + + void loginAccount(LoginData *loginData); + + void changeEmail(const std::string &email); + + void changePassword(const std::string &username, + const std::string &oldPassword, + const std::string &newPassword); - void setLoginData(LoginData *loginData) { mLoginData = loginData; } + void chooseServer(int server); + + void registerAccount(const std::string &username, + const std::string &password, + const std::string &email); + + void unregisterAccount(const std::string &username, + const std::string &password); private: LoginData *mLoginData; std::string mUpdateHost; }; +} // namespace EAthena + #endif // NET_EA_LOGINHANDLER_H diff --git a/src/net/ea/logouthandler.cpp b/src/net/ea/logouthandler.cpp new file mode 100644 index 00000000..19659a2f --- /dev/null +++ b/src/net/ea/logouthandler.cpp @@ -0,0 +1,66 @@ +/* + * The Mana World + * Copyright (C) 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "net/ea/logouthandler.h" + +#include "net/ea/protocol.h" + +#include "net/messagein.h" +#include "net/messageout.h" + +#include "log.h" +#include "logindata.h" +#include "main.h" +#include "serverinfo.h" + +#include "utils/gettext.h" +#include "utils/strprintf.h" +#include "utils/stringutils.h" + +Net::LogoutHandler *logoutHandler; + +namespace EAthena { + +LogoutHandler::LogoutHandler() +{ + static const Uint16 _messages[] = { + 0 + }; + handledMessages = _messages; + logoutHandler = this; +} + +void LogoutHandler::handleMessage(MessageIn &msg) +{ +} + +void LogoutHandler::setScenario(unsigned short scenario, + std::string *passToken) +{ + // TODO +} + +void LogoutHandler::reset() +{ + // TODO +} + +} // namespace EAthena diff --git a/src/net/ea/logouthandler.h b/src/net/ea/logouthandler.h new file mode 100644 index 00000000..0d118ab0 --- /dev/null +++ b/src/net/ea/logouthandler.h @@ -0,0 +1,47 @@ +/* + * The Mana World + * Copyright (C) 2004 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef NET_EA_LOGOUTHANDLER_H +#define NET_EA_LOGOUTHANDLER_H + +#include "net/logouthandler.h" +#include "net/messagehandler.h" + +#include <string> + +namespace EAthena { + +class LogoutHandler : public MessageHandler, public Net::LogoutHandler +{ + public: + LogoutHandler(); + + void handleMessage(MessageIn &msg); + + void setScenario(unsigned short scenario, + std::string *passToken = NULL); + + void reset(); +}; + +} // namespace EAthena + +#endif // NET_EA_LOGOUTHANDLER_H diff --git a/src/net/ea/maphandler.cpp b/src/net/ea/maphandler.cpp index 6912176f..6fd27755 100644 --- a/src/net/ea/maphandler.cpp +++ b/src/net/ea/maphandler.cpp @@ -21,6 +21,7 @@ #include "net/ea/maphandler.h" +#include "net/ea/network.h" #include "net/ea/protocol.h" #include "net/messagein.h" @@ -42,7 +43,6 @@ namespace EAthena { MapHandler::MapHandler() { static const Uint16 _messages[] = { - SMSG_CONNECTION_PROBLEM, SMSG_LOGIN_SUCCESS, SMSG_SERVER_PING, SMSG_WHO_ANSWER, @@ -59,24 +59,6 @@ void MapHandler::handleMessage(MessageIn &msg) switch (msg.getId()) { - case SMSG_CONNECTION_PROBLEM: - code = msg.readInt8(); - logger->log("Connection problem: %i", code); - - switch (code) { - case 0: - errorMessage = _("Authentication failed"); - break; - case 2: - errorMessage = _("This account is already logged in"); - break; - default: - errorMessage = _("Unknown connection error"); - break; - } - state = STATE_ERROR; - break; - case SMSG_LOGIN_SUCCESS: msg.readInt32(); // server tick msg.readCoordinates(player_node->mX, player_node->mY, direction); @@ -107,6 +89,9 @@ void MapHandler::connect(LoginData *loginData) outMsg.writeInt32(loginData->session_ID1); outMsg.writeInt32(loginData->session_ID2); outMsg.writeInt8(loginData->sex); + + // We get 4 useless bytes before the real answer comes in (what are these?) + mNetwork->skip(4); } void MapHandler::mapLoaded(const std::string &mapName) diff --git a/src/net/generalhandler.h b/src/net/generalhandler.h index 573e5062..08c08b13 100644 --- a/src/net/generalhandler.h +++ b/src/net/generalhandler.h @@ -26,11 +26,15 @@ namespace Net { class GeneralHandler { public: - virtual void load() {} + virtual void load() = 0; - virtual void unload() {} + virtual void unload() = 0; - virtual void guiWindowsLoaded() {} + virtual void flushNetwork() = 0; + + virtual bool isNetworkConnected() = 0; + + virtual void guiWindowsLoaded() = 0; }; } diff --git a/src/net/loginhandler.h b/src/net/loginhandler.h index 19f8c90b..fcdee0da 100644 --- a/src/net/loginhandler.h +++ b/src/net/loginhandler.h @@ -22,29 +22,30 @@ #ifndef LOGINHANDLER_H #define LOGINHANDLER_H +#include "logindata.h" + #include <iosfwd> namespace Net { class LoginHandler { public: - virtual void loginAccount(const std::string &username, - const std::string &password) {} + virtual void loginAccount(LoginData *loginData) = 0; - virtual void changeEmail(const std::string &email) {} + virtual void changeEmail(const std::string &email) = 0; virtual void changePassword(const std::string &username, const std::string &oldPassword, - const std::string &newPassword) {} + const std::string &newPassword) = 0; - virtual void chooseServer(int server) {} + virtual void chooseServer(int server) = 0; virtual void registerAccount(const std::string &username, const std::string &password, - const std::string &email = "") {} + const std::string &email) = 0; virtual void unregisterAccount(const std::string &username, - const std::string &password) {} + const std::string &password) = 0; }; } diff --git a/src/net/logouthandler.h b/src/net/logouthandler.h new file mode 100644 index 00000000..f6c44e5c --- /dev/null +++ b/src/net/logouthandler.h @@ -0,0 +1,49 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef LOGOUTHANDLER_H +#define LOGOUTHANDLER_H + +#include "logindata.h" + +#include <iosfwd> + +/** + * The different scenarios for which LogoutHandler can be used + */ +enum { + LOGOUT_EXIT, + LOGOUT_SWITCH_LOGIN, + LOGOUT_SWITCH_CHARACTER +}; + +namespace Net { +class LogoutHandler +{ + public: + virtual void setScenario(unsigned short scenario, + std::string *passToken = NULL) = 0; + + virtual void reset() = 0; +}; +} + +#endif // LOGOUTHANDLER_H diff --git a/src/net/messagehandler.h b/src/net/messagehandler.h index 9b207dcc..1aa0b401 100644 --- a/src/net/messagehandler.h +++ b/src/net/messagehandler.h @@ -24,6 +24,8 @@ #include <SDL_types.h> +#include <memory> + class MessageIn; #ifdef EATHENA_SUPPORT class Network; @@ -42,7 +44,8 @@ class MessageHandler virtual void handleMessage(MessageIn &msg) = 0; -#ifdef EATHENA_SUPPORT +#ifdef TMWSERV_SUPPORT +#else void setNetwork(Network *network); protected: @@ -50,4 +53,6 @@ class MessageHandler #endif }; +typedef const std::auto_ptr<MessageHandler> MessageHandlerPtr; + #endif // NET_MESSAGEHANDLER_H diff --git a/src/net/net.cpp b/src/net/net.cpp index 5c36f4e1..a8aeae47 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -28,6 +28,7 @@ #include "net/guildhandler.h" #include "net/inventoryhandler.h" #include "net/loginhandler.h" +#include "net/logouthandler.h" #include "net/maphandler.h" #include "net/npchandler.h" #include "net/partyhandler.h" @@ -38,7 +39,10 @@ extern Net::AdminHandler *adminHandler; extern Net::CharHandler *charHandler; extern Net::ChatHandler *chatHandler; +extern Net::GeneralHandler *generalHandler; extern Net::InventoryHandler *inventoryHandler; +extern Net::LoginHandler *loginHandler; +extern Net::LogoutHandler *logoutHandler; extern Net::MapHandler *mapHandler; extern Net::NpcHandler *npcHandler; extern Net::PlayerHandler *playerHandler; @@ -62,8 +66,7 @@ Net::ChatHandler *Net::getChatHandler() Net::GeneralHandler *Net::getGeneralHandler() { - // TODO - return 0; + return generalHandler; } Net::GuildHandler *Net::getGuildHandler() @@ -79,8 +82,12 @@ Net::InventoryHandler *Net::getInventoryHandler() Net::LoginHandler *Net::getLoginHandler() { - // TODO - return 0; + return loginHandler; +} + +Net::LogoutHandler *Net::getLogoutHandler() +{ + return logoutHandler; } Net::MapHandler *Net::getMapHandler() diff --git a/src/net/net.h b/src/net/net.h index 75ee3aed..9154c1ef 100644 --- a/src/net/net.h +++ b/src/net/net.h @@ -31,6 +31,7 @@ class GeneralHandler; class GuildHandler; class InventoryHandler; class LoginHandler; +class LogoutHandler; class MapHandler; class NpcHandler; class PartyHandler; @@ -45,6 +46,7 @@ GeneralHandler *getGeneralHandler(); GuildHandler *getGuildHandler(); InventoryHandler *getInventoryHandler(); LoginHandler *getLoginHandler(); +LogoutHandler *getLogoutHandler(); MapHandler *getMapHandler(); NpcHandler *getNpcHandler(); PartyHandler *getPartyHandler(); diff --git a/src/net/tmwserv/charserverhandler.cpp b/src/net/tmwserv/charserverhandler.cpp index 9739367b..27ac62fb 100644 --- a/src/net/tmwserv/charserverhandler.cpp +++ b/src/net/tmwserv/charserverhandler.cpp @@ -254,6 +254,11 @@ void CharServerHandler::setCharCreateDialog(CharCreateDialog *window) mCharCreateDialog->setAttributes(attributes, 60, 1, 20); } +void connect(LoginData *loginData) +{ + // Uneeded +} + void CharServerHandler::chooseCharacter(int slot, LocalPlayer* character) { Net::AccountServer::Account::selectCharacter(slot); diff --git a/src/net/tmwserv/charserverhandler.h b/src/net/tmwserv/charserverhandler.h index a5e1fa50..4d79d60e 100644 --- a/src/net/tmwserv/charserverhandler.h +++ b/src/net/tmwserv/charserverhandler.h @@ -25,9 +25,6 @@ #include "net/charhandler.h" #include "net/messagehandler.h" -#include "lockedarray.h" - -class LocalPlayer; class LoginData; namespace TmwServ { @@ -54,6 +51,8 @@ class CharServerHandler : public MessageHandler, public Net::CharHandler */ void setCharCreateDialog(CharCreateDialog *window); + void connect(LoginData *loginData) {} // Unused + void chooseCharacter(int slot, LocalPlayer* character); void newCharacter(const std::string &name, int slot, diff --git a/src/net/tmwserv/generalhandler.cpp b/src/net/tmwserv/generalhandler.cpp new file mode 100644 index 00000000..c5f00624 --- /dev/null +++ b/src/net/tmwserv/generalhandler.cpp @@ -0,0 +1,126 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "net/tmwserv/generalhandler.h" + +#include "net/tmwserv/network.h" +#include "net/tmwserv/connection.h" + +#include "net/tmwserv/beinghandler.h" +#include "net/tmwserv/buysellhandler.h" +#include "net/tmwserv/charserverhandler.h" +#include "net/tmwserv/chathandler.h" +#include "net/tmwserv/effecthandler.h" +#include "net/tmwserv/guildhandler.h" +#include "net/tmwserv/inventoryhandler.h" +#include "net/tmwserv/itemhandler.h" +#include "net/tmwserv/loginhandler.h" +#include "net/tmwserv/logouthandler.h" +#include "net/tmwserv/maphandler.h" +#include "net/tmwserv/npchandler.h" +#include "net/tmwserv/partyhandler.h" +#include "net/tmwserv/playerhandler.h" +#include "net/tmwserv/tradehandler.h" + +Net::GeneralHandler *generalHandler; + +Net::Connection *gameServerConnection = 0; +Net::Connection *chatServerConnection = 0; +Net::Connection *accountServerConnection = 0; + +namespace TmwServ { + +GeneralHandler::GeneralHandler(): + mBeingHandler(new BeingHandler), + mBuySellHandler(new BuySellHandler), + mCharServerHandler(new TmwServ::CharServerHandler), + mChatHandler(new TmwServ::ChatHandler), + mEffectHandler(new EffectHandler), + mGuildHandler(new GuildHandler), + mInventoryHandler(new TmwServ::InventoryHandler), + mItemHandler(new ItemHandler), + mLoginHandler(new TmwServ::LoginHandler), + mLogoutHandler(new LogoutHandler), + mMapHandler(new TmwServ::MapHandler), + mNpcHandler(new TmwServ::NpcHandler), + mPartyHandler(new PartyHandler), + mPlayerHandler(new TmwServ::PlayerHandler), + mTradeHandler(new TmwServ::TradeHandler) +{ + accountServerConnection = Net::getConnection(); + gameServerConnection = Net::getConnection(); + chatServerConnection = Net::getConnection(); + + generalHandler = this; +} + +void GeneralHandler::load() +{ + Net::registerHandler(mBeingHandler.get()); + Net::registerHandler(mBuySellHandler.get()); + Net::registerHandler(mCharServerHandler.get()); + Net::registerHandler(mChatHandler.get()); + Net::registerHandler(mEffectHandler.get()); + Net::registerHandler(mGuildHandler.get()); + Net::registerHandler(mInventoryHandler.get()); + Net::registerHandler(mItemHandler.get()); + Net::registerHandler(mLoginHandler.get()); + Net::registerHandler(mLogoutHandler.get()); + Net::registerHandler(mMapHandler.get()); + Net::registerHandler(mNpcHandler.get()); + Net::registerHandler(mPartyHandler.get()); + Net::registerHandler(mPlayerHandler.get()); + Net::registerHandler(mTradeHandler.get()); +} + +void GeneralHandler::unload() +{ + if (accountServerConnection) + accountServerConnection->disconnect(); + if (gameServerConnection) + gameServerConnection->disconnect(); + if (chatServerConnection) + chatServerConnection->disconnect(); + + delete accountServerConnection; + delete gameServerConnection; + delete chatServerConnection; + + Net::finalize(); +} + +void GeneralHandler::flushNetwork() +{ + Net::flush(); +} + +bool GeneralHandler::isNetworkConnected() +{ + // TODO + return true; +} + +void GeneralHandler::guiWindowsLoaded() +{ + // TODO +} + +} // namespace TmwServ diff --git a/src/net/tmwserv/generalhandler.h b/src/net/tmwserv/generalhandler.h new file mode 100644 index 00000000..81a41608 --- /dev/null +++ b/src/net/tmwserv/generalhandler.h @@ -0,0 +1,66 @@ +/* + * The Mana World + * Copyright (C) 2009 The Mana World Development Team + * + * This file is part of The Mana World. + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef NET_TMWSERV_GENERALHANDLER_H +#define NET_TMWSERV_GENERALHANDLER_H + +#include "net/generalhandler.h" +#include "net/net.h" +#include "net/messagehandler.h" + +namespace TmwServ { + +class GeneralHandler : public Net::GeneralHandler +{ + public: + GeneralHandler(); + + void load(); + + void unload(); + + void flushNetwork(); + + bool isNetworkConnected(); + + void guiWindowsLoaded(); + + protected: + MessageHandlerPtr mBeingHandler; + MessageHandlerPtr mBuySellHandler; + MessageHandlerPtr mCharServerHandler; + MessageHandlerPtr mChatHandler; + MessageHandlerPtr mEffectHandler; + MessageHandlerPtr mGuildHandler; + MessageHandlerPtr mInventoryHandler; + MessageHandlerPtr mItemHandler; + MessageHandlerPtr mLoginHandler; + MessageHandlerPtr mLogoutHandler; + MessageHandlerPtr mMapHandler; + MessageHandlerPtr mNpcHandler; + MessageHandlerPtr mPartyHandler; + MessageHandlerPtr mPlayerHandler; + MessageHandlerPtr mTradeHandler; +}; + +} // namespace TmwServ + +#endif // NET_TMWSERV_GENERALHANDLER_H diff --git a/src/net/tmwserv/loginhandler.cpp b/src/net/tmwserv/loginhandler.cpp index ccba06ed..ef23546a 100644 --- a/src/net/tmwserv/loginhandler.cpp +++ b/src/net/tmwserv/loginhandler.cpp @@ -21,13 +21,23 @@ #include "net/tmwserv/loginhandler.h" +#include "net/tmwserv/connection.h" #include "net/tmwserv/protocol.h" +#include "net/tmwserv/accountserver/account.h" +#include "net/tmwserv/accountserver/accountserver.h" + #include "net/messagein.h" #include "logindata.h" #include "main.h" +Net::LoginHandler *loginHandler; + +extern Net::Connection *accountServerConnection; + +namespace TmwServ { + LoginHandler::LoginHandler() { static const Uint16 _messages[] = { @@ -39,11 +49,7 @@ LoginHandler::LoginHandler() 0 }; handledMessages = _messages; -} - -void LoginHandler::setLoginData(LoginData *loginData) -{ - mLoginData = loginData; + loginHandler = this; } void LoginHandler::handleMessage(MessageIn &msg) @@ -224,3 +230,46 @@ void LoginHandler::readUpdateHost(MessageIn &msg) mLoginData->updateHost = msg.readString(); } } + +void LoginHandler::loginAccount(LoginData *loginData) +{ + mLoginData = loginData; + Net::AccountServer::login(accountServerConnection, + 0, // client version + loginData->username, + loginData->password); +} + +void LoginHandler::changeEmail(const std::string &email) +{ + Net::AccountServer::Account::changeEmail(email); +} + +void LoginHandler::changePassword(const std::string &username, + const std::string &oldPassword, + const std::string &newPassword) +{ + Net::AccountServer::Account::changePassword(username, oldPassword, + newPassword); +} + +void LoginHandler::chooseServer(int server) +{ + // TODO +} + +void LoginHandler::registerAccount(const std::string &username, + const std::string &password, const std::string &email) +{ + Net::AccountServer::registerAccount(accountServerConnection, + 0, // client version + username, password, email); +} + +void LoginHandler::unregisterAccount(const std::string &username, + const std::string &password) +{ + Net::AccountServer::Account::unregister(username, password); +} + +} // namespace TmwServ diff --git a/src/net/tmwserv/loginhandler.h b/src/net/tmwserv/loginhandler.h index 81dd273c..93d55396 100644 --- a/src/net/tmwserv/loginhandler.h +++ b/src/net/tmwserv/loginhandler.h @@ -22,19 +22,37 @@ #ifndef NET_TMWSERV_LOGINHANDLER_H #define NET_TMWSERV_LOGINHANDLER_H +#include "net/loginhandler.h" #include "net/messagehandler.h" class LoginData; -class LoginHandler : public MessageHandler +namespace TmwServ { + +class LoginHandler : public MessageHandler, public Net::LoginHandler { public: LoginHandler(); - void setLoginData(LoginData *loginData); - void handleMessage(MessageIn &msg); + void loginAccount(LoginData *loginData); + + void changeEmail(const std::string &email); + + void changePassword(const std::string &username, + const std::string &oldPassword, + const std::string &newPassword); + + void chooseServer(int server); + + void registerAccount(const std::string &username, + const std::string &password, + const std::string &email); + + void unregisterAccount(const std::string &username, + const std::string &password); + private: void handleLoginResponse(MessageIn &msg); void handleRegisterResponse(MessageIn &msg); @@ -44,4 +62,6 @@ class LoginHandler : public MessageHandler LoginData *mLoginData; }; +} // namespace TmwServ + #endif // NET_TMWSERV_LOGINHANDLER_H diff --git a/src/net/tmwserv/logouthandler.cpp b/src/net/tmwserv/logouthandler.cpp index 8b0e2d6e..9ac6c7d4 100644 --- a/src/net/tmwserv/logouthandler.cpp +++ b/src/net/tmwserv/logouthandler.cpp @@ -21,12 +21,25 @@ #include "net/tmwserv/logouthandler.h" +#include "net/tmwserv/connection.h" #include "net/tmwserv/protocol.h" +#include "net/tmwserv/accountserver/accountserver.h" +#include "net/tmwserv/chatserver/chatserver.h" +#include "net/tmwserv/gameserver/gameserver.h" + #include "net/messagein.h" #include "main.h" +Net::LogoutHandler *logoutHandler; + +extern Net::Connection *gameServerConnection; +extern Net::Connection *chatServerConnection; +extern Net::Connection *accountServerConnection; + +namespace TmwServ { + LogoutHandler::LogoutHandler(): mPassToken(NULL), mScenario(LOGOUT_EXIT), @@ -42,6 +55,7 @@ LogoutHandler::LogoutHandler(): 0 }; handledMessages = _messages; + logoutHandler = this; } void LogoutHandler::handleMessage(MessageIn &msg) @@ -59,7 +73,7 @@ void LogoutHandler::handleMessage(MessageIn &msg) switch (mScenario) { - case LOGOUT_SWITCH_ACCOUNTSERVER: + case LOGOUT_SWITCH_LOGIN: if (mLoggedOutGame && mLoggedOutChat) state = STATE_SWITCH_ACCOUNTSERVER; break; @@ -129,7 +143,7 @@ void LogoutHandler::handleMessage(MessageIn &msg) if (mLoggedOutChat) state = STATE_RECONNECT_ACCOUNT; break; - case LOGOUT_SWITCH_ACCOUNTSERVER: + case LOGOUT_SWITCH_LOGIN: if (mLoggedOutAccount && mLoggedOutChat) state = STATE_SWITCH_ACCOUNTSERVER; break; @@ -170,7 +184,7 @@ void LogoutHandler::handleMessage(MessageIn &msg) if (mLoggedOutGame) state = STATE_RECONNECT_ACCOUNT; break; - case LOGOUT_SWITCH_ACCOUNTSERVER: + case LOGOUT_SWITCH_LOGIN: if (mLoggedOutAccount && mLoggedOutGame) state = STATE_SWITCH_ACCOUNTSERVER; break; @@ -206,6 +220,47 @@ void LogoutHandler::setScenario(unsigned short scenario, { mScenario = scenario; mPassToken = passToken; + + // Can't logout if we were not logged in ... + if (mScenario == LOGOUT_EXIT) + { + if (accountServerConnection->isConnected()) + Net::AccountServer::logout(); + else + setAccountLoggedOut(); + + if (gameServerConnection->isConnected()) + Net::GameServer::logout(false); + else + setGameLoggedOut(); + + if (chatServerConnection->isConnected()) + Net::ChatServer::logout(); + else + setChatLoggedOut(); + } + else if (mScenario == LOGOUT_SWITCH_LOGIN) + { + if (accountServerConnection->isConnected()) + Net::AccountServer::logout(); + else + setAccountLoggedOut(); + + if (gameServerConnection->isConnected()) + Net::GameServer::logout(false); + else + setGameLoggedOut(); + + if (chatServerConnection->isConnected()) + Net::ChatServer::logout(); + else + setChatLoggedOut(); + } + else if (mScenario == LOGOUT_SWITCH_CHARACTER) + { + Net::GameServer::logout(true); + Net::ChatServer::logout(); + } } void LogoutHandler::reset() @@ -216,3 +271,5 @@ void LogoutHandler::reset() mLoggedOutGame = false; mLoggedOutChat = false; } + +} // namespace TmwServ diff --git a/src/net/tmwserv/logouthandler.h b/src/net/tmwserv/logouthandler.h index 6c69c8be..19b6d43a 100644 --- a/src/net/tmwserv/logouthandler.h +++ b/src/net/tmwserv/logouthandler.h @@ -22,20 +22,14 @@ #ifndef NET_TMWSERV_LOGOUTHANDLER_H #define NET_TMWSERV_LOGOUTHANDLER_H +#include "net/logouthandler.h" #include "net/messagehandler.h" #include <string> -/** - * The different scenarios for which LogoutHandler can be used - */ -enum { - LOGOUT_EXIT, - LOGOUT_SWITCH_ACCOUNTSERVER, - LOGOUT_SWITCH_CHARACTER -}; +namespace TmwServ { -class LogoutHandler : public MessageHandler +class LogoutHandler : public MessageHandler, public Net::LogoutHandler { public: LogoutHandler(); @@ -59,4 +53,6 @@ class LogoutHandler : public MessageHandler bool mLoggedOutChat; }; +} // namespace TmwServ + #endif diff --git a/src/net/tmwserv/maphandler.cpp b/src/net/tmwserv/maphandler.cpp index bbdb873e..ff47c1a7 100644 --- a/src/net/tmwserv/maphandler.cpp +++ b/src/net/tmwserv/maphandler.cpp @@ -30,6 +30,10 @@ MapHandler::MapHandler() mapHandler = this; } +void MapHandler::handleMessage(MessageIn &msg) +{ +} + void MapHandler::connect(LoginData *loginData) { // TODO diff --git a/src/net/tmwserv/maphandler.h b/src/net/tmwserv/maphandler.h index 649feda6..099ec7e0 100644 --- a/src/net/tmwserv/maphandler.h +++ b/src/net/tmwserv/maphandler.h @@ -23,14 +23,17 @@ #define NET_TMWSERV_MAPHANDLER_H #include "net/maphandler.h" +#include "net/messagehandler.h" namespace TmwServ { -class MapHandler : public Net::MapHandler +class MapHandler : public MessageHandler, public Net::MapHandler { public: MapHandler(); + void handleMessage(MessageIn &msg); + void connect(LoginData *loginData); void mapLoaded(const std::string &mapName); @@ -589,6 +589,14 @@ <Option target="eAthena" /> <Option target="UNIX eAthena" /> </Unit> + <Unit filename="src/net/ea/generalhandler.cpp"> + <Option target="eAthena" /> + <Option target="UNIX eAthena" /> + </Unit> + <Unit filename="src/net/ea/generalhandler.h"> + <Option target="eAthena" /> + <Option target="UNIX eAthena" /> + </Unit> <Unit filename="src/net/ea/gui/partytab.cpp"> <Option target="eAthena" /> <Option target="UNIX eAthena" /> @@ -621,6 +629,14 @@ <Option target="eAthena" /> <Option target="UNIX eAthena" /> </Unit> + <Unit filename="src/net/ea/logouthandler.cpp"> + <Option target="eAthena" /> + <Option target="Unix eAthena" /> + </Unit> + <Unit filename="src/net/ea/logouthandler.h"> + <Option target="eAthena" /> + <Option target="Unix eAthena" /> + </Unit> <Unit filename="src/net/ea/maphandler.cpp"> <Option target="eAthena" /> <Option target="UNIX eAthena" /> @@ -689,6 +705,7 @@ <Unit filename="src/net/guildhandler.h" /> <Unit filename="src/net/inventoryhandler.h" /> <Unit filename="src/net/loginhandler.h" /> + <Unit filename="src/net/logouthandler.h" /> <Unit filename="src/net/maphandler.h" /> <Unit filename="src/net/messagehandler.cpp" /> <Unit filename="src/net/messagehandler.h" /> @@ -833,6 +850,14 @@ <Option target="TMWServ" /> <Option target="Unix TMWSERV" /> </Unit> + <Unit filename="src/net/tmwserv/generalhandler.cpp"> + <Option target="TMWServ" /> + <Option target="Unix TMWSERV" /> + </Unit> + <Unit filename="src/net/tmwserv/generalhandler.h"> + <Option target="TMWServ" /> + <Option target="Unix TMWSERV" /> + </Unit> <Unit filename="src/net/tmwserv/guildhandler.cpp"> <Option target="TMWServ" /> <Option target="Unix TMWSERV" /> |