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

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Во, сяб, терь работает, а можешь сделать вывод окна? само окно я сам сделаю, просто вывод
В смысле "вывод"? У тебя оно по команде вызывается. Или ты хочешь, чтобы оно постоянно активно было?
 

tsunamiqq

Участник
429
16
В смысле "вывод"? У тебя оно по команде вызывается. Или ты хочешь, чтобы оно постоянно активно было?
Та не тип, я навожу на игроку ну и жму ALT + E и тип что бы открывалось меню, я там тип всякое добавлю, кнопки - текст и тд
 

Vintik

Мечтатель
Проверенный
1,487
951

EclipsedFlow

Известный
Проверенный
1,040
464
1616783698603.png

Если я буду искать текст от сервера text:find('Неоплаченное частное имущество') то он заметит или надо hex color обязательно?
 

Dmitriy Makarov

25.05.2021
Проверенный
2,481
1,113
Дима, поможешь с выводом окна?
Тут помогал однажды. Можешь оттуда код взять.
 

Corrygan

Новичок
26
1
Представим, есть один InputText, в него ввели текст, как сделать так, чтобы этот текст сохранялся?
 

tsunamiqq

Участник
429
16
Тут помогал однажды. Можешь оттуда код взять.
Я чекнул код, попробывал не работает, и да у тебя нет открытия меню ну BeginChild нету
 

Castiel_Chrysler

Новичок
25
0
Вылезает вот такая ошибка при использовании двух шрифтов в одном окне:
Rso81xua6YQ.jpg



Вот код:

Код:
function imgui.BeforeDrawFrame()
    local font_config = imgui.ImFontConfig()
    font_config.MergeMode = true
    fa_font = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/fontawesome-webfont.ttf', 13.0, font_config, fa_glyph_ranges)
    arial = imgui.GetIO().Fonts:AddFontFromFileTTF('moonloader/resource/fonts/arial.ttf', 15.5, nil, imgui.GetIO().Fonts:GetGlyphRangesCyrillic())
end

