Помогите с скриптом

Abibus

Новичок
Автор темы
19
3
Кароче, хотел сделать скрипт для метало искателя, взял я под основу https://www.blast.hk/threads/171089/ , так вот, я со своими знаниями об луа и с помощью chat gpt сделали какуюто хуйню какая не работает на пляже санта мария, только работает на ровной местности, а на санта мария не ворк. Также у скрипта есть одна проблема, его начинает крутить на месте если нету меток. Помогите пожалусто с скриптом, буду очень благодарен вам.


Lua:
script_name("metal by opezdalo")
script_authors("Oksana_Garah")
script_description("Персонаж хаотично перемещается в радиусе 5 метров и реагирует на красную метку")
script_version("0.1")
script_dependencies("CLEO")

---------------------------------------------------------------------------

require "lib.moonloader"
math.randomseed(os.time())

---------------------------------------------------------------------------

-- Глобальная переменная для активации скрипта
enabled = false

function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    sampRegisterChatCommand("metalurg", cmd_bot)

    local state = "wander"      -- два состояния: "wander" (хаотичное движение) и "marker" (движение к метке)
    local wanderTarget = nil    -- цель для хаотичного движения

    while true do
        wait(0)
        if isPlayerPlaying(playerHandle) and enabled then
            local posX, posY, posZ = GetCoordinates()
            local markerFound, markerX, markerY, markerZ = SearchMarker(posX, posY, posZ, 50.0, false)
            if markerFound then
                state = "marker"
            else
                state = "wander"
            end

            if state == "marker" then
                -- При обнаружении метки сразу движемся к ней
                BeginToPoint(markerX, markerY, markerZ, 1.0, -255, false)
                -- После достижения метки (или при прерывании) продолжаем хаотичное движение
                wanderTarget = nil
            elseif state == "wander" then
                -- Если цель для хаотичного движения не задана – выбираем случайную точку в радиусе ±5 метров
                if wanderTarget == nil then
                    wanderTarget = { posX + (math.random() * 10 - 5), posY + (math.random() * 10 - 5), posZ }
                end
                local result = BeginToPoint(wanderTarget[1], wanderTarget[2], wanderTarget[3], 1.0, -255, false)
                if result == "marker_interrupt" then
                    -- Если во время движения появилась метка – переходим в режим движения к метке
                    state = "marker"
                    wanderTarget = nil
                else
                    -- Достигнув точки – обнуляем цель для следующего хаотичного перемещения
                    wanderTarget = nil
                end
            end
        end
    end
end

--------------------------- СТАНДАРТНЫЕ ФУНКЦИИ ---------------------------

-- Функция движения к заданной точке; проверяет появление метки для прерывания
function BeginToPoint(x, y, z, radius, move_code, isSprint)
    repeat
        local posX, posY, posZ = GetCoordinates()
        -- Если во время движения появилась метка – возвращаем сигнал прерывания
        local markerFound, mX, mY, mZ = SearchMarker(posX, posY, posZ, 50.0, false)
        if markerFound then
            return "marker_interrupt"
        end
        SetAngle(x, y, z)
        MovePlayer(move_code, isSprint)
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, posZ)
        wait(0)
    until not enabled or dist < radius
    return "done"
end

function MovePlayer(move_code, isSprint)
    setGameKeyState(1, move_code)
    -- Код движения: -255 — движение вперед; 255 — назад; 65535/ -65535 — ходьба
    if isSprint then setGameKeyState(16, 255) end
end

function SetAngle(x, y, z)
    local posX, posY, posZ = GetCoordinates()
    local pX = x - posX
    local pY = y - posY
    local zAngle = getHeadingFromVector2d(pX, pY)

    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        setCarHeading(car, zAngle)
    else
        setCharHeading(playerPed, zAngle)
    end

    restoreCameraJumpcut()
end

function GetCoordinates()
    if isCharInAnyCar(playerPed) then
        local car = storeCarCharIsInNoSave(playerPed)
        return getCarCoordinates(car)
    else
        return getCharCoordinates(playerPed)
    end
end

function cmd_bot(param)
    enabled = not enabled
    if enabled then
        sampAddChatMessage(string.format("[%s]: Активирован", thisScript().name), 0x40FF40)
    else
        sampAddChatMessage(string.format("[%s]: Деактивирован", thisScript().name), 0xFF4040)
    end
end

-- Телепорт из ClickWarp (by FYP)
function teleportPlayer(x, y, z)
    if isCharInAnyCar(playerPed) then
        setCharCoordinates(playerPed, x, y, z)
    end
    setCharCoordinatesDontResetAnim(playerPed, x, y, z)
end

function setCharCoordinatesDontResetAnim(char, x, y, z)
    if doesCharExist(char) then
        local ptr = getCharPointer(char)
        setEntityCoordinates(ptr, x, y, z)
    end
end

function setEntityCoordinates(entityPtr, x, y, z)
    if entityPtr ~= 0 then
        local matrixPtr = readMemory(entityPtr + 0x14, 4, false)
        if matrixPtr ~= 0 then
            local posPtr = matrixPtr + 0x30
            writeMemory(posPtr + 0, 4, representFloatAsInt(x), false) -- X
            writeMemory(posPtr + 4, 4, representFloatAsInt(y), false) -- Y
            writeMemory(posPtr + 8, 4, representFloatAsInt(z), false) -- Z
        end
    end
end
-- Конец кода телепорта

--------------------------- ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ ---------------------------

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
            local dist = getDistanceBetweenCoords3d(MarkerPosX, MarkerPosY, MarkerPosZ, posX, posY, posZ)
            if dist < radius then
                ret_posX = MarkerPosX
                ret_posY = MarkerPosY
                ret_posZ = MarkerPosZ
                isFind = true
                radius = dist
            end
        end
    end

    return isFind, ret_posX, ret_posY, ret_posZ
end
 

cherepash

Участник
37
32
Также у скрипта есть одна проблема, его начинает крутить на месте если нету меток. Помогите пожалусто с скриптом, буду очень благодарен вам.
Так сделай проверку на метку, если её нет то фризишь персонажа и всё, если есть - то анфриз...
 
  • Клоун
Реакции: XRLM