Русское сообщество по скриптингу

Проблема с цветными сообщениями

Все вопросы по скриптингу для AMXX, помощь в редактировании плагинов.

Модераторы: Subb98, liFe iS GoOD

Правила форума
1. Запрещено материться и оскорблять других участников форума.
2. Запрещен флуд, оффтоп, дабл постинг во всех разделах форума, кроме раздела "Болтовня".
3. Запрещено взламывать сайт/форум или наносить любой вред проекту.
4. Запрещено рекламировать другие ресурсы.
5. Запрещено создавать темы без информативного названия. Название темы должно отображать ее смысл.

В данном разделе форума разрешено создавать темы, касающие только скриптинга для AMX Mod X.

Правила при создании новой темы:
1. При вставке кода плагина необходимо использовать тег [code=php].
2. Любые изображения должны быть загружены, как вложения к вашему сообщению.
3. При описании проблемы или запросе на помощь в редактировании плагина обязательно выкладывайте исходник sma плагина.

Проблема с цветными сообщениями

Сообщение Aristokrat » 19 июл 2018, 19:11

Пытаюсь сделать сообщение цветным не получается то ли я такой кливой то ли include

Код: Выделить всё
ChatColor(0, client_print_default"^3[Админ ]^4Я зелёный человечек")


Я уже всяко пробовал и ничего
Аватара пользователя
Aristokrat
 
Сообщения: 26
Зарегистрирован: 21 мар 2018, 13:31
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
Html

Re: Проблема с цветными сообщениями

Сообщение Denzzer » 19 июл 2018, 19:56

Лучше уж так делать
Код: Выделить всё
client_print_color(0, print_team_default, "^3[Админ] ^4Я зелёный человечек")

В начало плагина добавьте:
Код: Выделить всё
#if AMXX_VERSION_NUM < 183
    #include <colorchat>
#endif         

И закиньте colorchat.inc в папка_с_компилятором/include
Код: Выделить всё
#if defined _colorchat_included
    #endinput
#endif
#define _colorchat_included

/* ColorChat Support */
#define NORMAL    DontChange
#define GREEN    DontChange
#define RED        Red
#define BLUE    Blue
#define GREY    Grey
#define ColorChat client_print_color

#define MAX_TRANSLATION_LENGTH 2048

enum {
    DontChange = 0,
    Grey = -1,
    Red = -2,
    Blue = -3
};

#define print_team_default  DontChange
#define print_team_grey     Grey
#define print_team_red      Red
#define print_team_blue     Blue

stock client_print_color(id, sender, const fmt[], any:...)
{
    // check if id is different from 0
    if (id && !is_user_connected(id))
    {
        return 0;
    }

    if (sender < Blue || sender > 32)
    {
        sender = DontChange;
    }
    else if (sender < DontChange)
    {
        sender = -sender + 32; // align indexes to the TeamInfo ones
    }

    static const szTeamName[][] =
    {
        "",
        "TERRORIST",
        "CT"
    };

    new szMessage[191];

    new iParams = numargs();

    // Specific player code
    if (id)
    {
        if (iParams == 3)
        {
            copy(szMessage, charsmax(szMessage), fmt); // copy so message length doesn't exceed critical 192 value
        }
        else
        
{
            vformat(szMessage, charsmax(szMessage), fmt, 4);
        }

        if (sender > (32 - Grey))
        {
            if (sender > (32 - Blue))
            {
                sender = id;
            }
            else
            
{
                _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]);
            }
        }
        _CC_SayText(id, sender, szMessage);
    }

    // Send message to all players
    else
    
