Создать акаунт
Всё для сервера CS 1.6 / CSS / CS:GO - Плагины | Сборки | Модели | Карты » Статьи » Pawn с Нуля? реально ли написать свой плагин для сервера ( 1 полноценный плагин )

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

29 апр 2023, 19:56
Статьи / Новости
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, "Your available tags: %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", "");

        }

        // Check for DOG tag

        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] != '\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" в чат.

 

Только для авторизованых Юзеров

Смотрите также:

Комментарии
Минимальная длина комментария - 50 знаков. комментарии модерируются
  1. Zaur
    Zaur
    2 мая 2024 15:16

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