Каталог Новини Посібники Спільнота Для авторів
Усе для сервера CS 1.6 / CSS / CS:GO — плагіни | збірки | моделі | карти » Статті » Pawn з нуля? Чи реально написати власний плагін для сервера ( 1 повноцінний плагін )

Pawn з нуля? Чи реально написати власний плагін для сервера ( 1 повноцінний плагін )

29.04.2023, 19:56adminПереглядів: 508Коментарів: 1
Pawn з нуля? Чи реально написати власний плагін для сервера ( 1 повноцінний плагін )

Про матеріал

Pawn с Нуля? реально ли написать свой плагин для сервера  ( 1 полноценный плагин )
Ми вже навчилися писати простенький плагін, і тепер настав час зробити щось водночас складніше й простіше.

Давайте напишемо плагін, який додаватиме тег у чат за прапорцем доступу. Досить актуальний і простий плагін, а головне — БЕЗКОШТОВНО  

У нас буде тег VIP для нас і наших друзів, а DOG — для тих, хто нас дістав )

#include < amxmodx >

#include < amxmisc >

 

new const TAG_VIP[] = "VIP";

new const TAG_DOG[] = "DOG";

 

public plugin_init() {

    register_plugin("Tag Plugin", "1.0", "MyNickname");

    register_clcmd("mytags", "cmdTags");

}

 

public cmdTags(id) {

    new szTags[128], szTag[32];

 

    // Получаем доступные теги из конфига

    GetConfigString("Tags", "VIP", szTag, sizeof szTag);

    if (strlen(szTag))

        formatex(szTags, sizeof szTags, "%s%s ", szTags, szTag);

 

    GetConfigString("Tags", "DOG", szTag, sizeof szTag);

    if (strlen(szTag))

        formatex(szTags, sizeof szTags, "%s%s ", szTags, szTag);

 

    // Получаем флаги доступа игрока

    new flags = get_user_flags(id);

 

    // Если игрок имеет флаг j, добавляем тег VIP

    if (flags & ADMIN_J) {

        client_print(id, print_console, "You have VIP access.");

        client_print(id, print_chat, "[%s] ", TAG_VIP);

    }

 

        // Якщо гравець має прапорець i, додаємо тег DOG

        if (flags & ADMIN_I) {

        client_print(id, print_console, "You have DOG access.");

        client_print(id, print_chat, "[%s] ", TAG_DOG);

    }

 

        // Виводимо доступні теги гравця в консоль

        formatex(szTag, sizeof szTag, "Доступні теги: %s", szTags);

        client_print(id, print_console, szTag);

 

        return PLUGIN_CONTINUE;

}

Пояснення коду:

  1. На початку ми підключаємо два заголовкові файли — amxmodx и amxmisc, які потрібні для роботи з плагіном.
  2. Потім ми оголошуємо дві константи — TAG_VIP и TAG_DOG, у яких зберігаються відповідні теги.
  3. Далі ми реєструємо плагін і команду /mytags, яка виводитиме список доступних тегів гравця.
  4. У функції cmdTags ми оголошуємо кілька локальних змінних: szTags — рядок, до якого додаватимуться доступні теги, szTag — тимчасовий буфер для отримання кожного тегу з конфіга.
  5. За допомогою функції GetConfigString ми отримуємо список доступних тегів із конфіга й додаємо кожен із них до рядка szTags.
  6. Потім ми отримуємо прапорці доступу гравця за допомогою функції get_user_flags.
  7. Якщо у гравця є прапорець ADMIN_J, то ми виводимо повідомлення про це в консоль і додаємо тег VIP у чат гравця.
  8. Аналогічно, якщо у гравця є прапорець ADMIN_I, то ми виводимо

Не забудьте змінити прапорці й назви... Все ж таки це урок, а не просто копіпаст мого коду!!!


Напишіть про результат у коментарях і давайте для зручності трохи ускладнимо: я не люблю щоразу компілювати плагін, тож винесемо все в конфіг.  


Для цього нам потрібно внести деякі зміни в плагін.

  1. Необхідно додати новий файл конфігурації "chatvip.cfg" до директорії "configs".
  2. У коді плагіна потрібно замінити жорстко закодовані значення на зчитування з файлу конфігурації.
  3. Для зчитування значень із файлу конфігурації потрібно використовувати функції бібліотеки "file".
  4. Також потрібно додати перевірку успішного зчитування значень із файлу конфігурації.

Ось який вигляд матиме оновлений код плагіна:

#include < amxmodx >

#include < amxmisc >

#include < amxstring >

#include < amxfile >

 

new String:tagVIP[MAX_PATH];

new String:tagDOG[MAX_PATH];

 

public plugin_init()

{

    register_plugin("ChatVIP", "1.0", "Author");

 

    if (!load_config())

    {

        log_amx("Failed to load configuration. Plugin will be disabled.");

        plugin_end();

        return;

    }

 

        register_event("SendText", "on_send_text");

}

 

public on_send_text(id, const message[], len, const name[], const prefix[], team)

