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

RTD

Потужно
Модератор
401
474
Даже после загрузки, он не может найти бибиотеку.
Lua:
lua_thread.create(function()
local ok, err = pcall(require, 'imgui')
if not ok then
downloadUrlToFile("https://github.com/Trefa2254/medhelp/raw/master/imgui.lua",  getWorkingDirectory().."\\lib\\imgui.lua")
while not doesFileExist(getWorkingDirectory().."\\lib\\imgui.lua") do wait(0) end
downloadUrlToFile("https://github.com/Trefa2254/medhelp/raw/master/MoonImGui.dll",  getWorkingDirectory().."\\lib\\MoonImGui.dll")
while not doesFileExist(getWorkingDirectory().."\\lib\\MoonImGui.dll") do wait(0) end
imgui = require 'imgui'
end
imgui = require 'imgui'
end)
Код:
[17:37:31.015007] (error)    MedHelp.lua: C:\Games\GTA_San_Andreas\moonloader\MedHelp.lua:74: attempt to index global 'imgui' (a nil value)
stack traceback:
    C:\Games\GTA_San_Andreas\moonloader\MedHelp.lua:74: in main chunk
[17:37:31.015007] (error)    MedHelp.lua: Script died due to an error. (18E2422C)
Изучай код с вики и поймешь как юзать (lua - downloadurltofile | BlastHack — DEV_WIKI(https://blast.hk/wiki/lua%3Adownloadurltofile)). Узнать что загрузилось можешь по id
Lua:
local dlstatus = require('moonloader').download_status
function downloadHandler(id, status, p1, p2)
    if status == dlstatus.STATUS_ENDDOWNLOADDATA then
        print('Загрузка окончена')
    end
end
 

AnWu

Известный
Всефорумный модератор
4,778
5,411
Даже после загрузки, он не может найти бибиотеку.
Lua:
lua_thread.create(function()
local ok, err = pcall(require, 'imgui')
if not ok then
downloadUrlToFile("https://github.com/Trefa2254/medhelp/raw/master/imgui.lua",  getWorkingDirectory().."\\lib\\imgui.lua")
while not doesFileExist(getWorkingDirectory().."\\lib\\imgui.lua") do wait(0) end
downloadUrlToFile("https://github.com/Trefa2254/medhelp/raw/master/MoonImGui.dll",  getWorkingDirectory().."\\lib\\MoonImGui.dll")
while not doesFileExist(getWorkingDirectory().."\\lib\\MoonImGui.dll") do wait(0) end
imgui = require 'imgui'
end
imgui = require 'imgui'
end)
Код:
[17:37:31.015007] (error)    MedHelp.lua: C:\Games\GTA_San_Andreas\moonloader\MedHelp.lua:74: attempt to index global 'imgui' (a nil value)
stack traceback:
    C:\Games\GTA_San_Andreas\moonloader\MedHelp.lua:74: in main chunk
[17:37:31.015007] (error)    MedHelp.lua: Script died due to an error. (18E2422C)
после загрузки юзай thisScript():reload() и будет счастье
 

Musaigen

shitposter
Проверенный
1,654
1,471
Как при помощи регулярок найти два значения в строке.
Например: /heal Первая регулярка Вторая регулярка
 

RipperBob4ik

Новичок
7
0
Именно этот момент крашает, до этого делал через другой способ, на каждую свою команду накладывал всё работало. Help me.



function vmfetap1(param)
local id = string.match(param, '(%d+)')
if id = nil then
if id = "1" then
sampSendChat("- И так, сейчас я буду задавать вам вопросы, косающиеся устава, у вас есть 3 права на ошибку.")
wait(250)
sampAddChatMessage("{D3D3D3}[ Мысли ]: Вопросов на 1 этап 8 (/vmfetap1 1 - vmfetap1 8).")
end
if id = "2" then
sampSendChat("- 1. Разрешено ли вам использовать военную технику в своих целях?")
end

(Там ещё продолжение, но по примеру 2.)
 

f0rtrix

Известный
208
15
Lua:
if color == -825307393 and msg:find('У Вас нет с собой маски') then
       return sampAddChatMessage("{4682B4} Ошибка! У Вас нет с собой маски")
end
Почему оно пишет и серверное и мое сообщение? Чот вроде вчера работало, а седня нет :)
 

RipperBob4ik

Новичок
7
0
Lua:
function vmfetap1(param)
local id = string.match(param, '(%d+)')
if id = nil then
if id = "1" then
sampSendChat("- И так, сейчас я буду задавать вам вопросы, косающиеся устава, у вас есть 3 права на ошибку.")
wait(250)
sampAddChatMessage("{D3D3D3}[ Мысли ]: Вопросов на 1 этап 8 (/vmfetap1 1 - vmfetap1 8).")
end
if id = "2" then
sampSendChat("- 1. Разрешено ли вам использовать военную технику в своих целях?")
end

Именно этот момент крашает, до этого делал через другой способ, на каждую свою команду накладывал всё работало. (Там ещё продолжение, но по примеру 2.)
 

AnWu

Известный
Всефорумный модератор
4,778
5,411
Именно этот момент крашает, до этого делал через другой способ, на каждую свою команду накладывал всё работало. Help me.



function vmfetap1(param)
local id = string.match(param, '(%d+)')
if id = nil then
if id = "1" then
sampSendChat("- И так, сейчас я буду задавать вам вопросы, косающиеся устава, у вас есть 3 права на ошибку.")
wait(250)
sampAddChatMessage("{D3D3D3}[ Мысли ]: Вопросов на 1 этап 8 (/vmfetap1 1 - vmfetap1 8).")
end
if id = "2" then
sampSendChat("- 1. Разрешено ли вам использовать военную технику в своих целях?")
end

(Там ещё продолжение, но по примеру 2.)
if id == 2

Lua:
if color == -825307393 and msg:find('У Вас нет с собой маски') then
       return sampAddChatMessage("{4682B4} Ошибка! У Вас нет с собой маски")
end
Почему оно пишет и серверное и мое сообщение? Чот вроде вчера работало, а седня нет :)
return {"Ошибка"}