{
        // Figure out if at least 1 player is connected
        // so we don't execute useless useless code if not
        new iPlayers[32], iNum;
        get_players(iPlayers, iNum, "ch");
        if (!iNum)
        {
            return 0;
        }

        new iMlNumber, i, j;
        new Array:aStoreML = ArrayCreate();
        if (iParams >= 5) // ML can be used
        {
            for (= 3; j < iParams; j++)
            {
                // retrieve original param value and check if it's LANG_PLAYER value
                if (getarg(j) == LANG_PLAYER)
                {
                    i = 0;
                    // as LANG_PLAYER == -1, check if next parm string is a registered language translation
                    while ((szMessage[i] = getarg(+ 1, i++))) {}
                    if (GetLangTransKey(szMessage) != TransKey_Bad)
                    {
                        // Store that arg as LANG_PLAYER so we can alter it later
                        ArrayPushCell(aStoreML, j++);

                        // Update ML array saire so we'll know 1st if ML is used,
                        // 2nd how many args we have to alterate
                        iMlNumber++;
                    }
                }
            }
        }

        // If arraysize == 0, ML is not used
        // we can only send 1 MSG_ALL message if sender != 0
        if (!iMlNumber)
        {
            if (iParams == 3)
            {
                copy(szMessage, charsmax(szMessage), fmt);
            }
            else
            
{
                vformat(szMessage, charsmax(szMessage), fmt, 4);
            }
            if (< sender < (32 - Blue)) // if 0 is passed, need to loop
            {
                if (sender > (32 - Grey))
                {
                    _CC_TeamInfo(0, sender, szTeamName[sender - (32 - Grey)]);
                }
                _CC_SayText(0, sender, szMessage);
                return 1;
            }
        }

        if (sender > (32 - Blue))
        {
            sender = 0; // use receiver index
        }

        for (--iNum; iNum >= 0; iNum--)
        {
            id = iPlayers[iNum];

            if (iMlNumber)
            {
                for (= 0; j < iMlNumber; j++)
                {
                    // Set all LANG_PLAYER args to player index ( = id )
                    // so we can format the text for that specific player
                    setarg(ArrayGetCell(aStoreML, j), _, id);
                }

                // format string for specific player
                vformat(szMessage, charsmax(szMessage), fmt, 4);
            }

            if (sender > (32 - Grey))
            {
                _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]);
            }
            _CC_SayText(id, sender, szMessage);
        }

        ArrayDestroy(aStoreML);
    }
    return 1;
}

stock _CC_TeamInfo(iReceiver, iSender, szTeam[])
{
    static iTeamInfo = 0;
    if (!iTeamInfo)
    {
        iTeamInfo = get_user_msgid("TeamInfo");
    }
    message_begin(iReceiver ? MSG_ONE : MSG_ALL, iTeamInfo, _, iReceiver);
    write_byte(iSender);
    write_string(szTeam);
    message_end();
}

stock _CC_SayText(iReceiver, iSender, szMessage[])
{
    static iSayText = 0;
    if (!iSayText)
    {
        iSayText = get_user_msgid("SayText");
    }
    
    message_begin
(iReceiver ? MSG_ONE : MSG_ALL, iSayText, _, iReceiver);
    write_byte(iSender ? iSender : iReceiver);
    if (szMessage[0] > 4)
    {
        write_byte(1);
        szMessage[192 - 2 - 1] = 0;    // Two write_byte + string terminator
        write_string(szMessage);
    }
    else
    
{
        szMessage[192 - 1 - 1] = 0;    // One write_byte + string terminator
        write_string(szMessage);
    }
    message_end();
}

new _translation_szBuffer[MAX_TRANSLATION_LENGTH];

stock register_dictionary_colored(const filename[])
{
    if (!register_dictionary(filename))
    {
        return 0;
    }

    new szFileName[256];
    get_localinfo("amxx_datadir", szFileName, charsmax(szFileName));
    format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename);
    new fp = fopen(szFileName, "rt");
    if (!fp)
    {
        log_amx("Failed to open %s", szFileName);
        return 0;
    }

    new szLang[3], szKey[64], TransKey:iKey;

    while (!feof(fp))
    {
        fgets(fp, _translation_szBuffer, charsmax(_translation_szBuffer));
        trim(_translation_szBuffer);

        if (_translation_szBuffer[0] == '[')
        {
            strtok(_translation_szBuffer[1], szLang, charsmax(szLang), _translation_szBuffer, 1, ']');
        }
        else if (_translation_szBuffer[0])
        {
            strbreak(_translation_szBuffer, szKey, charsmax(szKey), _translation_szBuffer, charsmax(_translation_szBuffer));
            iKey = GetLangTransKey(szKey);
            if (iKey != TransKey_Bad)
            {
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!g", "^4");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!t", "^3");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!n", "^1");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^4", "^4");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^3", "^3");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^1", "^1");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^n", "^n");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^t", "^t");
                AddTranslation(szLang, iKey, _translation_szBuffer[2]);
            }
        }
    }

    fclose(fp);
    return 1;
}

