[CS:S OB] Мод чата Army Ranks (Не актуально)

Денис Быков

Участник
Сообщения
40
Реакции
2
Доброго времени суток, форумчане!
Есть такой плагин Army Ranks, который добавляет звания в игру. Но этот плагин имеет много багов и недочетов. Сабж
Мне хочется изменить работу чата. Он составлен так, что все сообщения в чате видны всем игрокам.
Необходимо сделать так, чтобы живые не видели сообщения мертвых и спектаторов. А мертвые и спектаторы, могли без проблем общаться друг с другом, ну и видеть чат живых.

К сожалению, я не знаю языка SourcePawn, но немного знаю C++. Просмотрев исходник:
C-подобный:
#include <army_ranks>
#include <basecomm>

#define MORE_COLORS
#if defined MORE_COLORS
 #include <morecolors>
#else
 #include <colors>
#endif

new	String: PrefixColor[MAXPLAYERS+1][20],
	String: NameColor[MAXPLAYERS+1][20],
	String: TextColor[MAXPLAYERS+1][20],
	String: DeathColor[MAXPLAYERS+1][20],
	String: SpecColor[MAXPLAYERS+1][20],
	String:	g_sRank[MAXPLAYERS+1][36],
	g_iLastSay[MAXPLAYERS+1];
	
public Plugin:myinfo = 
{
    name = "[ ARMY ] Чат/Chat",
    author = "sahapro33",
    description = "",
    version = "1.1 BaseComm"
}

public OnPluginStart()
{	
	AddCommandListener(Command_Say, "say");
	AddCommandListener(Command_Say_Team, "say_team");
	AddCommandListener(CommandBack, "jointeam");
}
public Action:CommandBack(client, const String:command[], args) GetChatColor(client);
public ARMY_PlayerSpawn(client) GetChatColor(client);
public ARMY_ArmyUp(client) GetChatColor(client);
public OnClientPutInServer(client) g_iLastSay[client] = 0;

