diff --git a/Leader2/content/materials/unloze/ping/ping.vmt b/Leader2/content/materials/unloze/ping/ping.vmt new file mode 100644 index 00000000..4cc01845 --- /dev/null +++ b/Leader2/content/materials/unloze/ping/ping.vmt @@ -0,0 +1,10 @@ +"VertexLitGeneric" +{ + "$basetexture" "unloze/ping/ping" + "$selfillum" "1" + "$selfillumtint" "[3 3 3]" + //"$selfillummaskscale" "10000" + "$additive" "1" + "$nocull" "1" + +} \ No newline at end of file diff --git a/Leader2/content/materials/unloze/ping/ping.vtf b/Leader2/content/materials/unloze/ping/ping.vtf new file mode 100644 index 00000000..cc300b3f Binary files /dev/null and b/Leader2/content/materials/unloze/ping/ping.vtf differ diff --git a/Leader2/content/materials/unloze/ping/ping_cross.vmt b/Leader2/content/materials/unloze/ping/ping_cross.vmt new file mode 100644 index 00000000..054f56af --- /dev/null +++ b/Leader2/content/materials/unloze/ping/ping_cross.vmt @@ -0,0 +1,10 @@ +"VertexLitGeneric" +{ + "$basetexture" "unloze/ping/ping_cross" + "$selfillum" "1" + "$selfillumtint" "[3 3 3]" + //"$selfillummaskscale" "10000" + "$additive" "1" + "$nocull" "1" + +} \ No newline at end of file diff --git a/Leader2/content/materials/unloze/ping/ping_cross.vtf b/Leader2/content/materials/unloze/ping/ping_cross.vtf new file mode 100644 index 00000000..2b01e780 Binary files /dev/null and b/Leader2/content/materials/unloze/ping/ping_cross.vtf differ diff --git a/Leader2/content/materials/unloze/ping/ping_moon.vmt b/Leader2/content/materials/unloze/ping/ping_moon.vmt new file mode 100644 index 00000000..0e4f5d05 --- /dev/null +++ b/Leader2/content/materials/unloze/ping/ping_moon.vmt @@ -0,0 +1,10 @@ +"VertexLitGeneric" +{ + "$basetexture" "unloze/ping/ping_moon" + "$selfillum" "1" + "$selfillumtint" "[3 3 3]" + //"$selfillummaskscale" "10000" + "$additive" "1" + "$nocull" "1" + +} \ No newline at end of file diff --git a/Leader2/content/materials/unloze/ping/ping_moon.vtf b/Leader2/content/materials/unloze/ping/ping_moon.vtf new file mode 100644 index 00000000..accfe633 Binary files /dev/null and b/Leader2/content/materials/unloze/ping/ping_moon.vtf differ diff --git a/Leader2/content/materials/unloze/ping/ping_skull.vmt b/Leader2/content/materials/unloze/ping/ping_skull.vmt new file mode 100644 index 00000000..3342f99f --- /dev/null +++ b/Leader2/content/materials/unloze/ping/ping_skull.vmt @@ -0,0 +1,10 @@ +"VertexLitGeneric" +{ + "$basetexture" "unloze/ping/ping_skull" + "$selfillum" "1" + "$selfillumtint" "[3 3 3]" + //"$selfillummaskscale" "10000" + "$additive" "1" + "$nocull" "1" + +} \ No newline at end of file diff --git a/Leader2/content/materials/unloze/ping/ping_skull.vtf b/Leader2/content/materials/unloze/ping/ping_skull.vtf new file mode 100644 index 00000000..060f8ddd Binary files /dev/null and b/Leader2/content/materials/unloze/ping/ping_skull.vtf differ diff --git a/Leader2/content/models/unloze/unloze_ping.dx80.vtx b/Leader2/content/models/unloze/unloze_ping.dx80.vtx new file mode 100644 index 00000000..b46a1c7f Binary files /dev/null and b/Leader2/content/models/unloze/unloze_ping.dx80.vtx differ diff --git a/Leader2/content/models/unloze/unloze_ping.dx90.vtx b/Leader2/content/models/unloze/unloze_ping.dx90.vtx new file mode 100644 index 00000000..21c27227 Binary files /dev/null and b/Leader2/content/models/unloze/unloze_ping.dx90.vtx differ diff --git a/Leader2/content/models/unloze/unloze_ping.mdl b/Leader2/content/models/unloze/unloze_ping.mdl new file mode 100644 index 00000000..ffd11b37 Binary files /dev/null and b/Leader2/content/models/unloze/unloze_ping.mdl differ diff --git a/Leader2/content/models/unloze/unloze_ping.sw.vtx b/Leader2/content/models/unloze/unloze_ping.sw.vtx new file mode 100644 index 00000000..c2ba389e Binary files /dev/null and b/Leader2/content/models/unloze/unloze_ping.sw.vtx differ diff --git a/Leader2/content/models/unloze/unloze_ping.vvd b/Leader2/content/models/unloze/unloze_ping.vvd new file mode 100644 index 00000000..77ff2501 Binary files /dev/null and b/Leader2/content/models/unloze/unloze_ping.vvd differ diff --git a/Leader2/scripting/Leader2.sp b/Leader2/scripting/Leader2.sp index cb8fbaa2..32e8b43f 100644 --- a/Leader2/scripting/Leader2.sp +++ b/Leader2/scripting/Leader2.sp @@ -8,14 +8,14 @@ #include #include -#define PLUGIN_VERSION "3.0" +#define PLUGIN_VERSION "4.0" #define MAXLEADERS 64 #pragma newdecls required -int currentSprite = -1, spriteEntities[MAXPLAYERS+1], markerEntities[MAXPLAYERS+1], leaderClient = -1; +int currentSprite = -1, spriteEntities[MAXPLAYERS+1], pingEntity0, pingEntity1, pingEntity2, pingEntity3, leaderClient = -1; int voteCount[MAXPLAYERS+1], votedFor[MAXPLAYERS+1]; -bool markerActive = false, beaconActive = false, allowVoting = false; +bool pingActive[4] = {false, ...}, beaconActive = false, allowVoting = false; ConVar g_cVDefendVTF = null; ConVar g_cVDefendVMT = null; @@ -45,8 +45,8 @@ bool g_bForceMute[MAXPLAYERS + 1] = { false, ...}; // Purpose: //---------------------------------------------------------------------------------------------------- public Plugin myinfo = { - name = "Leader", - author = "AntiTeal + Neon", + name = "Leader2", + author = "AntiTeal + Neon + Dogan", description = "Allows for a human to be a leader, and give them special functions with it.", version = PLUGIN_VERSION, url = "https://antiteal.com" @@ -63,6 +63,8 @@ public void OnPluginStart() LoadTranslations("common.phrases"); LoadTranslations("core.phrases"); + AddTempEntHook("Player Decal", HookDecal); + HookEvent("round_end", Event_RoundEnd); HookEvent("player_death", Event_PlayerDeath); //AddCommandListener(HookPlayerChat, "say"); @@ -71,6 +73,7 @@ public void OnPluginStart() RegConsoleCmd("sm_currentleader", CurrentLeader); RegConsoleCmd("sm_leaders", Leaders); RegConsoleCmd("sm_voteleader", VoteLeader); + RegConsoleCmd("sm_pingmenu", ManualPingMenu); RegAdminCmd("sm_removeleader", RemoveTheLeader, ADMFLAG_GENERIC); RegAdminCmd("sm_reloadleaders", ReloadLeaders, ADMFLAG_GENERIC); RegAdminCmd("sm_forceleader", OnToggleForceLeader, ADMFLAG_GENERIC); @@ -200,6 +203,22 @@ public void OnConfigsExecuted() AddFileToDownloadsTable(FollowVTF); AddFileToDownloadsTable(FollowVMT); + PrecacheModel("models/unloze/unloze_ping.mdl"); + AddFileToDownloadsTable("models/unloze/unloze_ping.dx80.vtx"); + AddFileToDownloadsTable("models/unloze/unloze_ping.dx90.vtx"); + AddFileToDownloadsTable("models/unloze/unloze_ping.mdl"); + AddFileToDownloadsTable("models/unloze/unloze_ping.sw.vtx"); + AddFileToDownloadsTable("models/unloze/unloze_ping.vvd"); + AddFileToDownloadsTable("materials/unloze/ping/ping.vmt"); + AddFileToDownloadsTable("materials/unloze/ping/ping.vtf"); + AddFileToDownloadsTable("materials/unloze/ping/ping_cross.vmt"); + AddFileToDownloadsTable("materials/unloze/ping/ping_cross.vtf"); + AddFileToDownloadsTable("materials/unloze/ping/ping_moon.vmt"); + AddFileToDownloadsTable("materials/unloze/ping/ping_moon.vtf"); + AddFileToDownloadsTable("materials/unloze/ping/ping_skull.vmt"); + AddFileToDownloadsTable("materials/unloze/ping/ping_skull.vtf"); + + PrecacheGeneric(DefendVTF, true); PrecacheGeneric(DefendVMT, true); PrecacheGeneric(FollowVTF, true); @@ -239,6 +258,22 @@ public void KillAllBeacons() } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void KillAllPings() +{ + pingActive[0] = false; + pingActive[1] = false; + pingActive[2] = false; + pingActive[3] = false; + + RemovePing0(); + RemovePing1(); + RemovePing2(); + RemovePing3(); +} + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -351,16 +386,61 @@ public void RemoveSprite(int client) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void RemoveMarker(int client) +public void RemovePing0() { - if (markerEntities[client] != -1 && IsValidEdict(markerEntities[client])) + if (pingEntity0 != -1 && IsValidEdict(pingEntity0)) { char m_szClassname[64]; - GetEdictClassname(markerEntities[client], m_szClassname, sizeof(m_szClassname)); - if(strcmp("env_sprite", m_szClassname)==0) - AcceptEntityInput(markerEntities[client], "Kill"); + GetEdictClassname(pingEntity0, m_szClassname, sizeof(m_szClassname)); + if(strcmp("prop_dynamic", m_szClassname)==0) + AcceptEntityInput(pingEntity0, "Kill"); } - markerEntities[client] = -1; + pingEntity0 = -1; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void RemovePing1() +{ + if (pingEntity1 != -1 && IsValidEdict(pingEntity1)) + { + char m_szClassname[64]; + GetEdictClassname(pingEntity1, m_szClassname, sizeof(m_szClassname)); + if(strcmp("prop_dynamic", m_szClassname)==0) + AcceptEntityInput(pingEntity1, "Kill"); + } + pingEntity1 = -1; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void RemovePing2() +{ + if (pingEntity2 != -1 && IsValidEdict(pingEntity2)) + { + char m_szClassname[64]; + GetEdictClassname(pingEntity2, m_szClassname, sizeof(m_szClassname)); + if(strcmp("prop_dynamic", m_szClassname)==0) + AcceptEntityInput(pingEntity2, "Kill"); + } + pingEntity2 = -1; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public void RemovePing3() +{ + if (pingEntity3 != -1 && IsValidEdict(pingEntity3)) + { + char m_szClassname[64]; + GetEdictClassname(pingEntity3, m_szClassname, sizeof(m_szClassname)); + if(strcmp("prop_dynamic", m_szClassname)==0) + AcceptEntityInput(pingEntity3, "Kill"); + } + pingEntity3 = -1; } //---------------------------------------------------------------------------------------------------- @@ -400,7 +480,6 @@ public void ToggleForceLeader(int client) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- - public Action CheckLeaderVoice(Handle timer) { if(!g_bForceLeader || leaderClient == -1) @@ -437,6 +516,7 @@ public Action CheckLeaderVoice(Handle timer) return Plugin_Continue; } + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -475,7 +555,6 @@ public void RemoveLeader(int client) //CS_SetClientContributionScore(client, leaderScore); RemoveSprite(client); - RemoveMarker(client); if(beaconActive) { @@ -484,7 +563,6 @@ public void RemoveLeader(int client) currentSprite = -1; leaderClient = -1; - markerActive = false; beaconActive = false; for(int i = 1; i < MaxClients; i++) @@ -500,28 +578,27 @@ public void RemoveLeader(int client) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public int SpawnMarker(int client, char[] sprite) +public int SpawnPing(int client, int skin) { - if(!IsPlayerAlive(client)) - { - return -1; - } + float vecAimPoint[3]; + TracePlayerAngles(client, vecAimPoint); - float Origin[3]; - GetClientEyePosition(client, Origin); - Origin[2] += 25.0; + int Ent = CreateEntityByName("prop_dynamic"); + SetEntityModel(Ent, "models/unloze/unloze_ping.mdl"); + DispatchKeyValue(Ent, "modelscale", "1.5"); - int Ent = CreateEntityByName("env_sprite"); - if(!Ent) return -1; + if (skin == 0) + SetVariantString("0"); + else if (skin == 1) + SetVariantString("1"); + else if (skin == 2) + SetVariantString("2"); + else if (skin == 3) + SetVariantString("3"); - DispatchKeyValue(Ent, "model", sprite); - DispatchKeyValue(Ent, "classname", "env_sprite"); - DispatchKeyValue(Ent, "spawnflags", "1"); - DispatchKeyValue(Ent, "scale", "0.1"); - DispatchKeyValue(Ent, "rendermode", "1"); - DispatchKeyValue(Ent, "rendercolor", "255 255 255"); + AcceptEntityInput(Ent, "Skin"); DispatchSpawn(Ent); - TeleportEntity(Ent, Origin, NULL_VECTOR, NULL_VECTOR); + TeleportEntity(Ent, vecAimPoint, NULL_VECTOR, NULL_VECTOR); return Ent; } @@ -543,6 +620,54 @@ public Action CurrentLeader(int client, int args) } } +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action ManualPingMenu(int client, int args) +{ + if(client == 0) + { + ReplyToCommand(client, "[SM] Cannot use this from console."); + return Plugin_Handled; + } + + if(CheckCommandAccess(client, "", ADMFLAG_GENERIC) || client == leaderClient) + { + if(GetClientTeam(client) == CS_TEAM_T) + { + ReplyToCommand(client, "[SM] Cannot use this while being in the Zombie Team."); + return Plugin_Handled; + } + else + { + PingMenu(client); + return Plugin_Handled; + } + + } + + ReplyToCommand(client, "[SM] You do not have access to this command."); + return Plugin_Handled; +} + +//---------------------------------------------------------------------------------------------------- +// Purpose: +//---------------------------------------------------------------------------------------------------- +public Action HookDecal(const char[] sTEName, const int[] iClients, int iNumClients, float fSendDelay) +{ + int client = TE_ReadNum("m_nPlayer"); + + if(client == leaderClient) + { + RemovePing0(); + pingEntity0 = SpawnPing(client, 1); + pingActive[0] = true; + PrintToChat(client, "[SM] 'Skull' Ping (re)placed."); + } + + return Plugin_Continue; +} + //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- @@ -851,7 +976,7 @@ public void LeaderMenu(int client) { Handle menu = CreateMenu(LeaderMenu_Handler); - char sprite[64], marker[64], beacon[64]; + char sprite[64], ping[4][64], beacon[64]; switch (currentSprite) { @@ -863,20 +988,39 @@ public void LeaderMenu(int client) sprite = "None"; } - if(markerActive) - marker = "Yes"; - else - marker = "No"; - if(beaconActive) beacon = "Yes"; else beacon = "No"; - SetMenuTitle(menu, "Leader Menu\nSprite: %s\nMarker: %s\nBeacon: %s", sprite, marker, beacon); + if(pingActive[0]) + ping[0] = "Skull"; + + if(pingActive[1]) + ping[1] = "Cross"; + + if(pingActive[2]) + ping[2] = "Moon"; + + if(pingActive[3]) + ping[3] = "Star"; + + char pings[256]; + for(int i = 0; i <= 3; i++) + { + if(!StrEqual(ping[i], "")) + StrCat(pings, sizeof(pings), ping[i]); + } + + if(strlen(pings)) + pings[strlen(pings) - 2] = 0; + else + pings = "none"; + + SetMenuTitle(menu, "Leader Menu\nSprite: %s\nPings: %s\nBeacon: %s", sprite, pings, beacon); AddMenuItem(menu, "resign", "Resign from Leader"); AddMenuItem(menu, "sprite", "Sprite Menu"); - AddMenuItem(menu, "marker", "Marker Menu"); + AddMenuItem(menu, "ping", "Ping Menu"); AddMenuItem(menu, "beacon", "Toggle Beacon"); SetMenuExitButton(menu, true); @@ -904,9 +1048,9 @@ public int LeaderMenu_Handler(Handle menu, MenuAction action, int client, int po { SpriteMenu(client); } - if(StrEqual(info, "marker")) + if(StrEqual(info, "ping")) { - MarkerMenu(client); + PingMenu(client); } if(StrEqual(info, "beacon")) { @@ -942,7 +1086,7 @@ public void SpriteMenu(int client) { Handle menu = CreateMenu(SpriteMenu_Handler); - char sprite[64], marker[64], beacon[64]; + char sprite[64], ping[4][64], beacon[64]; switch (currentSprite) { @@ -954,17 +1098,36 @@ public void SpriteMenu(int client) sprite = "None"; } - if(markerActive) - marker = "Yes"; - else - marker = "No"; - if(beaconActive) beacon = "Yes"; else beacon = "No"; - SetMenuTitle(menu, "Leader Menu\nSprite: %s\nMarker: %s\nBeacon: %s", sprite, marker, beacon); + if(pingActive[0]) + ping[0] = "Skull"; + + if(pingActive[1]) + ping[1] = "Cross"; + + if(pingActive[2]) + ping[2] = "Moon"; + + if(pingActive[3]) + ping[3] = "Star"; + + char pings[256]; + for(int i = 0; i <= 3; i++) + { + if(!StrEqual(ping[i], "")) + StrCat(pings, sizeof(pings), ping[i]); + } + + if(strlen(pings)) + pings[strlen(pings) - 2] = 0; + else + pings = "none"; + + SetMenuTitle(menu, "Leader Menu\nSprite: %s\nPings: %s\nBeacon: %s", sprite, pings, beacon); AddMenuItem(menu, "none", "No Sprite"); AddMenuItem(menu, "defend", "Defend Here"); AddMenuItem(menu, "follow", "Follow Me"); @@ -1024,11 +1187,11 @@ public int SpriteMenu_Handler(Handle menu, MenuAction action, int client, int po //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public void MarkerMenu(int client) +public void PingMenu(int client) { - Handle menu = CreateMenu(MarkerMenu_Handler); + Handle menu = CreateMenu(PingMenu_Handler); - char sprite[64], marker[64], beacon[64]; + char sprite[64], ping[4][64], beacon[64]; switch (currentSprite) { @@ -1040,19 +1203,41 @@ public void MarkerMenu(int client) sprite = "None"; } - if(markerActive) - marker = "Yes"; - else - marker = "No"; - if(beaconActive) beacon = "Yes"; else beacon = "No"; - SetMenuTitle(menu, "Leader Menu\nSprite: %s\nMarker: %s\nBeacon: %s", sprite, marker, beacon); - AddMenuItem(menu, "removemarker", "Remove Marker"); - AddMenuItem(menu, "defendmarker", "Defend Marker"); + if(pingActive[0]) + ping[0] = "Skull"; + + if(pingActive[1]) + ping[1] = "Cross"; + + if(pingActive[2]) + ping[2] = "Moon"; + + if(pingActive[3]) + ping[3] = "Star"; + + char pings[256]; + for(int i = 0; i <= 3; i++) + { + if(!StrEqual(ping[i], "")) + StrCat(pings, sizeof(pings), ping[i]); + } + + if(strlen(pings)) + pings[strlen(pings) - 2] = 0; + else + pings = "none"; + + SetMenuTitle(menu, "Leader Menu\nSprite: %s\nPings: %s\nBeacon: %s", sprite, pings, beacon); + AddMenuItem(menu, "ping0", "Skull"); + AddMenuItem(menu, "ping1", "Cross"); + AddMenuItem(menu, "ping2", "Moon"); + AddMenuItem(menu, "ping3", "Star"); + AddMenuItem(menu, "remove", "Remove All"); SetMenuExitBackButton(menu, true); SetMenuExitButton(menu, true); @@ -1062,36 +1247,62 @@ public void MarkerMenu(int client) //---------------------------------------------------------------------------------------------------- // Purpose: //---------------------------------------------------------------------------------------------------- -public int MarkerMenu_Handler(Handle menu, MenuAction action, int client, int position) +public int PingMenu_Handler(Handle menu, MenuAction action, int client, int position) { - if(leaderClient == client && IsValidClient(client)) + if(IsValidClient(client)) { if(action == MenuAction_Select) { char info[32]; GetMenuItem(menu, position, info, sizeof(info)); - if(StrEqual(info, "removemarker")) + if(StrEqual(info, "ping0")) { - RemoveMarker(client); - PrintToChat(client, "[SM] Marker removed."); - markerActive = false; - LeaderMenu(client); + RemovePing0(); + pingEntity0 = SpawnPing(client, 1); + PrintToChat(client, "[SM] 'Skull' Ping (re)placed."); + pingActive[0] = true; + PingMenu(client); } - if(StrEqual(info, "defendmarker")) + + if(StrEqual(info, "ping1")) { - RemoveMarker(client); - markerEntities[client] = SpawnMarker(client, DefendVMT); - PrintToChat(client, "[SM] 'Defend Here' marker placed."); - markerActive = true; - LeaderMenu(client); + RemovePing1(); + pingEntity1 = SpawnPing(client, 3); + PrintToChat(client, "[SM] 'Cross' Ping (re)placed."); + pingActive[1] = true; + PingMenu(client); + } + + if(StrEqual(info, "ping2")) + { + RemovePing2(); + pingEntity2 = SpawnPing(client, 2); + PrintToChat(client, "[SM] 'Moon' Ping (re)placed."); + pingActive[2] = true; + PingMenu(client); + } + + if(StrEqual(info, "ping3")) + { + RemovePing3(); + pingEntity3 = SpawnPing(client, 0); + PrintToChat(client, "[SM] 'Star' Ping (re)placed."); + pingActive[3] = true; + PingMenu(client); + } + + if(StrEqual(info, "remove")) + { + KillAllPings(); + PrintToChat(client, "[SM] All Pings removed."); } } else if(action == MenuAction_End) { delete menu; } - else if (action == MenuAction_Cancel && position == MenuCancel_ExitBack) + else if (leaderClient == client && action == MenuAction_Cancel && position == MenuCancel_ExitBack) { LeaderMenu(client); } @@ -1182,6 +1393,7 @@ public Action Event_RoundEnd(Handle event, char[] name, bool dontBroadcast) g_bForceLeader = false; KillAllBeacons(); + //KillAllPings(); } //---------------------------------------------------------------------------------------------------- @@ -1338,4 +1550,36 @@ public Action VoteLeader(int client, int argc) } return Plugin_Handled; +} + +bool TracePlayerAngles(int client, float vecResult[3]) +{ + if (!IsClientInGame(client)) + return false; + + float vecEyeAngles[3]; + float vecEyeOrigin[3]; + + GetClientEyeAngles(client, vecEyeAngles); + GetClientEyePosition(client, vecEyeOrigin); + + Handle hTraceRay = TR_TraceRayFilterEx(vecEyeOrigin, vecEyeAngles, MASK_SHOT_HULL, RayType_Infinite, TraceEntityFilter_FilterPlayers); + + if (TR_DidHit(hTraceRay)) + { + TR_GetEndPosition(vecResult, hTraceRay); + + delete hTraceRay; + + return true; + } + + delete hTraceRay; + + return false; +} + +stock bool TraceEntityFilter_FilterPlayers(int entity, int contentsMask) +{ + return entity > MaxClients; } \ No newline at end of file