
#include <amxmodx>
#include <amxmisc>
#include <reapi>
#include <nvault>

new const SERVERISMI[] = "HIT | HIZ TEKNIK IRADE";

new const defaultMap[] = "jail_buyukisyan_dark"; 
// Gece 00:00 'dan "map_saatkactaBaslasin" cvarinda ayarladiginiz saate kadar bu map acik kalir !
// Ayrica  'map_kisiSiniri' cvarini 0 dan farkli girdiyseniz, oyuncu sayisi degerin altinda kalirsa bu map acilir!


new const ctmenu_koruma[] = "ctmenum/oylama.wav";
new const file[] = "addons/amxmodx/configs/maps.ini"; // maps.ini 'de en az 7 tane map yazili olmasi gerekir !!!

enum _: g_Data { MapNum, Mapisim[32], Oylamanum };
new maplar[4][g_Data], bool:oylamakontrol[MAX_CLIENTS+1], sonuc[32], oylamasure, map[32], Dosya, g_Cvars[3];

const manualOylama_Yetkisi = ADMIN_RCON;


public plugin_init() {
	register_plugin("Jailbreak Map Oylama Sistemi", "v1.0", "n.dgn");

	register_clcmd("say /mapoyla", "mapseckontrol"); // Manual Oylama 
	RegisterHookChain(RG_CSGameRules_RestartRound, "restartRound", true);

	bind_pcvar_num(create_cvar("map_saatkactaBaslasin", "12"), g_Cvars[0]); 
							// Saat kactan - 00:00 'a kadar map oylama sistemi aktif olsun?
							// 0 Yaparsaniz map oylama sistemi surekli aktif olur !
							// [default : 12] > Sabah 12 - Aksam 12

	bind_pcvar_num(create_cvar("map_gunRestart", "20"), g_Cvars[1]); 
							// Gun Kacta Map Oylamasi Yapilsin ?
							// Gece Map degisikligi olmazsa bu cvardan 1 gun sonra restart atilir!

	bind_pcvar_num(create_cvar("map_kisiSiniri", "8"), g_Cvars[2]); 
							// Oyuncu sayisi bu sayinin altindaysa otomatik 'defaultMap' acilir.
							// 0 yaparsaniz bu ozellik kapanir!

	get_mapname(map, charsmax(map));
}

public restartRound() {
	new days = get_member_game(m_iNumCTWins) + get_member_game(m_iNumTerroristWins) + 1;

	if(days == g_Cvars[1]) {
		new saat[4]; 
		get_time("%H", saat, charsmax(saat));

		if(str_to_num(saat) >= g_Cvars[0] && get_playersnum() >= g_Cvars[2]) 
			set_task(5.0, "mapsec");

		else if(!equal(map, defaultMap)) 
			server_cmd("changelevel %s", defaultMap);

	} else if(days > g_Cvars[1]) 
		set_cvar_num("sv_restartround", 5);

}

public mapseckontrol(id) {
	if(get_user_flags(id) & manualOylama_Yetkisi) 
		mapsec();

	return PLUGIN_HANDLED;
}

public mapsec() { 
	new maxlines = file_size(file, 1);
	if(maxlines > 6) {

		new onceki1[32], onceki2[32], i=0;
		nvault_get( Dosya , "2OncekiHarita" , onceki1 , charsmax(onceki1) );
		nvault_get( Dosya , "1OncekiHarita" , onceki2 , charsmax(onceki2) );
	
		while(i<4) {
			maplar[i][MapNum] = random_num(0, maxlines);
			
			switch(i) {
				case 1 : if(maplar[i-1][MapNum] == maplar[i][MapNum]) continue;
				case 2 : if(maplar[i-1][MapNum] == maplar[i][MapNum] || maplar[i-2][MapNum] == maplar[i][MapNum]) continue;
				case 3 : if(maplar[i-1][MapNum] == maplar[i][MapNum] || maplar[i-2][MapNum] == maplar[i][MapNum] ||  maplar[i-3][MapNum] == maplar[i][MapNum]) continue;
			}
			
			read_file(file, maplar[i][MapNum], maplar[i][Mapisim], 31);

			if( contain(maplar[i][Mapisim], ";") == -1 && strlen(maplar[i][Mapisim]) > 1 && 
				!equal(maplar[i][Mapisim], map) && 
				!equal(maplar[i][Mapisim], onceki1) && 
				!equal(maplar[i][Mapisim], onceki2)  ) {

				i++;
			}
		}
		oylama();
	}
}

