Вопросы по Lua скриптингу

Общая тема для вопросов по разработке скриптов на языке программирования Lua, в частности под MoonLoader.
  • Задавая вопрос, убедитесь, что его нет в списке частых вопросов и что на него ещё не отвечали (воспользуйтесь поиском).
  • Поищите ответ в теме посвященной разработке Lua скриптов в MoonLoader
  • Отвечая, убедитесь, что ваш ответ корректен.
  • Старайтесь как можно точнее выразить мысль, а если проблема связана с кодом, то обязательно прикрепите его к сообщению, используя блок [code=lua]здесь мог бы быть ваш код[/code].
  • Если вопрос связан с MoonLoader-ом первым делом желательно поискать решение на wiki.

Частые вопросы

Как научиться писать скрипты? С чего начать?
Информация - Гайд - Всё о Lua скриптинге для MoonLoader(https://blast.hk/threads/22707/)
Как вывести текст на русском? Вместо русского текста у меня какие-то каракули.
Изменить кодировку файла скрипта на Windows-1251. В Atom: комбинация клавиш Ctrl+Shift+U, в Notepad++: меню Кодировки -> Кодировки -> Кириллица -> Windows-1251.
Как получить транспорт, в котором сидит игрок?
Lua:
local veh = storeCarCharIsInNoSave(PLAYER_PED)
Как получить свой id или id другого игрока?
Lua:
local _, id = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
local _, id = sampGetPlayerIdByCharHandle(ped) -- получить ид другого игрока. ped - это хендл персонажа
Как проверить, что строка содержит какой-то текст?
Lua:
if string.find(str, 'текст', 1, true) then
-- строка str содержит "текст"
end
Как эмулировать нажатие игровой клавиши?
Lua:
local game_keys = require 'game.keys' -- где-нибудь в начале скрипта вне функции main

setGameKeyState(game_keys.player.FIREWEAPON, -1) -- будет сэмулировано нажатие клавиши атаки
Все иды клавиш находятся в файле moonloader/lib/game/keys.lua.
Подробнее о функции setGameKeyState здесь: lua - setgamekeystate | BlastHack — DEV_WIKI(https://www.blast.hk/wiki/lua:setgamekeystate)
Как получить id другого игрока, в которого целюсь я?
Lua:
local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
  local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
  if result then -- проверить, прошло ли получение ида успешно
    -- здесь любые действия с полученным идом игрока
  end
end
Как зарегистрировать команду чата SAMP?
Lua:
-- До бесконечного цикла/задержки
sampRegisterChatCommand("mycommand", function (param)
     -- param будет содержать весь текст введенный после команды, чтобы разделить его на аргументы используйте string.match()
    sampAddChatMessage("MyCMD", -1)
end)
Крашит игру при вызове sampSendChat. Как это исправить?
Это происходит из-за бага в SAMPFUNCS, когда производится попытка отправки пакета определенными функциями изнутри события исходящих RPC и пакетов. Исправления для этого бага нет, но есть способ не провоцировать его. Вызов sampSendChat изнутри обработчика исходящих RPC/пакетов нужно обернуть в скриптовый поток с нулевой задержкой:
Lua:
function onSendRpc(id)
  -- крашит:
  -- sampSendChat('Send RPC: ' .. id)

  -- норм:
  lua_thread.create(function()
    wait(0)
    sampSendChat('Send RPC: ' .. id)
  end)
end
 
Последнее редактирование:

notactive.

Потрачен
67
14
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
у меня есть код, по идее, если не закончен рейс за указанное время - он должен реконнектится, почему этого не происходит?
1697645645760.png
 
Последнее редактирование:

kuboni

Участник
111
2
Не использовал этот инструмент, но как-то читал про него: https://github.com/LuaDist/srlua

upd: Для того, чтобы собрать екзешник зайди в папку bin и введи команду:
Код:
./glue.exe srlua.exe "путь до твоей луашки" "имя исходного файла"
Правда, как я понял, в любом случае юзеру придется качать доп. либы, а точнее liblua.dll
Is there any source how to use it? @@ it's too difficult to use, bro
 

danywa

Активный
358
49
Есть ли возможность создавать свои диалоги на раксампе если серверные есть?
 

ChromiusJ

спокойно, это всего лишь слива
Друг
4,924
3,204
как цвета из ColorEdit4 в mimgui перевести в hex?
вот тут пример как я спиздил такое
 
  • Нравится
Реакции: Willy4ka

tsunamiqq

Участник
429
16
Каким образом можно сделать свое уведомление? notf слишком херово выглядит, хотелось бы сделать свою систему push уведомлений, на подобии админ тулса космо
 

bulba$h

Активный
332
91
  • Нравится
Реакции: tsunamiqq

sosnov

Известный
331
115
есть регулярка %d+, и это какое то число, можно ли как то именно 6-ти значное число искать? к примеру:
Lua:
local number = text:match('%d+')
 

LuaMaster

Известный
146
17
функция бега:
function teleport(x,y,z)
    local koef1, koef2 = 1.05, 0.02
    local function getPov(ang)
        return (ang^koef1)*koef2*100/memory.getfloat(0xB7CB50, true)
    end
    while not locateCharAnyMeans2d(PLAYER_PED, x, y, 1, 1, true) and active.v do
        local POSX,POSY,POSZ = getCharCoordinates(PLAYER_PED)
        angle    = math.acos((x-POSX)/math.sqrt((x - POSX)*(x - POSX)+(y - POSY)*(y - POSY)))
        if POSY > y then angle = 2*math.pi - angle end --получение угла
        if angle < 0 then angle = angle + 2*math.pi end
        angle    = math.deg(angle)
        angX    = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(y-POSY)^2))
        local cpx,cpy,cpz     = getActiveCameraCoordinates()
        local cx,cy,cz     = getActiveCameraPointAt()
        local curangle     = math.acos((cx-cpx)/math.sqrt((cx-cpx)*(cx-cpx)+(cy-cpy)*(cy-cpy)))
        if cpy > cy then curangle = 2*math.pi - curangle end -- получение текущего угла камеры
        curangle = math.deg(curangle)
        local heading = getCharHeading(PLAYER_PED) + 90
        if heading > 360 then heading = heading - 360 end
        angsum = 360 - curangle + angle
        if angsum > 360 then angsum = angsum - 360 end
        if angsum < 180 then curangle = curangle + getPov(angsum)
        else curangle = curangle - getPov(360-angsum) end
        local xAngle    = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(math.sqrt((x-POSX)^2+(y-POSY)^2))^2))
        setCameraPositionUnfixed(xAngle,math.rad(curangle)+math.pi)
        setGameKeyState(1, -255)
        local posX, posY, posZ = GetCoordinates()
        local dist = math.sqrt( ((x-posX)^2) + ((y-posY)^2))
        --writeMemory(0xB73458 + 0x20, 1, 255, false)
        
        wait(0)
        
        local data = samp_create_sync_data('player')
        data.upDownKeys = 65408
        data.keysData = data.upDownKeys
        data.send()
    end
