Цветной PrintToChat, как?

MrBoogidy

Участник
Сообщения
24
Реакции
19
Всем привет.
Хочу на сервере организовать автоматическое приветствие при коннекте игрока от его имени. Не получается правдоподобно "подделать" сообщение. Не могу раскрасить ник игрока цветом его команды (\x03), как это было бы, если бы игрок писал в чат сам от своего имени.

Юзаю Simple Chat Processor (Redux) - AlliedModders

PHP:
#pragma semicolon 1
#include <sourcemod>
#include <scp>

#define PLUGIN_NAME "SayHello"
#define PLUGIN_AUTHOR "AUTHOR"
#define PLUGIN_VERSION "0.0.0"

char gPhrases[][] = {
    "Привет!",
    "Привет всем!",
    "Здарова, парни!",
    "q all",
    "Hello everybody",
    "Парни, привет!",
    "Здрасте всем",
    "КуКу, ребят"
};

public Plugin:myinfo =
{
    name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "auto say hello to all", version = PLUGIN_VERSION,
    url = "http://url.ru"
}
public void OnClientPostAdminCheck(int client)
{
    CreateTimer(5.0, SayHello, client);
}

public Action SayHello(Handle timer, any client)
{
    char name[128];
    int RandomPhrase = GetRandomInt(1, sizeof(gPhrases));
    if(IsClientConnected(client)) Format(name, sizeof(name), "\x03%N ", client);
   
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && client != i)
        {
            PrintToChat(i, "%s: %s", name, gPhrases[RandomPhrase - 1]);
        }
    }
}
Есть ли способ используя SCP при помощи PrintToChat делать цветные сообщения? Или может быть какой-то другой способ? Спасибо.
 

pracc

Быть, а не казаться.
Сообщения
946
Реакции
541
FakeClientCommand(i, "say %s", gPhrases[RandomPhrase - 1]); и не изобретаешь из мухи слона.
 

MrBoogidy

Участник
Сообщения
24
Реакции
19
Спасибо, но тогда сам игрок, от имени которого будет отсылаться сообщение, увидет его. Смысл в том, что бы именно он приветствия и не видел.
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Не могу раскрасить ник игрока цветом его команды
C-подобный:
PrintToChat(i, "%s%s: %s", GetClientTeam(client) < 2 ? "Цвет СПЕКОВ":GetClientTeam(client) == 2 ? "Цвет Т":"Цвет СТ", name, gPhrases[RandomPhrase - 1]);
Есть ли способ используя SCP при помощи PrintToChat делать цветные сообщения? Или может быть какой-то другой способ?
Для того чтобы выводить сообщения через SCP нужно подключить его include и использовать
C-подобный:
Action:OnChatMessage(&author, Handle:recipients, String:name[], String:message[])
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
какой-то другой способ
PHP:
#pragma semicolon 1
#include <sourcemod>

#pragma newdecls required

#define TIME_HELLO_MIN	5.0
#define TIME_HELLO_MAX	15.0

#define PLUGIN_NAME "Say Hello"
#define PLUGIN_AUTHOR "AlmazON"
#define PLUGIN_VERSION "0.1.0"

static const char gPhrases[][] = {
	"Привет",
	"Привет всем",
	"Здарова, парни",
	"q all",
	"Hello everybody",
	"Hi",
	"Парни, привет",
	"Здрасте всем",
	"КуКу, ребят"
};
static const char gPunctuationCharacter[][] = {
	"",
	"!",
	".",
	"!!"
};

Handle g_hTimerMessage[MAXPLAYERS + 1];

public Plugin myinfo =
{
	name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "Auto say hello to all", version = PLUGIN_VERSION,
	url = "http://hlmod.ru"
}
public void OnClientPostAdminCheck(int client)
{
    g_hTimerMessage[client] = CreateTimer(GetRandomFloat(TIME_HELLO_MIN, TIME_HELLO_MAX), SayHello, client);
}
public void OnClientDisconnect_Post(int client)
{
	delete g_hTimerMessage[client];
}

public Action SayHello(Handle timer, any client)
{
	g_hTimerMessage[client] = null;
	int[] clients = new int[MaxClients - 1];
	int total;
	for (int i = 1; i <= MaxClients; ++i)
	{
		if (IsClientInGame(i) && client != i)
		{
			clients[total++] = i;
		}
	}
	if (total)
	{
		Handle message = StartMessage("SayText2", clients, total);
		if (message)
		{
			BfWriteByte(message, client);
			BfWriteByte(message, true);
			char print[192];
			FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s", GetClientTeam(client) < 2 ? "*НАБЛЮДАТЕЛЬ* ":IsPlayerAlive(client) ? "":"*УБИТ* ",
			client, gPhrases[GetRandomInt(0, sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0, sizeof(gPunctuationCharacter)-1)]);
			BfWriteString(message, print);
			EndMessage();
		}
	}
	return Plugin_Stop;
}
TIME_HELLO_MIN - минимальное время для отправки всем (кроме заходящего) фальшивого сообщения приветствия;
TIME_HELLO_MAX - максимальное.
gPhrases - фразы самих приветствий (добавлять в кавычках через запятую) без конечного символа;
gPunctuationCharacter - выбираемая имитация пунктуации Оффтоп.
Добавил "Спектатор" и "Мертв".
 
Последнее редактирование:

akvorok.ego

Участник
Сообщения
314
Реакции
186
PHP:
#pragma semicolon 1
#include <sourcemod>

#pragma newdecls required

#define TIME_HELLO_MIN    5.0
#define TIME_HELLO_MAX    15.0

#define PLUGIN_NAME "Say Hello"
#define PLUGIN_AUTHOR "AlmazON"
#define PLUGIN_VERSION "0.1.0"

static const char gPhrases[][] = {
    "Привет",
    "Привет всем",
    "Здарова, парни",
    "q all",
    "Hello everybody",
    "Hi",
    "Парни, привет",
    "Здрасте всем",
    "КуКу, ребят"
};
static const char gPunctuationCharacter[][] = {
    "",
    "!",
    ".",
    "!!"
};

Handle g_hTimerMessage[MAXPLAYERS + 1];

public Plugin myinfo =
{
    name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "Auto say hello to all", version = PLUGIN_VERSION,
    url = "http://hlmod.ru"
}
public void OnClientPostAdminCheck(int client)
{
    g_hTimerMessage[client] = CreateTimer(GetRandomFloat(TIME_HELLO_MIN, TIME_HELLO_MAX), SayHello, client);
}
public void OnClientDisconnect_Post(int client)
{
    delete g_hTimerMessage[client];
}

public Action SayHello(Handle timer, any client)
{
    int[] clients = new int[MaxClients - 1];
    int total;
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && client != i)
        {
            clients[total++] = i;
        }
    }
    if (total)
    {
        Handle message = StartMessage("SayText2", clients, total);
        if (message)
        {
            BfWriteByte(message, client);
            BfWriteByte(message, true);
            char print[192];
            FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s", IsPlayerAlive(client) ? "":GetClientTeam(client) == 1 ? "*НАБЛЮДАТЕЛЬ* ":"*УБИТ* ",
            client, gPhrases[GetRandomInt(0, sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0, sizeof(gPunctuationCharacter)-1)]);
            BfWriteString(message, print);
            EndMessage();
        }
    }
    return Plugin_Stop;
}
TIME_HELLO_MIN - минимальное время для отправки всем (кроме заходящего) фальшивого сообщения приветствия;
TIME_HELLO_MAX - максимальное.
gPhrases - фразы самих приветствий (добавлять в кавычках через запятую) без конечного символа;
gPunctuationCharacter - выбираемая имитация пунктуации Оффтоп.
Добавил "Спектатор" и "Мертв".
Если так удалять таймер будут ошибки в логах:
C-подобный:
public void OnClientDisconnect_Post(int client)
{
    delete g_hTimerMessage[client];
}
Ещё желательно убивать таймер после написания сообщения в чат.
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Если так удалять таймер будут ошибки в логах
Делал в другом плагине - не жаловался. Вот если CloseHandle или KillTimer вписать, то да.
убивать таймер после написания сообщения в чат
Ничего подобного. Максимум, сбросить его переменную.
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Делал в другом плагине - не жаловался. Вот если CloseHandle или KillTimer вписать, то да.
C-подобный:
L 09/12/2016 - 13:48:34: [SM] Invalid timer handle 50c048a (error 3) during timer end, displayed function is timer callback, not the stack trace
L 09/12/2016 - 13:48:34: [SM] Unable to call function "SayHello" due to above error(s).
C-подобный:
FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s", IsPlayerAlive(client) ? "":GetClientTeam(client) > 1 ? "*УБИТ* ":"*НАБЛЮДАТЕЛЬ* ", client, gPhrases[GetRandomInt(0, sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0, sizeof(gPunctuationCharacter)-1)]);
Для того чтобы не писало что игрок убит, если он не выбрал команду.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
сбросить его переменную
Думаю, достаточно.
чтобы не писало что игрок убит, если он не выбрал команду
По факту, не выбрав команду, писать и нельзя (на практике можно, но сложно). Так что, этот момент остаётся неправдоподобным и так, и сяк. Оффтоп
GetClientTeam(client) > 1 ? "Цвет" : "Цвет"
Это не цвета команды, а лишь выбор из 2.
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Оффтоп
 

akvorok.ego

Участник
Сообщения
314
Реакции
186
Забавно, но оттенки у "Без команды" и "Спектатор" разные, насколько помню. :mosking:
Не знаю возможно и так, задача была в том чтобы менять цвет ника игрока в соответствие с цветом его команды. Так и сделал, не знаю почему у него \x03 не работал.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
почему у него \x03 не работал
\x03 - это один из стандартных цветов. Только через такие конструкции, как SayText2 он работает, будучи чисто командным, автоматически меняя окраску текста.
 

MrBoogidy

Участник
Сообщения
24
Реакции
19
PHP:
#pragma semicolon 1
#include <sourcemod>

#pragma newdecls required

#define TIME_HELLO_MIN    5.0
#define TIME_HELLO_MAX    15.0

#define PLUGIN_NAME "Say Hello"
#define PLUGIN_AUTHOR "AlmazON"
#define PLUGIN_VERSION "0.1.0"

static const char gPhrases[][] = {
    "Привет",
    "Привет всем",
    "Здарова, парни",
    "q all",
    "Hello everybody",
    "Hi",
    "Парни, привет",
    "Здрасте всем",
    "КуКу, ребят"
};
static const char gPunctuationCharacter[][] = {
    "",
    "!",
    ".",
    "!!"
};

Handle g_hTimerMessage[MAXPLAYERS + 1];

public Plugin myinfo =
{
    name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "Auto say hello to all", version = PLUGIN_VERSION,
    url = "http://hlmod.ru"
}
public void OnClientPostAdminCheck(int client)
{
    g_hTimerMessage[client] = CreateTimer(GetRandomFloat(TIME_HELLO_MIN, TIME_HELLO_MAX), SayHello, client);
}
public void OnClientDisconnect_Post(int client)
{
    delete g_hTimerMessage[client];
}

public Action SayHello(Handle timer, any client)
{
    g_hTimerMessage[client] = null;
    int[] clients = new int[MaxClients - 1];
    int total;
    for (int i = 1; i <= MaxClients; ++i)
    {
        if (IsClientInGame(i) && client != i)
        {
            clients[total++] = i;
        }
    }
    if (total)
    {
        Handle message = StartMessage("SayText2", clients, total);
        if (message)
        {
            BfWriteByte(message, client);
            BfWriteByte(message, true);
            char print[192];
            FormatEx(print, sizeof(print), "\x01%s\x03%N\x01 :  %s%s", GetClientTeam(client) < 2 ? "*НАБЛЮДАТЕЛЬ* ":IsPlayerAlive(client) ? "":"*УБИТ* ",
            client, gPhrases[GetRandomInt(0, sizeof(gPhrases)-1)], gPunctuationCharacter[GetRandomInt(0, sizeof(gPunctuationCharacter)-1)]);
            BfWriteString(message, print);
            EndMessage();
        }
    }
    return Plugin_Stop;
}
TIME_HELLO_MIN - минимальное время для отправки всем (кроме заходящего) фальшивого сообщения приветствия;
TIME_HELLO_MAX - максимальное.
gPhrases - фразы самих приветствий (добавлять в кавычках через запятую) без конечного символа;
gPunctuationCharacter - выбираемая имитация пунктуации Оффтоп.
Добавил "Спектатор" и "Мертв".
Ooops
L 09/12/2016 - 20:52:30: [SM] Native "StartMessage" reported: Unable to execute a new message, there is already one in progress
L 09/12/2016 - 20:52:30: [SM] Displaying call stack trace for plugin "simple-chatprocessor.smx":
L 09/12/2016 - 20:52:30: [SM] [0] Line 654, E:\SM compiler\sourcemod\scripting\simple-chatprocessor.sp::OnGameFrame()
Идет конфликт с SCP, сервер падает при попытке написать в чат:
Watch filipok228's Counter-Strike: Global Offensive video: ServerShutDown - Plays.tv
PHP:
PrintToChat(i, "%s%s: %s", GetClientTeam(client) < 2 ? "Цвет СПЕКОВ":GetClientTeam(client) == 2 ? "Цвет Т":"Цвет СТ", name, gPhrases[RandomPhrase - 1]);
Нужного результата не принесло, увы, все та же нераскрашенная строка с ником и приветствием.
--- Добавлено позже ---
Есть надежда, что в таком виде цвет заработает вместе с SCP? Сам проверить смогу не раньше, чем вечером...
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <scp>

#define PLUGIN_NAME "SayHello"
#define PLUGIN_AUTHOR "AUTHOR"
#define PLUGIN_VERSION "0.0.0"

char gPhrases[][] = {
    "Привет!",
    "Привет всем!",
    "Здарова, парни!",
    "q all",
    "Hello everybody",
    "Парни, привет!",
    "Здрасте всем",
    "КуКу, ребят"
};

public Plugin:myinfo =
{
    name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "auto say hello to all", version = PLUGIN_VERSION,
    url = "http://www.url.ru"
}
public void OnClientPostAdminCheck(int client)
{
    CreateTimer(15.0, SayHello, client);
}

public Action SayHello(Handle timer, any client)
{
    FakeClientCommand(client, "say ljrshgfjs");
}

public Action OnChatMessage(int &client, Handle recipients, char[] name, char[] message)
{
    if (StrEqual(message, "ljrshgfjs"))
    {
        Format(name, MAXLENGTH_NAME, "\x03%s", name);
        PrintHelloToAll(client, name);
        return Plugin_Handled;
    }
    return Plugin_Continue;
}

PrintHelloToAll(int client, char[] name)
{
    int RandomPhrase = GetRandomInt(1, sizeof(gPhrases));
 
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && client != i)
        {
            PrintToChat(i, "%s: %s", name, gPhrases[RandomPhrase - 1]);
        }
    }
}
--- Добавлено позже ---
не работает...
--- Добавлено позже ---
Заработало, спасибо @Danyas
PHP:
#pragma semicolon 1
#include <sourcemod>
#include <colors>

#define PLUGIN_NAME "SayHello"
#define PLUGIN_AUTHOR "AUTHOR"
#define PLUGIN_VERSION "0"

char gPhrases[][] = {
    "Привет!",
    "Привет всем!",
    "Здарова, парни!",
    "q all",
    "Hello everybody",
    "Парни, привет!",
    "Здрасте всем",
    "КуКу, ребят"
};

public Plugin:myinfo =
{
    name = PLUGIN_NAME, author = PLUGIN_AUTHOR, description = "auto say hello to all", version = PLUGIN_VERSION,
    url = "http://url.ru"
}
public void OnClientPostAdminCheck(int client)
{
    CreateTimer(35.0, SayHello, client);
}

public Action SayHello(Handle timer, any client)
{
    char name[256];
    int RandomPhrase = GetRandomInt(1, sizeof(gPhrases));
    if(IsClientConnected(client)) Format(name, sizeof(name), "%N", client);
   
    for (int i = 1; i <= MaxClients; i++)
    {
        if (IsClientInGame(i) && client != i)
        {
            CPrintToChat(i, "%s%s{default}: %s", GetClientTeam(client) < 2 ? "{default}":GetClientTeam(client) == 2 ? "{red}":"{blue}", name, gPhrases[RandomPhrase - 1]);
        }
    }
}
 
Последнее редактирование:
Сверху Снизу