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

Мира

Участник
455
9
Если пропишешь команду и будет нажимать на W(что бы идти) персонаж будет идти на альте
(если я правильно тебя понял)
Возможно это делается через игровые клавиши, но как именно сделать удержание, а не постоянное повторение?
 

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Возможно это делается через игровые клавиши, но как именно сделать удержание, а не постоянное повторение?
айди кнопки найдёшь в интернете. Пока оно true будет держать кнопку

Lua:
setVirtualKeyDown(кнопка, true)
 

Nelit

Потрачен
252
39
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У меня есть глобальная переменная balance = 300.300 сделал для того, что-бы затестить будет ли тратиться коины. У меня есть диалог, в нём выводится данный баланс. Реализовал снятия денег когда выбираешь пункт в диалоге, они снимаются, но бабки в диалоге продолжают показываться 300 даже после того, как все деньги уже кончились. миллион раз переоткрывал диалог, нихера. Вот код. Помогите

Lua:
script_name('Miner-Simulator')
script_author('Nelit')
script_properties('work-in-pause')
script_version('1.0 Beta')

require 'lib.moonloader'
require 'sampfuncs'

-- local inicfg = require 'inicfg'
-- local settings = 'Miner-Simualator'

local tag = '{666666}« {F9DF05}Miner{666666}-{F9DF05}Simulator {666666}» {FFFFFF}'
local author = unpack(thisScript().authors)
local version = thisScript().version
local main_color = '0xF9DF05'

----------------------------------------------
---------------For First Dialog---------------
----------------------------------------------

balance = 300

local titleMainDialog = '{FFFFFF}Главное меню {F9DF05}| {FFFFFF}Автор: {FF0000}'..author..' {F9DF05}| {FFFFFF}Версия: {FF0000}'..version..''
local firstButtonDialog = 'Выбрать'
local secondButtonDialog = 'Закрыть'

local mainMenuDialog = {
    'Магазин снаряжения',
    'Ваш баланс: {F9DF05}'..balance..' Коинов',
    'Рюкзак: {32CD32}(В РАЗРАБОТКЕ)',
    ' ',
    'Продажа руды',
    'Как играть?',
    '{FF0000}НАЧАТЬ ИГРУ СНАЧАЛА',
    ' ',
    'Идти домой {F9DF05}(ВЫ ТУТ)',
    '{32CD32}Идти в шахту'
}

local mainDialogText = ''

for _, str in ipairs(mainMenuDialog) do
    mainDialogText = mainDialogText .. str .. "\n"
end

---------------------------------------------------
---------------For HowPlaying Dialog---------------
---------------------------------------------------

local titleHowPlayingDialog = 'Как играть?'

local howPlayingText = [[
    {FFFFFF}Приветствуем тебя в игре {666666}« {F9DF05}Miner{666666}-{F9DF05}Simulator {666666}»{FFFFFF}

    Это простая убивалка времени. В ней тебе предстоит копать руду в {F9DF05}шахте, {FFFFFF}затем продавать её.
    За полученные {32CD32}деньги {FFFFFF}ты можешь покупать новое снаряжение, чинить свои кирки и так далее.

    Копать в {FF0000}шахте {FFFFFF}всё время тоже не выйдет, у тебя есть запас {F9DF05}энергии, {FFFFFF}по его окончанию ты не сможешь копать.
    Для его {32CD32}восстановления {FFFFFF}тебе придётся поспать у себя {F9DF05}дома.

    {FFFFFF}Надеюсь ты справишься, {F9DF05}удачи!
]]

---------------------------------------------
---------------For Shop Dialog---------------
---------------------------------------------

local titleShopDialog = '{FFFFFF}Магазин снаряжения {F9DF05}| {FFFFFF}Баланс: {F9DF05}'..balance..' Коинов'
local firstButtonShopDialog = 'Купить'
local secondButtonShopDialog = 'Закрыть'

local shopDialog = {
    'Деревянная кирка \t{32CD32}(Есть)',
    'Каменная кирка \t{F9DF05}(15 Коинов)',
    'Железная кирка \t{F9DF05}(25 Коинов)',
    'Золотая кирка \t{F9DF05}(39 Коинов)',
    'Титановая кирка \t{F9DF05}(47 Коинов)',
    'Алмазная кирка \t{F9DF05}(100 Коинов)'
}

local ShopDialogText = ''

for _, str in ipairs(shopDialog) do
    ShopDialogText = ShopDialogText .. str .. "\n"
end

-------------------------------------------
---------------Main Function---------------
-------------------------------------------

