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

MrCold

Активный
364
118
Так сделай не через регистрацию, кто мешает

Негласное правило: "Спасибо = Мне нравится". Какая помощь тебе нужна? Что конкретно тебе не понятно?


Тврщи такой вопрос. Что означает Model pedtype в функции:
Lua:
Ped ped = createCharInsideCar(Vehicle car, Model pedtype, int model)
С int model все ясно - скин. А педтип? Где его взять и как указать?
Или я что-то путаю?))
На анлго-язычной версии:
Pedestrian types are groups that define the relationship between different pedestrians. For San Andreas the default type for each pedestrian is defined inside the peds.ide file. The type is also an additional parameter of the character-spawning opcodes (009A and similar)

Подробнее о самой функции можешь узнать тут https://gtamods.com/wiki/CREATE_CHAR_INSIDE_CAR
 
  • Нравится
Реакции: FBenz

FBenz

Активный
328
40
На анлго-язычной версии:
Pedestrian types are groups that define the relationship between different pedestrians. For San Andreas the default type for each pedestrian is defined inside the peds.ide file. The type is also an additional parameter of the character-spawning opcodes (009A and similar)

Подробнее о самой функции можешь узнать тут https://gtamods.com/wiki/CREATE_CHAR_INSIDE_CAR
Я затупил, это поведение педа)) Все, пасибо, плюсик в карму накинул)_))
 

Cutler18

Известный
160
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.
877
702
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
Проверенный
742
500
Как через команду вывести значения в 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,478
1,113
[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,478
1,113
как при вводе команды допустим "proverka" проверить /mn > Статистика > Твой ник, Организацию, Должность и записать их в переменные, чтобы дальнейшем в отыгровках использовать?
видел такое в АХК скриптах

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

SheepShon

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

Albertio

Attention! Thanks for your attention.
877
702
Добрый день, подскажите как взаимодействовать с пикапами? Когда заходишь в него открывался диалог например? Не нашёл статей на эту тему, если знаете киньте пожалуйста. И ещё если не трудно, есть где нибудь пак плагинов часто используемых?)
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

Известный
653
671
Сорян за оффтоп. Я куда-то дел вертикальные линии функций в Атоме. Как их вернуть?
35929
35930
 

Petr_Sergeevich

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