Цитата(VEN @ 28.10.2018, 12:56)

Izmayl7, Прикрепи код другого мапменеджера, с которым не работает.
ага сейчас прикреплю.
вот:
Код:
#include <amxmodx>
#include <map_manager_consts>
#include <map_manager_stocks>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define PLUGIN "Map Manager: Core"
#define VERSION "3.0.1"
#define AUTHOR "Mistrick"
#pragma semicolon 1
//-----------------------------------------------------//
// Consts
//-----------------------------------------------------//
#define MAX_VOTELIST_SIZE 9
new const FILE_MAPS[] = "maps.ini";
//-----------------------------------------------------//
#define get_num(%0) get_pcvar_num(g_pCvars[%0])
const NOT_VOTED = -1;
enum (+=100) {
TASK_PREPARE_VOTE = 100,
TASK_VOTE_TIME
};
enum Forwards {
MAPLIST_LOADED,
CAN_BE_IN_VOTELIST,
CAN_BE_EXTENDED,
PREPARE_VOTELIST,
VOTE_STARTED,
VOTE_CANCELED,
ANALYSIS_OF_RESULTS,
VOTE_FINISHED,
COUNTDOWN
};
enum {
SHOW_DISABLED,
SHOW_MENU,
SHOW_HUD
};
enum Cvars {
PREFIX,
VOTELIST_SIZE,
SHOW_RESULT_TYPE,
SHOW_SELECTS,
RANDOM_NUMS,
PREPARE_TIME,
VOTE_TIME,
VOTE_ITEM_OFFSET
};
new g_pCvars[Cvars];
new g_iOffset;
new g_iVoteItems;
new g_sVoteList[MAX_VOTELIST_SIZE + 1][MAPNAME_LENGTH];
new g_iVotes[MAX_VOTELIST_SIZE + 1];
new g_iTotalVotes;
new g_iVoted[33];
new g_hForwards[Forwards];
new Array:g_aMapsList = Invalid_Array;
new g_iShowType;
new g_bShowSelects;
new g_iTimer;
new g_bCanExtend;
new g_iMaxItems;
new g_iCurMap;
new g_iRandomNums[MAX_VOTELIST_SIZE + 1];
new g_iVoteType;
new bool:g_bVoteStarted;
new bool:g_bVoteFinished;
new g_sCurMap[MAPNAME_LENGTH];
new g_sPrefix[48];
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("mapm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
g_pCvars[PREFIX] = register_cvar("mapm_prefix", "^4[MapManager]");
g_pCvars[VOTELIST_SIZE] = register_cvar("mapm_votelist_size", "5");
g_pCvars[SHOW_RESULT_TYPE] = register_cvar("mapm_show_result_type", "1"); //0 - disable, 1 - menu, 2 - hud
g_pCvars[SHOW_SELECTS] = register_cvar("mapm_show_selects", "1"); // 0 - disable, 1 - all
g_pCvars[RANDOM_NUMS] = register_cvar("mapm_random_nums", "0"); // 0 - disable, 1 - enable
g_pCvars[PREPARE_TIME] = register_cvar("mapm_prepare_time", "5"); // seconds
g_pCvars[VOTE_TIME] = register_cvar("mapm_vote_time", "10"); // seconds
g_pCvars[VOTE_ITEM_OFFSET] = register_cvar("mapm_vote_item_offset", "0");
g_hForwards[MAPLIST_LOADED] = CreateMultiForward("mapm_maplist_loaded", ET_IGNORE, FP_CELL);
g_hForwards[PREPARE_VOTELIST] = CreateMultiForward("mapm_prepare_votelist", ET_IGNORE, FP_CELL);
g_hForwards[VOTE_STARTED] = CreateMultiForward("mapm_vote_started", ET_IGNORE, FP_CELL);
g_hForwards[VOTE_CANCELED] = CreateMultiForward("mapm_vote_canceled", ET_IGNORE, FP_CELL);
g_hForwards[ANALYSIS_OF_RESULTS] = CreateMultiForward("mapm_analysis_of_results", ET_CONTINUE, FP_CELL, FP_CELL);
g_hForwards[VOTE_FINISHED] = CreateMultiForward("mapm_vote_finished", ET_IGNORE, FP_STRING, FP_CELL, FP_CELL);
g_hForwards[CAN_BE_IN_VOTELIST] = CreateMultiForward("mapm_can_be_in_votelist", ET_CONTINUE, FP_STRING, FP_CELL, FP_CELL);
g_hForwards[CAN_BE_EXTENDED] = CreateMultiForward("mapm_can_be_extended", ET_CONTINUE, FP_CELL);
g_hForwards[COUNTDOWN] = CreateMultiForward("mapm_countdown", ET_IGNORE, FP_CELL, FP_CELL);
register_menucmd(register_menuid("VoteMenu"), 1023, "votemenu_handler");
register_dictionary("mapmanager.txt");
}
public plugin_natives()
{
register_library("map_manager_core");
register_native("mapm_load_maplist", "native_load_maplist");
register_native("mapm_load_maplist_to_array", "native_load_maplist_to_array");
register_native("mapm_get_map_index", "native_get_map_index");
register_native("mapm_get_prefix", "native_get_prefix");
register_native("mapm_set_vote_finished", "native_set_vote_finished");
register_native("mapm_start_vote", "native_start_vote");
register_native("mapm_stop_vote", "native_stop_vote");
register_native("mapm_get_votelist_size", "native_get_votelist_size");
register_native("mapm_set_votelist_max_items", "native_set_votelist_max_items");
register_native("mapm_push_map_to_votelist", "native_push_map_to_votelist");
register_native("mapm_get_count_maps_in_vote", "native_get_count_maps_in_vote");
register_native("mapm_get_voteitem_info", "native_get_voteitem_info");
register_native("is_vote_started", "native_is_vote_started");
register_native("is_vote_finished", "native_is_vote_finished");
}
public native_load_maplist(plugin, params)
{
enum {
arg_filename = 1,
arg_clearlist
};
if(get_param(arg_clearlist)) {
if(g_aMapsList == Invalid_Array) {
set_fail_state("Clear empty Array. Don't use this navite before core load maplist.");
return;
}
ArrayClear(g_aMapsList);
}
new filename[256];
get_string(arg_filename, filename, charsmax(filename));
load_maplist(g_aMapsList, filename);
}
public native_load_maplist_to_array(plugin, params)
{
enum {
arg_array = 1,
arg_filename
};
new filename[256];
get_string(arg_filename, filename, charsmax(filename));
return load_maplist(Array:get_param(arg_array), filename, true);
}
public native_get_map_index(plugin, params)
{
enum { arg_map = 1 };
new map[MAPNAME_LENGTH]; get_string(arg_map, map, charsmax(map));
return get_map_index(g_aMapsList, map);
}
public native_get_prefix(plugin, params)
{
enum {
arg_prefix = 1,
arg_len
};
set_string(arg_prefix, g_sPrefix, get_param(arg_len));
}
public native_set_vote_finished(plugin, params)
{
enum { arg_value = 1 };
g_bVoteFinished = bool:get_param(arg_value);
}
public native_start_vote(plugin, params)
{
enum { arg_type = 1 };
return prepare_vote(get_param(arg_type));
}
public native_stop_vote(plugin, params)
{
stop_vote();
}
public native_get_votelist_size(plugin, params)
{
return min(get_num(VOTELIST_SIZE), MAX_VOTELIST_SIZE);
}
public native_set_votelist_max_items(plugin, params)
{
enum { arg_value = 1 };
g_iMaxItems = get_param(arg_value);
}
public native_push_map_to_votelist(plugin, params)
{
enum {
arg_map = 1,
arg_type,
arg_ignore_check
};
if(g_iVoteItems >= min(min(get_num(VOTELIST_SIZE), MAX_VOTELIST_SIZE), ArraySize(g_aMapsList))) {
return PUSH_CANCELED;
}
new map[MAPNAME_LENGTH]; get_string(arg_map, map, charsmax(map));
new ignore_checks = get_param(arg_ignore_check);
if(!(ignore_checks & CHECK_IGNORE_VALID_MAP) && !is_map_valid(map)) {
return PUSH_CANCELED;
}
if(is_map_in_vote(map)) {
return PUSH_BLOCKED;
}
if(!(ignore_checks & CHECK_IGNORE_MAP_ALLOWED) && !is_map_allowed(map, get_param(arg_type), get_map_index(g_aMapsList, map))) {
return PUSH_BLOCKED;
}
copy(g_sVoteList[g_iVoteItems], charsmax(g_sVoteList[]), map);
g_iVoteItems++;
return PUSH_SUCCESS;
}
public native_get_count_maps_in_vote(plugin, params)
{
return g_iVoteItems + g_bCanExtend;
}
public native_get_voteitem_info(plugin, params)
{
enum {
arg_item = 1,
arg_map,
arg_len
};
new item = get_param(arg_item);
if(item < 0 || item >= g_iVoteItems + g_bCanExtend) {
return 0;
}
set_string(arg_map, g_sVoteList[item], get_param(arg_len));
return g_iVotes[item];
}
public native_is_vote_started(plugin, params)
{
return g_bVoteStarted;
}
public native_is_vote_finished(plugin, params)
{
return g_bVoteFinished;
}
//-----------------------------------------------------//
// Maplist stuff
//-----------------------------------------------------//
public plugin_cfg()
{
g_aMapsList = ArrayCreate(MapStruct, 1);
new configsdir[256]; get_localinfo("amxx_configsdir", configsdir, charsmax(configsdir));
server_cmd("exec %s/map_manager.cfg", configsdir);
server_exec();
get_mapname(g_sCurMap, charsmax(g_sCurMap));
get_pcvar_string(g_pCvars[PREFIX], g_sPrefix, charsmax(g_sPrefix));
replace_color_tag(g_sPrefix, charsmax(g_sPrefix));
// add forward for change file?
load_maplist(g_aMapsList, FILE_MAPS);
}
load_maplist(Array:array, const file[], bool:silent = false)
{
new file_path[256]; get_localinfo("amxx_configsdir", file_path, charsmax(file_path));
format(file_path, charsmax(file_path), "%s/%s", file_path, file);
if(!file_exists(file_path)) {
if(!silent) {
new error[192]; formatex(error, charsmax(error), "File doesn't exist ^"%s^".", file_path);
set_fail_state(error);
}
return 0;
}
new f = fopen(file_path, "rt");
if(!f) {
if(!silent) {
set_fail_state("Can't read maps file.");
}
return 0;
}
new map_info[MapStruct], text[48], map[MAPNAME_LENGTH], first_map[MAPNAME_LENGTH], min[3], max[3], bool:nextmap, bool:found_nextmap;
while(!feof(f)) {
fgets(f, text, charsmax(text));
parse(text, map, charsmax(map), min, charsmax(min), max, charsmax(max));
if(!map[0] || map[0] == ';' || !valid_map(map) || get_map_index(array, map) != INVALID_MAP_INDEX) continue;
if(!first_map[0]) {
copy(first_map, charsmax(first_map), map);
}
if(equali(map, g_sCurMap)) {
nextmap = true;
continue;
}
if(nextmap) {
nextmap = false;
found_nextmap = true;
set_cvar_string("amx_nextmap", map);
}
map_info[MapName] = map;
map_info[MinPlayers] = str_to_num(min);
map_info[MaxPlayers] = str_to_num(max) == 0 ? 32 : str_to_num(max);
ArrayPushArray(array, map_info);
min = ""; max = "";
}
fclose(f);
if(!ArraySize(array)) {
if(!silent) {
new error[192]; formatex(error, charsmax(error), "Nothing loaded from ^"%s^".", file_path);
set_fail_state(error);
}
return 0;
}
if(!silent) {
if(!found_nextmap) {
set_cvar_string("amx_nextmap", first_map);
}
new ret;
ExecuteForward(g_hForwards[MAPLIST_LOADED], ret, array);
}
return 1;
}
//-----------------------------------------------------//
// Vote stuff
//-----------------------------------------------------//
prepare_vote(type)
{
if(g_bVoteStarted) {
return 0;
}
g_bVoteStarted = true;
g_bVoteFinished = false;
g_iVoteType = type;
g_iVoteItems = 0;
g_iTotalVotes = 0;
arrayset(g_iVoted, NOT_VOTED, sizeof(g_iVoted));
arrayset(g_iVotes, 0, sizeof(g_iVotes));
new array_size = ArraySize(g_aMapsList);
new vote_max_items = min(min(get_num(VOTELIST_SIZE), MAX_VOTELIST_SIZE), array_size);
new ret;
ExecuteForward(g_hForwards[PREPARE_VOTELIST], ret, type);
if(g_iMaxItems) {
vote_max_items = g_iMaxItems;
g_iMaxItems = 0;
}
if(g_iVoteItems < vote_max_items) {
new map_info[MapStruct];
for(new random_map; g_iVoteItems < vote_max_items; g_iVoteItems++) {
do {
random_map = random_num(0, array_size - 1);
ArrayGetArray(g_aMapsList, random_map, map_info);
} while(is_map_in_vote(map_info[MapName]) || !is_map_allowed(map_info[MapName], PUSH_BY_CORE, random_map));
copy(g_sVoteList[g_iVoteItems], charsmax(g_sVoteList[]), map_info[MapName]);
}
}
ExecuteForward(g_hForwards[CAN_BE_EXTENDED], ret, type);
g_bCanExtend = !ret;
if(g_bCanExtend) {
copy(g_sVoteList[g_iVoteItems], charsmax(g_sVoteList[]), g_sCurMap);
}
g_iCurMap = -1;
for(new i; i < g_iVoteItems + g_bCanExtend; i++) {
if(equali(g_sCurMap, g_sVoteList[i])) {
g_iCurMap = i;
break;
}
}
if(get_num(RANDOM_NUMS)) {
arrayset(g_iRandomNums, -1, sizeof(g_iRandomNums));
for(new i; i < g_iVoteItems + g_bCanExtend; i++) {
do {
g_iRandomNums[i] = random_num(0, g_iVoteItems + g_bCanExtend - 1);
} while(in_array(i, g_iRandomNums[i]));
}
} else {
for(new i; i < g_iVoteItems + g_bCanExtend; i++) {
g_iRandomNums[i] = i;
}
}
g_iOffset = get_num(VOTE_ITEM_OFFSET);
if(g_iOffset + g_iVoteItems + g_bCanExtend >= MAX_VOTELIST_SIZE + 1) {
g_iOffset = MAX_VOTELIST_SIZE + 1 - g_iVoteItems - g_bCanExtend;
}
g_iTimer = get_num(PREPARE_TIME) + 1;
countdown(TASK_PREPARE_VOTE);
return 1;
}
is_map_allowed(map[], type, index)
{
new ret;
ExecuteForward(g_hForwards[CAN_BE_IN_VOTELIST], ret, map, type, index);
return ret == MAP_ALLOWED;
}
in_array(index, num)
{
for(new i; i < index; i++) {
if(num == g_iRandomNums[i]) {
return true;
}
}
return false;
}
get_original_num(num)
{
for(new i; i < g_iVoteItems + g_bCanExtend; i++) {
if(g_iRandomNums[i] == num) {
return i;
}
}
return 0;
}
public countdown(taskid)
{
if(--g_iTimer > 0) {
if(taskid == TASK_VOTE_TIME) {
new dont_show_result = get_num(SHOW_RESULT_TYPE) == SHOW_DISABLED;
g_iShowType = get_num(SHOW_RESULT_TYPE);
g_bShowSelects = get_num(SHOW_SELECTS);
new players[32], pnum; get_players(players, pnum, "ch");
for(new i, id; i < pnum; i++) {
id = players[i];
if(!dont_show_result || g_iVoted[id] == NOT_VOTED) {
show_votemenu(id);
}
}
}
new type = COUNTDOWN_UNKNOWN;
switch(taskid) {
case TASK_PREPARE_VOTE: type = COUNTDOWN_PREPARE;
case TASK_VOTE_TIME: type = COUNTDOWN_VOTETIME;
}
new ret;
ExecuteForward(g_hForwards[COUNTDOWN], ret, type, g_iTimer);
set_task(1.0, "countdown", taskid);
} else {
if(taskid == TASK_PREPARE_VOTE) {
start_vote();
} else if(taskid == TASK_VOTE_TIME) {
show_menu(0, 0, "^n", 1);
finish_vote();
}
}
}
start_vote()
{
// server_print("--start vote--");
new ret;
ExecuteForward(g_hForwards[VOTE_STARTED], ret, g_iVoteType);
// TODO: add preview for N seconds
g_iTimer = get_num(VOTE_TIME) + 1;
countdown(TASK_VOTE_TIME);
}
public show_votemenu(id)
{
static menu[512];
new len, keys, percent, item;
len = formatex(menu, charsmax(menu), "\y%L:^n^n", id, g_iVoted[id] != NOT_VOTED ? "MAPM_MENU_VOTE_RESULTS" : "MAPM_MENU_CHOOSE_MAP");
for(item = 0; item < g_iVoteItems + g_bCanExtend; item++) {
len += formatex(menu[len], charsmax(menu) - len, "%s", (item == g_iVoteItems) ? "^n" : "");
if(g_iVoted[id] == NOT_VOTED) {
len += formatex(menu[len], charsmax(menu) - len, "\r%d.\w %s", (g_iRandomNums[item] + 1 + g_iOffset == 10 ? 0 : g_iRandomNums[item] + 1 + g_iOffset), g_sVoteList[item]);
keys |= (1 << (g_iRandomNums[item] + g_iOffset));
} else {
len += formatex(menu[len], charsmax(menu) - len, "%s%s", (g_iRandomNums[item] + g_iOffset == g_iVoted[id]) ? "\r" : "\d", g_sVoteList[item]);
}
percent = g_iTotalVotes ? floatround(g_iVotes[item] * 100.0 / g_iTotalVotes) : 0;
len += formatex(menu[len], charsmax(menu) - len, "\d[\r%d%%\d]", percent);
if(item == g_iCurMap) {
len += formatex(menu[len], charsmax(menu) - len, "\y[%L]", id, "MAPM_MENU_EXTEND");
}
len += formatex(menu[len], charsmax(menu) - len, "^n");
}
len += formatex(menu[len], charsmax(menu) - len, "^n\d%L \r%d\d %L", id, "MAPM_MENU_LEFT", g_iTimer, id, "MAPM_SECONDS");
if(!keys) keys = (1 << 9);
if(g_iVoted[id] != NOT_VOTED && g_iShowType == SHOW_HUD) {
while(replace(menu, charsmax(menu), "\r", "")){}
while(replace(menu, charsmax(menu), "\d", "")){}
while(replace(menu, charsmax(menu), "\w", "")){}
while(replace(menu, charsmax(menu), "\y", "")){}
set_hudmessage(0, 55, 255, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);
show_hudmessage(id, "%s", menu);
} else {
show_menu(id, keys, menu, -1, "VoteMenu");
}
}
public votemenu_handler(id, key)
{
if(g_iVoted[id] != NOT_VOTED) {
show_votemenu(id);
return PLUGIN_HANDLED;
}
new original = get_original_num(key - g_iOffset);
g_iVotes[original]++;
g_iTotalVotes++;
g_iVoted[id] = key;
if(g_bShowSelects) {
new name[32]; get_user_name(id, name, charsmax(name));
if(original == g_iVoteItems) {
client_print_color(0, id, "%s^3 %L", g_sPrefix, LANG_PLAYER, "MAPM_CHOSE_EXTEND", name);
} else {
client_print_color(0, id, "%s^3 %L", g_sPrefix, LANG_PLAYER, "MAPM_CHOSE_MAP", name, g_sVoteList[original]);
}
}
if(g_iShowType != SHOW_DISABLED) {
show_votemenu(id);
}
return PLUGIN_HANDLED;
}
finish_vote()
{
g_bVoteStarted = false;
// vote results
// pre forward
new ret;
ExecuteForward(g_hForwards[ANALYSIS_OF_RESULTS], ret, g_iVoteType, g_iTotalVotes);
if(ret) {
if(ret == ABORT_VOTE_WITH_FORWARD) {
ExecuteForward(g_hForwards[VOTE_CANCELED], ret, g_iVoteType);
}
return;
}
g_bVoteFinished = true;
new max_vote = 0;
if(g_iTotalVotes) {
for(new i = 1; i < g_iVoteItems + 1; i++) {
if(g_iVotes[max_vote] < g_iVotes[i]) max_vote = i;
}
}
else {
max_vote = random_num(0, g_iVoteItems - 1);
}
// post forward
// add blocking?
ExecuteForward(g_hForwards[VOTE_FINISHED], ret, g_sVoteList[max_vote], g_iVoteType, g_iTotalVotes);
}
stop_vote()
{
if(task_exists(TASK_VOTE_TIME)) {
show_menu(0, 0, "^n", 1);
}
remove_task(TASK_PREPARE_VOTE);
remove_task(TASK_VOTE_TIME);
g_bVoteStarted = false;
g_bVoteFinished = false;
new ret;
ExecuteForward(g_hForwards[VOTE_CANCELED], ret, g_iVoteType);
}
//-----------------------------------------------------//
// Usefull func
//-----------------------------------------------------//
get_map_index(Array:array, map[])
{
for(new i = 0, map_info[MapStruct], size = ArraySize(array); i < size; i++) {
ArrayGetArray(array, i, map_info);
if(equali(map, map_info[MapName])) return i;
}
return INVALID_MAP_INDEX;
}
bool:is_map_in_vote(map[])
{
for(new i; i < g_iVoteItems; i++) {
if(equali(map, g_sVoteList[i])) {
return true;
}
}
return false;
}
Код:
#include <amxmodx>
/* Настройки */
#define BLOCK_MAPS 10 // Количество последних сыгранных карт
#define VOTE_TIME 10 // Время голосования
#define MAP_ON_VOTE 5 // Карт в меню голосования
#define ROCK_THE_VOTE // Функция rtv
#define RTV_DELAY 180 // Задержка о начала карты для использования rtv функции (в секундах)
#define RTV_PERCENTS 60 // Процент голосов
// #define NOMINATE // Функция номинаций
#define NOM_MAX 3 // Максимум карт для номинации
#define NOM_PLAYER 1 // Максимум карт для номинации одним игроком
#define SAY_MAPS // Команда /maps
#define NOM_WITH_PREFIXES // Номинация карты без префиксов(de_dust2 можно номинировать как dust2)
#define MAX_EXTENDS 3 // Количество продлений
#define EXTEND_TIME 15 // Время одного продления
#define SHOW_TIMELEFT // Показывать в чате в начале раунда, сколько осталось до конца карты
#define ADMIN_ROCK_THE_VOTE // Досрочное голосование у админов
#define ADMIN_RTV_TIME 5
// Сколько времени нужно играть на карте, чтобы можно было вызвать досрочное для админов
// Команда в консоль сервера и админы с флагом ADMIN_RCON("l") имеют иммунитет к данной настройке
// Закомментируйте, чтобы было доступно всегда
#define SHOW_MENU_WITH_PERCENTS // Показывать результаты с процентами голосов после выбора карты при голосовании
//#define ADMIN_DUAL_VOTE (ADMIN_MAP|ADMIN_LEVEL_H)
// Голос админа(ADMIN_MAP) и VIP(ADMIN_LEVEL_H) имеют вес двух голосов
//#define ONLY_GAME_PLAYERS
// Считать только реальных игроков. Спектров не учитывать.
//#define BLOCK_CHATS
// Блокировать VOICE и TEXT чаты на время голосования
#define VSEM_SPS_SOUND "misc/neugomon/vsem_sps.wav"
// Звук в 3 сек перед сменой карты.
// Закомментируйте или удалите строку, если не требуется
//#define NO_ROUND_SUPPORT // Режим работы в realtime. Для серверов CSDM
// #define NIGHTMODE
// Ночной список карт. НЕ работает блокировка карт, сортировка по онлайну и номинации
// Map List addons/amxmodx/configs/nmaps.ini | Просто список карт и все | ФАЙЛ НУЖНО СОЗДАТЬ САМОМУ!!!
#define BLOCK_CMDS // Блокировать команды
#define NIGHT_START 1 // Начало ночного режима
#define NIGHT_END 10 // Окончание ночного режима
// ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅ PLEASE, NOT EDIT IT'S CODE ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅
// ˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅˅
#if !defined NIGHTMODE && defined BLOCK_CMDS
#undef BLOCK_CMDS
#endif
#if !defined NOMINATE && defined NOM_WITH_PREFIXES
#undef NOM_WITH_PREFIXES
#endif
// ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄
// ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄ PLEASE, NOT EDIT IT'S CODE ˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄˄
#if defined BLOCK_CMDS
new g_szBlockCMDs[][] = { "amx_map", "amx_votemap", "amx_votemapmenu" };
// Команды для блокировки во время ночного режима
// Чтобы работала блокировка команд, нужно прописывать mapchooser в plugins.ini выше плагина который выполняет эту команду!
#endif
#if defined NOM_WITH_PREFIXES
new const g_szMapPrefixes[][] = { "de_", "cs_", "as_" };
// Префиксы карт, используемые для быстрой номинации
#endif
new g_iColors[3] = { 50, 255, 50 }; // R G B цвет для HUD отсчета
new Float:g_fPos[2] = { -1.0, 0.6 }; // X и Y координаты в HUD отсчета
/* Словарь плагина */
#define MSG_NOMINATE_BLOCKED "^1[^4MM^1] ^4Данная карта была недавно сыграна!"
#define MSG_NOMINATE_DISABLE "^1[^4MM^1] ^4Номинация недоступна!"
#define MSG_NOMINATE_MAX_MAP_PL "^1[^4MM^1] ^4Вы уже номинировали максимум карт ^3[%d]^4!"
#define MSG_NOMINATE_MAX_MAP_ALL "^1[^4MM^1] ^4Уже номинировано максимум карт ^3[%d]^4!"
#define MSG_NOMINATE_MAP_NOMINATED "^1[^4MM^1] ^4Данная карта уже номинирована!"
#define MSG_NOMINATE_PL_NOMINATEMAP "^1[^4MM^1] ^3%s ^4номинировал карту ^3%s"
#define MSG_RTV_BLOCKED0 "^1[^4MM^1] ^4Досрочная смена карты будет доступна менее, чем через ^3минуту^4!"
#define MSG_RTV_BLOCKED "^1[^4MM^1] ^4Досрочная смена карты будет доступна через ^3%d ^4мин!"
#define MSG_RTV_PL_VOTED "^1[^4MM^1] ^4Вы уже голосовали! Осталось ^3%d ^4голосов"
#define MSG_RTV_PL_VOTE "^1[^4MM^1] ^3%s ^4проголосовал за смену карты. Осталось ^3%d ^4голосов"
#define MSG_RTV_VOTE_START "^1[^4MM^1] ^4Все голоса за досрочную смену карты набраны. ^3Последний ^4раунд"
#define MSG_ADMIN_RTV "^1[^4MM^1] ^4Администратор ^3%s ^4запустил досрочную смену карты. ^3Последний ^4раунд"
#define MSG_CMD_FFIRE "^1[^4MM^1] ^4На сервере огонь по своим ^3%s"
#define MSG_CMD_THETIME "^1[^4MM^1] ^4Текущее время ^3%s"
#define MSG_CMD_NEXTMAP "^1[^4MM^1] ^4Следующая карта еще ^3не определена ^1:("
#define MSG_CMD_TIMELEFT0 "^1[^4MM^1] ^4Карта ^3не ограничена ^4по времени"
#define MSG_CMD_TIMELEFT "^1[^4MM^1] ^4До конца карты осталось ^3%d ^4мин ^3%02d ^4сек"
#define MSG_CMD_TIMELEFT_LAST_RND "^1[^4MM^1] ^4Карта окончена. ^3Последний ^4раунд!"
#define MSG_TIMELEFT_ON_ROUNDSTART "^1[^4MM^1] ^4До конца карты осталось ^3%d ^4мин ^3%02d ^4сек%s"
#define MSG_NOTIMELIMIT_ON_ROUNDSTART "^1[^4MM^1] ^4Карта ^3не ограничена ^4по времени"
#define MSG_TIMELEFT_ADD_LASTRND ". ^3Последний ^4раунд!"
#define MSG_TIME_TO_VOTE "До голосования осталось %d сек!"
#define MSG_VOTEMAP_PL_EXT "^1[^4MM^1] ^4Игрок ^3%s ^4выбрал ^3продление карты"
#define MSG_VOTEMAP_PL_MAP "^1[^4MM^1] ^4Игрок ^3%s ^4выбрал карту ^3%s"
#define MSG_VOTE_END_NOVOTES "^1[^4MM^1] ^4Никто ^3не проголосовал! ^4Cлучайная карта ^3%s"
#define MSG_VOTE_END_EXTENDED "^1[^4MM^1] ^4Голосование ^3завершено! ^4Карта продлена на ^3%d ^4минут"
#define MSG_VOTE_END_NEXTMAP "^1[^4MM^1] ^4Голосование ^3завершено! ^4Cледующая карта ^3%s"
#define MSG_NIGHT_BLOCK_CMD "^1[^4MM^1] ^4Данная команда ^3заблокирована ^4в ^1ночном ^4режиме!"
/* Размерности массивов */
#define MAP_LENGTH 32
#if !defined MAX_NAME_LENGTH
const MAX_NAME_LENGTH = 32;
#endif
#if !defined MAX_PLAYERS
const MAX_PLAYERS = 32;
#endif
/* Размерности массивов */
enum _:aMAPS
{
map[MAP_LENGTH],
minpl,
maxpl
}
new Trie:g_tBlockMaps;
#if defined NOMINATE
new Trie:g_tAllowMaps;
#if defined SAY_MAPS
new g_iMapsMenu;
#endif
#else
#if defined SAY_MAPS
#undef SAY_MAPS
#endif
#endif
new Array:g_arrAllMaps,
Array:g_arrNightMaps;
new g_szArrayData[aMAPS];
new g_szCurrentMap[MAP_LENGTH];
new g_iMapSortedByOnline = -1;
new g_iNumAllMaps,
g_iNumNightMaps;
new g_iVoteItems;
new g_iMenuItemId[MAP_ON_VOTE + 1];
new g_iSelectedItem[MAP_ON_VOTE + 2];
new g_szMenuMapName[MAP_ON_VOTE + 2][MAP_LENGTH];
#if defined ROCK_THE_VOTE || (defined ADMIN_ROCK_THE_VOTE && defined ADMIN_RTV_TIME)
new g_iStartMap;
#endif
#if defined ROCK_THE_VOTE
new g_iRtvVotes;
#endif
#if defined NOMINATE
new g_iNominated[NOM_MAX+1];
new g_iNominateNum;
new g_iNominate[MAX_PLAYERS + 1];
#endif
#if defined SHOW_MENU_WITH_PERCENTS
new g_iVotes;
new g_iTimeOst;
new bool:g_bIsVoted[MAX_PLAYERS + 1];
new g_szPercentMenu[512];
#endif
#if defined BLOCK_CHATS
new g_FM_SetClientListening;
#endif
/* cVar pointer's */
new g_pFreezeTime, g_pRoundTime, g_pTimeLimit, g_pC4timer, g_pChatTime;
/* cVar's data */
new g_iOldFreezeTime;
new Float:g_fOldTimeLimit, g_iTempTimelimit, g_iMapLimit;
/* Bit's */
enum _:st
{
preVote = 1,
beInVote,
voteStarted,
nMode,
blockExt
}
enum _:DATA
{
#if defined ROCK_THE_VOTE
status,
rtVoted
#else
status
#endif
}
new g_bitData[DATA];
#define GetBit(%1,%2) (%1 & (1 << (%2 & 31)))
#define SetBit(%1,%2) %1 |= (1 << (%2 & 31))
#define ResetBit(%1,%2) %1 &= ~(1 << (%2 & 31))
#define is_map_valid_by_online(%0,%1,%2) (g_iMapSortedByOnline != 1 || g_szArrayData[%1] <= %0 <= g_szArrayData[%2])
new g_szSounds[][] =
{
"",
"fvox/one",
"fvox/two",
"fvox/three"
};
#if defined NO_ROUND_SUPPORT
#tryinclude <reapi>
#if !defined _reapi_included
#include <hamsandwich>
#define RG_CBasePlayer_Spawn Ham_Spawn
#define HookChain HamHook
#define EnableHookChain EnableHamForward
#define DisableHookChain DisableHamForward
#define RegisterHookChain(%0,%1,%2) RegisterHam(%0, "player", %1, %2)
#define set_entvar set_pev
#define get_entvar pev
#define var_flags pev_flags
#endif
new HookChain:g_HookChainPlayerSpawn;
#endif
#if defined NO_ROUND_SUPPORT || defined BLOCK_CHATS
#include <fakemeta>
#endif
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#define client_disconnected client_disconnect
#endif
#if defined VSEM_SPS_SOUND
public plugin_precache()
precache_sound(VSEM_SPS_SOUND);
#endif
public plugin_init()
{
register_plugin("Advanced MapChooser", "1.4", "neygomon");
#if defined NOMINATE || defined BLOCK_CHATS
register_clcmd("say", "ClcmdHookSay");
register_clcmd("say_team", "ClcmdHookSay");
#endif
#if defined SAY_MAPS
register_clcmd("say /maps", "ClcmdSayMaps");
register_clcmd("say_team /maps","ClcmdSayMaps");
#endif
#if defined BLOCK_CMDS
for(new i; i < sizeof g_szBlockCMDs; ++i)
register_clcmd(g_szBlockCMDs[i], "ClcmdBlock");
#endif
#if defined ROCK_THE_VOTE
register_clcmd("say /rtv", "ClcmdRockTheVote");
register_clcmd("say rtv", "ClcmdRockTheVote");
#endif
#if defined ADMIN_ROCK_THE_VOTE
register_concmd("amx_rtv", "ConCmdAdminRockTheVote", ADMIN_MAP);
#endif
register_clcmd("say ff", "ClcmdFF");
register_clcmd("say nextmap", "ClcmdNextMap");
register_clcmd("say timeleft", "ClcmdTimeLeft");
register_clcmd("say thetime", "ClcmdTheTime");
register_clcmd("votemap", "ClcmdVotemap");
#if !defined NO_ROUND_SUPPORT
register_event("HLTV", "eventHLTV", "a", "1=0", "2=0");
#else
#if defined SHOW_TIMELEFT
#undef SHOW_TIMELEFT
#endif
set_task(60.0, "eventHLTV", .flags="b");
#endif
g_pFreezeTime= get_cvar_pointer("mp_freezetime");
g_pRoundTime = get_cvar_pointer("mp_roundtime");
g_pTimeLimit = get_cvar_pointer("mp_timelimit");
g_pC4timer = get_cvar_pointer("mp_c4timer");
g_pChatTime = get_cvar_pointer("mp_chattime");
register_menucmd(register_menuid("Map Chooser"), (-1^(-1<<(MAP_ON_VOTE+2))), "mapchooser_handler");
#if defined ROCK_THE_VOTE
g_iStartMap = get_systime();
#endif
}
public plugin_cfg()
{
g_tBlockMaps = TrieCreate();
#if defined NOMINATE
g_tAllowMaps = TrieCreate();
#endif
g_arrAllMaps = ArrayCreate(aMAPS);
#if defined NIGHTMODE
g_arrNightMaps = ArrayCreate(aMAPS);
#endif
get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));
LoadBlockMaps();
LoadAllowMaps();
}
public plugin_end()
{
if(g_iOldFreezeTime)
set_pcvar_num(g_pFreezeTime, g_iOldFreezeTime);
if(g_fOldTimeLimit > 0.0)
set_pcvar_float(g_pTimeLimit, g_fOldTimeLimit);
TrieDestroy(g_tBlockMaps);
#if defined NOMINATE
TrieDestroy(g_tAllowMaps);
#endif
ArrayDestroy(g_arrAllMaps);
#if defined NIGHTMODE
ArrayDestroy(g_arrNightMaps);
#endif
}
public client_disconnected(id)
{
#if defined ROCK_THE_VOTE
if(GetBit(g_bitData[rtVoted], id))
{
g_iRtvVotes--;
ResetBit(g_bitData[rtVoted], id);
}
#endif
#if defined NOMINATE
g_iNominate[id] = 0;
#endif
}
#if defined BLOCK_CHATS
public FM_SetClientListening_Pre(iRecv, iSender, listen)
{
if(iRecv == iSender)
return FMRES_IGNORED;
engfunc(EngFunc_SetClientListening, iRecv, iSender, false);
forward_return(FMV_CELL, false);
return FMRES_SUPERCEDE;
}
#endif
#if defined NOMINATE || defined BLOCK_CHATS
public ClcmdHookSay(id)
{
#if defined BLOCK_CHATS
if(GetBit(g_bitData[status], preVote) || GetBit(g_bitData[status], beInVote))
return PLUGIN_HANDLED;
#endif
#if defined NOMINATE
if(GetBit(g_bitData[status], nMode))
return PLUGIN_CONTINUE;
static szMessage[MAP_LENGTH+5];
read_args(szMessage, charsmax(szMessage));
remove_quotes(szMessage);
#if defined NOM_WITH_PREFIXES
if(!fnNominateMap(id, szMessage))
{
for(new i, szMapName[MAP_LENGTH]; i < sizeof g_szMapPrefixes; ++i)
{
formatex(szMapName, charsmax(szMapName), "%s%s", g_szMapPrefixes[i], szMessage);
if(fnNominateMap(id, szMapName))
return PLUGIN_HANDLED;
}
}
return PLUGIN_CONTINUE;
#else
return fnNominateMap(id, szMessage);
#endif
#else
return PLUGIN_CONTINUE;
#endif
}
#endif
#if defined SAY_MAPS
public ClcmdSayMaps(id)
{
if(GetBit(g_bitData[status], nMode))
return PLUGIN_HANDLED;
menu_display(id, g_iMapsMenu, 0);
return PLUGIN_HANDLED;
}
public mapsnominate_handler(id, menu, item)
{
if(item != MENU_EXIT)
{
new _access, callback, mapp[MAP_LENGTH];
menu_item_getinfo(menu, item, _access, mapp, charsmax(mapp), .callback = callback);
fnNominateMap(id, mapp);
}
return PLUGIN_HANDLED;
}
public mapsnominate_callback(id, menu, item)
{
new _access, callback, mapp[MAP_LENGTH];
menu_item_getinfo(menu, item, _access, mapp, charsmax(mapp), .callback = callback);
new aPos; TrieGetCell(g_tAllowMaps, mapp, aPos);
return nominated_map(aPos) ? ITEM_DISABLED : ITEM_ENABLED;
}
#endif
#if defined NOMINATE
fnNominateMap(id, mapp[])
{
static aPos;
if(TrieKeyExists(g_tBlockMaps, mapp))
return client_print_color(id, print_team_default, MSG_NOMINATE_BLOCKED);
else if(!TrieGetCell(g_tAllowMaps, mapp, aPos))
return PLUGIN_CONTINUE;
else if(GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], beInVote))
return client_print_color(id, print_team_default, MSG_NOMINATE_DISABLE);
else if(g_iNominate[id] == NOM_PLAYER)
return client_print_color(id, print_team_default, MSG_NOMINATE_MAX_MAP_PL, NOM_PLAYER);
else if(g_iNominateNum == NOM_MAX)
return client_print_color(id, print_team_default, MSG_NOMINATE_MAX_MAP_ALL, NOM_MAX);
else if(nominated_map(aPos))
return client_print_color(id, print_team_default, MSG_NOMINATE_MAP_NOMINATED);
g_iNominated[g_iNominateNum] = aPos;
g_iNominate[id]++;
g_iNominateNum++;
new szName[MAX_NAME_LENGTH]; get_user_name(id, szName, charsmax(szName));
return client_print_color(0, print_team_default, MSG_NOMINATE_PL_NOMINATEMAP, szName, mapp);
}
#endif
#if defined BLOCK_CMDS
public ClcmdBlock(id)
{
if(GetBit(g_bitData[status], nMode))
{
client_print_color(id, print_team_default, MSG_NIGHT_BLOCK_CMD);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
#endif
#if defined ROCK_THE_VOTE
public ClcmdRockTheVote(id)
{
if(GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], beInVote) || !valid_rtv(id))
return PLUGIN_HANDLED;
if(GetBit(g_bitData[rtVoted], id))
client_print_color(id, print_team_default, MSG_RTV_PL_VOTED, floatround(get_playersnum() * RTV_PERCENTS / 100.0) - g_iRtvVotes);
else
{
SetBit(g_bitData[rtVoted], id);
g_iRtvVotes++;
new vote = floatround(get_playersnum() * RTV_PERCENTS / 100.0) - g_iRtvVotes;
if(vote > 0)
{
new szName[MAX_NAME_LENGTH]; get_user_name(id, szName, charsmax(szName));
client_print_color(0, print_team_default, MSG_RTV_PL_VOTE, szName, vote);
log_amx("%s проголосовал за смену карты. Осталось %d голосов", szName, vote);
}
else
{
SetBit(g_bitData[status], voteStarted);
SetBit(g_bitData[status], blockExt);
client_print_color(0, print_team_default, MSG_RTV_VOTE_START);
log_amx("Досрочное голосование запущено");
}
}
return PLUGIN_HANDLED;
}
#endif
#if defined ADMIN_ROCK_THE_VOTE
public ConCmdAdminRockTheVote(id, bitAccess)
{
if(GetBit(g_bitData[status], voteStarted) || GetBit(g_bitData[status], preVote) || GetBit(g_bitData[status], beInVote))
return PLUGIN_HANDLED;
#if defined ADMIN_RTV_TIME
if(id)
{
new flags = get_user_flags(id);
if(~flags & ADMIN_RCON)
{
if(~flags & bitAccess)
return PLUGIN_HANDLED;
new time = (get_systime() - g_iStartMap) / 60;
if(ADMIN_RTV_TIME > time)
{
client_print_color(id, print_team_default, "^1[^4MM^1] ^3Досрочное голосование ^4будет доступно через ^3%d ^4мин", ADMIN_RTV_TIME - time);
return PLUGIN_HANDLED;
}
}
}
#endif
SetBit(g_bitData[status], voteStarted);
SetBit(g_bitData[status], blockExt);
new szName[MAX_NAME_LENGTH]; get_user_name(id, szName, charsmax(szName));
client_print_color(0, print_team_default, MSG_ADMIN_RTV, szName);
log_amx("Администратор %s запустил досрочную смену карты", szName);
return PLUGIN_HANDLED;
}
#endif
public ClcmdFF(id)
return client_print_color(id, print_team_default, MSG_CMD_FFIRE, get_cvar_num("mp_friendlyfire") ? "разрешен" : "запрещен");
public ClcmdTheTime(id)
{
new time[64]; get_time ("%d.%m.%Y # %H:%M:%S", time, charsmax(time));
return client_print_color(id, print_team_default, MSG_CMD_THETIME, time);
}
public ClcmdNextMap(id)
return client_print_color(id, print_team_default, MSG_CMD_NEXTMAP);
public ClcmdTimeLeft(id)
{
if(GetBit(g_bitData[status], voteStarted))
{
return client_print_color(id, print_team_default, MSG_CMD_TIMELEFT_LAST_RND);
}
new a = get_timeleft();
if(a > 0) return client_print_color(id, print_team_default, MSG_CMD_TIMELEFT, (a / 60), (a % 60));
return client_print_color(id, print_team_default, MSG_CMD_TIMELEFT0);
}
public ClcmdVotemap()
return PLUGIN_HANDLED;
public eventHLTV()
{
if(GetBit(g_bitData[status], voteStarted))
{
ResetBit(g_bitData[status], voteStarted);
StartVote();
}
else
{
#if defined NIGHTMODE
if(g_iNumNightMaps)
{
new iHour; time(iHour);
if(NIGHT_START > NIGHT_END && (iHour >= NIGHT_START || iHour < NIGHT_END)) // thx radius_r16
SetBit(g_bitData[status], nMode);
else if(NIGHT_START <= iHour < NIGHT_END)
SetBit(g_bitData[status], nMode);
else ResetBit(g_bitData[status], nMode);
}
#endif
new Float:fTimeLimit = get_pcvar_float(g_pTimeLimit);
new Float:fRoundTime = get_pcvar_float(g_pRoundTime);
new a = get_timeleft();
if((fRoundTime * 60 + VOTE_TIME * 2) > float(a) && fTimeLimit)
{
g_iTempTimelimit = floatround(fTimeLimit);
if(g_fOldTimeLimit == 0.0)
{
g_fOldTimeLimit = fTimeLimit;
g_iMapLimit = g_iTempTimelimit + MAX_EXTENDS * EXTEND_TIME;
}
if(g_iTempTimelimit >= g_iMapLimit)
{
if(!GetBit(g_bitData[status], blockExt))
SetBit(g_bitData[status], blockExt);
}
SetBit(g_bitData[status], voteStarted);
new Float:fAddTime = (fRoundTime * 60 + get_pcvar_float(g_pC4timer) + get_pcvar_float(g_pChatTime) + VOTE_TIME + 60) / 60;
set_pcvar_float(g_pTimeLimit, fTimeLimit + fAddTime);
}
#if defined SHOW_TIMELEFT
if(a > 0)
{
client_print_color(0, print_team_default, MSG_TIMELEFT_ON_ROUNDSTART,
(a / 60), (a % 60), GetBit(g_bitData[status], voteStarted) ? MSG_TIMELEFT_ADD_LASTRND : "");
}
else client_print_color(0, print_team_default, MSG_NOTIMELIMIT_ON_ROUNDSTART);
#endif
}
}
#if defined NO_ROUND_SUPPORT
public CBasePlayer_Spawn_Post(const id)
{
if(is_user_connected(id))
set_entvar(id, var_flags, get_entvar(id, var_flags) | FL_FROZEN);
}
#endif
public StartVote()
{
if(!g_iOldFreezeTime)
g_iOldFreezeTime = get_pcvar_num(g_pFreezeTime);
SetBit(g_bitData[status], preVote);
ScreenFade(1);
FrozenUsers(1);
set_task(1.0, "ShowTimer", .flags = "a", .repeat = 4);
}
public ShowTimer()
{
static timer = 3;
switch(timer)
{
case 0:
{
timer = 3;
ShowVoteMenu();
}
default:
{
set_hudmessage(g_iColors[0], g_iColors[1], g_iColors[2], g_fPos[0], g_fPos[1], 0, 0.0, 1.0, 0.0, 0.0, 4);
show_hudmessage(0, MSG_TIME_TO_VOTE, timer);
client_cmd(0, "spk %s", g_szSounds[timer--]);
}
}
}
public ShowVoteMenu()
{
g_iVoteItems = 0;
#if defined SHOW_MENU_WITH_PERCENTS
g_iVotes = 0;
arrayset(g_bIsVoted, false, sizeof g_bIsVoted);
#endif
ResetBit(g_bitData[status], preVote);
SetBit(g_bitData[status], beInVote);
new maxMaps = GetBit(g_bitData[status], nMode) ? g_iNumNightMaps : g_iNumAllMaps;
new maxVoteMap = (MAP_ON_VOTE > maxMaps) ? maxMaps : MAP_ON_VOTE;
new szMenu[512], iKeys, iLen;
new plrsnum;
if(!GetBit(g_bitData[status], nMode))
{
#if defined ONLY_GAME_PLAYERS
new pl[MAX_PLAYERS], pnum;
get_players(pl, pnum, "e", "TERRORIST"); plrsnum = pnum;
get_players(pl, pnum, "e", "CT"); plrsnum += pnum;
#else
plrsnum = get_playersnum();
#endif
if(!valid_maps_on_vote(plrsnum))
g_iMapSortedByOnline = 0;
}
iLen = formatex(szMenu, charsmax(szMenu), "\d[\rMap to Choose\d] \yВыберите карту^n^n");
#if defined NOMINATE
if(!GetBit(g_bitData[status], nMode) && g_iNominateNum)
{
for(new i; i < g_iNominateNum; ++i)
{
ArrayGetArray(g_arrAllMaps, g_iNominated[i], g_szArrayData);
if(!is_map_valid_by_online(plrsnum, minpl, maxpl))
continue;
g_iMenuItemId[g_iVoteItems] = g_iNominated[i];
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), g_szArrayData[map]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", g_iVoteItems+1, g_szMenuMapName[g_iVoteItems]);
iKeys |= (1 << g_iVoteItems++);
}
}
#endif
new item;
while(maxVoteMap > g_iVoteItems)
{
do item = random(maxMaps);
while(item_in_menu(item));
if(GetBit(g_bitData[status], nMode))
ArrayGetArray(g_arrNightMaps, item, g_szArrayData);
else
{
ArrayGetArray(g_arrAllMaps, item, g_szArrayData);
if(!is_map_valid_by_online(plrsnum, minpl, maxpl))
continue;
}
g_iMenuItemId[g_iVoteItems] = item;
copy(g_szMenuMapName[g_iVoteItems], charsmax(g_szMenuMapName[]), g_szArrayData[map]);
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\r%d. \w%s^n", g_iVoteItems+1, g_szMenuMapName[g_iVoteItems]);
iKeys |= (1 << g_iVoteItems++);
}
if(!GetBit(g_bitData[status], blockExt))
{
formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\r%d. \w%s \d[\rПродлить\d]", g_iVoteItems+1, g_szCurrentMap);
iKeys |= (1 << g_iVoteItems);
}
show_menu(0, iKeys, szMenu, VOTE_TIME, "Map Chooser");
client_cmd(0, "spk Gman/Gman_Choose2");
log_amx("[Start VoteMap] Голосование началось...");
#if defined SHOW_MENU_WITH_PERCENTS
g_iTimeOst = VOTE_TIME;
set_task(1.0, "ShowCacheMenu", 100, .flags = "a", .repeat = VOTE_TIME);
#else
set_task(float(VOTE_TIME), "GoToCheckVotes");
#endif
}
public mapchooser_handler(id, iKey)
{
static szName[MAX_NAME_LENGTH];
get_user_name(id, szName, charsmax(szName));
if(iKey == g_iVoteItems)
client_print_color(0, id, MSG_VOTEMAP_PL_EXT, szName);
else client_print_color(0, id, MSG_VOTEMAP_PL_MAP, szName, g_szMenuMapName[iKey]);
#if defined ADMIN_DUAL_VOTE
if(get_user_flags(id) & ADMIN_DUAL_VOTE)
{
g_iSelectedItem[iKey] += 2;
#if defined SHOW_MENU_WITH_PERCENTS
g_iVotes += 2;
#endif
}
else
{
g_iSelectedItem[iKey]++;
#if defined SHOW_MENU_WITH_PERCENTS
g_iVotes++;
#endif
}
#else
g_iSelectedItem[iKey]++;
#endif
#if defined SHOW_MENU_WITH_PERCENTS
g_bIsVoted[id] = true;
#if !defined ADMIN_DUAL_VOTE
g_iVotes++;
#endif
ShowCacheMenu(id);
#endif
return PLUGIN_HANDLED;
}
#if defined SHOW_MENU_WITH_PERCENTS
public ShowCacheMenu(id)
{
if(id == 100)
{
g_iTimeOst--;
if(!g_iTimeOst)
{
show_menu(0, 0, "^n", 1);
GoToCheckVotes();
}
else
{
new len = formatex(
g_szPercentMenu, charsmax(g_szPercentMenu),
"\d[\rMap to Choose\d] \yВы уже проголосовали^n\wДо конца голосования осталось \r%d \wсек!^n^n",
g_iTimeOst
);
for(new i; i < g_iVoteItems; ++i)
{
len += formatex(
g_szPercentMenu[len], charsmax(g_szPercentMenu) - len,
"\r%d. \w%s \d[\y%d%%\d]^n",
i+1, g_szMenuMapName[i], g_iVotes ? floatround(g_iSelectedItem[i] * 100.0 / g_iVotes) : 0
);
}
if(!GetBit(g_bitData[status], blockExt))
{
len += formatex(
g_szPercentMenu[len], charsmax(g_szPercentMenu) - len,
"^n\r%d. \w%s \d[\rПродлить\d][\y%d%%\d]",
g_iVoteItems+1, g_szCurrentMap, g_iVotes ? floatround(g_iSelectedItem[g_iVoteItems] * 100.0 / g_iVotes) : 0
);
}
#define KEY (1 << 10)
#if AMXX_VERSION_NUM < 183
static MaxClients; if(!MaxClients) MaxClients = get_maxplayers();
#endif
for(new id = 1; id <= MaxClients; ++id)
{
if(is_user_connected(id))
{
if(g_bIsVoted[id])
show_menu(id, KEY, g_szPercentMenu, -1, "ShowPercentMenu");
}
}
}
}
else show_menu(id, KEY, g_szPercentMenu, -1, "ShowPercentMenu");
}
#endif
public GoToCheckVotes()
{
new x;
for(new i; i < MAP_ON_VOTE+1; ++i)
if(g_iSelectedItem[x] < g_iSelectedItem[i])
x = i;
if(!g_iSelectedItem[x])
{
new mp = random(g_iVoteItems);
client_print_color(0, print_team_default, MSG_VOTE_END_NOVOTES, g_szMenuMapName[mp]);
log_amx("[End VoteMap] Никто не голосовал. Случайная карта %s", g_szMenuMapName[mp]);
ChangeLevel(g_szMenuMapName[mp]);
}
else if(g_iSelectedItem[x] == g_iSelectedItem[g_iVoteItems])
{
client_print_color(0, print_team_default, MSG_VOTE_END_EXTENDED, EXTEND_TIME);
log_amx("[End VoteMap] Голосование завершено. Карта %s была продлена на %d минут", g_szCurrentMap, EXTEND_TIME);
#if defined NOMINATE
g_iNominateNum = 0;
arrayset(g_iNominate, 0, sizeof g_iNominate);
arrayset(g_iNominated, 0, sizeof g_iNominated);
#endif
arrayset(g_iSelectedItem, 0, sizeof g_iSelectedItem);
ResetBit(g_bitData[status], beInVote);
ResetBit(g_bitData[status], blockExt);
set_pcvar_float(g_pTimeLimit, float(g_iTempTimelimit + EXTEND_TIME));
ScreenFade(0);
}
else
{
client_print_color(0, print_team_default, MSG_VOTE_END_NEXTMAP, g_szMenuMapName[x]);
log_amx("[End VoteMap] Голосование завершено %s", g_szMenuMapName[x]);
ChangeLevel(g_szMenuMapName[x]);
}
FrozenUsers(0);
}
LoadBlockMaps()
{
new szPath[75];
get_localinfo("amxx_datadir", szPath, charsmax(szPath));
add(szPath, charsmax(szPath), "/block_maps.ini");
new fp = fopen(szPath, "rt");
new i = 1;
new szBuffer[BLOCK_MAPS+1][MAP_LENGTH];
TrieSetCell(g_tBlockMaps, g_szCurrentMap, 0);
if(fp)
{
while(!feof(fp) && BLOCK_MAPS > i)
{
fgets(fp, szBuffer[i], charsmax(szBuffer[])), trim(szBuffer[i]);
if(szBuffer[i][0] && szBuffer[i][0] != ';')
TrieSetCell(g_tBlockMaps, szBuffer[i], i), i++;
}
fclose(fp);
unlink(szPath);
}
if(write_file(szPath, "; File generated by Advanced MapChooser!"))
{
copy(szBuffer[0], charsmax(szBuffer[]), g_szCurrentMap);
for(new x; x < i; x++) write_file(szPath, szBuffer[x]);
}
}
LoadAllowMaps()
{
new szPath[64], szFile[75];
get_localinfo("amxx_configsdir", szPath, charsmax(szPath));
formatex(szFile, charsmax(szFile), "%s/maps.ini", szPath);
new fp = fopen(szFile, "rt");
if(!fp)
{
new fmt[128]; formatex(fmt, charsmax(fmt), "Файл %s не найден, либо невозможно открыть!", szFile);
set_fail_state(fmt);
}
new szBuffer[MAP_LENGTH + 10], szMinpl[3], szMaxpl[3];
new iNumParams;
#if defined NOMINATE
new i;
#endif
#if defined SAY_MAPS
g_iMapsMenu = menu_create("\d[\rMaps Nominate\d] \wВыберите карту", "mapsnominate_handler");
new callback = menu_makecallback("mapsnominate_callback");
#endif
while(!feof(fp))
{
fgets(fp, szBuffer, charsmax(szBuffer));
if(!szBuffer[0] || szBuffer[0] == ';')
continue;
iNumParams = parse(
szBuffer,
g_szArrayData[map], charsmax(g_szArrayData[map]),
szMinpl, charsmax(szMinpl),
szMaxpl, charsmax(szMaxpl)
);
if(!iNumParams)
continue;
if(!valid_map(g_szArrayData[map]))
continue;
switch(iNumParams)
{
case 1:
{
if(g_iMapSortedByOnline == 1)
continue;
ArrayPushArray(g_arrAllMaps, g_szArrayData);
g_iMapSortedByOnline = 0;
#if defined NOMINATE
TrieSetCell(g_tAllowMaps, g_szArrayData[map], i); i++;
#endif
#if defined SAY_MAPS
menu_additem(g_iMapsMenu, g_szArrayData[map], g_szArrayData[map], 0, callback);
#endif
}
case 3:
{
if(g_iMapSortedByOnline == 0)
continue;
g_szArrayData[minpl] = str_to_num(szMinpl);
g_szArrayData[maxpl] = str_to_num(szMaxpl);
ArrayPushArray(g_arrAllMaps, g_szArrayData);
g_iMapSortedByOnline = 1;
#if defined NOMINATE
TrieSetCell(g_tAllowMaps, g_szArrayData[map], i); i++;
#endif
#if defined SAY_MAPS
menu_additem(g_iMapsMenu, g_szArrayData[map], g_szArrayData[map], 0, callback);
#endif
}
}
}
fclose(fp);
g_iNumAllMaps = ArraySize(g_arrAllMaps);
log_amx("Загружено %d карт из %s", g_iNumAllMaps, szFile);
log_amx("Режим сортировки карт по онлайну %s!", g_iMapSortedByOnline ? "включен" : "выключен");
#if defined NIGHTMODE
formatex(szFile, charsmax(szFile), "%s/nmaps.ini", szPath);
fp = fopen(szFile, "rt");
if(fp)
{
while(!feof(fp))
{
fgets(fp, szBuffer, charsmax(szBuffer));
if(!szBuffer[0] || szBuffer[0] == ';')
continue;
parse(szBuffer, g_szArrayData[map], charsmax(g_szArrayData[map]));
if(strcmp(g_szCurrentMap, g_szArrayData[map]) != 0)
ArrayPushArray(g_arrNightMaps, g_szArrayData);
}
fclose(fp);
g_iNumNightMaps = ArraySize(g_arrNightMaps);
log_amx("Загружено %d карт для NightMode[%d - %d] из %s", g_iNumNightMaps, NIGHT_START, NIGHT_END, szFile);
}
#endif
}
public ScreenFade(fade)
{
new flags;
new time = (0 <= fade <= 1) ? 4096 : 1;
new hold = (0 <= fade <= 1) ? 1024 : 1;
static mScreenFade; if(!mScreenFade) mScreenFade = get_user_msgid("ScreenFade");
switch(fade)
{
case 0:
{
flags = 2;
set_msg_block(mScreenFade, BLOCK_NOT);
}
case 1:
{
flags = 1;
set_task(1.0, "ScreenFade", 2);
}
case 2:
{
flags = 4;
set_msg_block(mScreenFade, BLOCK_SET);
}
}
message_begin(MSG_ALL, mScreenFade);
write_short(time);
write_short(hold);
write_short(flags);
write_byte(0);
write_byte(0);
write_byte(0);
write_byte(255);
message_end();
}
FrozenUsers(frozen)
{
#if defined NO_ROUND_SUPPORT
new players[MAX_PLAYERS], pnum;
get_players(players, pnum);
#endif
if(frozen)
{
#if defined NO_ROUND_SUPPORT
for(new i; i < pnum; ++i)
set_entvar(players[i], var_flags, get_entvar(players[i], var_flags) | FL_FROZEN);
if(g_HookChainPlayerSpawn)
EnableHookChain(g_HookChainPlayerSpawn);
else g_HookChainPlayerSpawn = RegisterHookChain(RG_CBasePlayer_Spawn, "CBasePlayer_Spawn_Post", true);
#else
set_pcvar_num(g_pFreezeTime, VOTE_TIME + 5);
#endif
#if defined BLOCK_CHATS
g_FM_SetClientListening = register_forward(FM_Voice_SetClientListening, "FM_SetClientListening_Pre", false);
#endif
}
else
{
#if defined NO_ROUND_SUPPORT
for(new i; i < pnum; ++i)
set_entvar(players[i], var_flags, get_entvar(players[i], var_flags) & ~FL_FROZEN);
DisableHookChain(g_HookChainPlayerSpawn);
#else
set_pcvar_num(g_pFreezeTime, g_iOldFreezeTime);
#endif
#if defined BLOCK_CHATS
unregister_forward(FM_Voice_SetClientListening, g_FM_SetClientListening, false);
#endif
}
}
ChangeLevel(mp[])
{
#if defined VSEM_SPS_SOUND
client_cmd(0, "spk %s", VSEM_SPS_SOUND);
#endif
emessage_begin(MSG_ALL, SVC_INTERMISSION);
emessage_end();
set_task(3.0, "SendCmd", .parameter = mp, .len = strlen(mp) + 1);
}
public SendCmd(mp[])
server_cmd("changelevel %s", mp);
stock bool:valid_map(mp[])
{
if(!is_map_valid(mp))
return false;
if(TrieKeyExists(g_tBlockMaps, mp))
return false;
return true;
}
stock bool:item_in_menu(mapid)
{
for(new i; i < g_iVoteItems; ++i)
if(g_iMenuItemId[i] == mapid)
return true;
return false;
}
stock bool:nominated_map(mapid)
{
for(new i; i < g_iNominateNum; ++i)
if(g_iNominated[i] == mapid)
return true;
return false;
}
stock bool:valid_rtv(id)
{
new iEstTime = get_systime() - g_iStartMap;
if(iEstTime > RTV_DELAY)
return true;
new frmt[190];
new temp = (RTV_DELAY - iEstTime) / 60;
if(temp < 1) formatex(frmt, charsmax(frmt), MSG_RTV_BLOCKED0);
else formatex(frmt, charsmax(frmt), MSG_RTV_BLOCKED, temp);
client_print_color(id, print_team_default, frmt);
return false;
}
stock bool:valid_maps_on_vote(players)
{
new count;
for(new i; i < g_iNumAllMaps; ++i)
{
ArrayGetArray(g_arrAllMaps, i, g_szArrayData);
if(g_szArrayData[minpl] <= players <= g_szArrayData[maxpl])
count++;
}
return (count >= MAP_ON_VOTE);
}
Код:
#include <amxmodx>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
#define PLUGIN "Map Manager"
#define VERSION "2.5.61"
#define AUTHOR "Mistrick"
#pragma semicolon 1
///******** Settings ********///
#define FUNCTION_NEXTMAP //replace default nextmap
#define FUNCTION_RTV
#define FUNCTION_NOMINATION
//#define FUNCTION_NIGHTMODE
#define FUNCTION_NIGHTMODE_BLOCK_CMDS
#define FUNCTION_BLOCK_MAPS
#define FUNCTION_SOUND
#define SELECT_MAPS 5
#define PRE_START_TIME 5
#define VOTE_TIME 10
#define NOMINATED_MAPS_IN_VOTE 3
#define NOMINATED_MAPS_PER_PLAYER 3
#define BLOCK_MAP_COUNT 5
#define MIN_DENOMINATE_TIME 3
new const PREFIX[] = "^4[MapManager]";
///**************************///
#if BLOCK_MAP_COUNT <= 1
#undef FUNCTION_BLOCK_MAPS
#endif
enum (+=100)
{
TASK_CHECKTIME = 100,
TASK_SHOWTIMER,
TASK_TIMER,
TASK_VOTEMENU,
TASK_CHANGETODEFAULT,
TASK_CHECKNIGHT
};
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
};
new Array: g_aMaps;
enum _:CVARS
{
CHANGE_TYPE,
START_VOTE_BEFORE_END,
SHOW_RESULT_TYPE,
SHOW_SELECTS,
START_VOTE_IN_NEW_ROUND,
FREEZE_IN_VOTE,
BLACK_SCREEN_IN_VOTE,
LAST_ROUND,
CHANGE_TO_DEDAULT,
DEFAULT_MAP,
EXTENDED_TYPE,
EXTENDED_MAX,
EXTENDED_TIME,
EXTENDED_ROUNDS,
#if defined FUNCTION_RTV
ROCK_MODE,
ROCK_PERCENT,
ROCK_PLAYERS,
ROCK_CHANGE_TYPE,
ROCK_DELAY,
#endif
#if defined FUNCTION_NOMINATION
NOMINATION_DONT_CLOSE_MENU,
NOMINATION_DEL_NON_CUR_ONLINE,
#endif
#if defined FUNCTION_NIGHTMODE
NIGHTMODE_TIME,
#endif
MAXROUNDS,
WINLIMIT,
TIMELIMIT,
FREEZETIME,
CHATTIME,
NEXTMAP,
ROUNDTIME
};
new const FILE_MAPS[] = "maps.ini";//configdir
#if defined FUNCTION_BLOCK_MAPS
new const FILE_BLOCKEDMAPS[] = "blockedmaps.ini";//datadir
#endif
#if defined FUNCTION_NIGHTMODE
new const FILE_NIGHTMAPS[] = "nightmaps.ini";//configdir
#endif
new g_pCvars[CVARS];
new g_iTeamScore[2];
new g_szCurrentMap[32];
new g_bVoteStarted;
new g_bVoteFinished;
new g_bNotUnlimitTime;
new g_eMenuItems[SELECT_MAPS + 1][VOTEMENU_INFO];
new g_iMenuItemsCount;
new g_iTotalVotes;
new g_iTimer;
new g_bPlayerVoted[33];
new g_iExtendedMax;
new g_bExtendMap;
new g_bStartVote;
new g_bChangedFreezeTime;
new Float:g_fOldTimeLimit;
new g_iForwardPreStartVote;
new g_iForwardStartVote;
new g_iForwardFinishVote;
#if defined FUNCTION_SOUND
new const g_szSound[][] =
{
"sound/fvox/one.wav", "sound/fvox/two.wav", "sound/fvox/three.wav", "sound/fvox/four.wav", "sound/fvox/five.wav",
"sound/fvox/six.wav", "sound/fvox/seven.wav", "sound/fvox/eight.wav", "sound/fvox/nine.wav", "sound/fvox/ten.wav"
};
#endif
#if defined FUNCTION_RTV
new g_bRockVoted[33];
new g_iRockVotes;
new g_bRockVote;
#endif
#if defined FUNCTION_NOMINATION
new Array:g_aNominatedMaps;
new g_iNominatedMaps[33];
new g_iLastDenominate[33];
new Array:g_aMapPrefixes;
new g_iMapPrefixesNum;
#endif
#if defined FUNCTION_BLOCK_MAPS
new g_iBlockedSize;
#endif
#if defined FUNCTION_NIGHTMODE
new Array:g_aNightMaps;
new g_bNightMode;
new g_bNightModeOneMap;
new g_bCurMapInNightMode;
new Float:g_fOldNightTimeLimit;
#if defined FUNCTION_NIGHTMODE_BLOCK_CMDS
new g_szBlockedCmds[][] =
{
"amx_map", "amx_votemap", "amx_mapmenu", "amx_votemapmenu"
};
#endif
#endif
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
register_cvar("mapm_version", VERSION, FCVAR_SERVER | FCVAR_SPONLY);
g_pCvars[CHANGE_TYPE] = register_cvar("mapm_change_type", "2");//0 - after end vote, 1 - in round end, 2 - after end map
g_pCvars[START_VOTE_BEFORE_END] = register_cvar("mapm_start_vote_before_end", "2");//minutes
g_pCvars[SHOW_RESULT_TYPE] = register_cvar("mapm_show_result_type", "1");//0 - disable, 1 - menu, 2 - hud
g_pCvars[SHOW_SELECTS] = register_cvar("mapm_show_selects", "1");//0 - disable, 1 - all
g_pCvars[START_VOTE_IN_NEW_ROUND] = register_cvar("mapm_start_vote_in_new_round", "0");//0 - disable, 1 - enable
g_pCvars[FREEZE_IN_VOTE] = register_cvar("mapm_freeze_in_vote", "0");//0 - disable, 1 - enable, if mapm_start_vote_in_new_round 1
g_pCvars[BLACK_SCREEN_IN_VOTE] = register_cvar("mapm_black_screen_in_vote", "0");//0 - disable, 1 - enable
g_pCvars[LAST_ROUND] = register_cvar("mapm_last_round", "0");//0 - disable, 1 - enable
g_pCvars[CHANGE_TO_DEDAULT] = register_cvar("mapm_change_to_default_map", "0");//minutes, 0 - disable
g_pCvars[DEFAULT_MAP] = register_cvar("mapm_default_map", "de_dust2");
g_pCvars[EXTENDED_TYPE] = register_cvar("mapm_extended_type", "0");//0 - minutes, 1 - rounds
g_pCvars[EXTENDED_MAX] = register_cvar("mapm_extended_map_max", "3");
g_pCvars[EXTENDED_TIME] = register_cvar("mapm_extended_time", "15");//minutes
g_pCvars[EXTENDED_ROUNDS] = register_cvar("mapm_extended_rounds", "3");//rounds
#if defined FUNCTION_RTV
g_pCvars[ROCK_MODE] = register_cvar("mapm_rtv_mode", "0");//0 - percents, 1 - players
g_pCvars[ROCK_PERCENT] = register_cvar("mapm_rtv_percent", "60");
g_pCvars[ROCK_PLAYERS] = register_cvar("mapm_rtv_players", "5");
g_pCvars[ROCK_CHANGE_TYPE] = register_cvar("mapm_rtv_change_type", "1");//0 - after vote, 1 - in round end
g_pCvars[ROCK_DELAY] = register_cvar("mapm_rtv_delay", "0");//minutes
#endif
#if defined FUNCTION_NOMINATION
g_pCvars[NOMINATION_DONT_CLOSE_MENU] = register_cvar("mapm_nom_dont_close_menu", "0");//0 - disable, 1 - enable
g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE] = register_cvar("mapm_nom_del_noncur_online", "0");//0 - disable, 1 - enable
#endif
#if defined FUNCTION_NIGHTMODE
g_pCvars[NIGHTMODE_TIME] = register_cvar("mapm_night_time", "00:00 8:00");
#endif
g_pCvars[MAXROUNDS] = get_cvar_pointer("mp_maxrounds");
g_pCvars[WINLIMIT] = get_cvar_pointer("mp_winlimit");
g_pCvars[TIMELIMIT] = get_cvar_pointer("mp_timelimit");
g_pCvars[FREEZETIME] = get_cvar_pointer("mp_freezetime");
g_pCvars[ROUNDTIME] = get_cvar_pointer("mp_roundtime");
g_pCvars[NEXTMAP] = register_cvar("amx_nextmap", "", FCVAR_SERVER|FCVAR_EXTDLL|FCVAR_SPONLY);
#if defined FUNCTION_NEXTMAP
g_pCvars[CHATTIME] = get_cvar_pointer("mp_chattime");
#endif
register_event("TeamScore", "Event_TeamScore", "a");
register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
#if defined FUNCTION_NEXTMAP
register_event("30", "Event_Intermisson", "a");
#endif
register_concmd("mapm_debug", "Commang_Debug", ADMIN_MAP);
register_concmd("mapm_startvote", "Command_StartVote", ADMIN_MAP);
register_concmd("mapm_stopvote", "Command_StopVote", ADMIN_MAP);
register_clcmd("say timeleft", "Command_Timeleft");
register_clcmd("say thetime", "Command_TheTime");
register_clcmd("votemap", "Command_Votemap");
#if defined FUNCTION_NEXTMAP
register_clcmd("say nextmap", "Command_Nextmap");
register_clcmd("say currentmap", "Command_CurrentMap");
#endif
#if defined FUNCTION_RTV
register_clcmd("say rtv", "Command_RockTheVote");
register_clcmd("say /rtv", "Command_RockTheVote");
#endif
#if defined FUNCTION_NOMINATION
register_clcmd("say", "Command_Say");
register_clcmd("say_team", "Command_Say");
register_clcmd("say maps", "Command_MapsList");
register_clcmd("say /maps", "Command_MapsList");
#endif
#if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS
for(new i; i < sizeof(g_szBlockedCmds); i++)
{
register_clcmd(g_szBlockedCmds[i], "Command_BlockedCmds");
}
#endif
g_iForwardPreStartVote = CreateMultiForward("mapmanager_prestartvote", ET_IGNORE);
g_iForwardStartVote = CreateMultiForward("mapmanager_startvote", ET_IGNORE);
g_iForwardFinishVote = CreateMultiForward("mapmanager_finishvote", ET_IGNORE);
register_menucmd(register_menuid("VoteMenu"), 1023, "VoteMenu_Handler");
set_task(10.0, "Task_CheckTime", TASK_CHECKTIME, .flags = "b");
#if defined FUNCTION_NIGHTMODE
set_task(60.0, "Task_CheckNight", TASK_CHECKNIGHT, .flags = "b");
#endif
}
#if defined FUNCTION_NIGHTMODE
public plugin_natives()
{
register_native("is_night_mode", "Native_IsNightMode");
}
public Native_IsNightMode()
{
return g_bNightMode;
}
#endif
#if defined FUNCTION_NIGHTMODE && defined FUNCTION_NIGHTMODE_BLOCK_CMDS
public Command_BlockedCmds(id)
{
if(g_bNightMode)
{
console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD");
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
#endif
public Command_Votemap(id)
{
return PLUGIN_HANDLED;
}
public Commang_Debug(id, flag)
{
if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
console_print(id, "^nLoaded maps:");
new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
for(new i; i < iSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
console_print(id, "%3d %32s ^t%d^t%d^t%d", i, eMapInfo[m_MapName], eMapInfo[m_MinPlayers], eMapInfo[m_MaxPlayers], eMapInfo[m_BlockCount]);
}
#if defined FUNCTION_NOMINATION
new szPrefix[32];
console_print(id, "^nLoaded prefixes:");
for(new i; i < g_iMapPrefixesNum; i++)
{
ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix));
console_print(id, "%s", szPrefix);
}
#endif
return PLUGIN_HANDLED;
}
public Command_StartVote(id, flag)
{
if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode && g_bNightModeOneMap)
{
console_print(id, "%L", LANG_PLAYER, "MAPM_NIGHT_BLOCK_CMD");
return PLUGIN_HANDLED;
}
#endif
if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0)
{
StartVote(id);
}
else
{
SetNewRoundVote();
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_VOTE_WILL_BEGIN");
}
return PLUGIN_HANDLED;
}
public Command_StopVote(id, flag)
{
if(~get_user_flags(id) & flag) return PLUGIN_HANDLED;
if(g_bVoteStarted)
{
g_bVoteStarted = false;
#if defined FUNCTION_RTV
g_bRockVote = false;
g_iRockVotes = 0;
arrayset(g_bRockVoted, false, 33);
#endif
if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
{
SetBlackScreenFade(0);
}
if(g_bChangedFreezeTime)
{
set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
g_bChangedFreezeTime = false;
}
remove_task(TASK_VOTEMENU);
remove_task(TASK_SHOWTIMER);
remove_task(TASK_TIMER);
for(new i = 1; i <= 32; i++)
remove_task(TASK_VOTEMENU + i);
show_menu(0, 0, "^n", 1);
new szName[32];
if(id) get_user_name(id, szName, charsmax(szName));
else szName = "Server";
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CANCEL_VOTE", szName);
log_amx("%s canceled vote.", szName);
}
return PLUGIN_HANDLED;
}
public Command_Timeleft(id)
{
new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
if((iWinLimit || iMaxRounds) && get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1)
{
new szText[128], len;
len = formatex(szText, charsmax(szText), "%L ", LANG_PLAYER, "MAPM_TIME_TO_END");
if(iWinLimit)
{
new iLeftWins = iWinLimit - max(g_iTeamScore[0], g_iTeamScore[1]);
new szWins[16]; get_ending(iLeftWins, "MAPM_WIN1", "MAPM_WIN2", "MAPM_WIN3", szWins, charsmax(szWins));
len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftWins, LANG_PLAYER, szWins);
}
if(iWinLimit && iMaxRounds)
{
len += formatex(szText[len], charsmax(szText) - len, " %L ", LANG_PLAYER, "MAPM_TIMELEFT_OR");
}
if(iMaxRounds)
{
new iLeftRounds = iMaxRounds - g_iTeamScore[0] - g_iTeamScore[1];
new szRounds[16]; get_ending(iLeftRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds));
len += formatex(szText[len], charsmax(szText) - len, "%d %L", iLeftRounds, LANG_PLAYER, szRounds);
}
client_print_color(0, print_team_default, "%s^1 %s.", PREFIX, szText);
}
else
{
if (get_pcvar_num(g_pCvars[TIMELIMIT]))
{
new a = get_timeleft();
client_print_color(0, id, "%s^1 %L:^3 %d:%02d", PREFIX, LANG_PLAYER, "MAPM_TIME_TO_END", (a / 60), (a % 60));
}
else
{
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NO_TIMELIMIT");
}
}
}
public Command_TheTime(id)
{
new szTime[64]; get_time("%Y/%m/%d - %H:%M:%S", szTime, charsmax(szTime));
client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_THETIME", szTime);
}
#if defined FUNCTION_NEXTMAP
public Command_Nextmap(id)
{
if(g_bVoteFinished)
{
new szMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMap, charsmax(szMap));
client_print_color(0, id, "%s^1 %L ^3%s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMap);
}
else
{
client_print_color(0, id, "%s^1 %L ^3%L^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", LANG_PLAYER, "MAPM_NOT_SELECTED");
}
}
public Command_CurrentMap(id)
{
client_print_color(0, id, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_CURRENT_MAP", g_szCurrentMap);
}
#endif
#if defined FUNCTION_RTV
public Command_RockTheVote(id)
{
if(g_bVoteFinished || g_bVoteStarted || g_bStartVote) return PLUGIN_HANDLED;
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode && g_bNightModeOneMap)
{
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE");
return PLUGIN_HANDLED;
}
#endif
new iTime = get_pcvar_num(g_pCvars[ROCK_DELAY]) * 60 - (floatround(get_pcvar_float(g_pCvars[TIMELIMIT]) * 60.0) - get_timeleft());
if(iTime > 0)
{
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_DELAY", iTime / 60, iTime % 60);
return PLUGIN_HANDLED;
}
if(!g_bRockVoted[id]) g_iRockVotes++;
new iVotes = (get_pcvar_num(g_pCvars[ROCK_MODE])) ? get_pcvar_num(g_pCvars[ROCK_PLAYERS]) - g_iRockVotes : floatround(get_players_num() * get_pcvar_num(g_pCvars[ROCK_PERCENT]) / 100.0, floatround_ceil) - g_iRockVotes;
if(iVotes <= 0)
{
g_bRockVote = true;
if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
{
StartVote(0);
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_RTV_START_VOTE");
}
else
{
SetNewRoundVote();
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_START_VOTE_NEW_ROUND");
}
return PLUGIN_HANDLED;
}
new szVote[16]; get_ending(iVotes, "MAPM_VOTE1", "MAPM_VOTE2", "MAPM_VOTE3", szVote, charsmax(szVote));
if(!g_bRockVoted[id])
{
g_bRockVoted[id] = true;
new szName[33]; get_user_name(id, szName, charsmax(szName));
client_print_color(0, print_team_default, "%s^3 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_VOTED", szName, iVotes, LANG_PLAYER, szVote);
}
else
{
client_print_color(id, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_RTV_ALREADY_VOTED", iVotes, LANG_PLAYER, szVote);
}
return PLUGIN_HANDLED;
}
#endif
#if defined FUNCTION_NOMINATION
public Command_Say(id)
{
if(g_bVoteStarted || g_bVoteFinished) return;
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode) return;
#endif
new szText[32]; read_args(szText, charsmax(szText));
remove_quotes(szText); trim(szText); strtolower(szText);
if(string_with_space(szText)) return;
new map_index = is_map_in_array(szText);
if(map_index)
{
NominateMap(id, szText, map_index - 1);
}
else if(strlen(szText) >= 4)
{
new szFormat[32], szPrefix[32], Array:aNominateList = ArrayCreate(), iArraySize;
for(new i; i < g_iMapPrefixesNum; i++)
{
ArrayGetString(g_aMapPrefixes, i, szPrefix, charsmax(szPrefix));
formatex(szFormat, charsmax(szFormat), "%s%s", szPrefix, szText);
map_index = 0;
while((map_index = find_similar_map(map_index, szFormat)))
{
ArrayPushCell(aNominateList, map_index - 1);
iArraySize++;
}
}
if(iArraySize == 1)
{
map_index = ArrayGetCell(aNominateList, 0);
new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo);
copy(szFormat, charsmax(szFormat), eMapInfo[m_MapName]);
NominateMap(id, szFormat, map_index);
}
else if(iArraySize > 1)
{
Show_NominationList(id, aNominateList, iArraySize);
}
ArrayDestroy(aNominateList);
}
}
public Show_NominationList(id, Array: array, size)
{
new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_FAST_NOM");
new iMenu = menu_create(szText, "NominationList_Handler");
new eMapInfo[MAP_INFO], szString[64], map_index, nominate_index;
for(new i, szNum[8]; i < size; i++)
{
map_index = ArrayGetCell(array, i);
ArrayGetArray(g_aMaps, map_index, eMapInfo);
num_to_str(map_index, szNum, charsmax(szNum));
nominate_index = is_map_nominated(map_index);
if(eMapInfo[m_BlockCount])
{
formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]);
menu_additem(iMenu, szString, szNum, (1 << 31));
}
else if(nominate_index)
{
new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
if(id == eNomInfo[n_Player])
{
formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]);
menu_additem(iMenu, szString, szNum);
}
else
{
formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]);
menu_additem(iMenu, szString, szNum, (1 << 31));
}
}
else
{
menu_additem(iMenu, eMapInfo[m_MapName], szNum);
}
}
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK");
menu_setprop(iMenu, MPROP_BACKNAME, szText);
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT");
menu_setprop(iMenu, MPROP_NEXTNAME, szText);
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT");
menu_setprop(iMenu, MPROP_EXITNAME, szText);
menu_display(id, iMenu);
}
public NominationList_Handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new szData[8], szName[32], iAccess, iCallback;
menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback);
new map_index = str_to_num(szData);
trim_bracket(szName);
new is_map_nominated = NominateMap(id, szName, map_index);
if(is_map_nominated == 2 || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU]))
{
if(is_map_nominated == 1)
{
new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName);
menu_item_setname(menu, item, szString);
}
else if(is_map_nominated == 2)
{
menu_item_setname(menu, item, szName);
}
menu_display(id, menu);
}
else
{
menu_destroy(menu);
}
return PLUGIN_HANDLED;
}
NominateMap(id, map[32], map_index)
{
new eMapInfo[MAP_INFO]; ArrayGetArray(g_aMaps, map_index, eMapInfo);
#if defined FUNCTION_BLOCK_MAPS
if(eMapInfo[m_BlockCount])
{
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_NOT_AVAILABLE_MAP");
return 0;
}
#endif
new eNomInfo[NOMINATEDMAP_INFO];
new szName[32]; get_user_name(id, szName, charsmax(szName));
new nominate_index = is_map_nominated(map_index);
if(nominate_index)
{
ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
if(id == eNomInfo[n_Player])
{
new iSysTime = get_systime();
if(g_iLastDenominate[id] + MIN_DENOMINATE_TIME <= iSysTime)
{
g_iLastDenominate[id] = iSysTime;
g_iNominatedMaps[id]--;
ArrayDeleteItem(g_aNominatedMaps, nominate_index - 1);
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_REMOVE_NOM", szName, map);
return 2;
}
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_SPAM");
return 0;
}
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_ALREADY_NOM");
return 0;
}
if(g_iNominatedMaps[id] >= NOMINATED_MAPS_PER_PLAYER)
{
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_CANT_NOM");
return 0;
}
eNomInfo[n_MapName] = map;
eNomInfo[n_Player] = id;
eNomInfo[n_MapIndex] = map_index;
ArrayPushArray(g_aNominatedMaps, eNomInfo);
g_iNominatedMaps[id]++;
if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE]))
{
new iMinPlayers = eMapInfo[m_MinPlayers] == 0 ? 1 : eMapInfo[m_MinPlayers];
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP2", szName, map, iMinPlayers, eMapInfo[m_MaxPlayers]);
}
else
{
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NOM_MAP", szName, map);
}
return 1;
}
public Command_MapsList(id)
{
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode)
{
client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NOT_AVAILABLE");
return;
}
#endif
Show_MapsListMenu(id);
}
Show_MapsListMenu(id)
{
new szText[64]; formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_MAP_LIST");
new iMenu = menu_create(szText, "MapsListMenu_Handler");
new eMapInfo[MAP_INFO], szString[48], iSize = ArraySize(g_aMaps);
for(new i, nominate_index; i < iSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
nominate_index = is_map_nominated(i);
if(eMapInfo[m_BlockCount])
{
formatex(szString, charsmax(szString), "%s[\r%d\d]", eMapInfo[m_MapName], eMapInfo[m_BlockCount]);
menu_additem(iMenu, szString, _, (1 << 31));
}
else if(nominate_index)
{
new eNomInfo[NOMINATEDMAP_INFO]; ArrayGetArray(g_aNominatedMaps, nominate_index - 1, eNomInfo);
if(id == eNomInfo[n_Player])
{
formatex(szString, charsmax(szString), "%s[\y*\w]", eMapInfo[m_MapName]);
menu_additem(iMenu, szString);
}
else
{
formatex(szString, charsmax(szString), "%s[\y*\d]", eMapInfo[m_MapName]);
menu_additem(iMenu, szString, _, (1 << 31));
}
}
else
{
menu_additem(iMenu, eMapInfo[m_MapName]);
}
}
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_BACK");
menu_setprop(iMenu, MPROP_BACKNAME, szText);
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_NEXT");
menu_setprop(iMenu, MPROP_NEXTNAME, szText);
formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "MAPM_MENU_EXIT");
menu_setprop(iMenu, MPROP_EXITNAME, szText);
menu_display(id, iMenu);
}
public MapsListMenu_Handler(id, menu, item)
{
if(item == MENU_EXIT)
{
menu_destroy(menu);
return PLUGIN_HANDLED;
}
new szData[2], szName[32], iAccess, iCallback;
menu_item_getinfo(menu, item, iAccess, szData, charsmax(szData), szName, charsmax(szName), iCallback);
new map_index = item;
trim_bracket(szName);
new is_map_nominated = NominateMap(id, szName, map_index);
if(g_iNominatedMaps[id] < NOMINATED_MAPS_PER_PLAYER || get_pcvar_num(g_pCvars[NOMINATION_DONT_CLOSE_MENU]))
{
if(is_map_nominated == 1)
{
new szString[48]; formatex(szString, charsmax(szString), "%s[\y*\w]", szName);
menu_item_setname(menu, item, szString);
}
else if(is_map_nominated == 2)
{
menu_item_setname(menu, item, szName);
}
menu_display(id, menu, map_index / 7);
}
else
{
menu_destroy(menu);
}
return PLUGIN_HANDLED;
}
#endif
public client_putinserver(id)
{
if(!is_user_bot(id) && !is_user_hltv(id))
remove_task(TASK_CHANGETODEFAULT);
}
public client_disconnect(id)
{
remove_task(id + TASK_VOTEMENU);
#if defined FUNCTION_RTV
if(g_bRockVoted[id])
{
g_bRockVoted[id] = false;
g_iRockVotes--;
}
#endif
#if defined FUNCTION_NOMINATION
if(g_iNominatedMaps[id])
{
clear_nominated_maps(id);
}
#endif
#if defined FUNCTION_NIGHTMODE
if(!g_bNightMode) set_task(1.0, "Task_DelayedChangeToDelault");
#else
set_task(1.0, "Task_DelayedChangeToDelault");
#endif
}
public Task_DelayedChangeToDelault()
{
new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]);
if(fChangeTime > 0.0 && get_players_num() == 0)
{
set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT);
}
}
public Task_ChangeToDefault()
{
new szMapName[32]; get_pcvar_string(g_pCvars[DEFAULT_MAP], szMapName, charsmax(szMapName));
if(get_players_num() == 0 && is_map_valid(szMapName) && !equali(szMapName, g_szCurrentMap))
{
log_amx("Map changed to default[%s]", szMapName);
set_pcvar_string(g_pCvars[NEXTMAP], szMapName);
Intermission();
}
}
public plugin_end()
{
#if defined FUNCTION_NIGHTMODE
if(g_fOldNightTimeLimit > 0.0)
{
set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit);
}
#endif
if(g_bChangedFreezeTime)
{
set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
}
if(g_fOldTimeLimit > 0.0)
{
set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit);
}
if(g_iExtendedMax)
{
if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 0)
{
set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) - float(g_iExtendedMax * get_pcvar_num(g_pCvars[EXTENDED_TIME])));
}
else
{
new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
if(iWinLimit > 0)
{
set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax);
}
new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
if(iMaxRounds > 0)
{
set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds - get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]) * g_iExtendedMax);
}
}
}
}
public plugin_cfg()
{
new filepath[256]; get_localinfo("amxx_configsdir", filepath, charsmax(filepath));
add(filepath, charsmax(filepath), "/mapmanager.cfg");
if(file_exists(filepath))
{
server_cmd("exec %s", filepath);
server_exec();
}
g_aMaps = ArrayCreate(MAP_INFO);
#if defined FUNCTION_NOMINATION
g_aNominatedMaps = ArrayCreate(NOMINATEDMAP_INFO);
g_aMapPrefixes = ArrayCreate(32);
#endif
if( is_plugin_loaded("Nextmap Chooser") > -1 )
{
pause("cd", "mapchooser.amxx");
log_amx("MapManager: mapchooser.amxx has been stopped.");
}
#if defined FUNCTION_NEXTMAP
if( is_plugin_loaded("NextMap") > -1 )
{
pause("cd", "nextmap.amxx");
log_amx("MapManager: nextmap.amxx has been stopped.");
}
#endif
LoadMapsFromFile();
#if defined FUNCTION_NIGHTMODE
LoadNightMaps();
#endif
new Float:fChangeTime = get_pcvar_float(g_pCvars[CHANGE_TO_DEDAULT]);
if(fChangeTime > 0.0)
{
set_task(fChangeTime * 60.0, "Task_ChangeToDefault", TASK_CHANGETODEFAULT);
}
register_dictionary("mapmanager.txt");
}
LoadMapsFromFile()
{
new szDir[128], szFile[128];
get_mapname(g_szCurrentMap, charsmax(g_szCurrentMap));
#if defined FUNCTION_BLOCK_MAPS
get_localinfo("amxx_datadir", szDir, charsmax(szDir));
formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_BLOCKEDMAPS);
new Array:aBlockedMaps = ArrayCreate(BLOCKEDMAP_INFO);
new eBlockedInfo[BLOCKEDMAP_INFO];
if(file_exists(szFile))
{
new szTemp[128]; formatex(szTemp, charsmax(szTemp), "%s/temp.ini", szDir);
new iFile = fopen(szFile, "rt");
new iTemp = fopen(szTemp, "wt");
new szBuffer[42], szMapName[32], szCount[8], iCount;
while(!feof(iFile))
{
fgets(iFile, szBuffer, charsmax(szBuffer));
parse(szBuffer, szMapName, charsmax(szMapName), szCount, charsmax(szCount));
if(!is_map_valid(szMapName) || is_map_blocked(aBlockedMaps, szMapName) || equali(szMapName, g_szCurrentMap)) continue;
iCount = str_to_num(szCount) - 1;
if(iCount <= 0) continue;
if(iCount > BLOCK_MAP_COUNT)
{
fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, BLOCK_MAP_COUNT);
iCount = BLOCK_MAP_COUNT;
}
else
{
fprintf(iTemp, "^"%s^" ^"%d^"^n", szMapName, iCount);
}
formatex(eBlockedInfo[b_MapName], charsmax(eBlockedInfo[b_MapName]), szMapName);
eBlockedInfo[b_Count] = iCount;
ArrayPushArray(aBlockedMaps, eBlockedInfo);
}
fprintf(iTemp, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT);
fclose(iFile);
fclose(iTemp);
delete_file(szFile);
rename_file(szTemp, szFile, 1);
}
else
{
new iFile = fopen(szFile, "wt");
if(iFile)
{
fprintf(iFile, "^"%s^" ^"%d^"^n", g_szCurrentMap, BLOCK_MAP_COUNT);
}
fclose(iFile);
}
#endif
get_localinfo("amxx_configsdir", szDir, charsmax(szDir));
formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_MAPS);
if(file_exists(szFile))
{
new f = fopen(szFile, "rt");
if(f)
{
new eMapInfo[MAP_INFO];
new szText[48], szMap[32], szMin[3], szMax[3];
while(!feof(f))
{
fgets(f, szText, charsmax(szText));
parse(szText, szMap, charsmax(szMap), szMin, charsmax(szMin), szMax, charsmax(szMax));
if(!szMap[0] || szMap[0] == ';' || !valid_map(szMap) || is_map_in_array(szMap) || equali(szMap, g_szCurrentMap)) continue;
#if defined FUNCTION_BLOCK_MAPS
new blocked_index = is_map_blocked(aBlockedMaps, szMap);
if(blocked_index)
{
ArrayGetArray(aBlockedMaps, blocked_index - 1, eBlockedInfo);
eMapInfo[m_BlockCount] = eBlockedInfo[b_Count];
}
else
{
eMapInfo[m_BlockCount] = 0;
}
#endif
#if defined FUNCTION_NOMINATION
new szPrefix[32];
if(get_map_prefix(szMap, szPrefix, charsmax(szPrefix)) && !is_prefix_in_array(szPrefix))
{
ArrayPushString(g_aMapPrefixes, szPrefix);
g_iMapPrefixesNum++;
}
#endif
eMapInfo[m_MapName] = szMap;
eMapInfo[m_MinPlayers] = str_to_num(szMin);
eMapInfo[m_MaxPlayers] = str_to_num(szMax) == 0 ? 32 : str_to_num(szMax);
ArrayPushArray(g_aMaps, eMapInfo);
szMin = ""; szMax = "";
}
fclose(f);
new iSize = ArraySize(g_aMaps);
if(iSize == 0)
{
set_fail_state("Nothing loaded from file.");
}
#if defined FUNCTION_BLOCK_MAPS
g_iBlockedSize = ArraySize(aBlockedMaps);
if(iSize - g_iBlockedSize < SELECT_MAPS)
{
log_amx("LoadMaps: warning to little maps without block [%d]", iSize - g_iBlockedSize);
}
if(iSize - g_iBlockedSize < 1)
{
log_amx("LoadMaps: blocked maps cleared");
clear_blocked_maps();
}
ArrayDestroy(aBlockedMaps);
#endif
#if defined FUNCTION_NEXTMAP
new iRandomMap = random_num(0, iSize - 1);
ArrayGetArray(g_aMaps, iRandomMap, eMapInfo);
set_pcvar_string(g_pCvars[NEXTMAP], eMapInfo[m_MapName]);
#endif
}
}
else
{
set_fail_state("Maps file doesn't exist.");
}
}
#if defined FUNCTION_NIGHTMODE
LoadNightMaps()
{
g_aNightMaps = ArrayCreate(32);
new szDir[128]; get_localinfo("amxx_configsdir", szDir, charsmax(szDir));
new szFile[128]; formatex(szFile, charsmax(szFile), "%s/%s", szDir, FILE_NIGHTMAPS);
new iMapsCount;
if(file_exists(szFile))
{
new szMapName[32], f = fopen(szFile, "rt");
if(f)
{
while(!feof(f))
{
fgets(f, szMapName, charsmax(szMapName));
trim(szMapName); remove_quotes(szMapName);
if(!szMapName[0] || szMapName[0] == ';' || !valid_map(szMapName) || is_map_in_night_array(szMapName))
continue;
ArrayPushString(g_aNightMaps, szMapName);
iMapsCount++;
}
fclose(f);
}
}
if(iMapsCount < 1)
{
log_amx("LoadNightMaps: Need more maps");
remove_task(TASK_CHECKNIGHT);
}
else if(iMapsCount == 1)
{
g_bNightModeOneMap = true;
}
if(is_map_in_night_array(g_szCurrentMap))
{
g_bCurMapInNightMode = true;
}
if(iMapsCount >= 1)
{
set_task(10.0, "Task_CheckNight");
}
}
#endif
#if defined FUNCTION_NEXTMAP
public Event_Intermisson()
{
new Float:fChatTime = get_pcvar_float(g_pCvars[CHATTIME]);
set_pcvar_float(g_pCvars[CHATTIME], fChatTime + 2.0);
set_task(fChatTime, "DelayedChange");
}
public DelayedChange()
{
new szNextMap[32]; get_pcvar_string(g_pCvars[NEXTMAP], szNextMap, charsmax(szNextMap));
set_pcvar_float(g_pCvars[CHATTIME], get_pcvar_float(g_pCvars[CHATTIME]) - 2.0);
server_cmd("changelevel %s", szNextMap);
}
#endif
public Event_NewRound()
{
new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
if(!g_bVoteFinished && iMaxRounds && (g_iTeamScore[0] + g_iTeamScore[1]) >= iMaxRounds - 2)
{
log_amx("StartVote: maxrounds %d [%d]", iMaxRounds, g_iTeamScore[0] + g_iTeamScore[1]);
StartVote(0);
}
new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]) - 2;
if(!g_bVoteFinished && iWinLimit > 0 && (g_iTeamScore[0] >= iWinLimit || g_iTeamScore[1] >= iWinLimit))
{
log_amx("StartVote: winlimit %d [%d/%d]", iWinLimit, g_iTeamScore[0], g_iTeamScore[1]);
StartVote(0);
}
if(g_bStartVote)
{
log_amx("StartVote: timeleft %d, new round", get_timeleft());
StartVote(0);
}
if(!g_bChangedFreezeTime && g_bVoteStarted && get_pcvar_num(g_pCvars[FREEZE_IN_VOTE]) && get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
{
g_bChangedFreezeTime = true;
set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) + float(PRE_START_TIME + VOTE_TIME + 1));
}
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode && g_bVoteFinished && (g_bNightModeOneMap && get_pcvar_num(g_pCvars[CHANGE_TYPE]) >= 1 || !g_bCurMapInNightMode))
{
Intermission();
new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName));
client_print_color(0, print_team_default, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXTMAP", szMapName);
return;
}
#endif
#if defined FUNCTION_RTV
if(g_bVoteFinished && (g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[LAST_ROUND])))
#else
if(g_bVoteFinished && (get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[LAST_ROUND])))
#endif
{
Intermission();
new szMapName[32]; get_pcvar_string(g_pCvars[NEXTMAP], szMapName, charsmax(szMapName));
client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", szMapName);
}
}
public Event_TeamScore()
{
new team[2]; read_data(1, team, charsmax(team));
g_iTeamScore[(team[0]=='C') ? 0 : 1] = read_data(2);
}
public Task_CheckTime()
{
if(g_bVoteStarted || g_bVoteFinished) return PLUGIN_CONTINUE;
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode && g_bNightModeOneMap) return PLUGIN_CONTINUE;
#endif
if(get_pcvar_float(g_pCvars[TIMELIMIT]) <= 0.0) return PLUGIN_CONTINUE;
new Float:fTimeToVote = get_pcvar_float(g_pCvars[START_VOTE_BEFORE_END]);
new iTimeLeft = get_timeleft();
if(iTimeLeft <= floatround(fTimeToVote * 60.0))
{
if(!get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]))
{
log_amx("StartVote: timeleft %d", iTimeLeft);
StartVote(0);
}
else
{
SetNewRoundVote();
}
}
return PLUGIN_CONTINUE;
}
#if defined FUNCTION_NIGHTMODE
public Task_CheckNight()
{
new szTime[16]; get_pcvar_string(g_pCvars[NIGHTMODE_TIME], szTime, charsmax(szTime));
new szStart[8], szEnd[8]; parse(szTime, szStart, charsmax(szStart), szEnd, charsmax(szEnd));
new iStartHour, iStartMinutes, iEndHour, iEndMinutes;
get_int_time(szStart, iStartHour, iStartMinutes);
get_int_time(szEnd, iEndHour, iEndMinutes);
new iCurHour, iCurMinutes; time(iCurHour, iCurMinutes);
new bOldNightMode = g_bNightMode;
if(iStartHour != iEndHour && (iStartHour == iCurHour && iCurMinutes >= iStartMinutes || iEndHour == iCurHour && iCurMinutes < iEndMinutes))
{
g_bNightMode = true;
}
else if(iStartHour == iEndHour && iStartMinutes <= iCurMinutes < iEndMinutes)
{
g_bNightMode = true;
}
else if(iStartHour > iEndHour && (iStartHour < iCurHour < 24 || 0 <= iCurHour < iEndHour))
{
g_bNightMode = true;
}
else if(iStartHour < iCurHour < iEndHour)
{
g_bNightMode = true;
}
else
{
g_bNightMode = false;
}
if(g_bNightMode && !bOldNightMode)// NightMode ON
{
if(g_bNightModeOneMap)
{
if(g_bCurMapInNightMode)
{
g_fOldNightTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_ON", iEndHour, iEndMinutes);
}
else
{
new szMapName[32]; ArrayGetString(g_aNightMaps, 0, szMapName, charsmax(szMapName));
set_pcvar_string(g_pCvars[NEXTMAP], szMapName);
if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
{
Intermission();
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL", szMapName);
}
else
{
g_bVoteFinished = true;
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE", szMapName);
}
}
}
else if(!g_bCurMapInNightMode)
{
if(get_pcvar_num(g_pCvars[START_VOTE_IN_NEW_ROUND]) == 0)
{
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_CHANGELEVEL2");
StartVote(0);
}
else
{
SetNewRoundVote();
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_NEXT_ROUND_CHANGE2");
}
}
}
else if(!g_bNightMode && bOldNightMode)// NightMode OFF
{
if(g_bNightModeOneMap)
{
set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldNightTimeLimit);
}
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NIGHT_OFF");
}
}
#endif
SetNewRoundVote()
{
g_bStartVote = true;
g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
if(g_fOldTimeLimit > 0.0)
{
g_bNotUnlimitTime = true;
set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
}
}
public StartVote(id)
{
if(g_bVoteStarted) return 0;
#if defined FUNCTION_NIGHTMODE
if(g_bNightModeOneMap && g_bNightMode)
{
return 0;
}
#endif
g_bVoteStarted = true;
g_bStartVote = false;
ResetInfo();
CheckAllowExtendMap();
#if defined FUNCTION_NIGHTMODE
if(g_bNightMode)
{
new iNightSize = ArraySize(g_aNightMaps);
g_iMenuItemsCount = min(min(g_bCurMapInNightMode ? iNightSize - 1 : iNightSize, SELECT_MAPS), 8);
for(new Item, iRandomMap, szMapName[32]; Item < g_iMenuItemsCount; Item++)
{
do
{
iRandomMap = random_num(0, iNightSize - 1);
ArrayGetString(g_aNightMaps, iRandomMap, szMapName, charsmax(szMapName));
}
while(is_map_in_menu_by_string(szMapName) || equali(szMapName, g_szCurrentMap));
formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), szMapName);
}
ForwardPreStartVote();
return 0;
}
#endif
new Array:aMaps = ArrayCreate(VOTEMENU_INFO), iCurrentSize = 0;
new eMenuInfo[VOTEMENU_INFO], eMapInfo[MAP_INFO], iGlobalSize = ArraySize(g_aMaps);
new iPlayersNum = get_players_num();
for(new i = 0; i < iGlobalSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
if(eMapInfo[m_MinPlayers] <= iPlayersNum <= eMapInfo[m_MaxPlayers] && !eMapInfo[m_BlockCount])
{
formatex(eMenuInfo[v_MapName], charsmax(eMenuInfo[v_MapName]), eMapInfo[m_MapName]);
eMenuInfo[v_MapIndex] = i; iCurrentSize++;
ArrayPushArray(aMaps, eMenuInfo);
}
}
new Item = 0;
#if defined FUNCTION_BLOCK_MAPS
new iMaxItems = min(min(SELECT_MAPS, iGlobalSize - g_iBlockedSize), 8);
#else
new iMaxItems = min(min(SELECT_MAPS, iGlobalSize), 8);
#endif
#if defined FUNCTION_NOMINATION
new eNomInfo[NOMINATEDMAP_INFO];
if(get_pcvar_num(g_pCvars[NOMINATION_DEL_NON_CUR_ONLINE]))
{
for(new i; 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--);
}
}
}
new iNomSize = ArraySize(g_aNominatedMaps);
g_iMenuItemsCount = min(min(iNomSize, NOMINATED_MAPS_IN_VOTE), iMaxItems);
for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
{
iRandomMap = random_num(0, ArraySize(g_aNominatedMaps) - 1);
ArrayGetArray(g_aNominatedMaps, iRandomMap, eNomInfo);
formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eNomInfo[n_MapName]);
g_eMenuItems[Item][v_MapIndex] = eNomInfo[n_MapIndex];
g_iNominatedMaps[eNomInfo[n_Player]]--;
ArrayDeleteItem(g_aNominatedMaps, iRandomMap);
new priority_index = is_map_in_priority(aMaps, eNomInfo[n_MapIndex]);
if(priority_index)
{
ArrayDeleteItem(aMaps, priority_index - 1);
}
}
#endif
if(iCurrentSize && Item < iMaxItems)
{
g_iMenuItemsCount = max(min(iCurrentSize, iMaxItems), Item);
for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
{
iRandomMap = random_num(0, ArraySize(aMaps) - 1);
ArrayGetArray(aMaps, iRandomMap, eMenuInfo);
formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMenuInfo[v_MapName]);
g_eMenuItems[Item][v_MapIndex] = eMenuInfo[v_MapIndex];
ArrayDeleteItem(aMaps, iRandomMap);
}
}
if(Item < iMaxItems)
{
g_iMenuItemsCount = min(iGlobalSize, iMaxItems);
for(new iRandomMap; Item < g_iMenuItemsCount; Item++)
{
do
{
iRandomMap = random_num(0, iGlobalSize - 1);
ArrayGetArray(g_aMaps, iRandomMap, eMapInfo);
}
while(is_map_in_menu(iRandomMap) || eMapInfo[m_BlockCount]);
formatex(g_eMenuItems[Item][v_MapName], charsmax(g_eMenuItems[][v_MapName]), eMapInfo[v_MapName]);
g_eMenuItems[Item][v_MapIndex] = iRandomMap;
}
}
ArrayDestroy(aMaps);
ForwardPreStartVote();
return 0;
}
CheckAllowExtendMap()
{
new bAllow = g_bNotUnlimitTime || get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (get_pcvar_num(g_pCvars[MAXROUNDS]) || get_pcvar_num(g_pCvars[WINLIMIT]));
#if defined FUNCTION_RTV && defined FUNCTION_NIGHTMODE
if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && !g_bRockVote && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]) && (g_bNightMode && g_bCurMapInNightMode || !g_bNightMode))
#else
#if defined FUNCTION_RTV
if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && !g_bRockVote && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]))
#else
#if defined FUNCTION_NIGHTMODE
if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]) && (g_bNightMode && g_bCurMapInNightMode || !g_bNightMode))
#else
if((get_pcvar_float(g_pCvars[TIMELIMIT]) > 0.0 || bAllow) && g_iExtendedMax < get_pcvar_num(g_pCvars[EXTENDED_MAX]))
#endif
#endif
#endif
{
g_bExtendMap = true;
}
else
{
g_bExtendMap = false;
}
g_bNotUnlimitTime = false;
}
ResetInfo()
{
g_iTotalVotes = 0;
for(new i; 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);
}
ForwardPreStartVote()
{
if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
{
SetBlackScreenFade(2);
set_task(1.0, "SetBlackScreenFade", 1);
}
#if PRE_START_TIME > 0
g_iTimer = PRE_START_TIME;
ShowTimer();
#else
ShowVoteMenu();
#endif
new iRet;
ExecuteForward(g_iForwardPreStartVote, iRet);
}
public ShowTimer()
{
if(g_iTimer > 0)
{
set_task(1.0, "ShowTimer", TASK_SHOWTIMER);
}
else
{
#if defined FUNCTION_SOUND
SendAudio(0, "sound/Gman/Gman_Choose2.wav", PITCH_NORM);
#endif
ShowVoteMenu();
return;
}
new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
new iPlayers[32], pNum; get_players(iPlayers, pNum, "ch");
for(new id, i; i < pNum; i++)
{
id = iPlayers[i];
set_hudmessage(50, 255, 50, -1.0, is_user_alive(id) ? 0.9 : 0.3, 0, 0.0, 1.0, 0.0, 0.0, 4);
show_hudmessage(id, "%L %L!", LANG_PLAYER, "MAPM_HUD_TIMER", g_iTimer, LANG_PLAYER, szSec);
}
#if defined FUNCTION_SOUND
if(g_iTimer <= 10)
{
for(new id, i; i < pNum; i++)
{
id = iPlayers[i];
SendAudio(id, g_szSound[g_iTimer - 1], PITCH_NORM);
}
}
#endif
g_iTimer--;
}
ShowVoteMenu()
{
g_iTimer = VOTE_TIME;
set_task(1.0, "Task_Timer", TASK_TIMER, .flags = "a", .repeat = VOTE_TIME);
new Players[32], pNum, iPlayer; get_players(Players, pNum, "ch");
for(new i = 0; i < pNum; i++)
{
iPlayer = Players[i];
VoteMenu(iPlayer + TASK_VOTEMENU);
set_task(1.0, "VoteMenu", iPlayer + TASK_VOTEMENU, _, _, "a", VOTE_TIME);
}
new iRet;
ExecuteForward(g_iForwardStartVote, iRet);
}
public Task_Timer()
{
if(--g_iTimer == 0)
{
FinishVote();
show_menu(0, 0, "^n", 1);
remove_task(TASK_TIMER);
}
}
public VoteMenu(id)
{
id -= TASK_VOTEMENU;
if(g_iTimer == 0)
{
show_menu(id, 0, "^n", 1); remove_task(id+TASK_VOTEMENU);
return PLUGIN_HANDLED;
}
static szMenu[512];
new iKeys, iPercent, i, iLen;
iLen = formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\y%L:^n^n", LANG_PLAYER, g_bPlayerVoted[id] ? "MAPM_MENU_VOTE_RESULTS" : "MAPM_MENU_CHOOSE_MAP");
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], charsmax(szMenu) - iLen, "\r%d.\w %s\d[\r%d%%\d]^n", i + 1, g_eMenuItems[i][v_MapName], iPercent);
iKeys |= (1 << i);
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "\d%s[\r%d%%\d]^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], charsmax(szMenu) - iLen, "^n\r%d.\w %s\d[\r%d%%\d]\y[%L]^n", i + 1, g_szCurrentMap, iPercent, LANG_PLAYER, "MAPM_MENU_EXTEND");
iKeys |= (1 << i);
}
else
{
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%s[\r%d%%\d]\y[%L]^n", g_szCurrentMap, iPercent, LANG_PLAYER, "MAPM_MENU_EXTEND");
}
}
new szSec[16]; get_ending(g_iTimer, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
iLen += formatex(szMenu[iLen], charsmax(szMenu) - iLen, "^n\d%L \r%d\d %L", LANG_PLAYER, "MAPM_MENU_LEFT", g_iTimer, LANG_PLAYER, szSec);
if(!iKeys) iKeys |= (1 << 9);
if(g_bPlayerVoted[id] && get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE]) == 2)
{
while(replace(szMenu, charsmax(szMenu), "\r", "")){}
while(replace(szMenu, charsmax(szMenu), "\d", "")){}
while(replace(szMenu, charsmax(szMenu), "\w", "")){}
while(replace(szMenu, charsmax(szMenu), "\y", "")){}
set_hudmessage(0, 55, 255, 0.02, -1.0, 0, 6.0, 1.0, 0.1, 0.2, 4);
show_hudmessage(id, "%s", szMenu);
}
else
{
show_menu(id, iKeys, szMenu, -1, "VoteMenu");
}
return PLUGIN_HANDLED;
}
public VoteMenu_Handler(id, key)
{
if(g_bPlayerVoted[id])
{
VoteMenu(id + TASK_VOTEMENU);
return PLUGIN_HANDLED;
}
g_eMenuItems[key][v_Votes]++;
g_iTotalVotes++;
g_bPlayerVoted[id] = true;
if(get_pcvar_num(g_pCvars[SHOW_SELECTS]))
{
new szName[32]; get_user_name(id, szName, charsmax(szName));
if(key == g_iMenuItemsCount)
{
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_EXTEND", szName);
}
else
{
client_print_color(0, id, "%s^3 %L", PREFIX, LANG_PLAYER, "MAPM_CHOSE_MAP", szName, g_eMenuItems[key][v_MapName]);
}
}
if(get_pcvar_num(g_pCvars[SHOW_RESULT_TYPE]))
{
VoteMenu(id + TASK_VOTEMENU);
}
else
{
remove_task(id + TASK_VOTEMENU);
}
return PLUGIN_HANDLED;
}
FinishVote()
{
g_bVoteStarted = false;
g_bVoteFinished = true;
if(g_bChangedFreezeTime)
{
set_pcvar_float(g_pCvars[FREEZETIME], get_pcvar_float(g_pCvars[FREEZETIME]) - float(PRE_START_TIME + VOTE_TIME + 1));
g_bChangedFreezeTime = false;
}
if(get_pcvar_num(g_pCvars[BLACK_SCREEN_IN_VOTE]))
{
SetBlackScreenFade(0);
}
new iMaxVote = 0, iRandom;
for(new i = 1; i < g_iMenuItemsCount + 1; i++)
{
iRandom = random_num(0, 1);
switch(iRandom)
{
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_fOldTimeLimit > 0.0)
{
set_pcvar_float(g_pCvars[TIMELIMIT], g_fOldTimeLimit);
g_fOldTimeLimit = 0.0;
}
if(!g_iTotalVotes || (iMaxVote != g_iMenuItemsCount))
{
if(g_iTotalVotes)
{
client_print_color(0, print_team_default, "%s^1 %L^3 %s^1.", PREFIX, LANG_PLAYER, "MAPM_NEXTMAP", g_eMenuItems[iMaxVote][v_MapName]);
}
else
{
iMaxVote = random_num(0, g_iMenuItemsCount - 1);
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_NOBODY_VOTE", g_eMenuItems[iMaxVote][v_MapName]);
}
set_pcvar_string(g_pCvars[NEXTMAP], g_eMenuItems[iMaxVote][v_MapName]);
if(get_pcvar_num(g_pCvars[LAST_ROUND]))
{
g_fOldTimeLimit = get_pcvar_float(g_pCvars[TIMELIMIT]);
set_pcvar_float(g_pCvars[TIMELIMIT], 0.0);
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER, "MAPM_LASTROUND");
}
#if defined FUNCTION_RTV
else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 0 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
#else
else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 0)
#endif
{
new iSec = get_pcvar_num(g_pCvars[CHATTIME]);
new szSec[16]; get_ending(iSec, "MAPM_SECOND1", "MAPM_SECOND2", "MAPM_SECOND3", szSec, charsmax(szSec));
client_print_color(0, print_team_default, "%s^1 %L^1 %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_CHANGE", iSec, LANG_PLAYER, szSec);
Intermission();
}
#if defined FUNCTION_RTV
else if(g_bRockVote && get_pcvar_num(g_pCvars[ROCK_CHANGE_TYPE]) == 1 || get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1)
#else
else if(get_pcvar_num(g_pCvars[CHANGE_TYPE]) == 1)
#endif
{
client_print_color(0, print_team_default, "%s^1 %L", PREFIX, LANG_PLAYER,"MAPM_MAP_CHANGE_NEXTROUND");
}
}
else
{
g_bVoteFinished = false;
g_iExtendedMax++;
new iWinLimit = get_pcvar_num(g_pCvars[WINLIMIT]);
new iMaxRounds = get_pcvar_num(g_pCvars[MAXROUNDS]);
#if defined FUNCTION_RTV
g_iRockVotes = 0;
g_bRockVote = false;
arrayset(g_bRockVoted, false, sizeof(g_bRockVoted));
#endif
if(get_pcvar_num(g_pCvars[EXTENDED_TYPE]) == 1 && (iWinLimit || iMaxRounds))
{
new iRounds = get_pcvar_num(g_pCvars[EXTENDED_ROUNDS]);
if(iWinLimit > 0)
{
set_pcvar_num(g_pCvars[WINLIMIT], iWinLimit + iRounds);
}
if(iMaxRounds > 0)
{
set_pcvar_num(g_pCvars[MAXROUNDS], iMaxRounds + iRounds);
}
new szRounds[16]; get_ending(iRounds, "MAPM_ROUND1", "MAPM_ROUND2", "MAPM_ROUND3", szRounds, charsmax(szRounds));
client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iRounds, LANG_PLAYER, szRounds);
}
else
{
new iMin = get_pcvar_num(g_pCvars[EXTENDED_TIME]);
new szMin[16]; get_ending(iMin, "MAPM_MINUTE1", "MAPM_MINUTE2", "MAPM_MINUTE3", szMin, charsmax(szMin));
client_print_color(0, print_team_default, "%s^1 %L %L.", PREFIX, LANG_PLAYER, "MAPM_MAP_EXTEND", iMin, LANG_PLAYER, szMin);
set_pcvar_float(g_pCvars[TIMELIMIT], get_pcvar_float(g_pCvars[TIMELIMIT]) + float(iMin));
}
}
new iRet;
ExecuteForward(g_iForwardFinishVote, iRet);
}
///**************************///
stock get_players_num()
{
new players[32], pnum; get_players(players, pnum, "ch");
return pnum;
}
stock valid_map(map[])
{
if(is_map_valid(map)) return true;
new len = strlen(map) - 4;
if(len < 0) return false;
if(equali(map[len], ".bsp"))
{
map[len] = '^0';
if(is_map_valid(map)) return true;
}
return false;
}
is_map_in_array(map[])
{
new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
for(new i; i < iSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
if(equali(map, eMapInfo[m_MapName]))
{
return i + 1;
}
}
return 0;
}
#if defined FUNCTION_BLOCK_MAPS
is_map_blocked(Array:array, map[])
{
new eBlockedInfo[BLOCKEDMAP_INFO], iSize = ArraySize(array);
for(new i; i < iSize; i++)
{
ArrayGetArray(array, i, eBlockedInfo);
if(equali(map, eBlockedInfo[b_MapName]))
{
return i + 1;
}
}
return 0;
}
clear_blocked_maps()
{
new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
for(new i; i < iSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
if(eMapInfo[m_BlockCount])
{
eMapInfo[m_BlockCount] = 0;
ArraySetArray(g_aMaps, i, eMapInfo);
}
}
g_iBlockedSize = 0;
}
#endif
is_map_in_menu(index)
{
for(new i; i < sizeof(g_eMenuItems); i++)
{
if(g_eMenuItems[i][v_MapIndex] == index) return true;
}
return false;
}
#if defined FUNCTION_NOMINATION
is_map_nominated(map_index)
{
new eNomInfo[NOMINATEDMAP_INFO], iSize = ArraySize(g_aNominatedMaps);
for(new i; i < iSize; i++)
{
ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
if(map_index == eNomInfo[n_MapIndex])
{
return i + 1;
}
}
return 0;
}
is_map_in_priority(Array:array, map_index)
{
new ePriorityInfo[VOTEMENU_INFO], iSize = ArraySize(array);
for(new i; i < iSize; i++)
{
ArrayGetArray(array, i, ePriorityInfo);
if(map_index == ePriorityInfo[v_MapIndex])
{
return i + 1;
}
}
return 0;
}
clear_nominated_maps(id)
{
new eNomInfo[NOMINATEDMAP_INFO];
for(new i = 0; i < ArraySize(g_aNominatedMaps); i++)
{
ArrayGetArray(g_aNominatedMaps, i, eNomInfo);
if(id == eNomInfo[n_Player])
{
ArrayDeleteItem(g_aNominatedMaps, i--);
if(!--g_iNominatedMaps[id]) break;
}
}
}
is_prefix_in_array(prefix[])
{
new string[32];
for(new i; i < g_iMapPrefixesNum; i++)
{
ArrayGetString(g_aMapPrefixes, i, string, charsmax(string));
if(equali(prefix, string))
{
return true;
}
}
return false;
}
get_map_prefix(map[], prefix[], size)
{
new map_copy[32]; copy(map_copy, charsmax(map_copy), map);
for(new i; map_copy[i]; i++)
{
if(map_copy[i] == '_')
{
map_copy[i + 1] = 0;
copy(prefix, size, map_copy);
return 1;
}
}
return 0;
}
find_similar_map(map_index, string[32])
{
new eMapInfo[MAP_INFO], iSize = ArraySize(g_aMaps);
for(new i = map_index; i < iSize; i++)
{
ArrayGetArray(g_aMaps, i, eMapInfo);
if(containi(eMapInfo[m_MapName], string) != -1)
{
return i + 1;
}
}
return 0;
}
trim_bracket(text[])
{
for(new i; text[i]; i++)
{
if(text[i] == '[')
{
text[i] = 0;
break;
}
}
}
string_with_space(string[])
{
for(new i; string[i]; i++)
{
if(string[i] == ' ') return 1;
}
return 0;
}
#endif
#if defined FUNCTION_NIGHTMODE
is_map_in_night_array(map[])
{
new szMapName[32], iMax = ArraySize(g_aNightMaps);
for(new i = 0; i < iMax; i++)
{
ArrayGetString(g_aNightMaps, i, szMapName, charsmax(szMapName));
if(equali(szMapName, map))
{
return i + 1;
}
}
return 0;
}
is_map_in_menu_by_string(map[])
{
for(new i; i < sizeof(g_eMenuItems); i++)
{
if(equali(g_eMenuItems[i][v_MapName], map)) return true;
}
return false;
}
get_int_time(string[], &hour, &minutes)
{
new left[4], right[4]; strtok(string, left, charsmax(left), right, charsmax(right), ':');
hour = str_to_num(left);
minutes = str_to_num(right);
}
#endif
stock get_ending(num, const a[], const b[], const c[], output[], lenght)
{
new num100 = num % 100, num10 = num % 10;
if(num100 >=5 && num100 <= 20 || num10 == 0 || num10 >= 5 && num10 <= 9) formatex(output, lenght, "%s", a);
else if(num10 == 1) formatex(output, lenght, "%s", b);
else if(num10 >= 2 && num10 <= 4) formatex(output, lenght, "%s", c);
}
stock SendAudio(id, audio[], pitch)
{
static iMsgSendAudio;
if(!iMsgSendAudio) iMsgSendAudio = get_user_msgid("SendAudio");
message_begin( id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, iMsgSendAudio, _, id);
write_byte(id);
write_string(audio);
write_short(pitch);
message_end();
}
stock Intermission()
{
emessage_begin(MSG_ALL, SVC_INTERMISSION);
emessage_end();
}
public SetBlackScreenFade(fade)
{
new time, hold, flags;
static iMsgScreenFade;
if(!iMsgScreenFade) iMsgScreenFade = get_user_msgid("ScreenFade");
switch (fade)
{
case 1: { time = 1; hold = 1; flags = 4; }
case 2: { time = 4096; hold = 1024; flags = 1; }
default: { time = 4096; hold = 1024; flags = 2; }
}
message_begin(MSG_BROADCAST, iMsgScreenFade);
write_short(time);
write_short(hold);
write_short(flags);
write_byte(0);
write_byte(0);
write_byte(0);
write_byte(255);
message_end();
}
Отредактировал: Izmayl7, - 28.10.2018, 12:10