- /* AMX Mod X - Script 
- * 
- *	Admin Spectator ESP v1.3 
- *	Copyright (C) 2006 by KoST 
- * 
- *	this plugin along with its compiled version can de downloaded here: 
- *	http://www.amxmodx.org/forums/viewtopic.php?t=24787	 
- *	 
- * 
- *  This program is free software; you can redistribute it and/or 
- *  modify it under the terms of the GNU General Public License 
- *  as published by the Free Software Foundation; either version 2 
- *  of the License, or (at your option) any later version. 
- * 
- *  This program is distributed in the hope that it will be useful, 
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
- *  GNU General Public License for more details. 
- * 
- *  You should have received a copy of the GNU General Public License 
- *  along with this program; if not, write to the Free Software 
- *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. 
- *  or download here: http://www.gnu.org/licenses/gpl.txt 
- * 
- *  In addition, as a special exception, the author gives permission to 
- *  link the code of this program with the Half-Life Game Engine ("HL 
- *  Engine") and Modified Game Libraries ("MODs") developed by Valve, 
- *  L.L.C ("Valve"). You must obey the GNU General Public License in all 
- *  respects for all of the code used other than the HL Engine and MODs 
- *  from Valve. If you modify this file, you may extend this exception 
- *  to your version of the file, but you are not obligated to do so. If 
- *  you do not wish to do so, delete this exception statement from your 
- *  version. 
- */ 
- //-------------------------------------------------------------------------------------------------- 
-   
- #include <amxmodx> 
- #include <engine> 
-   
- // Here you can adjust the required admin level if needed 
- // there is a list of all levels http://www.amxmodx.org/funcwiki.php?go=module&id=1#const_admin 
-   
- #define REQUIRED_ADMIN_LEVEL ADMIN_KICK 
-   
- //-------------------------------------------------------------------------------------------------- 
-   
- #define PLUGIN "Admin Spectator ESP" 
- #define VERSION "1.3" 
- #define AUTHOR "KoST" 
-   
- enum { 
- 	ESP_ON=0, 
- 	ESP_LINE, 
- 	ESP_BOX, 
- 	ESP_NAME, 
- 	ESP_HEALTH_ARMOR, 
- 	ESP_WEAPON, 
- 	ESP_CLIP_AMMO, 
- 	ESP_DISTANCE, 
- 	ESP_TEAM_MATES, 
- 	ESP_AIM_VEC, 
- } 
-   
- new bool:admin[33] // is/is not admin 
- new bool:first_person[33] //is/is not in first person view 
- new spec[33] // spec[player_id]=the players id if 
- new laser // precached model 
- new max_players // if you start hlds with +maxplayers 20 for example this would be 20 
- new team_colors[4][3]={{0,0,0},{150,0,0},{0,0,150},{0,150,0}}  
- new esp_colors[5][3]={{0,255,0},{100,60,60},{60,60,100},{255,0,255},{128,128,128}} 
- new bool:ducking[33] //is/is not player ducked 
- new damage_done_to[33] //damage_done_to[p1]=p2 // p1 has hit p2 
- new view_target[33] // attackers victim 
- new bool:admin_options[33][10] // individual esp options 
- new bool:is_in_menu[33] // has esp menu open 
-   
- // weapon strings 
- new weapons[30][10]={"None","P228","Scout","HE","XM1014","C4", 
- 	"MAC-10","AUG","Smoke","Elite","Fiveseven", 
- 	"UMP45","SIG550","Galil","Famas","USP", 
- 	"Glock","AWP","MP5","M249","M3","M4A1", 
- 	"TMP","G3SG1","Flash","Deagle","SG552", 
- 	"AK47","Knife","P90"} 
-   
- public plugin_precache(){ 
- 	laser=precache_model("sprites/laserbeam.spr")  
- } 
-   
- public plugin_init(){ 
- 	register_plugin(PLUGIN,VERSION,AUTHOR) 
- 	server_print("^n^t%s v%s, Copyright (C) 2006 by %s^n",PLUGIN,VERSION,AUTHOR) 
-   
- 	// cvars 
- 	register_cvar("esp","1") 
- 	register_cvar("esp_timer","0.3") 
- 	register_cvar("esp_allow_all","0") 
- 	register_cvar("esp_disable_default_keys","0") 
- 	register_cvar("aesp_version",VERSION,FCVAR_SERVER|FCVAR_UNLOGGED|FCVAR_SPONLY) 
-   
- 	// client commands 
- 	register_clcmd("esp_menu","cmd_esp_menu",REQUIRED_ADMIN_LEVEL,"Shows ESP Menu") 
- 	register_clcmd("esp_toggle","cmd_esp_toggle",REQUIRED_ADMIN_LEVEL,"Toggle ESP on/off") 
- 	register_clcmd("say /esp_menu","cmd_esp_menu",REQUIRED_ADMIN_LEVEL,"Shows ESP Menu") 
- 	register_clcmd("say /esp_toggle","cmd_esp_toggle",REQUIRED_ADMIN_LEVEL,"Toggle ESP on/off") 
- 	register_clcmd("esp_settings","cmd_esp_settings",REQUIRED_ADMIN_LEVEL," ESP adasdsassdasd") 
-   
-   
- 	// events 
- 	register_event("StatusValue","spec_target","bd","1=2") 
- 	register_event("SpecHealth2","spec_target","bd") 
- 	register_event("TextMsg","spec_mode","b","2&#Spec_Mode") 
- 	register_event("Damage", "event_Damage", "b", "2!0", "3=0", "4!0") 
- 	register_event("ResetHUD", "reset_hud_alive", "be") 
-   
-   
- 	// menu 
- 	new keys=MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9 
- 	register_menucmd(register_menuid("Admin Specator ESP"),keys,"menu_esp") 
-   
- 	max_players=get_maxplayers() 
-   
- 	// start esp_timer for the first time 
- 	set_task(1.0,"esp_timer") 
- }  
-   
- public reset_hud_alive(id){ 
- 	spec[id]=0 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public cmd_esp_settings(id){ 
- 	if (admin[id]){ 
- 		new out[11] 
- 		read_argv(1,out,10) 
- 		new len=strlen(out) 	 
- 		for (new i=0;i<len;i++){ 
- 			if (out[i]=='1'){ 
- 				admin_options[id][i]=true 
- 			}else{ 
- 				admin_options[id][i]=false 
- 			} 
- 		} 
- 	} 
- } 
-   
- public cmd_esp_menu(id){ 
- 	if (admin[id] && get_cvar_num("esp")==1){ 
- 		show_esp_menu(id) 
- 	} 
- } 
-   
- public cmd_esp_toggle(id){ 
- 	if (admin[id] && get_cvar_num("esp")==1){ 
- 		change_esp_status(id,!admin_options[id][0]) 
- 	} 
- } 
-   
- public show_esp_menu(id){ 
- 	is_in_menu[id]=true 
- 	new menu[301] 
- 	new keys=MENU_KEY_0|MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MENU_KEY_8|MENU_KEY_9 
- 	new onoff[2][]={{"\ki\"},{"\be\"}} // \r=Piros \y=Sarga \w=Feher 
- 	new text[2][]={{"(Itt tudod ki/be kapcsolni az admin wh funkcioit)"},{"(use esp_toggle command to toggle)"}} // \r=Piros \y=Sarga \w=Feher 
- 	new text_index=get_cvar_num("esp_disable_default_keys") 
- 	if (text_index!=1) text_index=0 
- 	format(menu, 300, "Admin Specator ESP^n %s %s^n^n1. Vonal %s^n2. HitBox %s^n3. Nev %s^n4. Hp/Ap %s^n5. Fegyver %s^n6. Loszer %s^n7. Tavolsag %s^n8. Csapattars %s^n9. AimVektor %s^n^n0. Kilep", 
- 	onoff[admin_options[id][ESP_ON]], 
- 	text[text_index], 
- 	onoff[admin_options[id][ESP_LINE]], 
- 	onoff[admin_options[id][ESP_BOX]], 
- 	onoff[admin_options[id][ESP_NAME]], 
- 	onoff[admin_options[id][ESP_HEALTH_ARMOR]], 
- 	onoff[admin_options[id][ESP_WEAPON]], 
- 	onoff[admin_options[id][ESP_CLIP_AMMO]], 
- 	onoff[admin_options[id][ESP_DISTANCE]], 
- 	onoff[admin_options[id][ESP_TEAM_MATES]], 
- 	onoff[admin_options[id][ESP_AIM_VEC]]) 
- 	show_menu(id,keys,menu) 
-   
- 	return PLUGIN_HANDLED 
- } 
-   
- public menu_esp(id,key){ 
- 	if (key==9){ // exit 
- 		is_in_menu[id]=false 
- 		return PLUGIN_HANDLED 
- 	} 
- 	// toggle esp options 
- 	if (admin_options[id][key+1]){ 
- 		admin_options[id][key+1]=false 
- 		}else{ 
- 		admin_options[id][key+1]=true 
- 	} 
- 	show_esp_menu(id) 
- 	return PLUGIN_HANDLED 
- } 
-   
- public event_Damage(id){ 
- 	if (id>0) { 
- 		new attacker=get_user_attacker(id) 
- 		if (attacker>0 && attacker<=max_players){  
- 			if (view_target[attacker]==id){ 
- 				damage_done_to[attacker]=id 
- 			} 
- 		} 
- 	} 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public spec_mode(id){ 
- 	// discover if in first_person_view 
- 	new specMode[12] 
- 	read_data(2,specMode,11) 
-   
- 	if(equal(specMode,"#Spec_Mode4")){ 
- 		first_person[id]=true 
- 		}else{ 
- 		first_person[id]=false 
- 	} 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public spec_target(id){ 
- 	if (id>0){ 
- 		new target=read_data(2) 
- 		if (target!=0){ 
- 			spec[id]=target 
- 		} 
- 	} 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public client_putinserver(id){ 
- 	first_person[id]=false 
- 	if ((get_user_flags(id) & REQUIRED_ADMIN_LEVEL) || get_cvar_num("esp_allow_all")==1){ 
- 		admin[id]=true 
- 		init_admin_options(id) 
-   
- 		}else{ 
- 		admin[id]=false 
- 	} 
- } 
-   
- public init_admin_options(id){ 
-   
- 	for (new i=0;i<10;i++){ 
- 		admin_options[id][i]=true 
- 	} 
- 	admin_options[id][ESP_TEAM_MATES]=false 
- 	load_vault_data(id) 
- } 
-   
- public save2vault(id){ 
- 	if (admin[id]){ 
- 		new authid[35] 
- 		get_user_authid (id,authid,34)  
- 		new tmp[11] 
-   
- 		for (new s=0;s<10;s++){ 
-   
- 			if (admin_options[id][s]){ 
- 				tmp[s]='1'; 
- 			}else{ 
- 				tmp[s]='0'; 
- 			} 
- 		} 
- 		tmp[10]=0 
-   
- 		//server_print("STEAMID: %s OPTIONS: %s",authid,tmp); 
- 		new key[41] 
- 		format(key,40,"AESP_%s",authid)  
-   
- 		set_vaultdata(key,tmp) 
- 	} 
- } 
-   
- public load_vault_data(id){ 
- 	if (admin[id]){ 
- 		new data[11] 
- 		new authid[35] 
- 		get_user_authid (id,authid,34) 
- 		new key[41] 
- 		format(key,40,"AESP_%s",authid)  
- 		get_vaultdata(key,data,10) 
- 		if (strlen(data)>0){ 
- 			for (new s=0;s<10;s++){ 
- 				if (data[s]=='1'){ 
- 					admin_options[id][s]=true 
- 				}else{ 
- 					admin_options[id][s]=false 
- 				} 
- 			} 
- 		} 
- 	}	 
-   
- } 
-   
- public client_disconnect(id){ 
- 	save2vault(id) 
- 	admin[id]=false 
- 	spec[id]=0 
- } 
-   
- public change_esp_status(id,bool:on){ 
- 	if (on){ 
- 		admin_options[id][0]=true 
- 		if (!is_in_menu[id]) client_print(id,print_chat,"[%s] BEKAPCSOLVA",PLUGIN) 
- 		if (is_in_menu[id]) show_esp_menu(id) 
- 	}else{ 
- 		admin_options[id][0]=false 
- 		if (!is_in_menu[id]) client_print(id,print_chat,"[%s] KIKAPCSOLVA",PLUGIN) 
- 		if (is_in_menu[id]) show_esp_menu(id) 
- 	} 
- } 
-   
- public client_PreThink(id){ 
- 	if (!is_user_connected(id)) return PLUGIN_CONTINUE 
-   
- 	new button=get_user_button(id) 
- 	if (button==0) return PLUGIN_CONTINUE // saves a lot of cpu 
-   
- 	new oldbutton=get_user_oldbutton(id) 
-   
- 	if (button & IN_DUCK){ 
- 		ducking[id]=true 
- 		}else{ 
- 		ducking[id]=false 
- 	} 
-   
- 	if ((get_cvar_num("esp")==1) && (get_cvar_num("esp_disable_default_keys")!=1)){ 
- 		if (admin[id]){ 
- 			if (first_person[id] && !is_user_alive(id)){ 
- 				if ((button & IN_RELOAD) && !(oldbutton & IN_RELOAD)){ 
- 					show_esp_menu(id) 
- 				} 
- 				if ((button & IN_FORWARD)  && !(oldbutton & IN_FORWARD) && !admin_options[id][0]){ 
- 					change_esp_status(id,true) 
- 				} 
- 				if ((button & IN_BACK)  && !(oldbutton & IN_BACK) && admin_options[id][0]){ 
- 					change_esp_status(id,false) 
- 				} 
- 			} 
- 		} 
- 	} 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public draw_aim_vector(i,s,len){ 
- 	new Float:endpoint[3] 
- 	new tmp[3] 
- 	new Float:vec1[3] 
- 	get_user_origin(s, tmp, 1) 
- 	IVecFVec(tmp,vec1) 
- 	vec1[2]-=6.0 
- 	VelocityByAim(s,len,endpoint) // get aim vector 
- 	addVec(endpoint,vec1) // add origin to get absolute coordinates 
- 	make_TE_BEAMPOINTS(i,4,vec1,endpoint,10,0,255) 
- 	return PLUGIN_CONTINUE 
- } 
-   
- public esp_timer(){ 
-   
- 	if (get_cvar_num("esp")!=1) { // if esp is not 1, it is off 
- 		set_task(1.0,"esp_timer") // check for reactivation in 1 sec intervals 
- 		return PLUGIN_CONTINUE 
- 	} 
-   
- 	for (new i=1;i<=max_players;i++){ // loop through players 
-   
- 		if (admin_options[i][ESP_ON] && first_person[i] && is_user_connected(i) && admin[i] && (!is_user_alive(i)) && (spec[i]>0) && is_user_alive(spec[i])){ // :) 
-   
- 			new spec_id=spec[i] 
- 			new Float:my_origin[3]  
- 			entity_get_vector(i,EV_VEC_origin,my_origin) // get origin of spectating admin 
- 			new my_team 
- 			my_team=get_team(spec_id) // get team of spectated :) 
-   
- 			new Float:smallest_angle=180.0  
- 			new smallest_id=0 
- 			new Float:xp=2.0,Float:yp=2.0 // x,y of hudmessage 
- 			new Float:dist 
-   
- 			for (new s=1;s<=max_players;s++){ // loop through the targets 
- 				if (is_user_alive(s)){ // target must be alive 
- 					new target_team=get_team(s) // get team of target 
- 					if (!(target_team==3)){ //if not spectator 
- 						if (spec_id!=s){ // do not target myself 
- 							// if the target is in the other team and not spectator 
-   
- 							if (((my_team!=target_team && (target_team==1 || target_team==2)) || admin_options[i][ESP_TEAM_MATES])){ 
-   
- 								new Float:target_origin[3] 
- 								// get origin of target 
- 								entity_get_vector(s,EV_VEC_origin,target_origin) 
-   
-   
- 								// get distance from me to target 
- 								new Float:distance=vector_distance(my_origin,target_origin) 
-   
- 								if (admin_options[i][ESP_LINE]){ 
-   
- 									new width 
- 									if (distance<2040.0){ 
- 										// calculate width according to distance 
- 										width=(255-floatround(distance/8.0))/3 
- 										}else{ 
- 										width=1 
- 									}	 
- 									// create temp_ent 
- 									make_TE_BEAMENTPOINT(i,target_origin,width,target_team) 
- 								} 
-   
-   
- 								// get vector from me to target 
- 								new Float:v_middle[3] 
- 								subVec(target_origin,my_origin,v_middle) 
-   
- 								// trace from me to target, getting hitpoint 
- 								new Float:v_hitpoint[3] 
- 								trace_line (-1,my_origin,target_origin,v_hitpoint) 
-   
- 								// get distance from me to hitpoint (nearest wall) 
- 								new Float:distance_to_hitpoint=vector_distance(my_origin,v_hitpoint) 
-   
- 								// scale 
- 								new Float:scaled_bone_len 
- 								if (ducking[spec_id]){ 
- 									scaled_bone_len=distance_to_hitpoint/distance*(50.0-18.0) 
- 									}else{ 
- 									scaled_bone_len=distance_to_hitpoint/distance*50.0 
- 								} 
- 								scaled_bone_len=distance_to_hitpoint/distance*50.0 
-   
- 								new Float:scaled_bone_width=distance_to_hitpoint/distance*150.0 
-   
- 								new Float:v_bone_start[3],Float:v_bone_end[3] 
- 								new Float:offset_vector[3] 
- 								// get the point 10.0 units away from wall 
- 								normalize(v_middle,offset_vector,distance_to_hitpoint-10.0) // offset from wall 
-   
- 								// set to eye level 
- 								new Float:eye_level[3] 
- 								copyVec(my_origin,eye_level) 
-   
- 								if (ducking[spec_id]){ 
- 									eye_level[2]+=12.3 
- 									}else{ 
- 									eye_level[2]+=17.5 
- 								} 
-   
-   
- 								addVec(offset_vector,eye_level) 
-   
- 								// start and end of green box 
- 								copyVec(offset_vector,v_bone_start) 
- 								copyVec(offset_vector,v_bone_end) 
- 								v_bone_end[2]-=scaled_bone_len 
-   
- 								new Float:distance_target_hitpoint=distance-distance_to_hitpoint 
-   
- 								new actual_bright=255 
-   
- 								if (admin_options[i][ESP_BOX]){ 
- 									// this is to make green box darker if distance is larger 
- 									if (distance_target_hitpoint<2040.0){ 
- 										actual_bright=(255-floatround(distance_target_hitpoint/12.0)) 
-   
- 										}else{ 
- 										actual_bright=85 
- 									}	 
- 									new color 
- 									if (distance_to_hitpoint!=distance){ // if no line of sight 
- 										color=0 
- 										}else{ // if line of sight 
- 										color=target_team 
- 									} 
-   
- 									if (damage_done_to[spec_id]==s) { 
- 										color=3 
- 										damage_done_to[spec_id]=0 
- 									} 
- 									make_TE_BEAMPOINTS(i,color,v_bone_start,v_bone_end,floatround(scaled_bone_width),target_team,actual_bright) 
- 								} 
-   
-   
- 								if (admin_options[i][ESP_AIM_VEC] || admin_options[i][ESP_NAME] || admin_options[i][ESP_HEALTH_ARMOR] || admin_options[i][ESP_WEAPON] || admin_options[i][ESP_CLIP_AMMO] || admin_options[i][ESP_DISTANCE]){ 
-   
-   
- 									new Float:ret[2] 
- 									new Float:x_angle=get_screen_pos(spec_id,v_middle,ret) 
-   
- 									// find target with the smallest distance to crosshair (on x-axis) 
- 									if (smallest_angle>floatabs(x_angle)){ 
- 										if (floatabs(x_angle)!=0.0){ 
- 											smallest_angle=floatabs(x_angle) 
- 											view_target[spec_id]=s 
- 											smallest_id=s // store nearest target id.. 
- 											xp=ret[0] // and x,y coordinates of hudmessage 
- 											yp=ret[1] 
- 											dist=distance 
- 										} 
- 									} 
- 								} 
- 							} 
- 						} 
- 					} 
- 				} 
- 			} // inner player loop end 
- 			if (!is_user_alive(smallest_id)) { 
- 				smallest_id=0 
- 				xp=-1.0 
- 			} 
- 			if (smallest_id>0 && admin_options[i][ESP_AIM_VEC]){ 
- 				draw_aim_vector(i,smallest_id,2000) 
- 			} 
- 			if (xp>0.0 && xp<=1.0 && yp>0.0 && yp<=1.0){ // if in visible range 
- 				// show the player info 
- 				set_hudmessage(255, 255, 0, floatabs(xp), floatabs(yp), 0, 0.0, get_cvar_float("esp_timer"), 0.0, 0.0, 2) 
-   
- 				new name[37]="" 
- 				new tmp[33] 
- 				get_user_name(smallest_id,tmp,32) 
- 				if (admin_options[i][ESP_NAME]){ 
- 					format(name,36,"[%s]^n",tmp) 
- 				} 
-   
-   
- 				new health[25]="" 
- 				if (admin_options[i][ESP_HEALTH_ARMOR]){ 
- 					new hp=get_user_health(smallest_id) 
- 					new armor=get_user_armor(smallest_id) 
- 					format(health,24,"health: %d armor: %d^n",hp,armor) 
- 				} 
-   
-   
- 				new clip_ammo[22]="" 
- 				new clip,ammo 
- 				new weapon_id=get_user_weapon(smallest_id,clip,ammo) 
- 				if (admin_options[i][ESP_CLIP_AMMO]){ 
- 					format(clip_ammo,21,"clip: %d ammo: %d^n",clip,ammo) 
- 				} 
-   
- 				new weapon_name[21]="" 
- 				if (admin_options[i][ESP_WEAPON]){ 
- 					if ((weapon_id-1)<0 || (weapon_id-1)>29) weapon_id=1 
- 					format(weapon_name,20,"weapon: %s^n",weapons[weapon_id-1]) 
- 					//copy(weapon_name,9,weapons[weapon_id-1]) 
- 				} 
-   
- 				new str_dist[19] 
- 				if (admin_options[i][ESP_DISTANCE]){ 
- 					format(str_dist,18,"distance: %d^n",floatround(dist)) 
- 				} 
-   
- 				show_hudmessage(i, "%s%s%s%s%s",name,health,weapon_name,clip_ammo,str_dist) 
- 			} 
- 		} 
- 	} 
- 	set_task(get_cvar_float("esp_timer"),"esp_timer") // keep it going 
- 	return PLUGIN_CONTINUE	 
- } 
-   
- public Float:get_screen_pos(id,Float:v_me_to_target[3],Float:Ret[2]){ 
- 	new Float:v_aim[3] 
- 	VelocityByAim(id,1,v_aim) // get aim vector 
- 	new Float:aim[3] 
- 	copyVec(v_aim,aim) // make backup copy of v_aim 
- 	v_aim[2]=0.0 // project aim vector vertically to x,y plane 
- 	new Float:v_target[3] 
- 	copyVec(v_me_to_target,v_target) 
- 	v_target[2]=0.0 // project target vector vertically to x,y plane 
- 	// both v_aim and v_target are in the x,y plane, so angle can be calculated.. 
- 	new Float:x_angle 
- 	new Float:x_pos=get_screen_pos_x(v_target,v_aim,x_angle) // get the x coordinate of hudmessage.. 
- 	new Float:y_pos=get_screen_pos_y(v_me_to_target,aim) // get the y coordinate of hudmessage.. 
- 	Ret[0]=x_pos  
- 	Ret[1]=y_pos 
- 	return x_angle 
- } 
-   
- public Float:get_screen_pos_x(Float:target[3],Float:aim[3],&Float:xangle){ 
- 	new Float:x_angle=floatacos(vectorProduct(aim,target)/(getVecLen(aim)*getVecLen(target)),1) // get angle between vectors 
- 	new Float:x_pos 
- 	//this part is a bit tricky.. 
- 	//the problem is that the 'angle between vectors' formula returns always positive values 
- 	//how can be determined if the target vector is on the left or right side of the aim vector? with only positive angles? 
- 	//the solution: 
- 	//the scalar triple product returns the volume of the parallelepiped that is created by three input vectors 
- 	// 
- 	//i used the aim and target vectors as the first two input parameters 
- 	//and the third one is a vector pointing straight upwards [0,0,1] 
- 	//if now the target is on the left side of spectator origin the created parallelepipeds volume is negative  
- 	//and on the right side positive 
- 	//now we can turn x_angle into a signed value.. 
- 	if (scalar_triple_product(aim,target)<0.0) x_angle*=-1 // make signed 
- 	if (x_angle>=-45.0 && x_angle<=45.0){ // if in fov of 90 
- 		x_pos=1.0-(floattan(x_angle,degrees)+1.0)/2.0 // calulate y_pos of hudmessage 
- 		xangle=x_angle 
- 		return x_pos 
- 	} 
- 	xangle=0.0 
- 	return -2.0 
- } 
-   
- public Float:get_screen_pos_y(Float:v_target[3],Float:aim[3]){ 
- 	new Float:target[3] 
-   
- 	// rotate vector about z-axis directly over the direction vector (to get height angle) 
- 	rotateVectorZ(v_target,aim,target) 
-   
- 	// get angle between aim vector and target vector 
- 	new Float:y_angle=floatacos(vectorProduct(aim,target)/(getVecLen(aim)*getVecLen(target)),1) // get angle between vectors 
-   
- 	new Float:y_pos 
- 	new Float:norm_target[3],Float:norm_aim[3] 
-   
- 	// get normalized target and aim vectors 
- 	normalize(v_target,norm_target,1.0) 
- 	normalize(aim,norm_aim,1.0) 
-   
- 	//since the 'angle between vectors' formula returns always positive values 
- 	if (norm_target[2]<norm_aim[2]) y_angle*=-1 //make signed 
-   
- 	if (y_angle>=-45.0 && y_angle<=45.0){ // if in fov of 90 
- 		y_pos=1.0-(floattan(y_angle,degrees)+1.0)/2.0 // calulate y_pos of hudmessage 
- 		if (y_pos>=0.0 && y_pos<=1.0) return y_pos 
- 	} 
- 	return -2.0 
- } 
-   
- public get_team(id){ 
- 	new team[2] 
- 	get_user_team(id,team,1) 
- 	switch(team[0]){ 
- 		case 'T':{ 
- 			return 1 
- 		} 
- 		case 'C':{ 
- 			return 2 
- 		} 
- 		case 'S':{ 
- 			return 3 
- 		} 
- 		default:{} 
- 	} 
- 	return 0 
- } 
-   
- // Vector Operations ------------------------------------------------------------------------------- 
-   
- public Float:getVecLen(Float:Vec[3]){ 
- 	new Float:VecNull[3]={0.0,0.0,0.0} 
- 	new Float:len=vector_distance(Vec,VecNull) 
- 	return len 
- } 
-   
- public Float:scalar_triple_product(Float:a[3],Float:b[3]){ 
- 	new Float:up[3]={0.0,0.0,1.0} 
- 	new Float:Ret[3] 
- 	Ret[0]=a[1]*b[2]-a[2]*b[1] 
- 	Ret[1]=a[2]*b[0]-a[0]*b[2] 
- 	Ret[2]=a[0]*b[1]-a[1]*b[0] 
- 	return vectorProduct(Ret,up) 
- } 
-   
- public normalize(Float:Vec[3],Float:Ret[3],Float:multiplier){ 
- 	new Float:len=getVecLen(Vec) 
- 	copyVec(Vec,Ret) 
- 	Ret[0]/=len 
- 	Ret[1]/=len 
- 	Ret[2]/=len 
- 	Ret[0]*=multiplier 
- 	Ret[1]*=multiplier 
- 	Ret[2]*=multiplier 
- } 
-   
- public rotateVectorZ(Float:Vec[3],Float:direction[3],Float:Ret[3]){ 
- 	// rotates vector about z-axis 
- 	new Float:tmp[3] 
- 	copyVec(Vec,tmp) 
- 	tmp[2]=0.0 
- 	new Float:dest_len=getVecLen(tmp) 
- 	copyVec(direction,tmp) 
- 	tmp[2]=0.0 
- 	new Float:tmp2[3] 
- 	normalize(tmp,tmp2,dest_len) 
- 	tmp2[2]=Vec[2] 
- 	copyVec(tmp2,Ret) 
- } 
-   
- public Float:vectorProduct(Float:Vec1[3],Float:Vec2[3]){ 
- 	return Vec1[0]*Vec2[0]+Vec1[1]*Vec2[1]+Vec1[2]*Vec2[2] 
- } 
-   
- public copyVec(Float:Vec[3],Float:Ret[3]){ 
- 	Ret[0]=Vec[0] 
- 	Ret[1]=Vec[1] 
- 	Ret[2]=Vec[2] 
- } 
-   
- public subVec(Float:Vec1[3],Float:Vec2[3],Float:Ret[3]){ 
- 	Ret[0]=Vec1[0]-Vec2[0] 
- 	Ret[1]=Vec1[1]-Vec2[1] 
- 	Ret[2]=Vec1[2]-Vec2[2] 
- } 
-   
- public addVec(Float:Vec1[3],Float:Vec2[3]){ 
- 	Vec1[0]+=Vec2[0] 
- 	Vec1[1]+=Vec2[1] 
- 	Vec1[2]+=Vec2[2] 
- } 
-   
- // Temporary Entities ------------------------------------------------------------------------------ 
- // there is a list of much more temp entities at: http://djeyl.net/forum/index.php?s=80ec5b9163006b5cbd0a51dd198e563a&act=Attach&type=post&id=290870 
- // all messages are sent with MSG_ONE_UNRELIABLE flag to avoid overflow in case of very low esp_timer setting and much targets 
-   
- public make_TE_BEAMPOINTS(id,color,Float:Vec1[3],Float:Vec2[3],width,target_team,brightness){ 
- 	message_begin(MSG_ONE_UNRELIABLE ,SVC_TEMPENTITY,{0,0,0},id) //message begin 
- 	write_byte(0) 
- 	write_coord(floatround(Vec1[0])) // start position 
- 	write_coord(floatround(Vec1[1])) 
- 	write_coord(floatround(Vec1[2])) 
- 	write_coord(floatround(Vec2[0])) // end position 
- 	write_coord(floatround(Vec2[1])) 
- 	write_coord(floatround(Vec2[2])) 
- 	write_short(laser) // sprite index 
- 	write_byte(3) // starting frame 
- 	write_byte(0) // frame rate in 0.1's 
- 	write_byte(floatround(get_cvar_float("esp_timer")*10)) // life in 0.1's 
- 	write_byte(width) // line width in 0.1's 
- 	write_byte(0) // noise amplitude in 0.01's 
- 	write_byte(esp_colors[color][0]) 
- 	write_byte(esp_colors[color][1]) 
- 	write_byte(esp_colors[color][2]) 
- 	write_byte(brightness) // brightness) 
- 	write_byte(0) // scroll speed in 0.1's 
- 	message_end() 
- } 
-   
- public make_TE_BEAMENTPOINT(id,Float:target_origin[3],width,target_team){ 
- 	message_begin(MSG_ONE_UNRELIABLE,SVC_TEMPENTITY,{0,0,0},id) 
- 	write_byte(1) 
- 	write_short(id) 
- 	write_coord(floatround(target_origin[0])) 
- 	write_coord(floatround(target_origin[1])) 
- 	write_coord(floatround(target_origin[2])) 
- 	write_short(laser) 
- 	write_byte(1)		 
- 	write_byte(1) 
- 	write_byte(floatround(get_cvar_float("esp_timer")*10)) 
- 	write_byte(width) 
- 	write_byte(0) 
- 	write_byte(team_colors[target_team][0]) 
- 	write_byte(team_colors[target_team][1]) 
- 	write_byte(team_colors[target_team][2]) 
- 	write_byte(255) 
- 	write_byte(0) 
- 	message_end() 
- } 
-