/* ML from AMXX 1.8.3 support */
#define register_dictionary register_dictionary_colored  

Также, можете почитать: Вы должны зарегистрироваться, чтобы видеть ссылки. и Вы должны зарегистрироваться, чтобы видеть ссылки.
Аватара пользователя
Denzzer
 
Сообщения: 1
Зарегистрирован: 18 июл 2018, 21:30
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Опыт программирования: Около 3 месяцев

Re: Проблема с цветными сообщениями

Сообщение Aristokrat » 19 июл 2018, 21:16

Denzzer писал(а):Лучше уж так делать
Код: Выделить всё
client_print_color(0, print_team_default, "^3[Админ] ^4Я зелёный человечек")

В начало плагина добавьте:
Код: Выделить всё
#if AMXX_VERSION_NUM < 183
    #include <colorchat>
#endif           

И закиньте colorchat.inc в папка_с_компилятором/include
Код: Выделить всё
#if defined _colorchat_included
    #endinput
#endif
#define _colorchat_included

/* ColorChat Support */
#define NORMAL    DontChange
#define GREEN    DontChange
#define RED        Red
#define BLUE    Blue
#define GREY    Grey
#define ColorChat client_print_color

#define MAX_TRANSLATION_LENGTH 2048

enum {
    DontChange = 0,
    Grey = -1,
    Red = -2,
    Blue = -3
};

#define print_team_default  DontChange
#define print_team_grey     Grey
#define print_team_red      Red
#define print_team_blue     Blue

stock client_print_color(id, sender, const fmt[], any:...)
{
    // check if id is different from 0
    if (id && !is_user_connected(id))
    {
        return 0;
    }

    if (sender < Blue || sender > 32)
    {
        sender = DontChange;
    }
    else if (sender < DontChange)
    {
        sender = -sender + 32; // align indexes to the TeamInfo ones
    }

    static const szTeamName[][] =
    {
        "",
        "TERRORIST",
        "CT"
    };

    new szMessage[191];

    new iParams = numargs();

    // Specific player code
    if (id)
    {
        if (iParams == 3)
        {
            copy(szMessage, charsmax(szMessage), fmt); // copy so message length doesn't exceed critical 192 value
        }
        else
        
{
            vformat(szMessage, charsmax(szMessage), fmt, 4);
        }

        if (sender > (32 - Grey))
        {
            if (sender > (32 - Blue))
            {
                sender = id;
            }
            else
            
{
                _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]);
            }
        }
        _CC_SayText(id, sender, szMessage);
    }

    // Send message to all players
    else
    
{
        // Figure out if at least 1 player is connected
        // so we don't execute useless useless code if not
        new iPlayers[32], iNum;
        get_players(iPlayers, iNum, "ch");
        if (!iNum)
        {
            return 0;
        }

        new iMlNumber, i, j;
        new Array:aStoreML = ArrayCreate();
        if (iParams >= 5) // ML can be used
        {
            for (= 3; j < iParams; j++)
            {
                // retrieve original param value and check if it's LANG_PLAYER value
                if (getarg(j) == LANG_PLAYER)
                {
                    i = 0;
                    // as LANG_PLAYER == -1, check if next parm string is a registered language translation
                    while ((szMessage[i] = getarg(+ 1, i++))) {}
                    if (GetLangTransKey(szMessage) != TransKey_Bad)
                    {
                        // Store that arg as LANG_PLAYER so we can alter it later
                        ArrayPushCell(aStoreML, j++);

                        // Update ML array saire so we'll know 1st if ML is used,
                        // 2nd how many args we have to alterate
                        iMlNumber++;
                    }
                }
            }
        }

        // If arraysize == 0, ML is not used
        // we can only send 1 MSG_ALL message if sender != 0
        if (!iMlNumber)
        {
            if (iParams == 3)
            {
                copy(szMessage, charsmax(szMessage), fmt);
            }
            else
            
{
                vformat(szMessage, charsmax(szMessage), fmt, 4);
            }
            if (< sender < (32 - Blue)) // if 0 is passed, need to loop
            {
                if (sender > (32 - Grey))
                {
                    _CC_TeamInfo(0, sender, szTeamName[sender - (32 - Grey)]);
                }
                _CC_SayText(0, sender, szMessage);
                return 1;
            }
        }

        if (sender > (32 - Blue))
        {
            sender = 0; // use receiver index
        }

        for (--iNum; iNum >= 0; iNum--)
        {
            id = iPlayers[iNum];

            if (iMlNumber)
            {
                for (= 0; j < iMlNumber; j++)
                {
                    // Set all LANG_PLAYER args to player index ( = id )
                    // so we can format the text for that specific player
                    setarg(ArrayGetCell(aStoreML, j), _, id);
                }

                // format string for specific player
                vformat(szMessage, charsmax(szMessage), fmt, 4);
            }

            if (sender > (32 - Grey))
            {
                _CC_TeamInfo(id, sender, szTeamName[sender - (32 - Grey)]);
            }
            _CC_SayText(id, sender, szMessage);
        }

        ArrayDestroy(aStoreML);
    }
    return 1;
}

