PHP Code:
#include <amxmodx>
#pragma semicolon 1
const g_iSelectMaps = 5; // max 8
const g_iVoteTime = 15;
const g_iNominateMax = 3;
const g_iNominatePlayerMax = 2;
const g_iMapsBlock = 40;
enum (+=100) {
TASK_CHECKTIME = 100,
TASK_SHOWTIMER,
TASK_TIMER,
TASK_VOTEMENU
};
enum _:MAP_INFO {
m_MapName[32],
m_MinPlayers,
m_MaxPlayers,
m_BlockCount
};
enum _:VOTEMENU_INFO {
v_MapName[32],
v_MapIndex,
v_Votes
};
enum _:NOMINATEDMAP_INFO {
n_MapName[32],
n_Player,
n_MapIndex
};
enum _:BLOCKEDMAP_INFO {
b_MapName[32],
b_Count
};
enum _:CVARS {
TIMELIMIT,
CHATTIME,
NEXTMAP,
ROUNDTIME
};
new Array:g_aMaps,
g_pCvars[CVARS],
g_szCurrentMap[32],
bool:g_bVoteStarted,
bool:g_bVoteFinished,
g_eMenuItems[g_iSelectMaps + 1][VOTEMENU_INFO],
g_iMenuItemsCount,
g_iTotalVotes,
g_iTimer,
g_bPlayerVoted[33],
g_iExtendedMax,
bool:g_bExtendMap,
g_bStartVote,
Float:g_fOldTimeLimit,
bool:g_bRockVoted[33],
g_iRockVotes,
bool:g_bRockVote,
Array:g_aNominatedMaps,
g_iNominatedMaps[33],
g_iLastDenominate[33],
Array:g_aMapPrefixes,
g_iMapPrefixesNum,
g_iBlockedSize,
g_iSyncShowMenu;
public plugin_init() {
register_plugin("Map Manager", AMXX_VERSION_STR, "Mistrick");
g_pCvars[TIMELIMIT] = get_cvar_pointer("mp_timelimit");
g_pCvars[ROUNDTIME] = get_cvar_pointer("mp_roundtime");
g_pCvars[CHATTIME] = get_cvar_pointer("mp_chattime");
g_pCvars[NEXTMAP] = register_cvar("amx_nextmap", "", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY);
register_event("HLTV", "OnRoundStartPre", "a", "1=0", "2=0");
register_event("30", "Event_Intermisson", "a");
register_concmd("mm_startvote", "Command_StartVote", ADMIN_MAP);
register_concmd("mm_stopvote", "Command_StopVote", ADMIN_MAP);
register_clcmd("say timeleft", "Command_Timeleft");
register_clcmd("say thetime", "Command_TheTime");
register_clcmd("votemap", "Command_Votemap");
register_clcmd("say nextmap", "Command_Nextmap");
register_clcmd("say currentmap", "Command_CurrentMap");
register_clcmd("say rtv", "Command_RockTheVote");
register_clcmd("say /rtv", "Command_RockTheVote");
register_clcmd("say", "Command_Say");
register_clcmd("say_team", "Command_Say");
register_clcmd("say /mapy", "Command_MapsList");
g_iSyncShowMenu = CreateHudSyncObj();
register_menucmd(register_menuid("VoteMenu"), 1023, "VoteMenu_Handler");
set_task(120.0, "Task_CheckTime", TASK_CHECKTIME, .flags = "d");
}
public Command_Votemap(id) return 1;
public Command_StartVote(id, iBitFlags) {
if(~get_user_flags(id) & iBitFlags || g_bVoteStarted) return;
StartVote(id);
showActivity(id, "MapManager", "rozpoczal glosowanie na mape.");
}
public Command_StopVote(id, iBitFlags) {
if(~get_user_flags(id) & iBitFlags || !g_bVoteStarted) return;
g_bVoteStarted = false;
g_bRockVote = false;
g_iRockVotes = 0;
arrayset(g_bRockVoted, false, 33);
remove_task(TASK_VOTEMENU);
remove_task(TASK_SHOWTIMER);
remove_task(TASK_TIMER);
static szPlayers[32], iNum, i;
get_players(szPlayers, iNum, "ch");
for(--iNum; iNum >= 0; iNum--) {
i = szPlayers[iNum];
remove_task(TASK_VOTEMENU + i);
show_menu(i, 0, "", 0);
}
showActivity(id, "MapManager", "anulowal glosowanie na mape.");
}
public Command_Timeleft(id) {
if(get_pcvar_num(g_pCvars[TIMELIMIT])) {
static szTime[6], szMin[7], iTimeLeft;
iTimeLeft = get_timeleft();
format_time(szTime, 5, "%M:%S", iTimeLeft);
GetEnding(iTimeLeft, "minut", "minuta", "minuty", szMin);
ColorChat(id, "MapManager", "Do konca mapy pozostalo:^3 %s^1 %s.", szTime, szMin);
}
else ColorChat(id, "MapManager", "Po tej rundzie nastapi zmiana mapy.");
return 1;
}
public Command_TheTime(id) {
static szTime[22];
format_time(szTime, 21, "%d.%m.%Y - %H:%M:%S");
ColorChat(id, "MapManager", "Aktualny czas:^3 %s^1.", szTime);
}
public Command_Nextmap(id) {
if(g_bVoteFinished) {
static szMap[32];
get_pcvar_string(g_pCvars[NEXTMAP], szMap, 31);
ColorChat(id, "MapManager", "Nastepna mapa:^3 %s^1.", szMap);
}
else ColorChat(id, "MapManager", "Nastepna mapa nie zostala jeszcze wybrana.");
return 1;
}
public Command_CurrentMap(id) {
ColorChat(id, "MapManager", "Obecna mapa:^3 %s", g_szCurrentMap);
return 1;
}
public Command_RockTheVote(id) {
if(g_bVoteFinished || g_bVoteStarted || g_bStartVote) return 1;
static iTime;
if((iTime = 300 - (floatround(get_pcvar_float(g_pCvars[TIMELIMIT]) * 60.0) - get_timeleft())) > 0) {
static szTime[6], szMin[7];
format_time(szTime, 5, "%M:%S", iTime);
GetEnding(iTime, "minut", "minuta", "minuty", szMin);
ColorChat(id, "MapManager", "Nie mozna zaglosowac na zmiane mapy. Zaczekaj:^3 %s^1 %s.", szTime, szMin);
return 1;
}
if(!g_bRockVoted[id]) g_iRockVotes++;
static iVotes;
iVotes = floatround(GetPlayers() * 0.6, floatround_ceil) - g_iRockVotes;
if(iVotes <= 0) {
g_bRockVoted[id] = true;
StartVote(0);
ColorChat(0, "MapManager", "Rozpoczeto przedwczesne glosowanie na mape.");
return 1;
}
if(!g_bRockVoted[id]) {
g_bRockVoted[id] = true;
static szVote[7], szName[32];
GetEnding(iVotes, "glosow", "glos", "glosy", szVote);
get_user_name(id, szName, 31);
ColorChat(0, "MapManager", "^3%s^1 zaglosowal na zmiane mapy. Napisz^4 rtv^1 aby zaglosowac. Potrzebne jeszcze:^3 %i^1 %s.", szName, iVotes, szVote);
}
else {
static szVote[7];
GetEnding(iVotes, "glosow", "glos", "glosy", szVote);
ColorChat(id, "MapManager", "Juz zaglosowales. Potrzebne jeszcze:^3 %i^1 %s.", iVotes, szVote);
}
return 1;
}
public Command_Say(id) {
if(g_bVoteStarted || g_bVoteFinished) return;
static szText[32], iMapID;
read_args(szText, 31);
remove_quotes(szText);
trim(szText);
strtolower(szText);
if(string_with_space(szText)) return;
iMapID = is_map_in_array(szText);
if(iMapID) NominateMap(id, szText, iMapID - 1);
else if(strlen(szText) >= 4) {
static i, szFormat[32], szPrefix[32], iArraySize, Array:aNominateList;
i = 0;
aNominateList = ArrayCreate();
for(; i < g_iMapPrefixesNum; i++) {
ArrayGetString(g_aMapPrefixes, i, szPrefix, 31);
//add(szPrefix, 31, szText);
formatex(szFormat, 31, "%s%s", szPrefix, szText);
iMapID = 0;
while((iMapID = find_similar_map(iMapID, szFormat))) {
//while((iMapID = find_similar_map(iMapID, szPrefix))) {
ArrayPushCell(aNominateList, iMapID - 1);
iArraySize++;
}
}
if(iArraySize == 1) {
iMapID = ArrayGetCell(aNominateList, 0);
static eMapInfo[MAP_INFO];
ArrayGetArray(g_aMaps, iMapID, eMapInfo);
copy(szFormat, 31, eMapInfo[m_MapName]);
NominateMap(id, szFormat, iMapID);
}
else if(iArraySize > 1) Show_NominationList(id, aNominateList, iArraySize);
ArrayDestroy(aNominateList);
}
}
public Show_NominationList(id, Array:aArray, iSize) {
static hMenu, eMapInfo[MAP_INFO], iMapID, iNominateID, i, szNum[8];
hMenu = menu_create("Lista map do nominowania:", "NominationList_Handler");
i = 0;
for(; i < iSize; i++) {
iMapID = ArrayGetCell(aArray, i);
ArrayGetArray(g_aMaps, iMapID, eMapInfo);
num_to_str(iMapID, szNum, 7);
iNominateID = is_map_nominated(iMapID);
if(eMapInfo[m_BlockCount]) menu_additem(hMenu, fmt("%s [\r%i\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]), szNum, (1<<31));
else if(iNominateID) {
static eNomInfo[NOMINATEDMAP_INFO];
ArrayGetArray(g_aNominatedMaps, iNominateID - 1, eNomInfo);
if(id == eNomInfo[n_Player]) menu_additem(hMenu, fmt("%s [\y*\w]", eMapInfo[m_MapName]), szNum);
else menu_additem(hMenu, fmt("%s [\y*\d]", eMapInfo[m_MapName]), szNum, (1<<31));
}
else menu_additem(hMenu, eMapInfo[m_MapName], szNum);
}
menu_setprop(hMenu, MPROP_BACKNAME, "Poprzednia strona");
menu_setprop(hMenu, MPROP_NEXTNAME, "Nastepna strona");
menu_setprop(hMenu, MPROP_EXITNAME, "Wyjdz");
return menu_display(id, hMenu);
}
public NominationList_Handler(id, hMenu, iItem) {
if(iItem == MENU_EXIT) {
menu_destroy(hMenu);
return;
}
static szData[8], szName[32], iAccess, iCallback, iMapID, is_map_nominated;
menu_item_getinfo(hMenu, iItem, iAccess, szData, 7, szName, 31, iCallback);
iMapID = str_to_num(szData);
trim_bracket(szName);
is_map_nominated = NominateMap(id, szName, iMapID);
if(is_map_nominated == 2) {
if(is_map_nominated == 1) menu_item_setname(hMenu, iItem, fmt("%s [\y*\w]", szName));
else if(is_map_nominated == 2) menu_item_setname(hMenu, iItem, szName);
menu_display(id, hMenu);
}
else menu_destroy(hMenu);
}
NominateMap(id, szMap[32], iMapID) {
static eMapInfo[MAP_INFO];
ArrayGetArray(g_aMaps, iMapID, eMapInfo);
if(eMapInfo[m_BlockCount]) {
ColorChat(id, "MapManager", "Ta mapa nie jest dostepna do nominowania.");
return 0;
}
static eNomInfo[NOMINATEDMAP_INFO], szName[32], iNominateID;
get_user_name(id, szName, 31);
if((iNominateID = is_map_nominated(iMapID))) {
ArrayGetArray(g_aNominatedMaps, iNominateID - 1, eNomInfo);
if(id == eNomInfo[n_Player]) {
static iSysTime;
iSysTime = get_systime();
if(g_iLastDenominate[id] + 3 <= iSysTime) {
g_iLastDenominate[id] = iSysTime;
g_iNominatedMaps[id]--;
ArrayDeleteItem(g_aNominatedMaps, iNominateID - 1);
ColorChat(0, "MapManager", "^3%s^1 usunal mape^3 %s^1 z nominacji.", szName, szMap);
return 2;
}
return 0;
}
ColorChat(id, "MapManager", "Ta mapa zostala juz nominowana. Napisz^4 /mapy^1 aby sprawdzic dostepne mapy.");
return 0;
}
if(g_iNominatedMaps[id]++ >= g_iNominatePlayerMax) {
ColorChat(id, "MapManager", "Nie mozesz nominowac wiecej map.");
return 0;
}
eNomInfo[n_MapName] = szMap;
eNomInfo[n_Player] = id;
eNomInfo[n_MapIndex] = iMapID;
ArrayPushArray(g_aNominatedMaps, eNomInfo);
ColorChat(0, "MapManager", "^3%s^1 nominowal mape^3 %s^1.", szName, szMap);
return 1;
}
public Command_MapsList(id) {
static hMenu, eMapInfo[MAP_INFO], iSize, i, iNominateID;
hMenu = menu_create("Lista map", "MapsListMenu_Handler");
i = 0;
iSize = ArraySize(g_aMaps);
for(; i < iSize; i++) {
ArrayGetArray(g_aMaps, i, eMapInfo);
iNominateID = is_map_nominated(i);
if(eMapInfo[m_BlockCount]) menu_additem(hMenu, fmt("%s [\r%i\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]), _, (1<<31));
else if(iNominateID) {
static eNomInfo[NOMINATEDMAP_INFO];
ArrayGetArray(g_aNominatedMaps, iNominateID - 1, eNomInfo);
if(id == eNomInfo[n_Player]) menu_additem(hMenu, fmt("%s [\y*\w]", eMapInfo[m_MapName]));
else menu_additem(hMenu, fmt("%s [\y*\d]", eMapInfo[m_MapName]), _, (1<<31));
}
else menu_additem(hMenu, eMapInfo[m_MapName]);
}
menu_setprop(hMenu, MPROP_BACKNAME, "Poprzednia strona");
menu_setprop(hMenu, MPROP_NEXTNAME, "Nastepna strona");
menu_setprop(hMenu, MPROP_EXITNAME, "Wyjdz");
return menu_display(id, hMenu);
}
public MapsListMenu_Handler(id, hMenu, iItem) {
if(iItem == MENU_EXIT) {
menu_destroy(hMenu);
return;
}
static szData[8], szName[32], iAccess, iCallback, is_map_nominated;
menu_item_getinfo(hMenu, iItem, iAccess, szData, 7, szName, 31, iCallback);
trim_bracket(szName);
is_map_nominated = NominateMap(id, szName, iItem);
if(g_iNominatedMaps[id] < g_iNominatePlayerMax) {
if(is_map_nominated == 1) menu_item_setname(hMenu, iItem, fmt("%s [\y*\w]", szName));
else if(is_map_nominated == 2) menu_item_setname(hMenu, iItem, szName);
menu_display(id, hMenu, iItem / 7);
}
else menu_destroy(hMenu);
}
public client_disconnect(id) {
if(is_user_bot(id) || is_user_hltv(id)) return;
remove_task(id + TASK_VOTEMENU);
if(g_bRockVoted[id]) {
g_bRockVoted[id] = false;
g_iRockVotes--;
}
if(g_iNominatedMaps[id]) clear_nominated_maps(id);
}
public plugin_end() {
if(g_fOldTimeLimit > 0.0) set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit);
if(g_iExtendedMax) set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) - float(g_iExtendedMax * 15));
}
public OnConfigsExecuted() {
g_aMaps = ArrayCreate(MAP_INFO);
g_aNominatedMaps = ArrayCreate(NOMINATEDMAP_INFO);
g_aMapPrefixes = ArrayCreate(32);
new szDir[128], szFile[128];
get_mapname(g_szCurrentMap, 31);
get_localinfo("amxx_datadir", szDir, 127);
formatex(szFile, 127, "%s/blockedmaps.ini", szDir);
new Array:aBlockedMaps = ArrayCreate(BLOCKEDMAP_INFO);
new eBlockedInfo[BLOCKEDMAP_INFO];
if(file_exists(szFile)) {
new szTemp[128], szBuffer[42], szMapName[32], szCount[8], iCount;
formatex(szTemp, 127, "%s/temp.ini", szDir);
new iFile = fopen(szFile, "rt");
new iTemp = fopen(szTemp, "wt");
while(!feof(iFile)) {
fgets(iFile, szBuffer, 41);
parse(szBuffer, szMapName, 31, szCount, 7);
if(!is_map_valid(szMapName) || is_map_blocked(aBlockedMaps, szMapName) || equali(szMapName, g_szCurrentMap) || (iCount = str_to_num(szCount) - 1) <= 0) continue;
if(iCount > g_iMapsBlock) {
fprintf(iTemp, "^"%s^" ^"%i^"^n", szMapName, g_iMapsBlock);
iCount = g_iMapsBlock;
}
else fprintf(iTemp, "^"%s^" ^"%i^"^n", szMapName, iCount);
copy(eBlockedInfo[b_MapName], 31, szMapName);
eBlockedInfo[b_Count] = iCount;
ArrayPushArray(aBlockedMaps, eBlockedInfo);
}
fprintf(iTemp, "^"%s^" ^"%i^"^n", g_szCurrentMap, g_iMapsBlock);
fclose(iFile);
fclose(iTemp);
delete_file(szFile);
rename_file(szTemp, szFile, 1);
}
else {
new iFile = fopen(szFile, "wt");
if(iFile) fprintf(iFile, "^"%s^" ^"%i^"^n", g_szCurrentMap, g_iMapsBlock);
fclose(iFile);
}
copy(szFile[get_localinfo("amxx_configsdir", szFile, 127)], 127, "/maps.ini");
if(!file_exists(szFile)) set_fail_state("Brak pliku z mapami.");
new f = fopen(szFile, "rt");
if(f) {
new eMapInfo[MAP_INFO], szText[48], szMap[32], szMin[3], szMax[3];
while(!feof(f)) {
fgets(f, szText, 47);
parse(szText, szMap, 31, szMin, 2, szMax, 2);
if(!szMap[0] || szMap[0] == ';' || !valid_map(szMap) || is_map_in_array(szMap) || equali(szMap, g_szCurrentMap)) continue;
new iBlockedID;
if((iBlockedID = is_map_blocked(aBlockedMaps, szMap))) {
ArrayGetArray(aBlockedMaps, iBlockedID - 1, eBlockedInfo);
eMapInfo[m_BlockCount] = eBlockedInfo[b_Count];
}
else eMapInfo[m_BlockCount] = 0;
new szPrefix[32];
if(get_map_prefix(szMap, szPrefix, 31) && !is_prefix_in_array(szPrefix)) {
ArrayPushString(g_aMapPrefixes, szPrefix);
g_iMapPrefixesNum++;
}
eMapInfo[m_MapName] = szMap;
eMapInfo[m_MinPlayers] = str_to_num(szMin);
eMapInfo[m_MaxPlayers] = str_to_num(szMax) == 0 ? MaxClients : str_to_num(szMax);
ArrayPushArray(g_aMaps, eMapInfo);
szMin = "";
szMax = "";
}
fclose(f);
new iSize = ArraySize(g_aMaps);
if(!iSize) set_fail_state("Nic nie zaladowano z pliku.");
g_iBlockedSize = ArraySize(aBlockedMaps);
if(iSize - g_iBlockedSize < g_iSelectMaps) log_amx("LoadMaps: warning to little maps without block [%i]", iSize - g_iBlockedSize);
if(iSize - g_iBlockedSize < 1) {
log_amx("LoadMaps: wyczyszczono zablokowane mapy");
clear_blocked_maps();
}
ArrayDestroy(aBlockedMaps);
ArrayGetArray(g_aMaps, random_num(0, iSize - 1), eMapInfo);
set_pcvar_string(g_pCvars[NEXTMAP], eMapInfo[m_MapName]);
}
}
public Event_Intermisson() {
static Float:fChatTime;
fChatTime = get_pcvar_float(g_pCvars[CHATTIME]);
set_pcvar_float(g_pCvars[CHATTIME], fChatTime + 2.0);
set_task(fChatTime, "DelayedChange");
}
public DelayedChange() {
static szNextMap[32];
get_pcvar_string(g_pCvars[NEXTMAP], szNextMap, 31);
set_pcvar_float(g_pCvars[CHATTIME], get_pcvar_float(g_pCvars[CHATTIME]) - 2.0);
engine_changelevel(szNextMap);
}
public OnRoundStartPre() {
if(g_bStartVote) StartVote(0);
if(g_bVoteFinished || g_bRockVote) {
emessage_begin(MSG_ALL, SVC_INTERMISSION);
emessage_end();
static szMapName[32];
get_pcvar_string(g_pCvars[NEXTMAP], szMapName, 31);
ColorChat(0, "MapManager", "Nastepna mapa:^3 %s", szMapName);
}
}
public Task_CheckTime() {
if(g_bVoteStarted || g_bVoteFinished) return;
StartVote(0);
}
public StartVote(id) {
if(g_bVoteStarted) return 0;
static i;
i = 0;
g_bVoteStarted = true;
g_bStartVote = false;
g_iTotalVotes = 0;
for(; i < sizeof g_eMenuItems; i++) {
g_eMenuItems[i][v_MapName] = "";
g_eMenuItems[i][v_MapIndex] = -1;
g_eMenuItems[i][v_Votes] = 0;
}
arrayset(g_bPlayerVoted, false, 33);
g_bExtendMap = bool:(get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 && !g_bRockVote && g_iExtendedMax < 3);
static Array:aMaps, eMenuInfo[VOTEMENU_INFO], eMapInfo[MAP_INFO], iGlobalSize, iCurrentSize, iPlayersNum;
iCurrentSize = i = 0;
iPlayersNum = GetPlayers();
aMaps = ArrayCreate(VOTEMENU_INFO);
iGlobalSize = ArraySize(g_aMaps);
for(; i < iGlobalSize; i++) {
ArrayGetArray(g_aMaps, i, eMapInfo);
if(eMapInfo[m_MinPlayers] <= iPlayersNum <= eMapInfo[m_MaxPlayers] && !eMapInfo[m_BlockCount]) {
copy(eMenuInfo[v_MapName], 31, eMapInfo[m_MapName]);
eMenuInfo[v_MapIndex] = i;
iCurrentSize++;
ArrayPushArray(aMaps, eMenuInfo);
}
}
static iItem, iMaxItems, eNomInfo[NOMINATEDMAP_INFO], iNomSize, iRandomMap;
iItem = i = 0;
iMaxItems = min(min(g_iSelectMaps, iGlobalSize - g_iBlockedSize), 8);
for(; i < ArraySize(g_aNominatedMaps); i++) {
ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
ArrayGetArray(g_aMaps, eNomInfo[n_MapIndex], eMapInfo);
if(iPlayersNum > eMapInfo[m_MaxPlayers] || iPlayersNum < eMapInfo[m_MinPlayers]) ArrayDeleteItem(g_aNominatedMaps, i--);
}
iRandomMap = 0;
iNomSize = ArraySize(g_aNominatedMaps);
g_iMenuItemsCount = min(min(iNomSize, g_iNominateMax), iMaxItems);
for(; iItem < g_iMenuItemsCount; iItem++) {
iRandomMap = random_num(0, ArraySize(g_aNominatedMaps) - 1);
ArrayGetArray(g_aNominatedMaps, iRandomMap, eNomInfo);
copy(g_eMenuItems[iItem][v_MapName], 31, eNomInfo[n_MapName]);
g_eMenuItems[iItem][v_MapIndex] = eNomInfo[n_MapIndex];
g_iNominatedMaps[eNomInfo[n_Player]]--;
ArrayDeleteItem(g_aNominatedMaps, iRandomMap);
static iPriorityID;
if((iPriorityID = is_map_in_priority(aMaps, eNomInfo[n_MapIndex]))) ArrayDeleteItem(aMaps, iPriorityID - 1);
}
if(iCurrentSize && iItem < iMaxItems) {
g_iMenuItemsCount = max(min(iCurrentSize, iMaxItems), iItem);
iRandomMap = 0;
for(; iItem < g_iMenuItemsCount; iItem++) {
iRandomMap = random_num(0, ArraySize(aMaps) - 1);
ArrayGetArray(aMaps, iRandomMap, eMenuInfo);
copy(g_eMenuItems[iItem][v_MapName], 31, eMenuInfo[v_MapName]);
g_eMenuItems[iItem][v_MapIndex] = eMenuInfo[v_MapIndex];
ArrayDeleteItem(aMaps, iRandomMap);
}
}
if(iItem < iMaxItems) {
g_iMenuItemsCount = min(iGlobalSize, iMaxItems);
iRandomMap = 0;
for(; iItem < g_iMenuItemsCount; iItem++) {
do {
iRandomMap = random_num(0, iGlobalSize - 1);
ArrayGetArray(g_aMaps, iRandomMap, eMapInfo);
}
while(is_map_in_menu(iRandomMap) || eMapInfo[m_BlockCount]);
copy(g_eMenuItems[iItem][v_MapName], 31, eMapInfo[v_MapName]);
g_eMenuItems[iItem][v_MapIndex] = iRandomMap;
}
}
ArrayDestroy(aMaps);
set_task(1.0, "ShowTimer", TASK_SHOWTIMER, _, _, "a", g_iTimer = 6);
return 0;
}
public ShowTimer() {
if(--g_iTimer) {
static szSec[8];
GetEnding(g_iTimer, "sekund", "sekunde", "sekundy", szSec);
set_hudmessage(50, 255, 50, -1.0, 0.8, 0, 0.0, 1.0, 0.0, 0.0, 4);
show_hudmessage(0, "Glosowanie na mape rozpocznie sie za: %i %s", g_iTimer, szSec);
}
else ShowVoteMenu();
}
ShowVoteMenu() {
g_iTimer = g_iVoteTime;
set_task(1.0, "Task_Timer", TASK_TIMER, .flags = "a", .repeat = g_iVoteTime);
static szPlayers[32], iNum, i;
get_players(szPlayers, iNum, "ch");
for(--iNum; iNum >= 0; iNum--) {
i = szPlayers[iNum];
VoteMenu(i + TASK_VOTEMENU);
set_task(1.0, "VoteMenu", i + TASK_VOTEMENU, _, _, "a", g_iVoteTime);
client_cmd(i, "spk Gman/Gman_Choose2");
}
}
public Task_Timer() {
if(!--g_iTimer) {
FinishVote();
show_menu(0, 0, "", 0);
remove_task(TASK_TIMER);
}
}
public VoteMenu(id) {
id -= TASK_VOTEMENU;
if(!g_iTimer) {
show_menu(id, 0, "", 0);
remove_task(id + TASK_VOTEMENU);
return;
}
static szMenu[512], iKeys, iPercent, i, iLen, szSec[8];
iLen = formatex(szMenu[iLen], 511 - iLen, "\y%s^n^n", g_bPlayerVoted[id] ? "Wynik glosowania" : "Wybierz mape");
for(i = 0; i < g_iMenuItemsCount; i++) {
iPercent = 0;
if(g_iTotalVotes) iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes);
if(!g_bPlayerVoted[id]) {
iLen += formatex(szMenu[iLen], 511 - iLen, "\r%i. \w%s \r[%i%%]^n", i + 1, g_eMenuItems[i][v_MapName], iPercent);
iKeys |= (1<<i);
}
else iLen += formatex(szMenu[iLen], 511 - iLen, "\d%s [%i%%]^n", g_eMenuItems[i][v_MapName], iPercent);
}
if(g_bExtendMap) {
iPercent = 0;
if(g_iTotalVotes) iPercent = floatround(g_eMenuItems[i][v_Votes] * 100.0 / g_iTotalVotes);
if(!g_bPlayerVoted[id]) {
iLen += formatex(szMenu[iLen], 511 - iLen, "^n\r%i. \w%s \y[przedluzenie] \r[%i%%]^n", i + 1, g_szCurrentMap, iPercent);
iKeys |= (1<<i);
}
else iLen += formatex(szMenu[iLen], 511 - iLen, "^n\d%s [%i%%] [przedluzenie]^n", g_szCurrentMap, iPercent);
}
GetEnding(g_iTimer, "sekund", "sekunde", "sekundy", szSec);
iLen += formatex(szMenu[iLen], 511 - iLen, "^n\dKoniec za \r%i \d%s", g_iTimer, szSec);
if(!iKeys) iKeys |= (1<<9);
if(g_bPlayerVoted[id]) {
while(replace(szMenu, 511, "\r", "")) {}
while(replace(szMenu, 511, "\d", "")) {}
while(replace(szMenu, 511, "\w", "")) {}
while(replace(szMenu, 511, "\y", "")) {}
set_hudmessage(102, 69, 0, 0.02, -1.0, 0, 0.0, 0.8, 0.2, 0.2);
ShowSyncHudMsg(id, g_iSyncShowMenu, "%s", szMenu);
}
else show_menu(id, iKeys, szMenu, -1, "VoteMenu");
}
public VoteMenu_Handler(id, iKey) {
if(g_bPlayerVoted[id]) {
VoteMenu(id + TASK_VOTEMENU);
return;
}
g_eMenuItems[iKey][v_Votes]++;
g_iTotalVotes++;
g_bPlayerVoted[id] = true;
static szBuffer[32];
iKey == g_iMenuItemsCount ? copy(szBuffer, 17, "przedluzenie mapy") : copy(szBuffer, 31, g_eMenuItems[iKey][v_MapName]);
ColorChat(id, "MapManager", "Wybrales^3 %s^1.", szBuffer);
VoteMenu(id + TASK_VOTEMENU);
}
FinishVote() {
g_bVoteStarted = false;
g_bVoteFinished = true;
static i, iMaxVote;
i = 1;
for(; i < g_iMenuItemsCount + 1; i++) {
switch(random_num(0, 1)) {
case 0: if(g_eMenuItems[iMaxVote][v_Votes] < g_eMenuItems[i][v_Votes]) iMaxVote = i;
case 1: if(g_eMenuItems[iMaxVote][v_Votes] <= g_eMenuItems[i][v_Votes]) iMaxVote = i;
}
}
if(!g_iTotalVotes || iMaxVote != g_iMenuItemsCount) {
if(g_iTotalVotes) ColorChat(0, "MapManager", "Glosowanie zakonczone. Nastepna mapa:^3 %s^1.", g_eMenuItems[iMaxVote][v_MapName]);
else {
iMaxVote = random_num(0, g_iMenuItemsCount - 1);
ColorChat(0, "MapManager", "Nikt nie glosowal. Nastepna mapa:^3 %s^1.", g_eMenuItems[iMaxVote][v_MapName]);
}
set_pcvar_string(g_pCvars[NEXTMAP], g_eMenuItems[iMaxVote][v_MapName]);
g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
ColorChat(0, "MapManager", "Zmiana mapy nastapi w nastepnej rundzie.");
}
else {
g_bVoteFinished = false;
g_iExtendedMax++;
ColorChat(0, "MapManager", "Obecna mapa zostala przedluzona o^3 15^1 minut.");
set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) + 15.0);
}
}
bool:valid_map(szMap[]) {
if(is_map_valid(szMap)) return true;
static iLen;
if((iLen = strlen(szMap) - 4) < 0) return false;
if(equali(szMap[iLen], ".bsp")) {
szMap[iLen] = '^0';
if(is_map_valid(szMap)) return true;
}
return false;
}
is_map_in_array(szMap[]) {
static i, eMapInfo[MAP_INFO];
i = 0;
for(; i < ArraySize(g_aMaps); i++) {
ArrayGetArray(g_aMaps, i, eMapInfo);
if(equali(szMap, eMapInfo[m_MapName])) return i + 1;
}
return 0;
}
is_map_blocked(Array:aArray, szMap[]) {
static i, eBlockedInfo[BLOCKEDMAP_INFO];
i = 0;
for(; i < ArraySize(aArray); i++) {
ArrayGetArray(aArray, i, eBlockedInfo);
if(equali(szMap, eBlockedInfo[b_MapName])) return i + 1;
}
return 0;
}
clear_blocked_maps() {
static i, eMapInfo[MAP_INFO];
i = 0;
for(; i < ArraySize(g_aMaps); i++) {
ArrayGetArray(g_aMaps, i, eMapInfo);
if(eMapInfo[m_BlockCount]) {
eMapInfo[m_BlockCount] = 0;
ArraySetArray(g_aMaps, i, eMapInfo);
}
}
g_iBlockedSize = 0;
}
bool:is_map_in_menu(iMapID) {
static i;
i = 0;
for(; i < sizeof g_eMenuItems; i++)
if(g_eMenuItems[i][v_MapIndex] == iMapID) return true;
return false;
}
is_map_nominated(iMapID) {
static i, eNomInfo[NOMINATEDMAP_INFO];
i = 0;
for(; i < ArraySize(g_aNominatedMaps); i++) {
ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
if(iMapID == eNomInfo[n_MapIndex]) return i + 1;
}
return 0;
}
is_map_in_priority(Array:aArray, iMapID) {
static i, ePriorityInfo[VOTEMENU_INFO];
i = 0;
for(; i < ArraySize(aArray); i++) {
ArrayGetArray(aArray, i, ePriorityInfo);
if(iMapID == ePriorityInfo[v_MapIndex])
return i + 1;
}
return 0;
}
clear_nominated_maps(id) {
static i, eNomInfo[NOMINATEDMAP_INFO];
i = 0;
for(; i < ArraySize(g_aNominatedMaps); i++) {
ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
if(id == eNomInfo[n_Player]) {
ArrayDeleteItem(g_aNominatedMaps, i--);
if(!--g_iNominatedMaps[id]) break;
}
}
}
bool:is_prefix_in_array(szPrefix[]) {
static i, szString[32];
i = 0;
for(; i < g_iMapPrefixesNum; i++) {
ArrayGetString(g_aMapPrefixes, i, szString, 31);
if(equali(szPrefix, szString)) return true;
}
return false;
}
get_map_prefix(szMap[], szPrefix[], iSize) {
static i, szMapCopy[32];
i = 0;
copy(szMapCopy, 31, szMap);
for(; szMapCopy[i]; i++) {
if(szMapCopy[i] == '_') {
szMapCopy[i + 1] = 0;
copy(szPrefix, iSize, szMapCopy);
return 1;
}
}
return 0;
}
find_similar_map(iMapID, szString[32]) {
static i, eMapInfo[MAP_INFO];
i = iMapID;
for(; i < ArraySize(g_aMaps); i++) {
ArrayGetArray(g_aMaps, i, eMapInfo);
if(containi(eMapInfo[m_MapName], szString) != -1) return i + 1;
}
return 0;
}
trim_bracket(szText[]) {
static i;
i = 0;
for(; szText[i]; i++) {
if(szText[i] == '[') {
szText[i] = 0;
break;
}
}
}
bool:string_with_space(szString[]) {
static i;
i = 0;
for(; szString[i]; i++)
if(szString[i] == ' ') return true;
return false;
}
stock GetEnding(iNum, szA[], szB[], szC[], szOutput[]) {
static iNum10;
iNum10 = iNum % 10;
if(5 <= iNum % 100 <= 20 || !iNum10 || 5 <= iNum10 <= 9) copy(szOutput, 7, szA);
else if(iNum10 == 1) copy(szOutput, 7, szB);
else if(2 <= iNum10 <= 4) copy(szOutput, 7, szC);
}
stock GetPlayers() {
static szPlayers[32], iNum;
get_players(szPlayers, iNum, "ch");
return iNum;
}
stock ColorChat(id, szTag[], szMessage[], any:...) {
static szBuffer[190];
vformat(szBuffer, 189, szMessage, 4);
client_print_color(id, 0, "^4[%s]^1 %s", szTag, szBuffer);
}
stock showActivity(id, szTag[], szMessage[], any:...) {
static szBuffer[512], szName[32], szPlayers[32], iNum, i;
vformat(szBuffer, 511, szMessage, 4);
get_user_name(id, szName, 31);
get_players(szPlayers, iNum, "ch");
for(--iNum; iNum >= 0; iNum--) {
i = szPlayers[iNum];
get_user_flags(i) & ADMIN_BAN ? ColorChat(i, szTag, "ADMIN^3 %s^1 %s", szName, szBuffer) : ColorChat(i, szTag, "ADMIN %s", szBuffer);
}
}