Помогите не понимаю как работает функции

Feykomet

Участник
Автор темы
192
15
Версия SA-MP
  1. Любая
помогите не понимаю как работают эти функции(если можно приведите пример простого скрипта с этими функциями Ps желательно еще и объяснить как это работает а то я совсем чайник и 2 день могу понять как они работают)
lua:
function BeginToPoint(x, y, z, radius, move_code, isSprint)
    repeat
        local posX, posY, posZ = GetCoordinates()
        SetAngle(x, y, z)
        MovePlayer(move_code, isSprint)
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z)
        wait(0)
    until not enabled or dist < radius
end

lua:
function MovePlayer(move_code, isSprint)
    setGameKeyState(1, move_code)
    --[[255 - обычный бег назад
       -255 - обычный бег вперед
      65535 - идти шагом вперед
    -65535 - идти шагом назад]]
    if isSprint then setGameKeyState(16, 255) end
end
 

MrDorlik

Известный
946
378
помогите не понимаю как работают эти функции(если можно приведите пример простого скрипта с этими функциями Ps желательно еще и объяснить как это работает а то я совсем чайник и 2 день могу понять как они работают)
lua:
function BeginToPoint(x, y, z, radius, move_code, isSprint)
    repeat
        local posX, posY, posZ = GetCoordinates()
        SetAngle(x, y, z)
        MovePlayer(move_code, isSprint)
        local dist = getDistanceBetweenCoords3d(x, y, z, posX, posY, z)
        wait(0)
    until not enabled or dist < radius
end

lua:
function MovePlayer(move_code, isSprint)
    setGameKeyState(1, move_code)
    --[[255 - обычный бег назад
       -255 - обычный бег вперед
      65535 - идти шагом вперед
    -65535 - идти шагом назад]]
    if isSprint then setGameKeyState(16, 255) end
end
не работает потому что таких функций не существует, и зачем делать отдельную функцию в 2 строки? нормальный вариант взял отсюда и убрал говнокод
Lua:
function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end
getCharCoordinates - получает координаты игрока по хендлу, PLAYER_PED - константа, равная хендлу твоего игрока
getHeadingFromVector2d - функция возвращает угол в градусах между вектором, заданном в аргументе и положительным направлением оси абсцисс против часовой стрелки. кто не понял тот идет в школу.
math.rad - преобразовывает градусы в радианы, не суть важно, нужно только для след. функции
setCameraPositionUnfixed - устанавливает камеру в направление вектора относительно отрицательного направления оси ординат, именно поэтому мы отнимаем 90 градусов от полученного угла, из-за разниц начальной точки в функциях. первый аргумент влияет на движение камеры вверх-вниз, второй на влево-вправо, что нам и нужно.
setGameKeyState - нажимает игровую клавишу, коды в библиотеке game/keys.lua
 

Feykomet

Участник
Автор темы
192
15
не работает потому что таких функций не существует, и зачем делать отдельную функцию в 2 строки? нормальный вариант взял отсюда и убрал говнокод
Lua:
function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end
getCharCoordinates - получает координаты игрока по хендлу, PLAYER_PED - константа, равная хендлу твоего игрока
getHeadingFromVector2d - функция возвращает угол в градусах между вектором, заданном в аргументе и положительным направлением оси абсцисс против часовой стрелки. кто не понял тот идет в школу.
math.rad - преобразовывает градусы в радианы, не суть важно, нужно только для след. функции
setCameraPositionUnfixed - устанавливает камеру в направление вектора относительно отрицательного направления оси ординат, именно поэтому мы отнимаем 90 градусов от полученного угла, из-за разниц начальной точки в функциях. первый аргумент влияет на движение камеры вверх-вниз, второй на влево-вправо, что нам и нужно.
setGameKeyState - нажимает игровую клавишу, коды в библиотеке game/keys.lua
хорошо если в tox и toy вести в координаты как ее запустить что бы персонаж пошел?
 

MrDorlik

Известный
946
378
хорошо если в tox и toy вести в координаты как ее запустить что бы персонаж пошел?
что запустить? это функция, вызываешь ее с аргументами координат где надо и все
 
  • Нравится