stock _CC_TeamInfo(iReceiver, iSender, szTeam[])
{
    static iTeamInfo = 0;
    if (!iTeamInfo)
    {
        iTeamInfo = get_user_msgid("TeamInfo");
    }
    message_begin(iReceiver ? MSG_ONE : MSG_ALL, iTeamInfo, _, iReceiver);
    write_byte(iSender);
    write_string(szTeam);
    message_end();
}

stock _CC_SayText(iReceiver, iSender, szMessage[])
{
    static iSayText = 0;
    if (!iSayText)
    {
        iSayText = get_user_msgid("SayText");
    }
    
    message_begin
(iReceiver ? MSG_ONE : MSG_ALL, iSayText, _, iReceiver);
    write_byte(iSender ? iSender : iReceiver);
    if (szMessage[0] > 4)
    {
        write_byte(1);
        szMessage[192 - 2 - 1] = 0;    // Two write_byte + string terminator
        write_string(szMessage);
    }
    else
    
{
        szMessage[192 - 1 - 1] = 0;    // One write_byte + string terminator
        write_string(szMessage);
    }
    message_end();
}

new _translation_szBuffer[MAX_TRANSLATION_LENGTH];

stock register_dictionary_colored(const filename[])
{
    if (!register_dictionary(filename))
    {
        return 0;
    }

    new szFileName[256];
    get_localinfo("amxx_datadir", szFileName, charsmax(szFileName));
    format(szFileName, charsmax(szFileName), "%s/lang/%s", szFileName, filename);
    new fp = fopen(szFileName, "rt");
    if (!fp)
    {
        log_amx("Failed to open %s", szFileName);
        return 0;
    }

    new szLang[3], szKey[64], TransKey:iKey;

    while (!feof(fp))
    {
        fgets(fp, _translation_szBuffer, charsmax(_translation_szBuffer));
        trim(_translation_szBuffer);

        if (_translation_szBuffer[0] == '[')
        {
            strtok(_translation_szBuffer[1], szLang, charsmax(szLang), _translation_szBuffer, 1, ']');
        }
        else if (_translation_szBuffer[0])
        {
            strbreak(_translation_szBuffer, szKey, charsmax(szKey), _translation_szBuffer, charsmax(_translation_szBuffer));
            iKey = GetLangTransKey(szKey);
            if (iKey != TransKey_Bad)
            {
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!g", "^4");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!t", "^3");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "!n", "^1");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^4", "^4");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^3", "^3");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^1", "^1");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^n", "^n");
                replace_all(_translation_szBuffer, charsmax(_translation_szBuffer), "^^t", "^t");
                AddTranslation(szLang, iKey, _translation_szBuffer[2]);
            }
        }
    }

    fclose(fp);
    return 1;
}

/* ML from AMXX 1.8.3 support */
#define register_dictionary register_dictionary_colored    

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


Какие-то проблемы
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Aristokrat
 
Сообщения: 26
Зарегистрирован: 21 мар 2018, 13:31
Благодарил (а): 2 раз.
Поблагодарили: 0 раз.
Опыт программирования: Меньше недели
Языки программирования: Pawn
Html

Re: Проблема с цветными сообщениями

Сообщение NoPM_N1Ck » 19 июл 2018, 23:40

Скинь код
Аватара пользователя
NoPM_N1Ck
 
Сообщения: 99
Зарегистрирован: 06 июл 2018, 18:56
Откуда: Русь
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Опыт программирования: Меньше месяца
Языки программирования: Java


Вернуться в Скриптинг

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 8