local SAMP_BASE = getModuleHandle('samp.dll')

-- Definice funkci, ktere se vyuzivaji v ruznych castech skriptu

local drawHealthBarFuncAddress = SAMP_BASE + 0x689C0
local drawHealthBarFunc = ffi.cast("void(__thiscall*)(void*, CVector*, float, float, float)", drawHealthBarFuncAddress)

local textId = 2014
local position = ffi.new("CVector")


-- CPlayerTags::CPlayerTags <- UNUSED, Drawer -> call CPlayerTags::DrawLabel, CPlayerTags::OnLostDevice, CPlayerTags::OnResetDevice <- UNUSED, CFonts,
-- CFonts::DrawLittleText, CFonts::GetLittleTextScreenSize, D3DXMATRIX Projection, D3DXMATRIX View, CDeathWindow, CDeathWindow::CreateAuxFonts,
-- CEntity::GetDistanceToCamera(), ReturnAddress from DrawLabel, ReturnAddress from DrawHealth
local SAMP_OFFSET	= {0x68610, 0x70F96, 0x68F70, 0x68FA0, 0x21A0FC, 0x66E00, 0x66BD0, 0x12C980, 0x12C940, 0x21A0EC, 0x65F10, 0x9A7D0, 0x70E10, 0x6FD00}


-- функция измеряющая размер текста (/fontsize), используется для корректировки вертикального выравнивания 3дтекстов
-- раньше крашила игру в рандомные моменты... требует тестов короч, вот так вот бля :(
-- _DWORD *__thiscall CFonts::GetLittleTextScreenSize(CFonts *this, _DWORD *pSize, const char *szText, int nFormat)
local DT_LEFT		= 0x00000000
local DT_NOCLIP		= 0x00000100

local size	= ffi.new("SIZE")
local flags	= bit.bor(DT_LEFT, DT_NOCLIP)

local function sampGetMeasuredTextSize(text)
    local getTextSizeFuncAddr	= SAMP_BASE + SAMP_OFFSET[7]
    local getTextSizeFunc		= ffi.cast("void (__thiscall*)(void*, SIZE*, const char*, int)", getTextSizeFuncAddr)
    local fontsInstancePtr		= ffi.cast("void**", SAMP_BASE + SAMP_OFFSET[5])[0]

    size.cx = 0; size.cy = 0

    getTextSizeFunc(fontsInstancePtr, size, text, flags)
    return size
end


--ну эт короч костыль чтобы вертикальное выравнивание 3дтекстов при изменении их размера фиксить
function f(x)
    return 0.84 + 0.0216625 * (x - 10)
end


-- функция получающая координаты конечности(?), используется для получения координат головы
-- без каких-либо изменений скопирована отсюда -> https://www.blast.hk/threads/13892/post-1238507
local getBonePositionFunc = ffi.cast("int (__thiscall*)(void*, float*, int, bool)", 0x5E4280)

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


-- Hook pro upraveni chovani EndHealthBar
function EndHealthBarHook(playerTags)   
    if sampIs3dTextDefined(textId) then
        sampDestroy3dText(textId)
    end
	
    if sampIs3dTextDefined(textId + 1) then
        sampDestroy3dText(textId + 1)
    end
	
    local charX, charY, charZ = getCharCoordinates(playerPed)
    local limbX, limbY, limbZ = getBodyPartCoordinates(8, playerPed)
    local cameraX, cameraY, cameraZ = getActiveCameraCoordinates()
    local cameraDistance = getDistanceBetweenCoords3d(charX, charY, charZ, cameraX, cameraY, cameraZ)
    local text = "{ffffff}pururin (30)"
    local measuredSize = sampGetMeasuredTextSize(text)
    local offse = f(measuredSize.cy)
	
    position.x, position.y, position.z = limbX, limbY, limbZ

    drawHealthBarFunc(playerTags, position, 56.0, 0.0, cameraDistance)
    limbZ = limbZ + 0.21 + ((cameraDistance * 0.047499999) * offse)
    limbZ2 = limbZ + ((cameraDistance * 0.047499999) * offse) / 2
    sampCreate3dTextEx(textId, text, 0xFFFFFFFF, limbX, limbY, limbZ, 600, false, -1, -1)
    sampCreate3dTextEx(textId + 1, "{d0aeeb} * patrzcie, umiem grac roleplay", 0xFFFFFFFF, limbX, limbY, limbZ2, 600, false, -1, -1)
    return EndHealthBar(playerTags)
	
end

-- Main funkce pro spusteni hooku
function main()
	while not isPlayerPlaying(playerPed) do wait(100) end 

    EndHealthBarFuncAddress = SAMP_BASE + 0x68670
    EndHealthBar = hook.new(
        'void* (__thiscall *)(void *this)',
        EndHealthBarHook,
        EndHealthBarFuncAddress
    )
end

отрефактори код. НЕ ИЗМЕНЯЙ ЛОГИКУ