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

Kolbasa241

Известный
213
57
Lua:
function cmd_test(arg)
    local word = {"lol","123","test"}
    if string.find(unpack(word), arg) then
        sampAddChatMessage("Совпадает", -1)
    else
        sampAddChatMessage("Не совпадает", -1)
    end
end
Работает только на 1 аргумент (на lol), на остальные не реагирует..
Ребят, помогите, как сделать в одной переменной несколько аргументов.

Типо если я прописываю в чат - /test test, то мне выдавало Совпадало, или /test 123, то писало Совпадает, а если нет таких значений в word, то писало Не совпадает.
Lua:
function main()
      sampRegisterChatCommand("test", cmd_test)
  while true do
    wait(0)

  end
end

function cmd_test(arg)
local word = {"lol","123","test"}
if arg == tosrting(word) then
sampAddChatMessage("Совпадает", -1)
else
sampAddChatMessage("Не совпадает", -1)
end
end
 

Angr

Известный
291
98
Как сделать задержку каждого сообщения
Lua:
local ConfigZametk = io.open('moonloader/config/Hds.ini', 'r')
    for line in ConfigZametk:lines() do sampSendChat(tostring(line)) end
В .iniфайле
Код:
Привет.
Как тебя зовут?
Меня Vespan
:)
(если не поняли,надо что-бы каждое сообщение из .ini файла,отправлялось в чат спустя секунды)
wait() или через поток
Lua:
if ConfigZametk then
    lua_thread.create(function()
         for line in ConfigZametk:lines() do
          print(line)
          wait(1000)
         end
       end)
end
[/CODE]
 
  • Нравится
Реакции: Vespan

REMI99

Известный
38
1
Torej. Vsi poznamo modo duhov. kdorkoli mi lahko pomagajo v to storim, ko pišem / ghostactivate - / ghostdeactivate Jaz sem duh in prosim in lahko grem skozi ljudi. Prosim, dajte mi vir
 

Vespan

loneliness
Проверенный
2,104
1,634
Появилась эта ошибка
Код:
[22:58:37.249753] (error)    Admin Tools: D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: attempt to index local 'Load_Config' (a nil value)
stack traceback:
    D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: in main chunk
[22:58:37.249753] (error)    Admin Tools: Script died due to an error. (0908E4A4)
когда добавил код:
Lua:
if not doesDirectoryExist("moonloader/Admin Tools") then
        createDirectory('moonloader/Admin Tools')
        createDirectory('moonloader/ChatLog')
        createFile1 = io.open('moonloader/Admin Tools/Admin Tools[Gold-RP].ini', 'w')
config1 = [[
[General]
LoginAdminPanel=1234
LoginAccount=qwerty123
[Recon]
ReconID=10
[Options]
Gm=false
Message=false
KeyWH=J
Offgoto=false
WH=false
togphone=false
]]
        createFile1:write(config1)
        createFile1:close()
        createFile2 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config2 = [[
[Position]
Y=475
X=315
[InfoBar]
Y=465
X=850
]]
        createFile2:write(config2)
        createFile2:close()
        createFile3 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config3 = [[
[Position]
Y=700
X=650
[Settings]
Active=false
]]
        createFile3:write(config3)
        createFile3:close()
    end
 

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,200
Появилась эта ошибка
Код:
[22:58:37.249753] (error)    Admin Tools: D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: attempt to index local 'Load_Config' (a nil value)
stack traceback:
    D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: in main chunk
[22:58:37.249753] (error)    Admin Tools: Script died due to an error. (0908E4A4)
когда добавил код:
Lua:
if not doesDirectoryExist("moonloader/Admin Tools") then
        createDirectory('moonloader/Admin Tools')
        createDirectory('moonloader/ChatLog')
        createFile1 = io.open('moonloader/Admin Tools/Admin Tools[Gold-RP].ini', 'w')
config1 = [[
[General]
LoginAdminPanel=1234
LoginAccount=qwerty123
[Recon]
ReconID=10
[Options]
Gm=false
Message=false
KeyWH=J
Offgoto=false
WH=false
togphone=false
]]
        createFile1:write(config1)
        createFile1:close()
        createFile2 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config2 = [[
[Position]
Y=475
X=315
[InfoBar]
Y=465
X=850
]]
        createFile2:write(config2)
        createFile2:close()
        createFile3 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config3 = [[
[Position]
Y=700
X=650
[Settings]
Active=false
]]
        createFile3:write(config3)
        createFile3:close()
    end
всю функцию го
 

savvin

Известный
407
140
Появилась эта ошибка
Код:
[22:58:37.249753] (error)    Admin Tools: D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: attempt to index local 'Load_Config' (a nil value)
stack traceback:
    D:\GTASHKA\moonloader\Admin Tools [Gold-Rp].lua:55: in main chunk
[22:58:37.249753] (error)    Admin Tools: Script died due to an error. (0908E4A4)
когда добавил код:
Lua:
if not doesDirectoryExist("moonloader/Admin Tools") then
        createDirectory('moonloader/Admin Tools')
        createDirectory('moonloader/ChatLog')
        createFile1 = io.open('moonloader/Admin Tools/Admin Tools[Gold-RP].ini', 'w')
config1 = [[
[General]
LoginAdminPanel=1234
LoginAccount=qwerty123
[Recon]
ReconID=10
[Options]
Gm=false
Message=false
KeyWH=J
Offgoto=false
WH=false
togphone=false
]]
        createFile1:write(config1)
        createFile1:close()
        createFile2 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config2 = [[
[Position]
Y=475
X=315
[InfoBar]
Y=465
X=850
]]
        createFile2:write(config2)
        createFile2:close()
        createFile3 = io.open('moonloader/Admin Tools/Imgui Recon.ini', 'w')