function imgui.OnDrawFrame()
    imgui.SetNextWindowSize(imgui.ImVec2(700, 515), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(Trinity Taxi Helper", main_window_state, imgui.WindowFlags.NoResize)
    imgui.Text("Blablabla")
    imgui.PushFont(arial)
    imgui.Text("Blablabla")
    imgui.PopFont()
    imgui.End()
end
 

PoundFoolish

Участник
81
1
Ребят, хелп.
Есть такой код (ниже будет). Суть такая, что я в ПЕРВОМ поле ввожу команду (для скажем так бинда), потом сохраняю и эта команда должна примениться, но не применяется (остается старая).
Перезагружаю скрипт - применяется. Как сделать грамотно это, чтобы применялось сразу, а не приходилось рестартать скрипт?
============================================================================================================

1616791023098.png

Код отрывками.

Lua:
local Data = { ----- CFG это типо окей, да?
    PoleOne = {
        CMD = "cmd",
    },
    PoleTwo = {
        Time = "20",
    },
    PoleThree = {
        Text = "Test",
    },
}


------
text1_buffer  = imgui.ImBuffer(u8(cfg.PoleOne.CMD), 256)
text2_buffer  = imgui.ImBuffer(u8(cfg.PoleTwo.Time), 256)
text3_buffer  = imgui.ImBuffer(u8(cfg.PoleThree.Text), 256)
------
        imgui.Text(u8'Команда:    Время:       Причина:')
        imgui.PushItemWidth(60)
        if imgui.InputText(u8"##Команда мата", text1_buffer) then
        imgui.PopItemWidth()
        end

        imgui.SameLine(0,7)
        imgui.PushItemWidth(60)
        if imgui.InputText(u8"##время мата", text2_buffer) then
        imgui.PopItemWidth()
        end
     
        imgui.SameLine(0,7)
        imgui.PushItemWidth(150)
        if imgui.InputText(u8"##Текст мата", text3_buffer) then
        imgui.PopItemWidth()
        end
     
        imgui.SameLine(0,5)
        if imgui.Button(u8'Сохранить##1') then
            cfg.PoleOne.CMD = u8:decode(text1_buffer.v)
            cfg.PoleTwo.Time = u8:decode(text2_buffer.v)
            cfg.PoleThree.Text = u8:decode(text3_buffer.v)
           inicfg.save(cfg, "Ravshan\\settings.ini")
           sampAddChatMessage('Сохранено.', -1)
        end
------
sampRegisterChatCommand(cfg.PoleOne.CMD, mat) --- тут эта команда по сути должна применяться
------
function test(pam)
    local id = pam:match('(%d+)')
        if id then
        if sampIsPlayerConnected(id) then
            sampSendChat('/me ТЕСТ: '..id..' '..cfg.PoleTwo.Time..' '..cfg.PoleThree.Text)
        else
            sampAddChatMessage('Нету игрока.', -1)
        end
        else
            sampAddChatMessage('Не верно что-то.', -1)
        end
end
 
Последнее редактирование:

Fomikus

Известный
Проверенный
474
343
Ребят, хелп.
Есть такой код (ниже будет). Суть такая, что я в ПЕРВОМ поле ввожу команду (для скажем так бинда), потом сохраняю и эта команда должна примениться, но не применяется (остается старая).
Перезагружаю скрипт - применяется. Как сделать грамотно это, чтобы применялось сразу, а не приходилось рестартать скрипт?
============================================================================================================

Посмотреть вложение 90832
Код отрывками.

Lua:
local Data = { ----- CFG это типо окей, да?
    PoleOne = {
        CMD = "cmd",
    },
    PoleTwo = {
        Time = "20",
    },
    PoleThree = {
        Text = "Test",
    },
}


------
text1_buffer  = imgui.ImBuffer(u8(cfg.PoleOne.CMD), 256)
text2_buffer  = imgui.ImBuffer(u8(cfg.PoleTwo.Time), 256)
text3_buffer  = imgui.ImBuffer(u8(cfg.PoleThree.Text), 256)
------
        imgui.Text(u8'Команда:    Время:       Причина:')
        imgui.PushItemWidth(60)
        if imgui.InputText(u8"##Команда мата", text1_buffer) then
        imgui.PopItemWidth()
        end

        imgui.SameLine(0,7)
        imgui.PushItemWidth(60)
        if imgui.InputText(u8"##время мата", text2_buffer) then
        imgui.PopItemWidth()
        end
     
        imgui.SameLine(0,7)
        imgui.PushItemWidth(150)
        if imgui.InputText(u8"##Текст мата", text3_buffer) then
        imgui.PopItemWidth()
        end
     
        imgui.SameLine(0,5)
        if imgui.Button(u8'Сохранить##1') then
            cfg.PoleOne.CMD = u8:decode(text1_buffer.v)
            cfg.PoleTwo.Time = u8:decode(text2_buffer.v)
            cfg.PoleThree.Text = u8:decode(text3_buffer.v)
           inicfg.save(cfg, "Ravshan\\settings.ini")
           sampAddChatMessage('Сохранено.', -1)
        end
------
sampRegisterChatCommand(cfg.mutecmd.mat, mat) --- тут эта команда по сути должна применяться
------
function test(pam)
    local id = pam:match('(%d+)')
        if id then
        if sampIsPlayerConnected(id) then
            sampSendChat('/me ТЕСТ: '..id..' '..cfg.PoleTwo.Time..' '..cfg.PoleThree.Text)
        else
            sampAddChatMessage('Нету игрока.', -1)
        end
        else
            sampAddChatMessage('Не верно что-то.', -1)
        end
end
Если новая команда регается - то нужно разрегать старую
Можешь брать её из таблицы конфига и при изменении команды записывать новую в тот же конфиг