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

Удалённый пользователь 448549

Гость
Lua:
-- https://www.blast.hk/threads/19148/
chars = {
    ["й"] = "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", ["Б"] = "<", ["Ю"] = ">"
}
message = '.рш'

function translite(text)
    for k, v in pairs(chars) do
        text = string.gsub(text, k, v)
    end
    return text
end

print(translite(message))
 

yoozee

Новичок
12
0
как сделать чтобы при активации скрипта на клавишу на экране писалось on или off
 

sep

Известный
714
79
как сделать чтобы при активации скрипта на клавишу на экране писалось on или off
printStringNow("~r~надпись", 100)

~r~ красный ~g~ зеленый
если очень просто то так
if isKeyDown(VK_MENU) and isKeyJustPressed(VK_1) then
sampSendChat("/mn")
printStringNow("~g~onn", 100)
end

вот более сложный вариант автор qdIbp
if isKeyDown(18) and isKeyJustPressed(114) then -- ALT+F3
if da then da = not da off() printStringNow("~r~Off", 1000) wait(50)
elseif not da then da = not da on() printStringNow("~g~ON", 1000) wait(50)
end
end
 
Последнее редактирование:

linmsqn

Известный
331
10
1639143174850.png
это текст в текстдраве 2051, как мне получить то, что после слова ID, то есть 365
 

S7XA

Активный
106
76
code::
local token = ('тут токен ')
local chatid = ('тут ид')
local link = ('https://api.vk.com/method/messages.send?peer_id=id&message..''/messages.send?chat_id=' .. chatid .. '&text=' )

