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

Alkasch226

Известный
43
4
Lua:
table[key] = value
size[96556] = "pidor"
size["pidor aosld"] = 12
У меня уже есть таблица с данными, в нее необходимо добавлять еще одну таблицу под конкретным именем.
table.insert позволяет добавить таблицу, но только под номером, без возможности указать название.
 

ufdhbi

Известный
Проверенный
1,455
861
крч, есть текст
Lua:
ban = "ban{FF0000}po prichine{FFFFFF}taras{00FF00}"
и нужно вырезать в отдельную переменную последний hex код( {00FF00} ),
кто шарит хелп
Lua:
local hex = str:match("%{(......)%}$")

У меня уже есть таблица с данными, в нее необходимо добавлять еще одну таблицу под конкретным именем.
table.insert позволяет добавить таблицу, но только под номером, без возможности указать название.
Lua:
table[key] = {12,23,535}
???
 
  • Нравится
Реакции: #kerosin

ufdhbi

Известный
Проверенный
1,455
861
Так как добавить новый ключ в таблицу? При попытке добавить таким образам выдает table index is nil

UPD:
Именно добавить, поскольку в таблице уже есть данные.
ты дурак или че?
Lua:
local t = {["ti"] = 0, ["pidor"] = 12}
t["sam takoy"] = 56
print(t["sam takoy"])
 
  • Нравится
Реакции: Alkasch226

James Hawk

Известный
919
217
Столкнулся со следующей проблемой. Работаю с иником (.ini файл) и togglebutton (либы подключены).
Делаю цикл, который при верном значении будет равные промежутки времени что-то делать (к примеру, писать "Я живой"). НО. При выключении togglebutton цикл сработает ещё один раз, чего мне не нужно. Перепробовал разные циклы, но ничего не получается.
Лишние части убраны.

Оглашение переменной:
Lua:
local imBool1 = imgui.ImBool(false)
Main:
Lua:
while true do
        wait(0)
        ...
        if flag then
            wait(cfg.config.wait_time*1000) -- получаю время с ини файла
            sampAddChatMessage(string.format("[%s]: I am alive!",thisScript().name), 0x2f7585)      
        end
end
Работа с togglebutton:
Lua:
if imgui.ToggleButton("tb", imBool1) then
    flag = not flag
end
 

Petr_Sergeevich

Известный
Проверенный
707
296
Столкнулся со следующей проблемой. Работаю с иником (.ini файл) и togglebutton (либы подключены).
Делаю цикл, который при верном значении будет равные промежутки времени что-то делать (к примеру, писать "Я живой"). НО. При выключении togglebutton цикл сработает ещё один раз, чего мне не нужно. Перепробовал разные циклы, но ничего не получается.
Лишние части убраны.

Оглашение переменной:
Lua:
local imBool1 = imgui.ImBool(false)
Main:
Lua:
while true do
        wait(0)
        ...
        if flag then
            wait(cfg.config.wait_time*1000) -- получаю время с ини файла
            sampAddChatMessage(string.format("[%s]: I am alive!",thisScript().name), 0x2f7585)      
        end
end
Работа с togglebutton:
Lua:
if imgui.ToggleButton("tb", imBool1) then
    flag = not flag
end
Тебе выше написали ответ. Добавляй проверку после wait()
 

Petr_Sergeevich

Известный
Проверенный
707
296
Выше мне не писали, доброе утро.
С такой проверкой игнорируется вообще выведение строк:
Lua:
if not flag then
   return
end
Пардон, даже в отдельной теме ответили)
https://blast.hk/threads/31479/

Просто снова проверяй flag перед отправкой сообщения.
Lua:
if flag then
    wait(cfg.config.wait_time*1000)
    if flag then
        sampAddChatMessage(string.format("[%s]: I am alive!",thisScript().name), 0x2f7585)
    end
end

p.s. сейчас вечер
 

dhhh

Известный
51
1
Как сделать чтобы при нажатии кнопки снизу появлялась некая информация?
 

James Hawk

Известный
919
217
Пардон, даже в отдельной теме ответили)
https://blast.hk/threads/31479/

Просто снова проверяй flag перед отправкой сообщения.
Lua:
if flag then
    wait(cfg.config.wait_time*1000)
    if flag then
        sampAddChatMessage(string.format("[%s]: I am alive!",thisScript().name), 0x2f7585)
    end
end

p.s. сейчас вечер
Теперь понял свою ошибку, спасибо.
P.S. Это ирония была


Как сделать чтобы при нажатии кнопки снизу появлялась некая информация?
Более информативно изложи суть и попробуй подкрепить кодом
 

dhhh

Известный
51
1
При нажатии на кнопку снизу появляется информация и мгновенно исчезает, как ее зафиксировать?
Lua:
    if imgui.Button(u8("Настройка"), imgui.ImVec2(70, 20)) then
                    imgui.Text(u8"Какой-то текст")
                end
 

Quasper

Известный
834
354
как вывести на экран imgun

как чтобы данное сообщение отправлялось в чат 1 раз от 1 человека ?
1) Объявлять глобальную переменную и присваивать ей нужные тебе данные, а затем выводить в имгуи
2) Оно и так пишет 1 раз
 

mld

Участник
99
11
Lua:
sampSendChat('/d ['..mainini.config.tag..'] - [СМИ] Занимаю новостную волну!')
            wait(4500)
            sampSendChat('/news •°•°•°•°• Музыкальная заставка « ' ..mainini.config.org.. ' » •°•°•°•°•')
            wait(6000)
            sampSendChat('/news [Математика] Доброго времени суток, дорогие друзья.')
            wait(6000)
            sampSendChat('/news [Математика] У микрофона '..mainini.config.rang..' '..mainini.config.org..' - '..mainini.config.nick )
            wait(6000)
            sampSendChat('/news [Математика] Сегодня я проведу эфир на тему Математика')
            wait(6000)
            sampSendChat('/news [Математика] Правила очень просты...')
            wait(6000)
            sampSendChat('/news [Математика] Я говорю пример,а вы должны написать ответ в смс нашей радиостанции')
            wait(6000)
            sampSendChat('/news [Математика] Играем до 3 баллов')
            wait(6000)
            sampSendChat('/news [Математика] Приз составляет '..main.efir.summa)
            wait(6000)
            sampSendChat('/news [Математика] Пожалуй начнем...')
            wait(6000)
            sampSendChat('/news [Математика] Первый пример: корень из 144')
.

Как сделать,чтобы после первого примера вышли сообщения на клиент по типу:
"Нажмите 1,если человек отгадал пример",при нажатии 1,вылезало это

sampSetChatInputText('/news [Математика] Первым был .. и у него .. балла')
sampSetChatInputEnabled(true)
А,если человек нажал 2,то вылезало сообщение:
sampSetChatInputText('/news [Математика] Не вижу ответов.')