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

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
Lua:
require "lib.moonloader"
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local se = require'lib.samp.events'
local config = require "config"
local imgui = require 'imgui'
local key = require 'vkeys'
local tag = "{62E200}[ASHelper]: {FFFFFF}"
local chat = false
local idgive = false
local main_window_state = imgui.ImBool(false)
local playerID = imgui.ImBuffer(256)
local playerExpel = imgui.ImBuffer(256)
local licID = imgui.ImBuffer(256)
local checkbox1 = imgui.ImBool(false)
local checkbox2 = imgui.ImBool(false)
local isp_menu = imgui.ImBool(false)
local lic_menu = imgui.ImBool(false)
local other_menu = imgui.ImBool(false)
function imgui.OnDrawFrame()
  if main_window_state.v then
   
    imgui.SetNextWindowSize(imgui.ImVec2(540, 170), imgui.Cond.FirstUseEver)
    imgui.Begin('AutoSchool helper', main_window_state)
    imgui.InputText(u8'ID Игрока для манипуляций', playerID)
 
    imgui.Checkbox(u8'При нацеливание playerID заполняеться айди в того кого целитесь', checkbox2) -- для получения значения переменной hop использовать ключ .v, то бишь hop.v
    imgui.Checkbox(u8'PRICE LIST', isp_menu)
    imgui.Checkbox(u8'Продажа Лицензий', lic_menu)
    imgui.Checkbox(u8'Прочее', other_menu)
    imgui.Text(u8(string.format('Текущая дата: %s', os.date()))) -- u8 - это функция, её можно использовать и с неконстантными строками
    imgui.End()
  end
    if isp_menu.v then
        local ex, ey = getScreenResolution()
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(300, 170), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || PRICE LIST', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'PRICE LIST:\nНа авто: 10.000\nНа мото: 12.000\nНа рыбалку: 21.000\nВодный транспорт: 20.000\nОружие: 50.000(Требуеться Мед. карта\nОхота: 100.000\nНа распопки: 200.000\nНа полеты 20.000 (Сдавать в авиашколе)')
    imgui.End() -- конец окна
    end
    if lic_menu.v then
        local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
        local ex, ey = getScreenResolution()
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(400, 200), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || Продажа лицензий', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'При продаже лицензии на оружие нужно проверить мед. карту!')
        if imgui.Button(u8'Приставиться') then
            privet()
        end
        if imgui.Button(u8'Проверить мед. карту') then
            med(myid)
        end
        if imgui.Button(u8'Выдать лицензию') then
            licgive(playerID.v)
        end
        if imgui.Button(u8'Выдать лицензию (nonRP)') then
            sampSendChat('/givelicense '.. playerID.v)
        end
        if imgui.Button(u8'Пожелать хорошего дня') then
            sampSendChat('/todo Удачного вам дня*улыбнувшись посетителю')
        end
        imgui.Checkbox(u8'Писать при успешной покупки в чат пожелание', checkbox1)
    imgui.End() -- конец окна
    end
    if other_menu.v then
        local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED) -- получить свой ид
        local ex, ey = getScreenResolution()
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(200, 320), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || Прочее', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'По работе:')
        imgui.InputText(u8'Причина', playerExpel)
        if imgui.Button(u8'Выгнать из автошколы') then
            sampSendChat('/expel '.. playerID.v .. ' ' .. u8:decode(playerExpel.v))
        end
        if imgui.Button(u8'Рабочее портфолио') then
            sampSendChat('/jobprogress')
        end
        if imgui.Button(u8'Список во фракции(online)') then
            sampSendChat('/members')
        end
        if imgui.Button(u8'Посмотреть время') then
            sampSendChat('/time')
        end
        imgui.Text(u8'Другое:')
        if imgui.Button(u8'Меню') then
            sampSendChat('/mm')
        end
        if imgui.Button(u8'Настройки') then
            sampSendChat('/settings')
        end
        if imgui.Button(u8'Помощь') then
            sampSendChat('/help')
        end
        if imgui.Button(u8'Навигатор') then
            sampSendChat('/gps')
        end
        if imgui.Button(u8'Инвентарь') then
            sampSendChat('/invent')
        end
    imgui.End() -- конец окна
    end
end
function main()
  while true do
    wait(0)
    if wasKeyPressed(key.VK_X) then
        main_window_state.v = not main_window_state.v
    end
    imgui.Process = main_window_state.v
    local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE) -- получить хендл персонажа, в которого целится игрок
    if valid and doesCharExist(ped) then -- если цель есть и персонаж существует
        local result, id = sampGetPlayerIdByCharHandle(ped) -- получить samp-ид игрока по хендлу персонажа
    if result then -- проверить, прошло ли получение ида успешно
        if checkbox2.v  then
            playerID.v = tostring(id)
        end
  end
