Добро пожаловать: Гость
  • Главная страница
  • /
  • Форум
  • /
  • Болталка
  • /
  • Косплей на Дастана
  • Косплей на Дастана
    15 апреля 2020 г, 00:13
    Kranvagn

    Модератор

    Рейтинг: 575

    Сообщений: 135

    Спасибок: 88

    Короче, решил я как-то позаниматься этой темой, созданием плагинов на каеску. Решил довольно давно, но руки дошли только когда увидел "Roll" на сервере. Подумал, это изичи, щя повторю на легчайшичах. Как же я ошибся. Короче, кому интересно, как устроены плагины (или как я пытаюсь создать жалкую пародию), вам сюда, может кому-то понравится.

    Будет много непонятного, но я попытаюсь разжевать. Наслаждайтесь xD

    Этап 1. Где это всё писать?

    Это был мой первый вопрос, с которым я полетел в ютубчик. В первом же гайде чел писал код в Notepad++(тру хардкор). Но чё, открываем, создаём документ, выставляем синтаксис и всю остальную шелупонь.

    Вообще, по идеи надо, чтобы было UTF-8 без BOM, но такого нет, берём самое приближенное. Синтаксис чисто для подсветки.

    Этап 2. Что теперь здесь писать?

    Решив писать Roll, я сразу же начал писать его, будто пишу на С++. Угу, до свидания. Не всё так просто. Здесь не С++, а что-то именуемое Pawn (рыли, сам не ждал). Ну да пофиг, от плюсов особо не отличается.

    Короче, покопав немного форумы и видосики, положил начало скрипту.

    public plugin_init()
    {
        register_plugin("RollSystem", "Kranvagn", "1.0")
        register_clcmd("say /roll", "roll")
    }

    По строчке (кста да, пока вставлял код, Ctrl + S нажал дважды, программисты поймут):

    public plugin_init()

    Создание начальной функции, в которой будут оглашены все наши команды. Все, что охвачено фигурными скобочками - тело функции, код, что будет выполнятся. public означает, что к функции имеется доступ с любой точки кода. Есть ещё несколько таких штук (кста, называется эта шняга модификатор доступа). 

    register_plugin("RollSystem", "Kranvagn", "1.0")

    Регистрация плагина, юзлесс тема, но покрасоватся можно. Первое поле - это название плагина, потом - автор, затем - версия. 

    register_clcmd("say /roll", "roll")

    Регистрируем команду, которую будем вызывать из чата. Первое поле - консольная команда для использования плагина (кто не вкурсе, say - это команда вывода сообщения в чат в ксОчке), второе - фукнция в коде, что будет выполнять плагин (опять нажал Ctrl + S, как хорошо, что "не найден элемент формы").

    Окей, с началом разобрались.

    Дальше я сразу захотел написать логику для плагина, поэтому го. (думал сначала накидать своего вырвиглазного кода до того, как у меня получилось, но понял, что его нет и рядом блевательного ведра тоже нет)

    public roll(id)
    {
         if(finishPoint == 0)
             finishPoint = 100
         new rollResult = random_num(0, finishPoint)
         new userName[32
         get_user_name(id, userName, 31)
         ColorChat(0, GREEN, "%s генерирует случайное число[0-%d]: %d", userName, finishPoint, rollResult)
    }

    Новая функция, здесь описана логика работы плагина. Тут непосредственно финальные приготовления и вывод результата. Жую:

    public roll(id)

    Создаем функцию, называем её roll, в скобочках список аргументов, что принимает функция, в нашем случае это айди игрока. Вообще, как я понял, это дефолтный аргумент, айди всегда будет приходить автоматически, его не придётся доставать и передавать самостоятельно.

    if(finishPoint == 0)
             finishPoint = 100

    Дословно: если finishPoint равно 0, установить значение finishPoint 100. Это оператор условия, очень полезная штука кста, да. Появляется справебыдлый вопрос, почему там два знака равенства, а тут один. Обосновую: в программировании один знак равно, означает "приравнивание". Короче, установка значения. Два знака - уже оператор сравнения. Возвращает true, если истинно (типо, например 2 == 2, или 6 == 2 * 3) и false, если нет. Кста да, эту переменную нужно ещё создать.

    new finishPoint

    Как Python разработчик, я был приятно удивлён отсутствием статической типизации (или почти отсутствием). Кхм, забейте, просто втулите эту строку под функцией plugin_init(). new означает создание нового объекта, в нашем случае, переменной.  Дальше идет имя. Идём дальше.

    new rollResult = random_num(0, finishPoint)

    Создаем переменную, присваиваем рандомное число от 0 до конечного значения (пока что это 100). Функция random_num - это встроенная в язык функция, принимает 2 числа и возвращает случайное(псевдо) в диапазоне.

    new userName[32
    get_user_name(id, userName, 31)

    Дальше создаётся коллекция, или массив значений. В скобочках количество элементов. Далле идёт функция get_user_name - ещё одна из множества встроенных. Принимает айди игрока, контейнер для записи и крайний элемент в контейнере, до которого разрешено писать. Почему не до 32? Потому, что 32 элемента не существует, перечисление идёт от 0.

    ColorChat(0, GREEN, "%s генерирует случайное число[0-%d]: %d", userName, finishPoint, rollResult)

    Функция вывода сообщения, цветным, красивеньким текстом. Принимает айди игрока (0 для всех), который увидет его, цвет сообщения и сам текст. %s и %d - это, грубо говоря, места для переменных. s - string, строка и d - decimal, число короче. Ни и соответственно, в порядке очереди подставляем значения. userName - это массив символов, но его можно перевестив в строку, дальше 2 числа.

    Ну типо всё, ролл от 1 до 100 работает, но этого было мне недостаточно, я начал искать инфу, как парсить чат. Меня отослали на официальный(или нет) форум по amxmod, где я и нашёл ответ.

    public HookSayCmd(id)
    {
        new szMessage[64]; read_args(szMessage, charsmax(szMessage));
        remove_quotes(szMessage); trim(szMessage);
        if(szMessage[0] == '/' && szMessage[1] == 'r' && szMessage[2] == 'o' && szMessage[3] == 'l' &&
    szMessage[4] == 'l') {
            new arg[10]
            new arg2[10]
            new num = parse(szMessage, arg, charsmax(arg), arg2, charsmax(arg2))
            finishPoint = str_to_num(arg2)
            if(finishPoint > 0)
                roll(id)
        }
    }

    Короче, если вкратце:

    1. Создали функцию.
    2. Создали контейнер для сообщений из чата.
    3. Записали одну строку из чата.
    4. Убрали специальные символы.
    5. Убрали пробелы.
    6. Дальше условие, если первые 5 элементов строки создают строку "/roll".
    7. Начать парсить чат.
    8. В arg и arg2 споймали всё, кроме числа для ролла.
    9. В num споймали число.
    10. Присваиваем переменной finishPoint.
    11. Если переменная больше, чем ноль, выполняем.

    Теперь у нас есть число, до которого нам нужно роллить. Вот весь код:

    #include [*]
    #include [*]
    #include [*]

    public plugin_init()
    {
        register_plugin("RollSystem", "Kranvagn", "1.0")

        register_clcmd("say" , "HookSayCmd");

        register_clcmd("say /roll", "roll")
    }

    new finishPoint

    public HookSayCmd(id)
    {
        new szMessage[64]; read_args(szMessage, charsmax(szMessage));
        remove_quotes(szMessage); trim(szMessage);
        if(szMessage[0] == '/' && szMessage[1] == 'r' && szMessage[2] == 'o' && szMessage[3] == 'l' &&
    szMessage[4] == 'l') {
            new arg[10]
            new arg2[10]
            new num = parse(szMessage, arg, charsmax(arg), arg2, charsmax(arg2))
            finishPoint = str_to_num(arg2)
            if(finishPoint > 0)
                roll(id)
        }
    }

    public roll(id)
    {
         if(finishPoint == 0)
             finishPoint = 100
         new rollResult = random_num(0, finishPoint)
         new userName[32
         get_user_name(id, userName, 31)
         ColorChat(0, GREEN, "%s генерирует случайное число[0-%d]: %d", userName, finishPoint, rollResult)
    }

    Сверху можете видеть include'ы, это библиотеки, необходимые для работы некоторых функций. Всё, компилируем, закидуем на свой сервер и радуемся. Для компиляции я юзаю AmxModCompiler.

    [*] На этих местах текст принимает решение исчезнуть, хз почему. Там должны быть <amxmodx>, <fun> и <colorchat>

    Видим и игнорируем 2 прикола - на работу никак не влияет. Дальше скрины с сервера:

    На этом всё, удачи всём!(Дастан, сорри за кровь из глаз)

     

    Отредактировал: Kranvagn, 15 апреля 2020 г, 00:35

    Я бы изменил мир, но не могу найти исходники.
    На это сообщение отреагировали (понравился): SaDeLite, Pistek, brow, _SkyDeaD_, po legity, PandaSpartan, DalgaPups

    Kranvagn

    Модератор

    Рейтинг: 575

    Сообщений: 135

    Спасибок: 88

    Кул стори, редактор кода приказал долго жить, пришлось всё ручками.


    Я бы изменил мир, но не могу найти исходники.
    На это сообщение отреагировали (понравился): Pistek, _SkyDeaD_, po legity, PandaSpartan
    Последняя активность

    Comedy Club. Конец или творческая пауза?

    19 час. назад

    Подробнее...

    Логи обновлений Правил Побега из Шоушенка

    23 мая 2020 г, 23:19

    Подробнее...

    [JB/Global] Оповещение о Глобальных Играх.

    23 мая 2020 г, 22:41

    Подробнее...

    [JB] Неделя глобальных игр.

    23 мая 2020 г, 15:58

    Подробнее...

    Топ 5 пользователей
    SaDeLite

    Логин: SaDeLite

    Рейтинг: 816

    Сообщений: 156

    Спасибок: 132

    Хоттабыч

    Логин: Хоттабыч

    Рейтинг: 715

    Сообщений: 55

    Спасибок: 132

    brow

    Логин: brow

    Рейтинг: 713

    Сообщений: 73

    Спасибок: 128

    DalgaPups

    Логин: DalgaPups

    Рейтинг: 614

    Сообщений: 99

    Спасибок: 103

    Kranvagn

    Логин: Kranvagn

    Рейтинг: 575

    Сообщений: 135

    Спасибок: 88

    FRAGGERS.RU

    Игровой проект, посвященный одному из самых популярных онлайн шутеров - Counter-Strike

    пункты меню сайта

    заявки на разбан
    купить vip / admin
    банлист