From c7e7b62aa94bf295ca1dc556762ad6070221e0cd Mon Sep 17 00:00:00 2001 From: Eugenio Favalli Date: Tue, 25 Jul 2006 18:04:38 +0000 Subject: Switched client to use enet and modified login sequence to work with the new protocol from tmwserv. --- src/net/messagein.cpp | 171 ++++++++++++-------------------------------------- 1 file changed, 39 insertions(+), 132 deletions(-) (limited to 'src/net/messagein.cpp') diff --git a/src/net/messagein.cpp b/src/net/messagein.cpp index bbc0a44c..7e85a813 100644 --- a/src/net/messagein.cpp +++ b/src/net/messagein.cpp @@ -1,5 +1,5 @@ /* - * The Mana World + * The Mana World Server * Copyright 2004 The Mana World Development Team * * This file is part of The Mana World. @@ -23,14 +23,11 @@ #include "messagein.h" -#include -#include -#include +#include -#define MAKEWORD(low,high) \ - ((unsigned short)(((unsigned char)(low)) | \ - ((unsigned short)((unsigned char)(high))) << 8)) +#include +#include "packet.h" MessageIn::MessageIn(const char *data, unsigned int length): mData(data), @@ -38,157 +35,67 @@ MessageIn::MessageIn(const char *data, unsigned int length): mPos(0) { // Read the message ID - mId = readInt16(); + mId = readShort(); } -Sint8 -MessageIn::readInt8() +MessageIn::~MessageIn() { - assert(mPos < mLength); - return mData[mPos++]; } -Sint16 -MessageIn::readInt16() +char MessageIn::readByte() { - assert(mPos + 2 <= mLength); - mPos += 2; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - return SDL_Swap16(*(Sint16*)(mData + (mPos - 2))); -#else - return (*(Sint16*)(mData + (mPos - 2))); -#endif -} - -Sint32 -MessageIn::readInt32() -{ - assert(mPos + 4 <= mLength); - mPos += 4; -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - return SDL_Swap32(*(Sint32*)(mData + (mPos - 4))); -#else - return (*(Sint32*)(mData + (mPos - 4))); -#endif -} - -void -MessageIn::readCoordinates(Uint16 &x, Uint16 &y, Uint8 &direction) -{ - assert(mPos + 3 <= mLength); - - const char *data = mData + mPos; - Sint16 temp; - - temp = MAKEWORD(data[1] & 0x00c0, data[0] & 0x00ff); - x = temp >> 6; - temp = MAKEWORD(data[2] & 0x00f0, data[1] & 0x003f); - y = temp >> 4; - - direction = data[2] & 0x000f; - - // Translate from eAthena format - switch (direction) + char value = -1; + if (mPos < mLength) { - case 0: - direction = 1; - break; - case 1: - direction = 3; - break; - case 2: - direction = 2; - break; - case 3: - direction = 6; - break; - case 4: - direction = 4; - break; - case 5: - direction = 12; - break; - case 6: - direction = 8; - break; - case 7: - direction = 9; - break; - default: - // OOPSIE! Impossible or unknown - direction = 0; + value = mData[mPos]; } - - mPos += 3; + mPos += 1; + return value; } -void -MessageIn::readCoordinatePair(Uint16 &srcX, Uint16 &srcY, - Uint16 &dstX, Uint16 &dstY) +short MessageIn::readShort() { - assert(mPos + 5 <= mLength); - - const char *data = mData + mPos; - Sint16 temp; - - temp = MAKEWORD(data[3], data[2] & 0x000f); - dstX = temp >> 2; - - dstY = MAKEWORD(data[4], data[3] & 0x0003); - - temp = MAKEWORD(data[1], data[0]); - srcX = temp >> 6; - - temp = MAKEWORD(data[2], data[1] & 0x003f); - srcY = temp >> 4; - - mPos += 5; + short value = -1; + if (mPos + 2 <= mLength) + { + uint16_t t; + memcpy(&t, mData + mPos, 2); + value = ENET_NET_TO_HOST_16(t); + } + mPos += 2; + return value; } -void -MessageIn::skip(unsigned int length) +long MessageIn::readLong() { - assert(mPos + length <= mLength); - mPos += length; + long value = -1; + if (mPos + 4 <= mLength) + { + uint32_t t; + memcpy(&t, mData + mPos, 4); + value = ENET_NET_TO_HOST_32(t); + } + mPos += 4; + return value; } -std::string -MessageIn::readString(int length) +std::string MessageIn::readString(int length) { // Get string length if (length < 0) { - length = readInt16(); + length = readShort(); } - // Make sure the string isn't erroneous + // Make sure the string isn't erroneus if (length < 0 || mPos + length > mLength) { mPos = mLength + 1; return ""; } - // Read the string - char const *stringBeg = mData + mPos; - char const *stringEnd = (char const *)memchr(stringBeg, '\0', length); - std::string readString(stringBeg, - stringEnd ? stringEnd - stringBeg : length); + // Read the string + char const *stringBeg = mData + mPos, + *stringEnd = (char const *)memchr(stringBeg, '\0', length); + std::string readString(stringBeg, stringEnd ? stringEnd - stringBeg : length); mPos += length; return readString; } - -Sint8& operator<<(Sint8 &lhs, MessageIn &msg) -{ - lhs = msg.readInt8(); - return lhs; -} - -Sint16& operator<<(Sint16 &lhs, MessageIn &msg) -{ - lhs = msg.readInt16(); - return lhs; -} - -Sint32& operator<<(Sint32 &lhs, MessageIn &msg) -{ - lhs = msg.readInt32(); - return lhs; -} -- cgit v1.2.3-60-g2f50