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

atiZZZ

Новичок
249
48
Код:
[12:48:16.781412] (system)    Loading script 'D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua'...
[12:48:16.781412] (debug)    New script: 0AC19F7C
[12:48:16.781412] (error)    ImGui for Script.lua: D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua:28: ')' expected near 'notifrep'
[12:48:16.781412] (error)    ImGui for Script.lua: Script died due to an error. (0AC19F7C)
И так, 28 строчка возле (ну типо либо слева, либо справа) слова "notifrep" ошибка.

, notifrep.v and "

ЗАПЯТУЮ БЛЯТБ УБЕРИ!

Ну, я думаю, ты сам понимаешь из-за 1 запятой у тебя просто умирает скрипт.
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И так, 28 строчка возле (ну типо либо слева, либо справа) слова "notifrep" ошибка.

, notifrep.v and "

ЗАПЯТУЮ БЛЯТБ УБЕРИ!

Ну, я думаю, ты сам понимаешь из-за 1 запятой у тебя просто умирает скрипт.

Гыг, понял, спасибо) Не я писал xD, человек выше помог).
Можешь еще сказать что означает постфиксная приставка .v
например:
Lua:
moonimgui_text_buffer.v
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
И так, 28 строчка возле (ну типо либо слева, либо справа) слова "notifrep" ошибка.

, notifrep.v and "

ЗАПЯТУЮ БЛЯТБ УБЕРИ!

Ну, я думаю, ты сам понимаешь из-за 1 запятой у тебя просто умирает скрипт.

Все равно ошибка такая.
Lua:
[13:01:41.004643] (system)    Loading script 'D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua'...
[13:01:41.004643] (debug)    New script: 08F56334
[13:01:41.004643] (error)    ImGui for Script.lua: D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua:28: ')' expected near 'notifrep'
[13:01:41.005643] (error)    ImGui for Script.lua: Script died due to an error. (08F56334)
[13:01:41.005643] (system)    Loading script 'D:\GTA FOR SCRIPTS\moonloader\moon imgui demo.lua'...

Lua:
            sampAddChatMessage(string.format("Уведомление о репорте %s" notifrep.v and "{00CC00}включено" or "{CC0000}выключено"), 0xCC0000)
 

trefa

3d print
Всефорумный модератор
2,123
1,288
Если я получаю из диалога число 01-09 как его переделать в 1-9?
Lua:
str = string.sub(str, 0, "")

Все равно ошибка такая.
Lua:
[13:01:41.004643] (system)    Loading script 'D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua'...
[13:01:41.004643] (debug)    New script: 08F56334
[13:01:41.004643] (error)    ImGui for Script.lua: D:\GTA FOR SCRIPTS\moonloader\ImGui for Script.lua:28: ')' expected near 'notifrep'
[13:01:41.005643] (error)    ImGui for Script.lua: Script died due to an error. (08F56334)
[13:01:41.005643] (system)    Loading script 'D:\GTA FOR SCRIPTS\moonloader\moon imgui demo.lua'...

Lua:
            sampAddChatMessage(string.format("Уведомление о репорте %s" notifrep.v and "{00CC00}включено" or "{CC0000}выключено"), 0xCC0000)
Потому что не так юзаешь
Lua:
     sampAddChatMessage(string.format("Уведомление о репорте %s", (notifrep.v and "{00CC00}включено" or "{CC0000}выключено")), 0xCC0000)
 
Последнее редактирование модератором:
  • Нравится
Реакции: ufdhbi

Ken Block

Известный
432
31
Lua:
        local time1, time2 = text:match('.+AFK за сегодня%:%s+%{FF7000}(%d+) ч (%d+)%s+мин')
        local time3, time4 = text:match('.+Время в игре сегодня%:%s+%{ffcc00}(%d+) ч (%d+) мин')
          if time4 >= time2 then
          time5 = time3 - time1
          time6 = time4 - time2
        else
          time5 = time3 - time1 - 1
          time6 = (time4 + 60) - time2
Почему перескакивает на else?
aN5jngdWgrg.jpg
 

trefa

3d print
Всефорумный модератор
2,123
1,288
Lua:
        local time1, time2 = text:match('.+AFK за сегодня%:%s+%{FF7000}(%d+) ч (%d+)%s+мин')
        local time3, time4 = text:match('.+Время в игре сегодня%:%s+%{ffcc00}(%d+) ч (%d+) мин')
          if time4 >= time2 then
          time5 = time3 - time1
          time6 = time4 - time2
        else
          time5 = time3 - time1 - 1
          time6 = (time4 + 60) - time2
Почему перескакивает на else?
aN5jngdWgrg.jpg

Регулярки мб не правильные, дай полностью текст диалога. А то у меня есть готовый ток на жёстком диске, а подключить его некуда.
 

Ken Block

Известный
432
31
Регулярки мб не правильные, дай полностью текст диалога. А то у меня есть готовый ток на жёстком диске, а подключить его некуда.
Всё правильно. Всё всегда показывает. Баг появляется когда в time2 число от 1-9 (мб)
Код:
Вы позвонили в службу точного времени

Сегодняшняя дата:        {66CC00}3 июля 2018 г.
{FFFFFF}День недели:            {66CC00}Вторник
{FFFFFF}Текущее время:        {3399FF}9:31

{FFFFFF}Время в игре за час:        {FF9999}28 мин
{FFFFFF}Время в игре сегодня:        {ffcc00}3 ч 0 мин
{FFFFFF}Время в игре вчера:        {ffcc00}1 ч 55 мин
{FFFFFF}AFK за сегодня:        {FF7000}2 ч 16 мин
{FFFFFF}AFK за вчера:            {FF7000}1 ч 26 мин
 

