plugins/nextmap.sp
author David Anderson <dvander@alliedmods.net>
Fri Jul 11 05:14:32 2008 +0000 (2008-07-11)
branchrefac-jit
changeset 2190 880e81f30b5e
parent 2168 c24a6fa957db
permissions -rw-r--r--
GetContext() now returns 'this' as a hack (shouldn't+can't be accessed anyway)
dvander@2168
     1
/**
dvander@2168
     2
 * vim: set ts=4 :
dvander@2168
     3
 * =============================================================================
dvander@2168
     4
 * SourceMod Nextmap Plugin
dvander@2168
     5
 * Adds sm_nextmap cvar for changing map and nextmap chat trigger.
dvander@2168
     6
 *
dvander@2168
     7
 * SourceMod (C)2004-2008 AlliedModders LLC.  All rights reserved.
dvander@2168
     8
 * =============================================================================
dvander@2168
     9
 *
dvander@2168
    10
 * This program is free software; you can redistribute it and/or modify it under
dvander@2168
    11
 * the terms of the GNU General Public License, version 3.0, as published by the
dvander@2168
    12
 * Free Software Foundation.
dvander@2168
    13
 * 
dvander@2168
    14
 * This program is distributed in the hope that it will be useful, but WITHOUT
dvander@2168
    15
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dvander@2168
    16
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
dvander@2168
    17
 * details.
dvander@2168
    18
 *
dvander@2168
    19
 * You should have received a copy of the GNU General Public License along with
dvander@2168
    20
 * this program.  If not, see <http://www.gnu.org/licenses/>.
dvander@2168
    21
 *
dvander@2168
    22
 * As a special exception, AlliedModders LLC gives you permission to link the
dvander@2168
    23
 * code of this program (as well as its derivative works) to "Half-Life 2," the
dvander@2168
    24
 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
dvander@2168
    25
 * by the Valve Corporation.  You must obey the GNU General Public License in
dvander@2168
    26
 * all respects for all other code used.  Additionally, AlliedModders LLC grants
dvander@2168
    27
 * this exception to all derivative works.  AlliedModders LLC defines further
dvander@2168
    28
 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
dvander@2168
    29
 * or <http://www.sourcemod.net/license.php>.
dvander@2168
    30
 *
dvander@2168
    31
 * Version: $Id$
dvander@2168
    32
 */
dvander@2168
    33
dvander@2168
    34
#pragma semicolon 1
dvander@2168
    35
dvander@2168
    36
#include <sourcemod>
dvander@2168
    37
#include "include/nextmap.inc"
dvander@2168
    38
dvander@2168
    39
 
dvander@2168
    40
public Plugin:myinfo = 
dvander@2168
    41
{
dvander@2168
    42
	name = "Nextmap",
dvander@2168
    43
	author = "AlliedModders LLC",
dvander@2168
    44
	description = "Provides nextmap and sm_nextmap",
dvander@2168
    45
	version = SOURCEMOD_VERSION,
dvander@2168
    46
	url = "http://www.sourcemod.net/"
dvander@2168
    47
};
dvander@2168
    48
dvander@2168
    49
 
dvander@2168
    50
new g_MapPos = -1;
dvander@2168
    51
new Handle:g_MapList = INVALID_HANDLE;
dvander@2168
    52
new g_MapListSerial = -1;
dvander@2168
    53
 
dvander@2168
    54
public OnPluginStart()
dvander@2168
    55
{
dvander@2168
    56
	LoadTranslations("common.phrases");
dvander@2168
    57
	LoadTranslations("nextmap.phrases");
dvander@2168
    58
	
dvander@2168
    59
	g_MapList = CreateArray(32);
dvander@2168
    60
	
dvander@2168
    61
	RegConsoleCmd("say", Command_Say);
dvander@2168
    62
	RegConsoleCmd("say_team", Command_Say);
dvander@2168
    63
	
dvander@2168
    64
	RegConsoleCmd("nextmap", Command_Nextmap);
dvander@2168
    65
dvander@2168
    66
	RegAdminCmd("sm_setnextmap", Command_SetNextmap, ADMFLAG_CHANGEMAP, "sm_setnextmap <map>");
dvander@2168
    67
	RegConsoleCmd("listmaps", Command_List);
dvander@2168
    68
dvander@2168
    69
	// Set to the current map so OnMapStart() will know what to do
dvander@2168
    70
	decl String:currentMap[64];
dvander@2168
    71
	GetCurrentMap(currentMap, 64);
dvander@2168
    72
	SetNextMap(currentMap);
dvander@2168
    73
}
dvander@2168
    74
 
dvander@2168
    75
public OnConfigsExecuted()
dvander@2168
    76
{
dvander@2168
    77
	decl String:lastMap[64], String:currentMap[64];
dvander@2168
    78
	GetNextMap(lastMap, sizeof(lastMap));
dvander@2168
    79
	GetCurrentMap(currentMap, 64);
dvander@2168
    80
	
dvander@2168
    81
	// Why am I doing this? If we switched to a new map, but it wasn't what we expected (Due to sm_map, sm_votemap, or
dvander@2168
    82
	// some other plugin/command), we don't want to scramble the map cycle. Or for example, admin switches to a custom map
dvander@2168
    83
	// not in mapcyclefile. So we keep it set to the last expected nextmap. - ferret
dvander@2168
    84
	if (strcmp(lastMap, currentMap) == 0)
dvander@2168
    85
	{
dvander@2168
    86
		FindAndSetNextMap();
dvander@2168
    87
	}
dvander@2168
    88
}
dvander@2168
    89
dvander@2168
    90
public Action:Command_Say(client, args)
dvander@2168
    91
{
dvander@2168
    92
	decl String:text[192];
dvander@2168
    93
	if (GetCmdArgString(text, sizeof(text)) < 1)
dvander@2168
    94
	{
dvander@2168
    95
		return Plugin_Continue;
dvander@2168
    96
	}
dvander@2168
    97
	
dvander@2168
    98
	new startidx;
dvander@2168
    99
	if (text[strlen(text)-1] == '"')
dvander@2168
   100
	{
dvander@2168
   101
		text[strlen(text)-1] = '\0';
dvander@2168
   102
		startidx = 1;
dvander@2168
   103
	}
dvander@2168
   104
	
dvander@2168
   105
	decl String:message[8];
dvander@2168
   106
	BreakString(text[startidx], message, sizeof(message));
dvander@2168
   107
	
dvander@2168
   108
	if (strcmp(message, "nextmap", false) == 0)
dvander@2168
   109
	{
dvander@2168
   110
		decl String:map[32];
dvander@2168
   111
		GetNextMap(map, sizeof(map));
dvander@2168
   112
		
dvander@2168
   113
		PrintToChat(client, "[SM] %t", "Next Map", map);
dvander@2168
   114
	}
dvander@2168
   115
	
dvander@2168
   116
	return Plugin_Continue;	
dvander@2168
   117
}
dvander@2168
   118
dvander@2168
   119
public Action:Command_SetNextmap(client, args)
dvander@2168
   120
{
dvander@2168
   121
	if (args < 1)
dvander@2168
   122
	{
dvander@2168
   123
		ReplyToCommand(client, "[SM] Usage: sm_setnextmap <map>");
dvander@2168
   124
		return Plugin_Handled;
dvander@2168
   125
	}
dvander@2168
   126
dvander@2168
   127
	decl String:map[64];
dvander@2168
   128
	GetCmdArg(1, map, sizeof(map));
dvander@2168
   129
dvander@2168
   130
	if (!IsMapValid(map))
dvander@2168
   131
	{
dvander@2168
   132
		ReplyToCommand(client, "[SM] %t", "Map was not found", map);
dvander@2168
   133
		return Plugin_Handled;
dvander@2168
   134
	}
dvander@2168
   135
dvander@2168
   136
	ShowActivity(client, "%t", "Changed Next Map", map);
dvander@2168
   137
	LogMessage("\"%L\" changed nextmap to \"%s\"", client, map);
dvander@2168
   138
dvander@2168
   139
	SetNextMap(map);
dvander@2168
   140
dvander@2168
   141
	return Plugin_Handled;
dvander@2168
   142
}
dvander@2168
   143
dvander@2168
   144
public Action:Command_List(client, args) 
dvander@2168
   145
{
dvander@2168
   146
	PrintToConsole(client, "Map Cycle:");
dvander@2168
   147
	
dvander@2168
   148
	new mapCount = GetArraySize(g_MapList);
dvander@2168
   149
	decl String:mapName[32];
dvander@2168
   150
	for (new i = 0; i < mapCount; i++)
dvander@2168
   151
	{
dvander@2168
   152
		GetArrayString(g_MapList, i, mapName, sizeof(mapName));
dvander@2168
   153
		PrintToConsole(client, "%s", mapName);
dvander@2168
   154
	}
dvander@2168
   155
 
dvander@2168
   156
	return Plugin_Handled;
dvander@2168
   157
}
dvander@2168
   158
 
dvander@2168
   159
public Action:Command_Nextmap(client, args)
dvander@2168
   160
{
dvander@2168
   161
	decl String:map[64];
dvander@2168
   162
	
dvander@2168
   163
	GetNextMap(map, sizeof(map));
dvander@2168
   164
	
dvander@2168
   165
	ReplyToCommand(client, "[SM] %t", "Next Map", map);
dvander@2168
   166
	
dvander@2168
   167
	return Plugin_Handled;
dvander@2168
   168
}
dvander@2168
   169
 
dvander@2168
   170
FindAndSetNextMap()
dvander@2168
   171
{
dvander@2168
   172
	if (ReadMapList(g_MapList, 
dvander@2168
   173
			g_MapListSerial, 
dvander@2168
   174
			"mapcyclefile", 
dvander@2168
   175
			MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_NO_DEFAULT)
dvander@2168
   176
		== INVALID_HANDLE)
dvander@2168
   177
	{
dvander@2168
   178
		if (g_MapListSerial == -1)
dvander@2168
   179
		{
dvander@2168
   180
			LogError("FATAL: Cannot load map cycle. Nextmap not loaded.");
dvander@2168
   181
			SetFailState("Mapcycle Not Found");
dvander@2168
   182
		}
dvander@2168
   183
	}
dvander@2168
   184
	
dvander@2168
   185
	new mapCount = GetArraySize(g_MapList);
dvander@2168
   186
	decl String:mapName[32];
dvander@2168
   187
	
dvander@2168
   188
	if (g_MapPos == -1)
dvander@2168
   189
	{
dvander@2168
   190
		decl String:current[64];
dvander@2168
   191
		GetCurrentMap(current, 64);
dvander@2168
   192
dvander@2168
   193
		for (new i = 0; i < mapCount; i++)
dvander@2168
   194
		{
dvander@2168
   195
			GetArrayString(g_MapList, i, mapName, sizeof(mapName));
dvander@2168
   196
			if (strcmp(current, mapName, false) == 0)
dvander@2168
   197
			{
dvander@2168
   198
				g_MapPos = i;
dvander@2168
   199
				break;
dvander@2168
   200
			}
dvander@2168
   201
		}
dvander@2168
   202
		
dvander@2168
   203
		if (g_MapPos == -1)
dvander@2168
   204
			g_MapPos = 0;
dvander@2168
   205
	}
dvander@2168
   206
	
dvander@2168
   207
	g_MapPos++;
dvander@2168
   208
	if (g_MapPos >= mapCount)
dvander@2168
   209
		g_MapPos = 0;	
dvander@2168
   210
 
dvander@2168
   211
 	GetArrayString(g_MapList, g_MapPos, mapName, sizeof(mapName));
dvander@2168
   212
	SetNextMap(mapName);
dvander@2168
   213
}