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

Luis_Mora

Участник
31
1
Помогите написать регулярку для этой строки, уже устал бороться с тем что хватает второе двоеточие и ставить текст не там где надо.



[01:30:45] Капитан Nick_Name: [Тэг] Text

Мне из этого нужно выделить три разные части, До ника, Сам ник, и после него.
Честно не помню, добавь сам команду на удаление по ID.
Что за скрипт которым ты определяешь ID. Я забыл уже её. Вообще она вроде как через консоль команды воспринимает.
 
Последнее редактирование:

moreveal

Известный
Проверенный
927
621
Помогите написать регулярку для этой строки, уже устал бороться с тем что хватает второе двоеточие и ставить текст не там где надо.
Lua:
str = 'Капитан Nick_Name: [Тэг] Text'
local position, name, tag, text = str:match('(.+) (.+)%: %[(.+)%] (.+)')
 

Deniska.lua

Участник
43
0
Как сделать пример: пишу команду /full ID текст, пишет в чат /ban ID текст.

Lua:
sampRegisterChatCommand("full", fullopra)

function fullopra(arg)
    full = tonumber(arg)
    if not full then sampAddChatMessage("{dbd814}[Подсказка] • {ffffff}Введите: /full [id] и Причину", -1) return end
        sampSendChat("/ban ID Text")
        reconid = full
end
 

G W

Участник
141
5
Хотел сделать hotkey и такое

attempt to call field 'callback' (a nil value) stack traceback: UPD: Неактуально
 
Последнее редактирование:

Dmitriy Makarov

25.05.2021
Проверенный
2,505
1,134
Как сделать пример: пишу команду /full ID текст, пишет в чат /ban ID текст.

Lua:
sampRegisterChatCommand("full", fullopra)

function fullopra(arg)
    full = tonumber(arg)
    if not full then sampAddChatMessage("{dbd814}[Подсказка] • {ffffff}Введите: /full [id] и Причину", -1) return end
        sampSendChat("/ban ID Text")
        reconid = full
end
Lua:
-- function main()
sampRegisterChatCommand("full", function(param)
    local id, text = string.match(param, "(%d+) (.+)")
    if id == nil or id == "" then
        sampAddChatMessage("{dbd814}[Подсказка] • {ffffff}Введите: /full [ID] [Причина]", -1)
    else
        sampSendChat("/ban "..id.." "..text)
        reconid = full
    end
end)
Вродь так.)
 
  • Нравится
Реакции: Deniska.lua

Gorskin

♥ Love Lua ♥
Проверенный
1,343
1,182
Крч, у меня вопрос к знатокам.
Мне надо сделать отображение диалога по команде, дайте пожалуйста пример в
Код:
 

Alessandro Arabella

Новичок
4
2
как сделать проверку на то, есть ли игрок в зоне стрима?

Lua:
sampRegisterChatCommand('zona', function(arg)
if #arg ~= 0 then
local result, handle = sampGetCharHandleBySampPlayerId(tonumber(arg))
if result then
sampAddChatMessage('Игрок с ID: '..arg..' в зоне стрима.')
end end end)
-- Скорее всего допустил много ошибок в написании функций, т.к писал без подсказок, но это работает.
sampGetChatHandleBySampPlayerId, если он найдет его чар, значит он в зоне стрима
Крч, у меня вопрос к знатокам.
Мне надо сделать отображение диалога по команде, дайте пожалуйста пример в
Код:
Тут есть кучу примеров..
 
  • Нравится
Реакции: Gorskin и корбус

D.Makarov

Участник
146
3
Ребята подскажите тема с sampSendClickTextdraw уже не актуальна типо когда хп себе давали через это
 

Viem

Известный
49
5
Нужна функция которая преобразует русский текст в англ.

Привет - ghbdtn
ьутг - menu

И тому подобное.


upd написал , может кому надо будет

Lua:
function string_ru_to_en(str)
    local russian_to_english = {
        ['й'] = 'q', ['ц'] = 'w', ['у'] = 'e', ['к'] = 'r', ['е'] = 't', ['н'] = 'y', ['г'] = 'u', ['ш'] = 'i', 
        ['щ'] = 'o', ['з'] = 'p', ['х'] = '[', ['ъ'] = ']', ['ф'] = 'a', ['ы'] = 's', ['в'] = 'd', ['а'] = 'f', 
        ['п'] = 'g', ['р'] = 'h', ['о'] = 'j', ['л'] = 'k', ['д'] = 'l', ['ж'] = ';', ['э'] = '\'', ['я'] = 'z', 
        ['ч'] = 'x', ['с'] = 'c', ['м'] = 'v', ['и'] = 'b', ['т'] = 'n', ['ь'] = 'm', ['б'] = ',', ['ю'] = '.',
        ['Й'] = 'Q', ['Ц'] = 'W', ['У'] = 'E', ['К'] = 'R', ['Е'] = 'T', ['Н'] = 'Y', ['Г'] = 'U', ['Ш'] = 'I', 
        ['Щ'] = 'O', ['З'] = 'P', ['Х'] = '{', ['Ъ'] = '}', ['Ф'] = 'A', ['Ы'] = 'S', ['В'] = 'D', ['А'] = 'F', 
        ['П'] = 'G', ['Р'] = 'H', ['О'] = 'J', ['Л'] = 'K', ['Д'] = 'L', ['Ж'] = ':', ['Э'] = '"', ['Я'] = 'Z', 
        ['Ч'] = 'X', ['С'] = 'C', ['М'] = 'V', ['И'] = 'B', ['Т'] = 'N', ['Ь'] = 'M', ['Б'] = '<', ['Ю'] = '>',
        ['.'] = '/', [','] = '?',
    }
    local array_string = stringToArray(str)
    local string_eng = ''


    for i = 1, #array_string do
        if russian_to_english[array_string[i]] then
            string_eng = string_eng .. russian_to_english[array_string[i]]
        else
            string_eng = string_eng .. array_string[i]
        end
    end
    return string_eng

end
 
Последнее редактирование:

wulfandr

Известный
636
260
Нужна функция которая преобразует русский текст в англ.

Привет - ghbdtn
ьутг - menu

И тому подобное.
 

Viem

Известный
49
5
Напиши её, сделай таблицу, где русская А = анг. А и тд, ипреобразуй, это самый легкий способ
Знаю,просто где-то видел таблицу, думал быстрее найти чем написать, но по итогу ошибся
Как проверить букву на регистр, верхний/нижний
Хочу сделать возможность переноса чата, кто нибудь пытался это сделать?)
 
Последнее редактирование:

TWP

Участник
53
1
Народ, есть таблица в которой есть id игрока, ник игрока, через onShowDialog всё это уже нашёл, вопрос след.
Как получить имя игрока? К примеру когда пишешь команду /e id, скрипт находит id игрока и берёт с диалога ник
 

|| NN - NoName ||

Известный
1,049
635
Народ, есть таблица в которой есть id игрока, ник игрока, через onShowDialog всё это уже нашёл, вопрос след.
Как получить имя игрока? К примеру когда пишешь команду /e id, скрипт находит id игрока и берёт с диалога ник
Если я правильно понял, то через фор читаешь каждую строчку. И через патерны узнаешь Ник и ИД и потом справниваешь ид