ferret99gt@1440: /**
ferret99gt@1440: * vim: set ts=4 :
ferret99gt@1440: * =============================================================================
ferret99gt@1440: * SourceMod Mapchooser Plugin
ferret99gt@1440: * Creates a map vote at appropriate times, setting sm_nextmap to the winning
ferret99gt@1440: * vote
ferret99gt@1440: *
pred@2032: * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
ferret99gt@1440: * =============================================================================
ferret99gt@1440: *
ferret99gt@1440: * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1440: * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1440: * Free Software Foundation.
ferret99gt@1440: *
ferret99gt@1440: * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1440: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1440: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
ferret99gt@1440: * details.
ferret99gt@1440: *
ferret99gt@1440: * You should have received a copy of the GNU General Public License along with
ferret99gt@1440: * this program. If not, see .
ferret99gt@1440: *
ferret99gt@1440: * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1440: * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1440: * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1440: * by the Valve Corporation. You must obey the GNU General Public License in
ferret99gt@1440: * all respects for all other code used. Additionally, AlliedModders LLC grants
ferret99gt@1440: * this exception to all derivative works. AlliedModders LLC defines further
ferret99gt@1440: * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1440: * or .
ferret99gt@1440: *
ferret99gt@1440: * Version: $Id$
ferret99gt@1440: */
pred@3440:
pred@3440: //#define DEBUG
pred@3440:
pred@3440: #if defined DEBUG
pred@3440: #define assert(%1) if (!(%1)) ThrowError("Debug Assertion Failed");
pred@3440: #define assert_msg(%1,%2) if (!(%1)) ThrowError(%2);
pred@3440: #else
pred@3440: #define assert(%1)
pred@3440: #define assert_msg(%1,%2)
pred@3440: #endif
ferret99gt@1440:
ferret99gt@1440: #pragma semicolon 1
ferret99gt@1440: #include
pred@2133: #include
pred@2133: #include
ferret99gt@1440:
ferret99gt@1479: public Plugin:myinfo =
ferret99gt@1479: {
ferret99gt@1479: name = "MapChooser",
ferret99gt@1479: author = "AlliedModders LLC",
ferret99gt@1479: description = "Automated Map Voting",
ferret99gt@1479: version = SOURCEMOD_VERSION,
ferret99gt@1479: url = "http://www.sourcemod.net/"
ferret99gt@1479: };
ferret99gt@1440:
pred@2133: /* Valve ConVars */
ferret99gt@1440: new Handle:g_Cvar_Winlimit = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_Maxrounds = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_Fraglimit = INVALID_HANDLE;
pred@2133: new Handle:g_Cvar_Bonusroundtime = INVALID_HANDLE;
ferret99gt@1440:
pred@2133: /* Plugin ConVars */
ferret99gt@1440: new Handle:g_Cvar_StartTime = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_StartRounds = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_StartFrags = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_ExtendTimeStep = INVALID_HANDLE;
ferret99gt@1445: new Handle:g_Cvar_ExtendRoundStep = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_ExtendFragStep = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_Cvar_ExcludeMaps = INVALID_HANDLE;
ferret99gt@1479: new Handle:g_Cvar_IncludeMaps = INVALID_HANDLE;
ferret99gt@1531: new Handle:g_Cvar_NoVoteMode = INVALID_HANDLE;
ferret99gt@1531: new Handle:g_Cvar_Extend = INVALID_HANDLE;
pred@2133: new Handle:g_Cvar_DontChange = INVALID_HANDLE;
pred@2133: new Handle:g_Cvar_EndOfMapVote = INVALID_HANDLE;
pred@2133: new Handle:g_Cvar_VoteDuration = INVALID_HANDLE;
pred@3440: new Handle:g_Cvar_RunOff = INVALID_HANDLE;
pred@3440: new Handle:g_Cvar_RunOffPercent = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1440: new Handle:g_VoteTimer = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_RetryTimer = INVALID_HANDLE;
ferret99gt@1440:
pred@2133: /* Data Handles */
ferret99gt@1440: new Handle:g_MapList = INVALID_HANDLE;
pred@2133: new Handle:g_NominateList = INVALID_HANDLE;
pred@2133: new Handle:g_NominateOwners = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_OldMapList = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_NextMapList = INVALID_HANDLE;
ferret99gt@1440: new Handle:g_VoteMenu = INVALID_HANDLE;
ferret99gt@1440:
ferret99gt@1861: new g_Extends;
ferret99gt@1698: new g_TotalRounds;
ferret99gt@1440: new bool:g_HasVoteStarted;
pred@2133: new bool:g_WaitingForVote;
pred@2133: new bool:g_MapVoteCompleted;
pred@2133: new bool:g_ChangeMapAtRoundEnd;
pred@2333: new bool:g_ChangeMapInProgress;
dvander@1889: new g_mapFileSerial = -1;
ferret99gt@1440:
pred@2133: new MapChange:g_ChangeTime;
pred@2133:
pred@2133: new Handle:g_NominationsResetForward = INVALID_HANDLE;
crimson@3150: new Handle:g_MapVoteStartedForward = INVALID_HANDLE;
pred@2133:
pred@2133: /* Upper bound of how many team there could be */
pred@2133: #define MAXTEAMS 10
pred@2133: new g_winCount[MAXTEAMS];
pred@2133:
ferret99gt@1531: #define VOTE_EXTEND "##extend##"
pred@2133: #define VOTE_DONTCHANGE "##dontchange##"
ferret99gt@1531:
ferret99gt@1440: public OnPluginStart()
ferret99gt@1440: {
ferret99gt@1440: LoadTranslations("mapchooser.phrases");
pred@2215: LoadTranslations("common.phrases");
ferret99gt@1440:
januk@3826: new arraySize = ByteCountToCells(PLATFORM_MAX_PATH);
ferret99gt@1664: g_MapList = CreateArray(arraySize);
pred@2133: g_NominateList = CreateArray(arraySize);
pred@2133: g_NominateOwners = CreateArray(1);
ferret99gt@1664: g_OldMapList = CreateArray(arraySize);
ferret99gt@1664: g_NextMapList = CreateArray(arraySize);
pred@2133:
pred@2133: g_Cvar_EndOfMapVote = CreateConVar("sm_mapvote_endvote", "1", "Specifies if MapChooser should run an end of map vote", _, true, 0.0, true, 1.0);
ferret99gt@1440:
ferret99gt@1479: g_Cvar_StartTime = CreateConVar("sm_mapvote_start", "3.0", "Specifies when to start the vote based on time remaining.", _, true, 1.0);
pred@2133: g_Cvar_StartRounds = CreateConVar("sm_mapvote_startround", "2.0", "Specifies when to start the vote based on rounds remaining. Use 0 on TF2 to start vote during bonus round time", _, true, 0.0);
ferret99gt@1479: g_Cvar_StartFrags = CreateConVar("sm_mapvote_startfrags", "5.0", "Specifies when to start the vote base on frags remaining.", _, true, 1.0);
ferret99gt@1440: g_Cvar_ExtendTimeStep = CreateConVar("sm_extendmap_timestep", "15", "Specifies how much many more minutes each extension makes", _, true, 5.0);
pred@2133: g_Cvar_ExtendRoundStep = CreateConVar("sm_extendmap_roundstep", "5", "Specifies how many more rounds each extension makes", _, true, 1.0);
ferret99gt@1479: g_Cvar_ExtendFragStep = CreateConVar("sm_extendmap_fragstep", "10", "Specifies how many more frags are allowed when map is extended.", _, true, 5.0);
ferret99gt@1440: g_Cvar_ExcludeMaps = CreateConVar("sm_mapvote_exclude", "5", "Specifies how many past maps to exclude from the vote.", _, true, 0.0);
ferret99gt@1479: g_Cvar_IncludeMaps = CreateConVar("sm_mapvote_include", "5", "Specifies how many maps to include in the vote.", _, true, 2.0, true, 6.0);
ferret99gt@1531: g_Cvar_NoVoteMode = CreateConVar("sm_mapvote_novote", "1", "Specifies whether or not MapChooser should pick a map if no votes are received.", _, true, 0.0, true, 1.0);
ferret99gt@1861: g_Cvar_Extend = CreateConVar("sm_mapvote_extend", "0", "Number of extensions allowed each map.", _, true, 0.0);
pred@2133: g_Cvar_DontChange = CreateConVar("sm_mapvote_dontchange", "1", "Specifies if a 'Don't Change' option should be added to early votes", _, true, 0.0);
pred@2241: g_Cvar_VoteDuration = CreateConVar("sm_mapvote_voteduration", "20", "Specifies how long the mapvote should be available for.", _, true, 5.0);
pred@3440: g_Cvar_RunOff = CreateConVar("sm_mapvote_runoff", "0", "Hold run of votes if winning choice is less than a certain margin", _, true, 0.0, true, 1.0);
pred@3440: g_Cvar_RunOffPercent = CreateConVar("sm_mapvote_runoffpercent", "50", "If winning choice has less than this percent of votes, hold a runoff", _, true, 0.0, true, 100.0);
pred@2215:
ferret99gt@1479: RegAdminCmd("sm_mapvote", Command_Mapvote, ADMFLAG_CHANGEMAP, "sm_mapvote - Forces MapChooser to attempt to run a map vote now.");
pred@2215: RegAdminCmd("sm_setnextmap", Command_SetNextmap, ADMFLAG_CHANGEMAP, "sm_setnextmap