[Half-Life AMXX] / include / lib_targets.inc Repository:
ViewVC logotype

View of /include/lib_targets.inc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (download) (annotate)
Tue Oct 30 09:08:11 2007 UTC (16 years, 6 months ago) by ian
File size: 12016 byte(s)
/*Lib Targets
* Version 0.8.2
*
* by Don Juan-jello
* www.jello-net.com
*
* This file is provided as is (no warranties).
*/

#if defined _lib_targets
  #endinput
#endif
#define _lib_targets

#define DEBUGLOG 0

#include <amxmisc>
#include <fakemeta>
#include <engine>

//Flags:
#define IMMUNITY 1 //obey immunity
#define SELF 2     //allow yourself
#define DEAD 4     //must be dead
#define ALIVE 16   //must be alive
#define NOBOT 8    //can't be bot
#define BOT 32     //must be bot
#define LEVEL 64   //can execute on players with equal or lower immunity

//define NOSPEC #

/* The following combinations of flags are incompatible and will error out.
*    DEAD(4) and ALIVE(16)
*    BOT(32) and NOBOT(8)
*    SELF(2) and LEVEL(64)
*  IMMUNITY(1) is the only flag without an incompatible counter-part.
*
*	 targtype
*    arg#     -replace # with argument id to read from cmd line
*    str...   -replace ... with string to use as search criteria
*/
//2nd lvl immunity
stock targets_find(id,&targnum,flags=IMMUNITY+SELF,targtype[100]="arg1",wild_card_access=ADMIN_RCON){
	new targets[32]//,bool:multexpr=false
	if(!(flags&BOT&&flags&NOBOT)&&!(flags&DEAD&&flags&ALIVE)&&!(flags&SELF&&flags&LEVEL)){//Conflicting flags
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","---------- CMD START ----------")
new tmplayers[32],temp1[91],tmpnum
get_players(tmplayers,tmpnum)
for(new i=0;i<tmpnum;i++){
  get_user_name(tmplayers[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",tmplayers[i],is_user_alive(tmplayers[i]),is_user_bot(tmplayers[i]),get_user_team(tmplayers[i]),temp1)
}
log_to_file("lib_debug.log"," ")
read_args(temp1,90)
read_argv(0,tmplayers,31)
log_to_file("lib_debug.log","cmdline: %s %s",tmplayers,temp1)
log_to_file("lib_debug.log"," ")
#endif
		targnum=0
		new args[100],expr[100]
		if(equali(targtype,"str",3))copy(args,sizeof(args)-1,targtype[3])
		else if(equali(targtype,"arg",3))read_argv(strtonum(targtype[3]),args,sizeof(args)-1)
		else {
			if(id!=0)client_print(0,print_chat,"[AMX - lib_targets] Invalid value in argument 4 function targets_find")
			else server_print("[AMX - lib_targets] Invalid value in argument 4 function targets_find")
			log_message("[AMX - lib_targets] Invalid value in argument 4 function targets_find")
			return targets
		}
#if	DEBUGLOG == 1
new temp2=0
#endif
		while(strlen(args)){
#if	DEBUGLOG == 1
temp2++
#endif
			new cpos=contain(args,",")
			if(cpos!=-1){//Comma delimited list
				//multexpr=true
				copy(expr,cpos,args)
				format(args,sizeof(args)-1,args[cpos+1])
			}
			else{
				expr=args
				args=""
			}
			if(!(equali(expr,"!@all")||equali(expr,"!*"))){//Conflicting expr
				if((equal(expr,"!",1)||equal(expr,"@",1)||equal(expr,"*",1))?get_user_flags(id)&wild_card_access:1){
					new bool:invert=false,ntargs[32],ntargnum=0,gpflags[4]
					if(equal(expr,"!",1)){
						invert=true
						format(expr,sizeof(expr)-1,expr[1])//Trim "!" from string.
					}
					if(equal(expr,"^^")){
						new body
						get_user_aiming(id,ntargs[0],body,99999);
						if(ntargs[0])ntargnum=1
						else{
							if(id!=0)client_print(id,print_console,"[AMX] No client in your aim.")
							else server_print("[AMX] No client in your aim.")
							gpflags="s"
						}
					}
					else if(equal(expr,".",1)){
						ntargs[0]=id
						ntargnum=1
					}
					else if(equal(expr,"#",1)){
						ntargs[0]=find_player("k",strtonum(expr[1]))
						if(ntargs[0])ntargnum=1
						else{
							if(id!=0)client_print(id,print_console,"[AMX] No client with that UID: %s",expr)
							else server_print("[AMX] No client with that UID: %s",expr)
							gpflags="s"
						}
					}
					else if(equal(expr,"@",1)){
						if(equali(expr,"@t")||equali(expr,"@terrorist")||equali(expr,"@ct")||equali(expr,"@all")){
							//multexpr=true
							format(expr,sizeof(expr)-1,expr[1])
							if(equali(expr,"t"))expr="terrorist"
							strtoupper(expr)
							gpflags="e"
							if(equal(expr,"ALL")){
								gpflags=""
							}
							else if(invert){
								if(equal(expr,"TERRORIST"))expr="CT"
								else expr="TERRORIST"
								invert=false
							}
						}
						else{
							if(id!=0)client_print(id,print_console,"[AMX] Expression matched no teams: %s",expr)
							else server_print("[AMX] Expression matched no teams: %s",expr)
						}
					}
					else if(equal(expr,"*",1)){
						format(expr,sizeof(expr)-1,expr[1])
						if(strlen(expr))gpflags="f"
					}
					else{
						ntargs[0]=find_player("bl",expr)
						if(ntargs[0]!=find_player("blj",expr)){
							if(id!=0)client_print(id,print_console,"[AMX] Expression matched multiple clients: %s",expr)
							else server_print("[AMX] Expression matched multiple clients: %s",expr)
							gpflags="s"
						}
						else if(!ntargs[0]){
							if(id!=0)client_print(id,print_console,"[AMX] Expression matched no client: %s",expr)
							else server_print("[AMX] Expression matched no client: %s",expr)
							gpflags="s"
						}
						else ntargnum=1
					}
					if(!ntargnum&&!equal(gpflags,"s")){
						//multexpr=true
						get_players(ntargs,ntargnum,gpflags,expr)
					}
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","Iteration #%d - %s",temp2,expr)
for(new i=0;i<ntargnum;i++){
  get_user_name(ntargs[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",ntargs[i],is_user_alive(ntargs[i]),is_user_bot(ntargs[i]),get_user_team(ntargs[i]),temp1)
}
#endif
					if(invert&&ntargnum>0){//Invert
						new players[32],num
						get_players(players,num)
						for(new i=0;i<ntargnum;i++){
							for(new j=0;j<num;j++){
								if(ntargs[i]==players[j]){
									for(new k=j;k<num--;k++){
										players[k]=players[k+1]
									}
									break
								}
							}
						}
						ntargs=players
						ntargnum=num
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","inversion")
for(new i=0;i<ntargnum;i++){
  get_user_name(ntargs[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",ntargs[i],is_user_alive(ntargs[i]),is_user_bot(ntargs[i]),get_user_team(ntargs[i]),temp1)
}
#endif
					}

					if(ntargnum>0){ //Merge with final list
						if(targnum>0){
							for(new i=0;i<ntargnum;i++){
								for(new j=0;j<targnum;j++){
									if(ntargs[i]==targets[j])break
									if(j+1==targnum){
										targets[j+1]=ntargs[i]
										targnum++
										break
									}
								}
							}
						}
						else if(targnum==0){
							for(new i=0;i<ntargnum;i++){
								targets[i]=ntargs[i]
								targnum++
							}
						}
					}
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","merge")
for(new i=0;i<targnum;i++){
  get_user_name(targets[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",targets[i],is_user_alive(targets[i]),is_user_bot(targets[i]),get_user_team(targets[i]),temp1)
}
#endif
				}
				else{
					if(id!=0)client_print(id,print_console,"[AMX] You don't have access to use wild cards: %s",expr)
					else server_print("[AMX] You don't have access to use wild cards: %s",expr)
				}
			}
			else{
				if(id!=0)client_print(id,print_console,"[AMX] Conflicting inputs: %s",expr)
				else server_print("[AMX] Conflicting inputs: %s",expr)
			}
		}
		if(targnum>0){
			new rtargnum=0,names[332],tmp[11]
			if(flags&DEAD||flags&ALIVE){
				names="";rtargnum=0;
				for(new i=0;i<targnum;i++){
					if((flags&DEAD&&is_user_alive(targets[i]))||(flags&ALIVE&&!is_user_alive(targets[i]))){
						get_user_name(targets[i],tmp,sizeof(tmp)-1)
						format(names,sizeof(names)-1,"%s%s%s",names,rtargnum>0?",":"",tmp)
						targnum--
						for(new j=i;j<targnum;j++)targets[j]=targets[j+1]
						rtargnum++
						i--
					}
				}
				if(rtargnum>0){
					if(id!=0)client_print(id,print_console,"[AMX] Ignoring %d %s clients: %s",rtargnum,flags&DEAD?"living":flags&ALIVE?"dead":"",names)
					else server_print("[AMX] Ignoring %d %s clients: %s",rtargnum,flags&DEAD?"living":flags&ALIVE?"dead":"",names)
				}
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","filter dead/alive")
for(new i=0;i<targnum;i++){
  get_user_name(targets[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",targets[i],is_user_alive(targets[i]),is_user_bot(targets[i]),get_user_team(targets[i]),temp1)
}
#endif
			}
			if(flags&BOT||flags&NOBOT){
				names="";rtargnum=0;
				for(new i=0;i<targnum;i++){
					if((flags&BOT&&!is_user_bot(targets[i]))||(flags&NOBOT&&is_user_bot(targets[i]))){
						get_user_name(targets[i],tmp,sizeof(tmp)-1)
						format(names,sizeof(names)-1,"%s%s%s",names,rtargnum>0?",":"",tmp)
						targnum--
						for(new j=i;j<targnum;j++)targets[j]=targets[j+1]
						rtargnum++
						i--
					}
				}
				if(rtargnum>0){
					if(id!=0)client_print(id,print_console,"[AMX] Ignoring %d %s clients: %s",rtargnum,flags&BOT?"non bot":flags&NOBOT?"bot":"",names)
					else server_print("[AMX] Ignoring %d %s clients: %s",rtargnum,flags&BOT?"non bot":flags&NOBOT?"bot":"",names)
				}
#if	DEBUGLOG == 1
log_to_file("lib_debug.log","filter bot/not bot")
for(new i=0;i<targnum;i++){
  get_user_name(targets[i],temp1,90)
	log_to_file("lib_debug.log","%d %d %d %d %s",targets[i],is_user_alive(targets[i]),is_user_bot(targets[i]),get_user_team(targets[i]),temp1)
}
#endif
			}
			if(flags&IMMUNITY){
				names="";rtargnum=0;
				for(new i=0;i<targnum;i++){
					if((get_user_flags(targets[i])&ADMIN_IMMUNITY)&&((flags&SELF)?(targets[i]!=id):true)&&((flags&LEVEL)?(get_user_flags(id)&ADMIN_IMMUNITY==1):true)){
						get_user_name(targets[i],tmp,sizeof(tmp)-1)
						format(names,sizeof(names)-1,"%s%s%s",names,rtargnum>0?",":"",tmp)
						targnum--
						for(new j=i;j<targnum;j++)targets[j]=targets[j+1]
						rtargnum++
						i--
					}
				}
				if(rtargnum>0)console_print(id,"[AMX] Ignoring %d immune clients: %s",rtargnum,names)
			}
		}
	}
	else{
		if(id!=0)client_print(id,print_console,"[AMX] Invalid flag combination: This problem most likely exist within the plugin's code.")
		else server_print("[AMX] Invalid flag combination: This problem most likely exist within the plugin's code.")
	}
	//if(targnum<1&&!multexpr)client_print(id,print_console,"[AMX] No clients matched given expression(s).")
	//else
	//if(multexpr)client_print(id,print_console,"[AMX] %d clients matched.",targnum)
	return targets
}
/*  Show admins activity - amx_show_activity
*  0 - disabled
*  1 - show without admin name
*  2 - show with name
*/
/*To do:
*		Log to amx admin log.
*
*/
//max		 381
//msg			59
//names	 322 - numnames(for comma) : target name length
//3 line max
stock targets_activity(id,targets[32],targnum,cmdname[21]="",show_act=-1,log_act=1){
	new showtype=(show_act==-1)?get_cvar_num("amx_show_activity"):show_act
	if(targnum>0&&!(showtype==0)){
		new msg[382]
		msg="ADMIN"
		new adminname[16]
		get_user_name(id,adminname,sizeof(adminname)-1)
		if(showtype==2)format(msg,sizeof(msg),"%s %s",msg,adminname)
		if(strlen(cmdname)==0){
			read_argv(0,cmdname,sizeof(cmdname)-1)
			if(equali(cmdname,"amx_",4))copy(cmdname,sizeof(cmdname)-1,cmdname[4])
		}
		format(msg,sizeof(msg),"%s: %s on %d clients: ",msg,cmdname,targnum)
		new namelen=clamp(340-targnum/targnum,9,15)
		for(new i=0;i<targnum;i++){
			new tmp[16]
			get_user_name(targets[i],tmp,namelen)
			format(msg,sizeof(msg)-1,"%s%s%s",msg,i>0?",":"",tmp)
		}
		for(new i=0;i<strlen(msg);i+=127)client_print(0,print_chat,msg[i])
		if(log_act){
			new logfile[16]
			get_logfile(logfile,15)
			new neid=contain(msg,":")
			new authid[32]
			get_user_authid(id,authid,31)
			log_to_file(logfile,"Debug")
			log_to_file(logfile,"Cmd: ^"%s<%d><%s><>^"%s",adminname,get_user_userid(id),authid,msg[neid+1])
		}
		//log_to_file(g_logFile,"Kick: ^"%s<%d><%s><>^" kick ^"%s<%d><%s><>^" (reason ^"%s^")",
    //name,get_user_userid(id),authid, name2,userid2,authid2,arg2 )
	}
	return PLUGIN_HANDLED
}

Contact
ViewVC Help
Powered by ViewVC 1.0.4