public oylama() {
	new players[MAX_PLAYERS], num, ids, i; 
	get_players_ex(players, num, GetPlayers_ExcludeBots);

	for(i=0; i<4; i++) 
		maplar[i][Oylamanum]=0;

	oylamasure=15;
	remove_task(1340); 
	set_task_ex(1.0, "eksilt", 1340, .flags = SetTask_Repeat);
	set_task(15.5, "oylamabitir", 1340);

	for(i=0; i<num; i++) {

		ids=players[i];
		oylamakontrol[ids]=false;
		remove_task(ids+1340);
		oylamamenu(ids+1340);

		set_task_ex(1.0, "oylamamenu", ids+1340, .flags = SetTask_Repeat);
	}
	client_print_color(0, print_team_grey, "^1[^3%s^1]^4 Map oylamasi basladi.^3 15 saniye^4 sonra oylama bitecektir!", SERVERISMI);
	
	client_cmd(0, "stopsound"), set_task(0.1, "caldir");

}

public caldir()
	rg_send_audio(0, ctmenu_koruma);

public oylamamenu(id) {
	id=id-1340;

	if(oylamasure>0 && is_user_connected(id)) {

		new ndmenu[128], nums[4]; 
		formatex(ndmenu, charsmax(ndmenu),"\w%s \d|| \yMap Oylamasi^n\dOylamanin bitmesine son \r%d saniye\d kaldi!", SERVERISMI, oylamasure);
		new Menu = menu_create(ndmenu, "korumaoylamamenu2");

		for(new i=0; i<4; i++) {

			formatex(ndmenu, charsmax(ndmenu), "%s%s \r[ \w%d Oy\r ]",oylamakontrol[id] ? "\d":"\y", maplar[i][Mapisim], maplar[i][Oylamanum]);

			if(oylamakontrol[id]) 
				menu_additem(Menu, ndmenu, "5");

			else { 
				num_to_str(i+1, nums, charsmax(nums));
				menu_additem(Menu, ndmenu, nums); 
			}
		}
		menu_addtext(Menu, "\y^nOylamada Esitlik Olursa Rastgele secilir!");

		menu_setprop(Menu, MPROP_EXITNAME, "\wCikis");
		menu_display(id, Menu);

	} else remove_task(id+1340), show_menu(id, 0, "");
}

public korumaoylamamenu2(id, menu, item) {
	if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; }

	new data[6], key; 
	menu_item_getinfo(menu, item, _, data, charsmax(data));
	key = str_to_num(data);

	if(key != 5) {
		maplar[key-1][Oylamanum]++;
		oylamakontrol[id]=true;

	} else 
		client_print_color(id, id, "^1[^3%s^1]^4 Siz oy verdiniz!", SERVERISMI);

	oylamamenu(id+1340);
	menu_destroy(menu);
	return PLUGIN_HANDLED;
}

public oylamabitir() {
	remove_task(1340);

	new max=maplar[0][Oylamanum];
	formatex(sonuc, charsmax(sonuc), "%s", maplar[0][Mapisim]);

	for(new i=1; i<4; i++) {

		if((maplar[i][Oylamanum] > max) || (maplar[i][Oylamanum] == max && random_num(1, 2) == 1)) {

			max = maplar[i][Oylamanum];
			formatex(sonuc, charsmax(sonuc), "%s", maplar[i][Mapisim]);
		}
	}
	set_task(4.0, "mapdegis");

	for(new i=0; i<5; i++) 
		client_print_color(0, print_team_blue, "^1[^3%s^1]^4 Oylamada ^3[^1%s^3]^4 Kazandi! ^1Harita degistiriliyor^3...", SERVERISMI, sonuc);
}

public mapdegis() {
	if(is_map_valid(sonuc)) 
		server_cmd("changelevel %s", sonuc);

	else {
		client_print_color(0, print_team_grey, "^1[^3%s^1]^4 Map yuklu degil. ^1Oylama tekrar ^3yapiliyor^4...", SERVERISMI);
		set_task(5.0, "mapsec");
	}
}

public eksilt() 
	oylamasure--;

public plugin_precache() 
	precache_sound(ctmenu_koruma);

public plugin_cfg() {
	Dosya = nvault_open("gecmismaplar");

	if(Dosya == INVALID_HANDLE)	
		set_fail_state( "Vault Dosyasi Acilamadi !" );

	else {

		new onceki1[32], onceki2[32];
		nvault_get( Dosya , "SuanHarita" , onceki1 , charsmax(onceki1) );
		nvault_get( Dosya , "1OncekiHarita" , onceki2 , charsmax(onceki2) );

		nvault_set( Dosya , "1OncekiHarita" , onceki1 );
		nvault_set( Dosya , "2OncekiHarita" , onceki2 );
		nvault_set( Dosya , "SuanHarita" , map );
	}
}

public plugin_end() 
	nvault_close( Dosya );