initial commit

This commit is contained in:
BotoX
2016-01-06 02:11:56 +01:00
commit 72f7665358
106 changed files with 17675 additions and 0 deletions
@@ -0,0 +1,21 @@
ar_baggage
ar_monastery
ar_shoots
cs_assault
cs_italy
cs_militia
cs_office
de_aztec
de_bank
de_dust
de_dust2
de_inferno
de_lake
de_mirage
de_nuke
de_safehouse
de_shorttrain
de_stmarc
de_sugarcane
de_train
de_vertigo
@@ -0,0 +1,28 @@
as_oilrig
cs_747
cs_assault
cs_backalley
cs_compound
cs_estate
cs_havana
cs_italy
cs_militia
cs_office
cs_siege
de_airstrip
de_aztec
de_cbble
de_chateau
de_dust2
de_dust
de_inferno
de_nuke
de_piranesi
de_port
de_prodigy
de_storm
de_survivor
de_tides
de_torn
de_train
de_vertigo
@@ -0,0 +1,9 @@
dod_anzio
dod_argentan
dod_avalanche
dod_colmar
dod_donner
dod_flash
dod_jagd
dod_kalt
dod_palermo
@@ -0,0 +1,7 @@
dm_lockdown
dm_overwatch
dm_runoff
dm_steamlab
dm_underpass
dm_resistance
dm_powerhouse
@@ -0,0 +1,65 @@
tc_hydro
cp_well
cp_granary
cp_dustbowl
cp_gravelpit
ctf_2fort
ctf_well
cp_badlands
pl_goldrush
cp_fastlane
ctf_turbine
pl_badwater
cp_steel
arena_badlands
arena_granary
arena_lumberyard
arena_ravine
arena_well
cp_egypt_final
cp_junction_final
arena_watchtower
plr_pipeline
arena_sawmill
arena_nucleus
pl_hoodoo_final
koth_sawmill
koth_nucleus
koth_viaduct
ctf_sawmill
arena_offblast_final
cp_yukon_final
koth_harvest_final
koth_harvest_event
ctf_doublecross
cp_gorge
cp_freight_final1
pl_upward
plr_hightower
pl_thundermountain
cp_coldfront
cp_mountainlab
cp_manor_event
cp_degrootkeep
cp_5gorge
pl_frontier_final
plr_nightfall_final
koth_lakeside_final
koth_badlands
pl_barnblitz
cp_gullywash_final1
koth_viaduct_event
cp_foundry
sd_doomsday
koth_king
mvm_mannworks
mvm_coaltown
mvm_decoy
koth_lakeside_event
mvm_bigrock
cp_process_final
cp_standin_final
plr_hightower_event
cp_snakewater_final1
mvm_mannhattan
mvm_rottenburg
@@ -0,0 +1,77 @@
"MapchooserSoundsList"
{
"tf"
{
"counter"
{
"1"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_1sec.mp3"
"builtin" "vo/announcer_begins_1sec.wav"
"event" "Announcer.RoundBegins1Seconds"
}
"2"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_2sec.mp3"
"builtin" "vo/announcer_begins_2sec.wav"
"event" "Announcer.RoundBegins2Seconds"
}
"3"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_3sec.mp3"
"builtin" "vo/announcer_begins_3sec.wav"
"event" "Announcer.RoundBegins3Seconds"
}
"4"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_4sec.mp3"
"builtin" "vo/announcer_begins_4sec.wav"
"event" "Announcer.RoundBegins4Seconds"
}
"5"
{
"sound" "sourcemod/mapchooser/tf2/announcer_begins_5sec.mp3"
"builtin" "vo/announcer_begins_5sec.wav"
"event" "Announcer.RoundBegins5Seconds"
}
"10"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins10s01.mp3"
"builtin" "vo/announcer_dec_missionbegins10s01.wav"
}
"30"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins30s01.mp3"
"builtin" "vo/announcer_dec_missionbegins30s01.wav"
}
"60"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s06.mp3"
"builtin" "vo/announcer_dec_missionbegins60s06.wav"
}
}
"vote start"
{
"sound" "sourcemod/mapchooser/tf2/vote_started.mp3"
"event" "Vote.Created"
"builtin" "ui/vote_started.wav"
}
"vote end"
{
"sound" "sourcemod/mapchooser/tf2/vote_success.mp3"
"event" "Vote.Passed"
"builtin" "ui/vote_success.wav"
}
"vote warning"
{
"sound" "sourcemod/mapchooser/tf2/announcer_dec_missionbegins60s03.mp3"
"builtin" "vo/announcer_dec_missionbegins60s03.wav"
}
"runoff warning"
{
"sound" "sourcemod/mapchooser/tf2/vote_failure.mp3"
"event" "Vote.Failed"
"builtin" "ui/vote_failure.wav"
}
}
}
+1
View File
@@ -0,0 +1 @@
../../../includes/colors.inc
@@ -0,0 +1,108 @@
/**
* vim: set ts=4 :
* =============================================================================
* MapChooser Extended
* Creates a map vote at appropriate times, setting sm_nextmap to the winning
* vote
*
* MapChooser Extended (C)2011-2013 Powerlord (Ross Bemrose)
* 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#if defined _mapchooser_extended_included_
#endinput
#endif
#define _mapchooser_extended_included_
#include <mapchooser>
// MCE 1.9 series
enum CanNominateResult
{
CanNominate_No_VoteFull, /** No, nominations list is full */
CanNominate_No_VoteInProgress, /** No, map vote is in progress */
CanNominate_No_VoteComplete, /** No, map vote is completed */
CanNominate_Yes, /** Yes, you can nominate */
};
/**
* Called whenever warning timer starts
*
*/
forward OnMapVoteWarningStart();
/**
* Called whenever runoff warning timer starts
*/
forward OnMapVoteRunnoffWarningStart();
/**
* Called whenever the timer ticks
*/
forward OnMapVoteWarningTick(time);
/**
* Called whenever vote starts
*
* @deprecated Will be removed in MapChooser 1.8. Use OnMapVoteStarted instead.
*/
forward OnMapVoteStart();
/**
* Called whenever vote ends
*/
forward OnMapVoteEnd(const String:map[]);
/**
* Is a map on the current game's official list?
* This should be treated as informative only.
*
* @param map Name of map to check
* @return true if it's on the list of official maps for this game
*/
native bool:IsMapOfficial(const String:map[]);
/**
* Is nominate allowed?
*
* @return A CanNominateResult corresponding to whether a vote is allowed or not
*/
native CanNominateResult:CanNominate();
native bool:ExcludeMap(const String:map[]);
public SharedPlugin:__pl_mapchooser_extended =
{
name = "mapchooser",
file = "mapchooser_extended.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};
@@ -0,0 +1 @@
../../../includes/nativevotes.inc
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,703 @@
/**
* vim: set ts=4 :
* =============================================================================
* Nominations Extended
* Allows players to nominate maps for Mapchooser
*
* Nominations Extended (C)2012-2013 Powerlord (Ross Bemrose)
* 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <sourcemod>
#include <mapchooser>
#include "include/mapchooser_extended"
#include <colors>
#pragma semicolon 1
#define MCE_VERSION "1.10.0"
public Plugin:myinfo =
{
name = "Map Nominations Extended",
author = "Powerlord and AlliedModders LLC",
description = "Provides Map Nominations",
version = MCE_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=156974"
};
new Handle:g_Cvar_ExcludeOld = INVALID_HANDLE;
new Handle:g_Cvar_ExcludeCurrent = INVALID_HANDLE;
new Handle:g_MapList = INVALID_HANDLE;
new Handle:g_AdminMapList = INVALID_HANDLE;
new Handle:g_MapMenu = INVALID_HANDLE;
new Handle:g_AdminMapMenu = INVALID_HANDLE;
new g_mapFileSerial = -1;
new g_AdminMapFileSerial = -1;
#define MAPSTATUS_ENABLED (1<<0)
#define MAPSTATUS_DISABLED (1<<1)
#define MAPSTATUS_EXCLUDE_CURRENT (1<<2)
#define MAPSTATUS_EXCLUDE_PREVIOUS (1<<3)
#define MAPSTATUS_EXCLUDE_NOMINATED (1<<4)
new Handle:g_mapTrie;
// Nominations Extended Convars
new Handle:g_Cvar_MarkCustomMaps = INVALID_HANDLE;
new Handle:g_Cvar_NominateDelay = INVALID_HANDLE;
new Handle:g_Cvar_InitialDelay = INVALID_HANDLE;
new g_Player_NominationDelay[MAXPLAYERS+1];
new g_NominationDelay;
public OnPluginStart()
{
LoadTranslations("common.phrases");
LoadTranslations("nominations.phrases");
LoadTranslations("basetriggers.phrases"); // for Next Map phrase
LoadTranslations("mapchooser_extended.phrases");
new arraySize = ByteCountToCells(PLATFORM_MAX_PATH);
g_MapList = CreateArray(arraySize);
g_AdminMapList = CreateArray(arraySize);
g_Cvar_ExcludeOld = CreateConVar("sm_nominate_excludeold", "1", "Specifies if the current map should be excluded from the Nominations list", 0, true, 0.00, true, 1.0);
g_Cvar_ExcludeCurrent = CreateConVar("sm_nominate_excludecurrent", "1", "Specifies if the MapChooser excluded maps should also be excluded from Nominations", 0, true, 0.00, true, 1.0);
g_Cvar_InitialDelay = CreateConVar("sm_nominate_initialdelay", "60.0", "Time in seconds before first Nomination can be made", 0, true, 0.00);
g_Cvar_NominateDelay = CreateConVar("sm_nominate_delay", "3.0", "Delay between nominations", 0, true, 0.00, true, 60.00);
RegConsoleCmd("say", Command_Say);
RegConsoleCmd("say_team", Command_Say);
RegConsoleCmd("sm_nominate", Command_Nominate);
RegConsoleCmd("sm_nomlist", Command_NominateList);
RegAdminCmd("sm_nominate_addmap", Command_Addmap, ADMFLAG_CHANGEMAP, "sm_nominate_addmap <mapname> - Forces a map to be on the next mapvote.");
// BotoX
RegAdminCmd("sm_nominate_exclude", Command_AddExclude, ADMFLAG_CHANGEMAP, "sm_nominate_exclude <mapname> - Forces a map to be inserted into the recently played maps. Effectively blocking the map from being nominated.");
// Nominations Extended cvars
CreateConVar("ne_version", MCE_VERSION, "Nominations Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
g_mapTrie = CreateTrie();
}
public OnAllPluginsLoaded()
{
// This is an MCE cvar... this plugin requires MCE to be loaded. Granted, this plugin SHOULD have an MCE dependency.
g_Cvar_MarkCustomMaps = FindConVar("mce_markcustommaps");
}
public OnConfigsExecuted()
{
if (ReadMapList(g_MapList,
g_mapFileSerial,
"nominations",
MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_MAPSFOLDER)
== INVALID_HANDLE)
{
if (g_mapFileSerial == -1)
{
SetFailState("Unable to create a valid map list.");
}
}
if (ReadMapList(g_AdminMapList,
g_AdminMapFileSerial,
"sm_nominate_addmap menu",
MAPLIST_FLAG_CLEARARRAY|MAPLIST_FLAG_NO_DEFAULT|MAPLIST_FLAG_MAPSFOLDER)
== INVALID_HANDLE)
{
if (g_AdminMapFileSerial == -1)
{
SetFailState("Unable to create a valid admin map list.");
}
}
else
{
for (new i = 0; i < GetArraySize(g_MapList); i++)
{
decl String:map[PLATFORM_MAX_PATH];
GetArrayString(g_MapList, i, map, sizeof(map));
new Index = FindStringInArray(g_AdminMapList, map);
if (Index != -1)
RemoveFromArray(g_AdminMapList, Index);
}
}
g_NominationDelay = GetTime() + GetConVarInt(g_Cvar_InitialDelay);
BuildMapMenu();
BuildAdminMapMenu();
}
public OnNominationRemoved(const String:map[], owner)
{
new status;
/* Is the map in our list? */
if (!GetTrieValue(g_mapTrie, map, status))
{
return;
}
/* Was the map disabled due to being nominated */
if ((status & MAPSTATUS_EXCLUDE_NOMINATED) != MAPSTATUS_EXCLUDE_NOMINATED)
{
return;
}
SetTrieValue(g_mapTrie, map, MAPSTATUS_ENABLED);
}
public Action:Command_Addmap(client, args)
{
if (args == 0)
{
AttemptAdminNominate(client);
return Plugin_Handled;
}
if (args != 1)
{
CReplyToCommand(client, "[NE] Usage: sm_nominate_addmap <mapname>");
return Plugin_Handled;
}
decl String:mapname[PLATFORM_MAX_PATH];
GetCmdArg(1, mapname, sizeof(mapname));
// new status;
if (/*!GetTrieValue(g_mapTrie, mapname, status)*/!IsMapValid(mapname))
{
CReplyToCommand(client, "%t", "Map was not found", mapname);
return Plugin_Handled;
}
new NominateResult:result = NominateMap(mapname, true, 0);
if (result > Nominate_Replaced)
{
/* We assume already in vote is the casue because the maplist does a Map Validity check and we forced, so it can't be full */
CReplyToCommand(client, "%t", "Map Already In Vote", mapname);
return Plugin_Handled;
}
SetTrieValue(g_mapTrie, mapname, MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_NOMINATED);
CReplyToCommand(client, "%t", "Map Inserted", mapname);
LogAction(client, -1, "\"%L\" inserted map \"%s\".", client, mapname);
PrintToChatAll("[NE] %N has inserted %s into nominations", client, mapname);
return Plugin_Handled;
}
public Action:Command_AddExclude(client, args)
{
if (args < 1)
{
CReplyToCommand(client, "[NE] Usage: sm_nominate_exclude <mapname>");
return Plugin_Handled;
}
decl String:mapname[PLATFORM_MAX_PATH];
GetCmdArg(1, mapname, sizeof(mapname));
new status;
if(!GetTrieValue(g_mapTrie, mapname, status))
{
ReplyToCommand(client, "[NE] %t", "Map was not found", mapname);
return Plugin_Handled;
}
ShowActivity(client, "Excluded map \"%s\" from nomination", mapname);
LogAction(client, -1, "\"%L\" excluded map \"%s\" from nomination", client, mapname);
SetTrieValue(g_mapTrie, mapname, MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_PREVIOUS);
// native call to mapchooser_extended
ExcludeMap(mapname);
return Plugin_Handled;
}
public Action:Command_Say(client, args)
{
if (!client)
{
return Plugin_Continue;
}
decl String:text[192];
if (!GetCmdArgString(text, sizeof(text)))
{
return Plugin_Continue;
}
new startidx = 0;
if(text[strlen(text)-1] == '"')
{
text[strlen(text)-1] = '\0';
startidx = 1;
}
new ReplySource:old = SetCmdReplySource(SM_REPLY_TO_CHAT);
if (strcmp(text[startidx], "nominate", false) == 0)
{
if (IsNominateAllowed(client))
{
if (g_NominationDelay > GetTime())
ReplyToCommand(client, "[NE] Nominations will be unlocked in %d seconds", g_NominationDelay - GetTime());
else
AttemptNominate(client);
}
}
SetCmdReplySource(old);
return Plugin_Continue;
}
public Action:Command_Nominate(client, args)
{
if (!client || !IsNominateAllowed(client))
{
return Plugin_Handled;
}
if (g_NominationDelay > GetTime())
{
ReplyToCommand(client, "[NE] Nominations will be unlocked in %d seconds", g_NominationDelay - GetTime());
return Plugin_Handled;
}
if (args == 0)
{
AttemptNominate(client);
return Plugin_Handled;
}
if (g_Player_NominationDelay[client] > GetTime())
{
ReplyToCommand(client, "[NE] Please wait %d seconds before you can nominate again", g_Player_NominationDelay[client] - GetTime());
return Plugin_Handled;
}
decl String:mapname[PLATFORM_MAX_PATH];
GetCmdArg(1, mapname, sizeof(mapname));
new status;
if (!GetTrieValue(g_mapTrie, mapname, status))
{
CReplyToCommand(client, "%t", "Map was not found", mapname);
return Plugin_Handled;
}
if ((status & MAPSTATUS_DISABLED) == MAPSTATUS_DISABLED)
{
if ((status & MAPSTATUS_EXCLUDE_CURRENT) == MAPSTATUS_EXCLUDE_CURRENT)
{
CReplyToCommand(client, "[NE] %t", "Can't Nominate Current Map");
}
if ((status & MAPSTATUS_EXCLUDE_PREVIOUS) == MAPSTATUS_EXCLUDE_PREVIOUS)
{
CReplyToCommand(client, "[NE] %t", "Map in Exclude List");
}
if ((status & MAPSTATUS_EXCLUDE_NOMINATED) == MAPSTATUS_EXCLUDE_NOMINATED)
{
CReplyToCommand(client, "[NE] %t", "Map Already Nominated");
}
return Plugin_Handled;
}
new NominateResult:result = NominateMap(mapname, false, client);
if (result > Nominate_Replaced)
{
if (result == Nominate_AlreadyInVote)
{
CReplyToCommand(client, "[NE] %t", "Map Already In Vote", mapname);
}
else if (result == Nominate_VoteFull)
{
CReplyToCommand(client, "[ME] %t", "Max Nominations");
}
return Plugin_Handled;
}
/* Map was nominated! - Disable the menu item and update the trie */
SetTrieValue(g_mapTrie, mapname, MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_NOMINATED);
decl String:name[MAX_NAME_LENGTH];
GetClientName(client, name, sizeof(name));
if(result == Nominate_Added)
PrintToChatAll("[NE] %t", "Map Nominated", name, mapname);
else if(result == Nominate_Replaced)
PrintToChatAll("[NE] %t", "Map Nomination Changed", name, mapname);
LogMessage("%s nominated %s", name, mapname);
g_Player_NominationDelay[client] = GetTime() + GetConVarInt(g_Cvar_NominateDelay);
return Plugin_Continue;
}
public Action:Command_NominateList(client, args)
{
new arraySize = ByteCountToCells(PLATFORM_MAX_PATH);
new Handle:MapList = CreateArray(arraySize);
GetNominatedMapList(MapList);
if (!GetArraySize(MapList))
{
CReplyToCommand(client, "[NE] No maps have been nominated.");
return Plugin_Handled;
}
new Handle:NominateListMenu = CreateMenu(Handler_NominateListMenu, MENU_ACTIONS_DEFAULT|MenuAction_DisplayItem);
decl String:map[PLATFORM_MAX_PATH];
for (new i = 0; i < GetArraySize(MapList); i++)
{
GetArrayString(MapList, i, map, sizeof(map));
AddMenuItem(NominateListMenu, map, map);
}
SetMenuTitle(NominateListMenu, "Nominated Maps", client);
DisplayMenu(NominateListMenu, client, MENU_TIME_FOREVER);
return Plugin_Handled;
}
public Handler_NominateListMenu(Handle:menu, MenuAction:action, param1, param2)
{
return 0;
}
AttemptNominate(client)
{
SetMenuTitle(g_MapMenu, "%T", "Nominate Title", client);
DisplayMenu(g_MapMenu, client, MENU_TIME_FOREVER);
return;
}
AttemptAdminNominate(client)
{
SetMenuTitle(g_AdminMapMenu, "%T", "Nominate Title", client);
DisplayMenu(g_AdminMapMenu, client, MENU_TIME_FOREVER);
return;
}
BuildMapMenu()
{
if (g_MapMenu != INVALID_HANDLE)
{
CloseHandle(g_MapMenu);
g_MapMenu = INVALID_HANDLE;
}
ClearTrie(g_mapTrie);
g_MapMenu = CreateMenu(Handler_MapSelectMenu, MENU_ACTIONS_DEFAULT|MenuAction_DrawItem|MenuAction_DisplayItem);
decl String:map[PLATFORM_MAX_PATH];
new Handle:excludeMaps = INVALID_HANDLE;
decl String:currentMap[32];
if (GetConVarBool(g_Cvar_ExcludeOld))
{
excludeMaps = CreateArray(ByteCountToCells(PLATFORM_MAX_PATH));
GetExcludeMapList(excludeMaps);
}
if (GetConVarBool(g_Cvar_ExcludeCurrent))
{
GetCurrentMap(currentMap, sizeof(currentMap));
}
for (new i = 0; i < GetArraySize(g_MapList); i++)
{
new status = MAPSTATUS_ENABLED;
GetArrayString(g_MapList, i, map, sizeof(map));
if (GetConVarBool(g_Cvar_ExcludeCurrent))
{
if (StrEqual(map, currentMap))
{
status = MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_CURRENT;
}
}
/* Dont bother with this check if the current map check passed */
if (GetConVarBool(g_Cvar_ExcludeOld) && status == MAPSTATUS_ENABLED)
{
if (FindStringInArray(excludeMaps, map) != -1)
{
status = MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_PREVIOUS;
}
}
AddMenuItem(g_MapMenu, map, map);
SetTrieValue(g_mapTrie, map, status);
}
SetMenuExitButton(g_MapMenu, true);
if (excludeMaps != INVALID_HANDLE)
{
CloseHandle(excludeMaps);
}
}
BuildAdminMapMenu()
{
if (g_AdminMapMenu != INVALID_HANDLE)
{
CloseHandle(g_AdminMapMenu);
g_AdminMapMenu = INVALID_HANDLE;
}
g_AdminMapMenu = CreateMenu(Handler_AdminMapSelectMenu, MENU_ACTIONS_DEFAULT|MenuAction_DrawItem|MenuAction_DisplayItem);
decl String:map[PLATFORM_MAX_PATH];
for (new i = 0; i < GetArraySize(g_AdminMapList); i++)
{
GetArrayString(g_AdminMapList, i, map, sizeof(map));
AddMenuItem(g_AdminMapMenu, map, map);
}
SetMenuExitButton(g_AdminMapMenu, true);
}
public Handler_MapSelectMenu(Handle:menu, MenuAction:action, param1, param2)
{
switch (action)
{
case MenuAction_Select:
{
decl String:map[PLATFORM_MAX_PATH], String:name[MAX_NAME_LENGTH];
GetMenuItem(menu, param2, map, sizeof(map));
GetClientName(param1, name, MAX_NAME_LENGTH);
new NominateResult:result = NominateMap(map, false, param1);
/* Don't need to check for InvalidMap because the menu did that already */
if (result == Nominate_AlreadyInVote)
{
PrintToChat(param1, "[NE] %t", "Map Already Nominated");
return 0;
}
else if (result == Nominate_VoteFull)
{
PrintToChat(param1, "[NE] %t", "Max Nominations");
return 0;
}
SetTrieValue(g_mapTrie, map, MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_NOMINATED);
if(result == Nominate_Added)
PrintToChatAll("[NE] %t", "Map Nominated", name, map);
else if(result == Nominate_Replaced)
PrintToChatAll("[NE] %t", "Map Nomination Changed", name, map);
LogMessage("%s nominated %s", name, map);
}
case MenuAction_DrawItem:
{
decl String:map[PLATFORM_MAX_PATH];
GetMenuItem(menu, param2, map, sizeof(map));
new status;
if (!GetTrieValue(g_mapTrie, map, status))
{
LogError("Menu selection of item not in trie. Major logic problem somewhere.");
return ITEMDRAW_DEFAULT;
}
if ((status & MAPSTATUS_DISABLED) == MAPSTATUS_DISABLED)
{
return ITEMDRAW_DISABLED;
}
return ITEMDRAW_DEFAULT;
}
case MenuAction_DisplayItem:
{
decl String:map[PLATFORM_MAX_PATH];
GetMenuItem(menu, param2, map, sizeof(map));
new mark = GetConVarInt(g_Cvar_MarkCustomMaps);
new bool:official;
new status;
if (!GetTrieValue(g_mapTrie, map, status))
{
LogError("Menu selection of item not in trie. Major logic problem somewhere.");
return 0;
}
decl String:buffer[100];
decl String:display[150];
if (mark)
{
official = IsMapOfficial(map);
}
if (mark && !official)
{
switch (mark)
{
case 1:
{
Format(buffer, sizeof(buffer), "%T", "Custom Marked", param1, map);
}
case 2:
{
Format(buffer, sizeof(buffer), "%T", "Custom", param1, map);
}
}
}
else
{
strcopy(buffer, sizeof(buffer), map);
}
if ((status & MAPSTATUS_DISABLED) == MAPSTATUS_DISABLED)
{
if ((status & MAPSTATUS_EXCLUDE_CURRENT) == MAPSTATUS_EXCLUDE_CURRENT)
{
Format(display, sizeof(display), "%s (%T)", buffer, "Current Map", param1);
return RedrawMenuItem(display);
}
if ((status & MAPSTATUS_EXCLUDE_PREVIOUS) == MAPSTATUS_EXCLUDE_PREVIOUS)
{
Format(display, sizeof(display), "%s (%T)", buffer, "Recently Played", param1);
return RedrawMenuItem(display);
}
if ((status & MAPSTATUS_EXCLUDE_NOMINATED) == MAPSTATUS_EXCLUDE_NOMINATED)
{
Format(display, sizeof(display), "%s (%T)", buffer, "Nominated", param1);
return RedrawMenuItem(display);
}
}
if (mark && !official)
return RedrawMenuItem(buffer);
return 0;
}
}
return 0;
}
stock bool:IsNominateAllowed(client)
{
new CanNominateResult:result = CanNominate();
switch(result)
{
case CanNominate_No_VoteInProgress:
{
CReplyToCommand(client, "[ME] %t", "Nextmap Voting Started");
return false;
}
case CanNominate_No_VoteComplete:
{
new String:map[PLATFORM_MAX_PATH];
GetNextMap(map, sizeof(map));
CReplyToCommand(client, "[NE] %t", "Next Map", map);
return false;
}
/*
case CanNominate_No_VoteFull:
{
CReplyToCommand(client, "[ME] %t", "Max Nominations");
return false;
}
*/
}
return true;
}
public Handler_AdminMapSelectMenu(Handle:menu, MenuAction:action, param1, param2)
{
switch (action)
{
case MenuAction_Select:
{
decl String:map[PLATFORM_MAX_PATH], String:name[MAX_NAME_LENGTH];
GetMenuItem(menu, param2, map, sizeof(map));
new NominateResult:result = NominateMap(map, false, 0);
if (result == Nominate_AlreadyInVote)
{
PrintToChat(param1, "[NE] %t", "Map Already In Vote", map);
return 0;
}
SetTrieValue(g_mapTrie, map, MAPSTATUS_DISABLED|MAPSTATUS_EXCLUDE_NOMINATED);
PrintToChat(param1, "[NE] %t", "Map Inserted", map);
LogAction(param1, -1, "\"%L\" inserted map \"%s\".", param1, map);
PrintToChatAll("[NE] %N has inserted %s into nominations", name, map);
}
}
return 0;
}
@@ -0,0 +1,378 @@
/**
* vim: set ts=4 :
* =============================================================================
* Rock The Vote Extended
* Creates a map vote when the required number of players have requested one.
*
* Rock The Vote Extended (C)2012-2013 Powerlord (Ross Bemrose)
* 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 <http://www.gnu.org/licenses/>.
*
* 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 <http://www.sourcemod.net/license.php>.
*
* Version: $Id$
*/
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <mapchooser>
#include "include/mapchooser_extended"
#include <nextmap>
#include <colors>
#pragma semicolon 1
#define MCE_VERSION "1.10.0"
public Plugin:myinfo =
{
name = "Rock The Vote Extended",
author = "Powerlord and AlliedModders LLC",
description = "Provides RTV Map Voting",
version = MCE_VERSION,
url = "https://forums.alliedmods.net/showthread.php?t=156974"
};
new Handle:g_Cvar_Needed = INVALID_HANDLE;
new Handle:g_Cvar_MinPlayers = INVALID_HANDLE;
new Handle:g_Cvar_InitialDelay = INVALID_HANDLE;
new Handle:g_Cvar_Interval = INVALID_HANDLE;
new Handle:g_Cvar_ChangeTime = INVALID_HANDLE;
new Handle:g_Cvar_RTVPostVoteAction = INVALID_HANDLE;
new bool:g_CanRTV = false; // True if RTV loaded maps and is active.
new bool:g_RTVAllowed = false; // True if RTV is available to players. Used to delay rtv votes.
new g_Voters = 0; // Total voters connected. Doesn't include fake clients.
new g_Votes = 0; // Total number of "say rtv" votes
new g_VotesNeeded = 0; // Necessary votes before map vote begins. (voters * percent_needed)
new bool:g_Voted[MAXPLAYERS+1] = {false, ...};
new bool:g_InChange = false;
public OnPluginStart()
{
LoadTranslations("common.phrases");
LoadTranslations("rockthevote.phrases");
LoadTranslations("basevotes.phrases");
g_Cvar_Needed = CreateConVar("sm_rtv_needed", "0.60", "Percentage of players needed to rockthevote (Def 60%)", 0, true, 0.05, true, 1.0);
g_Cvar_MinPlayers = CreateConVar("sm_rtv_minplayers", "0", "Number of players required before RTV will be enabled.", 0, true, 0.0, true, float(MAXPLAYERS));
g_Cvar_InitialDelay = CreateConVar("sm_rtv_initialdelay", "30.0", "Time (in seconds) before first RTV can be held", 0, true, 0.00);
g_Cvar_Interval = CreateConVar("sm_rtv_interval", "240.0", "Time (in seconds) after a failed RTV before another can be held", 0, true, 0.00);
g_Cvar_ChangeTime = CreateConVar("sm_rtv_changetime", "0", "When to change the map after a succesful RTV: 0 - Instant, 1 - RoundEnd, 2 - MapEnd", _, true, 0.0, true, 2.0);
g_Cvar_RTVPostVoteAction = CreateConVar("sm_rtv_postvoteaction", "0", "What to do with RTV's after a mapvote has completed. 0 - Allow, success = instant change, 1 - Deny", _, true, 0.0, true, 1.0);
HookEvent("player_team", OnPlayerChangedTeam);
RegConsoleCmd("say", Command_Say);
RegConsoleCmd("say_team", Command_Say);
RegConsoleCmd("sm_rtv", Command_RTV);
RegAdminCmd("sm_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
RegAdminCmd("mce_forcertv", Command_ForceRTV, ADMFLAG_CHANGEMAP, "Force an RTV vote");
// Rock The Vote Extended cvars
CreateConVar("rtve_version", MCE_VERSION, "Rock The Vote Extended Version", FCVAR_SPONLY|FCVAR_NOTIFY|FCVAR_DONTRECORD);
AutoExecConfig(true, "rtv");
}
public OnMapStart()
{
g_Voters = 0;
g_Votes = 0;
g_VotesNeeded = 0;
g_InChange = false;
/* Handle late load */
for (new i=1; i<=MaxClients; i++)
{
if (IsClientConnected(i))
{
OnClientConnected(i);
}
}
}
public OnMapEnd()
{
g_CanRTV = false;
g_RTVAllowed = false;
}
public OnConfigsExecuted()
{
g_CanRTV = true;
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_InitialDelay), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
public OnClientConnected(client)
{
if(IsFakeClient(client))
return;
g_Voted[client] = false;
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
return;
}
public OnClientDisconnect(client)
{
if(IsFakeClient(client))
return;
if(g_Voted[client])
{
g_Votes--;
}
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (!g_CanRTV)
{
return;
}
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
public OnPlayerChangedTeam(Handle:event, const String:name[], bool:dontBroadcast)
{
new Client = GetClientOfUserId(GetEventInt(event, "userid"));
if(IsFakeClient(Client))
return;
if(Client == 0)
{
return;
}
if (IsClientInGame(Client) && IsClientConnected(Client))
{
if (GetClientTeam(Client) == 1)
{
g_Voters = GetTeamClientCount(2) + GetTeamClientCount(3);
g_VotesNeeded = RoundToFloor(float(g_Voters) * GetConVarFloat(g_Cvar_Needed));
if (g_Votes &&
g_Voters &&
g_Votes >= g_VotesNeeded &&
g_RTVAllowed )
{
if (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished())
{
return;
}
StartRTV();
}
}
}
}
public Action:Command_RTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
AttemptRTV(client);
return Plugin_Handled;
}
public Action:Command_Say(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Continue;
}
decl String:text[192];
if (!GetCmdArgString(text, sizeof(text)))
{
return Plugin_Continue;
}
new startidx = 0;
if(text[strlen(text)-1] == '"')
{
text[strlen(text)-1] = '\0';
startidx = 1;
}
new ReplySource:old = SetCmdReplySource(SM_REPLY_TO_CHAT);
if (strcmp(text[startidx], "rtv", false) == 0 || strcmp(text[startidx], "rockthevote", false) == 0)
{
AttemptRTV(client);
}
SetCmdReplySource(old);
return Plugin_Continue;
}
AttemptRTV(client)
{
if (!g_RTVAllowed || (GetConVarInt(g_Cvar_RTVPostVoteAction) == 1 && HasEndOfMapVoteFinished()))
{
CReplyToCommand(client, "[SM] %t", "RTV Not Allowed");
return;
}
if (!CanMapChooserStartVote())
{
CReplyToCommand(client, "[SM] %t", "RTV Started");
return;
}
if (GetClientCount(true) < GetConVarInt(g_Cvar_MinPlayers))
{
CReplyToCommand(client, "[SM] %t", "Minimal Players Not Met");
return;
}
if (g_Voted[client])
{
CReplyToCommand(client, "[SM] %t", "Already Voted", g_Votes, g_VotesNeeded);
return;
}
new String:name[MAX_NAME_LENGTH];
GetClientName(client, name, sizeof(name));
g_Votes++;
g_Voted[client] = true;
CPrintToChatAll("[SM] %t", "RTV Requested", name, g_Votes, g_VotesNeeded);
if (g_Votes >= g_VotesNeeded)
{
StartRTV();
}
}
public Action:Timer_DelayRTV(Handle:timer)
{
g_RTVAllowed = true;
}
StartRTV()
{
if (g_InChange)
{
return;
}
if (EndOfMapVoteEnabled() && HasEndOfMapVoteFinished())
{
/* Change right now then */
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
CPrintToChatAll("[SM] %t", "Changing Maps", map);
CreateTimer(5.0, Timer_ChangeMap, _, TIMER_FLAG_NO_MAPCHANGE);
g_InChange = true;
ResetRTV();
g_RTVAllowed = false;
}
return;
}
if (CanMapChooserStartVote())
{
new MapChange:when = MapChange:GetConVarInt(g_Cvar_ChangeTime);
InitiateMapChooserVote(when);
ResetRTV();
g_RTVAllowed = false;
CreateTimer(GetConVarFloat(g_Cvar_Interval), Timer_DelayRTV, _, TIMER_FLAG_NO_MAPCHANGE);
}
}
ResetRTV()
{
g_Votes = 0;
for (new i=1; i<=MAXPLAYERS; i++)
{
g_Voted[i] = false;
}
}
public Action:Timer_ChangeMap(Handle:hTimer)
{
g_InChange = false;
LogMessage("RTV changing map manually");
new String:map[PLATFORM_MAX_PATH];
if (GetNextMap(map, sizeof(map)))
{
ForceChangeLevel(map, "RTV after mapvote");
}
return Plugin_Stop;
}
// Rock The Vote Extended functions
public Action:Command_ForceRTV(client, args)
{
if (!g_CanRTV || !client)
{
return Plugin_Handled;
}
ShowActivity2(client, "[RTVE] ", "%t", "Initiated Vote Map");
StartRTV();
return Plugin_Handled;
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"chi" "下一幅地图投票了!"
}
"Nextmap Voting Started"
{
"chi" "下一幅地图投选已开始."
}
"Nextmap Voting Finished"
{
"chi" " 地图投票已结束. 下一幅地图将为 {1}. ( 得票{2}%% , {3}票)"
}
"Current Map Extended"
{
"chi" "当前地图已被延长."
}
"Extend Map"
{
"chi" "延长当前地图"
}
"Dont Change"
{
"chi" "请勿更换"
}
"Current Map Stays"
{
"chi" "当前地图已被延长! 投票显示! (得票 {1}%% 共 {2} 票)"
}
"Changed Next Map"
{
"chi" "更换下一幅地图为 \"{1}\"."
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"cze" "Hlasujte o příští mapě!"
}
"Nextmap Voting Started"
{
"cze" "Hlasování o příští mapě začalo."
}
"Nextmap Voting Finished"
{
"cze" "Hlasování o mapě skončilo. Příští mapou bude {1}. (Obdržela {2}%% z {3} hlasů)"
}
"Current Map Extended"
{
"cze" "Současná mapa byla prodloužena. (Obdržela {1}%% z {2} hlasů)"
}
"Extend Map"
{
"cze" "Prodloužit současnou mapu"
}
"Dont Change"
{
"cze" "Neměnit"
}
"Current Map Stays"
{
"cze" "Současná mapa pokračuje! Hlasování rozhodlo! (Obdržela {1}%% z {2} hlasů)"
}
"Changed Next Map"
{
"cze" "Změnil příští mapu na \"{1}\"."
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"da" "Stem om næste bane!"
}
"Nextmap Voting Started"
{
"da" "Afstemning for næste bane er begyndt."
}
"Nextmap Voting Finished"
{
"da" "Bane afstemning er fuldført. Den næste bane vil være {1}. (Modtog {2}%% af {3} stemmer) "
}
"Current Map Extended"
{
"da" "Den nuværende bane er blevet forlænget. (Modtog {1}%% af {2} stemmer) "
}
"Extend Map"
{
"da" "Forlæng bane"
}
"Dont Change"
{
"da" "Skift ikke!"
}
"Current Map Stays"
{
"da" "Den aktuelle bane fortsætter! Afstemningen har talt! (Modtog {1}%% af {2} stemmer)"
}
"Changed Next Map"
{
"da" "Skiftede næste bane til \"{1}'."
}
}
@@ -0,0 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"de" "Stimme für die nächste Karte!"
}
"Nextmap Voting Started"
{
"de" "Abstimmung für die nächste Karte wurde gestartet."
}
"Nextmap Voting Finished"
{
"de" "Karten-Abstimmung wurde abgeschlossen. Nächste Karte wird {1} sein. ({2}%% von {3} Stimmen erhalten) "
}
"Current Map Extended"
{
"de" "Die aktuelle Karte wurde verlängert. ({1}%% von {2} Stimmen erhalten) "
}
"Extend Map"
{
"de" "Verlängere aktuelle Karte"
}
"Dont Change"
{
"de" "Nicht wechseln"
}
"Current Map Stays"
{
"de" "Aktuelle Karte geht weiter! Die Abstimmung hat entschieden! ({1}%% von {2} Stimmen erhalten) "
}
"Changed Next Map"
{
"de" "Nächste Karte wurde auf \"{1}\" geändert. "
}
"Runoff Vote Nextmap"
{
"de" "Stichwahl für die nächste Karte!"
}
"Number Of Votes"
{
"de" "Anzahl der Stimmen"
}
"Custom"
{
"de" "{1} (nicht vorhanden)"
}
"Revote Is Needed"
{
"de" "Keine Karte hat mehr als {1}%% der Stimmen.\nEine neue Abstimmung ist erforderlich!"
}
"Revote Warning"
{
"de" "Stichwahl startet in: {1} Sekunden"
}
"Vote Warning"
{
"de" "Achtung! Die Abstimmung für die nächste Karte startet in: {1} Sekunden"
}
"Line One"
{
"de" "Überlegen Sie, welche Karte Sie spielen möchten ..."
}
"Line Two"
{
"de" "... und nicht unüberlegt wählen!"
}
"Cannot Start Vote"
{
"de" "Abstimmung ist bereits im Gange. Versuch Sie es erneut in {1} Sekunden"
}
"Tie Vote"
{
"de" "Die Top-{1} Karten haben gleich viele Stimmen!.\nEine neue Abstimmung ist erforderlich!"
}
"Custom Marked"
{
"de" "*{1}"
}
}
@@ -0,0 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"es" "Vota para el siguiente mapa!"
}
"Nextmap Voting Started"
{
"es" "La votacion para el siguiente mapa ha comenzado."
}
"Nextmap Voting Finished"
{
"es" "Votacion de Mapa finalizado. El siguiente mapa sera {1}. (Recibidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"es" "El mapa actual ha sido extendido. (Recibidos {1}%% de {2} votos)"
}
"Extend Map"
{
"es" "Extender mapa actual"
}
"Dont Change"
{
"es" "No cambiar"
}
"Current Map Stays"
{
"es" "El mapa actual continua! La votacion ha hablado! (Recibidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"es" "El siguiente mapa ha cambiado a \"{1}\"."
}
"Runoff Vote Nextmap"
{
"es" "Hacer votacion para el siguiente mapa!"
}
"Number Of Votes"
{
"es" "Numero de Votaciones"
}
"Custom"
{
"es" "{1} (Custom)"
}
"Revote Is Needed"
{
"es" "No hay ningun mapa que haya recibido el {1}%% de votaciones.\nEntonces, que mapa ganara? Es necesario otra votacion!"
}
"Revote Warning"
{
"es" "La votacion empezara en: {1}s"
}
"Vote Warning"
{
"es" "Atencion! La votacion para el siguiente mapa se iniciara en: {1}s"
}
"Line One"
{
"es" "Considera que mapa quieres jugar..."
}
"Line Two"
{
"es" "...y no pulse los botones sin pensar ;-)"
}
"Cannot Start Vote"
{
"es" "Votacion ya iniciada. Intentando de nuevo en {1}s."
}
"Tie Vote"
{
"es" "El top {1} de mapas tienen el mismo numero de votaciones.\nSe necesita una nueva votacion!"
}
}
@@ -0,0 +1,87 @@
"Phrases"
{
"Vote Nextmap"
{
"fr" "Voter pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Voter pour la prochaine map est lancer."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminer. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolonger. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez a nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quels maps va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Voter pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et ne pas cliquez sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayer dans {1}s."
}
}
@@ -0,0 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"fr" "Votez pour la prochaine map!"
}
"Nextmap Voting Started"
{
"fr" "Le vote pour la prochaine map est lancé."
}
"Nextmap Voting Finished"
{
"fr" "Le VoteMap est terminé. La prochaine map sera {1}. (Reçu {2}%% sur {3} votes)"
}
"Current Map Extended"
{
"fr" "La map actuelle a été prolongée. (Reçu {1}%% sur {2} votes)"
}
"Extend Map"
{
"fr" "Prolonger la map"
}
"Dont Change"
{
"fr" "Ne pas changer"
}
"Current Map Stays"
{
"fr" "La map continue! Le vote a tranché! (Reçu {1}%% sur {2} votes)"
}
"Changed Next Map"
{
"fr" "La map suivante sera \"{1}\"."
}
"Runoff Vote Nextmap"
{
"fr" "Votez à nouveau pour la prochaine Map!"
}
"Number Of Votes"
{
"fr" "Nombres de votes"
}
"Custom"
{
"fr" "{1} (Custom)"
}
"Revote Is Needed"
{
"fr" "Aucune map n'a reçu plus de {1}%% du vote.\nAlors, quelle map va gagner? Un nouveau vote va être lancé!"
}
"Revote Warning"
{
"fr" "Un nouveau vote commence dans: {1}s"
}
"Vote Warning"
{
"fr" "Attention! Le vote pour la prochaine map commence dans: {1}s"
}
"Line One"
{
"fr" "Votez pour la map que vous voulez jouer..."
}
"Line Two"
{
"fr" "...et n'appuyez pas sur une touche comme un con ;-)"
}
"Cannot Start Vote"
{
"fr" "Vote déjà en cours. Reassayez dans {1}s."
}
"Tie Vote"
{
"fr" "{1} maps ont eu un même nombre de voix.\nUn nouveau vote est nécessaire!"
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"hu" "Mi legyen a következő pálya?"
}
"Nextmap Voting Started"
{
"hu" "Palyavalaszto szavazas elindult!"
}
"Nextmap Voting Finished"
{
"hu" "A szavazás lezárult. A következő pálya a {1} lesz"
}
"Current Map Extended"
{
"hu" "Az aktualis palya meghosszabitva."
}
"Extend Map"
{
"hu" "Palya meghosszabitasa"
}
"Dont Change"
{
"hu" "Ne valtsunk!"
}
"Current Map Stays"
{
"hu" "Jelenlegi palya folytatodik."
}
"Changed Next Map"
{
"hu" "\"{1}\" lesz a kovetkezo palya"
}
}
@@ -0,0 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"it" "Vota per la prossima mappa!"
}
"Nextmap Voting Started"
{
"it" "Le votazione per scegliere la prossima mappa sono iniziate."
}
"Nextmap Voting Finished"
{
"it" "Le votazioni sono terminate. La prossima mappa sarà {1}. (Con {2}%% su {3} votes)"
}
"Current Map Extended"
{
"it" "La mappa attuale è stata estesa. (Con {1}%% su {2} votes)"
}
"Extend Map"
{
"it" "Estendi la mappa corrente"
}
"Dont Change"
{
"it" "Non cambiare"
}
"Current Map Stays"
{
"it" "La mappa continua! Il voto ha parlato! (Con {1}%% su {2} votes)"
}
"Changed Next Map"
{
"it" "La mappa successiva sarà \"{1}\"."
}
"Runoff Vote Nextmap"
{
"it" "Vota nuovamente per scegliere la prossima mappa!"
}
"Number Of Votes"
{
"it" "Numero di voti"
}
"Custom"
{
"it" "{1} (Custom)"
}
"Revote Is Needed"
{
"it" "Nessuna mappa ha ricevuto più del {1}%% di voti.\nAllora, quale mappa vincerà? Si inizia un' altra votazione!"
}
"Revote Warning"
{
"it" "Una nuova votazione inizierà tra: {1}s"
}
"Vote Warning"
{
"it" "Attenzione! Le votazione per la prossima mappa cominceranno tra: {1}s"
}
"Line One"
{
"it" "Vota la mappa chevorresti giocare..."
}
"Line Two"
{
"it" "...e non cliccare i tasti sconsideratamente :D"
}
"Cannot Start Vote"
{
"it" "Il voto è in corso. Riprova tra {1}s."
}
"Tie Vote"
{
"it" "Le mappe hanno raggiunto il pareggio dei voti.\nBisogna nuovamente votare!"
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"jp" "次のマップを投票してください!"
}
"Nextmap Voting Started"
{
"jp" "次のマップ投票をスタートしました。"
}
"Nextmap Voting Finished"
{
"jp" "マップ投票が完了しました。次はマップは{1}です。({3}中{2}%%)"
}
"Current Map Extended"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Extend Map"
{
"jp" "現在のマップを延長"
}
"Dont Change"
{
"jp" "変更しない"
}
"Current Map Stays"
{
"jp" "現在のマップを延長します。({3}中{2}%%)"
}
"Changed Next Map"
{
"jp" "次のマップを\"{1}\"に変更しました。"
}
}
@@ -0,0 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 투표!"
}
"Nextmap Voting Started"
{
"ko" "다음 맵을 결정하기 위한 투표가 시작되었습니다."
}
"Nextmap Voting Finished"
{
"ko" "맵 투표가 끝났습니다. 다음 맵은 {1} 이 될 것입니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Current Map Extended"
{
"ko" "현재 맵을 더하기로 결정했습니다. (전체 인원 {2}명 중 {1}%%의 표를 받았습니다.)"
}
"Extend Map"
{
"ko" "지금 맵을 더 하자"
}
"Dont Change"
{
"ko" "바꾸지 말자"
}
"Current Map Stays"
{
"ko" "현재 맵을 계속 합니다!(전체 인원 {2} 명의 {1}%% 의 표를 받았습니다)"
}
"Changed Next Map"
{
"ko" "다음 맵을 \"{1}\" 로 바꾸었습니다."
}
"Runoff Vote Nextmap"
{
"ko" "다음 맵을 결정하기 위한 재투표!"
}
"Number Of Votes"
{
"ko" "투표수"
}
"Custom"
{
"ko" "{1} (커스텀 맵)"
}
"Revote Is Needed"
{
"ko" "{1}%% 이상 투표를 받은 맵이 없습니다.\n다음 맵을 결정하기 위해 재투표를 합니다!"
}
"Revote Warning"
{
"ko" "재투표까지: {1}초"
}
"Vote Warning"
{
"ko" "알립니다! 다음 맵을 결정하는 투표까지: {1}초"
}
"Line One"
{
"ko" "원하는 맵을 선택하세요..."
}
"Line Two"
{
"ko" "...그리고 아무거나 막 찍지 말고요 -_-"
}
"Cannot Start Vote"
{
"ko" "투표가 진행 중에 있습니다. {1}초 후 다시 시도합니다."
}
"Tie Vote"
{
"ko" "{1}개 맵이 같은 투표수를 얻었습니다.\n재투표를 합니다!"
}
"Custom Marked"
{
"ko" "*{1}"
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"lv" "Balso par nākamo karti!"
}
"Nextmap Voting Started"
{
"lv" "Balsošana par nākamo karti ir sākusies."
}
"Nextmap Voting Finished"
{
"lv" "Balsošana par karti ir beigusies. Nākamā karte būs {1}. (Saņēma {2}%% no {3} balsīm) "
}
"Current Map Extended"
{
"lv" "Patreizējās kartes laiks ir pagarināts. (Saņēma {1}%% no {2} balsīm) "
}
"Extend Map"
{
"lv" "Pagarināt laiku patreizējā kartē"
}
"Dont Change"
{
"lv" "Nemainīt"
}
"Current Map Stays"
{
"lv" "Patreizējā karte turpinās! Aptauja ir beigusies! (Saņēma {1}%% no {2} balsīm)"
}
"Changed Next Map"
{
"lv" "Nomainīja nākamo karti uz \"{1}\"."
}
}
@@ -0,0 +1,109 @@
"Phrases"
{
"Vote Nextmap"
{
"en" "Vote for the next map!"
}
"Nextmap Voting Started"
{
"en" "Voting for next map has started."
}
"Nextmap Voting Finished"
{
"#format" "{1:s},{2:i},{3:i}"
"en" "Map voting has finished. The next map will be {1}. (Received {2}%% of {3} votes)"
}
"Current Map Extended"
{
"#format" "{1:i},{2:i}"
"en" "The current map has been extended. (Received {1}%% of {2} votes)"
}
"Extend Map"
{
"en" "Extend Current Map"
}
"Dont Change"
{
"en" "Don't Change"
}
"Current Map Stays"
{
"#format" "{1:i},{2:i}"
"en" "Current map continues! The Vote has spoken! (Received {1}%% of {2} votes)"
}
"Changed Next Map"
{
"#format" "{1:s}"
"en" "Changed nextmap to \"{1}\"."
}
"Runoff Vote Nextmap"
{
"en" "Runoff Vote for the next map!"
}
"Number Of Votes"
{
"en" "Number of votes"
}
"Custom"
{
"#format" "{1:s}"
"en" "{1} (Custom)"
}
"Revote Is Needed"
{
"#format" "{1:i}"
"en" "No map has received more than {1}%% of the vote.\nSo, which map will win? A revote is needed!"
}
"Revote Warning"
{
"#format" "{1:i}"
"en" "Runoff vote will start in: {1}s"
}
"Vote Warning"
{
"#format" "{1:i}"
"en" "Warning! Voting for the next map will begin in: {1}s"
}
"Line One"
{
"en" "Consider which map you want to play..."
}
"Line Two"
{
"en" "...and don't hit buttons thoughtlessly ;-)"
}
"Cannot Start Vote"
{
"#format" "{1:i}"
"en" "Vote already in progress. Retrying in {1}s."
}
"Tie Vote"
{
"#format" "{1:i}"
"en" "The top {1} maps had the same number of votes.\nA revote is needed!"
}
"Custom Marked"
{
"#format" "{1:s}"
"en" "*{1}"
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"nl" "Stem voor de volgende map!"
}
"Nextmap Voting Started"
{
"nl" "Stemmen voor de volgende map is gestart."
}
"Nextmap Voting Finished"
{
"nl" "Map stemmen gestopt. De volgende map wordt {1}."
}
"Current Map Extended"
{
"nl" "De huidige map is verlengd."
}
"Extend Map"
{
"nl" "Verleng huidige map"
}
"Dont Change"
{
"nl" "Niet veranderen"
}
"Current Map Stays"
{
"nl" "Huidige map gaat verder! De Stem heeft gesproken! (Ontvangen {1}%% van de {2} stemmen)"
}
"Changed Next Map"
{
"nl" "Volgende map verandert naar \"{1}\"."
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"no" "Stem for det neste kartet!"
}
"Nextmap Voting Started"
{
"no" "Avstemning for det neste kartet har startet."
}
"Nextmap Voting Finished"
{
"no" "Kart-avstemningen er avsluttet. Det neste kartet vil være {1}. (Mottok {2}%% av {3} stemmer)."
}
"Current Map Extended"
{
"no" "Gjeldende kart videreføres! (Mottok {1}%% av {2} stemmer)."
}
"Extend Map"
{
"no" "Forleng gjeldende kart."
}
"Dont Change"
{
"no" "Ikke bytt!"
}
"Current Map Stays"
{
"no" "Gjeldende kart videreføres! Avstemningen har talt! (Mottok {1}%% av {2} stemmer)."
}
"Changed Next Map"
{
"no" "Byttet neste kart til \"{1}\""
}
}
@@ -0,0 +1,92 @@
"Phrases"
{
"Vote Nextmap"
{
"pl" "Głosuj na następną mapę!"
}
"Nextmap Voting Started"
{
"pl" "Rozpoczęto głosowanie na następną mapę."
}
"Nextmap Voting Finished"
{
"pl" "Głosowanie na mapę zostało zakończone. Następną mapą będzie {1}. (Otrzymała {2} procent z {3} głosów) "
}
"Current Map Extended"
{
"pl" "Aktualna mapa została przedłużona. (Otrzymała {1} procent z {2} głosów)"
}
"Extend Map"
{
"pl" "Przedłuż bieżącą mapę"
}
"Dont Change"
{
"pl" "Nie Zmieniaj"
}
"Current Map Stays"
{
"pl" "Aktualna mapa będzie kontynuowana! (Otrzymano {1} procent z {2} głosów)"
}
"Changed Next Map"
{
"pl" "Zmieniono następną mapę na: \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pl" "Wybierz ponownie!"
}
"Number Of Votes"
{
"pl" "Otrzymane głosy"
}
"Custom"
{
"pl" "{1} (Niestandardowa)"
}
"Revote Is Needed"
{
"pl" "Żadna mapa nie otrzymała przynajmniej {1}%% głosów.\nWięc która mapa jest zwycięzcą? Trzeba zagłosować ponownie!"
}
"Revote Warning"
{
"pl" "Ponowne głosowanie rozpocznie się za: {1}s\nTym razem się już zdecydujcie ;-)"
}
"Vote Warning"
{
"pl" "UWAGA!!! Głosowanie na następną mapę rozpocznie się za: {1}s"
}
"Line One"
{
"pl" "Zastanów się na której mapie chcesz grać..."
}
"Line Two"
{
"pl" "...wpisując !revote możesz zmienić swój głos."
}
"Cannot Start Vote"
{
"pl" "Głosowanie w toku. Ponawiam za {1}s."
}
"Tie Vote"
{
"pl" "{1} najlepsze mapy otrzymały tę samą ilość głosów.\nPotrzeba ponownego głosowania!"
}
}
@@ -0,0 +1,98 @@
"Phrases"
{
"Vote Nextmap"
{
"pt" "Vote para o próximo mapa!"
}
"Nextmap Voting Started"
{
"pt" "Votação para o próximo mapa começou."
}
"Nextmap Voting Finished"
{
"pt" "A votação para o próximo mapa terminou. O próximo mapa será {1}. (Recebidos {2}%% de {3} votos)"
}
"Current Map Extended"
{
"pt" "A mapa atual foi estendido. (Recebidos {1}%% de {2} votos)"
}
"Extend Map"
{
"pt" "Estender tempo do mapa atual"
}
"Dont Change"
{
"pt" "Não Mudar"
}
"Current Map Stays"
{
"pt" "O mapa atual continua! O Voto foi dado! (Recebidos {1}%% de {2} votos)"
}
"Changed Next Map"
{
"pt" "Mudado o próximo mapa para \"{1}\"."
}
"Runoff Vote Nextmap"
{
"pt" "Segundo turno de votos para o próximo mapa!"
}
"Number Of Votes"
{
"pt" "Número de votos"
}
"Custom"
{
"pt" "{1} (Custom)"
}
"Revote Is Needed"
{
"pt" "Nenhum mapa recebeu mais que {1}%% de votos.\nEntão, qual mapa ganhará? Precisa de uma nova votação!"
}
"Revote Warning"
{
"pt" "Segundo turno começa em: {1}s"
}
"Vote Warning"
{
"pt" "Atenção! Votação para o próximo mapa começará em: {1}s"
}
"Line One"
{
"pt" "Considere que mapa você quer jogar..."
}
"Line Two"
{
"pt" "...e não aperte os botões sem pensar ;-)"
}
"Cannot Start Vote"
{
"pt" "Votação em progresso. Tentando novamente em {1}s."
}
"Tie Vote"
{
"pt" "Os {1} mapas tiveram o mesmo número de votos.\nUma nova votação é necessária!"
}
"Custom Marked"
{
"pt" "*{1}"
}
}
@@ -0,0 +1 @@
Missing "Cannot Start Vote" and "Tie Vote"
@@ -0,0 +1,83 @@
"Phrases"
{
"Vote Nextmap"
{
"ru" "Голосование за следующую карту."
}
"Runoff Vote Nextmap"
{
"ru" "Повторное голосование за карту."
}
"Nextmap Voting Started"
{
"ru" "Голосование за следующую карту запущено."
}
"Nextmap Voting Finished"
{
"ru" "Голосование за карту завершено. Следующей картой будет: {1}. (Получено {2}%% из {3} голосов(а))"
}
"Current Map Extended"
{
"ru" "Текущая карта была продлена. (Получено {1}%% из {2} голосов(а))"
}
"Extend Map"
{
"ru" "Продлить текущую карту."
}
"Dont Change"
{
"ru" "Не менять карту."
}
"Current Map Stays"
{
"ru" "Текущая карта не сменится! (Получено {1}%% из {2} голосов(а))"
}
"Changed Next Map"
{
"ru" "Следующая карта изменена на \"{1}\"."
}
"Number Of Votes"
{
"ru" "Количество голосов"
}
"Custom"
{
"ru" "{1} (Случайная)"
}
"Revote Is Needed"
{
"ru" "Ни одна карта не получила более, чем {1}%% голосов(а).\nИтак, какая карта будет следующей? Приготовьтесь к повторному голосованию!"
}
"Revote Warning"
{
"ru" "Повторное голосование начнётся через: {1}s"
}
"Vote Warning"
{
"ru" "Внимание! Голосование за следующую карту начнётся через: {1}s"
}
"Line One"
{
"ru" "Выбери, какая карта будет следующей..."
}
"Line Two"
{
"ru" "...и не клацай кнопки,не подумав ;-)"
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"sv" "Rösta för nästa bana!"
}
"Nextmap Voting Started"
{
"sv" "Röstning om nästa bana har börjat."
}
"Nextmap Voting Finished"
{
"sv" "Röstningen om banan har avslutats. Nästa bana kommer att bli {1}. (Fick {2}%% av {3} röster) "
}
"Current Map Extended"
{
"sv" "Den nuvarande banan har förlängts. (Fick {1}%% av {2} röster) "
}
"Extend Map"
{
"sv" "Förläng nuvarande bana"
}
"Dont Change"
{
"sv" "Byt inte"
}
"Current Map Stays"
{
"sv" "Nuvarande banan fortsätter! Röstningen har talat! (Fick {1}%% av {2} röster) "
}
"Changed Next Map"
{
"sv" "Bytta nästa bana till \"{1}\". "
}
}
@@ -0,0 +1,2 @@
Missing "Runoff Vote Nextmap", "Number Of Votes", "Custom", "Revote Is Needed", "Revote Warning", "Vote Warning",
"Line One", "Line Two", "Cannot Start Vote", and "Tie Vote"
@@ -0,0 +1,43 @@
"Phrases"
{
"Vote Nextmap"
{
"tr" "Sonraki harita için oy ver!"
}
"Nextmap Voting Started"
{
"tr" "Sonraki harita için oylama başladı."
}
"Nextmap Voting Finished"
{
"tr" "Harita oylaması sona erdi. Sıradaki harita {1} olacak. ({3} oyun %%{2}'i alındı) "
}
"Current Map Extended"
{
"tr" "Geçerli harita uzatıldı. ({2} oyun %%{1}'i alındı) "
}
"Extend Map"
{
"tr" "Geçerli Haritayı Uzat"
}
"Dont Change"
{
"tr" "Değiştirme"
}
"Current Map Stays"
{
"tr" "Geçerli harita devam ediyor! Oylama konuştu! ({2} oyun %%{1}'i alındı) "
}
"Changed Next Map"
{
"tr" "Sıradaki harita \"{1}\" olarak değiştirildi."
}
}