- /* 
- Manager of Buttons 
- for DeathRun 
-   
- Licence: GPL 
- Description: 
- 	Allow admin to define how many times every button could be used by Menu. 
- 	Add to game (cvar controlled) FreeRun mode - during round with FR traps can`t  
- 	be used by defined teams (default Te). 
-   
- */ 
- #include <amxmodx> 
- #include <amxmisc> 
- #include <hamsandwich> 
- #include <fakemeta> 
- #include <colorchat> 
-   
- #define PLUGIN "Use button once" 
- #define VERSION "1.3" 
- #define AUTHOR "R3X" 
-   
- #define MAX_BUTTONS 100 
- #define KeysButtonsMenu (1<<0)|(1<<1)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<7)|(1<<8)|(1<<9) // Keys: 137890 
- #define KeysOptionsMenu (1<<0)|(1<<1)|(1<<8) //129 
- #define KeysDelayMenu (1<<0)|(1<<1)|(1<<2)|(1<<8) //1239 
-   
- #define ANNOUNCE_TASK 10000 
-   
- #define m_flWait 44 
-   
- //Main 
-   
- new gEnt[MAX_BUTTONS]; 
- new gUsed[MAX_BUTTONS]; 
- new giPointer=0; 
- new gOnStart[MAX_BUTTONS]; 
- new Float:gDefaultDelay[MAX_BUTTONS]; 
- new Float:gDelay[MAX_BUTTONS]; 
-   
- new gInMenu[33]; 
-   
- new gszFile[128]; 
-   
- new giSprite; 
-   
- new gcvarDefault, gcvarTeam, gcvarFreeRun; 
- new gcvarLimit, gcvarLimitMode, gcvarPrivilege; 
- new gcvarMessage, gcvarRestore; 
-   
- //VOTE 
-   
- #define TASK_SHOWMENU 432 
- #define TASK_RES 123 
-   
- #define MAX_ROUNDS 999 
-   
- #define KeysFFVote (1<<0)|(1<<1) // Keys: 12 
-   
- new gcvarFRVoteTime; 
-   
- new giVoteStart, giVoteTime; 
-   
- new bool:gbFreeRun=false; 
- new bool:gbVote=false; 
-   
- #define VOTE_ON 0 
- #define VOTE_OFF 1 
-   
- new giVotes[33][2]; 
-   
- new giRounds=MAX_ROUNDS, giTime=0; 
-   
- public plugin_init() { 
- 	register_plugin(PLUGIN, VERSION, AUTHOR); 
-   
- 	register_dictionary("common.txt"); 
- 	register_dictionary("adminvote.txt"); 
- 	register_dictionary("use_button_once.txt"); 
-   
- 	register_menucmd(register_menuid("FRVote"), KeysFFVote, "PressedFRVote"); 
- 	register_menucmd(register_menuid("ButtonsMenu"), KeysButtonsMenu, "PressedButtonsMenu"); 
- 	register_menucmd(register_menuid("OptionsMenu"), KeysOptionsMenu, "PressedOptionsMenu"); 
- 	register_menucmd(register_menuid("DelayMenu"), KeysDelayMenu, "PressedDelayMenu"); 
-   
- 	register_clcmd("amx_buttons","cmd_amx_buttons",ADMIN_CFG,": Buttons Menu"); 
-   
- 	//Default count of uses 
- 	gcvarDefault=register_cvar("amx_buttons_default","1"); 
- 	//Who plugin analyze 
- 	//0 - anyone(plugin disabled?) 
- 	//1 - Te 
- 	//2 - Ct 
- 	//3 - Te+Ct 
- 	gcvarTeam=register_cvar("amx_buttons_team","1"); 
- 	//Enabled FreeRun mode? 
- 	gcvarFreeRun=register_cvar("amx_buttons_freerun","1"); 
- 	//Vote time 
- 	gcvarFRVoteTime=register_cvar("amx_freerun_votetime","10"); 
-   
- 	//Type of limit 
- 	//0 - enabled after 'amx_freerun_limit' rounds 
- 	//1 - enabled after 'amx_freerun_limit' minutes 
- 	gcvarLimitMode=register_cvar("amx_freerun_limit_mode","0"); 
- 	//Size of Limit 
- 	gcvarLimit=register_cvar("amx_freerun_limit","5"); 
-   
- 	//Interval of message 
- 	gcvarMessage=register_cvar("amx_freerun_info","120.0",0,120.0); 
-   
- 	//Terrorist`s privilege 
- 	//if he use /free FreeRun will start without vote, can he? 
- 	gcvarPrivilege=register_cvar("amx_freerun_tt_privilege","1"); 
-   
- 	//restore buttons on new round 
- 	gcvarRestore=register_cvar("amx_restore_buttons","1"); 
-   
- 	register_clcmd("say /free","cmdVoteFreeRun"); 
- 	register_clcmd("say_team /free","cmdVoteFreeRun"); 
- 	register_clcmd("say free","cmdVoteFreeRun"); 
- 	register_clcmd("say_team free","cmdVoteFreeRun"); 
-   
- 	register_clcmd("say /freerun","cmdVoteFreeRun"); 
- 	register_clcmd("say_team /freerun","cmdVoteFreeRun"); 
- 	register_clcmd("say freerun","cmdVoteFreeRun"); 
- 	register_clcmd("say_team freerun","cmdVoteFreeRun"); 
-   
- 	register_clcmd("say /fr","cmdVoteFreeRun"); 
- 	register_clcmd("say_team /fr","cmdVoteFreeRun"); 
- 	register_clcmd("say fr","cmdVoteFreeRun"); 
- 	register_clcmd("say_team fr","cmdVoteFreeRun"); 
-   
- 	if( engfunc(EngFunc_FindEntityByString,-1 ,"classname", "func_button")) 
- 		RegisterHam(Ham_Use, "func_button", "fwButtonUsed"); 
-   
- 	if(engfunc(EngFunc_FindEntityByString,-1 ,"classname","func_rot_button")) 
- 		RegisterHam(Ham_Use, "func_rot_button", "fwButtonUsed"); 
-   
- 	if(engfunc(EngFunc_FindEntityByString,-1 ,"classname", "button_target")) 
- 		RegisterHam(Ham_Use, "button_target", "fwButtonUsed"); 
-   
- 	register_logevent( "ResetButtons", 2, "0=World triggered", "1=Round_Start"); 
-   
- 	fillButtons("func_button"); 
- 	fillButtons("func_rot_button"); 
- 	fillButtons("button_target"); 
- } 
- public plugin_cfg(){ 
- 	setButtons(); 
-   
- 	new iLen=0, iMax=charsmax(gszFile); 
- 	iLen=get_configsdir(gszFile, iMax ); 
- 	iLen+=copy(gszFile[iLen], iMax-iLen, "/dr_buttons/"); 
-   
- 	if(!dir_exists(gszFile)){ 
- 		set_fail_state("Not found dir: configs/dr_buttons"); 
- 		return; 
- 	} 
- 	new szMap[32]; 
- 	get_mapname(szMap, 31); 
- 	formatex(gszFile[iLen], charsmax(gszFile)-iLen, "%s.ini", szMap); 
- 	if(!file_exists(gszFile)){ 
- 		return; 
- 	} 
- 	new szLine[51]; 
- 	new szButton[4], szTimes[3], szDelay[5]; 
- 	new Float:fDelay; 
- 	for(new i=0;read_file(gszFile, i, szLine, 50, iLen);i++){ 
- 		if(iLen==0) continue; 
- 		trim(szLine); 
- 		if(szLine[0]==';') continue; 
- 		parse(szLine, szButton, 3, szTimes, 2, szDelay, 4); 
- 		fDelay=szDelay[0]?str_to_float(szDelay):-1.0; 
- 		set_start_value(str_to_num(szButton), str_to_num(szTimes), fDelay); 
- 	} 
- 	new Float:fInterval=get_pcvar_float(gcvarMessage); 
- 	if(fInterval > 0.0) 
- 		set_task(120.0, "announceVote",ANNOUNCE_TASK,_,_,"b"); 
- } 
- public plugin_precache(){ 
- 	giSprite=precache_model("sprites/flare1.spr"); 
-   
- } 
- public client_putinserver(id){ 
- 	if(!is_user_bot(id)) 
- 		eventInGame(id); 
- } 
- public client_connect(id){ 
- 	giVotes[id][VOTE_ON]=0; 
- 	giVotes[id][VOTE_OFF]=0; 
- } 
- public announceVote(){ 
- 	if(get_pcvar_num(gcvarFreeRun)) 
- 		ColorChat(0,GREEN, "[FreeRun]^x01 %L",LANG_SERVER, "ANNOUNCE"); 
- } 
- setButtons(){ 
- 	new iDef=get_pcvar_num(gcvarDefault); 
- 	for(new i=0;i<giPointer;i++){ 
- 		gUsed[i]=iDef; 
- 		gOnStart[i]=iDef; 
- 		gDelay[i]=get_pdata_float(gEnt[i],m_flWait); 
- 		gDefaultDelay[i]=gDelay[i]; 
- 	} 
- } 
- fillButtons(const szClass[]){ 
- 	new ent = -1; 
- 	while((ent = engfunc(EngFunc_FindEntityByString,ent ,"classname", szClass)) != 0){ 
- 		gEnt[giPointer++]=ent; 
- 		set_pev(ent, pev_iuser4, giPointer); 
- 	} 
- } 
- set_start_value(ent, times, Float:delay){ 
- 	new index=get_ent_index(ent); 
- 	if(index!=-1){ 
- 		gOnStart[index]=times; 
- 		if(delay>=0.0) 
- 			gDelay[index]=delay; 
- 	} 
- } 
- get_ent_index(ent){ 
- 	/* 
- 	for(new i=0;i<giPointer;i++) 
- 		if(gEnt[i]==ent) return i; 
- 	return -1; 
- 	*/ 
- 	return pev(ent, pev_iuser4)-1; 
- } 
- restoreButton(ent){ 
- 	if(pev(ent, pev_frame) > 0.0){ 
- 		new Float:Life; 
- 		pev(ent, pev_nextthink, Life); 
- 		set_pev(ent, pev_ltime, Life-0.01); 
- 	} 
- } 
- public ResetButtons(){ 
- 	gbFreeRun=false; 
- 	gbVote=false; 
- 	new bool:bRestore=get_pcvar_num(gcvarRestore)!=0; 
- 	for(new i=0;i<MAX_BUTTONS;i++){ 
- 		gUsed[i]=gOnStart[i]; 
- 		if(bRestore){ 
- 			restoreButton(gEnt[i]); 
- 		} 
- 	} 
- 	giRounds++; 
- } 
- public fwButtonUsed(this, idcaller, idactivator, use_type, Float:value){ 
- 	if(idcaller!=idactivator) return HAM_IGNORED; 
-   
- 	if(pev(this, pev_frame) > 0.0) 
- 		 return HAM_IGNORED; 
- 	new index=get_ent_index(this); 
- 	if(index==-1)  
- 		return HAM_IGNORED; 
- 	if(get_user_team(idcaller)&get_pcvar_num(gcvarTeam)){ 
-   
- 		if(gbFreeRun){ 
- 			ColorChat(idcaller,GREEN, "[FreeRun]^x01 %L",idcaller, "BUTTON_FREERUN"); 
- 			return HAM_SUPERCEDE; 
- 		} 
- 		else if(gUsed[index]<=0 && gOnStart[index]!=-1){ 
- 			ColorChat(idcaller,GREEN, "[Info]^x01 %L",idcaller,"BUTTON_NOMORE"); 
- 			return HAM_SUPERCEDE; 
- 		} 
- 		else{ 
- 			if(gUsed[index]>0) 
- 				if(--gUsed[index]){ 
- 					ColorChat(idcaller, GREEN, "[Info]^x01 %L", idcaller, "BUTTON_LEFT", gUsed[index]); 
- 				}else 
- 					ColorChat(idcaller, GREEN, "[Info]^x01 %L", idcaller, "BUTTON_ENDOFLIMIT"); 
- 		} 
- 	} 
-   
- 	set_task(0.1,"setDelay",this); 
-   
- 	return HAM_IGNORED; 
- } 
- public setDelay(this){ 
- 	new index=get_ent_index(this); 
- 	set_pev(this, pev_nextthink, pev(this, pev_ltime)+gDelay[index]+0.01); 
- } 
-   
- //MENU-------------- 
- public cmd_amx_buttons(id, level, cid){ 
- 	if(!cmd_access(id, level, cid, 1)) 
- 		return PLUGIN_HANDLED; 
- 	if(giPointer==0) 
- 		client_print(id, print_chat, "%L", id,"NO_BUTTONS"); 
- 	else 
- 		ShowButtonsMenu(id); 
- 	return PLUGIN_HANDLED; 
- } 
- ShowButtonsMenu(id, trace=1){ 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id, "MUST_B_ALIVE"); 
- 		return; 
- 	} 
- 	new iNow=gInMenu[id]; 
- 	new iKeys=(1<<0)|(1<<2)|(1<<3)|(1<<4)|(1<<5)|(1<<6)|(1<<9); 
- 	new szMenu[196], iLen, iMax=(sizeof szMenu) - 1; 
- 	new szNoLimit[32]; 
- 	formatex(szNoLimit,31,"(%L)",id,"NOLIMIT"); 
- 	iLen=copy(szMenu, iMax,"\yButtons Menu^n"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"\wEnt#%d^n^n",gEnt[iNow]); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"%L: %d %s^n\y1\w. %L ",id, "USAGE",gOnStart[iNow],(gOnStart[iNow]==-1)?szNoLimit:"", id, "MORE"); 
-   
- 	if(gOnStart[iNow]>=0){ 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"\y2\w. %L",id, "WORD_LESS"); 
- 		iKeys|=(1<<1); 
- 	}else 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"\d2. %L\w",id,"WORD_LESS"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"^n^n3. %L^n^n4. %L^n^n",id, "DELAY_EDITOR",id,"OPTIONS"); 
-   
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"5. %sNo Clip\w^n",isNoClip(id)?"\r":""); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"6. %sGodMode\w^n",isGodMode(id)?"\r":""); 
-   
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"^n7. \r%L^n\w",id, "WORD_SAVE"); 
-   
- 	if(iNow>0){ 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"^n8. %L",id, "BACK"); 
- 		iKeys|=(1<<7); 
- 	} 
- 	if(iNow<giPointer-1){ 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"^n9. %L",id, "WORD_NEXT"); 
- 		iKeys|=(1<<8); 
- 	} 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"^n0. %L", id, "EXIT"); 
- 	show_menu(id, iKeys, szMenu, -1, "ButtonsMenu"); 
- 	if(trace){ 
- 		new Float:fOrigin[3], Float:fOrigin2[3]; 
- 		fm_get_brush_entity_origin(gEnt[gInMenu[id]], fOrigin); 
- 		pev(id, pev_origin, fOrigin2); 
- 		Create_TE_BEAMPOINTS(fOrigin, fOrigin2, giSprite, 0, 10, 20, 5, 1, 255, 0, 0, 100, 50); 
- 	} 
- } 
- bool:isNoClip(id) 
- 	return pev(id, pev_movetype)==MOVETYPE_NOCLIP; 
-   
- bool:isGodMode(id) 
- 	return pev(id, pev_takedamage)==0.0; 
-   
- public PressedButtonsMenu(id, key) { 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id,"MUST_B_ALIVE"); 
- 		return; 
- 	} 
- 	/* Menu: 
- 	* Buttons Menu 
- 	* Ent#<ent> 
- 	*  
- 	* Uzyc: <ile> 
- 	* 1. Wiecej 2. Mniej 
- 	*  
- 	* 3. Editor 
- 	* 
- 	* 4. Options 
- 	* 
- 	* 5. NoClip 
- 	* 6. GodMode 
- 	*  
- 	* 7. Zapisz 
- 	*  
- 	* 8. Poprzedni 
- 	* 9. Nastepny 
- 	* 0. Wyjdz 
- 	*/ 
- 	new trace=0; 
- 	switch (key) { 
- 		case 0: { // 1 
- 			gOnStart[gInMenu[id]]++; 
- 		} 
- 		case 1: { // 2 
- 			gOnStart[gInMenu[id]]--; 
- 		} 
- 		case 2: { // 3 
- 			ShowDelayMenu(id); 
- 			return; 
- 		} 
- 		case 3:{ //4 
- 			ShowOptionsMenu(id); 
- 			return; 
- 		} 
- 		case 4:{ //5 
- 			set_pev(id, pev_movetype, isNoClip(id)?MOVETYPE_WALK:MOVETYPE_NOCLIP);	 
- 		} 
- 		case 5:{ //6 
- 			set_pev(id, pev_takedamage, isGodMode(id)?1.0:0.0); 
- 		} 
- 		case 6: { // 7 
- 			save2File(id); 
- 		} 
- 		case 7: { // 8 
- 			gInMenu[id]--; 
- 			trace=1; 
- 		} 
- 		case 8: { // 9 
- 			gInMenu[id]++; 
- 			trace=1; 
- 		} 
- 		case 9: { // 0 
- 			return; 
- 		} 
- 	} 
- 	ShowButtonsMenu(id, trace); 
- } 
- //-------------- 
- ShowOptionsMenu(id){ 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id,"MUST_B_ALIVE"); 
- 		return; 
- 	} 
- 	new szMenu[196], iLen, iMax=(sizeof szMenu) - 1; 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"\yOptions^n^n"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"\w1. %L^n",id, "GOTO"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"2. %L^n^n",id, "NEAREST"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"9. %L",id, "BACK"); 
- 	show_menu(id, KeysOptionsMenu, szMenu, -1, "OptionsMenu"); 
- } 
- public PressedOptionsMenu(id, key){ 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id,"MUST_B_ALIVE"); 
- 		return; 
- 	} 
- 	new trace=0; 
- 	switch (key) { 
- 		case 0: { // 1 
- 			go2Button(id); 
- 		} 
- 		case 1: { // 2 
- 			gInMenu[id]=findTheClosest(id); 
- 			trace=1; 
- 		} 
- 	} 
- 	ShowButtonsMenu(id, trace); 
- } 
- //------------- 
- ShowDelayMenu(id){ 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id,"MUST_B_ALIVE"); 
- 		return; 
- 	} 
- 	new iNow=gInMenu[id]; 
- 	new iKeys=(1<<0)|(1<<2)|(1<<8); 
- 	new szMenu[196], iLen, iMax=(sizeof szMenu) - 1; 
- 	iLen=copy(szMenu, iMax,"\yDelay Menu^n"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"\wEnt#%d^n^n",gEnt[iNow]); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"%L: %.1f^n",id, "CURRENT_DELAY", gDelay[iNow]); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"\y1\w. %L ",id, "MORE"); 
- 	if(gDelay[iNow]>0.0){ 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"\y2\w. %L",id, "WORD_LESS"); 
- 		iKeys|=(1<<1); 
- 	}else 
- 		iLen+=formatex(szMenu[iLen], iMax-iLen,"\d2. %L\w",id,"WORD_LESS"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"^n3. %L",id, "DEFAULT"); 
- 	iLen+=formatex(szMenu[iLen], iMax-iLen,"^n^n9. %L",id, "BACK"); 
- 	show_menu(id, iKeys, szMenu, -1, "DelayMenu"); 
- } 
- public PressedDelayMenu(id, key){ 
- 	new iNow=gInMenu[id]; 
- 	switch(key){ 
- 		case 0:{ 
- 			gDelay[iNow]+=1.0; 
- 		} 
- 		case 1:{ 
- 			gDelay[iNow]-=1.0; 
- 			if(gDelay[iNow] < 0.0) 
- 				gDelay[iNow]=0.0; 
- 		} 
- 		case 2:{ 
- 			gDelay[iNow]=gDefaultDelay[iNow]; 
- 		} 
- 		case 8:{ 
- 			ShowButtonsMenu(id, 0); 
- 			return; 
- 		} 
- 	} 
- 	ShowDelayMenu(id); 
- } 
- //------------- 
- save2File(id){ 
- 	if(file_exists(gszFile)) 
- 		delete_file(gszFile); 
- 	write_file(gszFile, ";<ent> <count> <delay>"); 
- 	new szLine[35]; 
- 	for(new i=0;i<giPointer;i++){ 
- 		formatex(szLine, 34, "%d %d %.1f",gEnt[i], gOnStart[i], gDelay[i]); 
- 		write_file(gszFile, szLine); 
- 	} 
- 	client_print(id, print_center, "%L!",id,"WORD_SAVED"); 
- } 
- findTheClosest(id){ 
- 	new Float:fPlayerOrig[3]; 
- 	pev(id, pev_origin, fPlayerOrig); 
- 	new Float:fOrigin[3]; 
- 	fm_get_brush_entity_origin(gEnt[0], fOrigin); 
-   
- 	new Float:fRange=get_distance_f(fOrigin, fPlayerOrig), index=0; 
- 	new Float:fNewRange; 
- 	for(new i=1;i<giPointer;i++){ 
- 		fm_get_brush_entity_origin(gEnt[i], fOrigin); 
- 		fNewRange=get_distance_f( fOrigin,  fPlayerOrig); 
- 		if(fNewRange < fRange){ 
- 			fRange=fNewRange; 
- 			index=i; 
- 		} 
- 	} 
- 	return index; 
- } 
- go2Button(id, ent=-1){ 
- 	if(ent==-1) 
- 		ent=gInMenu[id]; 
- 	ent=gEnt[ent]; 
- 	if(!pev_valid(ent)){ 
- 		client_print(id, print_center, "%L",id,"NOTARGET"); 
- 		return; 
- 	} 
- 	new Float:fOrigin[3]; 
- 	fm_get_brush_entity_origin(ent, fOrigin); 
- 	set_pev(id, pev_origin, fOrigin); 
- 	client_print(id, print_chat, "PS. No Clip <!-- s:) --><img src=\"{SMILIES_PATH}/icon_e_smile.gif\" alt=\":)\" title=\"mosoly\" /><!-- s:) -->"); 
- } 
- //FreeRun 
- public cmdVoteFreeRun(id){ 
- 	if(get_pcvar_num(gcvarFreeRun)==0){ 
- 		ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_DISABLED"); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	if(gbVote){ 
- 		ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_VOTE_IS_NOW"); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	if(!is_user_alive(id)){ 
- 		client_print(id, print_center, "%L",id, "MUST_B_ALIVE"); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	if(get_pcvar_num(gcvarPrivilege)!=0 && !gbFreeRun && get_user_team(id)==1){ 
- 		ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_TT_DECIDED"); 
- 		makeFreeRun(true); 
- 		return PLUGIN_HANDLED; 
- 	} 
- 	new iLimit=get_pcvar_num(gcvarLimit); 
- 	new iOffset=0; 
- 	if(get_pcvar_num(gcvarLimitMode)){ 
- 		iOffset = ( giTime + iLimit * 60 )  - get_systime(); 
- 		if( iOffset > 0 ){ 
- 		 	ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_NEXT_VOTE_TIME", iOffset/60, iOffset%60); 
- 			return PLUGIN_HANDLED; 
- 		} 
- 	} 
- 	else{ 
- 		iOffset =  min(MAX_ROUNDS, iLimit) - giRounds; 
- 		if( iOffset > 0 ){ 
- 		 	ColorChat(id, GREEN, "[FreeRun]^x01 %L",id,"FREERUN_NEXT_VOTE_ROUNDS", iOffset); 
- 			return PLUGIN_HANDLED; 
- 		} 
- 	} 
-   
- 	makeVote(); 
- 	return PLUGIN_CONTINUE; 
- } 
- //FREERUN 
- public makeVote(){ 
- 	giVoteTime=get_pcvar_num(gcvarFRVoteTime); 
- 	gbVote=true; 
- 	giVoteStart=get_systime(); 
- 	set_task(float(giVoteTime), "resultsOfVote", TASK_RES); 
- 	new Players[32], playerCount; 
- 	new id; 
- 	get_players(Players, playerCount); 
- 	for (new i=0; i<playerCount; i++){ 
- 		id = Players[i];  
- 		eventInGame(id); 
- 	} 
-   
- } 
- public resultsOfVote(tid){ 
- 	gbVote=false; 
-   
- 	new giVotesOn=count(VOTE_ON); 
- 	new giVotesOff=count(VOTE_OFF); 
-   
- 	ColorChat(0,GREEN, "[FreeRun]^x01 %L %L(%d) vs %L(%d)",LANG_SERVER,"FREERUN_RESULTS",LANG_SERVER,"YES",giVotesOn,LANG_SERVER,"NO", giVotesOff); 
-   
- 	if( giVotesOn == giVotesOff ){ 
- 		ColorChat(0,GREEN, "[FreeRun]^x01 %L",LANG_SERVER,"FREERUN_TIE"); 
- 		return; 
- 	} 
- 	makeFreeRun((giVotesOn > giVotesOff)); 
- 	ColorChat(0,GREEN, "[FreeRun]^x01 %L ^x03%L",LANG_SERVER,"FREERUN_WINOPTION",LANG_SERVER, gbFreeRun?"YES":"NO"); 
- } 
- makeFreeRun(bool:bFR=true){ 
- 	gbFreeRun=bFR; 
- 	reset(); 
- 	giRounds=0; 
- 	giTime=get_systime(); 
-   
- 	if(gbFreeRun){ 
- 		set_hudmessage(0, 255, 255, 0.02, -1.0); 
- 		show_hudmessage(0, "FreeRun!"); 
- 	} 
-   
- } 
- count(VOTE_STATE){ 
- 	new iCounter=0; 
- 	for(new i=1;i<33;i++) 
- 		if(giVotes[i][VOTE_STATE]) 
- 			iCounter++; 
- 	return iCounter; 
- } 
- reset(){ 
- 	for(new i=1;i<33;i++){ 
- 		giVotes[i][VOTE_ON]=0; 
- 		giVotes[i][VOTE_OFF]=0; 
- 	} 
- } 
- public show_menu_(tid){ 
- 	new id=tid-TASK_SHOWMENU; 
- 	new iTeam=get_user_team(id); 
- 	new menu_id, keys; 
- 	new menuUp = player_menu_info( id, menu_id, keys ); 
- 	// Only display menu if another isn't shown 
- 	if ( iTeam && (menuUp <= 0 || menu_id < 0) ){ 
- 		new iTime=get_pcvar_num(gcvarFRVoteTime); 
- 		new iOffset=get_systime()-giVoteStart; 
- 		iTime-=iOffset; 
- 		new szMenu[128]; 
- 		formatex(szMenu, 127, "\y%L^n^n\w1. %L^n2. %L",id,"FREERUN_VOTEMENU",id,"YES",id,"NO"); 
- 		show_menu(id, KeysFFVote, szMenu, iTime, "FRVote"); 
- 	}else 
- 		set_task(1.0, "show_menu_", tid); 
- } 
- public eventInGame(id){ 
- 	if(giVotes[id][VOTE_ON] || giVotes[id][VOTE_OFF]) 
- 		return; 
- 	if(gbVote) 
- 		set_task(1.0, "show_menu_", id+TASK_SHOWMENU); 
- } 
- public PressedFRVote(id, key) { 
- 	if(gbVote==false) return; 
- 	switch (key) { 
- 		case VOTE_ON: { // 1 
- 			giVotes[id][VOTE_ON]=1; 
- 		} 
- 		case VOTE_OFF: { // 2 
- 			giVotes[id][VOTE_OFF]=1; 
- 		} 
- 		default:{ 
- 			return; 
- 		} 
- 	} 
- 	new szName[32]; 
- 	get_user_name(id, szName, 31); 
-   
- 	client_print(0, print_chat, "* %L",LANG_PLAYER,(key==VOTE_ON)?"VOTED_FOR":"VOTED_AGAINST", szName); 
- } 
-   
- stock Create_TE_BEAMPOINTS(Float:start[3], Float:end[3], iSprite, startFrame, frameRate, life, width, noise, red, green, blue, alpha, speed){ 
- 	message_begin( MSG_BROADCAST, SVC_TEMPENTITY ) 
- 	write_byte( TE_BEAMPOINTS ) 
- 	write_coord( floatround(start[0]) ) 
- 	write_coord( floatround(start[1]) ) 
- 	write_coord( floatround(start[2]) ) 
- 	write_coord( floatround(end[0]) ) 
- 	write_coord( floatround(end[1]) ) 
- 	write_coord( floatround(end[2]) ) 
- 	write_short( iSprite )			// model 
- 	write_byte( startFrame )		// start frame 
- 	write_byte( frameRate )			// framerate 
- 	write_byte( life )				// life 
- 	write_byte( width )				// width 
- 	write_byte( noise )				// noise 
- 	write_byte( red)				// red 
- 	write_byte( green )				// green 
- 	write_byte( blue )				// blue 
- 	write_byte( alpha )				// brightness 
- 	write_byte( speed )				// speed 
- 	message_end() 
- } 
- stock fm_get_brush_entity_origin(ent, Float:fOrigin[3]){ 
- 	new Float:fMins[3], Float:fMaxs[3]; 
- 	pev(ent, pev_mins, fMins); 
- 	pev(ent, pev_maxs, fMaxs); 
-   
- 	for(new i=0;i<3;i++) 
- 		fOrigin[i]=(fMins[i]+fMaxs[i])/2; 
- } 
-