#include "nethandler.h" #include "network.h" #include "protocol.h" #include "messageout.h" #include "loginhandler.h" #include "chathandler.h" #include "charserverhandler.h" #include "maploginhandler.h" #include "../main.h" #include "../game.h" static NetHandler *NetInstance = NULL; static Network *mNetwork = NULL; MessageHandler *mChatHandler = NULL; LoginHandler loginHandler; CharServerHandler charServerHandler; MapLoginHandler mapLoginHandler; NetHandler::NetHandler() { NetInstance = this; } NetHandler::~NetHandler() { delete mNetwork; if (mChatHandler != NULL) delete mChatHandler; delete NetInstance; } void NetHandler::clean_up() { delete mNetwork; if (mChatHandler != NULL) // fix a crash caused by map server D/C delete mChatHandler; mNetwork = new Network(); } NetHandler *NetHandler::getNetInstance() { return NetInstance; } Network *NetHandler::getNetwork() { if (mNetwork == NULL) mNetwork = new Network(); return mNetwork; } void NetHandler::loadHandlers() { mChatHandler = new ChatHandler(); mNetwork->registerHandler(mChatHandler); } // All code related to login, from main.cpp void NetHandler::accountLogin(LoginData *loginData) { /* logger->log("Trying to connect to account server..."); logger->log("Username is %s", loginData->username.c_str());*/ mNetwork->connect(loginData->hostname, loginData->port); mNetwork->registerHandler(&loginHandler); loginHandler.setLoginData(loginData); // Send login infos MessageOut outMsg(mNetwork); outMsg.writeInt16(0x0064); outMsg.writeInt32(9); // client version outMsg.writeString(loginData->username, 24); outMsg.writeString(loginData->password, 24); outMsg.writeInt8(1 | 2); // flags } void NetHandler::charLogin(LoginData *loginData) { /*logger->log("Trying to connect to char server..."); logger->log("Server: %s (%s:%d)", server_info[0]->name.c_str(), loginData->hostname.c_str(), loginData->port);*/ mNetwork->connect(loginData->hostname, loginData->port); mNetwork->registerHandler(&charServerHandler); charServerHandler.setLoginData(loginData); // Send login infos MessageOut outMsg(mNetwork); outMsg.writeInt16(0x0065); outMsg.writeInt32(loginData->account_ID); outMsg.writeInt32(loginData->session_ID1); outMsg.writeInt32(loginData->session_ID2); outMsg.writeInt16(1); // this should match MIN_CLIENT_VERSION in tmwa/src/char/char.hpp outMsg.writeInt8(loginData->sex); // We get 4 useless bytes before the real answer comes in mNetwork->skip(4); } void NetHandler::mapLogin(LoginData *loginData) { MessageOut outMsg(mNetwork); /*logger->log("Trying to connect to map server..."); logger->log("Map: %s", map_path.c_str());*/ mNetwork->connect(loginData->hostname, loginData->port); mNetwork->registerHandler(&mapLoginHandler); // Send login infos outMsg.writeInt16(0x0072); outMsg.writeInt32(loginData->account_ID); outMsg.writeInt32(charID[main_charno]); 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 mNetwork->skip(4); } // add a few of the packets that need to be sent. void NetHandler::attemptCharSelect() { /*logger->log("CharServer: Character Select: %s", char_name.c_str());*/ // Request character selection MessageOut outMsg(mNetwork); outMsg.writeInt16(0x0066); outMsg.writeInt8(main_charno); } void NetHandler::mapLoaded() { MessageOut outMsg(mNetwork); outMsg.writeInt16(CMSG_MAP_LOADED); } void NetHandler::privateMessage(std::string name, std::string msg) { MessageOut outMsg(mNetwork); outMsg.writeInt16(CMSG_CHAT_WHISPER); outMsg.writeInt16(static_cast(msg.length() + 28)); outMsg.writeString(name, 24); outMsg.writeString(msg, static_cast(msg.length())); } void NetHandler::publicMessage(std::string msg) { std::string mes = std::string("guild") + " : " + msg; MessageOut outMsg(mNetwork); outMsg.writeInt16(CMSG_CHAT_MESSAGE); outMsg.writeInt16(static_cast(mes.length() + 4 + 1)); outMsg.writeString(mes, static_cast(mes.length() + 1)); } void NetHandler::sit() { MessageOut outMsg(mNetwork); outMsg.writeInt16(CMSG_PLAYER_CHANGE_ACT); outMsg.writeInt32(0); outMsg.writeInt8(2); } void NetHandler::ping(int tick) { MessageOut outMsg(mNetwork); outMsg.writeInt16(CMSG_CLIENT_PING); outMsg.writeInt32(tick); }