require("sampfuncs")
require("SFlua.cdef")
local BitStream = require("SFlua.bitstream")
local add = require("SFlua.addition")
local hooks = require("hooks")
local ffi = require("ffi")
local pRakClient, pRakPeer
local originalOutgoingRpc
-- это находится в main() и получается после инициализации сампа
pRakClient = ffi.cast("intptr_t*", pSAMPInfo + 0x3C9)
pRakPeer = ffi.cast("intptr_t*", pRakClient[0] - 0xDDE)
local rakClient = hooks.vmt.new(pRakClient[0])
originalOutgoingRpc = rakClient.hookMethod("bool(__thiscall*)(void*, int*, SFL_BitStream*, char, char, char, bool)", handleOutgoingRpc, 25)
--
-- обработка происходит гуд, команда считывается, оригинальная функция возвращается без краша
function handleOutgoingRpc(this, id, bitStream, priority, reliability, orderingChannel, shiftTimestamp)
local rpcId = ffi.cast("int *", id)[0]
local pBitStream = add.GET_POINTER(bitStream)
print("rpcId:", rpcId)
if (rpcId == 50) then
local command = raknetBitStreamReadString(pBitStream, raknetBitStreamReadInt32(pBitStream))
if (command == "/srpc") then
local bs = BitStream()
sendRpc(52, bs)
end
end
return originalOutgoingRpc(this, id, bitStream, priority, reliability, orderingChannel, shiftTimestamp)
end
-- а вот эта шняга крашит
function sendRpc(id, bs)
if not pRakClient then return false end
id = ffi.cast("int*", id)
return originalOutgoingRpc(pRakClient, id, bs, HIGH_PRIORITY, RELIABLE_ORDERED, 0, false) -- при вызове ориг функции с заданными параметрами игру крашит
end