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

Rei

Известный
Друг
1,616
1,676
Как в оффлайне убрать это гавно?
Ебаный Diamond RP, создает эту табличку, а потом кикает тебя, и эта ебучая табличка висит. И она потом не дает нормально зайти на даймонд.
Шо я смог сделать:
Перед тем как сервер меня кикнет отправляю sampRequestClass(0) и успеваю получить RPC_RequestClass (Response) - табличка убираецца, сервер меня кикает и все счастливы. Но не всегда эта херь успевает послать RPC_RequestClass до кика, что табличка может таки зависнуть.
Слать sampRequestClass(0) при подключении не увенчалось успехом - результат Кик за читы, Lost Connection или полеты в пространстве.

Короче, как убрать это ебучее гавно?





Посмотреть вложение 61079
кек, ты все еще этой херней страдаешь? можешь прознать адрес этой кнопки и отправлять нажатие
но я сделал куда проще: таймаут 30+ сек при лось коннекте


Что у меня: в любом случае пишет sampAddChatMessage('1234', -1)

поставь 1234 по выходу из цикла
 

G W

Участник
141
5
Когда отключаю imgui.ShowCursor = true в imgui окно то появляется курсор по центру экрана и невозможно его двигать. Как это возможно исправить ? Хотел сделать вот такое окно без курсора:
Screenshot_2.png
 

Roman Ushnurcev

Участник
34
2
Lua:
function SearchMarker(posX, posY, posZ)
    local ret_posX = 0.0
    local ret_posY = 0.0
    local ret_posZ = 0.0
    local isFind = false
    for id = 0, 31 do
        local MarkerStruct = 0
        MarkerStruct = 0xC7F168 + id * 56
        local MarkerPosX = representIntAsFloat(readMemory(MarkerStruct + 0, 4, false))
        local MarkerPosY = representIntAsFloat(readMemory(MarkerStruct + 4, 4, false))
        local MarkerPosZ = representIntAsFloat(readMemory(MarkerStruct + 8, 4, false))
        if MarkerPosX ~= 0.0 or MarkerPosY ~= 0.0 or MarkerPosZ ~= 0.0 then
            ret_posX = MarkerPosX
            ret_posY = MarkerPosY
            ret_posZ = MarkerPosZ
            isFind = true
        end
    end
    return isFind, ret_posX, ret_posY, ret_posZ
end


--в беск.цикле
if SearchMarker() then
    local px, py, pz = getCharCoordinates(playerPed)
    local _, cx, cy, cz = SearchMarker()
    if math.floor(getDistanceBetweenCoords3d(cx, cy, cz, px, py, pz)) <= 10 then -- 10 - радиус чекпоинта
        sampAddChatMessage('Вы взяли чекпоинт', -1)
    end
end
Как сделать так что бы если игрок уже собрал этот чекпоинт, то в чат ничего не выводилось, пока чекпоинт снова не появится?
 

4e6ypek51

Участник
41
2
Lua:
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local checkboxes = {'Test','Тест','123','CheckBox', 'RandomText'}
local window = imgui.ImBool(false)
function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    while true do
        wait(0)
        if testCheat('JJ') then window.v = not window.v end
        imgui.Process = window.v
    end
end
function imgui.OnDrawFrame()
    imgui.Begin(u8"Тест", window)
    for i=1, #checkboxes do
        imgui.Checkbox(u8(checkboxes[i]), imgui.ImBool(false))
    end
    imgui.End()
end
Посмотреть вложение 61065
Включаю чекбокс и он выключается сразу.
И как можно добавить к нему инпут текст, чтоб каждому чеку свой инпут


Почему string.lower(upper тоже) не работает на русских символах?
Lua:
local txt1 = u8"ПрИвЕтЬ"
local txt2 = string.lower(txt1)

imgui.Text(txt1)
imgui.Text(txt2)
Screenshot_3.png
 
Последнее редактирование:
34
0
Помогите пожалуйста!
Как сделать 2+ imgui окна я разобрался, но как сделать чтобы 1 окно было всегда активно, но без курсора, но при вызове другого окна курсор появлялся. (что-то типо 1-е окно это статистика, а 2-е это обычное меню).
Пытался что-то сделать, но всегда либо закрывались сразу все окна включая статистику, либо не показывался курсор
 