end
Хотел добавить возможность емуляции нажатия клавиши w, но посколько я понял оно так и не сработало в чём моя ошибка?
 

minxty

Известный
899
773
как сделать проверку на то, есть ли машина в зоне стрима по ее иду?
 

bulba$h

Активный
332
91

meowprd

Тот самый Котовский
Проверенный
1,280
712
функция бега:
function teleport(x,y,z)
    local koef1, koef2 = 1.05, 0.02
    local function getPov(ang)
        return (ang^koef1)*koef2*100/memory.getfloat(0xB7CB50, true)
    end
    while not locateCharAnyMeans2d(PLAYER_PED, x, y, 1, 1, true) and active.v do
        local POSX,POSY,POSZ = getCharCoordinates(PLAYER_PED)
        angle    = math.acos((x-POSX)/math.sqrt((x - POSX)*(x - POSX)+(y - POSY)*(y - POSY)))
        if POSY > y then angle = 2*math.pi - angle end --получение угла
        if angle < 0 then angle = angle + 2*math.pi end
        angle    = math.deg(angle)
        angX    = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(y-POSY)^2))
        local cpx,cpy,cpz     = getActiveCameraCoordinates()
        local cx,cy,cz     = getActiveCameraPointAt()
        local curangle     = math.acos((cx-cpx)/math.sqrt((cx-cpx)*(cx-cpx)+(cy-cpy)*(cy-cpy)))
        if cpy > cy then curangle = 2*math.pi - curangle end -- получение текущего угла камеры
        curangle = math.deg(curangle)
        local heading = getCharHeading(PLAYER_PED) + 90
        if heading > 360 then heading = heading - 360 end
        angsum = 360 - curangle + angle
        if angsum > 360 then angsum = angsum - 360 end
        if angsum < 180 then curangle = curangle + getPov(angsum)
        else curangle = curangle - getPov(360-angsum) end
        local xAngle    = math.asin((z-POSZ)/math.sqrt((z-POSZ)^2+(math.sqrt((x-POSX)^2+(y-POSY)^2))^2))
        setCameraPositionUnfixed(xAngle,math.rad(curangle)+math.pi)
        setGameKeyState(1, -255)
        local posX, posY, posZ = GetCoordinates()
        local dist = math.sqrt( ((x-posX)^2) + ((y-posY)^2))
        --writeMemory(0xB73458 + 0x20, 1, 255, false)
       
        wait(0)
       
        local data = samp_create_sync_data('player')
        data.upDownKeys = 65408
        data.keysData = data.upDownKeys
        data.send()
    end
end
Хотел добавить возможность емуляции нажатия клавиши w, но посколько я понял оно так и не сработало в чём моя ошибка?
лучше наверное не отправлять свою синхру, а модернизировать ту, что отправляется согласно серверным rate
попробуй через onSendPlayerSync изменять keysData с помощью библиотеки samp.events

есть регулярка %d+, и это какое то число, можно ли как то именно 6-ти значное число искать? к примеру:
Lua:
local number = text:match('%d+')

Lua:
print(("123451666"):match(("%d"):rep(6))) -- output: 123451
 
Последнее редактирование:
  • Нравится
Реакции: ChromiusJ и LuaMaster