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

S-Sirius

Известный
351
21
Пожалуйста помогите. Когда запускаю САМП скрипт крашется, потом когда в игре перезапускаю все lua скрипты, но начнет работать. Кто знает с чем это свяазно?
Ощибка:
Код:
[ML] (error) Internet Relay Chat | Pears Project Edition: opcode '0B2B' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampGetPlayerIdByCharHandle'
    D:\Games\GTA San Anderas\moonloader\Internet Relay Chat.lua:8: in main chunk
[ML] (error) Internet Relay Chat | Pears Project Edition: Script died due to an error. (050D16C4)

Скрипт:
Код:
script_name("Internet Relay Chat | Pears Project Edition")
script_version("[IRC Lua] 0.5.2h Beta")
script_author("Ruben")
script_dependencies("SAMPFUNCS, MoonLoader")
require 'lib.moonloader'
require 'luairc'

local _, id = sampGetPlayerIdByCharHandle(playerPed)
local cl = irc.new{nick = sampGetPlayerNickname(id)}
CHANNEL = "#CHelp" -- Канал, чтобы скрипты могли общаться между собой нужно чтобы они были в одном канале

function main()
    while not isSampAvailable() do wait(5000) end
    while not isSampAvailable() do wait(5000) end
    sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] {00FFF2}В цельях защити от крашов и вылетов скрипт будет запущен в течени 15 секунд.", 0x00FFF2)
    sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] {00FFF2}Если скрипт не запустится течени 15 секунд, перезапустите его: [{20E191}/load - перезапуск{00FFF2}].", 0x00FFF2)
    sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] {00FFF2}Скрипт находится в {FF0000}бета тестирование{00FFF2}, если нашли недоработку, отпишите разработчику.", 0x00FFF2)
    sampRegisterChatCommand("irc",virtchat)
    sampRegisterChatCommand("load",reloadchat)
    sampRegisterChatCommand("ircvers", ircversion)
    sampRegisterChatCommand("updateirc", updateirc)
cl:hook("OnChat", function(user, channel, message) -- Хук на входящие сообщения из канала
end)
-- Let's go!
wait(15000)
cl:connect("irc.esper.net") -- Сюда вводим адрес IRC сервера который работает на 6667 порту без TLS
cl:join(CHANNEL) -- Подключаемся к каналу!
sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] {00FFF2}Скрипт успешно подключился к чату! [{20E191}/irc - виртуальный чат.{00FFF2}]", 0x00FFF2)
    virtchat = lua_thread.create_suspended(virtchat)
while true do
  cl:think() -- Поддержка работы клиента - обрабатывает калбеки, отвечает на пинги.
  wait(1000)
end
end
function updateirc()
  downloadUrlToFile( "https://www.dropbox.com/s/m92y59jd3zpnh3r/Internet%20Relay%20Chat.lua?dl=0", "moonloader/Internet Relay Chat.lua")
  sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] {00FFF2}Скрипт успешно обновлен. Посмотреть информацию: [{20E191}/ircvers - информация о скрипте.{00FFF2}]", 0x00FFF2)
end
function ircversion()
  local ircversion = [[
{FFFFFF}• {0088ff}________________________________________________________________________ {FFFFFF}•
{ffffff}
{FFFFFF}    • {6666FF}Назывение скрипта:{FFFFFF} Internet Relay Chat | Pears Project Edition •
{FFFFFF}    • {6666FF}Версия скрипта:{FFFFFF} [IRC Lua] 0.5.2h Beta •
{FFFFFF}    • {6666FF}Дата начала разработки скрипта:{FFFFFF} 01.01.2019 •
{FFFFFF}    • {6666FF}Дата послегного обновление от разработчика:{FFFFFF} 09.01.2019 •
{ffffff}
{FFFFFF}• {0088ff}________________________________________________________________________ {FFFFFF}•
]]
  sampShowDialog(1770, "{0088ff} Информация о скрипте", ircversion, "{ffffff}*", "", 0)
end
function AnsiToUtf8(s)
  local r, b = ''
  for i = 1, s and s:len() or 0 do
    b = s:byte(i)
    if b < 128 then
      r = r..string.char(b)
    else
      if b > 239 then
        r = r..'\209'..string.char(b - 112)
      elseif b > 191 then
        r = r..'\208'..string.char(b - 48)
      elseif ansi_decode[b] then
        r = r..ansi_decode[b]
      else
        r = r..'_'
      end
    end
  end
  return r
end

function virtchat(param)
        local _, id = sampGetPlayerIdByCharHandle(playerPed)
      sampAddChatMessage("** {00FFF2}[{3D3B3B}#IRC{00FFF2}] "..sampGetPlayerNickname(id)..":{FFFFFF} "..param, 0x00FFF2)
      sendstr = AnsiToUtf8(param)
      cl:sendChat(CHANNEL, sendstr)
end
function reloadchat(param)
    thisScript():reload()
end
 

sdfaw

Активный
717
150
Lua:
imgui.Text(u8("Lock"))
    imgui.SameLine(365)
    if imgui.Button('test') then
что дальше писать чтобы после нажатия на кнопку "test" открылось ещё одно окно imgui
 

BH:Pchela

Участник
41
0
Мне нужно написать автоматическую отыгровку /uninvite. Я ввожу /uninvite id reason, происходит какая-то отыгровка и потом человек с id увольняется по причине reason. Можете скинуть код? :*
 

Cucumber

Участник
40
21
Столкнулся с проблемой, когда мне нужно получать одинаковые переменные из разных строк, т.е. есть строки:
C++:
Жалоба от: Nick_Name[132]: text
Репорт от Nick_Name[251]: text
Попробовал сделать таким образом, но в итоге срабатывает только та строка, в которой переменная объявлена последней.
Lua:
local rsName, rsId, rsText = string.match(text, "Жалоба от%: (.*)%[(%d+)%]%: (.*)")
local rsName, rsId, rsText = string.match(text, "Репорт от (.*)%[(%d+)%]%: (.*)")
Как можно это все под одну строку объединить?
 

BH:Pchela

Участник
41
0
Мне нужно написать автоматическую отыгровку /uninvite. Я ввожу /uninvite id reason, происходит какая-то отыгровка и потом человек с id увольняется по причине reason. Можете скинуть код? :*