кастуй pPresentationParameters в D3DPRESENT_PARAMETERS**** Скрытый текст не может быть процитирован. ***
Lua:
local params = ffi.cast('D3DPRESENT_PARAMETERS*', pPresentationParameters)
print(params.FullScreen_RefreshRateInHz)
кастуй pPresentationParameters в D3DPRESENT_PARAMETERS**** Скрытый текст не может быть процитирован. ***
local params = ffi.cast('D3DPRESENT_PARAMETERS*', pPresentationParameters)
print(params.FullScreen_RefreshRateInHz)
Потому что void* это "ничего", на нем даже адресная арифметика не работает, он заглушка. Если хочешь работать с параметрами, то явно нужно указывать тип. В данном случае указатель на структуру*** Скрытый текст не может быть процитирован. ***
local D3D9Device = hooks.vmt.new(ffi.cast('uintptr_t*', 0xC97C28)[0])
hkReset = D3D9Device.hookMethod('long(__stdcall*)(void*, D3DPRESENT_PARAMETERS*)', hkReset, 16)
hkPresent = D3D9Device.hookMethod('long(__stdcall*)(void*, void*, void*, void*, void*)', hkPresent, 17)
--обращаться pPresentationParameters.FullScreen_RefreshRateInHz
Нортон, брат. Зачем юзать лишние касты, если можно не юзать, а писать код сразу правильно?кастуй pPresentationParameters в D3DPRESENT_PARAMETERS*
Lua:local params = ffi.cast('D3DPRESENT_PARAMETERS*', pPresentationParameters) print(params.FullScreen_RefreshRateInHz)
jit.offА это нормально что хуки по какой-то причине вызывают функцию мейн?
Как можно исправить вызов main() постоянный?jit.off
Как можно исправить вызов main() постоянный?
И влияет ли объем кода на скорость хуков, или как там его....
У меня хукается Present
Он как-то вызывает функцию мейн.
UP Вызов main() пропал, решил путем добавления
jit.off(_, false) в код. Но чувствую что это не лучшее решение
function main()
DrawHud = hook.call.new('void(__cdecl*)()', DrawHud, 0x53E4FF)
end
function DrawHud()
renderDrawBox(50.0, 50.0, 120.0, 120.0, -1)
return DrawHud()
end
попробуй хукать этоМожет быть не совсем по теме, но: возможно как-то хукнуть рендер определенных слоев, чтобы рендерить не поверх всего интерфейса? Знаю, что худ рендерится до интерфейса сампа, но следующий способ хоть и рабочий, но смысла не имеет.
Lua:function main() DrawHud = hook.call.new('void(__cdecl*)()', DrawHud, 0x53E4FF) end function DrawHud() renderDrawBox(50.0, 50.0, 120.0, 120.0, -1) return DrawHud() end
Посмотреть вложение 199208
void CChat::Draw() {
((void(__thiscall*)(CChat*))GetAddress(0x64230))(this);
}
void CChat::Draw() {
((void(__thiscall*)(CChat*))GetAddress(0x67680))(this);
}
Есть под 0.3.DL?попробуй хукать это
R1
C++:void CChat::Draw() { ((void(__thiscall*)(CChat*))GetAddress(0x64230))(this); }
R3
C++:void CChat::Draw() { ((void(__thiscall*)(CChat*))GetAddress(0x67680))(this); }
Может быть не совсем по теме, но: возможно как-то хукнуть рендер определенных слоев, чтобы рендерить не поверх всего интерфейса?
появился фикс какой нибудь (не кастыль)?А это тебе похоже от луа привет, main вызвался второй раз
Старая проблема еще с начала написания...
Можешь закостылить так
Я не знаю как это со стороны луа решать. У меня он практически не появляется, у других постоянно, у третьих раз в минут 30Lua:local init = false function main() if init then script.this:reload() --без перезагрузки main будет вызываться каждый раз, почему-то багует return end --..... init = true end
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