Daniel_Pon

Активный
Автор темы
338
67
Версия MoonLoader
Другое
Драсте, не могу понять почему над другими игроками не отображаются кружки. Если убираю проверку в зоне стрима то кружочки тупо по всей карте
Lua:
local imgui = require("mimgui")
local ev = require("samp.events")
local new = imgui.new

local renderWindow = new.bool(true)

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Main Window', renderWindow, imgui.WindowFlags.NoBackground + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration)
        local x,y,z = getCharCoordinates(PLAYER_PED)
        local wx,wy = convert3DCoordsToScreen(x,y,z)
        local dl = imgui.GetBackgroundDrawList();
        imgui.CircleProcessBar(dl, getCharHealth(PLAYER_PED), 0xFFF0000, imgui.ImVec2(wx, wy - 350), 40, 100);  
       
        for k, v in pairs(getAllChars()) do
    local dl = imgui.GetBackgroundDrawList();
    local px, py, pz = getCharCoordinates(v)
   
    -- Проверяем, находится ли персонаж в зоне стрима
    if isInStreamingZone(px, py, pz) then
        local ex, ey = convert3DCoordsToScreen(px, py, pz)
        imgui.CircleProcessBar(dl, getCharHealth(v), 0xFFFF0000, imgui.ImVec2(ex, ey - 350), 40, 100);  
    end
end
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('mimgui', function()
        renderWindow[0] = not renderWindow[0]
    end)
end

function imgui.CircleProcessBar(dl, value, color, center, radius, num_segments)
    if value > 100.0 then
        value = 100.0;
    elseif value < 0.0 then
        value = 0.0;
    end
    local segment_rad = 2 * (value / 31.4) / num_segments;
    dl:AddCircleFilled(center, radius, 0xCC101010, num_segments);
    dl:AddCircle(center, radius, 0xFF757371, num_segments, 4);
    for i = 0, num_segments do
        local a = imgui.ImVec2(center.x - radius * math.sin(segment_rad * i),
        center.y - radius * math.cos(segment_rad * i));
        local b = imgui.ImVec2(center.x - radius * math.sin(segment_rad * (i + 1)),
        center.y - radius * math.cos(segment_rad * (i + 1)));
        dl:AddLine(a, b, color, 4);
    end
end

 function isInStreamingZone(px, py, pz)
    -- Задайте границы зоны стрима
    local zoneMinX, zoneMaxX = -500, 500
    local zoneMinY, zoneMaxY = -500, 500
    local zoneMinZ, zoneMaxZ = 0, 100

    return px >= zoneMinX and px <= zoneMaxX and
           py >= zoneMinY and py <= zoneMaxY and
           pz >= zoneMinZ and pz <= zoneMaxZ
end
 
Последнее редактирование:

wojciech?

Известный
Проверенный
395
291
если персонаж есть в getAllChars, значит он в зоне стрима и проверка не имеет смысла (к тому же она кривая)

Если убираю проверку в зоне стрима то кружочки тупо по всей карте
нужно проверять находится ли персонаж на экране (на выбор):
bool result = isCharOnScreen(Ped ped)
bool result = isPointOnScreen(float sphereX, float sphereY, float sphereZ, float radius)

и получать дравлист каждую итерацию не нужно, ты его уже получил выше
Lua:
for k, v in pairs(getAllChars()) do
    local dl = imgui.GetBackgroundDrawList(); -- del
 
  • Нравится
Реакции: MLycoris

Daniel_Pon

Активный
Автор темы
338
67
если персонаж есть в getAllChars, значит он в зоне стрима и проверка не имеет смысла (к тому же она кривая)


нужно проверять находится ли персонаж на экране (на выбор):
bool result = isCharOnScreen(Ped ped)
bool result = isPointOnScreen(float sphereX, float sphereY, float sphereZ, float radius)

и получать дравлист каждую итерацию не нужно, ты его уже получил выше
Lua:
for k, v in pairs(getAllChars()) do
    local dl = imgui.GetBackgroundDrawList(); -- del
Кривовато работает, метки остаются а еще они становятся если игрока даже иногда не видно.
Вот код:
Lua:
local imgui = require("mimgui")
local ev = require("samp.events")
local new = imgui.new

local renderWindow = new.bool(true)

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 300, 300
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Main Window', renderWindow, imgui.WindowFlags.NoBackground + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration)
        local x,y,z = getCharCoordinates(PLAYER_PED)
        local wx,wy = convert3DCoordsToScreen(x,y,z)
        local dl = imgui.GetBackgroundDrawList();
        imgui.CircleProcessBar(dl, getCharHealth(PLAYER_PED), 0xFFF0000, imgui.ImVec2(wx, wy - 350), 40, 100);   
        
        for k, v in pairs(getAllChars()) do
    
    local px, py, pz = getCharCoordinates(v)
    local inStream = isCharOnScreen(v)
    -- Проверяем, находится ли персонаж в зоне стрима
    if inStream then
        local ex, ey = convert3DCoordsToScreen(px, py, pz)
        imgui.CircleProcessBar(dl, getCharHealth(v), 0xFFFF0000, imgui.ImVec2(ex, ey - 350), 40, 100);   
    end
