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

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
я имел ввиду работу с серверными диалогами)
не работал еще с серверными диалогами, но я видел что используют эту функцию
Lua:
sampSendDialogResponse(int id, int button, int listitem, zstring input)
а если использовать эту функцию, то тебе понадобится ID диалога
тут поможет events
Lua:
local sampev = require 'lib.samp.events' -- в начало скрипта

-- вне main
    function sampev.onShowDialog(dialogId, title, text, button1, button2, style)
    sampAddChatMessage("ID окна: "..dialogId, -1)
    end
-- в итоге, при открытии любого серверного диалогового окна, тебе в чат пишет "ID окна: *его  ид*"
 

MoonVladik

Активный
114
35
Как получать в переменные урон который нанесут при выстреле именно персу тогда когда игрок начинает стрелять в тебя (ну не ты а другой игрок)?
 

astynk

Известный
Проверенный
741
533
Можно ли как-то прочитать урон который нанесет игрок своим выстрелом как только он его совершает? Странный вопрос но это надо.
Хукать onSendGiveDamage.
Как получать в переменные урон который нанесут при выстреле именно персу тогда когда игрок начинает стрелять в тебя (ну не ты а другой игрок)?
Урон, который нанесли тебе - onSendTakeDamage
А если игрок А нанес урон игроку Б (не тебе), то никак.
 
  • Нравится
Реакции: P0M61K

vova2999

Известный
65
24
не работал еще с серверными диалогами, но я видел что используют эту функцию
Lua:
sampSendDialogResponse(int id, int button, int listitem, zstring input)
а если использовать эту функцию, то тебе понадобится ID диалога
тут поможет events
Lua:
local sampev = require 'lib.samp.events' -- в начало скрипта

-- вне main
    function sampev.onShowDialog(dialogId, title, text, button1, button2, style)
    sampAddChatMessage("ID окна: "..dialogId, -1)
    end
-- в итоге, при открытии любого серверного диалогового окна, тебе в чат пишет "ID окна: *его  ид*"
ты пишешь мне вещи которые я уже знаю, мне нужно именно то, о чем я расписал в своем сообщении
Нужно работать с диалогом имещим список(который кликабельный), на сколько я понял надо каждую строку записывать в таблицу/массив, в теории все понятно, на практике начинается тротлинг головоного мозга, не подскажете ли как реализовать, по возможности с кодом, либо же подскажите другой вариант работы с такими диалогами, заранее благодарен.
актально
 

Fomikus

Известный
Проверенный
473
346
ты пишешь мне вещи которые я уже знаю, мне нужно именно то, о чем я расписал в своем сообщении

актально
Lua:
function samp.onShowDialog(id, style, title, btn, btn, text)
    if title:find('Квесты') then -- Если ли в заголовке "Квесты"
        i = -1 -- List item в диалогах начинается с 0 (Через 1 строчку добавим 1 до нуля)
        for w in text:gmatch("[^\r\n]+") do -- Разбиваем текст на строки
            i = i + 1 -- Добавили 1 чтобы начать с 0
            if w:find("Можно завершить") then -- Если в строчке найдет 'Можно завершить', тогда...
        sampSendDialogResponse(id, 1, i, '') -- Выберет данную строчку
        return false -- Закроет диалог
            else -- Если же не нашло 'Можно завершить'
                if w:find("Доступен") then -- Если нашло 'Доступен'
            sampSendDialogResponse(id, 1, i, '') -- Выбрать данную
        return false -- Закроет диалог
                end
            end
        end
    end
end
Возможно не самый лучший пример, но всеже...
Авто сдача/принятие квеста
 
  • Нравится
  • Влюблен
Реакции: Receiver и vova2999

sdfaw

Активный
717
150
как пользоваться taskGoToCoordWhileAiming, taskGoToCoordWhileShooting, taskGotoCharAiming и taskGotoCharOffset ?
 

Cameron_Bawerman

Известный
105
1
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
 

Leatington

Известный
263
74
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
Перед залитием на гитхаб вручную поставить нужную кодировку, либо использовать другой хостинг.
 

madrasso

Потрачен
883
325
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

DolgorukovGTA

Известный
Проверенный
652
345
Добрый день, lua в данной кодировке CP1251, а github ставит кодировку utf-8, и после обновления появляются иероглифы в скрипте.
Можете помочь или подсказать как исправить данную проблему?
Lua:
local encoding = require 'encoding'
encoding.default = 'UTF-8'
u8 = encoding.CP1251

К примеру, тебе нужно вывести переменную text в sampAddChatMessage, ты используешь sampAddChatMessage(u8(text), -1).
 

Lun

Потрачен
175
35
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Как найти строку в чат логе?
 

SmithSaint

