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

Тема в разделе "Общие вопросы", создана пользователем Денис Быков, 22 авг 2015.

  1. Денис Быков

    Денис Быков

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

    К сожалению, я не знаю языка SourcePawn, но немного знаю 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++ и смог найти кусок кода, который нужно изменить.
    Вот он:
    Код:
    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 минут
    Поразмыслив вечером над куском этого кода, сделал вот что:
    Код:
    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;
    }

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

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