end
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('mimgui', function()
        renderWindow[0] = not renderWindow[0]
    end)
end

function imgui.CircleProcessBar(dl, value, color, center, radius, num_segments)
    if value > 100.0 then
        value = 100.0;
    elseif value < 0.0 then
        value = 0.0;
    end
    local segment_rad = 2 * (value / 31.4) / num_segments;
    dl:AddCircleFilled(center, radius, 0xCC101010, num_segments);
    dl:AddCircle(center, radius, 0xFF757371, num_segments, 4);
    for i = 0, num_segments do
        local a = imgui.ImVec2(center.x - radius * math.sin(segment_rad * i),
        center.y - radius * math.cos(segment_rad * i));
        local b = imgui.ImVec2(center.x - radius * math.sin(segment_rad * (i + 1)),
        center.y - radius * math.cos(segment_rad * (i + 1)));
        dl:AddLine(a, b, color, 4);
    end
end
 

wojciech?

Известный
Проверенный
395
291
Кривовато работает, метки остаются
не понял это

а еще они становятся если игрока даже иногда не видно
ты не проверяешь виден ли игрок фактически (не стоит ли он за стеной или как далеко находится) и оно по сути работает как вх, поправить это можно:
проверкой на объекты между тобой и игроком: isLineOfSightClear
проверкой на дистанцию: getDistanceBetweenCoords3d
 

Daniel_Pon

Активный
Автор темы
338
67
не понял это


ты не проверяешь виден ли игрок фактически (не стоит ли он за стеной или как далеко находится) и оно по сути работает как вх, поправить это можно:
проверкой на объекты между тобой и игроком: isLineOfSightClear
проверкой на дистанцию: getDistanceBetweenCoords3d
Мгм, а еще, можно ли сделать так что бы кружок был именно над головой, а не вычитая координаты как у меня, иначе если камера ближе чем надо то кружок отображается ниже
 

Daniel_Pon

Активный
Автор темы
338
67
можешь посмотреть как тут реализовано: https://www.blast.hk/threads/13380/post-1426042
Вырвал оттуда функцию, но игра тупо зависает.
Lua:
local imgui = require("mimgui")
local ev = require("samp.events")
local ffi = require ("ffi")
local new = imgui.new

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

function getBodyPartCoordinates(id, handle)
    local pedptr = getCharPointer(handle)
    local vec = ffi.new("float[3]")
    getBonePosition(ffi.cast("void*", pedptr), vec, id, true)
    return vec[0], vec[1], vec[2]
end
local renderWindow = new.bool(true)

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        local resX, resY = getScreenResolution()
        local sizeX, sizeY = 1, 1
        imgui.SetNextWindowPos(imgui.ImVec2(resX / 2, resY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(sizeX, sizeY), imgui.Cond.FirstUseEver)
        imgui.Begin('Main Window', renderWindow, imgui.WindowFlags.NoBackground + imgui.WindowFlags.NoMove + imgui.WindowFlags.NoDecoration)
        
        local dl = imgui.GetBackgroundDrawList();
        
        local player_pos = {getBodyPartCoordinates(5, PLAYER_PED)}
        player_pos[3] = player_pos[3] - 0.030
        local startX, startY = convert3DCoordsToScreen(player_pos[1], player_pos[2] , player_pos[3] + 0.375)
        imgui.CircleProcessBar(dl, getCharHealth(PLAYER_PED), 0xFFF0000, imgui.ImVec2(startX, startY - 350), 40, 100);   
        for k, v in pairs(getAllChars()) do
        
    local px, py, pz = getBodyPartCoordinates(5, v)
    local inStream = isCharOnScreen(v)
    local xzcho = isLineOfSightClear(player_pos[1], player_pos[2] , player_pos[3], px, py, pz, true, false, false, true, false)
    -- Проверяем, находится ли персонаж в зоне стрима
    if inStream and xzcho then
        local ex, ey = convert3DCoordsToScreen(px, py, pz)
        imgui.CircleProcessBar(dl, getCharHealth(v), 0xFFFF0000, imgui.ImVec2(ex, ey - 350), 40, 100);   
    end
end
        imgui.End()
    end
)

function main()
    sampRegisterChatCommand('mimgui', function()
        renderWindow[0] = not renderWindow[0]
    end)
end

function imgui.CircleProcessBar(dl, value, color, center, radius, num_segments)
    if value > 100.0 then
        value = 100.0;
    elseif value < 0.0 then
        value = 0.0;
    end
    local segment_rad = 2 * (value / 31.4) / num_segments;
    dl:AddCircleFilled(center, radius, 0xCC101010, num_segments);
    dl:AddCircle(center, radius, 0xFF757371, num_segments, 4);
    for i = 0, num_segments do
        local a = imgui.ImVec2(center.x - radius * math.sin(segment_rad * i),
        center.y - radius * math.cos(segment_rad * i));
        local b = imgui.ImVec2(center.x - radius * math.sin(segment_rad * (i + 1)),
        center.y - radius * math.cos(segment_rad * (i + 1)));
        dl:AddLine(a, b, color, 4);
    end
end

У монетки другие адреса короче, можно как-то по-другому?

Неактуально
 
Последнее редактирование: