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

qWerTy.reg

Потрачен
21
19
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
  • Злость
Реакции: MaksQ

Vritz

Новичок
13
0
Помогите!

-Привет ребята, хотел бы спросить у вас что и куда вписывать в функции planeGotoCoords, так как в lua новичок.

-planeGotoCoords(int plane),float X,float Y,float Z,float z1,float z2)


-Что вообще вводить в int plane,float X,float Y,float Z,float z1,float z2?

-Насколько я понял float X,float Y,float Z это координаты, только не понимаю что тогда такое float z1,float z2?

Так как до этого работал с машинами где taskCarDriveToCord (где просто нужно было ввести id кара, и координаты куда тебе надо ехать)
А тут уже самолет и я вообще не шарю что тут вписывать, тип зачем там:
float z1,float z2.

-Крч кто уже работал с этой функцией, или просто может помочь или что-то посоветовать, пишите)

-За любую помощь буду признателен!)
 

neverlane

t.me/neverlane00
Друг
998
1,133
как взять в зоне стрима ид кара не ближайшего а рандомного?
Через рандом
Получаешь кары в зоне стрима через
TableVeh = getAllVehicles()
После math.randomseed(os.time()) чтоб одно и тоже число не выпадало
И через math.random(1, #TableVeh) получаешь хендл рандомного кара
А ид думаю сам знаешь как получить через хелдл
 
  • Влюблен
Реакции: MaksQ

chi-cha

Участник
2
2
Буквально вчера решил заняться написанием скриптов на Lua, и столкнулся с проблемой, каждый раз когда я ввожу текст и нажимаю "Выбрать" оно выводит сообщение указанное в условии при нажатии на кнопке "Закрыть".
Код:
sampShowDialog(324, "Место", "Укажите местоположение и канал", "Выбрать", "Отмена", 1)
Код:
local result, list, button, input = sampHasDialogRespond(324)

        if result then
            if button == 1 then
                sampAddChatMessage("Введено текст: {FFFFFF}" .. input, test_color)
            else
                sampAddChatMessage("Диалог закрыт.", test_color)
            end
        end
 

MR_Lua

Участник
41
0
Такой вопрос, человек должен ввести команду, после чего у него появляется диалоговое окно, он вводит туда опредленый ID пикапа, после чего начинается бег по опредленному маршруту. После того, как персонаж взял вещь, он несет ее обратно к началу и там ищет ID этого пикапа, после чего заходит на него
 

CaJlaT

Овощ
Модератор
2,808
2,609
Такой вопрос, человек должен ввести команду, после чего у него появляется диалоговое окно, он вводит туда опредленый ID пикапа, после чего начинается бег по опредленному маршруту. После того, как персонаж взял вещь, он несет ее обратно к началу и там ищет ID этого пикапа, после чего заходит на него
В чём сам вопрос? ты просишь нас сделать бота за тебя?
что тогда такое float z1,float z2?
Скорее всего это Pitch и yaw или roll
1593333547384.png
 
  • Нравится
Реакции: Vritz

MR_Lua

Участник
41
0

CaJlaT

Овощ
Модератор
2,808
2,609
Нет, как сделать чтобы при вводе ID пикапа он записывался в опредленное место и тогда персонаж начинал искать его
Lua:
local pickup = nil
function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('test', function()
        sampShowDialog(26000, 'Test', 'Введите ID пикапа', 'Ок', _, 1)
        lua_thread.create(checkdialog)
    end)
    sampRegisterChatCommand('pickup', function()
        if pickup == nil then return sampAddChatMessage('Ошибка, вы не ввели ID пикапа', -1) end
        sampAddChatMessage('ID пикапа: '..pickup, -1)
    end)
    while true do
        wait(0)
    end
end
function checkdialog()
    while sampIsDialogActive() do
        wait(0)
        local result, button, list, input = sampHasDialogRespond(26000)
        if result then
            if tonumber(input) == nil or input == '' then return sampAddChatMessage('Ошибка, вы не ввели ID пикапа', -1) end
            pickup = input
        end
    end
end
 
  • Нравится
Реакции: MR_Lua

Мира

Участник
455
9
Возможно ли сделать так, чтобы при каждом заходе на сервер в чат выводился текст и чтобы текст при каждом заходе менялся?
Хочется сделать так:
Заход на сервер:
"Привет!"
"Здравствуйте!"
"Доброго времени суток!"
И так далее.
Так скажем хранить в базе данных фразы (.lua), а потом при каждом заходе на сервер они выводились в рандомном порядке, но без повторений.
Допустим есть цифры от 1 до 5.
При входе на сервер в чат будет писаться:
"5"
"1"
"2"
"4"
"3"
И только потом начинается по новой, при шестом заходе на сервер.
 

CaJlaT

Овощ
Модератор
2,808
2,609
И только потом начинается по новой, при шестом заходе на сервер.




как вариант можно в ini сохдать базу сообщений и были они показаны или нет, сча по фасту накидаю код...

Lua:
local inicfg = require 'inicfg'
local mainIni = inicfg.load({
    Welcome =
    {
        ['Добро пожаловать'] = false,
        ['Hello'] = false,
        ['Здарова ёмаё'] = false,
        ['Бонжур'] = false,
        ['Халло'] = false,
        ['Йоу бандит'] = false
    }
}, 'Welcome.ini')
if not doesFileExist('moonloader/config/Welcome.ini') then inicfg.save(mainIni, 'Welcome.ini') end
function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampRegisterChatCommand('test', welcome)
    welcome()
    while true do
        wait(0)
    end
end
function welcome()
    local Welcomes = {} -- массив с приветствиями, которые ещё не были показаны
    for k, v in pairs(mainIni.Welcome) do
        if v == false then
            Welcomes[#Welcomes+1] = k
        end
    end
    if #Welcomes == 0 then -- если все сообщения были показаны, то сбрасывает
        for k, v in pairs(mainIni.Welcome) do
            mainIni.Welcome[k] = false
        end
        inicfg.save(mainIni, 'Welcome.ini')
        sampAddChatMessage('Данные были сброшены', -1)
        for k, v in pairs(mainIni.Welcome) do
            if v == false then
                Welcomes[#Welcomes+1] = k
            end
        end
        math.randomseed(os.time())
        rand = math.random(1, #Welcomes)
        sampAddChatMessage(Welcomes[rand], -1)
        mainIni.Welcome[Welcomes[rand]] = true
        inicfg.save(mainIni, 'Welcome.ini')
    else
        math.randomseed(os.time())
        rand = math.random(1, #Welcomes)
        sampAddChatMessage(Welcomes[rand], -1)
        mainIni.Welcome[Welcomes[rand]] = true
        inicfg.save(mainIni, 'Welcome.ini')
    end
end
1593343664821.png
1593342505591.png
 
  • Нравится
Реакции: Мира

arcanum1

Новичок
17
9
1593345153525.png

Когда я нажимаю на последнее поле для ввода, то у меня нажимаются все поля одновременно. А эти все остальные, когда по ним кликают, то они просто не работают


Вот мой говнокод


Lua:
    imgui.SetNextWindowSize(imgui.ImVec2(400, 130), imgui.Cond.FirstUseEver)
    imgui.SetNextWindowPos(imgui.ImVec2(centerResolutionOfScreen()), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.Begin(u8"Настройка флудера", options_state, imgui.WindowFlags.NoResize+imgui.WindowFlags.NoMove+imgui.WindowFlags.NoCollapse)
    imgui.Text(u8"Текст спама: ")
    imgui.SameLine()
    imgui.PushItemWidth(290)
    imgui.InputText(u8'', send)
    imgui.Text(u8"Задержка между сообщениями (в миллисекундах):")
    imgui.SameLine()
    imgui.PushItemWidth(80)
    imgui.InputText(u8'', cooldown)
    imgui.Text(u8"Количество сообщений для отправки: ")
    imgui.SameLine()
    imgui.PushItemWidth(100)
    imgui.InputInt(u8'', howmuch, 1, imgui.InputTextFlags.ReadOnly)
    if imgui.Button(u8'Запустить / остановить') then
        floodmanager()
    end
    imgui.End()
 

Anton Nixon

Активный
474
48
Почему крашит игру при попытке открыть PieMenu
Код скопировал у кого-то из комментариев:
Lua:
require "lib.moonloader"
require "lib.sampfuncs"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local key = require 'vkeys'
local pie = require 'imgui_piemenu'

local pie_mode = imgui.ImBool(true)
local pie_keyid = 1 -- 0 ЛКМ, 1 ПКМ, 2 СКМ

local pie_elements =
{
  {name = 'Сказать привет', action = function() sampSendChat('Привет.') end, next = nil},
  {name = 'Сказать пока', action = function() sampSendChat('Пока.') end, next = nil},
  {name = 'Сказать что-то', action = function() end, next = {
    {name = 'Сказать как дела', action = function() sampSendChat('Как дела.') end, next = nil},
    {name = 'Сказать ку-ку', action = function() sampSendChat('Ку-ку.') end, next = nil},
    {name = 'Сказать дароу', action = function() sampSendChat('Дароу.') end, next = nil}
  }}
}

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    
    while true do
        wait(100)
        imgui.Process = pie_mode.v
    end
end

function imgui.OnDrawFrame()
    if pie_mode.v then
        imgui.OpenPopup('PieMenu')
        if pie.BeginPiePopup('PieMenu', pie_keyid) then
            for k, v in ipairs(pie_elements) do
                if v.next == nil then if pie.PieMenuItem(u8(v.name)) then v.action() end
                elseif type(v.next) == 'table' then drawPieSub(v) end
            end
            pie.EndPiePopup()
        end
        imgui.ShowCursor = (pie_mode.v and imgui.IsMouseDown(pie_keyid))
    end
end

function drawPieSub(v)
    if pie.BeginPieMenu(u8(v.name)) then
      for i, l in ipairs(v.next) do
        if l.next == nil then
          if pie.PieMenuItem(u8(l.name)) then l.action() end
        elseif type(l.next) == 'table' then
          drawPieSub(l)
        end
      end
      pie.EndPieMenu()
    end
  end