оно тебе не надоКак мне самим апдейтить клиент сайд анимки через луа? (C_CSPlayer::UpdateClientSideAnimation). Я понимаю, что через ffi, но не могу сделать.
Я хочу анимки как в ските сделать. Насколько я понял нужно самим апдейтить клиент сайд анимки, а то они по дефолту обновляются только когда чокед команды равны нулюоно тебе не надо
local main do
ffi.cdef [[
typedef struct {
char pad_0000[20];
int m_nOrder;
int m_nSequence;
float m_flPrevCycle;
float m_flWeight;
float m_flWeightDeltaRate;
float m_flPlaybackRate;
float m_flCycle;
void *m_pOwner;
char pad_0038[4];
} c_anim_layer;
]]
local function get_anim_layer(entity, i)
return ffi.cast("c_anim_layer*", ffi.cast("uintptr_t", entity[0]) + 0x2990)[0][i]
end
local function on_update(player)
local me = entity.get_local_player()
if me == nil then
return
end
if player == nil then
return
end
local anim_layer = get_anim_layer(player, 12)
if me == player then
anim_layer.m_flWeight = 1
end
end
events.post_update_clientside_animation(on_update)
end
Зайка, мне нужно самим апдейтить клиент сайд анимейшн, а как сделать анимбрикеры я сам знаюКод:local main do ffi.cdef [[ typedef struct { char pad_0000[20]; int m_nOrder; int m_nSequence; float m_flPrevCycle; float m_flWeight; float m_flWeightDeltaRate; float m_flPlaybackRate; float m_flCycle; void *m_pOwner; char pad_0038[4]; } c_anim_layer; ]] local function get_anim_layer(entity, i) return ffi.cast("c_anim_layer*", ffi.cast("uintptr_t", entity[0]) + 0x2990)[0][i] end local function on_update(player) local me = entity.get_local_player() if me == nil then return end if player == nil then return end local anim_layer = get_anim_layer(player, 12) if me == player then anim_layer.m_flWeight = 1 end end events.post_update_clientside_animation(on_update) end
для чего тебе его апдейтить? ты случаем раздел с созданием читов не перепутал?Зайка, мне нужно самим апдейтить клиент сайд анимейшн, а как сделать анимбрикеры я сам знаю
не думаюдля чего тебе его апдейтить? ты случаем раздел с созданием читов не перепутал?
через ffi
в нле клиентсайд анимки обновляются, только если чокед командс равно нулю, а я хочу сделать анимки как в ските(там клиентсайд анимки апдейтятся всегда)для чего тебе его апдейтить? ты случаем раздел с созданием читов не перепутал?
мне твой ответ ничего не дал, ибо нет смысла апдейтить эвент этот..не думаю
local original = ffi.cast("uintptr_t", utils.opcode_scan("client.dll", "8B F1 80 BE ? ? ? ? ? 74 36", - 5))
local function update_clientside(ecx, edx)
-- your shit
original(ecx, edx)
end
Спасибо <3мне твой ответ ничего не дал, ибо нет смысла апдейтить эвент этот..
ну вот тебе чуть кода, надеюсь разберешься
Код:local original = ffi.cast("uintptr_t", utils.opcode_scan("client.dll", "8B F1 80 BE ? ? ? ? ? 74 36", - 5)) local function update_clientside(ecx, edx) -- your shit original(ecx, edx) end
ffi.cdef[[
typedef void*(__thiscall* get_client_entity_t)(void*, int);
]]
local uintptr_t = ffi.typeof("uintptr_t**")
local this_call = function(call_function, parameters)
return function(...)
return call_function(parameters, ...)
end
end
local entity_list_003 = ffi.cast(uintptr_t, utils.create_interface("client.dll", "VClientEntityList003"))
local get_entity_address = this_call(ffi.cast("get_client_entity_t", entity_list_003[0][3]), entity_list_003)
local original = ffi.cast("uintptr_t", utils.opcode_scan("client.dll", "8B F1 80 BE ? ? ? ? ? 74 36", - 5))
local original_func = ffi.cast("void(__thiscall*)(void*, void*)", original)
local function update_clientside(ecx, edx)
original_func(ecx, edx)
end
events.createmove_run:set(function()
local self = entity.get_local_player()
if not self or not self:is_alive() then
return
end
local self_index = self:get_index()
local self_address = get_entity_address(self_index)
update_clientside(self_address, nil)
end)
на рандом потыкай, поищи в сурсах игрыКод:ffi.cdef[[ typedef void*(__thiscall* get_client_entity_t)(void*, int); ]] local uintptr_t = ffi.typeof("uintptr_t**") local this_call = function(call_function, parameters) return function(...) return call_function(parameters, ...) end end local entity_list_003 = ffi.cast(uintptr_t, utils.create_interface("client.dll", "VClientEntityList003")) local get_entity_address = this_call(ffi.cast("get_client_entity_t", entity_list_003[0][3]), entity_list_003) local original = ffi.cast("uintptr_t", utils.opcode_scan("client.dll", "8B F1 80 BE ? ? ? ? ? 74 36", - 5)) local original_func = ffi.cast("void(__thiscall*)(void*, void*)", original) local function update_clientside(ecx, edx) original_func(ecx, edx) end events.createmove_run:set(function() local self = entity.get_local_player() if not self or not self:is_alive() then return end local self_index = self:get_index() local self_address = get_entity_address(self_index) update_clientside(self_address, nil) end)
Ваще понять не могу, какой второй параметр нужно передавать. Помогите, пожалуйста <3
--- @region: example: updateCSA
local vmt_hook = require("neverlose/vmt_hook")
ffi.cdef[[
typedef void*(__thiscall* get_client_entity_t)(void*, int);
]]
local uintptr_t = ffi.typeof("uintptr_t**")
local this_call = function(call_function, parameters)
return function(...)
return call_function(parameters, ...)
end
end
local entity_list_003 = ffi.cast(uintptr_t, utils.create_interface("client.dll", "VClientEntityList003"))
local get_entity_address = this_call(ffi.cast("get_client_entity_t", entity_list_003[0][3]), entity_list_003)
local hooked_function = nil
local cmd_struct = nil
local inside_updateCSA = function(thisptr, edx)
hooked_function(thisptr, edx)
end
local update_hook = function(cmd)
local self = entity.get_local_player()
if not self or not self:is_alive() then
return
end
local self_index = self:get_index()
local self_address = get_entity_address(self_index)
cmd_struct = cmd
if not self_address or hooked_function then
return
end
local new_point = vmt_hook.new(self_address)
hooked_function = new_point.hook("void(__fastcall*)(void*, void*)", inside_updateCSA, 224)
end
events.createmove_run:set(update_hook)
Сделать не через костыли -делай че хочешь с кодом, если чет получится закинь сюда, потестим всем форумомКод:--- @region: example: updateCSA local vmt_hook = require("neverlose/vmt_hook") ffi.cdef[[ typedef void*(__thiscall* get_client_entity_t)(void*, int); ]] local uintptr_t = ffi.typeof("uintptr_t**") local this_call = function(call_function, parameters) return function(...) return call_function(parameters, ...) end end local entity_list_003 = ffi.cast(uintptr_t, utils.create_interface("client.dll", "VClientEntityList003")) local get_entity_address = this_call(ffi.cast("get_client_entity_t", entity_list_003[0][3]), entity_list_003) local hooked_function = nil local cmd_struct = nil local inside_updateCSA = function(thisptr, edx) hooked_function(thisptr, edx) end local update_hook = function(cmd) local self = entity.get_local_player() if not self or not self:is_alive() then return end local self_index = self:get_index() local self_address = get_entity_address(self_index) cmd_struct = cmd if not self_address or hooked_function then return end local new_point = vmt_hook.new(self_address) hooked_function = new_point.hook("void(__fastcall*)(void*, void*)", inside_updateCSA, 224) end events.createmove_run:set(update_hook)
какая разница? в нле если хукать CSA, ничего меняться не будет, ибо ИЗНАЧАЛЬНО В ЧИТЕ обновляется он если chokedcommands == 0Сделать не через костыли -
СДЕЛАТЬ ЧЕРЕЗ КОСТЫЛИ -
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz