Помогите с плагином

Temlik

Участник
Сообщения
668
Реакции
174
Плагин должен делать сообщения админов цветными.
При написании сообщения вылезает ошибка
L 12/04/2021 - 23:27:33: [SM] Exception reported: Could not send a usermessage
L 12/04/2021 - 23:27:33: [SM] Blaming: Rainbow_Chat.smx
L 12/04/2021 - 23:27:33: [SM] Call stack trace:
L 12/04/2021 - 23:27:33: [SM] [0] PrintToChat
L 12/04/2021 - 23:27:33: [SM] [1] Line 78, D:\addons\sourcemod\scripting\include\csgo_colors.inc::CGOPrintToChatAll
L 12/04/2021 - 23:27:33: [SM] [2] Line 75, D:\addons\sourcemod\scripting\Rainbow_Chat.sp::RainbowChat
L 12/04/2021 - 23:27:33: [SM] [3] Line 10, D:\addons\sourcemod\scripting\Rainbow_Chat.sp::OnChatMessage
L 12/04/2021 - 23:27:33: [SM] [5] Call_Finish
L 12/04/2021 - 23:27:33: [SM] [6] Line 327, D:\sourcemod-1.10.0-git6499-windows\addons\sourcemod\scripting\Smple Chat Processor.sp::OnSayText2
 

Вложения

  • Rainbow_Chat.sp
    1.1 КБ · Просмотры: 12

Young <

Now, finally free
Сообщения
1,263
Реакции
507
Во время выполнения usermessage (SayText2) вы пытаетесь отправить еще одно сообщение, почему бы просто не перезаписать текст, который прилетает в форвард от scp? Инклюд от Феникса это позволяет.
CGOReplaceColorSay. Все параметры можно перекрасить: и ник, и сообщение.
 

Temlik

Участник
Сообщения
668
Реакции
174
Во время выполнения usermessage (SayText2) вы пытаетесь отправить еще одно сообщение, почему бы просто не перезаписать текст, который прилетает в форвард от scp? Инклюд от Феникса это позволяет.
CGOReplaceColorSay. Все параметры можно перекрасить: и ник, и сообщение.
Изменил CGOPrintToChatAll(sMessage) на CGOReplaceColorSay(sMessage, strlen(sMessage)) - ошибка пропала, но сообщения не красятся
 

Young <

Now, finally free
Сообщения
1,263
Реакции
507
Для примера:
C-подобный:
public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    char szNewMessage[] = "{RED}Example {GREEN}message";
    CGOReplaceColorSay(szNewMessage, sizeof szNewMessage);

    //Ниже уже задаем чат-процессору финальный результат.
    strcopy(szMessage, MAXLENGTH_MESSAGE, szNewMessage);

    return Plugin_Changed;
}
 

Temlik

Участник
Сообщения
668
Реакции
174
Может кто-то помочь? Нифига не получается, уже всё перепробовал😞
 

Вложения

  • Test.sp
    685 байт · Просмотры: 5

Young <

Now, finally free
Сообщения
1,263
Реакции
507
Может кто-то помочь? Нифига не получается, уже всё перепробовал😞
Пробуйте
C-подобный:
#include <sourcemod>
#include <csgo_colors>
#include <scp>

public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    RainbowChat(szMessage, MAXLENGTH_MESSAGE);
    CGOReplaceColorSay(szMessage, MAXLENGTH_MESSAGE);

    return Plugin_Changed;
}

static const char g_szMyColors[][] = {"{RED}", "{GREEN}", "{BLUE}"};
void RainbowChat(char[] szText, int iMaxLength)
{
    char[] szOutput = new char[iMaxLength];
    for(int i; szText[i]; i++)
    {
        Format(szOutput, iMaxLength, "%s%s%c", szOutput, g_szMyColors[i % sizeof g_szMyColors], szText[i]);
    }
    strcopy(szText, iMaxLength, szOutput);
}
 

Temlik

Участник
Сообщения
668
Реакции
174
Пробуйте
C-подобный:
#include <sourcemod>
#include <csgo_colors>
#include <scp>