end
  end
end
function privet()
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Приветствую, я "' .. config.settings.rank .. '" данного лицензированного центра, чем могу вам помочь?')
        wait(1500)
        sampSendChat('/do На груди весит бейджик с надписью "' .. config.settings.rank .. ' - '.. config.settings.name .. '.')
        wait(500)
        sampAddChatMessage(tag .. "Выполнено!", 0xFFFF00)
    end)
end
function med(myid)
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Для получения лицензии на оружие покажите вашу мед.карту')
        wait(1000)
        sampSendChat('/b /showmc ' .. myid)
        wait(500)
        sampAddChatMessage(tag .. "Выполнено! Убедитесь что в Мед. карте написано 'Полностью здоровый(ая)'", 0xFFFF00)
    end)
end
function licgive(id)
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Секунду...')
        wait(1500)
        sampSendChat('/do На столе лежит печать и лицензия с бланком.')
        wait(1500)
        sampSendChat('/me берет со стола бланк и достает из кармана рубашки ручку')
        wait(1500)
        sampSendChat('/me заполняет бланк на получение лицензии')
        wait(1500)
        sampSendChat('/me начинает заполнять лицензию')
        wait(1500)
        sampSendChat('/do Лицензия заполнена.')
        wait(1500)
        sampSendChat('/me взял печать в руки и поставил оттеск с названием "ГЦЛ"')
        wait(1500)
        sampSendChat('/givelicense '.. id)
        wait(500)
        sampAddChatMessage(tag .. "Выполнено! Выберите нужную лицензию:", 0xFFFF00)
    end)
end


function se.onServerMessage(color, text)
    if checkbox1.v then
        if text:find('%+') then
            sampSendChat('/todo Удачного вам дня*улыбнувшись посетителю')
            sampAddChatMessage(tag .. "Клиент купил лицензию, деньги начислены.", 0xFFFF00)
        end
    end
end
Lua:
require "lib.moonloader"
local se = require 'samp.events'
local config = require "inicfg"
local imgui = require 'imgui'
local key = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8

local tag = "{62E200}[ASHelper]: {FFFFFF}"
local chat = false
local idgive = false

local main_window_state = imgui.ImBool(false)
local playerID = imgui.ImBuffer(256)
local playerExpel = imgui.ImBuffer(256)
local licID = imgui.ImBuffer(256)
local checkbox1 = imgui.ImBool(false)
local checkbox2 = imgui.ImBool(false)
local isp_menu = imgui.ImBool(false)
local lic_menu = imgui.ImBool(false)
local other_menu = imgui.ImBool(false)

local ex, ey = getScreenResolution()

