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

Cutler18

Известный
163
2
Lua:
local dialog_takelic = {
    {
        title = 'Глава 1. Использование общественного транспорта в личных целях',
            submenu = {
                {
                    title = '1.1. За использование общественного транспорта в личных целях. Штраф $1.000. Изъятие прав.',
                    onclick = function()
                        sampSendChat('/n '..id..' 1.1 АК')
                        wait(1000)
                        sampSendChat(name..' у Вас были изъяты права за использование государственного транспорта в личных целях.')
                        end
                    }
                }
            }
}

function daun(id)
local id = string.match(id, '(%d+)')
    if id ~= nil then
    lua_thread.create(function()
        name = sampGetPlayerNickname(id)
        name = sampGetPlayerNickname(id):gsub('_', ' ')
        submenus_show(dialog_takelic)
    end)
    else
    sampAddChatMessage("Используйте: /daun [id игрока]", 0x00FF00)
   end
end
Здравствуйте, в чем проблема, нужно чтобы в диалоге был тот ид который я укажу в /daun. Это не происходит. Если убрать ту строку - все работе. С ней - нет.
 

Albertio

Attention! Thanks for your attention.
887
717
Lua:
local dialog_takelic = {
    {
        title = 'Глава 1. Использование общественного транспорта в личных целях',
            submenu = {
                {
                    title = '1.1. За использование общественного транспорта в личных целях. Штраф $1.000. Изъятие прав.',
                    onclick = function()
                        sampSendChat('/n '..id..' 1.1 АК')
                        wait(1000)
                        sampSendChat(name..' у Вас были изъяты права за использование государственного транспорта в личных целях.')
                        end
                    }
                }
            }
}

function daun(id)
local id = string.match(id, '(%d+)')
    if id ~= nil then
    lua_thread.create(function()
        name = sampGetPlayerNickname(id)
        name = sampGetPlayerNickname(id):gsub('_', ' ')
        submenus_show(dialog_takelic)
    end)
    else
    sampAddChatMessage("Используйте: /daun [id игрока]", 0x00FF00)
   end
end
Здравствуйте, в чем проблема, нужно чтобы в диалоге был тот ид который я укажу в /daun. Это не происходит. Если убрать ту строку - все работе. С ней - нет.
Попробуй убрать local перед id, если не поможет, попробуй заменить if id ~= nil then на if id == nil then
 
  • Влюблен
Реакции: Cutler18

NHacker1271

Известный
156
16
Как через команду вывести значения в ini файле, в одну строчку? sampAddChatMessage
ini файл
[Config]
qwe=Привет
qwe=Как
qwe=Дела
 

Akionka

akionka.lua
Проверенный
740
502
Как через команду вывести значения в ini файле, в одну строчку? sampAddChatMessage
ini файл
[Config]
qwe=Привет
qwe=Как
qwe=Дела
Вообще так, но занятие бесполезное, потому что ключи хранятся в ini в рандомном порядке.
Lua:
local str = ''
for i, v in ipairs(iniTable) do
  str = str..' '..v
end
 

Dmitriy Makarov

25.05.2021
Проверенный
2,511
1,138
[ML] (error) test.lua: D:\GTA San Andreas Multiplayer\moonloader\test.lua:21: attempt to index local 'title' (a number value)
stack traceback:
D:\GTA San Andreas Multiplayer\moonloader\test.lua:21: in function 'callback'
что это значит?
либа евентс подключена
Lua:
function sampev.onShowDialog(dialogId, title, text, button1, button2, style)
    if title:find ("онлайн %d") then
        sampAddChatMessage("онлайн %d", -1)
    end
end
задумка такая: хочу получить кол-во игроков онлайн в финде через диалоговое окно
35911
 

Dmitriy Makarov

25.05.2021
Проверенный
2,511
1,138
как при вводе команды допустим "proverka" проверить /mn > Статистика > Твой ник, Организацию, Должность и записать их в переменные, чтобы дальнейшем в отыгровках использовать?
видел такое в АХК скриптах

