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

#kerosin

🔥
Проверенный
241
153
неа не фиксанулось
блеа кинь фулл, у меня норм
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.Begin(u8'FAQ Для правительства (При Max_Velikiy, Tucson)', main_window_state)
    imgui.Button(u8'Правила в ЧС') --then textHelpEmergencySituation() return end
    imgui.Button(u8'Инструкции') --then textHelpInstructions() return end
    imgui.Button(u8'Тен-коды') --then textHelpTenCodes() return end
    imgui.End()
  end
end

function main()
  while not isSampAvailable() do wait(0) end
  sampRegisterChatCommand('enim', function() main_window_state.v = not main_window_state.v end)
  while true do
    wait(0)
    imgui.Process = main_window_state.v
  end
end
 

Fuexie

Известный
108
30
блеа кинь фулл, у меня норм
Код:
script_name("UBI - GOV edition")
script_author("InfernoGeek")
script_version("0.3 beta")
script_version_number(010)
script_description("Universal Binder by InfernoGeek - Special version for Government. Is provided 'as is'")
script_moonloader(026)

local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local main_window_state = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.Begin(u8,'FAQ Для правительства (При Max_Velikiy, Tucson)', main_window_state)
    imgui.Button(u8,'Правила в ЧС') --then textHelpEmergencySituation() return end
    imgui.Button(u8,'Инструкции') --then textHelpInstructions() return end
    imugi.Button(u8,'Тен-коды') --then textHelpTenCodes() return end
    imgui.End()
  end
end

function main()
  while not isSampAvailable() do wait(0) end
  sampRegisterChatCommand('faqgov', function() main_window_state.v = not main_window_state.v end)
  while true do
    wait(0)
    imgui.Process = main_window_state.v
  end
end

OkI4Q4j.png
 

#kerosin

🔥
Проверенный
241
153

Fuexie

Известный
108
30
upload_2018-6-27_15-36-50.png

Как сделать эту хуйню без ошибок?

И ещё как сделать разделение строки сообщения в окне имгуи покажу на примере диалога Pawn
C++:
ShowPlayerDialog(playerid,dialogid,styleid,"Sample","Sample\nSample\nSample\n","Okay","Cancel");

Если что я Newbie в lua, ну в паун medium
 

#kerosin

🔥
Проверенный
241
153
Посмотреть вложение 15424
Как сделать эту хуйню без ошибок?

И ещё как сделать разделение строки сообщения в окне имгуи покажу на примере диалога Pawn
C++:
ShowPlayerDialog(playerid,dialogid,styleid,"Sample","Sample\nSample\nSample\n","Okay","Cancel");

Если что я Newbie в lua, ну в паун medium
кидай код лучше текстом, без скринов
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,710
5,255
Посмотреть вложение 15424
Как сделать эту хуйню без ошибок?

И ещё как сделать разделение строки сообщения в окне имгуи покажу на примере диалога Pawn
C++:
ShowPlayerDialog(playerid,dialogid,styleid,"Sample","Sample\nSample\nSample\n","Okay","Cancel");

Если что я Newbie в lua, ну в паун medium
imgui.Text(u8("Строка 1\nСтрока 2\n\tТоже строка, но с отступом"))
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,643
2,492
Посмотреть вложение 15424
Как сделать эту хуйню без ошибок?

И ещё как сделать разделение строки сообщения в окне имгуи покажу на примере диалога Pawn
C++:
ShowPlayerDialog(playerid,dialogid,styleid,"Sample","Sample\nSample\nSample\n","Okay","Cancel");

Если что я Newbie в lua, ну в паун medium
Lua:
imgui.TextWrapped('text\ntext2\ntext3')
 

Fuexie

