/*
* Makes Peaple invul after spawn for short time
* Set inulnerability time with the cvar mp_spawninvulnerabletime
* Set inulnerability mode with the cvar mp_spawninvulnerablemode (0 = off / 1 = co only / 2 = ns only / 3 = ns + co (default ns + co))
* Defaults is 3.0 seconds
*
* by Cheesy Peteza
*
* ported to Amx Mod X by White Panther (v1.1)
*	added:	
*		- support for MvM and AvA
*		- cvar "mp_spawninvulnerablemode" (0 = off / 1 = co only / 2 = ns only / 3 = ns + co) (default ns + co)
*	fixed:	
*		- exploit for infinite godmode
*		- little error and MvM + AvA
*		- some colors bugs
*	changes:
*		- system of getting the team
*		(increased version number therefore)
*/

#include <amxmodx>
#include <fakemeta>
#include <fun>
#include <ns>

// Marines 1 (Blue)
#define MRED 0
#define MGREEN 170
#define MBLUE 255

// Aliens 1 (Yellow)
#define ARED 255
#define AGREEN 170
#define ABLUE 0

// Marines 2 (Red)
#define M2RED 200
#define M2GREEN 0
#define M2BLUE 0
// or green (comment 3 lines above and uncomment the 3 lines blow)
//#define M2RED 0
//#define M2GREEN 200
//#define M2BLUE 50

// Aliens 2 (red)
#define A2RED 200
#define A2GREEN 0
#define A2BLUE 0
// or green (uncomment the 3 lines below and coment the 3 line above)
//#define A2RED 0
//#define A2GREEN 200
//#define A2BLUE 50

new fullupdate_by_cmd[33], player_team[33]

public plugin_init(){
	register_plugin("Spawn Invulnerability (fun)","1.1","Cheesy Peteza/White Panther")
	register_cvar("spawninvfun_version", "1.1", FCVAR_SERVER)
	register_event("ResetHUD","ePlayerSpawned","b")
	register_event("TeamInfo","eTeamChanges","ab")
	
	register_cvar("mp_spawninvulnerabletime","3.0")
	register_cvar("mp_spawninvulnerablemode","3")
	register_clcmd("fullupdate", "block_fullupdate")
}

public plugin_modules(){
	require_module("fakemeta")
	require_module("fun")
	require_module("ns")
}

public client_putinserver(id){
	set_user_godmode(id,0)
	remove_task(id)
}

public client_disconnect(id){
	set_user_godmode(id,0)
	remove_task(id)
}

public client_changeteam(id,newteam,oldteam){
	if ( newteam < 1 || newteam > 4 )
		reset(id)
}

public client_changeclass(id,newclass,oldclass){
	if ( newclass == 0 || newclass == 11 || newclass == 12 )
		reset(id)
}

public ePlayerSpawned_timer(Userid[]){
	ePlayerSpawned(Userid[0])
}

public ePlayerSpawned(id){
	if ( !is_user_connected(id) )		// this check is needed as we call this function manually too
		return PLUGIN_HANDLED
	
	if ( 1 <= ns_get_class(id) <= 10 ){
		if ( allow_to_run() ){
			if ( fullupdate_by_cmd[id] ){
				fullupdate_by_cmd[id] = 0
				return PLUGIN_HANDLED
			}
			if ( !get_cvar_float("mp_spawninvulnerabletime") || get_cvar_num("mp_tournamentmode") )
				return PLUGIN_HANDLED
			
			new Userid[1]
			Userid[0] = id
			if ( player_team[id] ){
				if ( player_team[id] == 1 )
					set_user_rendering(id,kRenderFxGlowShell,MRED,MGREEN,MBLUE,kRenderNormal,25)
				else if ( player_team[id] == 3 )
					set_user_rendering(id,kRenderFxGlowShell,M2RED,M2GREEN,M2BLUE,kRenderNormal,25)
				else if ( player_team[id] == 2 )
					set_user_rendering(id,kRenderFxGlowShell,ARED,AGREEN,ABLUE,kRenderNormal,25)
				else if ( player_team[id] == 4 )
					set_user_rendering(id,kRenderFxGlowShell,A2RED,A2GREEN,A2BLUE,kRenderNormal,25)
				
				set_user_godmode(id,1)
				set_task(get_cvar_float("mp_spawninvulnerabletime"),"disable_inv", 5000+id,Userid,1)
			}else if ( 1 <= pev(id,pev_team) <= 4 )
				set_task(0.5,"ePlayerSpawned_timer",6000+id,Userid,1)
		}
	}
	
	return PLUGIN_HANDLED
}

public eTeamChanges(){
	if ( allow_to_run() ){
		new teamname[32], id = read_data(1)
		read_data(2,teamname,31)
		
		if ( equali(teamname,"marine1team") )
			player_team[id] = 1
		else if ( equali(teamname,"marine2team") )
			player_team[id] = 3
		else if ( equali(teamname,"alien1team") )
			player_team[id] = 2
		else if ( equali(teamname,"alien2team") )
			player_team[id] = 4
		else
			player_team[id] = 0
	}
}

public block_fullupdate(id){
	if ( allow_to_run() )
		fullupdate_by_cmd[id] = 1
	
	return PLUGIN_CONTINUE
}

public disable_inv(Userid[]){
	if ( is_user_connected(Userid[0]) )
		reset(Userid[0])
}

allow_to_run(){
	switch ( get_cvar_num("mp_spawninvulnerablemode") ){
		case 0 :
			return 0
		case 1 :
			if ( ns_is_combat() )
				return 1
		case 2 :
			if ( !ns_is_combat() )
				return 1
		case 3 :
			return 1
	}
	return 0
}

reset(id){
	set_user_godmode(id,0)
	//set_user_rendering(id,kRenderNormal,0,0,0,kRenderNormal,0)
	set_user_rendering(id,kRenderFxGlowShell,0,0,0,kRenderNormal,0)
	remove_task(5000+id)
	remove_task(6000+id)
}