plugins/randomcycle.sp
author David Anderson <dvander@alliedmods.net>
Sat Dec 22 08:57:08 2007 +0000 (2007-12-22)
changeset 1813 372939c88bc7
parent 1664 e054be79e28a
child 1889 5b4d6acc4d82
permissions -rw-r--r--
fixed amb1305 by making OnClientPostAdminCheck() always occur after OnClientPutInServer(). this is now GUARANTEED. it was undefined before, however the usual case was opposite. if plugins were relying on this, they were written poorly and shouldn't have worked in the first place, especially with the threaded SQL plugin.
ferret99gt@1475
     1
/**
ferret99gt@1475
     2
 * vim: set ts=4 :
ferret99gt@1475
     3
 * =============================================================================
ferret99gt@1475
     4
 * SourceMod Random Map Cycle Plugin
ferret99gt@1475
     5
 * Randomly picks a map from the mapcycle.
ferret99gt@1475
     6
 *
ferret99gt@1475
     7
 * SourceMod (C)2004-2007 AlliedModders LLC.  All rights reserved.
ferret99gt@1475
     8
 * =============================================================================
ferret99gt@1475
     9
 *
ferret99gt@1475
    10
 * This program is free software; you can redistribute it and/or modify it under
ferret99gt@1475
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
ferret99gt@1475
    12
 * Free Software Foundation.
ferret99gt@1475
    13
 * 
ferret99gt@1475
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
ferret99gt@1475
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
ferret99gt@1475
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
ferret99gt@1475
    17
 * details.
ferret99gt@1475
    18
 *
ferret99gt@1475
    19
 * You should have received a copy of the GNU General Public License along with
ferret99gt@1475
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
ferret99gt@1475
    21
 *
ferret99gt@1475
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
ferret99gt@1475
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
ferret99gt@1475
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
ferret99gt@1475
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
ferret99gt@1475
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
ferret99gt@1475
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
ferret99gt@1475
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
ferret99gt@1475
    29
 * or <http://www.sourcemod.net/license.php>.
ferret99gt@1475
    30
 *
ferret99gt@1475
    31
 * Version: $Id$
ferret99gt@1475
    32
 */
ferret99gt@1475
    33
ferret99gt@1475
    34
#pragma semicolon 1
ferret99gt@1475
    35
#include <sourcemod>
ferret99gt@1475
    36
ferret99gt@1475
    37
public Plugin:myinfo =
ferret99gt@1475
    38
{
ferret99gt@1475
    39
	name = "RandomCycle",
ferret99gt@1475
    40
	author = "AlliedModders LLC",
ferret99gt@1475
    41
	description = "Randomly chooses the next map.",
ferret99gt@1475
    42
	version = SOURCEMOD_VERSION,
ferret99gt@1475
    43
	url = "http://www.sourcemod.net/"
ferret99gt@1475
    44
};
ferret99gt@1475
    45
ferret99gt@1475
    46
new Handle:g_Cvar_Nextmap = INVALID_HANDLE;
ferret99gt@1475
    47
new Handle:g_Cvar_Mapfile = INVALID_HANDLE;
ferret99gt@1475
    48
new Handle:g_Cvar_ExcludeMaps = INVALID_HANDLE;
ferret99gt@1475
    49
ferret99gt@1475
    50
new Handle:g_MapList = INVALID_HANDLE;
ferret99gt@1475
    51
new Handle:g_OldMapList = INVALID_HANDLE;
ferret99gt@1475
    52
new g_mapFileTime;
ferret99gt@1475
    53
ferret99gt@1475
    54
public OnPluginStart()
ferret99gt@1475
    55
{
ferret99gt@1664
    56
	new arraySize = ByteCountToCells(33);	
ferret99gt@1664
    57
	g_MapList = CreateArray(arraySize);
ferret99gt@1664
    58
	g_OldMapList = CreateArray(arraySize);
ferret99gt@1475
    59
ferret99gt@1475
    60
	g_Cvar_Mapfile = CreateConVar("sm_randomcycle_file", "configs/maps.ini", "Map file to use. (Def sourcemod/configs/maps.ini)");
ferret99gt@1475
    61
	g_Cvar_ExcludeMaps = CreateConVar("sm_randomcycle_exclude", "5", "Specifies how many past maps to exclude from the vote.", _, true, 0.0);
ferret99gt@1475
    62
	
ferret99gt@1475
    63
	AutoExecConfig(true, "randomcycle");
ferret99gt@1475
    64
}
ferret99gt@1475
    65
ferret99gt@1606
    66
public OnConfigsExecuted()
ferret99gt@1475
    67
{
ferret99gt@1475
    68
	g_Cvar_Nextmap = FindConVar("sm_nextmap");
ferret99gt@1475
    69
ferret99gt@1475
    70
	if (g_Cvar_Nextmap == INVALID_HANDLE)
ferret99gt@1475
    71
	{
ferret99gt@1475
    72
		LogError("FATAL: Cannot find sm_nextmap cvar. RandomCycle not loaded.");
ferret99gt@1475
    73
		SetFailState("sm_nextmap not found");
ferret99gt@1475
    74
	}
ferret99gt@1475
    75
	
ferret99gt@1606
    76
	if (LoadMaps(g_MapList, g_mapFileTime, g_Cvar_Mapfile))
ferret99gt@1475
    77
	{
ferret99gt@1475
    78
		CreateTimer(5.0, Timer_RandomizeNextmap); // Small delay to give Nextmap time to complete OnMapStart()
ferret99gt@1475
    79
	}
ferret99gt@1475
    80
}
ferret99gt@1475
    81
ferret99gt@1475
    82
public Action:Timer_RandomizeNextmap(Handle:timer)
ferret99gt@1475
    83
{
ferret99gt@1475
    84
	decl String:map[32];
ferret99gt@1475
    85
ferret99gt@1475
    86
	new bool:oldMaps = false;
ferret99gt@1664
    87
	if (GetConVarInt(g_Cvar_ExcludeMaps) && GetArraySize(g_MapList) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1475
    88
	{
ferret99gt@1475
    89
		oldMaps = true;
ferret99gt@1475
    90
	}
ferret99gt@1475
    91
	
ferret99gt@1475
    92
	new b = GetRandomInt(0, GetArraySize(g_MapList) - 1);
ferret99gt@1475
    93
	GetArrayString(g_MapList, b, map, sizeof(map));
ferret99gt@1475
    94
ferret99gt@1664
    95
	while (oldMaps && FindStringInArray(g_OldMapList, map) != -1)
ferret99gt@1475
    96
	{
ferret99gt@1475
    97
		b = GetRandomInt(0, GetArraySize(g_MapList) - 1);
ferret99gt@1475
    98
		GetArrayString(g_MapList, b, map, sizeof(map));
ferret99gt@1475
    99
	}
ferret99gt@1475
   100
	
ferret99gt@1475
   101
	SetConVarString(g_Cvar_Nextmap, map);
ferret99gt@1475
   102
	PushArrayString(g_OldMapList, map);
ferret99gt@1475
   103
ferret99gt@1475
   104
	if (GetArraySize(g_OldMapList) > GetConVarInt(g_Cvar_ExcludeMaps))
ferret99gt@1475
   105
	{
ferret99gt@1475
   106
		RemoveFromArray(g_OldMapList, 0);
ferret99gt@1475
   107
	}
ferret99gt@1475
   108
ferret99gt@1475
   109
	LogMessage("RandomCycle has chosen %s for the nextmap.", map);	
ferret99gt@1475
   110
ferret99gt@1475
   111
	return Plugin_Stop;
ferret99gt@1475
   112
}