function imgui.OnDrawFrame()
    local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if main_window_state.v then
        imgui.SetNextWindowSize(imgui.ImVec2(540, 170), imgui.Cond.FirstUseEver)
        imgui.Begin('AutoSchool helper', main_window_state)
        imgui.InputText(u8'ID Игрока для манипуляций', playerID)
    
        imgui.Checkbox(u8'При нацеливание playerID заполняеться айди в того кого целитесь', checkbox2)
        imgui.Checkbox(u8'PRICE LIST', isp_menu)
        imgui.Checkbox(u8'Продажа Лицензий', lic_menu)
        imgui.Checkbox(u8'Прочее', other_menu)
        imgui.Text(u8(string.format('Текущая дата: %s', os.date())))
        imgui.End()
    end
    if isp_menu.v then
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(300, 170), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || PRICE LIST', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'PRICE LIST:\nНа авто: 10.000\nНа мото: 12.000\nНа рыбалку: 21.000\nВодный транспорт: 20.000\nОружие: 50.000(Требуеться Мед. карта\nОхота: 100.000\nНа распопки: 200.000\nНа полеты 20.000 (Сдавать в авиашколе)')
        imgui.End()
    end
    if lic_menu.v then
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(400, 200), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || Продажа лицензий', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'При продаже лицензии на оружие нужно проверить мед. карту!')
        if imgui.Button(u8'Приставиться') then
            privet()
        end
        if imgui.Button(u8'Проверить мед. карту') then
            med(myid)
        end
        if imgui.Button(u8'Выдать лицензию') then
            licgive(playerID.v)
        end
        if imgui.Button(u8'Выдать лицензию (nonRP)') then
            sampSendChat('/givelicense '.. playerID.v)
        end
        if imgui.Button(u8'Пожелать хорошего дня') then
            sampSendChat('/todo Удачного вам дня*улыбнувшись посетителю')
        end
        imgui.Checkbox(u8'Писать при успешной покупки в чат пожелание', checkbox1)
        imgui.End()
    end
    if other_menu.v then
        imgui.ShowCursor = true
        imgui.SetNextWindowSize(imgui.ImVec2(200, 320), imgui.Cond.FirstUseEver)
        imgui.SetNextWindowPos(imgui.ImVec2(ex / 2 - 515, ey / 2 - 220), imgui.Cond.FirstUseEver)
        imgui.Begin(u8'AutoSchool Helper || Прочее', nil, imgui.WindowFlags.NoCollapse)
        imgui.Text(u8'По работе:')
        imgui.InputText(u8'Причина', playerExpel)
        if imgui.Button(u8'Выгнать из автошколы') then
            sampSendChat('/expel '.. playerID.v .. ' ' .. u8:decode(playerExpel.v))
        end
        if imgui.Button(u8'Рабочее портфолио') then
            sampSendChat('/jobprogress')
        end
        if imgui.Button(u8'Список во фракции(online)') then
            sampSendChat('/members')
        end
        if imgui.Button(u8'Посмотреть время') then
            sampSendChat('/time')
        end
        imgui.Text(u8'Другое:')
        if imgui.Button(u8'Меню') then
            sampSendChat('/mm')
        end
        if imgui.Button(u8'Настройки') then
            sampSendChat('/settings')
        end
        if imgui.Button(u8'Помощь') then
            sampSendChat('/help')
        end
        if imgui.Button(u8'Навигатор') then
            sampSendChat('/gps')
        end
        if imgui.Button(u8'Инвентарь') then
            sampSendChat('/invent')
        end
        imgui.End()
    end
end

function main()
    while true do
        wait(0)
        if wasKeyPressed(key.VK_X) then
            main_window_state.v = not main_window_state.v
        end
        imgui.Process = main_window_state.v
        local valid, ped = getCharPlayerIsTargeting(PLAYER_HANDLE)
        if valid and doesCharExist(ped) then
            local result, id = sampGetPlayerIdByCharHandle(ped)
            if result then
                if checkbox2.v then
                    playerID.v = tostring(id)
                end
            end
        end
    end
end

function privet()
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Приветствую, я "' .. config.settings.rank .. '" данного лицензированного центра, чем могу вам помочь?')
        wait(1500)
        sampSendChat('/do На груди весит бейджик с надписью "' .. config.settings.rank .. ' - '.. config.settings.name .. '.')
        wait(500)
        sampAddChatMessage(tag .. "Выполнено!", 0xFFFF00)
    end)
end

function med(myid)
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Для получения лицензии на оружие покажите вашу мед.карту')
        wait(1000)
        sampSendChat('/b /showmc ' .. myid)
        wait(500)
        sampAddChatMessage(tag .. "Выполнено! Убедитесь что в Мед. карте написано 'Полностью здоровый(ая)'", 0xFFFF00)
    end)
end

function licgive(id)
    lua_thread.create(function()
        sampAddChatMessage(tag .. "Выполняю...", 0xFFFF00)
        sampSendChat('Секунду...')
        wait(1500)
        sampSendChat('/do На столе лежит печать и лицензия с бланком.')
        wait(1500)
        sampSendChat('/me берет со стола бланк и достает из кармана рубашки ручку')
        wait(1500)
        sampSendChat('/me заполняет бланк на получение лицензии')
        wait(1500)
        sampSendChat('/me начинает заполнять лицензию')
        wait(1500)
        sampSendChat('/do Лицензия заполнена.')
        wait(1500)
        sampSendChat('/me взял печать в руки и поставил оттеск с названием "ГЦЛ"')
        wait(1500)
        sampSendChat('/givelicense '.. id)
        wait(500)
        sampAddChatMessage(tag .. "Выполнено! Выберите нужную лицензию:", 0xFFFF00)
    end)
end

function se.onServerMessage(color, text)
    if checkbox1.v and text:find('%+') then
        sampSendChat('/todo Удачного вам дня*улыбнувшись посетителю')
        sampAddChatMessage(tag .. "Клиент купил лицензию, деньги начислены.", 0xFFFF00)
    end
end
Ничего не менял практически. Все работает. Плюсик не видно потому что ты не возвращаешь его, так и должно быть.
 

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
В чём проблема?
Проблема в том что вы почему-то обижаетесь, что вам не помогли. Или мне показалось может что обиделись?
Сидел час думал, написал сюда, мне ничего толкового не сказали, решил за 5 минут сам.
Я и написал, что используйте "Код", а не скриншот который придется переписывать вручную.
 
  • Нравится