ID /mn > 27
ID "Статистика" > 0
Текст который нужно получить в 0 ID:
"Имя: Nick_Name"
"Организация: Правительство" допустим
"Подразделение: Мэрия ЛС"
"Работа / должность: Охранник"
 

SheepShon

Известный
22
9
Добрый день, подскажите как взаимодействовать с пикапами? Когда заходишь в него открывался диалог например? Не нашёл статей на эту тему, если знаете киньте пожалуйста. И ещё если не трудно, есть где нибудь пак плагинов часто используемых? Хочу заставить работать исходник скрипта для МО)
 
Последнее редактирование:

Albertio

Attention! Thanks for your attention.
887
717
Добрый день, подскажите как взаимодействовать с пикапами? Когда заходишь в него открывался диалог например? Не нашёл статей на эту тему, если знаете киньте пожалуйста. И ещё если не трудно, есть где нибудь пак плагинов часто используемых?)
Lua:
function sampev.onSendPickedUpPickup()
-- тута любой код который тебе нужен, тот же самый диалог шов
end
 
  • Нравится
Реакции: SheepShon

SheepShon

Известный
22
9
Lua:
function sampev.onSendPickedUpPickup()
-- тута любой код который тебе нужен, тот же самый диалог шов
end

Это конечно, тоже интересно, но мне нужно было взаимодействие с созданными LUA пикапами, а на видео с серверными пикапами. Сори, что сразу не уточнил)
 

FBenz

Активный
328
40
Хочу создать педа. Женщину. Но создает стоящего сиджея почему-то:
Lua:
local peshPed = createChar(5, '#BFOST', x, y, z)
Что не так?
 

The Spark

frontend
Проверенный
703
724
Сорян за оффтоп. Я куда-то дел вертикальные линии функций в Атоме. Как их вернуть?
35929
35930
 

Petr_Sergeevich

Известный
Проверенный
707
298
Как можно скрыть дефолтную полоску хп и кислорода?
(Без помощи IEV)
 

штейн

Известный
Проверенный
1,002
688
Lua:
local response, err = httpRequest('POST', {'http://f0320362.xsph.ru/add.php', data = 'id='..random..'sum=1000'})
if err then error(err) end
requests.lua:153: No url specified for request
ЧЕ ЕМУ НАДО ОТ МЕНЯЯЯЯЯЯЯЯ


ещё попробовал:
Lua:
httpRequest("http://f0320362.xsph.ru/add.php", 'id='..random..'&sum=1000', function(response, code, headers, status)
    if response then
        print('OK', status)
    else
        print('Error', code)
    end
end)
Error Параметр задан неверно.
ну ало помогите спасите
 

FBenz

Активный
328
40
Попробуй во второй аргумент ID скина передать.
Пробовал, тогда выбивает ошибку, что неправильно используется функция.
Посмотрел в КЛЕО аналоги, сделал те же опкоды, получилось так:
Lua:
requestModel('#SWAT')
loadAllModelsNow()
local peshPed = createChar(23, '#SWAT', x, y, z)
Но все равно создает стоящего сиджея.


Upd: Разобрался. Может кому поможет, пример попробую добавить в описание функции:
В описании функции не было примера, но выглядеть использование должно так:
Lua:
requestModel(2) -- Запрашиваем модель педа (скин) с нужным id. В данном случае id скина - это скин Messer (Челик в панамке).
loadAllModelsNow() -- Загружаем все запрошенные модели
local resu = hasModelLoaded(2) -- Проверяем, загружена ли модель педа с нужным id.
if not resu then
    sampAddChatMessage('{6600FF}Fck u') -- Если нет, мы об этом узнаем
else
    local peshPed = createChar(4, 2, x, y, z) -- Если да, то создаем педа
    -- createChar(int поведение педа, int id загруженной модели, х, у, z)
    -- Модель обязательно должна быть загружена. Если нет, то создаст обычного сиджея.
    -- Поведение игрока (В данном случае 4 - пешеход муж. пола) определяет отношение к другим педам
end
 
Последнее редактирование: