diff -r aa53ee1d9db1 -r a0de5251fb1a plugins/mapmanager/commands.sp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/mapmanager/commands.sp Wed Dec 19 22:19:34 2007 +0000 @@ -0,0 +1,398 @@ +/** + * vim: set ts=4 : + * ============================================================================= + * SourceMod Map Manager Plugin + * Contains callbacks for commands + * + * 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$ + */ + + public Action:Command_Say(client, args) + { + decl String:text[192]; + if (GetCmdArgString(text, sizeof(text)) < 1) + { + return Plugin_Continue; + } + + new startidx; + if (text[strlen(text)-1] == '"') + { + text[strlen(text)-1] = '\0'; + startidx = 1; + } + + decl String:message[8]; + BreakString(text[startidx], message, sizeof(message)); + + if (strcmp(message, "nextmap", false) == 0) + { + decl String:map[32]; + GetConVarString(g_Cvar_Nextmap, map, sizeof(map)); + + PrintToChat(client, "%t", "Next Map", map); + } + else + { + if (GetConVarBool(g_Cvar_RockTheVote) && (strcmp(text[startidx], "rtv", false) == 0 || strcmp(text[startidx], "rockthevote", false) == 0)) + { + if (g_MapChanged) + { + ReplyToCommand(client, "[SM] %t", "Map change in progress"); + return Plugin_Continue; + } + + if (!g_RTV_Allowed) + { + PrintToChat(client, "[SM] %t", "RTV Not Allowed"); + return Plugin_Continue; + } + + if (g_RTV_Ended) + { + PrintToChat(client, "[SM] %t", "RTV Ended"); + return Plugin_Continue; + } + + if (g_RTV_Started) + { + PrintToChat(client, "[SM] %t", "RTV Started"); + return Plugin_Continue; + } + + if (GetClientCount(true) < GetConVarInt(g_Cvar_MinPlayers) && g_RTV_Votes == 0) // Should we keep checking g_Votes here? + { + PrintToChat(client, "[SM] %t", "Minimal Players Not Met"); + return Plugin_Continue; + } + + if (g_RTV_Voted[client]) + { + PrintToChat(client, "[SM] %t", "Already Voted"); + return Plugin_Continue; + } + + new String:name[64]; + GetClientName(client, name, sizeof(name)); + + g_RTV_Votes++; + g_RTV_Voted[client] = true; + + PrintToChatAll("[SM] %t", "RTV Requested", name, g_RTV_Votes, g_RTV_VotesNeeded); + + if (g_RTV_Votes >= g_RTV_VotesNeeded) + { + g_RTV_Started = true; + CreateTimer(2.0, Timer_StartRTV, TIMER_FLAG_NO_MAPCHANGE); + } + } + else if (GetConVarBool(g_Cvar_Nominate) && strcmp(text[startidx], "nominate", false) == 0) + { + if (g_MapChanged) + { + ReplyToCommand(client, "[SM] %t", "Map change in progress"); + return Plugin_Continue; + } + + if (g_RTV_Started || g_HasVoteStarted) + { + ReplyToCommand(client, "[SM] %t", "Map vote in progress"); + return Plugin_Continue; + } + + if (g_Nominated[client]) + { + PrintToChat(client, "[SM] %t", "Already Nominated"); + return Plugin_Continue; + } + + if (GetArraySize(g_Nominate) >= GetConVarInt(g_Cvar_Maps)) + { + PrintToChat(client, "[SM] %t", "Max Nominations"); + return Plugin_Continue; + } + + DisplayMenu(g_Menu_Nominate, client, MENU_TIME_FOREVER); + } + } + + return Plugin_Continue; +} + +public Action:Command_Mapvote(client, args) +{ + InitiateVote(); + + return Plugin_Handled; +} + +public Action:Command_Nextmap(args) +{ + decl String:map[64]; + + GetConVarString(g_Cvar_Nextmap, map, sizeof(map)); + + ReplyToCommand(0, "%t", "Next Map", map); + + return Plugin_Handled; +} + +public Action:Command_List(client, args) +{ + PrintToConsole(client, "Map Cycle:"); + + decl String:currentMap[64]; + GetCurrentMap(currentMap, 64); + + decl String:mapName[64]; + for (new i = 0; i < GetArraySize(g_MapCycle); i++) + { + GetArrayString(g_MapCycle, i, mapName, sizeof(mapName)); + if (strcmp(mapName, currentMap) == 0) + { + PrintToConsole(client, "%s <========= Current map", mapName); + } + else if (strcmp(mapName, g_NextMap) == 0) + { + PrintToConsole(client, "%s <========= Next map", mapName); + } + else + { + PrintToConsole(client, "%s", mapName); + } + } + + return Plugin_Handled; +} + +public Action:Command_SetNextmap(client, args) +{ + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_setnextmap "); + return Plugin_Handled; + } + + if (g_MapChanged) + { + ReplyToCommand(client, "[SM] %t", "Map change in progress"); + return Plugin_Handled; + } + + decl String:map[64]; + GetCmdArg(1, map, sizeof(map)); + + if (!IsMapValid(map)) + { + ReplyToCommand(client, "[SM] %t", "Map was not found", map); + return Plugin_Handled; + } + + ShowActivity(client, "%t", "Cvar changed", "sm_nextmap", map); + LogMessage("\"%L\" changed sm_nextmap to \"%s\"", client, map); + + SetNextMap(map); + + return Plugin_Handled; +} + + public Action:Command_Map(client, args) + { + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_map [r/e]"); + return Plugin_Handled; + } + + if (g_MapChanged) + { + ReplyToCommand(client, "[SM] %t", "Map change in progress"); + return Plugin_Handled; + } + + decl String:map[64]; + GetCmdArg(1, map, sizeof(map)); + + if (!IsMapValid(map)) + { + ReplyToCommand(client, "[SM] %t", "Map was not found", map); + return Plugin_Handled; + } + + decl String:when[2]; + if (args > 1) + { + GetCmdArg(2, when, sizeof(when)); + + when[0] = CharToLower(when[0]); + if (when[0] != 'r' && when[0] != 'e') + { + when[0] = 'i'; + } + } + + SetMapChange(client, map, when); + + return Plugin_Handled; +} + +public Action:Command_Votemap(client, args) +{ + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_votemap [r/e] [mapname2] ... [mapname5]"); + return Plugin_Handled; + } + + if (g_MapChanged) + { + ReplyToCommand(client, "[SM] %t", "Map change in progress"); + return Plugin_Handled; + } + + if (IsVoteInProgress()) + { + ReplyToCommand(client, "[SM] %t", "Vote in Progress"); + return Plugin_Handled; + } + + if (!TestVoteDelay(client)) + { + return Plugin_Handled; + } + + decl String:text[256]; + GetCmdArgString(text, sizeof(text)); + + decl String:maps[5][64]; + new mapCount; + new len, pos; + + // Find out if the user specified "when" + decl String:when[64]; + pos = BreakString(text[len], when, sizeof(when)); + if (!IsMapValid(when)) + { + when[0] = CharToLower(when[0]); + if (when[0] != 'r' && when[0] != 'e') + { + ReplyToCommand(client, "[SM] %t", "Map was not found", maps[mapCount]); + return Plugin_Handled; + } + } + else + { + strcpy(maps[mapCount], sizeof(maps[]), when); + mapCount++; + when[0] = 'i'; + } + + len += pos; + + while (pos != -1 && mapCount < 5) + { + pos = BreakString(text[len], maps[mapCount], sizeof(maps[])); + + if (!IsMapValid(maps[mapCount])) + { + ReplyToCommand(client, "[SM] %t", "Map was not found", maps[mapCount]); + return Plugin_Handled; + } + + mapCount++; + + len += pos; + } + + g_VoteMapInUse = client; + g_Client_Data[client][0] = when[0]; + + DisplayVoteMapMenu(client, mapCount, maps); + + return Plugin_Handled; +} + +public Action:Command_Nominate(client, args) +{ + if (args < 1) + { + ReplyToCommand(client, "[SM] Usage: sm_nominate "); + return Plugin_Handled; + } + + if (!GetConVarBool(g_Cvar_Nominate)) + { + ReplyToCommand(client, "[SM] Nominations are currently disabled."); + return Plugin_Handled; + } + + decl String:mapname[64]; + GetCmdArg(1, mapname, sizeof(mapname)); + + if (FindStringInArray(g_MapList, mapname) == -1) + { + ReplyToCommand(client, "%t", "Map was not found", mapname); + return Plugin_Handled; + } + + if (GetArraySize(g_Nominated) > 0) + { + if (FindStringInArray(g_Nominated, mapname) != -1) + { + ReplyToCommand(client, "%t", "Map Already In Vote", mapname); + return Plugin_Handled; + } + + ShiftArrayUp(g_Nominated, 0); + SetArrayString(g_Nominated, 0, mapname); + + while (GetArraySize(g_Nominated) > GetConVarInt(g_Cvar_Maps)) + { + RemoveFromArray(g_Nominated, GetConVarInt(g_Cvar_Maps)); + } + } + else + { + PushArrayString(g_Nominated, mapname); + } + + decl String:item[64]; + for (new i = 0; i < GetMenuItemCount(g_Menu_Nominate); i++) + { + GetMenuItem(g_Menu_Nominate, i, item, sizeof(item)); + if (strcmp(item, mapname) == 0) + { + RemoveMenuItem(g_Menu_Nominate, i); + break; + } + } + + ReplyToCommand(client, "%t", "Map Inserted", mapname); + LogAction(client, -1, "\"%L\" inserted map \"%s\".", client, mapname); + + return Plugin_Handled; +} \ No newline at end of file