ВХ на 3d текст

sava208flek$er

Новичок
Автор темы
4
0
Крч, хочу сделать ВХ на 3D текст, чтоб от персонажа к нему шел трейсер и писал расстояние.
Как такое можно сделать, если вообще можно?
 

Andrinall

Известный
679
532
Ну, например так.

Lua:
-- Тут без дистанции, текстом выводится ID 3dTextLabel
local ffi = require 'ffi'

ffi.cdef[[
    struct stTextLabel
    {
        char            *pText;
        unsigned long   color;
        float           fPosition[3];
        float           fMaxViewDistance;
        unsigned char   byteShowBehindWalls;
        unsigned short  sAttachedToPlayerID;
        unsigned short  sAttachedToVehicleID;
    }__attribute__((packed));

    struct stTextLabelPool
    {
        struct stTextLabel    textLabel[2048];
        int                   iIsListed[2048];
    }__attribute__((packed));
]]

local font = renderCreateFont("Tahoma", 14, 5)
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(100) until isSampAvailable()

    while true do wait(0)
        local pool = sampGetAllTextLabels()
        for i = 1, #pool do
            if isPointOnScreen(pool[i].pos.x, pool[i].pos.y, pool[i].pos.z, 300) then
                local pposX, pposY = convert3DCoordsToScreen(getCharCoordinates(PLAYER_PED))
                local tposX, tposY = convert3DCoordsToScreen(pool[i].pos.x, pool[i].pos.y, pool[i].pos.z)
     
                renderDrawLine(pposX, pposY, tposX, tposY, 2.0, 0xFFFF2020)
                renderFontDrawText(font, tostring(pool[i].id), tposX, tposY, 0xFFFFFFFF)
            end
        end
    end
end

function sampGetAllTextLabels()
    local pool = ffi.cast("struct stTextLabelPool*", sampGetTextlabelPoolPtr())
    local labels_tbl = {}
    for i = 0, 2048 do
        if pool.iIsListed[i] ~= 0 and pool.textLabel[i] ~= nil then
            table.insert(
                labels_tbl,
                {
                    id = i,
                    text = pool.textLabel[i].pText,
                    color = pool.textLabel[i].color,
                    pos = { x = pool.textLabel[i].fPosition[0], y = pool.textLabel[i].fPosition[1], z = pool.textLabel[i].fPosition[2] },
                    maxViewDist = pool.textLabel[i].fMaxViewDistance,
                    showBehindWalls = pool.textLabel[i].byteShowBehindWalls,
                    attachedPlayerId = pool.textLabel[i].sAttachedToPlayerID,
                    attachedVehicleId = pool.textLabel[i].sAttachedToVehicleID
                }
            )
        end
    end
    return labels_tbl
end

Можно без отдельной функции сразу в беск.цикле перебирать пул и брать оттуда существующие 3Д тексты и редерить к ним линии.
Расстояние можно посчитать через:
Lua:
local pX, pY, pZ = getCharCoordinates(PLAYER_PED)
local distance = getDistanceBetweenCoords3d(pX, pY, pZ, pool[i].pos.x, pool[i].pos.y, pool[i].pos.z)


Кстати если кто из знающих будет эту тему смотреть.
Как char *pText перевести в адекватную строку, а не cdata<char*>: 0x.....
string.char() не очень помогло в этом деле.

UPD: Решил проблему перевода cdata<char*>: 0x.... в простую строку через ffi.string( )
 
Последнее редактирование:
  • Нравится
Реакции: Cosmo

sava208flek$er

Новичок
Автор темы
4
0
Ну, например так.

Lua:
-- Тут без дистанции, текстом выводится ID 3dTextLabel
local ffi = require 'ffi'

ffi.cdef[[
    struct stTextLabel
    {
        char            *pText;
        unsigned long   color;
        float           fPosition[3];
        float           fMaxViewDistance;
        unsigned char   byteShowBehindWalls;
        unsigned short  sAttachedToPlayerID;
        unsigned short  sAttachedToVehicleID;
    }__attribute__((packed));

    struct stTextLabelPool
    {
        struct stTextLabel    textLabel[2048];
        int                   iIsListed[2048];
    }__attribute__((packed));
]]

local font = renderCreateFont("Tahoma", 14, 5)
function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    repeat wait(100) until isSampAvailable()

    while true do wait(0)
        local pool = sampGetAllTextLabels()
        for i = 1, #pool do
            if isPointOnScreen(pool[i].pos.x, pool[i].pos.y, pool[i].pos.z, 300) then
                local pposX, pposY = convert3DCoordsToScreen(getCharCoordinates(PLAYER_PED))
                local tposX, tposY = convert3DCoordsToScreen(pool[i].pos.x, pool[i].pos.y, pool[i].pos.z)
      
                renderDrawLine(pposX, pposY, tposX, tposY, 2.0, 0xFFFF2020)
                renderFontDrawText(font, tostring(pool[i].id), tposX, tposY, 0xFFFFFFFF)
            end
        end
    end
end

function sampGetAllTextLabels()
    local pool = ffi.cast("struct stTextLabelPool*", sampGetTextlabelPoolPtr())
    local labels_tbl = {}
    for i = 0, 2048 do
        if pool.iIsListed[i] ~= 0 and pool.textLabel[i] ~= nil then
            table.insert(
                labels_tbl,
                {
                    id = i,
                    text = pool.textLabel[i].pText,
                    color = pool.textLabel[i].color,
                    pos = { x = pool.textLabel[i].fPosition[0], y = pool.textLabel[i].fPosition[1], z = pool.textLabel[i].fPosition[2] },
                    maxViewDist = pool.textLabel[i].fMaxViewDistance,
                    showBehindWalls = pool.textLabel[i].byteShowBehindWalls,
                    attachedPlayerId = pool.textLabel[i].sAttachedToPlayerID,
                    attachedVehicleId = pool.textLabel[i].sAttachedToVehicleID
                }
            )
        end
    end
    return labels_tbl
end

Можно без отдельной функции сразу в беск.цикле перебирать пул и брать оттуда существующие 3Д тексты и редерить к ним линии.
Расстояние можно посчитать через:
Lua:
local pX, pY, pZ = getCharCoordinates()
local distance = getDistanceBetweenCoords3d(pX, pY, pZ, pool[i].pos.x, pool[i].pos.y, pool[i].pos.z)


Кстати если кто из знающих будет эту тему смотреть.
Как char *pText перевести в адекватную строку, а не cdata<char*>: 0x.....
string.char() не очень помогло в этом деле.
сори, я не шарю.
как сделать, чтоб он реагировал на определенный текст?
типо в зоне стрима будет этот текст и сразу пойдет трейсер с расстоянием
 

Andrinall

Известный
679
532
сори, я не шарю.
как сделать, чтоб он реагировал на определенный текст?
типо в зоне стрима будет этот текст и сразу пойдет трейсер с расстоянием
Ну вот я не знаю как текст нормально перевести из cdata<char*>
в адекватную строку.

Ещё, как вариант можешь ловить рпц создания и удаления 3д текстов и вносить или удалять данные в локальной таблице.
После чего перебирать циклом и отображать линии.
Всё ограничивается только твоей фантазией.
 

copypaste_scripter

Известный
1,218
223
если хочешь переделаю выше предоставленный скрипт на нужный текст и спихну трейсер тоже с расстоянием, отпиши в дискорд CPS#3555
(конечно же бесплатно)
p.s. время изготовления неизвестно
 

sava208flek$er

Новичок
Автор темы
4
0
если хочешь переделаю выше предоставленный скрипт на нужный текст и спихну трейсер тоже с расстоянием, отпиши в дискорд CPS#3555
(конечно же бесплатно)
p.s. время изготовления неизвестно
кинул заявочку