summaryrefslogtreecommitdiff
path: root/net/charserverhandler.cpp
diff options
context:
space:
mode:
authorHello=) <hello@themanaworld.org>2024-03-29 04:23:18 +0300
committerHello=) <hello@themanaworld.org>2024-03-29 04:23:18 +0300
commit08cd08587be5c8d2ce42ae417098c524f683c6ad (patch)
tree727aa239372a77e9ca3d72fe761940bb49e8d2d8 /net/charserverhandler.cpp
parentdb0b1da0060f5eb4b2af040c22ea9373d36970af (diff)
downloadguildbot-08cd08587be5c8d2ce42ae417098c524f683c6ad.tar.gz
guildbot-08cd08587be5c8d2ce42ae417098c524f683c6ad.tar.bz2
guildbot-08cd08587be5c8d2ce42ae417098c524f683c6ad.tar.xz
guildbot-08cd08587be5c8d2ce42ae417098c524f683c6ad.zip
Move actual top level from src/ to top: just one single dir is pointless.
Reported-By: NetSysFire
Diffstat (limited to 'net/charserverhandler.cpp')
-rw-r--r--net/charserverhandler.cpp166
1 files changed, 166 insertions, 0 deletions
diff --git a/net/charserverhandler.cpp b/net/charserverhandler.cpp
new file mode 100644
index 0000000..d500c0d
--- /dev/null
+++ b/net/charserverhandler.cpp
@@ -0,0 +1,166 @@
+/*
+ * 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 "../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;
+ }
+}