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

kin4stat

mq-team · kin4@naebalovo.team
Всефорумный модератор
2,746
4,831
оставил только это imgui.Begin(u8"FastBuy by text", main_window_state)
еще в данной статье смотрел
У тебя перед Begin случайно imgui.SetNextWindowPos не стоит?
 
  • Нравится
Реакции: deleted-user-210352

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Lua:
    if main_window_state.v then
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2 , sh / 2), imgui.Cond.FirsUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(700, 550), imgui.Cond.FirstUseEver)
        imgui.Begin(u8"FastBuy by text", main_window_state)
        if imgui.Button(u8"Начать скупку", imgui.ImVec2(350, 35)) then
            skup()
        end
Попробуй imgui.Begin поставить под if main_window_state.v then
 

Immortal-

Участник
67
1
Ребят, нужно сделать кнопку перехода на имгуи окно, только уже другое.
 

banan4eg

Известный
47
15
Люди гении, обращаюсь к Вам. Я решил сделать биндер, в котором будут профили, то есть если активирован один профиль, то только его бинды работают, ну понятно в общем. Я сделал всё, но одну проблему решить не могу. Если делать проверку на дублирование хоткеев, то второй хоткей из другого профиля, не сохраняется, ну понятно почему, а если ее не делать, то при активации хоткея, он воспроизводится ровно столько раз, сколько вхождений найдено во всех профилях, не могу понять как разделить. Код не прикладываю просто потому что биндер в основном самп луа с которым я бегаю, и кода там почти на 3к строк с не нужным к теме мусором. Надеюсь вопрос понятно и правильно задал, спасибо.
 
У

Удалённый пользователь 341712

Гость
Люди гении, обращаюсь к Вам. Я решил сделать биндер, в котором будут профили, то есть если активирован один профиль, то только его бинды работают, ну понятно в общем. Я сделал всё, но одну проблему решить не могу. Если делать проверку на дублирование хоткеев, то второй хоткей из другого профиля, не сохраняется, ну понятно почему, а если ее не делать, то при активации хоткея, он воспроизводится ровно столько раз, сколько вхождений найдено во всех профилях, не могу понять как разделить. Код не прикладываю просто потому что биндер в основном самп луа с которым я бегаю, и кода там почти на 3к строк с не нужным к теме мусором. Надеюсь вопрос понятно и правильно задал, спасибо.
так без кода и не решим, как понять каким боком ты делал
 

banan4eg

Известный
47
15
Люди гении, обращаюсь к Вам. Я решил сделать биндер, в котором будут профили, то есть если активирован один профиль, то только его бинды работают, ну понятно в общем. Я сделал всё, но одну проблему решить не могу. Если делать проверку на дублирование хоткеев, то второй хоткей из другого профиля, не сохраняется, ну понятно почему, а если ее не делать, то при активации хоткея, он воспроизводится ровно столько раз, сколько вхождений найдено во всех профилях, не могу понять как разделить. Код не прикладываю просто потому что биндер в основном самп луа с которым я бегаю, и кода там почти на 3к строк с не нужным к теме мусором. Надеюсь вопрос понятно и правильно задал, спасибо.
Хоткеи я делал по примеру Perfect Binder'a, а выбор профиля через Combo
 

Immortal-

Участник
67
1
Здравствуйте, есть переменная, и её нужно сохранять в ини файле. У меня уже есть сохранение других переменых, спойлер ниже.

-- Ини файл
local mainIni = inicfg.load({ -- создаем конфиг
config =
{
accent = false, -- Сохраняем Акцент
piar = false, -- Сохраняем Пиар
clear_chat = false,
text_accent = " ", -- Сохраняем текст Акцента
text_piar = " " -- Сохраняем текст Пиара
}
},
"helper")

local accent = imgui.ImBool(mainIni.config.accent) -- Делаем переменную для Акцента
local piar = imgui.ImBool(mainIni.config.piar) -- Делаем переменную для Пиара
local clear_chat = imgui.ImBool(mainIni.config.clear_chat) -- Делаем переменную для Очистки чата
local text_accent = imgui.ImBuffer(''..mainIni.config.text_accent, 500) -- Делаем переменную для текста Акцента
local text_piar = imgui.ImBuffer(''..mainIni.config.text_piar, 500) -- Делаем переменную для текста Пиара

local status = inicfg.load(mainIni, 'helper.ini') -- подгружаем конфиг
if not doesFileExist('moonloader/config/Immortal/helper.ini') then -- Проверка, если конфиг существует
inicfg.save(mainIni, 'helper.ini') -- Сохраняем конфиг
end
-- Ини файл

-- Кнопка Сохранить
if imgui.Button('Сохранить', imgui.ImVec2(135,25)) then -- Создаем кнопку
mainIni.config.accent = accent.v -- Получаем чекбокс Акцента
mainIni.config.text_accent = text_accent.v -- Получаем поле с текстом Акцента
mainIni.config.clear_chat = clear_chat.v -- Получаем поле с очисткой чата
mainIni.config.piar = piar.v -- Получаем чекбокс Пиара
mainIni.config.text_piar = text_piar.v -- Получаем поле с текстом Пиара
inicfg.save(mainIni, 'helper.ini') -- Сохраняем в файл
end

-- Кнопка Сохранить
Переменная, которую нужно сохранить
local delay = imgui.ImInt(1000) -- Задержка
 

banan4eg

Известный
47
15
Здравствуйте, есть переменная, и её нужно сохранять в ини файле. У меня уже есть сохранение других переменых, спойлер ниже.
Переменная, которую нужно сохранить
local delay = imgui.ImInt(1000) -- Задержка

Lua:
-- Ини файл
local mainIni = inicfg.load({ -- создаем конфиг
config =
{
accent = false, -- Сохраняем Акцент
piar = false, -- Сохраняем Пиар
clear_chat = false,
text_accent = " ", -- Сохраняем текст Акцента
text_piar = " ", -- Сохраняем текст Пиара
delay = 1000
}
},
"helper")

local accent = imgui.ImBool(mainIni.config.accent) -- Делаем переменную для Акцента
local piar = imgui.ImBool(mainIni.config.piar) -- Делаем переменную для Пиара
local clear_chat = imgui.ImBool(mainIni.config.clear_chat) -- Делаем переменную для Очистки чата
local text_accent = imgui.ImBuffer(''..mainIni.config.text_accent, 500) -- Делаем переменную для текста Акцента
local text_piar = imgui.ImBuffer(''..mainIni.config.text_piar, 500) -- Делаем переменную для текста Пиара
local delay = imgui.ImInt(mainIni.config.delay) -- Задержка

local status = inicfg.load(mainIni, 'helper.ini') -- подгружаем конфиг
if not doesFileExist('moonloader/config/Immortal/helper.ini') then -- Проверка, если конфиг существует
inicfg.save(mainIni, 'helper.ini') -- Сохраняем конфиг
end
-- Ини файл

-- Кнопка Сохранить
if imgui.Button('Сохранить', imgui.ImVec2(135,25)) then -- Создаем кнопку
mainIni.config.accent = accent.v -- Получаем чекбокс Акцента
mainIni.config.text_accent = text_accent.v -- Получаем поле с текстом Акцента
mainIni.config.clear_chat = clear_chat.v -- Получаем поле с очисткой чата
mainIni.config.piar = piar.v -- Получаем чекбокс Пиара
mainIni.config.text_piar = text_piar.v -- Получаем поле с текстом Пиара
mainIni.config.delay = delay.v
inicfg.save(mainIni, 'helper.ini') -- Сохраняем в файл
end
-- Кнопка Сохранить
 
  • Нравится
Реакции: Immortal-