diff -r 000000000000 -r b7aa2b626807 plugins/mapmanager/functions.sp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/mapmanager/functions.sp Sun Mar 30 07:00:22 2008 +0000
@@ -0,0 +1,335 @@
+/**
+ * vim: set ts=4 :
+ * =============================================================================
+ * SourceMod Map Management Plugin
+ * Contains misc functions.
+ *
+ * SourceMod (C)2004-2008 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$
+ */
+
+SetNextMap(String:map[])
+{
+ strcopy(g_NextMap, sizeof(g_NextMap), map);
+ SetConVarString(g_Cvar_Nextmap, map);
+}
+
+SetMapChange(client, map, when, Float:time = 3.0)
+{
+ g_MapChangeSet = true;
+ g_MapChangeWhen = when[0];
+ SetNextMap(map);
+
+ if (when[0] == 'r')
+ {
+ ShowActivity2(client, "[SM] ", "%t", "Changing map end of round", map);
+ LogAction(client, -1, "\"%L\" set end of round map change to \"%s\"", client, map);
+ }
+ else if (when[0] == 'e')
+ {
+ ShowActivity2(client, "[SM] ", "%t", "Set nextmap", map);
+ LogAction(client, -1, "\"%L\" set the next map to \"%s\"", client, map);
+ }
+ else
+ {
+ ShowActivity2(client, "[SM] ", "%t", "Change map", map);
+ LogAction(client, -1, "\"%L\" changed map to \"%s\"", client, map);
+
+ g_MapChanged = true;
+ CreateTimer(3.0, Timer_ChangeMap);
+ }
+}
+
+FindAndSetNextMap()
+{
+ if (ReadMapList(g_MapList,
+ g_MapListSerial,
+ "mapcyclefile",
+ MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_NO_DEFAULT)
+ == INVALID_HANDLE)
+ {
+ if (g_MapListSerial == -1)
+ {
+ LogError("FATAL: Cannot load map cycle. Nextmap not loaded.");
+ SetFailState("Mapcycle Not Found");
+ }
+ }
+
+ new mapCount = GetArraySize(g_MapList);
+ decl String:mapName[32];
+
+ if (g_MapPos == -1)
+ {
+ decl String:current[64];
+ GetCurrentMap(current, 64);
+
+ for (new i = 0; i < mapCount; i++)
+ {
+ GetArrayString(g_MapList, i, mapName, sizeof(mapName));
+ if (strcmp(current, mapName, false) == 0)
+ {
+ g_MapPos = i;
+ break;
+ }
+ }
+
+ if (g_MapPos == -1)
+ g_MapPos = 0;
+ }
+
+ g_MapPos++;
+ if (g_MapPos >= mapCount)
+ g_MapPos = 0;
+
+ GetArrayString(g_MapList, g_MapPos, mapName, sizeof(mapName));
+ SetConVarString(g_Cvar_Nextmap, mapName);
+}
+
+Float:GetVotePercent(votes, totalVotes)
+{
+ return FloatDiv(float(votes),float(totalVotes));
+}
+
+bool:TestVoteDelay(client)
+{
+ new delay = CheckVoteDelay();
+
+ if (delay > 0)
+ {
+ if (delay > 60)
+ {
+ ReplyToCommand(client, "[SM] %t", "Vote Delay Minutes", delay % 60);
+ }
+ else
+ {
+ ReplyToCommand(client, "[SM] %t", "Vote Delay Seconds", delay);
+ }
+
+ return false;
+ }
+
+ return true;
+}
+
+BuildMapMenu()
+{
+ if (g_MapMenu != INVALID_HANDLE)
+ {
+ CloseHandle(g_MapMenu);
+ g_MapMenu = INVALID_HANDLE;
+ }
+
+ g_MapMenu = CreateMenu(Handler_MapSelectMenu);
+ SetMenuTitle(g_MapMenu, "%t", "Nominate Title");
+
+ decl String:map[64];
+ for (new i = 0; i < GetArraySize(g_MapList); i++)
+ {
+ GetArrayString(g_MapList, i, map, sizeof(map));
+ AddMenuItem(g_MapMenu, map, map);
+ }
+
+ SetMenuExitButton(g_MapMenu, false);
+}
+
+SetupTimeleftTimer()
+{
+ new time;
+ if (GetMapTimeLeft(time) && time > 0)
+ {
+ new startTime = GetConVarInt(g_Cvar_StartTime) * 60;
+ if (time - startTime < 0)
+ {
+ InitiateVote();
+ }
+ else
+ {
+ if (g_VoteTimer != INVALID_HANDLE)
+ {
+ KillTimer(g_VoteTimer);
+ g_VoteTimer = INVALID_HANDLE;
+ }
+
+ g_VoteTimer = CreateTimer(float(time - startTime), Timer_StartMapVote);
+ }
+ }
+}
+
+InitiateVote()
+{
+ if (g_HasVoteStarted || g_RetryTimer != INVALID_HANDLE)
+ {
+ return;
+ }
+
+ if (IsVoteInProgress())
+ {
+ // Can't start a vote, try again in 5 seconds.
+ g_RetryTimer = CreateTimer(5.0, Timer_StartMapVote);
+ return;
+ }
+
+ g_HasVoteStarted = true;
+ g_VoteMenu = CreateMenu(Handler_MapVoteMenu, MenuAction:MENU_ACTIONS_ALL);
+ SetMenuTitle(g_VoteMenu, "Vote Nextmap");
+
+ decl String:map[32];
+ for (new i = 0; i < GetArraySize(g_NextMapList); i++)
+ {
+ GetArrayString(g_NextMapList, i, map, sizeof(map));
+ AddMenuItem(g_VoteMenu, map, map);
+ }
+
+ if (GetConVarBool(g_Cvar_Extend))
+ {
+ new bool:allowExtend, time;
+ if (GetMapTimeLimit(time) && time > 0 && time < GetConVarInt(g_Cvar_ExtendTimeMax))
+ {
+ allowExtend = true;
+ }
+
+ if (g_Cvar_Winlimit != INVALID_HANDLE && GetConVarInt(g_Cvar_Winlimit) < GetConVarInt(g_Cvar_ExtendRoundMax))
+ {
+ allowExtend = true;
+ }
+
+ if (g_Cvar_Maxrounds != INVALID_HANDLE && GetConVarInt(g_Cvar_Maxrounds) < GetConVarInt(g_Cvar_ExtendRoundMax))
+ {
+ allowExtend = true;
+ }
+
+ if (g_Cvar_Fraglimit != INVALID_HANDLE && GetConVarInt(g_Cvar_Fraglimit) < GetConVarInt(g_Cvar_ExtendFragMax))
+ {
+ allowExtend = true;
+ }
+
+ if (allowExtend)
+ {
+ AddMenuItem(g_VoteMenu, VOTE_EXTEND, "Extend Map");
+ }
+ }
+
+ SetMenuExitButton(g_VoteMenu, false);
+ VoteMenuToAll(g_VoteMenu, 20);
+
+ LogMessage("Voting for next map has started.");
+ PrintToChatAll("[SM] %t", "Nextmap Voting Started");
+}
+
+SetNextMap(const String:map[])
+{
+ SetConVarString(g_Cvar_Nextmap, map);
+ PushArrayString(g_OldMapList, map);
+
+ if (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))
+ {
+ RemoveFromArray(g_OldMapList, 0);
+ }
+
+ PrintToChatAll("[SM] %t", "Nextmap Voting Finished", map);
+ LogMessage("Voting for next map has finished. Nextmap: %s.", map);
+}
+
+CreateNextVote()
+{
+ if(g_NextMapList != INVALID_HANDLE)
+ {
+ ClearArray(g_NextMapList);
+ }
+
+ decl String:map[32];
+ new index, Handle:tempMaps = CloneArray(g_MapList);
+
+ GetCurrentMap(map, sizeof(map));
+ index = FindStringInArray(tempMaps, map);
+ if (index != -1)
+ {
+ RemoveFromArray(tempMaps, index);
+ }
+
+ if (GetConVarInt(g_Cvar_ExcludeMaps) && GetArraySize(tempMaps) > GetConVarInt(g_Cvar_ExcludeMaps))
+ {
+ for (new i = 0; i < GetArraySize(g_OldMapList); i++)
+ {
+ GetArrayString(g_OldMapList, i, map, sizeof(map));
+ index = FindStringInArray(tempMaps, map);
+ if (index != -1)
+ {
+ RemoveFromArray(tempMaps, index);
+ }
+ }
+ }
+
+ new limit = (GetConVarInt(g_Cvar_IncludeMaps) < GetArraySize(tempMaps) ? GetConVarInt(g_Cvar_IncludeMaps) : GetArraySize(tempMaps));
+ for (new i = 0; i < limit; i++)
+ {
+ new b = GetRandomInt(0, GetArraySize(tempMaps) - 1);
+ GetArrayString(tempMaps, b, map, sizeof(map));
+ PushArrayString(g_NextMapList, map);
+ RemoveFromArray(tempMaps, b);
+ }
+
+ CloseHandle(tempMaps);
+}
+
+/*
+
+new Handle:g_map_array = INVALID_HANDLE;
+new g_map_serial = -1;
+
+LoadMapList(Handle:menu)
+{
+ new Handle:map_array;
+
+ if ((map_array = ReadMapList(g_map_array,
+ g_map_serial,
+ "sm_map menu",
+ MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_NO_DEFAULT|MAPLIST_FLAG_MAPSFOLDER))
+ != INVALID_HANDLE)
+ {
+ g_map_array = map_array;
+ }
+
+ if (g_map_array == INVALID_HANDLE)
+ {
+ return 0;
+ }
+
+ RemoveAllMenuItems(menu);
+
+ decl String:map_name[64];
+ new map_count = GetArraySize(g_map_array);
+
+ for (new i = 0; i < map_count; i++)
+ {
+ GetArrayString(g_map_array, i, map_name, sizeof(map_name));
+ AddMenuItem(menu, map_name, map_name);
+ }
+
+ return map_count;
+}
+
+*/
\ No newline at end of file