public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    RainbowChat(szMessage, MAXLENGTH_MESSAGE);
    CGOReplaceColorSay(szMessage, MAXLENGTH_MESSAGE);

    return Plugin_Changed;
}

static const char g_szMyColors[][] = {"{RED}", "{GREEN}", "{BLUE}"};
void RainbowChat(char[] szText, int iMaxLength)
{
    char[] szOutput = new char[iMaxLength];
    for(int i; szText[i]; i++)
    {
        Format(szOutput, iMaxLength, "%s%s%c", szOutput, g_szMyColors[i % sizeof g_szMyColors], szText[i]);
    }
    strcopy(szText, iMaxLength, szOutput);
}
Не работает с русскими буквами
Снимок экрана (832).png
 

Endless Moon.

Что-то да умею..
Сообщения
382
Реакции
71
Пробуйте
C-подобный:
#include <sourcemod>
#include <csgo_colors>
#include <scp>

public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    RainbowChat(szMessage, MAXLENGTH_MESSAGE);
    CGOReplaceColorSay(szMessage, MAXLENGTH_MESSAGE);

    return Plugin_Changed;
}

static const char g_szMyColors[][] = {"{RED}", "{GREEN}", "{BLUE}"};
void RainbowChat(char[] szText, int iMaxLength)
{
    char[] szOutput = new char[iMaxLength];
    for(int i; szText[i]; i++)
    {
        Format(szOutput, iMaxLength, "%s%s%c", szOutput, g_szMyColors[i % sizeof g_szMyColors], szText[i]);
    }
    strcopy(szText, iMaxLength, szOutput);
}
Приветики! Можно такое же организовать на CS:S v34?

Буду очень благодарен ☺️
 

Young <

Now, finally free
Сообщения
1,263
Реакции
507
Не работает с русскими буквами
Посмотреть вложение 88204

Замените на вот это. Я не нашел для павна вариант для вставки строки, поэтому пришлось как-то выкручиваться. Также можете поэкспериментировать с длиной сообщения, которая идет в RainbowChat, там же все равно тэги цветов заменяются на символы, таким образом вы увеличите длину сообщения.
C-подобный:
static const char g_szMyColors[][] = {"{RED}", "{GREEN}", "{BLUE}"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i];i+=GetCharBytes(szText[i]))
    {
        i += InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
        iNum++;
    }
}

stock int InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);

    return strlen(szInsert);
}
 

Temlik

Участник
Сообщения
668
Реакции
174
Замените на вот это. Я не нашел для павна вариант для вставки строки, поэтому пришлось как-то выкручиваться. Также можете поэкспериментировать с длиной сообщения, которая идет в RainbowChat, там же все равно тэги цветов заменяются на символы, таким образом вы увеличите длину сообщения.
C-подобный:
static const char g_szMyColors[][] = {"{RED}", "{GREEN}", "{BLUE}"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i];i+=GetCharBytes(szText[i]))
    {
        i += InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
        iNum++;
    }
}

stock int InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);

    return strlen(szInsert);
}
Работает с русскими, но теперь если несколько слов, то не красится
L 12/06/2021 - 07:34:20: [SM] Exception reported: Invalid memory access
L 12/06/2021 - 07:34:20: [SM] Blaming: Test.smx
L 12/06/2021 - 07:34:20: [SM] Call stack trace:
L 12/06/2021 - 07:34:20: [SM] [1] Line 15, D:\addons\sourcemod\scripting\Test.sp::RainbowChat
L 12/06/2021 - 07:34:20: [SM] [2] Line 8, D:\addons\sourcemod\scripting\Test.sp::OnChatMessage
L 12/06/2021 - 07:34:20: [SM] [4] Call_Finish
L 12/06/2021 - 07:34:20: [SM] [5] Line 367, C:\Users\Administrator\Documents\Repositories\Simple Chat Processor\scripting\simple-chatprocessor.sp::OnSayText2
Снимок экрана (834).png
 

Young <

Now, finally free
Сообщения
1,263
Реакции
507
Работает с русскими, но теперь если несколько слов, то не красится
L 12/06/2021 - 07:34:20: [SM] Exception reported: Invalid memory access
L 12/06/2021 - 07:34:20: [SM] Blaming: Test.smx
L 12/06/2021 - 07:34:20: [SM] Call stack trace:
L 12/06/2021 - 07:34:20: [SM] [1] Line 15, D:\addons\sourcemod\scripting\Test.sp::RainbowChat
L 12/06/2021 - 07:34:20: [SM] [2] Line 8, D:\addons\sourcemod\scripting\Test.sp::OnChatMessage
L 12/06/2021 - 07:34:20: [SM] [4] Call_Finish
L 12/06/2021 - 07:34:20: [SM] [5] Line 367, C:\Users\Administrator\Documents\Repositories\Simple Chat Processor\scripting\simple-chatprocessor.sp::OnSayText2
Посмотреть вложение 88220
Версия с минимальными потерями, csgo_colors.inc можно не использовать:
C-подобный:
static const char g_szMyColors[][] = {"\x02", "\x04", "\x0C"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i] && i < iMaxLength; i += GetCharBytes(szText[i]))
    {
        if(szText[i] != ' ')
        {
            InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
            iNum++;
            i++;
        }
    }
}

stock void InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);
}

Также моя вина, не обратил внимание, что длина текста стоит за другим дейфайном: MAXLENGTH_INPUT
 

Temlik

Участник
Сообщения
668
Реакции
174
Версия с минимальными потерями, csgo_colors.inc можно не использовать:
C-подобный:
static const char g_szMyColors[][] = {"\x02", "\x04", "\x0C"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i] && i < iMaxLength; i += GetCharBytes(szText[i]))
    {
        if(szText[i] != ' ')
        {
            InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
            iNum++;
            i++;
        }
    }
}

stock void InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);
}

Также моя вина, не обратил внимание, что длина текста стоит за другим дейфайном: MAXLENGTH_INPUT
Опять не работает с русскими буквами

Снимок экрана (838).png
 

Young <

Now, finally free
Сообщения
1,263
Реакции
507
@Temlik,
C-подобный:
#include <sourcemod>
#include <scp>

public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    RainbowChat(szMessage, MAXLENGTH_INPUT);
    return Plugin_Changed;
}

static const char g_szMyColors[][] = {"\x02", "\x04", "\x0C"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i] && i < iMaxLength; i += GetCharBytes(szText[i]))
    {
        if(szText[i] != ' ')
        {
            InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
            iNum++;
            i++;
        }
    }
}

stock void InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);
}
Проверьте, перезагрузлся или скомпилировался ли у вас плагин.

20211209004750_1.jpg
 

Temlik

Участник
Сообщения
668
Реакции
174
@Temlik,
C-подобный:
#include <sourcemod>
#include <scp>

public Action OnChatMessage(int &iAuthor, Handle hRecipients, char[] szName, char[] szMessage)
{
    RainbowChat(szMessage, MAXLENGTH_INPUT);
    return Plugin_Changed;
}

static const char g_szMyColors[][] = {"\x02", "\x04", "\x0C"};
void RainbowChat(char[] szText, int iMaxLength)
{
    for(int i, iNum; szText[i] && i < iMaxLength; i += GetCharBytes(szText[i]))
    {
        if(szText[i] != ' ')
        {
            InsertString(szText, iMaxLength, g_szMyColors[iNum % sizeof g_szMyColors], i);
            iNum++;
            i++;
        }
    }
}

stock void InsertString(char[] szOutput, int iMaxLength, const char[] szInsert, int iPos)
{
    char[] szBuffer = new char[iMaxLength];
    FormatEx(szBuffer, iMaxLength, "%s%s", szInsert, szOutput[iPos]);

    szOutput[iPos] = 0;
    StrCat(szOutput, iMaxLength, szBuffer);
}
Проверьте, перезагрузлся или скомпилировался ли у вас плагин.

Это работает, спасибо!
 
Сверху Снизу