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

m1racles

Активный
199
32
как поймать сообщение в чате и открыть имгуи окно?
если я правильно понимаю, то

Lua:
local sampev = require('samp.events')
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local window = imgui.ImBool(false)
function main()
    while not isSampAvailable() do wait(200) end
    imgui.Process = false
    window.v = false
    while true do
        wait(0)
        imgui.Process = window.v
    end
end
function sampev.onServerMessage(color, text)
    if text:find('xuy') then
        window.v = true
    end
end


function imgui.OnDrawFrame()
    if window.v then
        imgui.SetNextWindowPos(imgui.ImVec2(350.0, 250.0), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowSize(imgui.ImVec2(280.0, 70.0), imgui.Cond.FirstUseEver)
        imgui.Begin('Window Title', window)
        
        imgui.End()
    end
end
 
Последнее редактирование:

Curtis

Участник
282
10
не могу понять почему не рабтает hotkey
 

Вложения

  • commands.lua
    81.1 KB · Просмотры: 5

Mr.Mastire222

Известный
529
259
как вывести сохранненый чек бокс? у меня после запуска галочка пропадает а в ini файле стоит true
 

Dmitriy Makarov

25.05.2021
Проверенный
2,478
1,113
как вывести сохранненый чек бокс? у меня после запуска галочка пропадает а в ini файле стоит true
При объявлении чекбокса в ImBool передай значение с кфг.
local box = imgui.ImBool(mainIni.config.checkb)
Где майнИни.конфиг.чекб - свои данные.

И ещё объявление чекбокса должно быть после создания ини.
 
  • Нравится
Реакции: Mr.Mastire222

Mr.Mastire222

Известный
529
259
При объявлении чекбокса в ImBool передай значение с кфг.
local box = imgui.ImBool(mainIni.config.checkb)
Где майнИни.конфиг.чекб - свои данные.

И ещё объявление чекбокса должно быть после создания ини.
сохроняется и выводиться, но теперь галочка стоит после перезапуска, но функция не работает, нужно снять галочку чтоб заработал
Lua:
 if seltext == 4 then 

          if imgui.Checkbox(u8"Рп оружие", checkbox_rpgun) then
            rpgun = not rpgun
            if rpgun then
                rp_thread:run()
            else
                rp_thread:terminate()
            end
            mainIni.settings.checkbox_rpgun = checkbox_rpgun.v
            inicfg.save(mainIni, directIni)
         end

          imgui.SameLine()
          imgui.TextQuestion("(?)", u8"Автоматический отыгрывает достование/убирание оружия.")
        end
 

woodware

Потрачен
Проверенный
4,527
1,258
как сделать проверку на отправленое сообщение скриптом?
например у меня есть биндер который отправляет /usedrugs 3 как понять что биндер отправил сообщение и отправить сообщение /me съел шоколадный батончик?
 

YarikVL

Известный
Проверенный
4,798
1,814
как сделать проверку на отправленое сообщение скриптом?
например у меня есть биндер который отправляет /usedrugs 3 как понять что биндер отправил сообщение и отправить сообщение /me съел шоколадный батончик?
Добавь в блок где выполняется отправление команды /usedrugs 3 присвоение переменной какой то результат ( к примеру true ) и потом делаешь проверку если твоя переменная true тогда отправлять /me съел шоколадный батончик
 

woodware

Потрачен
Проверенный
4,527
1,258
Добавь в блок где выполняется отправление команды /usedrugs 3 присвоение переменной какой то результат ( к примеру true ) и потом делаешь проверку если твоя переменная true тогда отправлять /me съел шоколадный батончик
мне нужно именно забиндить наркотики через другой скрипт, не спрашивай зачем
 

eqzzz

Участник
126
19
Всем привет! Помогите, кто шарит. Нужна функция FFI (если не ошибаюсь), чтоб один .lua файл работал через другой ну или с помощью.
 

chapo

🫡 В армии с 17.10.2023. В ЛС НЕ ОТВЕЧАЮ
Друг
8,778
11,223
как сделать проверку на отправленое сообщение скриптом?
например у меня есть биндер который отправляет /usedrugs 3 как понять что биндер отправил сообщение и отправить сообщение /me съел шоколадный батончик?
Lua:
local sampev = require 'lib.samp.events'

function sampev.onSendCommand(text)
    if text == '/usedrugs 3' then
        sampSendChat('/me вкинулся и откинулся')
    end
end
 
  • Нравится
Реакции: woodware

sep

Известный
673
76
при открытие большого текста в имгуи падает фпс сильно можно как то пофиксить ?

код:
    local rrddd4 = io.open('moonloader/resource/1/1.txt')
    if rrddd4 then
      for lines in rrddd4:lines() do
          imgui.Text(u8(lines))
      end
      rrddd4:close()
      end

в imgui.InputTextMultiline есть баг когда мышка багается и неполучается выделить пока не перезагрзишь скипт как пофиксить

данный баг был в https://www.blast.hk/threads/20109/
script_name 'spur_imgui'
script_author 'imring'
script_version '9.0'
АКТУАЛЬНО
 

barjik

Известный
464
190
Как вывести в одну строку?
code:
if imgui.Button('send') then
    sampSendChat(styles[style.v + 1]) --(themes[theme.v + 1])
    sampSendChat(themes[theme.v + 1])
end
Lua:
if imgui.Combo(u8'##1', style, styles) then
    mainIni.settings.style = style.v
    inicfg.save(mainIni, "save.ini")
end
    
    --imgui.SameLine()
    
if imgui.Combo(u8'##2', theme, themes) then
    mainIni.settings.theme = theme.v
    inicfg.save(mainIni, "save.ini")
end
    
if imgui.Button('send') then
    sampSendChat(styles[style.v + 1]) --(themes[theme.v + 1])
    sampSendChat(themes[theme.v + 1])
end
 

linmsqn

Участник
337
9
Как сделать так, чтобы второе окно могло активироваться только после словленного сообщения в чате? допустим есть сообщение в чате, и только тогда окно не сразу активируется, а его можно будет активировать/закрыть. Также наоборот, чтобы скрипт видел в чате сообщение и сразу отключал второе окно.