Известный
108
30
imgui.Text(u8("Строка 1\nСтрока 2\n\tТоже строка, но с отступом"))
Пф, как в паун, ну ок.
кидай код лучше текстом, без скринов
Lua:
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.Begin(u8'FAQ Для правительства (При Max_Velikiy, Tucson)', main_window_state)
    if imgui.Button(u8'Правила при ЧС') then textHelpEmergencySituation() return end
    if imgui.Button(u8'Инструкции') then textHelpInstructions() return end
    if imgui.Button(u8'Тен-коды') then textHelpTenCodes() return end
    imgui.End()
  end
    function textHelpEmergencySituation()
        imgui.Begin(u8'Правила при ЧС', main_window_state) -- Заголовок окна gui
        -- 1 Пункт
        imgui.Text(u8'Вооруженное нападение на здание Правительства') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на здание правительства, охрана сразу же группируется в служебном коридоре, по возможности блокирует дверь, телохранители направляются к губернатору и занимают позиции возле него,') -- Содержимое окна gui
        imgui.Text(u8'все должностные лица правительства собираются в раздевалке и закрывают дверь, начальство охраны контролирует оборону зданий, сразу же при поступлении сообщения о нападении сообщает в полицию/ФБР, до прибытия правоохранительных органов, охрана оказывает защиту прохода по служебному коридору, в случае встречного огня, разрешено открывать огонь в ответ.')
        -- 2 Пункт
        imgui.Text(u8'Вооруженное нападение на конвой губернатора') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на конвой губернатора, машины охраны обязаны окружить машину с губернатором и маневрами стараться укрыться от огня, если путь заблокирован, губернатора оставляют в машине, сразу же сообщают в') -- Содержимое окна gui
        imgui.Text(u8'ФБР/Полицию, прилагают все усилия по защите жизни губернатора, если появляется возможность, его тут же эвакуируют с места, управляет ситуацией - начальство охраны.')
        -- 3 Пункт
        imgui.Text(u8'Похищение сотрудников правительства') -- Заголовок
        imgui.Text(u8'В данной ситуации сразу же происходит построение телохранителей губернатора, оповещается ФБР и Полиция, старшим составом ведутся регулярные переговоры и указания') -- Содержимое окна gui
        imgui.Text(u8'сотрудникам МЮ в действиях, в случае необходимости выдачи выкупа, правительство берет расходы на себя.')
        imgui.End()
    end
    function textHelpInstructions()
    end
    function textHelpTenCodes()
    end
end
 

Fuexie

Известный
108
30
TextWrapped нужен для переноса большего текста на новые строки если он не влезает в текущий элемент. Для собственных переносов пойдет и Text
А форматирование там работает? Цвет, размер шрифта, центрирование и тому подобное ?
Как на форуме
 

#kerosin

🔥
Проверенный
241
153
Пф, как в паун, ну ок.

Lua:
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.Begin(u8'FAQ Для правительства (При Max_Velikiy, Tucson)', main_window_state)
    if imgui.Button(u8'Правила при ЧС') then textHelpEmergencySituation() return end
    if imgui.Button(u8'Инструкции') then textHelpInstructions() return end
    if imgui.Button(u8'Тен-коды') then textHelpTenCodes() return end
    imgui.End()
  end
    function textHelpEmergencySituation()
        imgui.Begin(u8'Правила при ЧС', main_window_state) -- Заголовок окна gui
        -- 1 Пункт
        imgui.Text(u8'Вооруженное нападение на здание Правительства') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на здание правительства, охрана сразу же группируется в служебном коридоре, по возможности блокирует дверь, телохранители направляются к губернатору и занимают позиции возле него,') -- Содержимое окна gui
        imgui.Text(u8'все должностные лица правительства собираются в раздевалке и закрывают дверь, начальство охраны контролирует оборону зданий, сразу же при поступлении сообщения о нападении сообщает в полицию/ФБР, до прибытия правоохранительных органов, охрана оказывает защиту прохода по служебному коридору, в случае встречного огня, разрешено открывать огонь в ответ.')
        -- 2 Пункт
        imgui.Text(u8'Вооруженное нападение на конвой губернатора') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на конвой губернатора, машины охраны обязаны окружить машину с губернатором и маневрами стараться укрыться от огня, если путь заблокирован, губернатора оставляют в машине, сразу же сообщают в') -- Содержимое окна gui
        imgui.Text(u8'ФБР/Полицию, прилагают все усилия по защите жизни губернатора, если появляется возможность, его тут же эвакуируют с места, управляет ситуацией - начальство охраны.')
        -- 3 Пункт
        imgui.Text(u8'Похищение сотрудников правительства') -- Заголовок
        imgui.Text(u8'В данной ситуации сразу же происходит построение телохранителей губернатора, оповещается ФБР и Полиция, старшим составом ведутся регулярные переговоры и указания') -- Содержимое окна gui
        imgui.Text(u8'сотрудникам МЮ в действиях, в случае необходимости выдачи выкупа, правительство берет расходы на себя.')
        imgui.End()
    end
    function textHelpInstructions()
    end
    function textHelpTenCodes()
    end