Реакции: deleted-user-443489

PanSeek

t.me/dailypanseek
Всефорумный модератор
908
1,775
Посмотреть вложение 104833

Я протестировал и с етой строчкой оно не работает если без то работает как решить?
Ну почему у меня работает, а у вас нет? Тестируете возможно на сервере по типу "ДМ" и т.п. Ибо там, насколько знаю, не используется onServerMessage
2021-07-11 14-01-47-589.png
 
  • Нравится
Реакции: deleted-user-443489

Pashyka

Участник
220
17
Ну почему у меня работает, а у вас нет? Тестируете возможно на сервере по типу "ДМ" и т.п. Ибо там, насколько знаю, не используется onServerMessage
Посмотреть вложение 104834



Lua:
repeat
    wait(0)
until sampIsLocalPlayerSpawned()
lua_thread.create(function()
    wait(1500)
    sampSendChat('/stats')
end)

Смотри че замутил, так работает, но не будет ли лишних ошибок?)
Попросил админа сделать спавн /stats больше не вводило, и это отлично
 

vegas

Известный
648
461
Код:
Parameters For MaterialText: UINT16 wObjectID, UINT8 MaterialType, UINT8 MaterialID, UINT8 MaterialSize, UINT8 fontNameLength, char fontName[], UINT8 FontSize, UINT8 Bold, UNIT32 FontColor, UNIT32 BackgroundColor, UNIT8 Align, CSTRING text[2048]
Мне для ракбота надо прочитать CSTRING text[2048], пробывал так bitStreamReadString(bs, bitStreamReadWord(bs)) но ничего не вышло, единственное что получилось сделать спустя несколько попыток это постоянный вывод буквы A или иероглифов
 

TSIDEX

Известный
83
8
Выручайте, нужно чтобы виджет всегда был вправом нижнем углу, как на минимальном разрешении, так и на максимальном. У меня только в противоположный подвинуть получилось.

Lua:
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2000, sh / 2000))
imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
gta_sa 2021-07-11 16-19-20-885.jpg
 

Fott

Простреленный
3,461
2,374
Код:
Parameters For MaterialText: UINT16 wObjectID, UINT8 MaterialType, UINT8 MaterialID, UINT8 MaterialSize, UINT8 fontNameLength, char fontName[], UINT8 FontSize, UINT8 Bold, UNIT32 FontColor, UNIT32 BackgroundColor, UNIT8 Align, CSTRING text[2048]
Мне для ракбота надо прочитать CSTRING text[2048], пробывал так bitStreamReadString(bs, bitStreamReadWord(bs)) но ничего не вышло, единственное что получилось сделать спустя несколько попыток это постоянный вывод буквы A или иероглифов
Надо читать все по очереди
Выручайте, нужно чтобы виджет всегда был вправом нижнем углу, как на минимальном разрешении, так и на максимальном. У меня только в противоположный подвинуть получилось.

Lua:
imgui.SetNextWindowPos(imgui.ImVec2(sw / 2000, sh / 2000))
imgui.SetNextWindowSize(imgui.ImVec2(200, 200), imgui.Cond.FirstUseEver)
Посмотреть вложение 104839
-1 попробуй
 

Shelok_Kholmes

Известный
400
54
Может кто-то подкинуть код для отслеживания изменения серверного времени и погоды?
 

Gorskin

♥ Love Lua ♥
Проверенный
1,332
1,164
Кто нибудь подскажите как работать с битстрим, нужны гайды. И как работать с входящей синхрой через битстрим, хочу сделать скрипт один, и ещё вопрос, как мне сделать так чтобы оружие персонажей в зоне стрима менялось например на фист? Т.е если у игрока в руках дигл и он стреляет то у меня бьет воздух. Делал такое через onPlayerSync(id, data) в итоге оружие менялось но когда игрок стрелял оружие появлялось снова и не пропадало.
Подниму
 

mzxer

Активный
83
119
Может кто-то подкинуть код для отслеживания изменения серверного времени и погоды?
Lua:
local ev = require("lib.samp.events")

function ev.onSetWeather(weatherId) -- выполняется при изменении погоды сервером. weatherId содержит в себе айди установленной погоды
    -- code
end

-- работа с временем. по аналогии с примером выше. думаю, описывать смысла нет, ибо название функций и переменных говорят за себя сами
function ev.onSetWorldTime(hour)
    -- code
end

function ev.onSetPlayerTime(hour, minute)
    -- code
end
 
  • Нравится
Реакции: Shelok_Kholmes