public Action:Command_Say_Team(client, const String:command[], argc)
{
	if ( 0 < client <= MaxClients && IsClientInGame(client) && !BaseComm_IsClientGagged(client) )
	{
		new iTime = GetTime();
		if ( g_iLastSay[client] > iTime )
		{
			return Plugin_Handled;
		}
		g_iLastSay[client] = iTime +2;
		decl String:sName[64], String:sMessage[256];
		GetClientName(client, sName, sizeof(sName) - 1);
		GetCmdArgString(sMessage, sizeof(sMessage) - 1);
		StripQuotes(sMessage);
		if(!Army_GetStringRank(client,g_sRank[client])) SetFailState("Error");
		switch(GetClientTeam(client))
		{
			case 1:
			{
				Format(sMessage, 500, "(Наблюдатель) {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			}
			case 2:
			{
				Format(sMessage, 500, "(Террорист) {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			}
			case 3:
			{
				Format(sMessage, 500, "(Спецназовец) {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			}
		}
		for (new i = 1; i<MaxClients; i++)
		{
			if (IsClientInGame(i)&&GetClientTeam(client)==GetClientTeam(i))
			{
				CPrintToChatEx(i,client,sMessage);
			}
		}
		return Plugin_Handled;
	}
	return Plugin_Continue;
}
public Action:Command_Say(client, const String:command[], argc)
{
	if (0 < client <= MaxClients && IsClientInGame(client) && !BaseComm_IsClientGagged(client))
	{
		new iTime = GetTime();
		if ( g_iLastSay[client] > iTime )
		{
			return Plugin_Handled;
		}
		decl String:sName[64], String:sMessage[500];
		GetClientName(client, sName, sizeof(sName) - 1);
		GetCmdArgString(sMessage, sizeof(sMessage) - 1);
		StripQuotes(sMessage);
		if(!Army_GetStringRank(client,g_sRank[client])) SetFailState("Error");
		if ( IsPlayerAlive(client) )
		{			
			Format(sMessage, 500, "{slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			CPrintToChatAllEx(client,sMessage);
		}
		else
		{
			if ( GetClientTeam(client) > 1  )
			{
				Format(sMessage, 500, "%s*УБИТ* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",DeathColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
				CPrintToChatAllEx(client,sMessage);
			}
			else
			{
				Format(sMessage, 500, "%s*СПЕК* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",SpecColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
				CPrintToChatAllEx(client,sMessage);		
			}
		}
		return Plugin_Handled;
	}
	return Plugin_Continue;
}

GetChatColor(client)
{
	if(!Army_GetStringAtributes(client,"PrefixColor","{green}",PrefixColor[client]))SetFailState("Error");
	if(!Army_GetStringAtributes(client,"NameColor","{teamcolor}",NameColor[client]))SetFailState("Error");
	if(!Army_GetStringAtributes(client,"TextColor","{default}",TextColor[client]))SetFailState("Error");
	if(!Army_GetStringAtributes(client,"DeathColor","{default}",DeathColor[client]))SetFailState("Error");
	if(!Army_GetStringAtributes(client,"SpecColor","{default}",SpecColor[client]))SetFailState("Error");
}

Я нашел многие сходства с C++ и смог найти кусок кода, который нужно изменить.
Вот он:
C-подобный:
if ( IsPlayerAlive(client) )
		{			
			Format(sMessage, 500, "{slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			CPrintToChatAllEx(client,sMessage);
		}
		else
		{
			if ( GetClientTeam(client) > 1  )
			{
				Format(sMessage, 500, "%s*УБИТ* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",DeathColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
				CPrintToChatAllEx(client,sMessage);
			}
			else
			{
				Format(sMessage, 500, "%s*СПЕК* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",SpecColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
				CPrintToChatAllEx(client,sMessage);		
			}
		}

Пожалуйста, помогите его переделать так, как написано в начале поста.
В исходнике используется библиотека morecolors.inc.

Добавлено через 3 часа 28 минут
Поразмыслив вечером над куском этого кода, сделал вот что:
C-подобный:
public Action:Command_Say(client, const String:command[], argc)
{
	if (0 < client <= MaxClients && IsClientInGame(client) && !BaseComm_IsClientGagged(client))
	{
		new iTime = GetTime();
		if ( g_iLastSay[client] > iTime )
		{
			return Plugin_Handled;
		}
		decl String:sName[64], String:sMessage[500];
		GetClientName(client, sName, sizeof(sName) - 1);
		GetCmdArgString(sMessage, sizeof(sMessage) - 1);
		StripQuotes(sMessage);
		if(!Army_GetStringRank(client,g_sRank[client])) SetFailState("Error");
		
		switch(IsPlayerAlive(client))
		{
		case 0:
		{
		if ( GetClientTeam(client) > 1  )
			{
				Format(sMessage, 500, "%s*УБИТ* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",DeathColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
				
			}
			else
			{
				Format(sMessage, 500, "%s*СПЕК* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",SpecColor[client],PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
					
			}
		}
		case 1:
		{
			Format(sMessage, 500, "{slategrey}[%s%s{slategrey}] %s%s{default}: %s%s",PrefixColor[client],g_sRank[client],NameColor[client],sName,TextColor[client],sMessage);
			
		}
		}
		if (IsPlayerAlive(client)) 
			{
			CPrintToChatAllEx(client,sMessage);
			}
		for (new i = 1; i<MaxClients; i++)
		{
			if (!IsPlayerAlive(client)) 
			{
				[B]if (IsClientInGame(i)&&GetClientTeam(client)==GetClientTeam(i))
				{
					CPrintToChatEx(i,client,sMessage);
				}[/B]
			}
		}		
		return Plugin_Handled;
	}
	return Plugin_Continue;
}

Так я получил, что живые могут общаться друг с другом, но не видят мертвых и спеков.
Однако возникла такая проблема:
Мертвые теры, кт и спеки НЕ ВИДЯТ сообщения друг друга!

Как сделать чтобы мертвые и спеки видели сообщения? Нужно как-то исправить выделенный жирным кусок кода. Помогите пожалуйста!
 
Последнее редактирование:
Сверху Снизу