Ближайшее т/с от чекпоинта

Карен

Участник
Автор темы
112
17
Версия MoonLoader
.026-beta
Здарова пацаны, в прошлой теме мне не помогли решил написать ещё одну, короче мне нужно найти хэндл автомобиля который самый ближайший к обыкновенному чекпоинту
1693508224534.png

Вот от такой метки нужно считать дистанцию и в данный момент самым близким транспортом является самолёт, нужно найти его handle и x, y, z координаты.
У меня заготовлен вот такой вот код:

Lua:
function SearchMarker(posX, posY, posZ, radius, isRace)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false

    for id = 0, 31 do
        local MarkerStruct = 0
        if isRace then MarkerStruct = 0xC7F168 + id * 56
        else MarkerStruct = 0xC7DD88 + id * 160 end
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
                radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            end
        end
    end

    return isFind, ret_posX, ret_posY, ret_posZ
end
Данный код ищет координаты маркера
А вот еще код который находит ближайший т/c

Lua:
function getClosestVehInCamera()
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local pX, pY, pZ = SearchMarker(x, y, z, 100.0, false)
    local minDist = 999
    local veh
    for k, v in ipairs(getAllVehicles()) do
        local cX, cY, cZ  = getCarCoordinates(v)
        if isPointOnScreen(cX, cY, cZ, minDist) then
            if minDist <= getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ) then
                minDist = getDistanceBetweenCoords3d(pX, pY, pZ, cX, cY, cZ)
                veh = v
            end
        end
    end
    return veh, minDist
end
Но код работает наоборот и находит самый дальний т/с от чекпоинта, я пробовал менять <= в 9 строке на > но ничего не помогало, скрипт сначала не показывал хендл машины а затем крашил, просьба помочь!

up

Мне нужен handle транспорта на который указывает чекпоинт
 
Последнее редактирование:
  • Эм
Реакции: qdIbp и YarikVL

z1qqurat

Участник
60
13
Зачем тебе isPointOnScreen? Оно проверяет находится ли точка у тебя на экране, а не в зоне стрима

Находишь координаты чекпоинта
Берешь хендлы всех т/с
Берешь из них координаты т/с
Считаешь расстояние между коордами чекпоинтами и каждого тс.
Где он меньше всего - тот и выбираешь

Вот к пример код который находит ближайшего водилу к игроку. Меняешь свои коорды на коорды чекпоинта и вперед
Lua:
function()
    local AllChars = getAllChars()
    local drivers = {}
    local result = nil
    local mx, my, mz = getCharCoordinates(PLAYER_PED)
    local dist = 10000

        for _, Ped in ipairs(AllChars) do
        
            if isCharInAnyCar(Ped) and getCarCharIsUsing(Ped) and Ped ~= PLAYER_PED then
                local res, id = sampGetPlayerIdByCharHandle(Ped)
                local vx, vy, vz = getCharCoordinates(Ped)
                local cDist = getDistanceBetweenCoords3d(mx, my, mz, vx, vy, vz)
                if cDist < dist then
                    dist = cDist
                    result = sampGetPlayerNickname(id).." ["..id.."]"
                end
            end
        end
    return result == nil and " " or result
end
 
  • Bug
Реакции: qdIbp

qdIbp

Автор темы
Проверенный
1,387
1,144
Lua:
function main()
    sampRegisterChatCommand('xz', function()
        sampAddChatMessage(nearestСp(),-1)
    end)
    sampRegisterChatCommand('cb',function()
        if _G['Cp'] then
            deleteCheckpoint( _G['Cp'] )
        end
        local posX, posY, posZ = getCharCoordinates(playerPed)
        _G['Cp'] = createCheckpoint(2, posX, posY, posZ, 0,0,0, 3)
    end)
    wait(-1)
end

function nearestСp()
    local dist, result = 1000, nil
    local posX, posY, posZ = getCharCoordinates(playerPed)
    for _, carHandle in ipairs(getAllVehicles()) do
        local modelId = getCarModel(carHandle)
        local cX, cY, cZ = getCarCoordinates(carHandle)
        local _, Cx,Cy,Cz = SearchMarker(posX, posY, posZ, 500, true)
        local cDist = getDistanceBetweenCoords3d(Cx,Cy,Cz, cX, cY, cZ)
            if cDist < dist then
                dist = cDist
                result = string.format('%s [%d]: %.2f %.2f %.2f', getNameOfVehicleModel(modelId), modelId, cX, cY, cZ)
            end
        end
    return result or 'Ты в полной ass'
end

function SearchMarker(posX, posY, posZ, radius, isRace)
    local ret_posX, ret_posY, ret_posZ = 0.0, 0.0, 0.0
    local isFind = false

    for id = 0, 31 do
        local MarkerStruct = isRace and 0xC7F168 + id * 56 or 0xC7DD88 + id * 160
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))

        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            if getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ) < radius then
                local ret_posX, ret_posY, ret_posZ = MarkerPosX, MarkerPosY, MarkerPosZ,
                local isFind = true
                radius = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            end
        end
    end
    return isFind, ret_posX, ret_posY, ret_posZ
end

function onScriptTerminate(script, quitGame) -- при отключении скрипта
    if script == thisScript() then
        deleteCheckpoint( _G['Cp'] )
    end
end
 
Последнее редактирование:
  • Нравится
Реакции: bulba$h