function main()
    if not isSampLoaded() or not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end

    -- wait(7000)

    sampAddChatMessage(tag .. 'Скрипт {32CD32}успешно {FFFFFF}загружен! Автор: {FF0000}' .. author, main_color)
    sampAddChatMessage(tag .. 'Главное меню скрипта {666666}- {F9DF05}/ms', main_color)
    sampAddChatMessage(tag .. 'Вы используете версию: {FF0000}' .. version, main_color)

    sampRegisterChatCommand('ms', cmd_ms)

    sampRegisterChatCommand('reload', function()
        thisScript():reload()
    end)

    while true do
        wait(0)

        -----------------------------------------
        ---------------Main Dialog---------------
        -----------------------------------------

        local result, button, list = sampHasDialogRespond(10000)
       
        if result then
            if button == 1 then
                if list == 0 then
                    sampShowDialog(10002, titleShopDialog, string.format(ShopDialogText), firstButtonShopDialog, secondButtonShopDialog, 4)
                elseif list == 1 then
                    sampAddChatMessage(tag .. 'Ваш баланс: {F9DF05}'..balance..' Коинов', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 2 then
                    sampAddChatMessage(tag .. 'В {32CD32}разработке!', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 4 then
                    sampAddChatMessage(tag .. 'Продажа руды', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 5 then
                    sampShowDialog(10001, titleHowPlayingDialog, string.format(howPlayingText), firstButtonDialog, secondButtonDialog, 0)
                elseif list == 6 then
                    sampAddChatMessage(tag .. 'Начать игру сначала', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 8 then
                    sampAddChatMessage(tag .. 'Вы уже тут!', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 9 then
                    sampAddChatMessage(tag .. 'Вы идёте в шахту.', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                end
            end
        end

        -----------------------------------------
        ---------------Shop Dialog---------------
        -----------------------------------------

        local result, button, list = sampHasDialogRespond(10002)
       
        if result then
            if button == 1 then
                if list == 0 then
                    sampAddChatMessage(tag .. 'У Вас уже {32CD32}есть {FFFFFF}этот предмет!', main_color)
                    sampShowDialog(10002, titleShopDialog, string.format(ShopDialogText), firstButtonShopDialog, secondButtonShopDialog, 4)
                elseif list == 1 then
                    if balance >= 15 then
                        balance = balance-15
                        sampAddChatMessage(tag .. 'Вы купили новый предмет - '.. shopDialog[2], main_color)
                        -- sampShowDialog(10002, titleShopDialog, string.format(ShopDialogText), firstButtonShopDialog, secondButtonShopDialog, 4)
                    else
                        sampAddChatMessage('У Вас недостаточно коинов!', main_color)
                    end
                elseif list == 2 then
                    sampAddChatMessage(tag .. 'В {32CD32}разработке!', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 4 then
                    sampAddChatMessage(tag .. 'Продажа руды', main_color)
                    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
                elseif list == 5 then
                    sampShowDialog(10001, titleHowPlayingDialog, string.format(howPlayingText), firstButtonDialog, secondButtonDialog, 0)
                end
            end
        end

    end
end

function cmd_ms()
    sampShowDialog(10000, titleMainDialog, string.format(mainDialogText), firstButtonDialog, secondButtonDialog, 2)
end
 
Последнее редактирование:

ollydbg

Известный
163
115
Каким образом?
an example of what to do
Lua:
require "lib.moonloader"
local imgui = require 'imgui'
local encoding = require 'encoding'
encoding.default = 'CP1252'
u8 = encoding.UTF8
local inicfg = require 'inicfg'
local cfg = inicfg.load({
    Settings = {
        input = ""
    }
}, 'config')


local buffer = imgui.ImBuffer(u8(cfg.Settings.input),256)



function imgui.OnDrawFrame()
---
---
------
----
if imgui.InputText("", buffer) then
    cfg.Settings.input = u8:decode(buffer.v)
    inicfg.save(cfg, 'config')
end
---
---
---
 

Yondime

кавайчик
Проверенный
308
520
Ку! Хочу на хостинг залить обычный массив, допустим: local allFams = {"Family", "Dynasty", "Corporation", "Squad", "Crew", "Empire", "Brotherhood"} и в скрипте вызвать его. Как можно это реализовать?
Если что, в скрипте этот массив будет намного больше, поэтому вставлять в сам код не очень целесообразно
 

Fott

Простреленный
3,461
2,378
Ку! Хочу на хостинг залить обычный массив, допустим: local allFams = {"Family", "Dynasty", "Corporation", "Squad", "Crew", "Empire", "Brotherhood"} и в скрипте вызвать его. Как можно это реализовать?
Если что, в скрипте этот массив будет намного больше, поэтому вставлять в сам код не очень целесообразно
Ну так и заливай. Потом делай запрос к сайту и все
 

ARMOR

011110000111100101101001
Модератор
4,970
6,896
Хотел бы узнать как сделать так чтобы из диалога можно было бы перенести нужный текст в имгуи, к примеру сделать /members но так чтобы всё время он был открыт и в нем писались все работники
 

ARMOR

011110000111100101101001
Модератор
4,970
6,896
Наверное хуево объяснил... сделать вот так( взял скрин у одного ютубера, скрипт АдминХеллпер) хоть это и не имгуи, но как так сделать чтобы был выведен туда текст из диалога
 

Вложения

  • 20210406_165313.jpg
    20210406_165313.jpg
    16.3 KB · Просмотры: 30

Dashok.

Участник
228
9
Как сделать что-бы скрипт нажимал по каждому пункту списка в луа?
GTA_SA_MP 06.04.2021 17_56_06.png
айди диалога 2390
 

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Какой вариант не говнокод?
Lua:
-- 1
if imgui.Button("Кнопка №1", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №1")
end
imgui.SameLine()
if imgui.Button("Кнопка №2", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №2")
end
imgui.SameLine()
if imgui.Button("Кнопка №3", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №3")
end

-- 2
for i = 1, 3 do
    if imgui.Button("Кнопка №"..i, imgui.ImVec2(40, 40)) then
        print("Вы нажали на кнопку №"..i)
    end
    imgui.SameLine()
end
 

Dashok.

Участник
228
9
Какой вариант не говнокод?
Lua:
-- 1
if imgui.Button("Кнопка №1", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №1")
end
imgui.SameLine()
if imgui.Button("Кнопка №2", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №2")
end
imgui.SameLine()
if imgui.Button("Кнопка №3", imgui.ImVec2(40, 40)) then
    print("Вы нажали на кнопку №3")
end

-- 2
for i = 1, 3 do
    if imgui.Button("Кнопка №"..i, imgui.ImVec2(40, 40)) then
        print("Вы нажали на кнопку №"..i)
    end
    imgui.SameLine()
end
2 варик