Отрисовка линии до игрока в 3D пространстве

A S K I T

Активный
Автор темы
201
69
Версия MoonLoader
.026-beta
Приветикс.
Вчера лазил по интернетам, так и не нашёл способа отрисовать трейсер до игрока в 3D пространстве.
То есть, чтобы он не "зеркалил" и не пропадал при отвороте камеры от нужного игрока.
Кто знает как такое реализовать?
 

qdIbp

Автор темы
Проверенный
1,386
1,141
Приветикс.
Вчера лазил по интернетам, так и не нашёл способа отрисовать трейсер до игрока в 3D пространстве.
То есть, чтобы он не "зеркалил" и не пропадал при отвороте камеры от нужного игрока.
Кто знает как такое реализовать?
Типа такого?
Lua:
require('moonloader')
local da = false
local aid = -1
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('sett', function(arg) da = true aid = arg print(da,aid) end)
    while true do wait(0)
        if da then         
            local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
            local res, h = sampGetCharHandleBySampPlayerId(aid)
            if res then
                local x2, y2, z2 = getCharCoordinates(h)
                local sx, sy = convert3DCoordsToScreen(x1, y1, z1)
                local fx, fy = convert3DCoordsToScreen(x2, y2, z2)
                renderDrawLine(sx, sy, fx, fy, 2, 0xFFFFFFFF)
            end
        end
    end
end
Снимок экрана (334).png
 

A S K I T

Активный
Автор темы
201
69
Типа такого?
Lua:
require('moonloader')
local da = false
local aid = -1
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
        sampRegisterChatCommand('sett', function(arg) da = true aid = arg print(da,aid) end)
    while true do wait(0)
        if da then        
            local x1, y1, z1 = getCharCoordinates(PLAYER_PED)
            local res, h = sampGetCharHandleBySampPlayerId(aid)
            if res then
                local x2, y2, z2 = getCharCoordinates(h)
                local sx, sy = convert3DCoordsToScreen(x1, y1, z1)
                local fx, fy = convert3DCoordsToScreen(x2, y2, z2)
                renderDrawLine(sx, sy, fx, fy, 2, 0xFFFFFFFF)
            end
        end
    end
end
Посмотреть вложение 126999
С этим кодом, как я понимаю, если отвернуться от игрока, трейсер отзеркалится.
 

Voldmare

Участник
19
11
Ну, можно вот так
Кот:
local X, Y, Z = getCharCoordinates(handle)
if isPointOnScreen(X, Y, Z) then
 --коде
 end
Понял... Никто не понял
isCharOnScreen(handle) - Проверяет виден ли персонаж
isPointOnScreen(x, y, z) - Проверяет находится ли точка на экране в заданном радиусе
Перед тем как расовать трейсер используешь 1 из этих функций


Ну или
Кот:
require "lib.moonloader"
local renderTab = {}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('addr', addRender)
    while true do wait(0)
       if next(renderTab) ~= nil then      -- если таблица с рендером не пуста
            for k, v in pairs(renderTab) do
                if renderTab[k] and not sampIsPlayerConnected(k) then renderTab[k] = nil; end -- если id из таблицы офнется уберет id из таблицы
                if renderTab[k] then
                    local result, handle = sampGetCharHandleBySampPlayerId(k)
                    if result then
                        local X, Y, Z = getCharCoordinates(handle)-- корды чела
                        if isPointOnScreen(X, Y, Z) then
                            local myX, myY, myZ = getCharCoordinates(playerPed) -- корды тебя
                            local FX, FY = convert3DCoordsToScreen(X, Y, Z) -- перевод кордов из 3D в 2D
                            local myFX, myFY = convert3DCoordsToScreen(myX, myY, myZ) -- перевод кордов из 3D в 2D
                            renderDrawLine(FX, FY, myFX, myFY, 2, 0xFFFFFFFF) -- непосредсвенно рендер линии
                        end
                    end
                end
            end
        end
    end
end


function addRender(arg)
    local id = tonumber(arg)
    if not id then return end
    if renderTab[id] then renderTab[id] = nil; return; end -- если в таблице уже есть этот id удаление этого id
    if sampGetCharHandleBySampPlayerId(id) then renderTab[id] = "" end -- добавление в таблицу нужного id
