/* * The Mana World * Copyright 2004 The Mana World Development Team * * This file is part of The Mana World. * * The Mana World 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. * * The Mana World 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 The Mana World; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * $Id: charserverhandler.cpp 2137 2006-02-04 16:54:35Z der_doener $ */ #include "charserverhandler.h" #include "messagein.h" #include "network.h" #include "protocol.h" #include "../game.h" #include "../log.h" #include "../logindata.h" #include "../main.h" CharServerHandler::CharServerHandler() { static const Uint16 _messages[] = { 0x006b, 0x006c, 0x006d, 0x0071, 0x0081, 0 }; handledMessages = _messages; } void CharServerHandler::handleMessage(MessageIn *msg) { int slot; /* logger->log("CharServerHandler: Packet ID: %x, Length: %d", msg->getId(), msg->getLength());*/ switch (msg->getId()) { case 0x006b: { int tmpCharID[3]; // Skip length word and an additional mysterious 20 bytes msg->skip(2 + 20); // Derive number of characters from message length n_character = (msg->getLength() - 24) / 106; for (int i = 0; i < n_character; i++) { tmpCharID[i] = msg->readInt32(); msg->readInt32(); //xp msg->readInt32(); //gp msg->readInt32(); //jobxp msg->readInt32(); //joblvl msg->skip(8); // unknown msg->readInt32(); // option msg->readInt32(); // karma msg->readInt32(); // manner msg->skip(2); // unknown msg->readInt16(); //hp msg->readInt16(); //maxhp msg->readInt16(); //mp msg->readInt16(); //maxmp msg->readInt16(); // speed msg->readInt16(); // class msg->readInt16(); //hair msg->readInt16(); //weapon msg->readInt16(); //lvl msg->readInt16(); // skill point msg->readInt16(); // head bottom msg->readInt16(); // shield msg->readInt16(); // head option top msg->readInt16(); // head option mid msg->readInt16(); // hair color msg->readInt16(); // unknown std::string charname = msg->readString(24); msg->readInt8(); //ATTR msg->readInt8(); //ATTR msg->readInt8(); //ATTR msg->readInt8(); //ATTR msg->readInt8(); //ATTR msg->readInt8(); //ATTR int slot = msg->readInt8(); // character slot charID[slot] = tmpCharID[i]; /* Get the Character Id's, needed for map server.*/ msg->readInt8(); // unknown if (slot == main_charno) char_name = charname; /* logger->log("CharServer: Player: %s (%d)", charname.c_str(), slot);*/ } state = CHAR_SELECT_STATE; break; } case 0x006c: switch (msg->readInt8()) { case 0: errorMessage = "Access denied"; break; case 1: errorMessage = "Cannot use this ID"; break; default: errorMessage = "Unknown failure to select character"; break; } break; case 0x006d: state = CONNECTING_STATE; break; case 0x0071: { msg->skip(4); // CharID, the same as the one we've already recieved. map_path = msg->readString(16); mLoginData->hostname = iptostring(msg->readInt32()); mLoginData->port = msg->readInt16(); /*logger->log("Map: Server: %s (%s:%d)", map_path.c_str(), mLoginData->hostname.c_str(), mLoginData->port);*/ state = CONNECTING_STATE; break; } case 0x0081: switch (msg->readInt8()) { case 1: errorMessage = "Map server offline"; break; case 3: errorMessage = "Speed hack detected"; break; case 8: errorMessage = "Duplicated login"; break; default: errorMessage = "Unkown error with 0x0081"; break; }; state = ERROR_STATE; break; } }