Реакции: YarikVL

Feykomet

Участник
Автор темы
192
15
что запустить? это функция, вызываешь ее с аргументами координат где надо и все
похоже я реально чайник я хз как с аргументами вызывать. Если не сложно сделай простенький скрипт с этой функцией не застваляю. просто так мне будет понятней на примере
 

Hinаta

Известный
749
361
похоже я реально чайник я хз как с аргументами вызывать. Если не сложно сделай простенький скрипт с этой функцией не застваляю. просто так мне будет понятней на примере
Там, где тебе нужно вызвать эту функцию, пишешь runToPoint(tox, toy), заменив tox и toy на свои координаты
 

Fasz fiatal

Известный
332
67
похоже я реально чайник я хз как с аргументами вызывать. Если не сложно сделай простенький скрипт с этой функцией не застваляю. просто так мне будет понятней на примере
Lua:
sampRegisterChatCommand('беги', function() -- назначаешь команду и открываешь функцию
    runToPoint(-846.95587158203, 1213.2403564453) -- отправляешь персонажа бежать в эту точку
end) -- закрываешь функцию

-- вставляешь функцию runToPoint
ну это самый простой пример. В данном случае "runToPoint(tox, toy)" "tox" - точка на карте по оси х, а "toy" - точка по оси у. Эти точки обозначаются в скобках через запятую, но главное не перепутай ведь он будет бежать в ту точку, которую ты указал.
На всякий случай вот как вытянуть координаты точки:
Lua:
local positionX, positionY, positionZ = getCharCoordinates(PLAYER_PED) -- выводит текущие координаты персонажа в переменные
local str = "x = " .. positionX .. ", y = " .. positionY .. ", z = " .. positionZ -- переносит в более удобный формат
setClipboardText(str) -- копирует в буфер обмена результат предыдущей строки (буквы можешь убрать, а координаты оси z сюда не надо, но мне лень вырезать)
При вставке координат с этой функции убери все кроме цифр и "." в них (пример в первом коде)
 
  • Нравится
Реакции: Hinаta

MrDorlik

Известный
946
378
похоже я реально чайник я хз как с аргументами вызывать. Если не сложно сделай простенький скрипт с этой функцией не застваляю. просто так мне будет понятней на примере
команды /go, /stop
Lua:
local stopRun = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('go', function (arg)
        if arg:find('[-0-9]+ [-0-9]+') then
            x, y = arg:match('([-0-9]+) ([-0-9]+)')
            lua_thread.create(runToPoint, x, y)
        else
            sampAddChatMessage('неправильные корды', -1)
        end
    end)
    sampRegisterChatCommand('stop', function ()
        stopRun = true
    end)
    wait(-1)
end

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end
 
  • Нравится
Реакции: Hinаta

Feykomet

Участник
Автор темы
192
15
Код:
local stopRun = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('go', function (arg)
        if arg:find('[-0-9]+ [-0-9]+') then
            x, y = arg:match('([-0-9]+) ([-0-9]+)')
            lua_thread.create(runToPoint, x, y)
        else
            sampAddChatMessage('неправильные корды', -1)
        end
    end)
    sampRegisterChatCommand('stop', function ()
        stopRun = true
    end)
    wait(-1)
end

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end
спасибо теперь понял, вы остановили по крайней мере сократили в разы мои мучения но вопрос где тут координаты
AddPlayerClass(18,1156.8453,-1308.7727,1019.4139,359.5679,0,0,0,0,0,0); //
что из них x и y играю с лаунчера аризоны
lua:
local stopRun = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('go', function (arg)
        if arg:find('[-0-9]+ [-0-9]+') then
            x, y = arg:match('([-0-9]+) ([-0-9]+)')
            lua_thread.create(runToPoint, x,y)
        else
            sampAddChatMessage('неправильные корды', -1)
        end
    end)
    sampRegisterChatCommand('stop', function ()
        stopRun = true
    end)
    wait(-1)
end

function runToPoint(1157.47,-1308.78)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end

помоги пихнул координаты и не робит ошибки не выдает
 
Последнее редактирование:

MrDorlik

