Здравствуйте. Игра - ксго.
Доброго времени суток, форумчане!
Есть такой плагин 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; }
Так я получил, что живые могут общаться друг с другом, но не видят мертвых и спеков.
Однако возникла такая проблема:
Мертвые теры, кт и спеки НЕ ВИДЯТ сообщения друг друга!
Как сделать чтобы мертвые и спеки видели сообщения? Нужно как-то исправить выделенный жирным кусок кода. Помогите пожалуйста!
Кто может сделать плагин
gangs
смысл плагина кто прописан ну допустим(data/gangs_players.txt) они смогут создавать банду сама банда дает клан тег
//***
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);
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);
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);
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
//if (GetClientTeam(i) == GetClientTeam(client))
if (IsPlayerAlive(i) && IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
else CPrintToChatEx(i, client, sMessage);
}
}
return Plugin_Handled;
точное совпадение?PHP:if (IsPlayerAlive(i) && IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
#include <cstrike>
#pragma newdecls required
public Action CS_OnTerminateRound(float &delay, CSRoundEndReason &reason)
{
switch (reason)
{
case CSRoundEnd_GameStart:return Plugin_Handled;
}
return Plugin_Continue;
}
Переводил эту строку SourcePawn Transitional Syntax, но не понял, что она даёт. Требуется, как указание компилятору, что применяется новый синтаксис?#pragma newdecls required
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");
if (IsPlayerAlive(client))Format(sMessage, sizeof(sMessage), "{slategrey}[%s%s{slategrey}] %s%s{default}: %s%s", PrefixColor[client], g_sRank[client], NameColor[client], sName, TextColor[client], sMessage);
else
{
if (GetClientTeam(client) > 1)Format(sMessage, sizeof(sMessage), "%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, sizeof(sMessage), "%s*СПЕК* {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s", SpecColor[client], PrefixColor[client], g_sRank[client], NameColor[client], sName, TextColor[client], sMessage);
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (GetClientTeam(i) == GetClientTeam(client))
{
if (IsPlayerAlive(i) && IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
else 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);
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);
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);
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (IsPlayerAlive(i) && IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
else 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);
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);
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);
}
[B][I]if (IsPlayerAlive(client))CPrintToChatAllEx(client, sMessage);[/I]
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (!IsPlayerAlive(i) && !IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
}
}[/B]
return Plugin_Handled;
}
return Plugin_Continue;
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
if (!IsPlayerAlive(i) && !IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
}
}
#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");
if (IsPlayerAlive(client))Format(sMessage, sizeof(sMessage), "%s(Команде) {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s", DeathColor[client], PrefixColor[client], g_sRank[client], NameColor[client], sName, TextColor[client], sMessage);
else
{
if (GetClientTeam(client) > 1)Format(sMessage, sizeof(sMessage), "%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, sizeof(sMessage), "%s(Наблюдателям) {slategrey}[%s%s{slategrey}] %s%s{default}: %s%s", SpecColor[client], PrefixColor[client], g_sRank[client], NameColor[client], sName, TextColor[client], sMessage);
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (GetClientTeam(i) == GetClientTeam(client))
{
if (!IsPlayerAlive(i) && !IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
else if (IsPlayerAlive(client))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);
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);
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);
}
for (new i = 1; i <= MaxClients; ++i)
{
if (IsClientInGame(i))
{
if (!IsPlayerAlive(i) && !IsPlayerAlive(client))CPrintToChatEx(i, client, sMessage);
else if (IsPlayerAlive(client))CPrintToChatEx(i, 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");
}
UPD. Почему-то, если писать в командный чат быстро, то сообщения отправляются через раз. А если с интервалом в секунду, то отправляется каждое сообщение. Отчего такое может быть?
PHP:g_iLastSay[MAXPLAYERS+1]; public OnClientPutInServer(client) g_iLastSay[client] = 0; new iTime = GetTime(); if ( g_iLastSay[client] > iTime ) { return Plugin_Handled; } g_iLastSay[client] = iTime +2;
UPD. После установки данного плагина, оригинала или мода, не поступают сообщения в историю hlstatsx ce. Поступает только команда hlstatsx. С чем это может быть связано?
Не совсем понял зачем нужен фильтр, он не был установлен. На всякий случай поменял строки на те что вы кинули, но ничего не изменилось.
return Plugin_Handled;