From 7bca3de8eb84d1ba8db2e725c51ac51fa2d187bf Mon Sep 17 00:00:00 2001 From: Eduardo Bart Date: Mon, 14 May 2012 20:13:48 -0300 Subject: [PATCH] allow usage of network messages in extended opcode --- src/framework/luafunctions.cpp | 2 ++ src/framework/net/inputmessage.cpp | 41 +++++++++++++++----------- src/framework/net/inputmessage.h | 3 +- src/framework/net/outputmessage.h | 2 ++ src/otclient/net/protocolcodes.h | 14 ++++----- src/otclient/net/protocolgameparse.cpp | 6 +++- 6 files changed, 42 insertions(+), 26 deletions(-) diff --git a/src/framework/luafunctions.cpp b/src/framework/luafunctions.cpp index 93c6e08f..82c1961e 100644 --- a/src/framework/luafunctions.cpp +++ b/src/framework/luafunctions.cpp @@ -423,6 +423,7 @@ void Application::registerLuaFunctions() // InputMessage g_lua.registerClass(); g_lua.bindClassStaticFunction("create", []{ return InputMessagePtr(new InputMessage); }); + g_lua.bindClassMemberFunction("setBuffer", &InputMessage::setBuffer); g_lua.bindClassMemberFunction("skipBytes", &InputMessage::skipBytes); g_lua.bindClassMemberFunction("getU8", &InputMessage::getU8); g_lua.bindClassMemberFunction("getU16", &InputMessage::getU16); @@ -437,6 +438,7 @@ void Application::registerLuaFunctions() // OutputMessage g_lua.registerClass(); g_lua.bindClassStaticFunction("create", []{ return OutputMessagePtr(new OutputMessage); }); + g_lua.bindClassMemberFunction("getBuffer", &OutputMessage::getBuffer); g_lua.bindClassMemberFunction("reset", &OutputMessage::reset); g_lua.bindClassMemberFunction("addU8", &OutputMessage::addU8); g_lua.bindClassMemberFunction("addU16", &OutputMessage::addU16); diff --git a/src/framework/net/inputmessage.cpp b/src/framework/net/inputmessage.cpp index b2b8ca35..e843a772 100644 --- a/src/framework/net/inputmessage.cpp +++ b/src/framework/net/inputmessage.cpp @@ -30,28 +30,16 @@ InputMessage::InputMessage() void InputMessage::reset() { - m_messageSize = 0; m_readPos = MAX_HEADER_SIZE; m_headerPos = MAX_HEADER_SIZE; } -void InputMessage::setHeaderSize(uint16 size) -{ - m_headerPos = MAX_HEADER_SIZE - size; - m_readPos = m_headerPos; -} - -void InputMessage::fillBuffer(uint8 *buffer, uint16 size) +void InputMessage::setBuffer(const std::string& buffer) { - memcpy(m_buffer + m_readPos, buffer, size); - m_messageSize += size; -} - -bool InputMessage::readChecksum() -{ - uint32_t receivedCheck = getU32(); - uint32 checksum = Fw::getAdlerChecksum(m_buffer + m_readPos, getUnreadSize()); - return receivedCheck == checksum; + memcpy(m_buffer + MAX_HEADER_SIZE, buffer.c_str(), buffer.size()); + m_readPos = MAX_HEADER_SIZE; + m_headerPos = MAX_HEADER_SIZE; + m_messageSize = buffer.size(); } uint8 InputMessage::getU8(bool peek) @@ -112,6 +100,25 @@ void InputMessage::decryptRSA(int size, const std::string& p, const std::string& RSA::decrypt((char*)m_buffer + m_readPos, size, p.c_str(), q.c_str(), d.c_str()); } +void InputMessage::fillBuffer(uint8 *buffer, uint16 size) +{ + memcpy(m_buffer + m_readPos, buffer, size); + m_messageSize += size; +} + +void InputMessage::setHeaderSize(uint16 size) +{ + m_headerPos = MAX_HEADER_SIZE - size; + m_readPos = m_headerPos; +} + +bool InputMessage::readChecksum() +{ + uint32_t receivedCheck = getU32(); + uint32 checksum = Fw::getAdlerChecksum(m_buffer + m_readPos, getUnreadSize()); + return receivedCheck == checksum; +} + bool InputMessage::canRead(int bytes) { if((m_readPos - m_headerPos + bytes > m_messageSize) || (m_readPos + bytes > BUFFER_MAXSIZE)) diff --git a/src/framework/net/inputmessage.h b/src/framework/net/inputmessage.h index f3119a41..69dcab2f 100644 --- a/src/framework/net/inputmessage.h +++ b/src/framework/net/inputmessage.h @@ -37,6 +37,8 @@ public: InputMessage(); + void setBuffer(const std::string& buffer); + void skipBytes(uint16 bytes) { m_readPos += bytes; } uint8 getU8(bool peek = false); uint16 getU16(bool peek = false); @@ -53,7 +55,6 @@ public: protected: void reset(); - void fillBuffer(uint8 *buffer, uint16 size); void setHeaderSize(uint16 size); diff --git a/src/framework/net/outputmessage.h b/src/framework/net/outputmessage.h index ecf20672..ac8b0503 100644 --- a/src/framework/net/outputmessage.h +++ b/src/framework/net/outputmessage.h @@ -40,6 +40,8 @@ public: void reset(); + std::string getBuffer() { return std::string((char*)m_buffer + m_headerPos, m_messageSize); } + void addU8(uint8 value); void addU16(uint16 value); void addU32(uint32 value); diff --git a/src/otclient/net/protocolcodes.h b/src/otclient/net/protocolcodes.h index afb96fbe..dad57f19 100644 --- a/src/otclient/net/protocolcodes.h +++ b/src/otclient/net/protocolcodes.h @@ -108,12 +108,12 @@ namespace Proto { // all in game opcodes must be equal or greater than 50 GameServerFirstGameOpcode = 50, + // otclient ONLY + GameServerExtendedOpcode = 50, + // NOTE: add any custom opcodes in this range // 51 - 99 - // otclient ONLY - GameServerExtendedOpcode = 99, - // original tibia ONLY GameServerFullMap = 100, GameServerMapTopRow = 101, @@ -203,11 +203,11 @@ namespace Proto { // all in game opcodes must be equal or greater than 50 ClientFirstGameOpcode = 50, - // NOTE: add any custom opcodes in this range - // 50 - 98 - // otclient ONLY - ClientExtendedOpcode = 99, + ClientExtendedOpcode = 50, + + // NOTE: add any custom opcodes in this range + // 51 - 99 // original tibia ONLY ClientAutoWalk = 100, diff --git a/src/otclient/net/protocolgameparse.cpp b/src/otclient/net/protocolgameparse.cpp index 33ff79a0..c73e51b8 100644 --- a/src/otclient/net/protocolgameparse.cpp +++ b/src/otclient/net/protocolgameparse.cpp @@ -1212,7 +1212,11 @@ void ProtocolGame::parseExtendedOpcode(const InputMessagePtr& msg) int opcode = msg->getU8(); std::string buffer = msg->getString(); - callLuaField("onExtendedOpcode", opcode, buffer); + try { + callLuaField("onExtendedOpcode", opcode, buffer); + } catch(Exception& e) { + logError("Network exception in extended opcode ", opcode, ": ", e.what()); + } } void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height)