local ffi = require 'ffi'

-- Structure definition for CVector, as it is used in the function
ffi.cdef[[
typedef struct {
    float x;
    float y;
    float z;
} CVector;
]]


--HOOKS
local hook = {hooks = {}}
addEventHandler('onScriptTerminate', function(scr)
    if scr == script.this then
        for i, hook in ipairs(hook.hooks) do
            if hook.status then
                hook.stop()
            end
        end
    end
end)
ffi.cdef [[
    int VirtualProtect(void* lpAddress, unsigned long dwSize, unsigned long flNewProtect, unsigned long* lpflOldProtect);
]]
function hook.new(cast, callback, hook_addr, size)
    jit.off(callback, true) --off jit compilation | thx FYP
    local size = size or 5
    local new_hook = {}
    local detour_addr = tonumber(ffi.cast('intptr_t', ffi.cast('void*', ffi.cast(cast, callback))))
    local void_addr = ffi.cast('void*', hook_addr)
    local old_prot = ffi.new('unsigned long[1]')
    local org_bytes = ffi.new('uint8_t[?]', size)
    ffi.copy(org_bytes, void_addr, size)
    local hook_bytes = ffi.new('uint8_t[?]', size, 0x90)
    hook_bytes[0] = 0xE9
    ffi.cast('uint32_t*', hook_bytes + 1)[0] = detour_addr - hook_addr - 5
    new_hook.call = ffi.cast(cast, hook_addr)
    new_hook.status = false
    local function set_status(bool)
        new_hook.status = bool
        ffi.C.VirtualProtect(void_addr, size, 0x40, old_prot)
        ffi.copy(void_addr, bool and hook_bytes or org_bytes, size)
        ffi.C.VirtualProtect(void_addr, size, old_prot[0], old_prot)
    end
    new_hook.stop = function() set_status(false) end
    new_hook.start = function() set_status(true) end
    new_hook.start()
    table.insert(hook.hooks, new_hook)
    return setmetatable(new_hook, {
        __call = function(self, ...)
            self.stop()
            local res = self.call(...)
            self.start()
            return res
        end
    })
end
--HOOKS




-- -- Hook implementation for DrawHealthBar
-- function CPlayerTagsDrawHealthBarHook(this, pPosition, fHealth, fArmour, fDistanceToCamera)
    -- -- Custom logic here
    -- -- For example, print the health and armour values
    
    -- -- Call the original function
    -- -- return CPlayerTagsDrawHealthBar(this, pPosition, fHealth/2, fArmour+15, fDistanceToCamera)
-- end

-- function main()
    -- local drawHealthBarFuncAddress = getModuleHandle('samp.dll') + 0x689C0 -- Address for CPlayerTags::DrawHealthBar

    -- CPlayerTagsDrawHealthBar = hook.new(
        -- 'void(__thiscall *)(void*, CVector*, float, float, float)', 
        -- CPlayerTagsDrawHealthBarHook, 
        -- drawHealthBarFuncAddress
    -- )
	-- print"hoke"
-- end









local getBonePositionFunc = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)
local textId = 2014

-- Получить координаты части тела
local function getBodyPartCoordinates(boneId, pedHandle)
    local pedPointer = getCharPointer(pedHandle)
    local coordinates = ffi.new("float[3]")
    getBonePositionFunc(ffi.cast("void*", pedPointer), coordinates, boneId, true)
    return coordinates[0], coordinates[1], coordinates[2]
end








-- Define the hook function for CPlayerTags::DrawHealthBar
function CPlayerTagsDrawHealthBarHook(this, pPosition, fHealth, fArmour, fDistanceToCamera)
    -- Custom logic can be inserted here
    print("Inside DrawHealthBar hook")
    print("Position: ", pPosition.x, pPosition.y, pPosition.z)
    print("Health: ", fHealth)
    print("Armour: ", this)
    print("Distance to Camera: ", fDistanceToCamera)
	
    -- Call the original DrawHealthBar function
    return CPlayerTagsDrawHealthBar(this, pPosition, 0.01, 100, fDistanceToCamera)
end

function main()
    local drawHealthBarFuncAddress = getModuleHandle('samp.dll') + 0x689C0 -- Replace with the correct address if different

    CPlayerTagsDrawHealthBar = hook.new(
        'void(__thiscall *)(void*, CVector*, float, float, float)', 
        CPlayerTagsDrawHealthBarHook, 
        drawHealthBarFuncAddress
    )
end


перепиши все это так, чтобы я мог не хукать, а вызывать с помощью ffi функцию.

адрес CPlayerTags - 0x03e08fa0