trefa

3d print
Всефорумный модератор
2,123
1,288
Всё правильно. Всё всегда показывает. Баг появляется когда в time2 число от 1-9 (мб)
Код:
Вы позвонили в службу точного времени

Сегодняшняя дата:        {66CC00}3 июля 2018 г.
{FFFFFF}День недели:            {66CC00}Вторник
{FFFFFF}Текущее время:        {3399FF}9:31

{FFFFFF}Время в игре за час:        {FF9999}28 мин
{FFFFFF}Время в игре сегодня:        {ffcc00}3 ч 0 мин
{FFFFFF}Время в игре вчера:        {ffcc00}1 ч 55 мин
{FFFFFF}AFK за сегодня:        {FF7000}2 ч 16 мин
{FFFFFF}AFK за вчера:            {FF7000}1 ч 26 мин
Lua:
str:match("{.*}AFK за сегодня:%s+{.*}(%d+)%s+ч%s+(%d+)%s+мин")--1
str:match("{.*}Время в игре сегодня:%s+{.*}(%d+)%s+ч%s+(%d+)%s+мин") -- 2
 

trefa

3d print
Всефорумный модератор
2,123
1,288
У меня всё такое же...
Вот исходник нашёл у себя, (тут конечно говно код, но я давно его уже писал) может что-то найдёшь
Lua:
if title ==  "{FFCD00}Точное время" then -- чекер онлайна
local st1,st2 = string.match(text, "{FFFFFF}Время в игре сегодня:%s+{ffcc00}(%d+)%s+ч%s+(%d+)%s+мин")
local st3,st4 = string.match(text, "{FFFFFF}Время в игре вчера:%s+{ffcc00}(%d+)%s+ч%s+(%d+)%s+мин")
local ast1,ast2 = string.match(text, "{FFFFFF}AFK за сегодня:%s+{FF7000}(%d+)%s+ч%s+(%d+)%s+мин")
local ast3,ast4 = string.match(text, "{FFFFFF}AFK за вчера:%s+{FF7000}(%d+)%s+ч%s+(%d+)%s+мин")

local time1 = st1 * 60 + st2
local time2 = ast1 * 60 + ast2
local ftime1 = time1 - time2
local tt1 = math.floor( ftime1 / 60 )
local tt2 = ftime1 % 60   
if ftime1 <= 240 then
local trefh = 240 - ftime1
local yytt1 = math.floor( trefh / 60 )
local yytt2 = trefh % 60
if yytt1 == 0 then
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за сегодня {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин. (До нормы: {FF0033}%d{FFFFFF} мин)",tt1, tt2,yytt2), 0x3CB371)
else
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за сегодня {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин. (До нормы: {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин)",tt1, tt2,yytt1,yytt2), 0x3CB371)
end
else
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за сегодня {228B22}%d{FFFFFF} ч {228B22}%d{FFFFFF} мин.",tt1, tt2), 0x3CB371)
end
local time3 = st3 * 60 + st4
local time4 = ast3 * 60 + ast4
local ftime2 = time3 - time4
local tt3 = math.floor ( ftime2 / 60 )
local tt4 = ftime2 % 60
if ftime2 <= 240 then
local trefh2 = 240 - ftime2
local yytt3 = math.floor( trefh2 / 60 )
local yytt4 = trefh2 % 60
if yytt3 == 0 then
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за вчера {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин. (До нормы: {FF0033}%d{FFFFFF} мин)",tt3, tt4,yytt4), 0x3CB371)
else
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за вчера {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин. (До нормы: {FF0033}%d{FFFFFF} ч {FF0033}%d{FFFFFF} мин)",tt3, tt4,yytt3,yytt4), 0x3CB371)
end
else
sampAddChatMessage(string.format("[MedHelp]{ffffff} Чистый онлайн за вчера {228B22}%d{FFFFFF} ч {228B22}%d{FFFFFF} мин.",tt3, tt4), 0x3CB371)
end
end -- чекер онлайна
 
  • Нравится
Реакции: Ken Block

Insanity

Известный
247
20
Lua:
  sampShowDialog(228, "ShowPass", "Введите ID", "Ввод", "Отмена", 1)
  local result, button, list, input = sampHasDialogRespond(228) -- В беск цикл
  if result then
    if button == 1 then
      sampSendChat('/showpass ' ..input)
    end
  end
Вроде так.
Теперь я не могу понять куда его вставить.
Код:
function dialogSecond()
  menurp = string.format("Ввести [id] \n[Выдача лицензий] \n[Паспорт]")
  dia = sampShowDialog(25, string.format("{336633}Other || SRP"), menurp, "OKe", "Close", 2)
  sampSetCurrentDialogListItem(0)
  repeat
    wait(0)
    re, button, listrpsmss, input = sampHasDialogRespond(25)
  until re
  if button == 0 then
    _ = sampCloseCurrentDialogWithButton()
  else
    if listrpsmss == 0 then
        dia = sampShowDialog(26, string.format("{336633}Other || SRP"), "Введите ID игрока", "OKe", "Close", 1)
      repeat
        wait(0)
         re, button, _, number = sampHasDialogRespond(26)
      until re
      if button == 0 then
        _ = sampCloseCurrentDialogWithButton()
      end
    end
  if listrpsmss == 1 then
    sampSendChat(string.format("/givelicense %s", number) )
  end
  if listrpsmss == 2 then
    sampSendChat(string.format("/showpass %s", number) )
  end
  dialogSecond()
end
end
Вот код, у меня сначала вводишь id в одной строке окна, после чего выбираешь команду в другой строке этого же окна. А надо что бы нажал на строку - высветилось окно для вписания ID
 

rraggerr

проверенный какой-то
1,626
851
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.