summaryrefslogblamecommitdiff
path: root/net/nethandler.cpp
blob: 8021e553c0715865f0b7eb8317acca6865949172 (plain) (tree)





















































































































































































                                                                                           
#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<short>(msg.length() + 28));
    outMsg.writeString(name, 24);
    outMsg.writeString(msg, static_cast<int>(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<short>(mes.length() + 4 + 1));
    outMsg.writeString(mes, static_cast<int>(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);
}