config3 = [[
[Position]
Y=700
X=650
[Settings]
Active=false
]]
        createFile3:write(config3)
        createFile3:close()
    end
inicfg для кого придумали?
 

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,200
Работает только на 1 аргумент (на lol), на остальные не реагирует..
Ребят, помогите, как сделать в одной переменной несколько аргументов.

Типо если я прописываю в чат - /test test, то мне выдавало Совпадало, или /test 123, то писало Совпадает, а если нет таких значений в word, то писало Не совпадает.
Lua:
function main()
      sampRegisterChatCommand("test", cmd_test)
  while true do
    wait(0)

  end
end

function cmd_test(arg)
local word = {"lol","123","test"}
if arg == tosrting(word) then
sampAddChatMessage("Совпадает", -1)
else
sampAddChatMessage("Не совпадает", -1)
end
end
Lua:
local word = {['lol'] = true, ['test'] = true}
if word[arg] then
    print('Yes')
end
 

kingleonides

Участник
43
28
Как сделать задержку каждого сообщения
Lua:
local ConfigZametk = io.open('moonloader/config/Hds.ini', 'r')
    for line in ConfigZametk:lines() do sampSendChat(tostring(line)) end
В .iniфайле
Код:
Привет.
Как тебя зовут?
Меня Vespan
:)
(если не поняли,надо что-бы каждое сообщение из .ini файла,отправлялось в чат спустя секунды)
Тебе же уже ответили, добавить задержку в момент перебора всех строке, цикл оберни в поток
Код:
 lua_thread.create(function() youCode... end)
 

Fabregoo

Известный
656
128
Как вместо надпими premium, вставить свою?
 

Вложения

  • sa-mp-095.png
    sa-mp-095.png
    150.1 KB · Просмотры: 106

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
Ку ребят! Писал скрипт для организации своей НО, такая проблема, как сделать переход на второй диалог? Скажите пожалуйста. Внимание! Переход на слово СОБЕСЕДОВАНИЕ!
Lua:
function php()
sampShowDialog(228, '{FF5656}РП для {FF9900}гос.орг. Мэрия', 'Собеседование \nВыговоры \nУволить \nРП отыгровки', 'Выбрать', 'Назад', 2)
end
local result, button, list, input = sampHasDialogRespond(0)
    if result then
    if button == 1 and list == 1 then
        sampShowDialog(229, 'Собеседование', '1. Приветствие \n2. Лицензии паспорт и мед.карта \n3. Сядьте/встаньте \n4. Проверка на МГ.', 'Выбрать', 'Назад', 2)
    end
end
То что выше function main() которое должно быть есть, просто чтобы не засорять оставил только то, что мне нужно
Lua:
-- main
sampRegisterChatCommand("dialog", gialog)

-- Беск. цикл
local result, button, list, input = sampHasDialogRespond(228) -- 228 - ID диалога, которого создали
    if result then
        if button == 1 and list == 0 then -- Строки начинаются с нуля. 0 - первая строка
        sampShowDialog(229, 'Собеседование', '1. Приветствие \n2. Лицензии паспорт и мед.карта \n3. Сядьте/встаньте \n4. Проверка на МГ.', 'Выбрать', 'Назад', 2)
        end
    end


-- Вне main
function dialog()
    sampShowDialog(228, '{FF5656}РП для {FF9900}гос.орг. Мэрия', 'Собеседование \nВыговоры \nУволить \nРП отыгровки', 'Выбрать', 'Назад', 2)
end
 

komnatq

Известный
202
90
Можно как-то игроку поменять ID над головой? Если да, то как это сделать средствами луа
 

komnatq

Известный
202
90
Всмысле? Только для тебя чтобы было? Или для всех?
Да, визуально, только для меня
Ну вот что-то получилось, но как сделать так чтобы переходило не после двух слов /rp, а после одного, т.е. пишу я /rp нажимаю собеседование и диалог сразу появляется, а не после второго написания -__-
Lua:
script_author("Alexey_Skymorer")
script_version("1.0")
script_name("RP Мэрия Russia RP By Alexey_Skymorer")

require "lib.moonloader"
local keys = require "vkeys"

local tag = "{FFFFFF}Скрипт для Мэрии Russia RP от Alexey_Skymorer - {FF00FF}Загружен!"
local main_color = 0xFFA200
local main_color_text = "{5A90CE}"
local white_color = "{FFF000}"
local red_color = "{FF0010}"

function main()
if not isSampfuncsLoaded() or not isSampLoaded() then return end
while not isSampAvailable() do wait(0) end
sampRegisterChatCommand("rp", php)
while true do
wait (0)
end
end

function php()
    sampShowDialog(228, '{FF5656}РП для {FF9900}гос.орг. Мэрия', 'Собеседование \nВыговоры \nУволить \nРП отыгровки', 'Выбрать', 'Назад', 2)
    local result, button, list, input = sampHasDialogRespond(228)
    if result then
        if button == 1 and list == 0 then
        sampShowDialog(229, 'Собеседование', '1. Приветствие \n2. Лицензии паспорт и мед.карта \n3. Сядьте/встаньте \n4. Проверка на МГ.', 'Выбрать', 'Назад', 2)
        end
    end
end

Тебе вот это
Lua:
local result, button, list, input = sampHasDialogRespond(228)
    if result then
        if button == 1 and list == 0 then
        sampShowDialog(229, 'Собеседование', '1. Приветствие \n2. Лицензии паспорт и мед.карта \n3. Сядьте/встаньте \n4. Проверка на МГ.', 'Выбрать', 'Назад', 2)
        end
    end
нужно перенести в беск. цикл (вставить между while true do *сюда* end)