Added python scripts for easier compiling
Fixed bunch of includes and a warnings Added ip addresses for admins to status KnifeAlert prints to everyone now if someone gets infected due to a knifed zombie Fixed WeaponCleaner not registering weapons if somebody disconnects Refactored custom-chatcolors to new syntax, added autoreplace and some fixes Added GFLClan.ru support to immunityreservedslots added nominate_removemap to mapchooser_extended and fixed a bug for recently played maps
This commit is contained in:
parent
29855d6669
commit
11aefe731b
@ -253,6 +253,7 @@ public APIWebResponse(const char[] sData, int client)
|
||||
if(!Response.ImportFromString(sData, "SteamAPIResponse"))
|
||||
{
|
||||
LogError("ImportFromString(sData, \"SteamAPIResponse\") failed.");
|
||||
delete Response;
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -6,7 +6,7 @@
|
||||
native int IsClientFriend(int client, int friend);
|
||||
native int ReadClientFriends(int client);
|
||||
|
||||
public SharedPlugin:__pl_AdvancedTargeting =
|
||||
public SharedPlugin __pl_AdvancedTargeting =
|
||||
{
|
||||
name = "AdvancedTargeting",
|
||||
file = "AdvancedTargeting.smx",
|
||||
@ -18,7 +18,7 @@ public SharedPlugin:__pl_AdvancedTargeting =
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_PLUGIN
|
||||
public __pl_myfile_SetNTVOptional()
|
||||
public __pl_AdvancedTargeting_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("IsClientFriend");
|
||||
MarkNativeAsOptional("ReadClientFriends");
|
||||
|
@ -26,36 +26,36 @@ public Plugin myinfo =
|
||||
name = "Good AFK Manager",
|
||||
author = "BotoX",
|
||||
description = "A good AFK manager?",
|
||||
version = "1.0",
|
||||
version = "1.1",
|
||||
url = ""
|
||||
};
|
||||
|
||||
public Cvar_KickTime(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_KickTime(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_fKickTime = GetConVarFloat(cvar);
|
||||
}
|
||||
public Cvar_MoveTime(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_MoveTime(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_fMoveTime = GetConVarFloat(cvar);
|
||||
}
|
||||
public Cvar_WarnTime(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_WarnTime(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_fWarnTime = GetConVarFloat(cvar);
|
||||
}
|
||||
public Cvar_KickMinPlayers(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_KickMinPlayers(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_iKickMinPlayers = GetConVarInt(cvar);
|
||||
}
|
||||
public Cvar_MoveMinPlayers(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_MoveMinPlayers(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_iMoveMinPlayers = GetConVarInt(cvar);
|
||||
}
|
||||
public Cvar_Immunity(Handle:cvar, const String:oldvalue[], const String:newvalue[])
|
||||
public void Cvar_Immunity(Handle:cvar, const char[] oldvalue, const char[] newvalue)
|
||||
{
|
||||
g_iImmunity = GetConVarInt(cvar);
|
||||
}
|
||||
|
||||
public OnPluginStart()
|
||||
public void OnPluginStart()
|
||||
{
|
||||
Handle cvar;
|
||||
HookConVarChange((cvar = CreateConVar("sm_afk_move_min", "4", "Min players for AFK move")), Cvar_MoveMinPlayers);
|
||||
@ -85,24 +85,21 @@ public OnPluginStart()
|
||||
AutoExecConfig(true, "plugin.AfkManager");
|
||||
}
|
||||
|
||||
public OnMapStart()
|
||||
public void OnMapStart()
|
||||
{
|
||||
CreateTimer(AFK_CHECK_INTERVAL, Timer_CheckPlayer, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
|
||||
for (int Index = 1; Index <= MaxClients; Index++)
|
||||
{
|
||||
g_Players_bEnabled[Index] = false;
|
||||
if (IsClientConnected(Index) && IsClientInGame(Index) && !IsFakeClient(Index))
|
||||
InitializePlayer(Index);
|
||||
}
|
||||
}
|
||||
|
||||
CheckAdminImmunity(Index)
|
||||
int CheckAdminImmunity(int Index)
|
||||
{
|
||||
if(!IsClientAuthorized(Index))
|
||||
return false;
|
||||
|
||||
AdminId Id = GetUserAdmin(Index);
|
||||
return GetAdminFlag(Id, Admin_Generic);
|
||||
}
|
||||
|
||||
ResetPlayer(Index)
|
||||
void ResetPlayer(int Index)
|
||||
{
|
||||
g_Players_bEnabled[Index] = false;
|
||||
g_Players_bFlagged[Index] = false;
|
||||
@ -113,9 +110,9 @@ ResetPlayer(Index)
|
||||
g_Players_iSpecTarget[Index] = 0;
|
||||
}
|
||||
|
||||
InitializePlayer(Index)
|
||||
void InitializePlayer(int Index)
|
||||
{
|
||||
if (!(g_iImmunity == 1 && CheckAdminImmunity(Index)))
|
||||
if(!(g_iImmunity == 1 && CheckAdminImmunity(Index)))
|
||||
{
|
||||
ResetPlayer(Index);
|
||||
g_Players_iLastAction[Index] = GetTime();
|
||||
@ -123,36 +120,37 @@ InitializePlayer(Index)
|
||||
}
|
||||
}
|
||||
|
||||
public OnClientPostAdminCheck(Index)
|
||||
public void OnClientConnected(int client)
|
||||
{
|
||||
if (!IsFakeClient(Index))
|
||||
ResetPlayer(client);
|
||||
}
|
||||
|
||||
public void OnClientPostAdminCheck(int Index)
|
||||
{
|
||||
if(!IsFakeClient(Index))
|
||||
InitializePlayer(Index);
|
||||
}
|
||||
|
||||
public OnClientDisconnect(Index)
|
||||
public void OnClientDisconnect(int Index)
|
||||
{
|
||||
ResetPlayer(Index);
|
||||
}
|
||||
|
||||
public Action:Event_PlayerTeamPost(Handle:event, const String:name[], bool:dontBroadcast)
|
||||
public Action Event_PlayerTeamPost(Handle event, const char[] name, bool dontBroadcast)
|
||||
{
|
||||
int Index = GetClientOfUserId(GetEventInt(event, "userid"));
|
||||
if (Index > 0 && !IsFakeClient(Index))
|
||||
{
|
||||
if (!g_Players_bEnabled[Index])
|
||||
InitializePlayer(Index);
|
||||
if(Index > 0 && !IsFakeClient(Index))
|
||||
g_Players_iLastAction[Index] = GetTime();
|
||||
}
|
||||
}
|
||||
|
||||
public Action:Command_Say(Index, const String:Command[], Args)
|
||||
public Action Command_Say(Index, const char[] Command, Args)
|
||||
{
|
||||
g_Players_iLastAction[Index] = GetTime();
|
||||
}
|
||||
|
||||
public Action:OnPlayerRunCmd(Index, &iButtons, &iImpulse, Float:fVel[3], Float:fAngles[3], &iWeapon)
|
||||
public Action OnPlayerRunCmd(int Index, int &iButtons, int &iImpulse, float fVel[3], float fAngles[3], int &iWeapon)
|
||||
{
|
||||
if (((g_Players_fEyePosition[Index][0] != fAngles[0]) ||
|
||||
if(((g_Players_fEyePosition[Index][0] != fAngles[0]) ||
|
||||
(g_Players_fEyePosition[Index][1] != fAngles[1]) ||
|
||||
(g_Players_fEyePosition[Index][2] != fAngles[2]))
|
||||
&& g_Players_iSpecMode[Index] != 4) // OBS_MODE_IN_EYE
|
||||
@ -172,33 +170,33 @@ public Action:OnPlayerRunCmd(Index, &iButtons, &iImpulse, Float:fVel[3], Float:f
|
||||
return Plugin_Continue;
|
||||
}
|
||||
|
||||
public Action:Timer_CheckPlayer(Handle:Timer, any:Data)
|
||||
public Action Timer_CheckPlayer(Handle Timer, any Data)
|
||||
{
|
||||
int Index;
|
||||
int Clients = 0;
|
||||
|
||||
for (Index = 1; Index <= MaxClients; Index++)
|
||||
for(Index = 1; Index <= MaxClients; Index++)
|
||||
{
|
||||
if (IsClientInGame(Index) && !IsFakeClient(Index))
|
||||
if(IsClientInGame(Index) && !IsFakeClient(Index))
|
||||
Clients++;
|
||||
}
|
||||
|
||||
bool bMovePlayers = (Clients >= g_iMoveMinPlayers && g_fMoveTime > 0.0);
|
||||
bool bKickPlayers = (Clients >= g_iKickMinPlayers && g_fKickTime > 0.0);
|
||||
|
||||
if (!bMovePlayers && !bKickPlayers)
|
||||
if(!bMovePlayers && !bKickPlayers)
|
||||
return Plugin_Continue;
|
||||
|
||||
for (Index = 1; Index <= MaxClients; Index++)
|
||||
for(Index = 1; Index <= MaxClients; Index++)
|
||||
{
|
||||
if (!g_Players_bEnabled[Index] || !IsClientInGame(Index)) // Is this player actually in the game?
|
||||
if(!g_Players_bEnabled[Index] || !IsClientInGame(Index))
|
||||
continue;
|
||||
|
||||
int iTeamNum = GetClientTeam(Index);
|
||||
|
||||
if (IsClientObserver(Index))
|
||||
if(IsClientObserver(Index))
|
||||
{
|
||||
if (iTeamNum > CS_TEAM_SPECTATOR && !IsPlayerAlive(Index))
|
||||
if(iTeamNum > CS_TEAM_SPECTATOR && !IsPlayerAlive(Index))
|
||||
continue;
|
||||
|
||||
int iSpecMode = g_Players_iSpecMode[Index];
|
||||
@ -207,68 +205,66 @@ public Action:Timer_CheckPlayer(Handle:Timer, any:Data)
|
||||
g_Players_iSpecMode[Index] = GetEntProp(Index, Prop_Send, "m_iObserverMode");
|
||||
g_Players_iSpecTarget[Index] = GetEntPropEnt(Index, Prop_Send, "m_hObserverTarget");
|
||||
|
||||
if ((iSpecMode && g_Players_iSpecMode[Index] != iSpecMode) || (iSpecTarget && g_Players_iSpecTarget[Index] != iSpecTarget))
|
||||
if((iSpecMode && g_Players_iSpecMode[Index] != iSpecMode) || (iSpecTarget && g_Players_iSpecTarget[Index] != iSpecTarget))
|
||||
g_Players_iLastAction[Index] = GetTime();
|
||||
}
|
||||
|
||||
int IdleTime = GetTime() - g_Players_iLastAction[Index];
|
||||
|
||||
if (g_Players_bFlagged[Index] && (g_fKickTime - IdleTime) > 0.0)
|
||||
if(g_Players_bFlagged[Index] && (g_fKickTime - IdleTime) > 0.0)
|
||||
{
|
||||
PrintCenterText(Index, "Welcome back!");
|
||||
PrintToChat(Index, "\x04[AFK] \x01You have been un-flagged for being inactive.");
|
||||
PrintToChat(Index, "\x04[AFK]\x01 You have been un-flagged for being inactive.");
|
||||
g_Players_bFlagged[Index] = false;
|
||||
}
|
||||
|
||||
if (bMovePlayers && iTeamNum > CS_TEAM_SPECTATOR && ( !g_iImmunity || g_iImmunity == 2 || !CheckAdminImmunity(Index)))
|
||||
if(bMovePlayers && iTeamNum > CS_TEAM_SPECTATOR && (!g_iImmunity || g_iImmunity == 2 || !CheckAdminImmunity(Index)))
|
||||
{
|
||||
float iTimeleft = g_fMoveTime - IdleTime;
|
||||
if (iTimeleft > 0.0)
|
||||
if(iTimeleft > 0.0)
|
||||
{
|
||||
if(iTimeleft <= g_fWarnTime)
|
||||
{
|
||||
PrintCenterText(Index, "Warning: If you do not move in %d seconds, you will be moved to spectate.", RoundToFloor(iTimeleft));
|
||||
PrintToChat(Index, "\x04[AFK] \x01Warning: If you do not move in %d seconds, you will be moved to spectate.", RoundToFloor(iTimeleft));
|
||||
PrintToChat(Index, "\x04[AFK]\x01 Warning: If you do not move in %d seconds, you will be moved to spectate.", RoundToFloor(iTimeleft));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
decl String:f_Name[MAX_NAME_LENGTH+4];
|
||||
Format(f_Name, sizeof(f_Name), "\x03%N\x01", Index);
|
||||
PrintToChatAll("\x04[AFK] \x01%s was moved to spectate for being AFK too long.", f_Name);
|
||||
PrintToChatAll("\x04[AFK] \x03%N\x01 was moved to spectate for being AFK too long.", Index);
|
||||
ForcePlayerSuicide(Index);
|
||||
ChangeClientTeam(Index, CS_TEAM_SPECTATOR);
|
||||
}
|
||||
}
|
||||
else if (g_fKickTime > 0.0 && (!g_iImmunity || g_iImmunity == 3 || !CheckAdminImmunity(Index)))
|
||||
else if(g_fKickTime > 0.0 && (!g_iImmunity || g_iImmunity == 3 || !CheckAdminImmunity(Index)))
|
||||
{
|
||||
float iTimeleft = g_fKickTime - IdleTime;
|
||||
if (iTimeleft > 0.0)
|
||||
if(iTimeleft > 0.0)
|
||||
{
|
||||
if (iTimeleft <= g_fWarnTime)
|
||||
if(iTimeleft <= g_fWarnTime)
|
||||
{
|
||||
PrintCenterText(Index, "Warning: If you do not move in %d seconds, you will be kick-flagged for being inactive.", RoundToFloor(iTimeleft));
|
||||
PrintToChat(Index, "\x04[AFK] \x01Warning: If you do not move in %d seconds, you will be kick-flagged for being inactive.", RoundToFloor(iTimeleft));
|
||||
PrintToChat(Index, "\x04[AFK]\x01 Warning: If you do not move in %d seconds, you will be kick-flagged for being inactive.", RoundToFloor(iTimeleft));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!g_Players_bFlagged[Index])
|
||||
if(!g_Players_bFlagged[Index])
|
||||
{
|
||||
PrintToChat(Index, "\x04[AFK] \x01You have been kick-flagged for being inactive.");
|
||||
PrintToChat(Index, "\x04[AFK]\x01 You have been kick-flagged for being inactive.");
|
||||
g_Players_bFlagged[Index] = true;
|
||||
}
|
||||
int FlaggedPlayers = 0;
|
||||
int Position = 1;
|
||||
for (int Index_ = 1; Index_ <= MaxClients; Index_++)
|
||||
for(int Index_ = 1; Index_ <= MaxClients; Index_++)
|
||||
{
|
||||
if (!g_Players_bFlagged[Index_])
|
||||
if(!g_Players_bFlagged[Index_])
|
||||
continue;
|
||||
|
||||
FlaggedPlayers++;
|
||||
int IdleTime_ = GetTime() - g_Players_iLastAction[Index_];
|
||||
|
||||
if (IdleTime_ > IdleTime)
|
||||
if(IdleTime_ > IdleTime)
|
||||
Position++;
|
||||
}
|
||||
PrintCenterText(Index, "You have been kick-flagged for being inactive. [%d/%d]", Position, FlaggedPlayers);
|
||||
@ -281,27 +277,24 @@ public Action:Timer_CheckPlayer(Handle:Timer, any:Data)
|
||||
int InactivePlayer = -1;
|
||||
int InactivePlayerTime = 0;
|
||||
|
||||
for (Index = 1; Index <= MaxClients; Index++)
|
||||
for(Index = 1; Index <= MaxClients; Index++)
|
||||
{
|
||||
if (!g_Players_bFlagged[Index])
|
||||
if(!g_Players_bEnabled[Index] || !g_Players_bFlagged[Index])
|
||||
continue;
|
||||
|
||||
int IdleTime = GetTime() - g_Players_iLastAction[Index];
|
||||
|
||||
if (IdleTime > InactivePlayerTime)
|
||||
if(IdleTime >= g_fKickTime && IdleTime > InactivePlayerTime)
|
||||
{
|
||||
InactivePlayer = Index;
|
||||
InactivePlayerTime = IdleTime;
|
||||
}
|
||||
}
|
||||
|
||||
if (InactivePlayer == -1)
|
||||
if(InactivePlayer == -1)
|
||||
break;
|
||||
else
|
||||
{
|
||||
decl String:f_Name[MAX_NAME_LENGTH+4];
|
||||
Format(f_Name, sizeof(f_Name), "\x03%N\x01", InactivePlayer);
|
||||
PrintToChatAll("\x04[AFK] %s was kicked for being AFK too long. (%d seconds)", f_Name, InactivePlayerTime);
|
||||
PrintToChatAll("\x04[AFK] \x03%N\x01 was kicked for being AFK too long. (%d seconds)", InactivePlayer, InactivePlayerTime);
|
||||
KickClient(InactivePlayer, "[AFK] You were kicked for being AFK too long. (%d seconds)", InactivePlayerTime);
|
||||
Clients--;
|
||||
g_Players_bFlagged[InactivePlayer] = false;
|
||||
|
@ -27,13 +27,13 @@ public OnPluginStart()
|
||||
{
|
||||
LoadTranslations("common.phrases");
|
||||
RegAdminCmd("sm_hp", Command_Health, ADMFLAG_GENERIC, "sm_hp <#userid|name> <value>");
|
||||
RegAdminCmd("sm_kevlar", Command_Kevlar, ADMFLAG_GENERIC, "sm_kevlar <#userid|name> <value>");
|
||||
RegAdminCmd("sm_armor", Command_Armor, ADMFLAG_GENERIC, "sm_armor <#userid|name> <value>");
|
||||
RegAdminCmd("sm_weapon", Command_Weapon, ADMFLAG_GENERIC, "sm_weapon <#userid|name> <name> [clip] [ammo]");
|
||||
RegAdminCmd("sm_give", Command_Weapon, ADMFLAG_GENERIC, "sm_give <#userid|name> <name> [clip] [ammo]");
|
||||
RegAdminCmd("sm_strip", Command_Strip, ADMFLAG_GENERIC, "sm_strip <#userid|name>");
|
||||
RegAdminCmd("sm_buyzone", Command_BuyZone, ADMFLAG_CUSTOM3, "sm_buyzone <#userid|name> <0|1>");
|
||||
RegAdminCmd("sm_iammo", Command_InfAmmo, ADMFLAG_CUSTOM3, "sm_iammo <#userid|name> <0|1>");
|
||||
RegAdminCmd("sm_speed", Command_Speed, ADMFLAG_CUSTOM3, "sm_speed <#userid|name> <0|1>");
|
||||
RegAdminCmd("sm_buyzone", Command_BuyZone, ADMFLAG_GENERIC, "sm_buyzone <#userid|name> <0|1>");
|
||||
RegAdminCmd("sm_iammo", Command_InfAmmo, ADMFLAG_GENERIC, "sm_iammo <#userid|name> <0|1>");
|
||||
RegAdminCmd("sm_speed", Command_Speed, ADMFLAG_GENERIC, "sm_speed <#userid|name> <0|1>");
|
||||
|
||||
HookEvent("bomb_planted", Event_BombPlanted, EventHookMode_Pre);
|
||||
HookEvent("bomb_defused", Event_BombDefused, EventHookMode_Pre);
|
||||
@ -229,11 +229,11 @@ public Action:Command_Health(client, args)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_Kevlar(client, args)
|
||||
public Action:Command_Armor(client, args)
|
||||
{
|
||||
if(args < 2)
|
||||
{
|
||||
ReplyToCommand(client, "[SM] Usage: sm_kevlar <#userid|name> <value>");
|
||||
ReplyToCommand(client, "[SM] Usage: sm_armor <#userid|name> <value>");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -365,6 +365,11 @@ public Action:Command_Weapon(client, args)
|
||||
for(new i = 0; i < target_count; i++)
|
||||
SetEntProp(target_list[i], Prop_Send, "m_bHasNightVision", 1, 1);
|
||||
}
|
||||
else if(StrEqual(weapon, "item_defuser", false))
|
||||
{
|
||||
for(new i = 0; i < target_count; i++)
|
||||
SetEntProp(target_list[i], Prop_Send, "m_bHasDefuser", 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
for(new i = 0; i < target_count; i++)
|
||||
|
@ -25,6 +25,8 @@ public Plugin:myinfo =
|
||||
//----------------------------------------------------------------------------------------------------
|
||||
public OnPluginStart()
|
||||
{
|
||||
LoadTranslations("common.phrases");
|
||||
|
||||
RegAdminCmd("sm_forceinput", Command_ForceInput, ADMFLAG_ROOT);
|
||||
RegAdminCmd("sm_forceinputplayer", Command_ForceInputPlayer, ADMFLAG_ROOT);
|
||||
}
|
||||
@ -53,7 +55,7 @@ public Action:Command_ForceInputPlayer(client, args)
|
||||
client,
|
||||
target_list,
|
||||
MAXPLAYERS,
|
||||
COMMAND_FILTER_ALIVE,
|
||||
0,
|
||||
target_name,
|
||||
sizeof(target_name),
|
||||
tn_is_ml)) <= 0)
|
||||
|
@ -14,7 +14,7 @@ public Plugin myinfo =
|
||||
name = "Knife Notifications",
|
||||
author = "Obus + BotoX",
|
||||
description = "Notify administrators when zombies have been knifed by humans.",
|
||||
version = "2.1",
|
||||
version = "2.2",
|
||||
url = ""
|
||||
};
|
||||
|
||||
@ -106,12 +106,8 @@ public Action Event_PlayerHurt(Handle hEvent, const char[] name, bool dontBroadc
|
||||
else
|
||||
LogMessage("%L killed %L (Recently knifed by a disconnected player [%s])", attacker, victim, g_sAttackerSID[attacker]);
|
||||
|
||||
for(int i = 1; i <= MaxClients; i++)
|
||||
{
|
||||
if(IsClientConnected(i) && IsClientInGame(i) && (IsClientSourceTV(i) || GetAdminFlag(GetUserAdmin(i), Admin_Generic)))
|
||||
CPrintToChat(i, "{green}[SM] {red}%N {green}(%s){default} killed {blue}%N{default} - knifed by {blue}%s {green}(%s)",
|
||||
attacker, sAtkSID, victim, (pOldKnifer != -1) ? sAtkAttackerName : "a disconnected player", g_sAttackerSID[attacker]);
|
||||
}
|
||||
CPrintToChatAll("{green}[SM] {red}%N {green}(%s){default} killed {blue}%N{default} - knifed by {blue}%s {green}(%s)",
|
||||
attacker, sAtkSID, victim, (pOldKnifer != -1) ? sAtkAttackerName : "a disconnected player", g_sAttackerSID[attacker]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -34,7 +34,7 @@ public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
|
||||
public OnPluginStart()
|
||||
{
|
||||
// Convars.
|
||||
new Handle:hCvar = CreateConVar("sm_napalmlagfix_version", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_PLUGIN|FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
new Handle:hCvar = CreateConVar("sm_napalmlagfix_version", PLUGIN_VERSION, PLUGIN_NAME, FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
SetConVarString(hCvar, PLUGIN_VERSION);
|
||||
|
||||
// Gamedata.
|
||||
|
@ -13,6 +13,7 @@
|
||||
"restore"
|
||||
{
|
||||
"AddOutput" "OnUser1 leveling_counter,Add,1,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"m_iFrags" "10"
|
||||
}
|
||||
}
|
||||
@ -29,6 +30,8 @@
|
||||
"restore"
|
||||
{
|
||||
"AddOutput" "OnUser1 leveling_counter,Add,2,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"m_iFrags" "20"
|
||||
}
|
||||
}
|
||||
@ -45,6 +48,9 @@
|
||||
"restore"
|
||||
{
|
||||
"AddOutput" "OnUser1 leveling_counter,Add,3,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"AddOutput" "OnUser4 score10,ApplyScore,,0,-1"
|
||||
"m_iFrags" "30"
|
||||
}
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ bool g_Plugin_zombiereloaded = false;
|
||||
bool g_Plugin_voiceannounce_ex = false;
|
||||
bool g_Plugin_AdvancedTargeting = false;
|
||||
|
||||
#define PLUGIN_VERSION "2.0"
|
||||
#define PLUGIN_VERSION "2.0.1"
|
||||
|
||||
public Plugin myinfo =
|
||||
{
|
||||
@ -50,6 +50,8 @@ char g_PlayerNames[MAXPLAYERS+1][MAX_NAME_LENGTH];
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
LoadTranslations("common.phrases");
|
||||
|
||||
CreateConVar("sm_selfmute_version", PLUGIN_VERSION, "Version of Self-Mute", FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY);
|
||||
|
||||
RegConsoleCmd("sm_sm", Command_SelfMute, "Mute player by typing !sm [playername]");
|
||||
@ -803,84 +805,94 @@ void DisplayUnMuteMenu(int client)
|
||||
/*
|
||||
* HOOKS
|
||||
*/
|
||||
int g_MsgDest;
|
||||
int g_MsgClient;
|
||||
char g_MsgName[256];
|
||||
char g_MsgParam1[256];
|
||||
char g_MsgParam2[256];
|
||||
char g_MsgParam3[256];
|
||||
char g_MsgParam4[256];
|
||||
int g_MsgPlayersNum;
|
||||
int g_MsgPlayers[MAXPLAYERS + 1];
|
||||
#define MAX_MESSAGES 8
|
||||
|
||||
int g_TimerDerp = 0;
|
||||
int g_MsgDest[MAX_MESSAGES];
|
||||
int g_MsgClient[MAX_MESSAGES] = {-1, ...};
|
||||
char g_MsgName[MAX_MESSAGES][256];
|
||||
char g_MsgParam1[MAX_MESSAGES][256];
|
||||
char g_MsgParam2[MAX_MESSAGES][256];
|
||||
char g_MsgParam3[MAX_MESSAGES][256];
|
||||
char g_MsgParam4[MAX_MESSAGES][256];
|
||||
int g_MsgPlayersNum[MAX_MESSAGES];
|
||||
int g_MsgPlayers[MAX_MESSAGES][MAXPLAYERS + 1];
|
||||
|
||||
int g_NumMessages = 0;
|
||||
|
||||
public Action Hook_UserMessageRadioText(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
||||
{
|
||||
g_MsgDest = BfReadByte(bf);
|
||||
g_MsgClient = BfReadByte(bf);
|
||||
BfReadString(bf, g_MsgName, sizeof(g_MsgName), false);
|
||||
BfReadString(bf, g_MsgParam1, sizeof(g_MsgParam1), false);
|
||||
BfReadString(bf, g_MsgParam2, sizeof(g_MsgParam2), false);
|
||||
BfReadString(bf, g_MsgParam3, sizeof(g_MsgParam3), false);
|
||||
BfReadString(bf, g_MsgParam4, sizeof(g_MsgParam4), false);
|
||||
if(g_NumMessages >= MAX_MESSAGES)
|
||||
return Plugin_Handled; // Silently drop
|
||||
|
||||
g_MsgPlayersNum = playersNum;
|
||||
g_MsgDest[g_NumMessages] = BfReadByte(bf);
|
||||
g_MsgClient[g_NumMessages] = BfReadByte(bf);
|
||||
BfReadString(bf, g_MsgName[g_NumMessages], sizeof(g_MsgName[]), false);
|
||||
BfReadString(bf, g_MsgParam1[g_NumMessages], sizeof(g_MsgParam1[]), false);
|
||||
BfReadString(bf, g_MsgParam2[g_NumMessages], sizeof(g_MsgParam2[]), false);
|
||||
BfReadString(bf, g_MsgParam3[g_NumMessages], sizeof(g_MsgParam3[]), false);
|
||||
BfReadString(bf, g_MsgParam4[g_NumMessages], sizeof(g_MsgParam4[]), false);
|
||||
|
||||
g_MsgPlayersNum[g_NumMessages] = playersNum;
|
||||
for(int i = 0; i < playersNum; i++)
|
||||
g_MsgPlayers[i] = players[i];
|
||||
|
||||
if(!g_TimerDerp)
|
||||
CreateTimer(0.1, Timer_PlayerRadio);
|
||||
|
||||
g_TimerDerp++;
|
||||
if(g_TimerDerp > 1)
|
||||
PrintToServer("DEBUG: Timer_PlayerRadio derped! (%d)", g_TimerDerp);
|
||||
g_MsgPlayers[g_NumMessages][i] = players[i];
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
char g_MsgRadioSound[256];
|
||||
char g_MsgRadioSound[MAX_MESSAGES][256];
|
||||
|
||||
public Action Hook_UserMessageSendAudio(UserMsg msg_id, Handle bf, const int[] players, int playersNum, bool reliable, bool init)
|
||||
{
|
||||
BfReadString(bf, g_MsgRadioSound, sizeof(g_MsgRadioSound), false);
|
||||
if(g_NumMessages >= MAX_MESSAGES)
|
||||
return Plugin_Handled; // Silently drop
|
||||
|
||||
BfReadString(bf, g_MsgRadioSound[g_NumMessages], sizeof(g_MsgRadioSound[]), false);
|
||||
|
||||
if(!g_NumMessages)
|
||||
CreateTimer(0.1, Timer_PlayerRadio);
|
||||
|
||||
g_NumMessages++;
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action Timer_PlayerRadio(Handle timer)
|
||||
{
|
||||
g_TimerDerp = 0;
|
||||
if(g_MsgClient == -1)
|
||||
return Plugin_Continue;
|
||||
|
||||
int[] players = new int[g_MsgPlayersNum + 1];
|
||||
int playersNum = 0;
|
||||
|
||||
for(int i = 0; i < g_MsgPlayersNum; i++)
|
||||
for(int NumMsg = 0; NumMsg < g_NumMessages; NumMsg++)
|
||||
{
|
||||
int client = g_MsgPlayers[i];
|
||||
if(IsClientInGame(client) && !GetIgnored(client, g_MsgClient))
|
||||
players[playersNum++] = client;
|
||||
if(g_MsgClient[NumMsg] == -1)
|
||||
continue;
|
||||
|
||||
int[] players = new int[g_MsgPlayersNum[NumMsg] + 1];
|
||||
int playersNum = 0;
|
||||
|
||||
for(int i = 0; i < g_MsgPlayersNum[NumMsg]; i++)
|
||||
{
|
||||
int client = g_MsgPlayers[NumMsg][i];
|
||||
if(IsClientInGame(client) && !GetIgnored(client, g_MsgClient[NumMsg]))
|
||||
players[playersNum++] = client;
|
||||
}
|
||||
|
||||
Handle RadioText = StartMessage("RadioText", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||
BfWriteByte(RadioText, g_MsgDest[NumMsg]);
|
||||
BfWriteByte(RadioText, g_MsgClient[NumMsg]);
|
||||
BfWriteString(RadioText, g_MsgName[NumMsg]);
|
||||
BfWriteString(RadioText, g_MsgParam1[NumMsg]);
|
||||
BfWriteString(RadioText, g_MsgParam2[NumMsg]);
|
||||
BfWriteString(RadioText, g_MsgParam3[NumMsg]);
|
||||
BfWriteString(RadioText, g_MsgParam4[NumMsg]);
|
||||
EndMessage();
|
||||
|
||||
Handle SendAudio = StartMessage("SendAudio", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||
BfWriteString(SendAudio, g_MsgRadioSound[NumMsg]);
|
||||
EndMessage();
|
||||
|
||||
g_MsgClient[NumMsg] = -1;
|
||||
}
|
||||
|
||||
Handle RadioText = StartMessage("RadioText", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||
BfWriteByte(RadioText, g_MsgDest);
|
||||
BfWriteByte(RadioText, g_MsgClient);
|
||||
BfWriteString(RadioText, g_MsgName);
|
||||
BfWriteString(RadioText, g_MsgParam1);
|
||||
BfWriteString(RadioText, g_MsgParam2);
|
||||
BfWriteString(RadioText, g_MsgParam3);
|
||||
BfWriteString(RadioText, g_MsgParam4);
|
||||
EndMessage();
|
||||
g_NumMessages = 0;
|
||||
|
||||
Handle SendAudio = StartMessage("SendAudio", players, playersNum, USERMSG_RELIABLE | USERMSG_BLOCKHOOKS);
|
||||
BfWriteString(SendAudio, g_MsgRadioSound);
|
||||
EndMessage();
|
||||
|
||||
g_MsgClient = -1;
|
||||
|
||||
return Plugin_Continue;
|
||||
return Plugin_Stop;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -27,7 +27,7 @@ public Plugin myinfo =
|
||||
name = "Status Fixer",
|
||||
author = "zaCade + BotoX",
|
||||
description = "Fixes the 'status' command",
|
||||
version = "1.1",
|
||||
version = "1.2",
|
||||
url = ""
|
||||
};
|
||||
|
||||
@ -98,7 +98,7 @@ public Action Command_Status(int client, const char[] command, int args)
|
||||
Format(sSendBuffer, sizeof(sSendBuffer), "%stags : %s\n", sSendBuffer, sServerTags);
|
||||
Format(sSendBuffer, sizeof(sSendBuffer), "%s%edicts : %d/%d/%d (used/max/free)\n", sSendBuffer, GetEntityCount(), GetMaxEntities(), GetMaxEntities() - GetEntityCount());
|
||||
Format(sSendBuffer, sizeof(sSendBuffer), "%splayers : %d humans | %d bots (%d/%d)\n", sSendBuffer, iRealClients, iFakeClients, iTotalClients, MaxClients);
|
||||
Format(sSendBuffer, sizeof(sSendBuffer), "%s# %8s %40s %24s %12s %4s %4s %s", sSendBuffer, "userid", "name", "uniqueid", "connected", "ping", "loss", "state");
|
||||
Format(sSendBuffer, sizeof(sSendBuffer), "%s# %8s %40s %24s %12s %4s %4s %s %s", sSendBuffer, "userid", "name", "uniqueid", "connected", "ping", "loss", "state", "addr");
|
||||
|
||||
g_hPlayerList[client] = CreateArray(ByteCountToCells(1000));
|
||||
|
||||
@ -117,6 +117,7 @@ public Action Command_Status(int client, const char[] command, int args)
|
||||
char sPlayerPing[4];
|
||||
char sPlayerLoss[4];
|
||||
static char sPlayerState[16];
|
||||
char sPlayerAddr[16];
|
||||
|
||||
Format(sPlayerID, sizeof(sPlayerID), "%d", GetClientUserId(player));
|
||||
Format(sPlayerName, sizeof(sPlayerName), "\"%N\"", player);
|
||||
@ -144,8 +145,11 @@ public Action Command_Status(int client, const char[] command, int args)
|
||||
else
|
||||
Format(sPlayerState, sizeof(sPlayerState), "spawning");
|
||||
|
||||
if(GetAdminFlag(GetUserAdmin(client), Admin_Ban))
|
||||
GetClientIP(player, sPlayerAddr, sizeof(sPlayerAddr));
|
||||
|
||||
static char sFormatted[128];
|
||||
Format(sFormatted, sizeof(sFormatted), "# %8s %40s %24s %12s %4s %4s %s\n", sPlayerID, sPlayerName, sPlayerAuth, sPlayerTime, sPlayerPing, sPlayerLoss, sPlayerState);
|
||||
Format(sFormatted, sizeof(sFormatted), "# %8s %40s %24s %12s %4s %4s %s %s\n", sPlayerID, sPlayerName, sPlayerAuth, sPlayerTime, sPlayerPing, sPlayerLoss, sPlayerState, sPlayerAddr);
|
||||
|
||||
int iFormattedLength = strlen(sFormatted);
|
||||
if(iBufLength + iFormattedLength >= 1000)
|
||||
|
@ -10,12 +10,12 @@ Handle g_hTimer = INVALID_HANDLE;
|
||||
ConVar g_CVar_MaxWeapons;
|
||||
ConVar g_CVar_WeaponLifetime;
|
||||
|
||||
new g_RealRoundStartedTime;
|
||||
new g_MaxWeapons;
|
||||
new g_MaxWeaponLifetime;
|
||||
int g_RealRoundStartedTime;
|
||||
int g_MaxWeapons;
|
||||
int g_MaxWeaponLifetime;
|
||||
|
||||
#define MAX_WEAPONS MAXPLAYERS
|
||||
new G_WeaponArray[MAX_WEAPONS][2];
|
||||
int G_WeaponArray[MAX_WEAPONS][2];
|
||||
|
||||
|
||||
public Plugin myinfo =
|
||||
@ -23,19 +23,17 @@ public Plugin myinfo =
|
||||
name = "WeaponCleaner",
|
||||
author = "BotoX",
|
||||
description = "Clean unneeded weapons",
|
||||
version = "2.0",
|
||||
version = "2.1",
|
||||
url = ""
|
||||
};
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
RegAdminCmd("sm_sweep", Command_CleanupWeapons, ADMFLAG_GENERIC, "Cleans up all the weapons on the map unless they have a HammerID attached to them.");
|
||||
|
||||
g_CVar_MaxWeapons = CreateConVar("sm_weaponcleaner_max", "5", "The maximum amount of weapons allowed in the game.", 0, true, 0.0, true, MAX_WEAPONS - 1.0);
|
||||
g_MaxWeapons = g_CVar_MaxWeapons.IntValue;
|
||||
g_CVar_MaxWeapons.AddChangeHook(OnConVarChanged);
|
||||
|
||||
g_CVar_WeaponLifetime = CreateConVar("sm_weaponcleaner_lifetime", "15", "The maximum amount of time in seconds a weapon is allowed in the game.", 0, true, 0.0);
|
||||
g_CVar_WeaponLifetime = CreateConVar("sm_weaponcleaner_lifetime", "15", "The maximum number of seconds a weapon is allowed in the game.", 0, true, 0.0);
|
||||
g_MaxWeaponLifetime = g_CVar_WeaponLifetime.IntValue;
|
||||
g_CVar_WeaponLifetime.AddChangeHook(OnConVarChanged);
|
||||
|
||||
@ -51,10 +49,10 @@ public void OnConVarChanged(ConVar convar, const char[] oldValue, const char[] n
|
||||
if(StringToInt(newValue) < StringToInt(oldValue))
|
||||
{
|
||||
// Need to shrink list and kill items
|
||||
new d = StringToInt(oldValue) - StringToInt(newValue);
|
||||
int d = StringToInt(oldValue) - StringToInt(newValue);
|
||||
|
||||
// Kill items that don't have space anymore
|
||||
for(new i = 0; d && i < g_MaxWeapons; i++)
|
||||
for(int i = 0; d && i < g_MaxWeapons; i++)
|
||||
{
|
||||
if(!G_WeaponArray[i][0])
|
||||
continue;
|
||||
@ -101,6 +99,14 @@ public void OnClientDisconnect(int client)
|
||||
{
|
||||
SDKUnhook(client, SDKHook_WeaponDropPost, OnWeaponDrop);
|
||||
SDKUnhook(client, SDKHook_WeaponEquipPost, OnWeaponEquip);
|
||||
|
||||
// Simulate dropping all equipped weapons
|
||||
for(int i = 0; i < 5; i++)
|
||||
{
|
||||
int weapon = GetPlayerWeaponSlot(client, i);
|
||||
if(weapon != -1)
|
||||
OnWeaponDrop(client, weapon);
|
||||
}
|
||||
}
|
||||
|
||||
public void OnEntityCreated(int entity, const char[] classname)
|
||||
@ -118,7 +124,7 @@ public void OnEntityDestroyed(int entity)
|
||||
|
||||
public void OnWeaponSpawned(int entity)
|
||||
{
|
||||
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
int HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
// Should not be cleaned since it's a map spawned weapon
|
||||
if(HammerID)
|
||||
return;
|
||||
@ -133,7 +139,7 @@ public Action OnWeaponEquip(int client, int entity)
|
||||
if(!IsValidEntity(entity))
|
||||
return;
|
||||
|
||||
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
int HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
// Should not be cleaned since it's a map spawned weapon
|
||||
if(HammerID)
|
||||
return;
|
||||
@ -147,7 +153,7 @@ public Action OnWeaponDrop(int client, int entity)
|
||||
if(!IsValidEntity(entity))
|
||||
return;
|
||||
|
||||
new HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
int HammerID = GetEntProp(entity, Prop_Data, "m_iHammerID");
|
||||
// Should not be cleaned since it's a map spawned weapon
|
||||
if(HammerID)
|
||||
return;
|
||||
@ -167,7 +173,7 @@ public Action OnWeaponDrop(int client, int entity)
|
||||
bool InsertWeapon(int entity)
|
||||
{
|
||||
// Try to find a free slot
|
||||
for(new i = 0; i < g_MaxWeapons; i++)
|
||||
for(int i = 0; i < g_MaxWeapons; i++)
|
||||
{
|
||||
if(G_WeaponArray[i][0])
|
||||
continue;
|
||||
@ -192,14 +198,14 @@ bool InsertWeapon(int entity)
|
||||
bool RemoveWeapon(int entity)
|
||||
{
|
||||
// Find the Weapon
|
||||
for(new i = 0; i < g_MaxWeapons; i++)
|
||||
for(int i = 0; i < g_MaxWeapons; i++)
|
||||
{
|
||||
if(G_WeaponArray[i][0] == entity)
|
||||
{
|
||||
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
|
||||
|
||||
// Move list items in front of this index back by one
|
||||
for(new j = i + 1; j < g_MaxWeapons; j++)
|
||||
for(int j = i + 1; j < g_MaxWeapons; j++)
|
||||
{
|
||||
G_WeaponArray[j - 1][0] = G_WeaponArray[j][0];
|
||||
G_WeaponArray[j - 1][1] = G_WeaponArray[j][1];
|
||||
@ -217,12 +223,12 @@ bool RemoveWeapon(int entity)
|
||||
|
||||
bool CheckWeapons()
|
||||
{
|
||||
for(new i = 0; i < g_MaxWeapons; i++)
|
||||
for(int i = 0; i < g_MaxWeapons; i++)
|
||||
{
|
||||
if(!G_WeaponArray[i][0])
|
||||
continue;
|
||||
|
||||
if(GetTime() - G_WeaponArray[i][1] >= g_MaxWeaponLifetime)
|
||||
if(g_MaxWeaponLifetime && GetTime() - G_WeaponArray[i][1] >= g_MaxWeaponLifetime)
|
||||
{
|
||||
// Kill it
|
||||
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
|
||||
@ -235,27 +241,12 @@ bool CheckWeapons()
|
||||
return true;
|
||||
}
|
||||
|
||||
void CleanupWeapons()
|
||||
{
|
||||
for(new i = 0; i < g_MaxWeapons; i++)
|
||||
{
|
||||
if(!G_WeaponArray[i][0])
|
||||
continue;
|
||||
|
||||
// Kill it
|
||||
AcceptEntityInput(G_WeaponArray[i][0], "Kill");
|
||||
// This implicitly calls OnEntityDestroyed() which calls RemoveWeapon()
|
||||
|
||||
// Move index backwards (since the list was modified by removing it)
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
public Action Event_RoundStart(Handle:event, const char[] name, bool:dontBroadcast)
|
||||
{
|
||||
for(new i = 0; i < MAX_WEAPONS; i++)
|
||||
{
|
||||
G_WeaponArray[i][0] = 0; G_WeaponArray[i][1] = 0;
|
||||
G_WeaponArray[i][0] = 0;
|
||||
G_WeaponArray[i][1] = 0;
|
||||
}
|
||||
g_RealRoundStartedTime = GetTime() + GetConVarInt(FindConVar("mp_freezetime"));
|
||||
}
|
||||
@ -264,11 +255,3 @@ public Action Timer_CleanupWeapons(Handle:timer)
|
||||
{
|
||||
CheckWeapons();
|
||||
}
|
||||
|
||||
public Action Command_CleanupWeapons(client, args)
|
||||
{
|
||||
CleanupWeapons();
|
||||
|
||||
LogAction(client, -1, "%L performed a weapons cleanup", client);
|
||||
PrintToChat(client, "[SM] Weapons cleaned successfully!");
|
||||
}
|
||||
|
@ -22,8 +22,8 @@ public Plugin myinfo =
|
||||
|
||||
public void OnPluginStart()
|
||||
{
|
||||
g_hCvar_WeaponSecondary = CreateConVar("sm_weaponequip_secondary", "weapon_elite", "The name of the secondary weapon to give.", FCVAR_PLUGIN);
|
||||
g_hCvar_WeaponPrimary = CreateConVar("sm_weaponequip_primary", "weapon_p90", "The name of the secondary weapon to give.", FCVAR_PLUGIN);
|
||||
g_hCvar_WeaponSecondary = CreateConVar("sm_weaponequip_secondary", "weapon_elite", "The name of the secondary weapon to give.");
|
||||
g_hCvar_WeaponPrimary = CreateConVar("sm_weaponequip_primary", "weapon_p90", "The name of the secondary weapon to give.");
|
||||
|
||||
AutoExecConfig(true, "plugin.WeaponEquip");
|
||||
}
|
||||
|
37
compile-all.py
Executable file
37
compile-all.py
Executable file
@ -0,0 +1,37 @@
|
||||
#!/usr/bin/python3
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
SM_INCLUDES = "includes"
|
||||
SPCOMP = "./spcomp"
|
||||
|
||||
if __name__ == "__main__":
|
||||
Plugins = []
|
||||
Path, Directories, Files = next(os.walk("."))
|
||||
for Directory in Directories:
|
||||
if Directory != ".git" and Directory != "include" and Directory != "includes" and Directory != "plugins":
|
||||
Plugins.append(Directory)
|
||||
|
||||
for Plugin in Plugins:
|
||||
print("Compiling {0}".format(Plugin))
|
||||
|
||||
SourcePath = os.path.join(Plugin, "scripting")
|
||||
Path, Directories, Files = next(os.walk(SourcePath))
|
||||
for File in Files:
|
||||
if File.endswith(".sp"):
|
||||
SourcePath = os.path.join(Path, File)
|
||||
IncludePath = os.path.join(Path, "include")
|
||||
OutDir = "plugins"
|
||||
OutPath = os.path.join(OutDir, os.path.splitext(os.path.basename(SourcePath))[0] + ".smx")
|
||||
|
||||
Compiler = [SPCOMP, "-i" + SM_INCLUDES]
|
||||
if os.path.isdir(IncludePath):
|
||||
Compiler.append("-i" + IncludePath)
|
||||
Compiler.append(SourcePath)
|
||||
Compiler.append("-o" + OutPath)
|
||||
|
||||
try:
|
||||
subprocess.run(Compiler, check=True)
|
||||
except Exception:
|
||||
sys.exit(1)
|
36
compile.py
Executable file
36
compile.py
Executable file
@ -0,0 +1,36 @@
|
||||
#!/usr/bin/python3
|
||||
import os
|
||||
import sys
|
||||
import subprocess
|
||||
|
||||
SM_INCLUDES = "includes"
|
||||
SPCOMP = "./spcomp"
|
||||
|
||||
if __name__ == "__main__":
|
||||
Plugins = []
|
||||
for Directory in sys.argv[1:]:
|
||||
if Directory != ".git" and Directory != "include" and Directory != "includes" and Directory != "plugins":
|
||||
Plugins.append(Directory)
|
||||
|
||||
for Plugin in Plugins:
|
||||
print("Compiling {0}".format(Plugin))
|
||||
|
||||
SourcePath = os.path.join(Plugin, "scripting")
|
||||
Path, Directories, Files = next(os.walk(SourcePath))
|
||||
for File in Files:
|
||||
if File.endswith(".sp"):
|
||||
SourcePath = os.path.join(Path, File)
|
||||
IncludePath = os.path.join(Path, "include")
|
||||
OutDir = "plugins"
|
||||
OutPath = os.path.join(OutDir, os.path.splitext(os.path.basename(SourcePath))[0] + ".smx")
|
||||
|
||||
Compiler = [SPCOMP, "-i" + SM_INCLUDES]
|
||||
if os.path.isdir(IncludePath):
|
||||
Compiler.append("-i" + IncludePath)
|
||||
Compiler.append(SourcePath)
|
||||
Compiler.append("-o" + OutPath)
|
||||
|
||||
try:
|
||||
subprocess.run(Compiler, check=True)
|
||||
except Exception:
|
||||
sys.exit(1)
|
17
custom-chatcolors/configs/custom-chatcolorsreplace.cfg
Normal file
17
custom-chatcolors/configs/custom-chatcolorsreplace.cfg
Normal file
@ -0,0 +1,17 @@
|
||||
"AutoReplace"
|
||||
{
|
||||
"teh" "the"
|
||||
":lenny:" "( ͡° ͜ʖ ͡°)"
|
||||
":feel:" "( ´_ゝ`)"
|
||||
":chill:" "( ≖‿≖)"
|
||||
":cute:" "(´・ω・`)"
|
||||
":shrug:" "¯\_(ツ)_/¯"
|
||||
":smile:" "( ・◡・)"
|
||||
":sad:" "( ´A`)"
|
||||
":happy:" "(´∀`)"
|
||||
":3:" "( ¯3¯)"
|
||||
":dunno:" "┐(´д`)┌"
|
||||
":please:" "(人・_・) pleaseeee!"
|
||||
":table:" "(╯°□°)╯︵ ┻━┻"
|
||||
":?:" "ヽ( ゚Д゚)ノ?"
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -31,7 +31,7 @@ enum CCC_ColorType {
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native CCC_GetColor(client, CCC_ColorType:type, &bool:alpha = false);
|
||||
native int CCC_GetColor(int client, CCC_ColorType type, bool &alpha = false);
|
||||
|
||||
/**
|
||||
* Sets a client's color as a hexadecimal integer.
|
||||
@ -44,7 +44,7 @@ native CCC_GetColor(client, CCC_ColorType:type, &bool:alpha = false);
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native bool:CCC_SetColor(client, CCC_ColorType:type, color, bool:alpha);
|
||||
native int CCC_SetColor(int client, CCC_ColorType type, int color, bool alpha);
|
||||
|
||||
/**
|
||||
* Gets a client's tag
|
||||
@ -56,7 +56,7 @@ native bool:CCC_SetColor(client, CCC_ColorType:type, color, bool:alpha);
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native CCC_GetTag(client, String:buffer[], maxlen);
|
||||
native int CCC_GetTag(int client, char[] buffer, int maxlen);
|
||||
|
||||
/**
|
||||
* Sets a client's tag
|
||||
@ -67,7 +67,7 @@ native CCC_GetTag(client, String:buffer[], maxlen);
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native CCC_SetTag(client, const String:tag[]);
|
||||
native void CCC_SetTag(int client, const char[] tag);
|
||||
|
||||
/**
|
||||
* Resets a client's color to the value in the config file.
|
||||
@ -78,7 +78,7 @@ native CCC_SetTag(client, const String:tag[]);
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native CCC_ResetColor(client, CCC_ColorType:type);
|
||||
native int CCC_ResetColor(int client, CCC_ColorType type);
|
||||
|
||||
/**
|
||||
* Resets a client's tag to the value in the config file.
|
||||
@ -88,7 +88,7 @@ native CCC_ResetColor(client, CCC_ColorType:type);
|
||||
*
|
||||
* On error/errors: Invalid client index or client is not in game
|
||||
*/
|
||||
native CCC_ResetTag(client);
|
||||
native int CCC_ResetTag(int client);
|
||||
|
||||
/**
|
||||
* Called when a cilent's name is about to be colored
|
||||
@ -97,8 +97,8 @@ native CCC_ResetTag(client);
|
||||
* @param client Client index
|
||||
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
|
||||
*/
|
||||
#pragma deprecated Use CCC_OnColor instead
|
||||
forward Action:CCC_OnNameColor(client);
|
||||
//#pragma deprecated Use CCC_OnColor instead
|
||||
//forward Action:CCC_OnNameColor(client);
|
||||
|
||||
/**
|
||||
* Called when a client's chat is about to be colored
|
||||
@ -107,8 +107,8 @@ forward Action:CCC_OnNameColor(client);
|
||||
* @param client Client index
|
||||
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
|
||||
*/
|
||||
#pragma deprecated Use CCC_OnColor instead
|
||||
forward Action:CCC_OnChatColor(client);
|
||||
//#pragma deprecated Use CCC_OnColor instead
|
||||
//forward Action:CCC_OnChatColor(client);
|
||||
|
||||
/**
|
||||
* Called when a client's name is about to be tagged
|
||||
@ -117,8 +117,8 @@ forward Action:CCC_OnChatColor(client);
|
||||
* @param client Client index
|
||||
* @return Plugin_Handled to prevent tagging, Plugin_Continue to allow tagging
|
||||
*/
|
||||
#pragma deprecated Use CCC_OnColor instead
|
||||
forward Action:CCC_OnTagApplied(client);
|
||||
//#pragma deprecated Use CCC_OnColor instead
|
||||
//forward Action:CCC_OnTagApplied(client);
|
||||
|
||||
/**
|
||||
* Called when a client's name is about to be tagged
|
||||
@ -129,7 +129,7 @@ forward Action:CCC_OnTagApplied(client);
|
||||
* @param type What type of color will be applied. If this is CCC_TagColor, it controls whether the tag will be applied at all, not whether the tag will be colored.
|
||||
* @return Plugin_Handled to prevent coloring, Plugin_Continue to allow coloring
|
||||
*/
|
||||
forward Action:CCC_OnColor(client, const String:message[], CCC_ColorType:type);
|
||||
//forward Action:CCC_OnColor(client, const String:message[], CCC_ColorType:type);
|
||||
|
||||
/**
|
||||
* Called when a message has been fully colored and will be sent, unless further plugins modify it through Simple Chat Processor
|
||||
@ -139,7 +139,7 @@ forward Action:CCC_OnColor(client, const String:message[], CCC_ColorType:type);
|
||||
* @param maxlen Maximum length of message buffer
|
||||
* @noreturn
|
||||
*/
|
||||
forward CCC_OnChatMessage(author, String:message[], maxlen);
|
||||
//forward CCC_OnChatMessage(author, String:message[], maxlen);
|
||||
|
||||
/**
|
||||
* Called when a client's colors and tag are about to be loaded from the config file
|
||||
@ -148,7 +148,7 @@ forward CCC_OnChatMessage(author, String:message[], maxlen);
|
||||
* @param client Client index
|
||||
* @return Plugin_Handled or Plugin_Stop to prevent loading, Plugin_Continue or Plugin_Changed to allow
|
||||
*/
|
||||
forward Action:CCC_OnUserConfigPreLoaded(client);
|
||||
forward Action CCC_OnUserConfigPreLoaded(int client);
|
||||
|
||||
/**
|
||||
* Called when a client's colors and tag have been loaded from the config file
|
||||
@ -156,18 +156,19 @@ forward Action:CCC_OnUserConfigPreLoaded(client);
|
||||
* @param client Client index
|
||||
* @noreturn
|
||||
*/
|
||||
forward CCC_OnUserConfigLoaded(client);
|
||||
forward void CCC_OnUserConfigLoaded(int client);
|
||||
|
||||
/**
|
||||
* Called when the configuration file is reloaded with the sm_reloadccc command
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
forward CCC_OnConfigReloaded();
|
||||
forward void CCC_OnConfigReloaded();
|
||||
|
||||
native void CCC_UpdateIgnoredArray(bool IgnoredArray[(MAXPLAYERS + 1) * (MAXPLAYERS + 1)]);
|
||||
native int CCC_UpdateIgnoredArray(bool IgnoredArray[(MAXPLAYERS + 1) * (MAXPLAYERS + 1)]);
|
||||
|
||||
public SharedPlugin:__pl_ccc = {
|
||||
public SharedPlugin __pl_ccc =
|
||||
{
|
||||
name = "ccc",
|
||||
file = "custom-chatcolors.smx",
|
||||
#if defined REQUIRE_PLUGIN
|
||||
@ -187,4 +188,4 @@ public __pl_ccc_SetNTVOptional() {
|
||||
MarkNativeAsOptional("CCC_ResetTag");
|
||||
MarkNativeAsOptional("CCC_UpdateIgnoredArray");
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
@ -3,51 +3,56 @@
|
||||
"Cstrike_Chat_CT_Loc"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "(Counter-Terrorist) {1} : {2}"
|
||||
"en" "(Counter-Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_CT"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "(Counter-Terrorist) {1} : {2}"
|
||||
"en" "(Counter-Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_T_Loc"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "(Terrorist) {1} : {2}"
|
||||
"en" "(Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_T"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "(Terrorist) {1} : {2}"
|
||||
"en" "(Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_CT_Dead"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "*DEAD*(Counter-Terrorist) {1} : {2}"
|
||||
"en" "*DEAD*(Counter-Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_T_Dead"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "*DEAD*(Terrorist) {1} : {2}"
|
||||
"en" "*DEAD*(Terrorist) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_Spec"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "(Spectator) {1} : {2}"
|
||||
"en" "(Spectator) {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_All"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "{1} : {2}"
|
||||
"en" "{1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_AllDead"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "*DEAD* {1} : {2}"
|
||||
"en" "*DEAD* {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_AllSpec"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "*SPEC* {1} : {2}"
|
||||
"en" "*SPEC* {1} : {2}"
|
||||
}
|
||||
"Cstrike_Chat_Me"
|
||||
{
|
||||
"#format" "{1:s},{2:s}"
|
||||
"en" "* {1} {2}"
|
||||
}
|
||||
}
|
@ -123,9 +123,10 @@
|
||||
#undef REQUIRE_PLUGIN
|
||||
#include <donator>
|
||||
#include <entWatch>
|
||||
#include <GFLClanru>
|
||||
#define REQUIRE_PLUGIN
|
||||
|
||||
#define PLUGIN_VERSION "2.0.9"
|
||||
#define PLUGIN_VERSION "2.1.0"
|
||||
|
||||
// Toggle build here.
|
||||
#define EXT_CBASE 0
|
||||
@ -154,6 +155,7 @@ new bool:b_lateLoad;
|
||||
new bool:b_loaded;
|
||||
new bool:b_useDonator;
|
||||
new bool:b_useEntWatch;
|
||||
new bool:b_useGFLClanru;
|
||||
new bool:b_canKickSpec[MAXPLAYERS+1];
|
||||
|
||||
new g_HIPCount;
|
||||
@ -212,62 +214,62 @@ public OnPluginStart()
|
||||
#if EXT_CONNECT
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_autopassword");
|
||||
cvar_AutoPassword = CreateConVar("sm_irs_autopassword", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 2.0);
|
||||
cvar_AutoPassword = CreateConVar("sm_irs_autopassword", "0", desc, _, true, 0.0, true, 2.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_rejectreason_enable");
|
||||
cvar_RejectReasonEnable = CreateConVar("sm_irs_rejectreason_enable", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 1.0);
|
||||
cvar_RejectReasonEnable = CreateConVar("sm_irs_rejectreason_enable", "0", desc, _, true, 0.0, true, 1.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_rejectreason");
|
||||
cvar_RejectReason = CreateConVar("sm_irs_rejectreason", "default", desc, FCVAR_PLUGIN);
|
||||
cvar_RejectReason = CreateConVar("sm_irs_rejectreason", "default", desc, _);
|
||||
|
||||
cvar_GameTypeMVM = FindConVar("tf_gamemode_mvm");
|
||||
|
||||
#endif
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_version");
|
||||
CreateConVar("sm_irs_version", PLUGIN_VERSION, desc, FCVAR_PLUGIN|FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
CreateConVar("sm_irs_version", PLUGIN_VERSION, desc, FCVAR_SPONLY|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kicktype");
|
||||
cvar_KickType = CreateConVar("sm_irs_kicktype", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 3.0);
|
||||
cvar_KickType = CreateConVar("sm_irs_kicktype", "0", desc, _, true, 0.0, true, 3.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kickreason");
|
||||
cvar_KickReason = CreateConVar("sm_irs_kickreason", "default", desc, FCVAR_PLUGIN);
|
||||
cvar_KickReason = CreateConVar("sm_irs_kickreason", "default", desc, _);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kickreason_immunity");
|
||||
cvar_KickReasonImmunity = CreateConVar("sm_irs_kickreason_immunity", "default", desc, FCVAR_PLUGIN);
|
||||
cvar_KickReasonImmunity = CreateConVar("sm_irs_kickreason_immunity", "default", desc, _);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kicklist_file");
|
||||
cvar_KickListFile = CreateConVar("sm_irs_kicklist_file", "default", desc, FCVAR_PLUGIN);
|
||||
cvar_KickListFile = CreateConVar("sm_irs_kicklist_file", "default", desc, _);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kicklist_mode");
|
||||
cvar_KickListMode = CreateConVar("sm_irs_kicklist_mode", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 2.0);
|
||||
cvar_KickListMode = CreateConVar("sm_irs_kicklist_mode", "0", desc, _, true, 0.0, true, 2.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_log");
|
||||
cvar_Logging = CreateConVar("sm_irs_log", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 2.0);
|
||||
cvar_Logging = CreateConVar("sm_irs_log", "0", desc, _, true, 0.0, true, 2.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_immunity");
|
||||
cvar_Immunity = CreateConVar("sm_irs_immunity", "1", desc, FCVAR_PLUGIN, true, 0.0, true, 2.0);
|
||||
cvar_Immunity = CreateConVar("sm_irs_immunity", "1", desc, _, true, 0.0, true, 2.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kickspecfirst");
|
||||
cvar_Spec = CreateConVar("sm_irs_kickspecfirst", "1", desc, FCVAR_PLUGIN, true, 0.0, true, 1.0);
|
||||
cvar_Spec = CreateConVar("sm_irs_kickspecfirst", "1", desc, _, true, 0.0, true, 1.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kickspecdelay");
|
||||
cvar_SpecKickDelay = CreateConVar("sm_irs_kickspecdelay", "0", desc, FCVAR_PLUGIN, true, 0.0);
|
||||
cvar_SpecKickDelay = CreateConVar("sm_irs_kickspecdelay", "0", desc, _, true, 0.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_donator_support");
|
||||
cvar_Donator = CreateConVar("sm_irs_donator_support", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 1.0);
|
||||
cvar_Donator = CreateConVar("sm_irs_donator_support", "0", desc, _, true, 0.0, true, 1.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_donator_immunity");
|
||||
cvar_DonatorImmunity = CreateConVar("sm_irs_donator_immunity", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 99.0);
|
||||
cvar_DonatorImmunity = CreateConVar("sm_irs_donator_immunity", "0", desc, _, true, 0.0, true, 99.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_highimmunitylimit");
|
||||
cvar_HighImmunityLimit = CreateConVar("sm_irs_highimmunitylimit", "0", desc, FCVAR_PLUGIN, true, 0.0);
|
||||
cvar_HighImmunityLimit = CreateConVar("sm_irs_highimmunitylimit", "0", desc, _, true, 0.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_highimmunityvalue");
|
||||
cvar_HighImmunityValue = CreateConVar("sm_irs_highimmunityvalue", "0", desc, FCVAR_PLUGIN, true, 0.0);
|
||||
cvar_HighImmunityValue = CreateConVar("sm_irs_highimmunityvalue", "0", desc, _, true, 0.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_keepbalance");
|
||||
cvar_KeepBalance = CreateConVar("sm_irs_keepbalance", "0", desc, FCVAR_PLUGIN, true, 0.0, true, 1.0);
|
||||
cvar_KeepBalance = CreateConVar("sm_irs_keepbalance", "0", desc, _, true, 0.0, true, 1.0);
|
||||
|
||||
Format(desc, sizeof(desc), "%t", "irs_kicklist_reload");
|
||||
RegServerCmd("sm_irs_kicklist_reload", Command_KickListReload, desc);
|
||||
@ -378,6 +380,7 @@ public OnAllPluginsLoaded()
|
||||
{
|
||||
b_useDonator = LibraryExists("donator.core");
|
||||
b_useEntWatch = LibraryExists("entWatch");
|
||||
b_useGFLClanru = LibraryExists("GFLClanru");
|
||||
|
||||
new Handle:h_Plugin;
|
||||
new Handle:arr_Plugins = CreateArray(64);
|
||||
@ -427,6 +430,10 @@ public OnLibraryRemoved(const String:name[])
|
||||
{
|
||||
b_useEntWatch = false;
|
||||
}
|
||||
else if (StrEqual(name, "GFLClanru"))
|
||||
{
|
||||
b_useGFLClanru = false;
|
||||
}
|
||||
}
|
||||
|
||||
public OnLibraryAdded(const String:name[])
|
||||
@ -439,6 +446,10 @@ public OnLibraryAdded(const String:name[])
|
||||
{
|
||||
b_useEntWatch = true;
|
||||
}
|
||||
else if (StrEqual(name, "GFLClanru"))
|
||||
{
|
||||
b_useGFLClanru = true;
|
||||
}
|
||||
}
|
||||
|
||||
IRS_RemovePlugin(const String:plugin_name[])
|
||||
@ -492,7 +503,7 @@ GetRealClientCount()
|
||||
return ClientCount;
|
||||
}
|
||||
|
||||
public bool:OnClientPreConnectEx(const String:name[], String:password[255], const String:ip[], const String:steamID[], String:rejectReason[255])
|
||||
public EConnect OnClientPreConnectEx(const String:name[], String:password[255], const String:ip[], const String:steamID[], String:rejectReason[255])
|
||||
{
|
||||
new AdminId:AdminID = FindAdminByIdentity(AUTHMETHOD_STEAM, steamID);
|
||||
|
||||
@ -517,13 +528,13 @@ public bool:OnClientPreConnectEx(const String:name[], String:password[255], cons
|
||||
if (!isMVM && GetClientCount(false) < MaxClients)
|
||||
{
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] Game is not full or MVM game mode is disabled");
|
||||
return true;
|
||||
return k_OnClientPreConnectEx_Accept;
|
||||
}
|
||||
|
||||
if (isMVM && GetRealClientCount() < MAX_CLIENTS_MVM)
|
||||
{
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] Game is MVM but there's still room available (%d clients connected)", GetRealClientCount());
|
||||
return true;
|
||||
return k_OnClientPreConnectEx_Accept;
|
||||
}
|
||||
|
||||
if (GetConVarInt(cvar_KickListMode) == 2)
|
||||
@ -539,11 +550,11 @@ public bool:OnClientPreConnectEx(const String:name[], String:password[255], cons
|
||||
{
|
||||
Format(rejectReason, sizeof(rejectReason), "%t", "IRS Reject Reason");
|
||||
}
|
||||
return false;
|
||||
return k_OnClientPreConnectEx_Reject;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
return k_OnClientPreConnectEx_Accept;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -562,7 +573,7 @@ public bool:OnClientPreConnectEx(const String:name[], String:password[255], cons
|
||||
if (IRS_KickValidClient(AdminID, name, steamID, ImmunityLevel, isDonator))
|
||||
{
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] Plugin has made successful kick and will now allow client to connect");
|
||||
return true;
|
||||
return k_OnClientPreConnectEx_Accept;
|
||||
}
|
||||
else if (GetConVarInt(cvar_RejectReasonEnable) || isMVM)
|
||||
{
|
||||
@ -572,7 +583,7 @@ public bool:OnClientPreConnectEx(const String:name[], String:password[255], cons
|
||||
Format(rejectReason, sizeof(rejectReason), "%t", "IRS Reject Reason");
|
||||
}
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] No slot for connecting client, refusing connection (rejection mode)");
|
||||
return false;
|
||||
return k_OnClientPreConnectEx_Reject;
|
||||
}
|
||||
//else
|
||||
//{
|
||||
@ -588,12 +599,56 @@ public bool:OnClientPreConnectEx(const String:name[], String:password[255], cons
|
||||
{
|
||||
Format(rejectReason, sizeof(rejectReason), "%t", "IRS Reject Reason");
|
||||
}
|
||||
return false;
|
||||
return k_OnClientPreConnectEx_Reject;
|
||||
}
|
||||
|
||||
if (b_useGFLClanru)
|
||||
{
|
||||
new Handle:pack = CreateDataPack();
|
||||
WritePackString(pack, name);
|
||||
AsyncHasSteamIDReservedSlot(steamID, AsyncHasSteamIDReservedSlotCallback, pack);
|
||||
|
||||
return k_OnClientPreConnectEx_Async;
|
||||
}
|
||||
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] End of preconnection code");
|
||||
|
||||
return true;
|
||||
return k_OnClientPreConnectEx_Accept;
|
||||
}
|
||||
|
||||
public void AsyncHasSteamIDReservedSlotCallback(const char[] sSteam32ID, int Result, any Data)
|
||||
{
|
||||
// Slot free'd up while waiting or doesn't have a reserved slot?
|
||||
if(GetClientCount(false) < MaxClients || !Result)
|
||||
{
|
||||
ClientPreConnectEx(sSteam32ID, k_OnClientPreConnectEx_Accept, "");
|
||||
return;
|
||||
}
|
||||
|
||||
new String:name[MAX_NAME_LENGTH];
|
||||
ResetPack(Data);
|
||||
ReadPackString(Data, name, sizeof(name));
|
||||
|
||||
if (IRS_KickValidClient(INVALID_ADMIN_ID, name, sSteam32ID, 0, true))
|
||||
{
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] Plugin has made successful kick and will now allow client to connect");
|
||||
ClientPreConnectEx(sSteam32ID, k_OnClientPreConnectEx_Accept, "");
|
||||
return;
|
||||
}
|
||||
else if (GetConVarInt(cvar_RejectReasonEnable) || isMVM)
|
||||
{
|
||||
char rejectReason[255];
|
||||
GetConVarString(cvar_RejectReason, rejectReason, sizeof(rejectReason));
|
||||
if (StrEqual(rejectReason, "default", false))
|
||||
{
|
||||
Format(rejectReason, sizeof(rejectReason), "%t", "IRS Reject Reason");
|
||||
}
|
||||
//LogToFileEx(g_LogFilePath, "[DEBUG] No slot for connecting client, refusing connection (rejection mode)");
|
||||
ClientPreConnectEx(sSteam32ID, k_OnClientPreConnectEx_Reject, rejectReason);
|
||||
return;
|
||||
}
|
||||
|
||||
ClientPreConnectEx(sSteam32ID, k_OnClientPreConnectEx_Accept, "");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -772,7 +827,7 @@ bool:IRS_KickValidClient(const AdminId:ConnectingClientAdminID, const String:Con
|
||||
}
|
||||
|
||||
decl String:PlayerAuth[32];
|
||||
GetClientAuthString(i, PlayerAuth, sizeof(PlayerAuth));
|
||||
GetClientAuthId(i, AuthId_Steam2, PlayerAuth, sizeof(PlayerAuth));
|
||||
new AdminId:PlayerAdmin = FindAdminByIdentity(AUTHMETHOD_STEAM, PlayerAuth)
|
||||
ClientImmunity[i] = GetAdminImmunityLevel(PlayerAdmin);
|
||||
|
||||
@ -824,17 +879,17 @@ bool:IRS_KickValidClient(const AdminId:ConnectingClientAdminID, const String:Con
|
||||
continue;
|
||||
}
|
||||
|
||||
if (b_useEntWatch && IsClientInGame(i) && entWatch_HasSpecialItem(i))
|
||||
{
|
||||
if (Logging == 1)
|
||||
{
|
||||
IRS_LogClient(i, clientTeam[i], ClientImmunity[i]);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (IsClientInGame(i))
|
||||
{
|
||||
if (b_useEntWatch && entWatch_HasSpecialItem(i))
|
||||
{
|
||||
if (Logging == 1)
|
||||
{
|
||||
IRS_LogClient(i, clientTeam[i], ClientImmunity[i]);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (KickType)
|
||||
{
|
||||
case 0:
|
||||
@ -964,7 +1019,7 @@ bool:IRS_KickValidClient(const AdminId:ConnectingClientAdminID, const String:Con
|
||||
if (useKickList)
|
||||
{
|
||||
decl String:PlayerAuth[32];
|
||||
GetClientAuthString(i, PlayerAuth, sizeof(PlayerAuth));
|
||||
GetClientAuthId(i, AuthId_Steam2, PlayerAuth, sizeof(PlayerAuth));
|
||||
if (FindStringInArray(arr_KickListIDs, PlayerAuth) == -1)
|
||||
{
|
||||
if (Logging == 1)
|
||||
@ -1091,7 +1146,7 @@ bool:IRS_KickValidClient(const AdminId:ConnectingClientAdminID, const String:Con
|
||||
decl String:KickName[32];
|
||||
decl String:KickAuthid[32];
|
||||
GetClientName(KickTarget, KickName, sizeof(KickName));
|
||||
GetClientAuthString(KickTarget, KickAuthid, sizeof(KickAuthid));
|
||||
GetClientAuthId(KickTarget, AuthId_Steam2, KickAuthid, sizeof(KickAuthid));
|
||||
|
||||
if (!immunityKick)
|
||||
{
|
||||
|
@ -1,11 +1,23 @@
|
||||
#if defined _connect_included
|
||||
#endinput
|
||||
#if defined _Connect_Included
|
||||
#endinput
|
||||
#endif
|
||||
#define _connect_included
|
||||
#define _Connect_Included
|
||||
|
||||
forward bool:OnClientPreConnectEx(const String:name[], String:password[255], const String:ip[], const String:steamID[], String:rejectReason[255]);
|
||||
enum EConnect
|
||||
{
|
||||
k_OnClientPreConnectEx_Reject = 0,
|
||||
k_OnClientPreConnectEx_Accept = 1,
|
||||
k_OnClientPreConnectEx_Async = -1
|
||||
};
|
||||
|
||||
public Extension:__ext_Connect =
|
||||
forward EConnect OnClientPreConnectEx(const char[] sName, char sPassword[255], const char[] sIP, const char[] sSteam32ID, char sRejectReason[255]);
|
||||
|
||||
native bool ClientPreConnectEx(const char[] sSteam32ID, EConnect RetVal, char sRejectReason[255]);
|
||||
|
||||
/**
|
||||
* Do not edit below this line!
|
||||
*/
|
||||
public Extension __ext_connect =
|
||||
{
|
||||
name = "Connect",
|
||||
file = "connect.ext",
|
||||
@ -19,4 +31,11 @@ public Extension:__ext_Connect =
|
||||
#else
|
||||
required = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_EXTENSIONS
|
||||
public __ext_connect_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("ClientPreConnectEx");
|
||||
}
|
||||
#endif
|
||||
|
@ -0,0 +1,115 @@
|
||||
"Phrases"
|
||||
{
|
||||
"irs_version"
|
||||
{
|
||||
"en" "Immunity Reserve Slots version."
|
||||
}
|
||||
"irs_kicktype"
|
||||
{
|
||||
"en" "Who to kick when a valid player is found (0 - random, 1 - highest ping, 2 - highest time, 3 - lowest time)."
|
||||
}
|
||||
"irs_kickreason"
|
||||
{
|
||||
"en" "Message to display when a client is kicked for a normal reserve slot (\"default\" - uses translation phrase, anything else uses what you enter)."
|
||||
}
|
||||
"irs_rejectreason_enable"
|
||||
{
|
||||
"en" "Enable reject reason with the Connect extension (0 - disable, 1 - enable)."
|
||||
}
|
||||
"irs_rejectreason"
|
||||
{
|
||||
"en" "Message to display when a client gets rejected for a reserve slot when they have reserve rights with the Connect extension (\"default\" - uses translation phrase, anything else uses what you enter)."
|
||||
}
|
||||
"irs_kickreason_immunity"
|
||||
{
|
||||
"en" "Message to display when a client is kicked for a reserve slot based on immunity (\"default\" - uses translation phrase, anything else uses what you enter)."
|
||||
}
|
||||
"irs_log"
|
||||
{
|
||||
"en" "Enable logging (0 - disable, 1 - enable highly verbose logs, 2 - only log the disconnected and connecting users in regular SM logs)."
|
||||
}
|
||||
"irs_immunity"
|
||||
{
|
||||
"en" "Enable immunity check (0 - disable, 1 - immunity check if server is full of reserves, 2 - as with 1 but also allow players with high enough immunity and no reserve flag to stay connected)."
|
||||
}
|
||||
"irs_kickspecfirst"
|
||||
{
|
||||
"en" "When enabled spectators are always kicked first before anyone else (0 - disable, all players are taken into account for kicking, 1 - enable)."
|
||||
}
|
||||
"irs_kickspecdelay"
|
||||
{
|
||||
"en" "The delay, in seconds, to kick spectators (0 - instant, any other value gives spectators a grace of xx seconds until they can be kicked)."
|
||||
}
|
||||
"irs_donator_support"
|
||||
{
|
||||
"en" "When enabled along with the donators plugin, donaotrs will be allowed to connect (0 - disable, 1 - allow donators to connect)."
|
||||
}
|
||||
"irs_donator_immunity"
|
||||
{
|
||||
"en" "The immunity value to give to donators, if required for immunity checks within IRS."
|
||||
}
|
||||
"irs_highimmunitylimit"
|
||||
{
|
||||
"en" "The maximum amount of players that can connect to the server and kick a low immunity reserve slot player (0 - no limit, more than 0 to set the max limit)."
|
||||
}
|
||||
"irs_highimmunityvalue"
|
||||
{
|
||||
"en" "This value and over are players who are considered to have high immunity (0 - disable, more than 0 to set the high immunity value)."
|
||||
}
|
||||
"irs_keepbalance"
|
||||
{
|
||||
"en" "This tries to kick people in such a way to prevent autobalance (0 - disable, 1 - enable)."
|
||||
}
|
||||
"irs_autopassword"
|
||||
{
|
||||
"en" "Allow direct connecting reserve slot users to connect without having to type in the password on a password protected server with the Connect extension (0 - disable, 1 - enable, 2 - as with 1 but allow all connecting clients to connect)."
|
||||
}
|
||||
"irs_kicklist_file"
|
||||
{
|
||||
"en" "Path to kick list file (\"default\" - uses a file in the sourcemod config folder called irs_kicklist.ini, anything else uses what you enter e.g. \"cfg/kicklist.cfg\")."
|
||||
}
|
||||
"irs_kicklist_mode"
|
||||
{
|
||||
"en" "Enable kick list mode (0 - disable, normal reserve slot operation, 1 - only use a kick list to kick specific clients, 2 - as with 1 but allow any connecting client to kick people from the server)."
|
||||
}
|
||||
"irs_kicklist_reload"
|
||||
{
|
||||
"en" "Reloads the kick list."
|
||||
}
|
||||
"IRS Kick Log"
|
||||
{
|
||||
"#format" "{1:s},{2:s},{3:s},{4:s}"
|
||||
"en" "\"{1}\" ({2}) connected, \"{3}\" ({4}) was kicked."
|
||||
}
|
||||
"IRS Kick Reason"
|
||||
{
|
||||
"en" "Slot reserved."
|
||||
}
|
||||
"IRS Reject Reason"
|
||||
{
|
||||
"en" "No reserve slots available."
|
||||
}
|
||||
"IRS Kick List Reloaded"
|
||||
{
|
||||
"en" "[SM] Immunity Reserve Slots kick list reloaded."
|
||||
}
|
||||
"IRS Kick Reason Immunity"
|
||||
{
|
||||
"en" "Slot reserved - low immunity."
|
||||
}
|
||||
"IRS Plugin Error"
|
||||
{
|
||||
"#format" "{1:s}"
|
||||
"en" "Unloaded plugin {1} and moved to disabled folder, when installing IRS please do not use any other reserve slot plugins."
|
||||
}
|
||||
"IRS Kick List Path Error"
|
||||
{
|
||||
"#format" "{1:s}"
|
||||
"en" "Path to kick list file \"{1}\" not found or unreadable, disabling kick list mode until corrected."
|
||||
}
|
||||
"IRS Donator Plugin Error"
|
||||
{
|
||||
"en" "Unable to load the donator plugin, please check your plugins folder for the donator plugin or any other errors in your error logs."
|
||||
}
|
||||
}
|
||||
|
30
includes/GFLClanru.inc
Normal file
30
includes/GFLClanru.inc
Normal file
@ -0,0 +1,30 @@
|
||||
#if defined _GFLClanru_Included
|
||||
#endinput
|
||||
#endif
|
||||
#define _GFLClanru_Included
|
||||
|
||||
typeset AsyncHasSteamIDReservedSlotCallbackFunc
|
||||
{
|
||||
function void (const char[] sSteam32ID, int Result);
|
||||
function void (const char[] sSteam32ID, int Result, any Data);
|
||||
};
|
||||
|
||||
native void AsyncHasSteamIDReservedSlot(const char[] sSteam32ID, AsyncHasSteamIDReservedSlotCallbackFunc Callback, any Data = 0);
|
||||
|
||||
public SharedPlugin __pl_GFLClanru =
|
||||
{
|
||||
name = "GFLClanru",
|
||||
file = "GFLClanru.smx",
|
||||
#if defined REQUIRE_PLUGIN
|
||||
required = 1,
|
||||
#else
|
||||
required = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_PLUGIN
|
||||
public __pl_GFLClanru_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("AsyncHasSteamIDReservedSlot");
|
||||
}
|
||||
#endif
|
41
includes/connect.inc
Normal file
41
includes/connect.inc
Normal file
@ -0,0 +1,41 @@
|
||||
#if defined _Connect_Included
|
||||
#endinput
|
||||
#endif
|
||||
#define _Connect_Included
|
||||
|
||||
enum EConnect
|
||||
{
|
||||
k_OnClientPreConnectEx_Reject = 0,
|
||||
k_OnClientPreConnectEx_Accept = 1,
|
||||
k_OnClientPreConnectEx_Async = -1
|
||||
};
|
||||
|
||||
forward EConnect OnClientPreConnectEx(const char[] sName, char sPassword[255], const char[] sIP, const char[] sSteam32ID, char sRejectReason[255]);
|
||||
|
||||
native bool ClientPreConnectEx(const char[] sSteam32ID, EConnect RetVal, char sRejectReason[255]);
|
||||
|
||||
/**
|
||||
* Do not edit below this line!
|
||||
*/
|
||||
public Extension __ext_connect =
|
||||
{
|
||||
name = "Connect",
|
||||
file = "connect.ext",
|
||||
#if defined AUTOLOAD_EXTENSIONS
|
||||
autoload = 1,
|
||||
#else
|
||||
autoload = 0,
|
||||
#endif
|
||||
#if defined REQUIRE_EXTENSIONS
|
||||
required = 1,
|
||||
#else
|
||||
required = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_EXTENSIONS
|
||||
public __ext_connect_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("ClientPreConnectEx");
|
||||
}
|
||||
#endif
|
97
includes/updater.inc
Normal file
97
includes/updater.inc
Normal file
@ -0,0 +1,97 @@
|
||||
#if defined _updater_included
|
||||
#endinput
|
||||
#endif
|
||||
#define _updater_included
|
||||
|
||||
/**
|
||||
* Adds your plugin to the updater. The URL will be updated if
|
||||
* your plugin was previously added.
|
||||
*
|
||||
* @param url URL to your plugin's update file.
|
||||
* @noreturn
|
||||
*/
|
||||
native Updater_AddPlugin(const String:url[]);
|
||||
|
||||
/**
|
||||
* Removes your plugin from the updater. This does not need to
|
||||
* be called during OnPluginEnd.
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
native Updater_RemovePlugin();
|
||||
|
||||
/**
|
||||
* Forces your plugin to be checked for updates. The behaviour
|
||||
* of the update is dependant on the server's configuration.
|
||||
*
|
||||
* @return True if an update was triggered. False otherwise.
|
||||
* @error Plugin not found in updater.
|
||||
*/
|
||||
native bool:Updater_ForceUpdate();
|
||||
|
||||
/**
|
||||
* Called when your plugin is about to be checked for updates.
|
||||
*
|
||||
* @return Plugin_Handled to prevent checking, Plugin_Continue to allow it.
|
||||
*/
|
||||
forward Action:Updater_OnPluginChecking();
|
||||
|
||||
/**
|
||||
* Called when your plugin is about to begin downloading an available update.
|
||||
*
|
||||
* @return Plugin_Handled to prevent downloading, Plugin_Continue to allow it.
|
||||
*/
|
||||
forward Action:Updater_OnPluginDownloading();
|
||||
|
||||
/**
|
||||
* Called when your plugin's update files have been fully downloaded
|
||||
* and are about to write to their proper location. This should be used
|
||||
* to free read-only resources that require write access for your update.
|
||||
*
|
||||
* @note OnPluginUpdated will be called later during the same frame.
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
forward Updater_OnPluginUpdating();
|
||||
|
||||
/**
|
||||
* Called when your plugin's update has been completed. It is safe
|
||||
* to reload your plugin at this time.
|
||||
*
|
||||
* @noreturn
|
||||
*/
|
||||
forward Updater_OnPluginUpdated();
|
||||
|
||||
/**
|
||||
* @brief Reloads a plugin.
|
||||
*
|
||||
* @param plugin Plugin Handle (INVALID_HANDLE uses the calling plugin).
|
||||
* @noreturn
|
||||
*/
|
||||
stock ReloadPlugin(Handle:plugin=INVALID_HANDLE)
|
||||
{
|
||||
decl String:filename[64];
|
||||
GetPluginFilename(plugin, filename, sizeof(filename));
|
||||
ServerCommand("sm plugins reload %s", filename);
|
||||
}
|
||||
|
||||
|
||||
public SharedPlugin:__pl_updater =
|
||||
{
|
||||
name = "updater",
|
||||
file = "updater.smx",
|
||||
#if defined REQUIRE_PLUGIN
|
||||
required = 1,
|
||||
#else
|
||||
required = 0,
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_PLUGIN
|
||||
public __pl_updater_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("Updater_AddPlugin");
|
||||
MarkNativeAsOptional("Updater_RemovePlugin");
|
||||
MarkNativeAsOptional("Updater_ForceUpdate");
|
||||
}
|
||||
#endif
|
@ -6,7 +6,7 @@
|
||||
* File: zombiereloaded.inc
|
||||
* Type: Include
|
||||
* Description: Main API include file.
|
||||
* Notes: Include this file to include the whole ZR API.
|
||||
* Notes: Include this file to include the whole ZR API.
|
||||
*
|
||||
* Copyright (C) 2009-2013 Greyscale, Richard Helgeby
|
||||
*
|
||||
@ -34,3 +34,34 @@
|
||||
#include <zr/infect.zr>
|
||||
#include <zr/respawn.zr>
|
||||
#include <zr/class.zr>
|
||||
|
||||
public SharedPlugin:__pl_zombiereloaded =
|
||||
{
|
||||
name = "zombiereloaded",
|
||||
file = "zombiereloaded.smx",
|
||||
#if defined REQUIRE_PLUGIN
|
||||
required = 1
|
||||
#else
|
||||
required = 0
|
||||
#endif
|
||||
};
|
||||
|
||||
#if !defined REQUIRE_PLUGIN
|
||||
public __pl_zombiereloaded_SetNTVOptional()
|
||||
{
|
||||
MarkNativeAsOptional("ZR_IsValidClassIndex");
|
||||
MarkNativeAsOptional("ZR_GetActiveClass");
|
||||
MarkNativeAsOptional("ZR_SelectClientClass");
|
||||
MarkNativeAsOptional("ZR_GetClassByName");
|
||||
MarkNativeAsOptional("ZR_GetClassDisplayName");
|
||||
|
||||
MarkNativeAsOptional("ZR_IsClientZombie");
|
||||
MarkNativeAsOptional("ZR_IsClientHuman");
|
||||
MarkNativeAsOptional("ZR_InfectClient");
|
||||
MarkNativeAsOptional("ZR_HumanClient");
|
||||
|
||||
MarkNativeAsOptional("ZR_RespawnClient");
|
||||
MarkNativeAsOptional("ZR_SetKilledByWorld");
|
||||
MarkNativeAsOptional("ZR_GetKilledByWorld");
|
||||
}
|
||||
#endif
|
||||
|
@ -54,7 +54,7 @@
|
||||
#undef REQUIRE_PLUGIN
|
||||
#include <nativevotes>
|
||||
|
||||
#define MCE_VERSION "1.10.2"
|
||||
#define MCE_VERSION "1.11.0"
|
||||
|
||||
#define NV "nativevotes"
|
||||
|
||||
@ -2161,6 +2161,11 @@ public Native_ExcludeMap(Handle:plugin, numParams)
|
||||
|
||||
PushArrayString(g_OldMapList, map);
|
||||
|
||||
if (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))
|
||||
{
|
||||
RemoveFromArray(g_OldMapList, 0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@
|
||||
#include <colors>
|
||||
#pragma semicolon 1
|
||||
|
||||
#define MCE_VERSION "1.10.0"
|
||||
#define MCE_VERSION "1.11.0"
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
@ -98,6 +98,7 @@ public OnPluginStart()
|
||||
RegConsoleCmd("sm_nomlist", Command_NominateList);
|
||||
|
||||
RegAdminCmd("sm_nominate_addmap", Command_Addmap, ADMFLAG_CHANGEMAP, "sm_nominate_addmap <mapname> - Forces a map to be on the next mapvote.");
|
||||
RegAdminCmd("sm_nominate_removemap", Command_Removemap, ADMFLAG_CHANGEMAP, "sm_nominate_removemap <mapname> - Removes a map from Nominations.");
|
||||
|
||||
// BotoX
|
||||
RegAdminCmd("sm_nominate_exclude", Command_AddExclude, ADMFLAG_CHANGEMAP, "sm_nominate_exclude <mapname> - Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated.");
|
||||
@ -220,6 +221,39 @@ public Action:Command_Addmap(client, args)
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_Removemap(client, args)
|
||||
{
|
||||
if (args != 1)
|
||||
{
|
||||
CReplyToCommand(client, "[NE] Usage: sm_nominate_removemap <mapname>");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
decl String:mapname[PLATFORM_MAX_PATH];
|
||||
GetCmdArg(1, mapname, sizeof(mapname));
|
||||
|
||||
// new status;
|
||||
if (/*!GetTrieValue(g_mapTrie, mapname, status)*/!IsMapValid(mapname))
|
||||
{
|
||||
CReplyToCommand(client, "%t", "Map was not found", mapname);
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
if (!RemoveNominationByMap(mapname))
|
||||
{
|
||||
CReplyToCommand(client, "This map isn't nominated.", mapname);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
CReplyToCommand(client, "Map '%s' removed from the nominations list.", mapname);
|
||||
LogAction(client, -1, "\"%L\" removed map \"%s\" from nominations.", client, mapname);
|
||||
|
||||
PrintToChatAll("[NE] %N has removed %s from nominations", client, mapname);
|
||||
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
public Action:Command_AddExclude(client, args)
|
||||
{
|
||||
if (args < 1)
|
||||
@ -296,7 +330,7 @@ public Action:Command_Nominate(client, args)
|
||||
|
||||
if (g_NominationDelay > GetTime())
|
||||
{
|
||||
ReplyToCommand(client, "[NE] Nominations will be unlocked in %d seconds", g_NominationDelay - GetTime());
|
||||
PrintToChat(client, "[NE] Nominations will be unlocked in %d seconds", g_NominationDelay - GetTime());
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -308,7 +342,7 @@ public Action:Command_Nominate(client, args)
|
||||
|
||||
if (g_Player_NominationDelay[client] > GetTime())
|
||||
{
|
||||
ReplyToCommand(client, "[NE] Please wait %d seconds before you can nominate again", g_Player_NominationDelay[client] - GetTime());
|
||||
PrintToChat(client, "[NE] Please wait %d seconds before you can nominate again", g_Player_NominationDelay[client] - GetTime());
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -318,7 +352,7 @@ public Action:Command_Nominate(client, args)
|
||||
new status;
|
||||
if (!GetTrieValue(g_mapTrie, mapname, status))
|
||||
{
|
||||
CReplyToCommand(client, "%t", "Map was not found", mapname);
|
||||
CPrintToChat(client, "%t", "Map was not found", mapname);
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -326,17 +360,17 @@ public Action:Command_Nominate(client, args)
|
||||
{
|
||||
if ((status & MAPSTATUS_EXCLUDE_CURRENT) == MAPSTATUS_EXCLUDE_CURRENT)
|
||||
{
|
||||
CReplyToCommand(client, "[NE] %t", "Can't Nominate Current Map");
|
||||
CPrintToChat(client, "[NE] %t", "Can't Nominate Current Map");
|
||||
}
|
||||
|
||||
if ((status & MAPSTATUS_EXCLUDE_PREVIOUS) == MAPSTATUS_EXCLUDE_PREVIOUS)
|
||||
{
|
||||
CReplyToCommand(client, "[NE] %t", "Map in Exclude List");
|
||||
CPrintToChat(client, "[NE] %t", "Map in Exclude List");
|
||||
}
|
||||
|
||||
if ((status & MAPSTATUS_EXCLUDE_NOMINATED) == MAPSTATUS_EXCLUDE_NOMINATED)
|
||||
{
|
||||
CReplyToCommand(client, "[NE] %t", "Map Already Nominated");
|
||||
CPrintToChat(client, "[NE] %t", "Map Already Nominated");
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -348,11 +382,11 @@ public Action:Command_Nominate(client, args)
|
||||
{
|
||||
if (result == Nominate_AlreadyInVote)
|
||||
{
|
||||
CReplyToCommand(client, "[NE] %t", "Map Already In Vote", mapname);
|
||||
CPrintToChat(client, "[NE] %t", "Map Already In Vote", mapname);
|
||||
}
|
||||
else if (result == Nominate_VoteFull)
|
||||
{
|
||||
CReplyToCommand(client, "[ME] %t", "Max Nominations");
|
||||
CPrintToChat(client, "[ME] %t", "Max Nominations");
|
||||
}
|
||||
|
||||
return Plugin_Handled;
|
||||
@ -384,7 +418,7 @@ public Action:Command_NominateList(client, args)
|
||||
GetNominatedMapList(MapList);
|
||||
if (!GetArraySize(MapList))
|
||||
{
|
||||
CReplyToCommand(client, "[NE] No maps have been nominated.");
|
||||
CPrintToChat(client, "[NE] No maps have been nominated.");
|
||||
return Plugin_Handled;
|
||||
}
|
||||
|
||||
@ -516,6 +550,13 @@ public Handler_MapSelectMenu(Handle:menu, MenuAction:action, param1, param2)
|
||||
{
|
||||
case MenuAction_Select:
|
||||
{
|
||||
if (g_Player_NominationDelay[param1] > GetTime())
|
||||
{
|
||||
PrintToChat(param1, "[NE] Please wait %d seconds before you can nominate again", g_Player_NominationDelay[param1] - GetTime());
|
||||
DisplayMenuAtItem(menu, param1, GetMenuSelectionPosition(), MENU_TIME_FOREVER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
decl String:map[PLATFORM_MAX_PATH], String:name[MAX_NAME_LENGTH];
|
||||
GetMenuItem(menu, param2, map, sizeof(map));
|
||||
|
||||
@ -543,6 +584,7 @@ public Handler_MapSelectMenu(Handle:menu, MenuAction:action, param1, param2)
|
||||
PrintToChatAll("[NE] %t", "Map Nomination Changed", name, map);
|
||||
|
||||
LogMessage("%s nominated %s", name, map);
|
||||
g_Player_NominationDelay[param1] = GetTime() + GetConVarInt(g_Cvar_NominateDelay);
|
||||
}
|
||||
|
||||
case MenuAction_DrawItem:
|
||||
|
@ -42,7 +42,7 @@
|
||||
|
||||
#pragma semicolon 1
|
||||
|
||||
#define MCE_VERSION "1.10.0"
|
||||
#define MCE_VERSION "1.11.0"
|
||||
|
||||
public Plugin:myinfo =
|
||||
{
|
||||
|
@ -3,12 +3,12 @@
|
||||
"Vote Nextmap"
|
||||
{
|
||||
"en" "Vote for the next map!"
|
||||
}
|
||||
}
|
||||
|
||||
"Nextmap Voting Started"
|
||||
{
|
||||
"en" "Voting for next map has started."
|
||||
}
|
||||
}
|
||||
|
||||
"Nextmap Voting Finished"
|
||||
{
|
||||
@ -21,7 +21,7 @@
|
||||
"#format" "{1:i},{2:i}"
|
||||
"en" "The current map has been extended. (Received {1}%% of {2} votes)"
|
||||
}
|
||||
|
||||
|
||||
"Extend Map"
|
||||
{
|
||||
"en" "Extend Current Map"
|
||||
@ -41,7 +41,7 @@
|
||||
"Changed Next Map"
|
||||
{
|
||||
"#format" "{1:s}"
|
||||
"en" "Changed nextmap to \"{1}\"."
|
||||
"en" "Changed nextmap to \"{1}\"."
|
||||
}
|
||||
|
||||
"Runoff Vote Nextmap"
|
||||
|
Loading…
Reference in New Issue
Block a user