Известный
946
378
спасибо теперь понял, вы остановили по крайней мере сократили в разы мои мучения но вопрос где тут координаты
AddPlayerClass(18,1156.8453,-1308.7727,1019.4139,359.5679,0,0,0,0,0,0); //
что из них x и y играю с лаунчера аризоны
lua:
local stopRun = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('go', function (arg)
        if arg:find('[-0-9]+ [-0-9]+') then
            x, y = arg:match('([-0-9]+) ([-0-9]+)')
            lua_thread.create(runToPoint, x,y)
        else
            sampAddChatMessage('неправильные корды', -1)
        end
    end)
    sampRegisterChatCommand('stop', function ()
        stopRun = true
    end)
    wait(-1)
end

function runToPoint(1157.47,-1308.78)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end

помоги пихнул координаты и не робит ошибки не выдает
Нахуя ты трогаешь мой код блять, зайди в игру напиши /go 1000 1000 и все
обновил код, теперь поддерживает дробные значения
Lua:
local stopRun = false

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('go', function (arg)
        if arg:find('[%.-0-9]+ [%.-0-9]+') then
            x, y = arg:match('([%.-0-9]+) ([%.-0-9]+)')
            lua_thread.create(runToPoint, x, y)
        else
            sampAddChatMessage('неправильные корды', -1)
        end
    end)
    sampRegisterChatCommand('stop', function ()
        stopRun = true
    end)
    wait(-1)
end

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end
 
Последнее редактирование:

Fasz fiatal

Известный
332
67
помоги пихнул координаты и не робит ошибки не выдает
потому что ты их пихнул не туда
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
 
    sampRegisterChatCommand('runtopoint', function()
          runToPoint(-846.95587158203, 1213.2403564453) -- координаты вставляй сюда вместо этих (это чтобы тебе не парится с вводом их в чат)
    end)
 
    while true do
       wait(0)
    end
end

-- про редакцию всего, что ниже этого - забудь --

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end

если хочешь чтобы бот при активации бегал по нескольким координатам в виде маршрута, то вставляешь в активацию несколько раз "runToPoint(координата х, координата у)" (так же можешь использовать задержку если надо), а дальше чисто под себя настраивай как тебе нужно
 
Последнее редактирование:

Feykomet

Участник
Автор темы
192
15
потому что ты их пихнул не туда
Lua:
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
 
    sampRegisterChatCommand('runtopoint', function()
          runToPoint(-846.95587158203, 1213.2403564453) -- координаты вставляй сюда вместо этих (это чтобы тебе не парится с вводом их в чат)
    end)
 
    while true do
       wait(0)
    end
end

-- про редакцию всего, что ниже этого - забудь --

function runToPoint(tox, toy)
    local x, y, z = getCharCoordinates(PLAYER_PED)
    local angle = getHeadingFromVector2d(tox - x, toy - y)
    setCameraPositionUnfixed(0, math.rad(angle - 90))
    stopRun = false
    while not stopRun and getDistanceBetweenCoords2d(x, y, tox, toy) > 0.8 do
        setGameKeyState(1, -255)
        setGameKeyState(16, 1)
        wait(0)
        x, y, z = getCharCoordinates(PLAYER_PED)
        angle = getHeadingFromVector2d(tox - x, toy - y)
        setCameraPositionUnfixed(0, math.rad(angle - 90))
    end
end

если хочешь чтобы бот при активации бегал по нескольким координатам в виде маршрута, то вставляешь в активацию несколько раз "runToPoint(координата х, координата у)" (так же можешь использовать задержку если надо), а дальше чисто под себя настраивай как тебе нужно
попробовал ничего не меняв не робит поворачивается камера и стоит поменял корды и просто поворот камеры в сторону точки
 

Fasz fiatal

Известный
332
67
попробовал ничего не меняв не робит поворачивается камера и стоит поменял корды и просто поворот камеры в сторону точки
тебе надо объяснение работы или просто написать код?
 

Feykomet

Участник
Автор темы
192
15
тебе надо объяснение работы или просто написать код?
код а дальше я сам я буду коверкать его для себя

я уже +- понял как все работает а если что методом проб и ошибок