end
 
Последнее редактирование:
  • Нравится
Реакции: qwertyKEK

A S K I T

Активный
Автор темы
201
69
Понял... Никто не понял
isCharOnScreen(handle) - Проверяет виден ли персонаж
isPointOnScreen(x, y, z) - Проверяет находится ли точка на экране в заданном радиусе
Перед тем как расовать трейсер используешь 1 из этих функций


Ну или
Кот:
require "lib.moonloader"
local renderTab = {}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('addr', addRender)
    while true do wait(0)
       if next(renderTab) ~= nil then      -- если таблица с рендером не пуста
            for k, v in pairs(renderTab) do
                if renderTab[k] and not sampIsPlayerConnected(k) then renderTab[k] = nil; end -- если id из таблицы офнется уберет id из таблицы
                if renderTab[k] then
                    local result, handle = sampGetCharHandleBySampPlayerId(k)
                    if result then
                        local X, Y, Z = getCharCoordinates(handle)-- корды чела
                        if isPointOnScreen(X, Y, Z) then
                            local myX, myY, myZ = getCharCoordinates(playerPed) -- корды тебя
                            local FX, FY = convert3DCoordsToScreen(X, Y, Z) -- перевод кордов из 3D в 2D
                            local myFX, myFY = convert3DCoordsToScreen(myX, myY, myZ) -- перевод кордов из 3D в 2D
                            renderDrawLine(FX, FY, myFX, myFY, 2, 0xFFFFFFFF) -- непосредсвенно рендер линии
                        end
                    end
                end
            end
        end
    end
end


function addRender(arg)
    local id = tonumber(arg)
    if not id then return end
    if renderTab[id] then renderTab[id] = nil; return; end -- если в таблице уже есть этот id удаление этого id
    if sampGetCharHandleBySampPlayerId(id) then renderTab[id] = "" end -- добавление в таблицу нужного id
end
Я же написал. Нужно чтобы трейсер не зеркалил и не пропадал, когда игрока нет в поле видимости.
Если он зеркалит или пропадает - это рендер в 2D, а не в 3D.
 

qwertyKEK

Новичок
9
1
Понял... Никто не понял
isCharOnScreen(handle) - Проверяет виден ли персонаж
isPointOnScreen(x, y, z) - Проверяет находится ли точка на экране в заданном радиусе
Перед тем как расовать трейсер используешь 1 из этих функций


Ну или
Кот:
require "lib.moonloader"
local renderTab = {}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('addr', addRender)
    while true do wait(0)
       if next(renderTab) ~= nil then      -- если таблица с рендером не пуста
            for k, v in pairs(renderTab) do
                if renderTab[k] and not sampIsPlayerConnected(k) then renderTab[k] = nil; end -- если id из таблицы офнется уберет id из таблицы
                if renderTab[k] then
                    local result, handle = sampGetCharHandleBySampPlayerId(k)
                    if result then
                        local X, Y, Z = getCharCoordinates(handle)-- корды чела
                        if isPointOnScreen(X, Y, Z) then
                            local myX, myY, myZ = getCharCoordinates(playerPed) -- корды тебя
                            local FX, FY = convert3DCoordsToScreen(X, Y, Z) -- перевод кордов из 3D в 2D
                            local myFX, myFY = convert3DCoordsToScreen(myX, myY, myZ) -- перевод кордов из 3D в 2D
                            renderDrawLine(FX, FY, myFX, myFY, 2, 0xFFFFFFFF) -- непосредсвенно рендер линии
                        end
                    end
                end
            end
        end
    end
end


function addRender(arg)
    local id = tonumber(arg)
    if not id then return end
    if renderTab[id] then renderTab[id] = nil; return; end -- если в таблице уже есть этот id удаление этого id
    if sampGetCharHandleBySampPlayerId(id) then renderTab[id] = "" end -- добавление в таблицу нужного id
end
спасибо за этот скрипт бро, то что надо
 
  • Эм
Реакции: Tectrex