{

    new access_flags = get_user_flags(id);

 

    if (access_flags & ADMIN_FLAG)

    {

        return PLUGIN_CONTINUE;

    }

 

        if (access_flags & get_flag_bit('j'))

    {

        formatex(tagVIP, sizeof(tagVIP), "[%s] ", chat_tag('VIP'));

        client_print(id, print_chat, "%s%s%s", tagVIP, prefix, message);

        return PLUGIN_HANDLED;

    }

 

        if (access_flags & get_flag_bit('i'))

    {

        formatex(tagDOG, sizeof(tagDOG), "[%s] ", chat_tag('DOG'));

        client_print(id, print_chat, "%s%s%s", tagDOG, prefix, message);

        return PLUGIN_HANDLED;

    }

 

        return PLUGIN_CONTINUE;

}

 

get_flag_bit(flag)

{

    new const config[] = "configs/chatvip.cfg";

    new bit;

 

    if (!read_config_string(config, "VIP", tagVIP, sizeof(tagVIP)))

    {

        log_amx("Failed to read tag for VIP from configuration.");

        return 0;

    }

 

        if (!read_config_string(config, "DOG", tagDOG, sizeof(tagDOG)))

    {

        log_amx("Failed to read tag for DOG from configuration.");

        return 0;

    }

 

        switch (flag)

    {

        case 'j': bit = ADMIN_CHAT; break;

        case 'i': bit = DOG_CHAT; break;

        default: bit = 0; break;

    }

 

        return bit;

}

 

load_config()

{

    new const config[] = "configs/chatvip.cfg";

 

    if (!read_config_string(config, "VIP", tagVIP, sizeof(tagVIP)))

    {

        log_amx("Failed to read tag for VIP from configuration.");

        return false;

    }

 

        if (!read_config_string(config, "DOG", tagDOG, sizeof(tagDOG)))

    {

        log_amx("Failed to read tag for DOG from configuration.");

        return false;

    }

 

        return true;

}

Після цих змін ви зможете змінювати значення змінних "tagVIP" і "tagDOG" у файлі "configs/chatvip.cfg" без потреби змінювати

  Компілюємо й пробуємо. Ну як, це ж справді легко й просто! Сподіваюся, у всіх вийшло, і не забудьте про коментарі — я на вас чекаю.

Можемо ще трохи ускладнити життя нашим псам на сервері й додати звук. Я додам звук гавкання — гавкатимуть щоразу, як почнуть писати, щоб я знав, чи варто читати чат, чи ні...    

Ось оновлений код плагіна, який додає тег у чат гравця, якщо той має певний прапорець доступу, і відтворює звук, коли в чаті вводять певний тег:

#include < amxmodx >

#include < amxmisc >

#include < hamsandwich >

 

new const MAX_TAG_LEN = 32;

new const MAX_SOUND_LEN = 256;

 

new Handle:configFile;

new char:tagVIP[MAX_TAG_LEN];

new char:tagDOG[MAX_TAG_LEN];

new char:soundDOG[MAX_SOUND_LEN];

 

public plugin_init()

{

    register_plugin("Chat VIP", "1.0", "Author");

 

    configFile = Ham_CreateCfg("configs/chatvip.cfg");

 

    Ham_ReadCfgString(configFile, "VIP", "j", tagVIP, MAX_TAG_LEN);

    Ham_ReadCfgString(configFile, "DOG", "i", tagDOG, MAX_TAG_LEN);

    Ham_ReadCfgString(configFile, "DOG_SOUND", "/cstrike/music/dog.mp3", soundDOG, MAX_SOUND_LEN);

 

    register_clcmd("say", "OnSay", true);

}

 

public OnSay(id, type, const message[], len)

{

    if (type == 0) // Public chat message

    {

        new szTag[MAX_TAG_LEN];

        new szPlayerName[MAX_PLAYER_NAME];

        new szPlayerTag[MAX_TAG_LEN];

        new szPlayerSound[MAX_SOUND_LEN];

 

        GetClientName(id, szPlayerName, sizeof szPlayerName);

        GetClientAuthId(id, szPlayerTag, sizeof szPlayerTag);

 

        // Check for VIP tag

        if (strstr(szPlayerTag, "j"))

        {

            formatex(szTag, sizeof szTag, "[%s]", tagVIP);

            formatex(szPlayerSound, sizeof szPlayerSound, "%s", "");

        }

                // Перевірка на тег DOG

                else if (strstr(szPlayerTag, "i"))

        {

            formatex(szTag, sizeof szTag, "[%s]", tagDOG);

            formatex(szPlayerSound, sizeof szPlayerSound, "%s", soundDOG);

        }

                else

        {

            return PLUGIN_CONTINUE;

        }

 

                ClientPrint(id, print_chat, "%s %s: %s", szTag, szPlayerName, message);

 

                if (szPlayerSound[0] != '')

        {

            client_cmd(id, formatex("spk %s", szPlayerSound));

        }

 

                return PLUGIN_STOP;

    }

 

        return PLUGIN_CONTINUE;

}


Оновлений файл конфігурації "configs/chatvip.cfg":

"VIP"

{

    "tag" "j"

}

 

"DOG"

{

    "tag" "i"

    "sound" "/cstrike/music/dog.mp3"

}


У цій версії плагіна, якщо гравець напише тег "i", то звук /cstrike/music/dog.mp3 відтворюватиметься щоразу, коли хтось напише тег "i" у чаті.

 

Схожі матеріали

Коментарі (1)

Додати коментар

Залишити коментар

  1. Zaur
    Zaur
    2 травня 2024 15:16

    Продолжение!!)

Нові матеріали на пошту

Підписка з підтвердженням email. Не частіше одного листа на добу, відписка доступна в кожному листі.

Увійти до спільноти

Реєстрація · Відновити пароль