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

Cucumber

Участник
40
21
Потому что у тебя и там и там значения присваиваются в rsName, rsId, rsText вот они и перезаписываются
Почему они перезаписываются я и так понял. Я у вас спрашиваю как можно сделать, чтобы переменные записывались и в первом и во втором случаи? Может как-то под одну строку это все можно засунуть при помощи оператора "or"?
 

Makly

Новичок
1
0
Вот у меня есть кнопка, например "Привет" и я открыл допустим диалог с репортом, туда нужно ввести сообщение. Я хочу сделать так, чтобы при нажатии кнопки привет, слово привет отправлялось в ввод. Возможно ли это сделать?
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Нравится
Реакции: tlwsn

sdfaw

Активный
717
150
как можно сделать так чтобы в окне imgui с заголовком, допустим "Test", после нажатия на кнопку открывалось ещё одно окно imgui, допустим с заголовком "NETEST" ? мне это надо срочно, без этого я скрипт не могу продолжать писать
 

BH:Pchela

Участник
41
0
Lua:
function main()
    repeat wait(0) until isSampAvailable()
    sampRegisterChatCommand('komanda', komanda)
    repeat wait(0) until false
end

function komanda(param)
lua_thread.create(function()
id = tonumber(param)
if param then
    if id ~= nil then
        wait(100)
        sampSendChat('/uninvite '..id...' выселен')
    end
end
end)
end
Я просил команду с ДВУМЯ аргументами, а тут только один. Было бы лучше, если бы вместо "выселен" можно было бы писать свою причину.
 

tlwsn

Известный
537
85
Я просил команду с ДВУМЯ аргументами, а тут только один. Было бы лучше, если бы вместо "выселен" можно было бы писать свою причину.
Lua:
function uv(pam)
    local id, reason = pam:match('(%d+) (.+)')
    if id and reason then
        sampSendChat(string.format('/uninvite %s %s', id, reason))
    else
        sampAddChatMessage(' Неверный ввод команды. {ae433d}Пример: {FFFFFF}/uv {ae433d}[id] [причина]', -1)
    end
end
 

S-Sirius

Известный
351
21
Может кто то подксазать что за ощибка?

Код:
[17:12:37.122976] (system)    Loading script 'D:\Games\GTA San Anderas\moonloader\Internet Relay Chat.lua'...
[17:12:37.122976] (debug)    New script: 062EB7C4
[17:12:37.128977] (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
[17:12:37.128977] (error)    Internet Relay Chat | Pears Project Edition: Script died due to an error. (062EB7C4)

Код:
Код:
script_name("Internet Relay Chat")
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 = "#TEST"

function main()
    while not isSampAvailable() do wait(5000) end
while true do
  wait(1000)
end
 

ufdhbi

Известный
Проверенный
1,463
867
Может кто то подксазать что за ощибка?

Код:
[17:04:34.410891] (error)    Internet Relay Chat | Pears Project Edition: opcode '0B36' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampGetPlayerNickname'
    D:\Games\GTA San Anderas\moonloader\Internet Relay Chat.lua:8: in main chunk
[17:04:34.410891] (error)    Internet Relay Chat | Pears Project Edition: Script died due to an error. (06168BDC)
[17:04:34.411892] (system)    Loading script 'D:\Games\GTA San Anderas\moonloader\laskano.lua'...
[17:04:34.411892] (debug)    New script: 06168BDC

Код:
Код:
script_name("Internet Relay Chat")
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 = "#TEST"

function main()
    while not isSampAvailable() do wait(5000) end
while true do
  wait(1000)
end
нельзя использовать функции сампа до его загрузки
Lua:
script_name("Internet Relay Chat")
script_version("[IRC Lua] 0.5.2h Beta")
script_author("Ruben")
script_dependencies("SAMPFUNCS, MoonLoader")
require 'lib.moonloader'
require 'luairc'


function main()
    if not isSampfuncsLoaded() or not isSampLoaded() then return end
    while not isSampAvailable() do wait(100) end
    local _, id = sampGetPlayerIdByCharHandle(playerPed)
    local cl = irc.new{nick = sampGetPlayerNickname(id)}
    CHANNEL = "#TEST"
    while true do
        wait(0)
       
    end
end
 

Glockersik

Участник
86
3
Ребят , пожалуйста помогите .
Lua:
if adm_state and text:find('Администратор (%a+)[id]: .+') then -- Можно так ? Просто , если не будет id администратора , то скрипт не будет это читать
 

ufdhbi

Известный
Проверенный
1,463
867
Ребят , пожалуйста помогите .
Lua:
if adm_state and text:find('Администратор (%a+)[id]: .+') then -- Можно так ? Просто , если не будет id администратора , то скрипт не будет это читать
Lua:
if adm_state and text:find('Администратор %g+%[%d+%]: .+') then
Что нужно то, чтобы работало - вот
 
  • Нравится
Реакции: Glockersik

sdfaw

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

ufdhbi

Известный
Проверенный
1,463
867
Спасибо , а если не секрет , можешь объеснить пожалуйста эти условные обозначения "%g+%[%d+%]"?
lua-users wiki: Patterns Tutorial(http://lua-users.org/wiki/PatternsTutorial)

Помогите пожалуйста решать проблему. Скрипт при запоске крашется, пором после перезапуска всех скриптов работает нормально. Ошибка:
Код:
[ML] (error) Internet Relay Chat | Pears Project Edition: opcode '0B36' call caused an unhandled exception
stack traceback:
    [C]: in function 'sampGetPlayerNickname'
    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. (04DF75AC)

Код:
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 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)
      local _, id = sampGetPlayerIdByCharHandle(playerPed)
    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

Заранее спасибо <3
Я тебе ответил уже ты используешь sampGetPlayerNickname до загрузки сампа