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

imring

Ride the Lightning
Всефорумный модератор
2,357
2,524
У тебя args в локальной переменной testsu вызывается выше, чем функция sut, в которой используется args. Попробуй сделать глобальную переменную aargs = args и как-то выкрутится, что бы локальная переменная была ниже функции sut(args)
Перед таблице testsu
Lua:
args = -1
разве не можно так?
Lua:
function testsu(args)
  return {
    {
      title = 'воорнап',
      onclick = function()
        sampAddChatMessage("/su "..args.." 6 воорнап", -1)
      end
    }
  }
end

submenus_show(testsu(pID), "Выдать розыск "..sampGetPlayerNickname(pID))
 
  • Нравится
Реакции: AnWu

imring

Ride the Lightning
Всефорумный модератор
2,357
2,524
тогда какой бы я ид не указал будет
сделай функцию.
разве не можно так?
Lua:
function testsu(args)
  return {
    {
      title = 'воорнап',
      onclick = function()
        sampAddChatMessage("/su "..args.." 6 воорнап", -1)
      end
    }
  }
end

submenus_show(testsu(pID), "Выдать розыск "..sampGetPlayerNickname(pID))
 

trefa

Известный
Всефорумный модератор
2,097
1,233
Lua:
Fnick, ip1, Snick, ip2 = string.match(text, '^%[A%] (.*)%[.+%]%[(%d+.%d+.%d+.%d+)%].+%(.*)%[.+%][(%d+.%d+.%d+.%d+)%]')
Почему вместо Snick ловит ip2 и дальше?
Вот пример строки
Код:
[A] Velera Pypok[107][88.201.214.138] аварв авыа Artem Bickers[63][87.76.339.155]
Нужно ловить оба ника и оба айпи.
Lua:
^%[A%] (.*)%[%d+%]%[(%d+.%d+.%d+.%d+)%].*%s(%a+%s%a+)%[%d+%]%[(%d+.%d+.%d+.%d+)%]
 
  • Нравится
Реакции: Patrickkk

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,643
2,493
Почему то где ip2 не видит и nil возвращает.
[A] Velera_Pypok[107][88.201.214.138] аварв авыа Artem_Bickers[63][87.76.339.155]
Lua:
local nick1, id1, ip1, text, nick2, id2, ip2 = text:match('%[A%] (%a+_%a+)%[(%d+)%]%[(%S+)%](.+)(%a+_%a+)%[%d+%]%[(%S+)%]')
Не поможет - кидай строку ПРЯМО из чатлога.
UPD: Второй ник вряд ли получится взять, потому что там нет какой-либо скобки, отделяющей обычный текст от ника, по этому:
Lua:
local id1, ip1, id2, ip2 = text:match('%[A%] .+%[(%d+)%]%[(%S+)%].+%[(%d+)%]%[(%S+)%]')
И далее уже по ID определять ник.

%S+ достаточно.
 
Последнее редактирование:
  • Нравится
Реакции: Patrickkk

WhackerH

Новичок
43
0
у меня есть зареганная команда /st, мне нужно когда я ввожу /st id в чат писало.
/m Водитель Т/C ''название авто в котором сидит ид'' с гос.номером [EVL[сам id]X], прижмитесь к обочине и остановите своё Т/С
как получить само название авто?
 

#Northn

Pears Project — уже запущен!
Всефорумный модератор
2,643
2,493
у меня есть зареганная команда /st, мне нужно когда я ввожу /st id в чат писало.

как получить само название авто?
Lua:
if isCharInAnyCar(playerPed) then
    peds = getAllChars()
    if peds ~= nil then
        for _, hm in pairs(peds) do
            _ , id = sampGetPlayerIdByCharHandle(hm)
            _ , m = sampGetPlayerIdByCharHandle(PLAYER_PED)
            if id ~= -1 and id ~= m and doesCharExist(hm) and sampIsPlayerConnected(id) then
                local x, y, z = getCharCoordinates(hm)
                local mx, my, mz = getCharCoordinates(PLAYER_PED)
                local dist = getDistanceBetweenCoords3d(mx, my, mz, x, y, z)
                local color = string.format("%06X", ARGBtoRGB(sampGetPlayerColor(hm)))
                if dist <= 55 then
                    if isCharInAnyCar(hm) then
                        if color ~= '0066FF' and color ~= '6666FF' and color ~= 'F4A460' and color ~= 'FF6666' and color ~= 'FFCC66' and color ~= '000080' and color ~= '333300' and color ~= '00CC99' and color ~= '339966' then
                            if storeCarCharIsInNoSave(hm) ~= storeCarCharIsInNoSave(playerPed) then
                                if isCharInCarDriver(hm) then
                                    carh = storeCarCharIsInNoSave(hm)
                                    nameofcar = getNameOfVehicleModel(getCarModel(carh))
                                    _ , idofplayercar = sampGetPlayerIdByCharHandle(hm)
                                    sampSendChat(string.format("/m Водитель транспорта %s под номером %d. ", nameofcar, idofplayercar))
                                    wait(3500)
                                    sampSendChat('/m Прижмите своё транспортное средство к обочине! ')
                                    break
                                end
                            end
                        end
                    end
                end
            end
        end
    else
        sampAddChatMessage("[ PHELP ]{ffffff}: Не найден ни один игрок в зоне прорисовки для объявления в мегафон.", 0x0088ff)
        sampAddChatMessage("[ PHELP ]{ffffff}: Для объявления в мегафон о нарушении вам необходимо быть не более 50 метров от нарушителя.", 0x0088ff)
    end
else
    sampAddChatMessage("[ PHELP ]{ffffff}: Вам необходимо сидеть в транспорте правоохранительных органов.", 0x0088ff)
end

function isCharInCarDriver(ped)
    return isCharInAnyCar(ped) and getDriverOfCar(storeCarCharIsInNoSave(ped)) == ped
end
Меняй под себя и используй.
 

loverBoy

Новичок
29
0
  • А можно как-то узнать ТП-хнуло ли игрока или нет?

  • В events не могу найти.

  • Вот если к примеру сервер ТПхает человека с машиной на какие-то координаты
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,140
4,759
  • А можно как-то узнать ТП-хнуло ли игрока или нет?

  • В events не могу найти.

  • Вот если к примеру сервер ТПхает человека с машиной на какие-то координаты
Можно попробовать юзать findAllRandomCharsInSphere и если координаты игрока значительно меняются, то оповестить. Но это явно сырая идея, ибо если игрока тепнут вне зоны стрима, то это будет сложнее отличить от обычного выхода из зоны стрима.
 

MrCreepTon

Неизвестный
Всефорумный модератор
2,140
4,759
Уточню* Локального игрок.
Тут сложнее сделать, но по идее можно сделать 2 проверки на местоположение игрока с разными переменными где-то с разницей в 1 секунду или как-то так. Далее узнать расстояние между этими коордами. Если оно превышает какое-либо значение, то оповестить о телепорте.
 

WhackerH

Новичок
43
0
есть команда /tl, мне нужно что бы когда я вводил /tl [id] [1-3] писало:
1 - /sms [id] lspd
2 - /sms [id] sfpd
3 - /sms [id] lvpd
а если я не ввожу число после ида или число больше трех выскакивало предупреждение.
Как это сделать?
 

Adventurer

Известный
151
69
Нужно как-то проверить есть ли игрок с определённым ником на сервере, через /id не вариант, ибо будет выводить это всё в чат, а мне надо по тихому это всё делать, какие есть варианты?
Перебирать всех игроков в табе и сравнивать ник.