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

[w0te]

Известный
821
544
помогите пожалуйста, как это сделать на команду, или это тоже из сингла?
 

Стэнфорд

Потрачен
1,033
537
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите добавить в имгуи хоткей. Ряд вариантов шаблонов смотрел, постоянно что-то не дает работать скрипту
 

sep

Известный
714
79
как сделать чтобы скрипт работал правильно а не выключался если мой ник не первый
в файле несколько ников мой и другие

код:
local lock = getWorkingDirectory().."\\lock.txt"

name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
for line in io.lines(lock) do
    if line ~= name then
sampAddChatMessage("ника нету скрипт не работает", 0x00ff00)
        --thisScript():unload()
else
sampAddChatMessage("скрипт работает", 0x00ff00)
    end
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,510
1,139
I tried this but my script is not working. I get crash:



What am I doing wrong?
Lua:
require 'lib.moonloader'
local sampev = require 'lib.samp.events'
local state = false

function main()
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('armg', function()
        state = not state
        sampAddChatMessage(state and 'AutoReaction ON' or 'AutoReaction OFF', -1)
    end)
    wait(-1)
end

function sampev.onServerMessage(color, text)
    if text:find('First one who types') then
        lua_thread.create(function() wait(10)
            code = text:match("First one who types (.+)")
            wait(1000)
            sampAddChatMessage(code)
        end)
    end
end

как сделать чтобы скрипт работал правильно а не выключался если мой ник не первый
в файле несколько ников мой и другие

код:
local lock = getWorkingDirectory().."\\lock.txt"

name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
for line in io.lines(lock) do
    if line ~= name then
sampAddChatMessage("ника нету скрипт не работает", 0x00ff00)
        --thisScript():unload()
else
sampAddChatMessage("скрипт работает", 0x00ff00)
    end
end
На форуме нашёл где-то.
Lua:
local lock = getWorkingDirectory().."\\lock.txt"

-- main
name = sampGetPlayerNickname(select(2, sampGetPlayerIdByCharHandle(PLAYER_PED)))
local function res()
    for line in io.lines(lock) do
        if name:find(line) then
            sampAddChatMessage("Ник есть", 0x00ff00)
            return true
        end
    end
    return false
end
if not res() then
    sampAddChatMessage("Ника нет", 0x00ff00)
end
 
Последнее редактирование:

abnomegd

Известный
372
44
Как такое сделать?
sa-mp-000.png
 

salominka

Новичок
14
1
Как можно сделать парсинг визальных строк в чате?(в чате оно есть, а в чат логе нет)
Отпишите в ТГ плиз, если поможете, накину денюжку.
 

Стэнфорд

Потрачен
1,033
537
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Помогите добавить в имгуи хоткей. Ряд вариантов шаблонов смотрел, постоянно что-то не дает работать скрипту
 

Shepi

Активный
177
36
почему при нажатии кнопки отвечающей за открытие 3 меню ничего не открывается?
Lua:
imgui.BeginChild('##121', imgui.ImVec2(320, 500), true)
                if imgui.Button(u8'Основное меню', imgui.ImVec2(250, 25), admin_window_state) then menu = 0 end

                if imgui.Button(u8'Настройки', imgui.ImVec2(250, 25), admin_window_state) then menu = 1 end

                if imgui.Button(u8'Заметки', imgui.ImVec2(250, 25), admin_window_state) then menu = 2 end

                if imgui.Button(u8"Читы", imgui.ImVec2(250, 25), admin_window_state) then menu = 3 end

                if imgui.Button(u8"Все команды зарегистрированные в скрипте", imgui.ImVec2(295, 25), admin_window_state) then menu = 4 end
                imgui.EndChild()






              if menu == 0 then
              imgui.SameLine()
                imgui.Text(u8"Вас приветствует ssut.\nКнопки переключения менюшек находятся слева.\nПриятного пользования ^-^")


              elseif menu == 1 then



                  if imgui.Combo(u8'Выбор темы для имгуи', selected_item, {u8'Фиолетовая', u8'Тёмная', u8'Красная', u8'Вишнёвая'}, 4) then

  if selected_item.v == 0 then
    FiollaTheme()
  end
    if selected_item.v == 1 then
        DarkTheme()
    end
    if selected_item.v == 2 then
        RedTheme()
    end
    if selected_item.v == 3 then
        ShepiTheme()
    end



              elseif menu == 2 then
              imgui.SameLine()
                imgui.Text(u8"Типа да")
                imgui.InputTextMultiline("##Bloknot", textbloknot, imgui.ImVec2(-1, 250))
                if imgui.Button('Сохранить', main_window_state) then
                    sampAddChatMessage(u8:decode'Успешно сохранено!')
                end


              elseif menu == 3 then
              imgui.SameLine()

                 imgui.Checkbox(u8"Да", CheckBox)


                imgui.Text(u8"Да")

              elseif menu == 4 then
              imgui.SameLine()
                imgui.Text(u8"/ssut - Данный диалог")
              end
              end

1631697111777.png

(не высвечивается должное при нажатии)

1631697146190.png
 

Dmitriy Makarov

25.05.2021
Проверенный
2,510
1,139
Помогите добавить в имгуи хоткей. Ряд вариантов шаблонов смотрел, постоянно что-то не дает работать скрипту
Lua:
local rkeys = require 'rkeys'
imgui.HotKey = require('imgui_addons').HotKey

local tLastKeys = {}
local bindText = {v = {VK_R}} -- Тут клавиша наша. Буква R.

-- main
cmdbind = rkeys.registerHotKey(bindText.v, true, function()
    sampAddChatMessage("Тест", -1) -- Этот код выполнится при нажатии на забинженную кнопку в ХотКее.
end)

-- OnDrawFrame
if imgui.HotKey("##", bindText, tLastKeys, 100) then -- Сам ХотКей. Первый аргумент - это не текст рядом, а текст внутри ХотКея.
    rkeys.changeHotKey(cmdbind, bindText.v)
end
imgui.SameLine()
imgui.Text("- HotKey")
Screenshot_1.png


почему при нажатии кнопки отвечающей за открытие 3 меню ничего не открывается?
Lua:
imgui.BeginChild('##121', imgui.ImVec2(320, 500), true)
                if imgui.Button(u8'Основное меню', imgui.ImVec2(250, 25), admin_window_state) then menu = 0 end

                if imgui.Button(u8'Настройки', imgui.ImVec2(250, 25), admin_window_state) then menu = 1 end

                if imgui.Button(u8'Заметки', imgui.ImVec2(250, 25), admin_window_state) then menu = 2 end

                if imgui.Button(u8"Читы", imgui.ImVec2(250, 25), admin_window_state) then menu = 3 end

                if imgui.Button(u8"Все команды зарегистрированные в скрипте", imgui.ImVec2(295, 25), admin_window_state) then menu = 4 end
                imgui.EndChild()






              if menu == 0 then
              imgui.SameLine()
                imgui.Text(u8"Вас приветствует ssut.\nКнопки переключения менюшек находятся слева.\nПриятного пользования ^-^")


              elseif menu == 1 then



                  if imgui.Combo(u8'Выбор темы для имгуи', selected_item, {u8'Фиолетовая', u8'Тёмная', u8'Красная', u8'Вишнёвая'}, 4) then

  if selected_item.v == 0 then
    FiollaTheme()
  end
    if selected_item.v == 1 then
        DarkTheme()
    end
    if selected_item.v == 2 then
        RedTheme()
    end
    if selected_item.v == 3 then
        ShepiTheme()
    end



              elseif menu == 2 then
              imgui.SameLine()
                imgui.Text(u8"Типа да")
                imgui.InputTextMultiline("##Bloknot", textbloknot, imgui.ImVec2(-1, 250))
                if imgui.Button('Сохранить', main_window_state) then
                    sampAddChatMessage(u8:decode'Успешно сохранено!')
                end


              elseif menu == 3 then
              imgui.SameLine()

                 imgui.Checkbox(u8"Да", CheckBox)


                imgui.Text(u8"Да")

              elseif menu == 4 then
              imgui.SameLine()
                imgui.Text(u8"/ssut - Данный диалог")
              end
              end

Посмотреть вложение 114277
(не высвечивается должное при нажатии)

Посмотреть вложение 114278
По этому примеру сделай, там работает всё.
 
Последнее редактирование: