allow usage of network messages in extended opcode
This commit is contained in:
parent
2478809945
commit
7bca3de8eb
|
@ -423,6 +423,7 @@ void Application::registerLuaFunctions()
|
||||||
// InputMessage
|
// InputMessage
|
||||||
g_lua.registerClass<InputMessage>();
|
g_lua.registerClass<InputMessage>();
|
||||||
g_lua.bindClassStaticFunction<InputMessage>("create", []{ return InputMessagePtr(new InputMessage); });
|
g_lua.bindClassStaticFunction<InputMessage>("create", []{ return InputMessagePtr(new InputMessage); });
|
||||||
|
g_lua.bindClassMemberFunction<InputMessage>("setBuffer", &InputMessage::setBuffer);
|
||||||
g_lua.bindClassMemberFunction<InputMessage>("skipBytes", &InputMessage::skipBytes);
|
g_lua.bindClassMemberFunction<InputMessage>("skipBytes", &InputMessage::skipBytes);
|
||||||
g_lua.bindClassMemberFunction<InputMessage>("getU8", &InputMessage::getU8);
|
g_lua.bindClassMemberFunction<InputMessage>("getU8", &InputMessage::getU8);
|
||||||
g_lua.bindClassMemberFunction<InputMessage>("getU16", &InputMessage::getU16);
|
g_lua.bindClassMemberFunction<InputMessage>("getU16", &InputMessage::getU16);
|
||||||
|
@ -437,6 +438,7 @@ void Application::registerLuaFunctions()
|
||||||
// OutputMessage
|
// OutputMessage
|
||||||
g_lua.registerClass<OutputMessage>();
|
g_lua.registerClass<OutputMessage>();
|
||||||
g_lua.bindClassStaticFunction<OutputMessage>("create", []{ return OutputMessagePtr(new OutputMessage); });
|
g_lua.bindClassStaticFunction<OutputMessage>("create", []{ return OutputMessagePtr(new OutputMessage); });
|
||||||
|
g_lua.bindClassMemberFunction<OutputMessage>("getBuffer", &OutputMessage::getBuffer);
|
||||||
g_lua.bindClassMemberFunction<OutputMessage>("reset", &OutputMessage::reset);
|
g_lua.bindClassMemberFunction<OutputMessage>("reset", &OutputMessage::reset);
|
||||||
g_lua.bindClassMemberFunction<OutputMessage>("addU8", &OutputMessage::addU8);
|
g_lua.bindClassMemberFunction<OutputMessage>("addU8", &OutputMessage::addU8);
|
||||||
g_lua.bindClassMemberFunction<OutputMessage>("addU16", &OutputMessage::addU16);
|
g_lua.bindClassMemberFunction<OutputMessage>("addU16", &OutputMessage::addU16);
|
||||||
|
|
|
@ -30,28 +30,16 @@ InputMessage::InputMessage()
|
||||||
|
|
||||||
void InputMessage::reset()
|
void InputMessage::reset()
|
||||||
{
|
{
|
||||||
m_messageSize = 0;
|
|
||||||
m_readPos = MAX_HEADER_SIZE;
|
m_readPos = MAX_HEADER_SIZE;
|
||||||
m_headerPos = MAX_HEADER_SIZE;
|
m_headerPos = MAX_HEADER_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InputMessage::setHeaderSize(uint16 size)
|
void InputMessage::setBuffer(const std::string& buffer)
|
||||||
{
|
{
|
||||||
m_headerPos = MAX_HEADER_SIZE - size;
|
memcpy(m_buffer + MAX_HEADER_SIZE, buffer.c_str(), buffer.size());
|
||||||
m_readPos = m_headerPos;
|
m_readPos = MAX_HEADER_SIZE;
|
||||||
}
|
m_headerPos = MAX_HEADER_SIZE;
|
||||||
|
m_messageSize = buffer.size();
|
||||||
void InputMessage::fillBuffer(uint8 *buffer, uint16 size)
|
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8 InputMessage::getU8(bool peek)
|
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());
|
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)
|
bool InputMessage::canRead(int bytes)
|
||||||
{
|
{
|
||||||
if((m_readPos - m_headerPos + bytes > m_messageSize) || (m_readPos + bytes > BUFFER_MAXSIZE))
|
if((m_readPos - m_headerPos + bytes > m_messageSize) || (m_readPos + bytes > BUFFER_MAXSIZE))
|
||||||
|
|
|
@ -37,6 +37,8 @@ public:
|
||||||
|
|
||||||
InputMessage();
|
InputMessage();
|
||||||
|
|
||||||
|
void setBuffer(const std::string& buffer);
|
||||||
|
|
||||||
void skipBytes(uint16 bytes) { m_readPos += bytes; }
|
void skipBytes(uint16 bytes) { m_readPos += bytes; }
|
||||||
uint8 getU8(bool peek = false);
|
uint8 getU8(bool peek = false);
|
||||||
uint16 getU16(bool peek = false);
|
uint16 getU16(bool peek = false);
|
||||||
|
@ -53,7 +55,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
void fillBuffer(uint8 *buffer, uint16 size);
|
void fillBuffer(uint8 *buffer, uint16 size);
|
||||||
|
|
||||||
void setHeaderSize(uint16 size);
|
void setHeaderSize(uint16 size);
|
||||||
|
|
|
@ -40,6 +40,8 @@ public:
|
||||||
|
|
||||||
void reset();
|
void reset();
|
||||||
|
|
||||||
|
std::string getBuffer() { return std::string((char*)m_buffer + m_headerPos, m_messageSize); }
|
||||||
|
|
||||||
void addU8(uint8 value);
|
void addU8(uint8 value);
|
||||||
void addU16(uint16 value);
|
void addU16(uint16 value);
|
||||||
void addU32(uint32 value);
|
void addU32(uint32 value);
|
||||||
|
|
|
@ -108,12 +108,12 @@ namespace Proto {
|
||||||
// all in game opcodes must be equal or greater than 50
|
// all in game opcodes must be equal or greater than 50
|
||||||
GameServerFirstGameOpcode = 50,
|
GameServerFirstGameOpcode = 50,
|
||||||
|
|
||||||
|
// otclient ONLY
|
||||||
|
GameServerExtendedOpcode = 50,
|
||||||
|
|
||||||
// NOTE: add any custom opcodes in this range
|
// NOTE: add any custom opcodes in this range
|
||||||
// 51 - 99
|
// 51 - 99
|
||||||
|
|
||||||
// otclient ONLY
|
|
||||||
GameServerExtendedOpcode = 99,
|
|
||||||
|
|
||||||
// original tibia ONLY
|
// original tibia ONLY
|
||||||
GameServerFullMap = 100,
|
GameServerFullMap = 100,
|
||||||
GameServerMapTopRow = 101,
|
GameServerMapTopRow = 101,
|
||||||
|
@ -203,11 +203,11 @@ namespace Proto {
|
||||||
// all in game opcodes must be equal or greater than 50
|
// all in game opcodes must be equal or greater than 50
|
||||||
ClientFirstGameOpcode = 50,
|
ClientFirstGameOpcode = 50,
|
||||||
|
|
||||||
// NOTE: add any custom opcodes in this range
|
|
||||||
// 50 - 98
|
|
||||||
|
|
||||||
// otclient ONLY
|
// otclient ONLY
|
||||||
ClientExtendedOpcode = 99,
|
ClientExtendedOpcode = 50,
|
||||||
|
|
||||||
|
// NOTE: add any custom opcodes in this range
|
||||||
|
// 51 - 99
|
||||||
|
|
||||||
// original tibia ONLY
|
// original tibia ONLY
|
||||||
ClientAutoWalk = 100,
|
ClientAutoWalk = 100,
|
||||||
|
|
|
@ -1212,7 +1212,11 @@ void ProtocolGame::parseExtendedOpcode(const InputMessagePtr& msg)
|
||||||
int opcode = msg->getU8();
|
int opcode = msg->getU8();
|
||||||
std::string buffer = msg->getString();
|
std::string buffer = msg->getString();
|
||||||
|
|
||||||
|
try {
|
||||||
callLuaField("onExtendedOpcode", opcode, buffer);
|
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)
|
void ProtocolGame::setMapDescription(const InputMessagePtr& msg, int x, int y, int z, int width, int height)
|
||||||
|
|
Loading…
Reference in New Issue