McLore

Известный
565
284
Подскажите возможно ли установить для определенного imgui окна поставить шрифт?
 

Bredd Lane

Известный
423
349
Помогите пожалуйста!
Как сделать 2+ imgui окна я разобрался, но как сделать чтобы 1 окно было всегда активно, но без курсора, но при вызове другого окна курсор появлялся. (что-то типо 1-е окно это статистика, а 2-е это обычное меню).
Пытался что-то сделать, но всегда либо закрывались сразу все окна включая статистику, либо не показывался курсор
Lua:
imgui.ShowCursor = your_main_window.v --если процесс данного имгуи окна активен, то показывается курсор.
Это в функцию imgui.onDrawFrame.
 

samartinell1

Участник
98
14
как сделать чтобы по центру писался текст в имгуи? Я хочу, чтобы название "государственная волна" была по центру, а не слева, как по умолчанию
и что тут можно исправить? Мне нужно, чтобы когда я что-то писал, текст сохранялся в памяти, но если нажму на кнопку "сохранить", сохранялся в mainIni.settings.gnews_line_1, а еще хочу чтобы кнопки "отправить" и "сохранить" были напротив друг друга, а не в разных рядах.
Lua:
if imgui_gnews.v then
    local btnsizegnews = imgui.ImVec2(500, 0)
    local gnews_text_1 = imgui.ImBuffer(u8:decode(mainIni.settings.gnews_line_1), 256)
    imgui.SetNextWindowPos(imgui.ImVec2(imgui.GetIO().DisplaySize.x / 2, imgui.GetIO().DisplaySize.y / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(500, 450), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'Государственная волна',imgui_gnews, imgui.WindowFlags.NoResize + imgui.WindowFlags.NoCollapse)
    imgui.Text(u8'3 строки:')
        imgui.TextQuestion2(u8"( ? )", u8"Тэг организации и команду /gnews вводить НЕ нужно!")
    imgui.InputText(u8'1 строка', gnews_text_1)
    if imgui.Button(u8'Отправить') then
      sampSendChat(u8:decode(gnews_text_1.v))
    end
    if imgui.Button(u8'Сохранить') then
      inicfg.save(mainIni, directIni)
    end
    imgui.End()
  end
 

Double Tap Inside

Известный
Проверенный
1,916
1,256
кек, ты все еще этой херней страдаешь? можешь прознать адрес этой кнопки и отправлять нажатие
но я сделал куда проще: таймаут 30+ сек при лось коннекте




поставь 1234 по выходу из цикла
В офлайне она никуда не убирается, даже если нажать. Если бы нарешать адрес как убить эту херь просто, то это было бы шикарно. Но я рак, я не умею блять, памагите!!!
 
34
0
Помогите пожалуйста сделать штуку которая будет менять положение imgui окна.
То есть ты прописал команду и Imgui окно следует за курсором, а нажав ЛКМ, imgui окно сохраняет местоположение
 

A123543

Новичок
1
0
Ребят,как достать ид при прицеле,чтобы потом с ним можна было связать ещё команды?пробовал как вначале темы,не получилось(
 

Roman Ushnurcev

Участник
34
2
В офлайне она никуда не убирается, даже если нажать. Если бы нарешать адрес как убить эту херь просто, то это было бы шикарно. Но я рак, я не умею блять, памагите!!!
Её вроде бы не как нельзя убрать, только если она отключена на сервере. Ищи другие способы.
 
  • Нравится
Реакции: Double Tap Inside

SHARLYBUTTOM

Известный
597
118
Надо помощь. как написать команду что бы прописал команду и когда ты это сделал появлялся чат сампа с нужной тебе серверной командой и дальше я сам вписал туда нужный айди игрока?
 

Bredd Lane

Известный
423
349
А как в imgui addons использовать HotKey, как его привязать к бинду, сохранить клавишу и т.д.
Lua:
script_name('Название скрипта')
script_author('Автор скрипта')
script_version("Вресия скрипта")

require 'lib.moonloader' --подключение основной библиотеки
local imgui = require 'imgui' --подключение имгуи.
local rkeys = require 'rkeys' --поключение rkeys, нужно для хоткеев.
local imadd = require 'imgui_addons' --подключение аддонса.
local vkeys = require 'vkeys' --подключение вкейс.
if not doesDirectoryExist('moonloader/config') then --если нет конфига, то...
    createDirectory('moonloader\\config') --создаем его.
end
local inicfg = require 'inicfg' --подключение ини конфига.
local file = 'YourConfig.ini' --название ini конфига.
local mainIni = inicfg.load({
    main = {
        yourKey = encodeJson({VK_INSERT}), --стандартное значение хоткея.
    }
},file)
if not doesFileExist('moonloader/config/'..file) then --если нашего ini конфига нет, то создаем его.
    inicfg.save(mainIni,file) --сохраняем.
end
local yourKey = {
    v = decodeJson(mainIni.main.yourKey)
}
local main_window_state = imgui.ImBool(false) --локальная переменная имгуи окна.
local encoding = require "encoding" --кодировка.
encoding.default = "CP1251"
u8 = encoding.UTF8

function onWindowMessage(msg, wparam, lparam) --функция закрытие имгуи окна на esc.
    if msg == 0x100 or msg == 0x101 then
        if (wparam == 0x1B and main_window_state.v) and not isPauseMenuActive() and not sampIsChatInputActive() and not isSampfuncsConsoleActive() and not sampIsDialogActive() then
            consumeWindowMessage(true, false)
            if msg == 0x101 then
                main_window_state.v = false
            end
        end
    end
end

function isKeysDown(keylist) --функция для аддонса, она поддерживает 2+ клавиши.
    local tKeys = keylist
    local bool = false
    local isDownIndex = 0
    local key = #tKeys < 2 and tonumber(tKeys[1]) or tonumber(tKeys[#tKeys])
    if #tKeys < 2 then
        if not isKeyDown(VK_RMENU) and not isKeyDown(VK_LMENU) and not isKeyDown(VK_LSHIFT) and not isKeyDown(VK_RSHIFT) and not isKeyDown(VK_LCONTROL) and not isKeyDown(VK_RCONTROL) then
            if wasKeyPressed(key) then
                bool = true
            end
        end
    else
        if isKeyDown(tKeys[1])  then
            if isKeyDown(tKeys[2]) then
                if tKeys[3] ~= nil then
                    if isKeyDown(tKeys[3]) then
                        if tKeys[4] ~= nil then
                            if isKeyDown(tKeys[4]) then
                                if tKeys[5] ~= nil then
                                    if isKeyDown(tKeys[5]) then
                                        if wasKeyPressed(key) then
                                            bool = true
                                        end
                                    end
                                else
                                    if wasKeyPressed(key) then
                                        bool = true
                                    end
                                end
                            end
                        else
                            if wasKeyPressed(key) then
                                bool = true
                            end
                        end
                    end
                else
                    if wasKeyPressed(key) then
                        bool = true
                    end
                end
            end
        end
    end
    if nextLockKey == keylist then
        bool = false
        nextLockKey = ""
    end
    return bool
end

function main() --основная функция.
    if not isSampLoaded() or not isSampfuncsLoaded() then return end --проверка на самп и сампфанкс.
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('yourcmd', cmdfunction)
    while true do --бесконечный цикл.
        wait(0)
        imgui.Process = main_window_state.v --процесс имгуи.
        if isKeysDown(yourKey.v) then --если клавиша указанная в хоткее нажата, то.
            --твой код.
        end
    end
end

function cmdfunction()
    main_window_state.v = not main_window_state.v
end

function imgui.OnDrawFrame()
    imgui.ShowCursor = main_window_state.v --показ курсора.
    if main_window_state.v then
        local sw, sh = getScreenResolution()
        imgui.SetNextWindowPos(imgui.ImVec2(sw / 2, sh / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5)) --устанавливаем имгуи окно по середине экрана.
        imgui.Begin('ImguiName', main_window_state) --начало имгуи.
        if imadd.HotKey('##HotKeyName', yourKey, {}, 100) then
            mainIni.main.yourKey = encodeJson(yourKey.v)
            inicfg.save(mainIni,file) --сохраняем.
        end
        imgui.End() --конец имгуи.
    end
end
Держи, не за что.
 

Вложения

  • hotkey example.lua
    5.2 KB · Просмотры: 9