diff options
Diffstat (limited to 'src/net/tmwa')
-rw-r--r-- | src/net/tmwa/chathandler.cpp | 14 | ||||
-rw-r--r-- | src/net/tmwa/messagein.cpp | 15 | ||||
-rw-r--r-- | src/net/tmwa/messageout.cpp | 48 | ||||
-rw-r--r-- | src/net/tmwa/messageout.h | 27 | ||||
-rw-r--r-- | src/net/tmwa/network.cpp | 15 | ||||
-rw-r--r-- | src/net/tmwa/network.h | 6 |
6 files changed, 41 insertions, 84 deletions
diff --git a/src/net/tmwa/chathandler.cpp b/src/net/tmwa/chathandler.cpp index 0b111104..a282a943 100644 --- a/src/net/tmwa/chathandler.cpp +++ b/src/net/tmwa/chathandler.cpp @@ -52,6 +52,7 @@ ChatHandler::ChatHandler() SMSG_WHISPER, SMSG_WHISPER_RESPONSE, SMSG_GM_CHAT, + SMSG_SCRIPT_MESSAGE, SMSG_ONLINE_LIST, 0 }; @@ -243,6 +244,19 @@ void ChatHandler::handleMessage(MessageIn &msg) } break; } + + case SMSG_SCRIPT_MESSAGE: + { + chatMsgLength = msg.readInt16() - 5; + if (chatMsgLength <= 0) + break; + + msg.readInt8(); // message type + + SERVER_NOTICE(msg.readString(chatMsgLength)) + break; + } + case SMSG_ONLINE_LIST: { int length = msg.readInt16(); diff --git a/src/net/tmwa/messagein.cpp b/src/net/tmwa/messagein.cpp index 899b135d..7c142619 100644 --- a/src/net/tmwa/messagein.cpp +++ b/src/net/tmwa/messagein.cpp @@ -21,7 +21,6 @@ #include "net/tmwa/messagein.h" -#include <SDL.h> #include <SDL_endian.h> #define MAKEWORD(low,high) \ @@ -55,13 +54,8 @@ uint16_t MessageIn::readInt16() uint16_t value = 0; if (mPos + 2 <= mLength) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - uint16_t swap; - memcpy(&swap, mData + mPos, sizeof(uint16_t)); - value = SDL_Swap16(swap); -#else memcpy(&value, mData + mPos, sizeof(uint16_t)); -#endif + value = SDL_SwapLE16(value); } mPos += 2; return value; @@ -72,13 +66,8 @@ uint32_t MessageIn::readInt32() uint32_t value = 0; if (mPos + 4 <= mLength) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - uint32_t swap; - memcpy(&swap, mData + mPos, sizeof(uint32_t)); - value = SDL_Swap32(swap); -#else memcpy(&value, mData + mPos, sizeof(uint32_t)); -#endif + value = SDL_SwapLE32(value); } mPos += 4; return value; diff --git a/src/net/tmwa/messageout.cpp b/src/net/tmwa/messageout.cpp index 19f5ee49..12c9419a 100644 --- a/src/net/tmwa/messageout.cpp +++ b/src/net/tmwa/messageout.cpp @@ -23,54 +23,40 @@ #include "net/tmwa/network.h" -#include <SDL.h> #include <SDL_endian.h> #include <cstring> namespace TmwAthena { -MessageOut::MessageOut(uint16_t id): - mNetwork(TmwAthena::Network::instance()), - mData(mNetwork->mOutBuffer + mNetwork->mOutSize) +MessageOut::MessageOut(uint16_t id) { writeInt16(id); } -void MessageOut::expand(size_t bytes) +char *MessageOut::expand(size_t bytes) { - mNetwork->mOutSize += bytes; + Network &net = *Network::mInstance; + char *data = net.mOutBuffer + net.mOutSize; + net.mOutSize += bytes; + return data; } void MessageOut::writeInt8(uint8_t value) { - expand(1); - mData[mPos] = value; - mPos += 1; + *expand(1) = value; } void MessageOut::writeInt16(uint16_t value) { - expand(2); -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - uint16_t swap = SDL_Swap16(value); - memcpy(mData + mPos, &swap, sizeof(uint16_t)); -#else - memcpy(mData + mPos, &value, sizeof(uint16_t)); -#endif - mPos += 2; + value = SDL_SwapLE16(value); + memcpy(expand(sizeof(uint16_t)), &value, sizeof(uint16_t)); } void MessageOut::writeInt32(uint32_t value) { - expand(4); -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - uint32_t swap = SDL_Swap32(value); - memcpy(mData + mPos, &swap, sizeof(uint32_t)); -#else - memcpy(mData + mPos, &value, sizeof(uint32_t)); -#endif - mPos += 4; + value = SDL_SwapLE32(value); + memcpy(expand(sizeof(uint32_t)), &value, sizeof(uint32_t)); } void MessageOut::writeString(const std::string &string, int length) @@ -87,24 +73,22 @@ void MessageOut::writeString(const std::string &string, int length) // Make sure the length of the string is no longer than specified stringLength = length; } - expand(length); + + char *data = expand(length); // Write the actual string - memcpy(mData + mPos, string.data(), stringLength); + memcpy(data, string.data(), stringLength); // Pad remaining space with zeros if (length > stringLength) { - memset(mData + mPos + stringLength, '\0', length - stringLength); + memset(data + stringLength, '\0', length - stringLength); } - mPos += length; } void MessageOut::writeCoordinates(uint16_t x, uint16_t y, uint8_t direction) { - char *data = mData + mPos; - expand(3); - mPos += 3; + char *data = expand(3); uint16_t temp = x; temp <<= 6; diff --git a/src/net/tmwa/messageout.h b/src/net/tmwa/messageout.h index 4f1faa9d..b60644de 100644 --- a/src/net/tmwa/messageout.h +++ b/src/net/tmwa/messageout.h @@ -27,8 +27,6 @@ namespace TmwAthena { -class Network; - /** * Used for building an outgoing message to eAthena. * @@ -66,31 +64,12 @@ class MessageOut void writeCoordinates(uint16_t x, uint16_t y, uint8_t direction); - /** - * Returns the content of the message. - */ - char *getData() const { return mData; } - - /** - * Returns the length of the data. - */ - unsigned int getDataSize() const { return mDataSize; } - private: /** - * Expand the packet data to be able to hold more data. - * - * NOTE: For performance enhancements this method could allocate extra - * memory in advance instead of expanding size every time more data is - * added. + * Expand the packet data to be able to hold more data. Returns a + * pointer to the start of the new data. */ - void expand(size_t size); - - Network *mNetwork; - - char *mData; /**< Data building up. */ - unsigned int mDataSize = 0; /**< Size of data. */ - unsigned int mPos = 0; /**< Position in the data. */ + static char *expand(size_t size); }; } // namespace TmwAthena diff --git a/src/net/tmwa/network.cpp b/src/net/tmwa/network.cpp index b4ba0b20..a35d7ffe 100644 --- a/src/net/tmwa/network.cpp +++ b/src/net/tmwa/network.cpp @@ -580,11 +580,6 @@ void Network::receive() SDLNet_FreeSocketSet(set); } -Network *Network::instance() -{ - return mInstance; -} - void Network::setError(const std::string &error) { logger->log("Network error: %s", error.c_str()); @@ -592,13 +587,11 @@ void Network::setError(const std::string &error) mState = NET_ERROR; } -Uint16 Network::readWord(int pos) +uint16_t Network::readWord(int pos) { -#if SDL_BYTEORDER == SDL_BIG_ENDIAN - return SDL_Swap16((*(Uint16*)(mInBuffer+(pos)))); -#else - return (*(Uint16*)(mInBuffer+(pos))); -#endif + uint16_t value; + memcpy(&value, mInBuffer + pos, sizeof(uint16_t)); + return SDL_SwapLE16(value); } } // namespace TmwAthena diff --git a/src/net/tmwa/network.h b/src/net/tmwa/network.h index 36d8cafd..4069f916 100644 --- a/src/net/tmwa/network.h +++ b/src/net/tmwa/network.h @@ -90,15 +90,13 @@ class Network NET_ERROR }; - protected: + private: friend int networkThread(void *data); friend class MessageOut; - static Network *instance(); - void setError(const std::string &error); - Uint16 readWord(int pos); + uint16_t readWord(int pos); bool realConnect(); |