local ansi_decode={ -- ниже смотрите
     [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
     [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
     [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
     [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
     [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
     [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
     [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
     [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
     [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
     [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
     [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
     local r, b = ''
     for i = 1, s and s:len() or 0 do
       b = s:byte(i)
       if b < 128 then
         r = r..string.char(b)
       else
      if b > 239 then
           r = r..'\209'..string.char(b - 112)
         elseif b > 191 then
           r = r..'\208'..string.char(b - 48)
         elseif ansi_decode[b] then
           r = r..ansi_decode[b]
         else
           r = r..'_'
         end
       end
     end
  return r
end

function getIp() -- получить свой айпи
    ip = openUrl('https://api.ipify.org/?format=json')

    return ip:match('{\"ip\":\"(.*)\"}')
end

function onSpawned(x)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    id = getBotId()
    money = getMoney()
    if (x > 1 and x < 3000) then
        printLog('[Розвідка України]: Вы появинилсь на ЖД Сан-Фиерро!')
        defCallAdd(2000, false, function()
            openUrl(AnsiToUtf8(link..'- Бот '..nick..'['..id..'] появился на ЖДСФ.%0AПароль: '..pass..'%0AДенег на руках: '..money..'$%0AСервер: '..drp..'%0AIP бота: '..getIp())) -- %0A перенос на новую строку
        end)
    end
end

function onPrintLog(str)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    money = getMoney()
    id = getBotId()
    if str:find('Server closed the connection') then
        openUrl(AnsiToUtf8(link .. '- Сервер закрыл соединение!%0A%0AНик: ' ..nick.. '['..id..']%0AСервер: '..drp))
    end
    if str:find('забанил игрока '..nick) then -- можно конечно сделать умнее. Но зачем ? :)
        openUrl(AnsiToUtf8(link..'- Бот был заблокирован.%0A%0AНик: '..nick..'%0AСервер:'..drp))
    end
    if str:find(' телепортировал Вас к себе') then
        openUrl(AnsiToUtf8(link .. '- Администратор телепортировал вас!%0A%0AНик: ' ..nick..'['.. id ..']%0AСервер: '..drp))
    end
end


[16:56:51.317730] (system) Session started.
[16:56:51.317730] (debug) Module handle: 65F80000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team
https://www.blast.hk/moonloader/

[16:56:51.318728] (info) Working directory: C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader
[16:56:51.318728] (debug) FP Control: 0009001F
[16:56:51.318728] (debug) Game: GTA SA 1.0.0.0 US
[16:56:51.318728] (system) Installing pre-game hooks...
[16:56:51.320722] (system) Hooks installed.
[16:56:51.900516] (debug) Initializing opcode handler table
[16:56:51.900516] (debug) package.path = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.lua;.\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.luac;.\?.luac
[16:56:51.900516] (debug) package.cpath = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.dll;
[16:56:51.902510] (system) Loading script 'C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua'...
[16:56:51.902510] (debug) New script: 01C1943C
[16:56:51.903507] (error) na.lua: ... комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua:3: ')' expected near ''/messages.send?chat_id=''
[16:56:51.903507] (error) na.lua: Script died due to an error. (01C1943C)
[16:56:53.249331] (system) Installing post-load hooks...
[16:56:53.249331] (system) Hooks installed.
[16:57:18.054018] (system) Unloading...
[16:57:18.064925] (system) Session terminated.

Что не так? В коде выше убрал токен и ид. Когда задавал вопрос.
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,234
12,656
code::
local token = ('тут токен ')
local chatid = ('тут ид')
local link = ('https://api.vk.com/method/messages.send?peer_id=id&message..''/messages.send?chat_id=' .. chatid .. '&text=' )

local ansi_decode={ -- ниже смотрите
     [128]='\208\130',[129]='\208\131',[130]='\226\128\154',[131]='\209\147',[132]='\226\128\158',[133]='\226\128\166',
     [134]='\226\128\160',[135]='\226\128\161',[136]='\226\130\172',[137]='\226\128\176',[138]='\208\137',[139]='\226\128\185',
     [140]='\208\138',[141]='\208\140',[142]='\208\139',[143]='\208\143',[144]='\209\146',[145]='\226\128\152',
     [146]='\226\128\153',[147]='\226\128\156',[148]='\226\128\157',[149]='\226\128\162',[150]='\226\128\147',[151]='\226\128\148',
     [152]='\194\152',[153]='\226\132\162',[154]='\209\153',[155]='\226\128\186',[156]='\209\154',[157]='\209\156',
     [158]='\209\155',[159]='\209\159',[160]='\194\160',[161]='\209\142',[162]='\209\158',[163]='\208\136',
     [164]='\194\164',[165]='\210\144',[166]='\194\166',[167]='\194\167',[168]='\208\129',[169]='\194\169',
     [170]='\208\132',[171]='\194\171',[172]='\194\172',[173]='\194\173',[174]='\194\174',[175]='\208\135',
     [176]='\194\176',[177]='\194\177',[178]='\208\134',[179]='\209\150',[180]='\210\145',[181]='\194\181',
     [182]='\194\182',[183]='\194\183',[184]='\209\145',[185]='\226\132\150',[186]='\209\148',[187]='\194\187',
     [188]='\209\152',[189]='\208\133',[190]='\209\149',[191]='\209\151'
}

function AnsiToUtf8(s)
     local r, b = ''
     for i = 1, s and s:len() or 0 do
       b = s:byte(i)
       if b < 128 then
         r = r..string.char(b)
       else
      if b > 239 then
           r = r..'\209'..string.char(b - 112)
         elseif b > 191 then
           r = r..'\208'..string.char(b - 48)
         elseif ansi_decode[b] then
           r = r..ansi_decode[b]
         else
           r = r..'_'
         end
       end
     end
  return r
end

function getIp() -- получить свой айпи
    ip = openUrl('https://api.ipify.org/?format=json')

    return ip:match('{\"ip\":\"(.*)\"}')
end

function onSpawned(x)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    id = getBotId()
    money = getMoney()
    if (x > 1 and x < 3000) then
        printLog('[Розвідка України]: Вы появинилсь на ЖД Сан-Фиерро!')
        defCallAdd(2000, false, function()
            openUrl(AnsiToUtf8(link..'- Бот '..nick..'['..id..'] появился на ЖДСФ.%0AПароль: '..pass..'%0AДенег на руках: '..money..'$%0AСервер: '..drp..'%0AIP бота: '..getIp())) -- %0A перенос на новую строку
        end)
    end
end

function onPrintLog(str)
    drp = getServerName()
    nick = getNickName()
    pass = getPassword()
    money = getMoney()
    id = getBotId()
    if str:find('Server closed the connection') then
        openUrl(AnsiToUtf8(link .. '- Сервер закрыл соединение!%0A%0AНик: ' ..nick.. '['..id..']%0AСервер: '..drp))
    end
    if str:find('забанил игрока '..nick) then -- можно конечно сделать умнее. Но зачем ? :)
        openUrl(AnsiToUtf8(link..'- Бот был заблокирован.%0A%0AНик: '..nick..'%0AСервер:'..drp))
    end
    if str:find(' телепортировал Вас к себе') then
        openUrl(AnsiToUtf8(link .. '- Администратор телепортировал вас!%0A%0AНик: ' ..nick..'['.. id ..']%0AСервер: '..drp))
    end
end


[16:56:51.317730] (system) Session started.
[16:56:51.317730] (debug) Module handle: 65F80000

MoonLoader v.026.5-beta loaded.
Developers: FYP, hnnssy, EvgeN 1137

Copyright (c) 2016, BlastHack Team

[16:56:51.318728] (info) Working directory: C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader
[16:56:51.318728] (debug) FP Control: 0009001F
[16:56:51.318728] (debug) Game: GTA SA 1.0.0.0 US
[16:56:51.318728] (system) Installing pre-game hooks...
[16:56:51.320722] (system) Hooks installed.
[16:56:51.900516] (debug) Initializing opcode handler table
[16:56:51.900516] (debug) package.path = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.lua;.\?.lua;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?\init.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?.luac;C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\?\init.luac;.\?.luac
[16:56:51.900516] (debug) package.cpath = C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\lib\?.dll;
[16:56:51.902510] (system) Loading script 'C:\Users\Следственный комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua'...
[16:56:51.902510] (debug) New script: 01C1943C
[16:56:51.903507] (error) na.lua: ... комитет\Desktop\GTA 130K BY DAPO SHOW\moonloader\na.lua:3: ')' expected near ''/messages.send?chat_id=''
[16:56:51.903507] (error) na.lua: Script died due to an error. (01C1943C)
[16:56:53.249331] (system) Installing post-load hooks...
[16:56:53.249331] (system) Hooks installed.
[16:57:18.054018] (system) Unloading...
[16:57:18.064925] (system) Session terminated.

Что не так? В коде выше убрал токен и ид. Когда задавал вопрос.
попробуй убрать скобки в первых 3 переменных
и тут ты забыл что-то вставить, либо не так вырезал
1639145645593.png
 

SHARLYBUTTOM

Известный
596
118
Как сделать что бы функция выполнялась бесконечно пока не будет прописана команда деактивации?
 

chapo

tg/inst: @moujeek
Всефорумный модератор
9,234
12,656
Как сделать что бы функция выполнялась бесконечно пока не будет прописана команда деактивации?
Lua:
local active = false -- включена ли по умолчанию

function main()
    while not isSampAvailable() do wait(0) end
    sampRegisterChatCommand('toggle_bebra', function()
        active = not active
        sampAddChatMessage('Флудер бебры '..(active and 'включен' or 'выключен'), -1)
    end)
    while true do
        wait(0)
        if active then
            sampSendChat('бебра')
            wait(2300)
        end
    end
end
 
  • Влюблен
Реакции: SHARLYBUTTOM

yoozee

Новичок
12
0
хелп почему когда у пишу mgui.InputText('Введите текст!', text_buffer) пишет нормально а когда пишу mgui.InputText(u8'Введите текст!', text_buffer) появляются иероглифы хотя должно быть наоборот

Lua:
script_name("imgui")
script_author("zabivnoy")
require('moonloader')
local imgui = require('imgui')
local encoding = require("encoding")
encoding.default = "CP1251"
u8 = encoding.UTF8
local main_window_state = imgui.ImBool(false)
local text_buffer = imgui.ImBuffer(256)
local checked_test = imgui.ImBool(false)
local checked_test_2 = imgui.ImBool(false)
local checked_radio = imgui.ImInt(1)
local combo_select = imgui.ImInt(0)
local arr_str = {"Салам", "test2", "test3"}
function main()
    if (not isSampLoaded() or not isSampfuncsLoaded() or not isCleoLoaded())then return end
    while (not isSampAvailable()) do wait(200) end
    sampRegisterChatCommand('zbind', function() main_window_state.v = not main_window_state.v print(main_window_state.v)end)
    sampRegisterChatCommand('check', cmd_check)
    while true do wait(0) --беск цикл отсутст.
        imgui.Process = main_window_state.v --процесс отсутст
    end
end
       
function cmd_check(arg)
    sampAddChatMessage(checked_radio.v, -1)
    if checked_test.v then sampAddChatMessage("Галочка стоит!", -1) end
    sampAddChatMessage(u8:decode(arr_str[combo_select.v +1]), -1)
end
function imgui.OnDrawFrame()
    sizeX, sizeY = getScreenResolution()--получение разр.экрана отсутст
    if main_window_state.v then print('+++')
        imgui.SetNextWindowSize(imgui.ImVec2(500, 300), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.Begin("Z-binder by zabivnoy", main_window_state)
            imgui.Text("z-binder")
            imgui.InputText('Введите текст!', text_buffer) --отсутст u8
            x, y, z = getCharCoordinates(PLAYER_PED)
            imgui.Text("Ваша позиция: X:" .. math.floor(x) .. "  | Y: " .. math.floor(y) .. " | Z: " .. math.floor(z))
            imgui.Text(text_buffer.v)
            imgui.SetCursorPosY(120)
            imgui.Separator()
            imgui.SetCursorPosY(140)
            imgui.Text("Это наша выборка")
            imgui.SameLine()
            imgui.SetCursorPosX(200)
            imgui.Checkbox("Checkbox 1", checked_test)
            imgui.SameLine()
            imgui.Checkbox("Checkbox 2", checked_test_2)
            imgui.SetCursorPosY(180)
            imgui.Separator()
            imgui.RadioButton("Radio 1", checked_radio, 3)
            imgui.SameLine()
            imgui.RadioButton("Radio 2", checked_radio, 4)
            imgui.SameLine()
            imgui.RadioButton("Radio 3", checked_radio, 5)
            imgui.PushItemWidth(120)
            imgui.SetCursorPosY(250)
            imgui.SetCursorPosX(200)
            imgui.Combo("Combo 1", combo_select, arr_str, #arr_str)
        imgui.End()
    end
end

можете заменить плиз чтобы не в чат писалось Script ON/Script OFF а на экране показывалось on или off

Lua:
script_name("capture dro4er")
script_author("zabivnoy")
require 'lib.moonloader'
local state = false
local main_color = 0xFF00FF
local main_color_text = "{FF00FF}"
local white_color = "{FFFFFF}"
function zab()
   while true do
       wait(0)
         VK_M = 0x4D
         VK_L = 0x4C
        if isKeyDown(0x4D) and isKeyJustPressed(0x4C) then
            if not sampIsChatInputActive() and not sampIsDialogActive() then
                state = not state 
                sampAddChatMessage('[Capture dro4er] '  .. (state and '{00FF00}Script ON' or '{FF0000}Script OFF'), 0x6B8E23)
            end
        end
    end
end
function main()
while true do
     wait(0)
     if state then
       sampSendChat("/capture")
     end
    end
end
lua_thread.create(zab)
 
Последнее редактирование:

chapo

tg/inst: @moujeek
Всефорумный модератор
9,234
12,656
Как узнать загружен ли определенный аси или сф плагин? Типо аналог SF->isPluginLoaded();