end
Lua:
local main_window_state = imgui.ImBool(false)
local textHelpEmergencySituation = imgui.ImBool(false)
local textHelpInstructions = imgui.ImBool(false)
local textHelpTenCodes = imgui.ImBool(false)
Lua:
function imgui.OnDrawFrame()
  if main_window_state.v then
    imgui.Begin(u8'FAQ Для правительства (При Max_Velikiy, Tucson)', main_window_state)
    if imgui.Button(u8'Правила при ЧС') then textHelpEmergencySituation.v = not textHelpEmergencySituation.v end
    if imgui.Button(u8'Инструкции') then textHelpInstructions.v = not textHelpInstructions.v end
    if imgui.Button(u8'Тен-коды') then textHelpTenCodes.v = not textHelpTenCodes.v end
    imgui.End()
    if textHelpEmergencySituation.v then
      imgui.Begin(u8'Правила при ЧС', textHelpEmergencySituation) -- Заголовок окна gui
        -- 1 Пункт
        imgui.Text(u8'Вооруженное нападение на здание Правительства') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на здание правительства, охрана сразу же группируется в служебном коридоре, по возможности блокирует дверь, телохранители направляются к губернатору и занимают позиции возле него,') -- Содержимое окна gui
        imgui.Text(u8'все должностные лица правительства собираются в раздевалке и закрывают дверь, начальство охраны контролирует оборону зданий, сразу же при поступлении сообщения о нападении сообщает в полицию/ФБР, до прибытия правоохранительных органов, охрана оказывает защиту прохода по служебному коридору, в случае встречного огня, разрешено открывать огонь в ответ.')
        -- 2 Пункт
        imgui.Text(u8'Вооруженное нападение на конвой губернатора') -- Заголовок
        imgui.Text(u8'В случае вооруженного нападения на конвой губернатора, машины охраны обязаны окружить машину с губернатором и маневрами стараться укрыться от огня, если путь заблокирован, губернатора оставляют в машине, сразу же сообщают в') -- Содержимое окна gui
        imgui.Text(u8'ФБР/Полицию, прилагают все усилия по защите жизни губернатора, если появляется возможность, его тут же эвакуируют с места, управляет ситуацией - начальство охраны.')
        -- 3 Пункт
        imgui.Text(u8'Похищение сотрудников правительства') -- Заголовок
        imgui.Text(u8'В данной ситуации сразу же происходит построение телохранителей губернатора, оповещается ФБР и Полиция, старшим составом ведутся регулярные переговоры и указания') -- Содержимое окна gui
        imgui.Text(u8'сотрудникам МЮ в действиях, в случае необходимости выдачи выкупа, правительство берет расходы на себя.')
        imgui.End()
    end
    if textHelpInstructions.v then
    end
    if textHelpTenCodes.v then
    end
  end
end
 

AnWu

https://t.me/anwublog
Всефорумный модератор
4,710
5,255
А форматирование там работает? Цвет, размер шрифта, центрирование и тому подобное ?
Как на форуме
Нет. Всё это делается через функции. Цветной текст - TextColored. Цвета типа {FFFFFF} в ImGui не работают. Размер задается через создание загрузку шрифта или Scale (2й вариант убивает четкость шрифта при увеличении). Центрирование задается через устаноку позиции элемента.