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

Rental

Участник
60
1
Это что бы можно было менять размер, если хочешь что бы нельзя было - ставь 0
Если менять не нужно - просто не пиши это функцию. Врятли создатель по фану ввел сюда два допустимых значения - 0 и Cond.FirstUseEver.
Что делает этот параметр и что обозначает эта переменная?
Lua:
imgui.SetNextWindowSize(imgui.ImVec2(150, 200), imgui.Cond.FirstUseEver) -- меняем размер
 
Последнее редактирование:

штейн

Известный
Проверенный
1,001
687
Lua:
cl = {'800080', '0000FF', 'FFFF00', '0000FF', '008000'}
есть у меня таблица, как мне с этой таблицы рандомно вытащить только одно значение?
 

#Northn

Police Helper «Reborn» — уже ШЕСТЬ лет!
Всефорумный модератор
2,636
2,486
Lua:
cl = {'800080', '0000FF', 'FFFF00', '0000FF', '008000'}
есть у меня таблица, как мне с этой таблицы рандомно вытащить только одно значение?
Lua:
math.randomseed(os.time())
print(cl[math.random(1, #cl)])
 
  • Нравится
Реакции: штейн

штейн

Известный
Проверенный
1,001
687
Lua:
function blinkSettings(sec)
    if #sec > 0 then
        math.randomseed(os.time()) col = math.random(1, 11) col2 = math.random(1, 11) col3 = math.random(1, 11)
        if #sec > 5000 and #sec < 120000 then
            sec = sec * 1000
            sampAddChatMessage("Вы{"..cl[col].."} успешно {ffffff}изменили задержку для {"..cl[col2].."}blinkColors {ffffff}на {"..cl[col3].."}"..sec.."{ffffff} секунд.", -1)
            zader = sec ^ 1000
        else
            sampAddChatMessage("Не меньше {"..cl[col].."}5 {ffffff}секунд и не больше {"..cl[col2].."}2 {ffffff}минут. Рекомендуемо - {"..cl[col3].."}5 {ffffff}секунд.", -1)
        end
    else
        sampAddChatMessage("Чтобы изменить задержку используйте - {"..cl[col].."}[ /sblink {"..cl[col2].."}sec ]{ffffff}.", -1)
    end
end
че бы не написал - выдаёт sampAddChatMessage("Не меньше {"..cl[col].."}5 {ffffff}секунд и не больше {"..cl[col2].."}2 {ffffff}минут. Рекомендуемо - {"..cl[col3].."}5 {ffffff}секунд.", -1)
 

imring

Ride the Lightning
Всефорумный модератор
2,354
2,516
Lua:
function blinkSettings(sec)
    if #sec > 0 then
        math.randomseed(os.time()) col = math.random(1, 11) col2 = math.random(1, 11) col3 = math.random(1, 11)
        if #sec > 5000 and #sec < 120000 then
            sec = sec * 1000
            sampAddChatMessage("Вы{"..cl[col].."} успешно {ffffff}изменили задержку для {"..cl[col2].."}blinkColors {ffffff}на {"..cl[col3].."}"..sec.."{ffffff} секунд.", -1)
            zader = sec ^ 1000
        else
            sampAddChatMessage("Не меньше {"..cl[col].."}5 {ffffff}секунд и не больше {"..cl[col2].."}2 {ffffff}минут. Рекомендуемо - {"..cl[col3].."}5 {ffffff}секунд.", -1)
        end
    else
        sampAddChatMessage("Чтобы изменить задержку используйте - {"..cl[col].."}[ /sblink {"..cl[col2].."}sec ]{ffffff}.", -1)
    end
end
че бы не написал - выдаёт sampAddChatMessage("Не меньше {"..cl.."}5 {ffffff}секунд и не больше {"..cl[col2].."}2 {ffffff}минут. Рекомендуемо - {"..cl[col3].."}5 {ffffff}секунд.", -1)
Lua:
if #sec > 5000 and #sec < 120000 then
длина строки не меньше 5000 и не больше 120000? :thinking:
 

штейн

Известный
Проверенный
1,001
687
Lua:
if #sec > 5000 and #sec < 120000 then
длина строки не меньше 5000 и не больше 120000? :thinking:
ну блин мне нужно чтобы sec был не меньше 5000 и не больше 120000 ты же понял ну(((
udp: всё исправил соре за тупость просто я даун вот)))
 
Последнее редактирование:

ШPEK

Известный
1,476
525
Как использовать несколько аргументов из одной команды? Например:


Я прописал /givegun 45 999,
Проходит РП отыгровка...
Потом сам скрипт пишет /givegun 45 999
 

Aniki

🐰
Администратор
1,225
1,506
Sorry за тупой вопрос, но что делает "return"?
если аргументы для функции отсутствуют или не соответствуют нужной форме, то функция таким образом завершается. Перед return можешь выводить сообщение о том, как использовать команду например
 
  • Нравится
Реакции: ШPEK

ШPEK

Известный
1,476
525
если аргументы для функции отсутствуют или не соответствуют нужной форме, то функция таким образом завершается. Перед return можешь выводить сообщение о том, как использовать команду например
А почему в образце не просто "return", а "return false"?
 

samespoon

Известный
163
20
Подскажите, как можно использовать в части кода другую кодировку?
 

T1cKz

Известный
596
246
Плес функцию для проверки координат в зоне?
Например: поставлен чекпоинт в координаты 10.0, 20.0
И есть зона aX -10.0,aY -20.0, bX 25.0, bY 30.0 квадратная, и вот нужно проверить, есть ли в этой зоне эта переменная координат
 

AnWu

Guardian of Order
Всефорумный модератор
4,689
5,196
По сути то никак, но ты можешь писать сообщения на 1251, и сохранять файл в UTF-8.
В начало.
Lua:
encoding.default = 'CP1251' -- указываем кодировку по умолчанию, она должна совпадать с кодировкой файла. CP1251 - это Windows-1251
u8 = encoding.UTF8 -- и создаём короткий псевдоним для кодировщика UTF-8

Пример:
Lua:
imgui.Begin(u8'HELLO!', show_menu, 64)
Наоборот. Сообщение в и файл в Windows-1251, а вот в нужном место просто форматировать текст под нужную кодировку.
ПС: Пример первый, понятие нет