Вопросы по 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
 
Последнее редактирование:

Kaktyc007

Известный
166
11
Как из данного диалога получить Id у которых есть "проверил"?
1665223351912.png
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,206
12,543

Sadow

Известный
1,420
587
Как можно сделать проверку на серверный диалог? На заголовок, текст, стиль и если это 3 стиль то на то что ввёл игрок в поле ввода
 

XRLM

Против ветра рождённый
Модератор
1,636
1,296
Как можно сделать проверку на серверный диалог? На заголовок, текст, стиль и если это 3 стиль то на то что ввёл игрок в поле ввода
Lua:
function ev.onShowDialog(id, style, title, button1, button2, text)
    if style == 3 then
        --code
    end
end
 
  • Нравится
Реакции: Sadow

вайега52

Налуашил состояние
Модератор
2,989
3,110
Lua:
function ev.onShowDialog(id, style, title, button1, button2, text)
    if style == 3 then
        --code
    end
end
еще это добавь
Lua:
if title:find("Авторизация") and style == 3 and text:find("text") then
    -- chto-to
end

Как отправлять то что человек ввёл в диалоговое поле?
Lua:
sampSendDialogResponse()
 

Sadow

Известный
1,420
587
хз, попробуй в аргумент кнопки ввести nil
Я уже нашёл. -1 писать. Но как можно видеть то что ввёл человек в диалог? А то не работает.
Код:
[ML] (error) test.lua: D:\Games\morty summer low\moonloader\test.lua:305: attempt to concatenate global 'input' (a nil value)
stack traceback:
    D:\Games\morty summer low\moonloader\test.lua:305: in function 'callback'
    ...mes\morty summer low\moonloader\lib\samp\events\core.lua:80: in function <...mes\morty summer low\moonloader\lib\samp\events\core.lua:54>
[ML] (error) test.lua: Script died due to an error. (23FED4D4)
 

вайега52

Налуашил состояние
Модератор
2,989
3,110
ок

объясните пж как сделать курд, открывал скрипты, нихуя не понял
курдмастер?
нашел на компе вот такой
Lua:
function CoordMaster(px, py, pz, step, time)
    local x, y, z = getCharCoordinates(PLAYER_PED) -- твои коорды
    local d = getDistanceBetweenCoords3d(px, py, pz, x, y, z) -- дистанция до метки
    if d <= step then -- если дистанция меньше длины шага
        setCharCoordinates(PLAYER_PED, px, py, pz) -- тп тебя на метку
    else -- если дистанция больше длины шага

        local dx, dy, dz = px - x, py - y, pz - z
        x = x + step / d * dx
        y = y + step / d * dy
        z = z + step / d * dz
        setCharCoordinates(PLAYER_PED, x, y, z) -- телепортируешь себя
        wait(time) -- задержка в тп
        CoordMaster(px, py, pz, step, time)
    end
end
 
  • Нравится
Реакции: XRLM

вайега52

Налуашил состояние
Модератор
2,989
3,110
Почему начали крашить скрипты, где есть проверка на афк?
Код:
[19:48:18.455478] (error)    UncRvnaka: opcode '0B5C' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampIsPlayerPaused'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:51: in function <C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36>
stack traceback:
    [C]: in function 'create'
    C:\ВАЖНОЕ!!!\сборка софт\moonloader\unc.lua:36: in function 'callback'
    ...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:79: in function <...АЖНОЕ!!!\сборка софт\moonloader\lib\samp\events\core.lua:53>
[19:48:18.461473] (error)    UncRvnaka: Script died due to an error. (0B0FDEB4)