diff --git a/mapchooser_extended/scripting/rockthevote_extended.sp b/mapchooser_extended/scripting/rockthevote_extended.sp index ddbe98b2..cad79122 100644 --- a/mapchooser_extended/scripting/rockthevote_extended.sp +++ b/mapchooser_extended/scripting/rockthevote_extended.sp @@ -1,386 +1,386 @@ -/** - * vim: set ts=4 : - * ============================================================================= - * Rock The Vote Extended - * Creates a map vote when the required number of players have requested one. - * - * Rock The Vote Extended (C)2012-2013 Powerlord (Ross Bemrose) - * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. - * ============================================================================= - * - * This program is free software; you can redistribute it and/or modify it under - * the terms of the GNU General Public License, version 3.0, as published by the - * Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program. If not, see . - * - * As a special exception, AlliedModders LLC gives you permission to link the - * code of this program (as well as its derivative works) to "Half-Life 2," the - * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software - * by the Valve Corporation. You must obey the GNU General Public License in - * all respects for all other code used. Additionally, AlliedModders LLC grants - * this exception to all derivative works. AlliedModders LLC defines further - * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), - * or . - * - * Version: $Id$ - */ - -#pragma semicolon 1 -#pragma newdecls required - -#include -#include -#include -#include - -#define MCE_VERSION "1.13.0" - -public Plugin myinfo = -{ - name = "Rock The Vote Extended", - author = "Powerlord and AlliedModders LLC", - description = "Provides RTV Map Voting", - version = MCE_VERSION, - url = "https://forums.alliedmods.net/showthread.php?t=156974" -}; - -ConVar g_Cvar_Needed; -ConVar g_Cvar_MinPlayers; -ConVar g_Cvar_InitialDelay; -ConVar g_Cvar_Interval; -ConVar g_Cvar_ChangeTime; -ConVar g_Cvar_RTVPostVoteAction; -ConVar g_Cvar_RTVAutoDisable; - -bool g_CanRTV = false; // True if RTV loaded maps and is active. -bool g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes. -int g_Voters = 0; // Total voters connected. Doesn't include fake clients. -int g_Votes = 0; // Total number of "say rtv" votes -int g_VotesNeeded = 0; // Necessary votes before map vote begins. (voters * percent_needed) -bool g_Voted[MAXPLAYERS+1] = {false, ...}; -Handle g_TimeOverTimer = INVALID_HANDLE; - -bool g_InChange = false; - -public void OnPluginStart() -{ - LoadTranslations("common.phrases"); - LoadTranslations("rockthevote.phrases"); - LoadTranslations("basevotes.phrases"); - - g_Cvar_Needed = CreateConVar("sm_rtv_needed", "0.60", "Percentage of players needed to rockthevote (Def 60%)", 0, true, 0.05, true, 1.0); - g_Cvar_MinPlayers = CreateConVar("sm_rtv_minplayers", "0", "Number of players required before RTV will be enabled.", 0, true, 0.0, true, float(MAXPLAYERS)); - g_Cvar_InitialDelay = CreateConVar("sm_rtv_initialdelay", "30.0", "Time (in seconds) before first RTV can be held", 0, true, 0.00); - g_Cvar_Interval = CreateConVar("sm_rtv_interval", "240.0", "Time (in seconds) after a failed RTV before another can be held", 0, true, 0.00); - g_Cvar_ChangeTime = CreateConVar("sm_rtv_changetime", "0", "When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd", _, true, 0.0, true, 2.0); - g_Cvar_RTVPostVoteAction = CreateConVar("sm_rtv_postvoteaction", "0", "What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny", _, true, 0.0, true, 1.0); - g_Cvar_RTVAutoDisable = CreateConVar("sm_rtv_autodisable", "0", "Automatically disable RTV when map time is over.", _, true, 0.0, true, 1.0); - - RegConsoleCmd("sm_rtv", Command_RTV); - - RegAdminCmd("sm_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote"); - RegAdminCmd("sm_disablertv", Command_DisableRTV, ADMFLAG_CHANGEMAP, "Disable the RTV command"); - RegAdminCmd("sm_enablertv", Command_EnableRTV, ADMFLAG_CHANGEMAP, "Enable the RTV command"); - - HookEvent("player_team", OnPlayerChangedTeam, EventHookMode_PostNoCopy); - - AutoExecConfig(true, "rtv"); -} - -public void OnMapStart() -{ - g_Voters = 0; - g_Votes = 0; - g_VotesNeeded = 0; - g_InChange = false; - - /* Handle late load */ - for (int i=1; i<=MaxClients; i++) - { - if (IsClientConnected(i)) - { - OnClientConnected(i); - } - } -} - -public void OnMapEnd() -{ - g_CanRTV = false; - g_RTVAllowed = false; - g_TimeOverTimer = INVALID_HANDLE; -} - -public void OnConfigsExecuted() -{ - g_CanRTV = true; - g_RTVAllowed = false; - CreateTimer(g_Cvar_InitialDelay.FloatValue, Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE); - SetupTimeOverTimer(); -} - -public void OnMapTimeLeftChanged() -{ - SetupTimeOverTimer(); -} - -public void OnClientConnected(int client) -{ - UpdateRTV(); -} - -public void OnClientDisconnect(int client) -{ - if (g_Voted[client]) - { - g_Voted[client] = false; - g_Votes--; - } - - UpdateRTV(); -} - -public void OnPlayerChangedTeam(Handle event, const char[] name, bool dontBroadcast) -{ - UpdateRTV(); -} - -void UpdateRTV() -{ - g_Voters = 0; - - for (int i=1; i<=MAXPLAYERS; i++) - { - if (IsClientInGame(i) && !IsFakeClient(i)) - { - if (GetClientTeam(i) == 2 || GetClientTeam(i) == 3) - { - g_Voters++; - } - } - } - -// g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3); - g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed)); - - if (!g_CanRTV) - { - return; - } - - if (g_Votes && - g_Voters && - g_Votes >= g_VotesNeeded && - g_RTVAllowed ) - { - if (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished()) - { - return; - } - - StartRTV(); - } -} - -public void OnClientSayCommand_Post(int client, const char[] command, const char[] sArgs) -{ - if (!g_CanRTV || !client) - { - return; - } - - if (strcmp(sArgs, "rtv", false) == 0 || strcmp(sArgs, "rockthevote", false) == 0) - { - ReplySource old = SetCmdReplySource(SM_REPLY_TO_CHAT); - - AttemptRTV(client); - - SetCmdReplySource(old); - } -} - -public Action Command_RTV(int client, int args) -{ - if (!g_CanRTV || !client) - { - return Plugin_Handled; - } - - AttemptRTV(client); - - return Plugin_Handled; -} - -void AttemptRTV(int client) -{ - if (!g_RTVAllowed || (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished())) - { - ReplyToCommand(client, "[SM] %t", "RTV Not Allowed"); - return; - } - - if (!CanMapChooserStartVote()) - { - ReplyToCommand(client, "[SM] %t", "RTV Started"); - return; - } - - if (GetClientCount(true) < g_Cvar_MinPlayers.IntValue) - { - ReplyToCommand(client, "[SM] %t", "Minimal Players Not Met"); - return; - } - - if (g_Voted[client]) - { - ReplyToCommand(client, "[SM] %t", "Already Voted", g_Votes, g_VotesNeeded); - return; - } - - char name[MAX_NAME_LENGTH]; - GetClientName(client, name, sizeof(name)); - - g_Votes++; - g_Voted[client] = true; - - PrintToChatAll("[SM] %t", "RTV Requested", name, g_Votes, g_VotesNeeded); - - if (g_Votes >= g_VotesNeeded) - { - StartRTV(); - } -} - -public Action Timer_DelayRTV(Handle timer) -{ - g_RTVAllowed = true; -} - -void StartRTV() -{ - if (g_InChange) - { - return; - } - - if (EndOfMapVoteEnabled() && HasEndOfMapVoteFinished()) - { - /* Change right now then */ - char map[PLATFORM_MAX_PATH]; - if (GetNextMap(map, sizeof(map))) - { - GetMapDisplayName(map, map, sizeof(map)); - - PrintToChatAll("[SM] %t", "Changing Maps", map); - CreateTimer(5.0, Timer_ChangeMap, _, TIMER_FLAG_NO_MAPCHANGE); - g_InChange = true; - - ResetRTV(); - - g_RTVAllowed = false; - } - return; - } - - if (CanMapChooserStartVote()) - { - MapChange when = view_as(g_Cvar_ChangeTime.IntValue); - InitiateMapChooserVote(when); - - ResetRTV(); - - g_RTVAllowed = false; - CreateTimer(g_Cvar_Interval.FloatValue, Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE); - } -} - -void ResetRTV() -{ - g_Votes = 0; - - for (int i=1; i<=MAXPLAYERS; i++) - { - g_Voted[i] = false; - } -} - -public Action Timer_ChangeMap(Handle hTimer) -{ - g_InChange = false; - - LogMessage("RTV changing map manually"); - - char map[PLATFORM_MAX_PATH]; - if (GetNextMap(map, sizeof(map))) - { - ForceChangeLevel(map, "RTV after mapvote"); - } - - return Plugin_Stop; -} - -public Action Command_ForceRTV(int client, int args) -{ - if(!g_CanRTV) - return Plugin_Handled; - - ShowActivity2(client, "[RTVE] ", "%t", "Initiated Vote Map"); - - StartRTV(); - - return Plugin_Handled; -} - -public Action Command_DisableRTV(int client, int args) -{ - if(!g_RTVAllowed) - return Plugin_Handled; - - ShowActivity2(client, "[RTVE] ", "disabled RockTheVote."); - - g_RTVAllowed = false; - - return Plugin_Handled; -} - -public Action Command_EnableRTV(int client, int args) -{ - if(g_RTVAllowed) - return Plugin_Handled; - - ShowActivity2(client, "[RTVE] ", "enabled RockTheVote"); - - g_RTVAllowed = true; - - return Plugin_Handled; -} - -void SetupTimeOverTimer() -{ - int time; - if(GetMapTimeLeft(time) && time > 0) - { - if(g_TimeOverTimer != INVALID_HANDLE) - { - KillTimer(g_TimeOverTimer); - g_TimeOverTimer = INVALID_HANDLE; - } - - g_TimeOverTimer = CreateTimer(float(time), Timer_MapOver, _, TIMER_FLAG_NO_MAPCHANGE); - } -} - -public Action Timer_MapOver(Handle timer) -{ - g_TimeOverTimer = INVALID_HANDLE; - - if(g_Cvar_RTVAutoDisable.BoolValue) - g_RTVAllowed = false; -} +/** + * vim: set ts=4 : + * ============================================================================= + * Rock The Vote Extended + * Creates a map vote when the required number of players have requested one. + * + * Rock The Vote Extended (C)2012-2013 Powerlord (Ross Bemrose) + * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved. + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + * + * As a special exception, AlliedModders LLC gives you permission to link the + * code of this program (as well as its derivative works) to "Half-Life 2," the + * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software + * by the Valve Corporation. You must obey the GNU General Public License in + * all respects for all other code used. Additionally, AlliedModders LLC grants + * this exception to all derivative works. AlliedModders LLC defines further + * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007), + * or . + * + * Version: $Id$ + */ + +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include +#include + +#define MCE_VERSION "1.13.0" + +public Plugin myinfo = +{ + name = "Rock The Vote Extended", + author = "Powerlord and AlliedModders LLC", + description = "Provides RTV Map Voting", + version = MCE_VERSION, + url = "https://forums.alliedmods.net/showthread.php?t=156974" +}; + +ConVar g_Cvar_Needed; +ConVar g_Cvar_MinPlayers; +ConVar g_Cvar_InitialDelay; +ConVar g_Cvar_Interval; +ConVar g_Cvar_ChangeTime; +ConVar g_Cvar_RTVPostVoteAction; +ConVar g_Cvar_RTVAutoDisable; + +bool g_CanRTV = false; // True if RTV loaded maps and is active. +bool g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes. +int g_Voters = 0; // Total voters connected. Doesn't include fake clients. +int g_Votes = 0; // Total number of "say rtv" votes +int g_VotesNeeded = 0; // Necessary votes before map vote begins. (voters * percent_needed) +bool g_Voted[MAXPLAYERS+1] = {false, ...}; +Handle g_TimeOverTimer = INVALID_HANDLE; + +bool g_InChange = false; + +public void OnPluginStart() +{ + LoadTranslations("common.phrases"); + LoadTranslations("rockthevote.phrases"); + LoadTranslations("basevotes.phrases"); + + g_Cvar_Needed = CreateConVar("sm_rtv_needed", "0.60", "Percentage of players needed to rockthevote (Def 60%)", 0, true, 0.05, true, 1.0); + g_Cvar_MinPlayers = CreateConVar("sm_rtv_minplayers", "0", "Number of players required before RTV will be enabled.", 0, true, 0.0, true, float(MAXPLAYERS)); + g_Cvar_InitialDelay = CreateConVar("sm_rtv_initialdelay", "30.0", "Time (in seconds) before first RTV can be held", 0, true, 0.00); + g_Cvar_Interval = CreateConVar("sm_rtv_interval", "240.0", "Time (in seconds) after a failed RTV before another can be held", 0, true, 0.00); + g_Cvar_ChangeTime = CreateConVar("sm_rtv_changetime", "0", "When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd", _, true, 0.0, true, 2.0); + g_Cvar_RTVPostVoteAction = CreateConVar("sm_rtv_postvoteaction", "0", "What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny", _, true, 0.0, true, 1.0); + g_Cvar_RTVAutoDisable = CreateConVar("sm_rtv_autodisable", "0", "Automatically disable RTV when map time is over.", _, true, 0.0, true, 1.0); + + RegConsoleCmd("sm_rtv", Command_RTV); + + RegAdminCmd("sm_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote"); + RegAdminCmd("sm_disablertv", Command_DisableRTV, ADMFLAG_CHANGEMAP, "Disable the RTV command"); + RegAdminCmd("sm_enablertv", Command_EnableRTV, ADMFLAG_CHANGEMAP, "Enable the RTV command"); + + HookEvent("player_team", OnPlayerChangedTeam, EventHookMode_PostNoCopy); + + AutoExecConfig(true, "rtv"); +} + +public void OnMapStart() +{ + g_Voters = 0; + g_Votes = 0; + g_VotesNeeded = 0; + g_InChange = false; + + /* Handle late load */ + for (int i=1; i<=MaxClients; i++) + { + if (IsClientConnected(i)) + { + OnClientConnected(i); + } + } +} + +public void OnMapEnd() +{ + g_CanRTV = false; + g_RTVAllowed = false; + g_TimeOverTimer = INVALID_HANDLE; +} + +public void OnConfigsExecuted() +{ + g_CanRTV = true; + g_RTVAllowed = false; + CreateTimer(g_Cvar_InitialDelay.FloatValue, Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE); + SetupTimeOverTimer(); +} + +public void OnMapTimeLeftChanged() +{ + SetupTimeOverTimer(); +} + +public void OnClientConnected(int client) +{ + UpdateRTV(); +} + +public void OnClientDisconnect(int client) +{ + if (g_Voted[client]) + { + g_Voted[client] = false; + g_Votes--; + } + + UpdateRTV(); +} + +public void OnPlayerChangedTeam(Handle event, const char[] name, bool dontBroadcast) +{ + UpdateRTV(); +} + +void UpdateRTV() +{ + g_Voters = 0; + + for (int i=1; i<=MaxClients; i++) + { + if (IsClientConnected(i) && !IsFakeClient(i)) + { + if (GetClientTeam(i) == 2 || GetClientTeam(i) == 3) + { + g_Voters++; + } + } + } + +// g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3); + g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed)); + + if (!g_CanRTV) + { + return; + } + + if (g_Votes && + g_Voters && + g_Votes >= g_VotesNeeded && + g_RTVAllowed ) + { + if (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished()) + { + return; + } + + StartRTV(); + } +} + +public void OnClientSayCommand_Post(int client, const char[] command, const char[] sArgs) +{ + if (!g_CanRTV || !client) + { + return; + } + + if (strcmp(sArgs, "rtv", false) == 0 || strcmp(sArgs, "rockthevote", false) == 0) + { + ReplySource old = SetCmdReplySource(SM_REPLY_TO_CHAT); + + AttemptRTV(client); + + SetCmdReplySource(old); + } +} + +public Action Command_RTV(int client, int args) +{ + if (!g_CanRTV || !client) + { + return Plugin_Handled; + } + + AttemptRTV(client); + + return Plugin_Handled; +} + +void AttemptRTV(int client) +{ + if (!g_RTVAllowed || (g_Cvar_RTVPostVoteAction.IntValue == 1 && HasEndOfMapVoteFinished())) + { + ReplyToCommand(client, "[SM] %t", "RTV Not Allowed"); + return; + } + + if (!CanMapChooserStartVote()) + { + ReplyToCommand(client, "[SM] %t", "RTV Started"); + return; + } + + if (GetClientCount(true) < g_Cvar_MinPlayers.IntValue) + { + ReplyToCommand(client, "[SM] %t", "Minimal Players Not Met"); + return; + } + + if (g_Voted[client]) + { + ReplyToCommand(client, "[SM] %t", "Already Voted", g_Votes, g_VotesNeeded); + return; + } + + char name[MAX_NAME_LENGTH]; + GetClientName(client, name, sizeof(name)); + + g_Votes++; + g_Voted[client] = true; + + PrintToChatAll("[SM] %t", "RTV Requested", name, g_Votes, g_VotesNeeded); + + if (g_Votes >= g_VotesNeeded) + { + StartRTV(); + } +} + +public Action Timer_DelayRTV(Handle timer) +{ + g_RTVAllowed = true; +} + +void StartRTV() +{ + if (g_InChange) + { + return; + } + + if (EndOfMapVoteEnabled() && HasEndOfMapVoteFinished()) + { + /* Change right now then */ + char map[PLATFORM_MAX_PATH]; + if (GetNextMap(map, sizeof(map))) + { + GetMapDisplayName(map, map, sizeof(map)); + + PrintToChatAll("[SM] %t", "Changing Maps", map); + CreateTimer(5.0, Timer_ChangeMap, _, TIMER_FLAG_NO_MAPCHANGE); + g_InChange = true; + + ResetRTV(); + + g_RTVAllowed = false; + } + return; + } + + if (CanMapChooserStartVote()) + { + MapChange when = view_as(g_Cvar_ChangeTime.IntValue); + InitiateMapChooserVote(when); + + ResetRTV(); + + g_RTVAllowed = false; + CreateTimer(g_Cvar_Interval.FloatValue, Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE); + } +} + +void ResetRTV() +{ + g_Votes = 0; + + for (int i=1; i<=MAXPLAYERS; i++) + { + g_Voted[i] = false; + } +} + +public Action Timer_ChangeMap(Handle hTimer) +{ + g_InChange = false; + + LogMessage("RTV changing map manually"); + + char map[PLATFORM_MAX_PATH]; + if (GetNextMap(map, sizeof(map))) + { + ForceChangeLevel(map, "RTV after mapvote"); + } + + return Plugin_Stop; +} + +public Action Command_ForceRTV(int client, int args) +{ + if(!g_CanRTV) + return Plugin_Handled; + + ShowActivity2(client, "[RTVE] ", "%t", "Initiated Vote Map"); + + StartRTV(); + + return Plugin_Handled; +} + +public Action Command_DisableRTV(int client, int args) +{ + if(!g_RTVAllowed) + return Plugin_Handled; + + ShowActivity2(client, "[RTVE] ", "disabled RockTheVote."); + + g_RTVAllowed = false; + + return Plugin_Handled; +} + +public Action Command_EnableRTV(int client, int args) +{ + if(g_RTVAllowed) + return Plugin_Handled; + + ShowActivity2(client, "[RTVE] ", "enabled RockTheVote"); + + g_RTVAllowed = true; + + return Plugin_Handled; +} + +void SetupTimeOverTimer() +{ + int time; + if(GetMapTimeLeft(time) && time > 0) + { + if(g_TimeOverTimer != INVALID_HANDLE) + { + KillTimer(g_TimeOverTimer); + g_TimeOverTimer = INVALID_HANDLE; + } + + g_TimeOverTimer = CreateTimer(float(time), Timer_MapOver, _, TIMER_FLAG_NO_MAPCHANGE); + } +} + +public Action Timer_MapOver(Handle timer) +{ + g_TimeOverTimer = INVALID_HANDLE; + + if(g_Cvar_RTVAutoDisable.BoolValue) + g_RTVAllowed = false; +}