Участник
64
7
Как в сабменю обновлять значения после сохранения? В таблице конфига они обновляются, а в тексте нет!

Lua:
local menu = { -- диалоговое окно
    {
        title = 'Настройки',
        submenu = {
                title = details.tags.tagtwo,
            {
                title = not cfg.status.st1 and '1. Recconect при кике с сервера [{228B22}On{FFFFFF} / Off]' or '1. Recconect при кике с сервера [On / {B22222}Off{FFFFFF}]',
                onclick = function(menu,row)
                    cfg.status.st1 = not cfg.status.st1
                    menu[row].title = not cfg.status.st1 and '1. Recconect при кике с сервера [{228B22}On{FFFFFF} / Off]' or '2. Recconect при кике с сервера [On / {B22222}Off{FFFFFF}]'
                    return true
                end
            },
            {
                title = not cfg.status.st2 and '2. Recconect при рестарте сервера [{228B22}On{FFFFFF} / Off]' or '2. Recconect при рестарте сервера [On / {B22222}Off{FFFFFF}]',
                onclick = function(menu,row)
                    cfg.status.st2 = not cfg.status.st2
                    menu[row].title = not cfg.status.st2 and '2. Recconect при рестарте сервера [{228B22}On{FFFFFF} / Off]' or '2. Recconect при рестарте сервера [On / {B22222}Off{FFFFFF}]'
                    return true
                end
            },
            {
                title = '3. Пароль: {146A9F}'..cfg.autolog.password..'',
                onclick = function()
                    sampShowDialog(733, details.tags.tagfor, '{FFFFFF}Введите свой {146A9F}пароль, {FFFFFF}который будет вводиться при авторизации после Reconnect!', 'Сохранить', 'Назад', 1)
                    lua_thread.create(function()
                        while true do
                            wait(0)
                            local result, button, list, input = sampHasDialogRespond(733)
                            if result and button == 1 then
                                cfg.autolog.password = input
                                tabcfg.save(cfg, 'moonloader/MyReconPass.json')
                            elseif result and button == 0 then
                                sampShowDialog(777, details.tags.tagtw, zstring text, zstring button1, zstring button2, int style)
                            end
                        end
                    end)
                end
            },
            {
                title = '4. Задержка перед Reconnect: {146A9F}'..cfg.autolog.waiting..' ms',
                onclick = function()
                    sampShowDialog(735, details.tags.tagfiv, '{FFFFFF}Введите нужную {146A9F}задержку перед Reconnect, {FFFFFF}чтобы сервер смог впустить вас!\n{B22222}Нужно вводить время в милисекундах!', 'Сохранить', 'Назад', 1)
                    lua_thread.create(function()
                        while true do
                            wait(0)
                            local result, button, list, input = sampHasDialogRespond(735)
                            if result and button == 1 then
                                cfg.autolog.waiting = input:gsub("[^%d]+", "")
                                tabcfg.save(cfg, 'moonloader/MyReconPass.json')
                            end
                        end
                    end)
                end
            },
            {
                title = ' ',
            },
            {
                title = '{146A9F}Лог серверов',
                onclick = function()
                    _, id = sampGetPlayerIdByCharHandle(PLAYER_PED)
                    name = sampGetPlayerNickname(id):gsub('_', ' ')
                    sampShowDialog(782, details.tags.tagthr, '{FFFFFF}Добро пожаловать в раздел {FFA500}Лист серверов. {FFFFFF}Здесь вы увидите список серверов\nна которых работает скрипт. Сделал это для того, чтобы вы не забывали!\n \n\t\t\t\t{146A9F} Advance RP\n{FFFFFF}{B22222}Red Server - {FFFFFF}5.254.104.131\n{228B22}Green Server - {FFFFFF}5.254.104.132\n{FFA500}Yellow Server - {FFFFFF}5.254.104.133\n{00BFFF}Blue Server - {FFFFFF}5.254.104.135\nWhite Server - 5.254.104.136\n{8B4513}Chocolate Server - {FFFFFF}5.254.104.139\n \n\t\t\t\t{146A9F} Diamond RP\n{1F8F10}Emerald Server - {FFFFFF}194.61.44.61\n{202C3C}Trilliant Server - {FFFFFF}5.254.123.4\n{18537B}Crystal Server - {FFFFFF}194.61.44.64\n{394BB1}Sapphire Server - {FFFFFF}5.254.123.6\n{EB721E}Amber Server - {FFFFFF}194.61.44.67\nСоветую сделать {FFA500}скриншот (F8) {FFFFFF}или {FFA500}воспользоваться Dialog Editor{FFFFFF}, дабы быстро\nскопировать IP. Желаю удачи, {3A409D}'..name..'!', 'Понял', 'Назад', 0)
                end
            }
        },
    }
}