Mr.Satan Special Attacks

YEA
✔️ HL Verified
Joined
Oct 31, 2014
Messages
201
Best answers
0
Location
CHINA
Can't stand to see Mr.Satan's(is? was??o_o) that weak in ESF, therefore I wrote this plugin. lol
Thank hleV and Sting for helped me out with 'get aiming player hp' and 'check LMB' ^_^
Models're from the internet, the animations of the models are created by XM

This plugin includes two functions:
1. Special attack: Nuke dropping
2. Unique attack: Call the support(Air defense missile vehicle LOL is there a better name instead of 'Unique')

Usage:
Nuke dropping: bind the button ALT as '.Special', then press ALT
Call the support: I created this function on the weapon 'solarflare', so you should choose 'solarflare' first and click the LMB

PHP:
#include < amxmodx > 
#include < fakemeta > 
#include < engine > 
#include < xs >

//Special Attack
new SpecialAttack[33], Float: SpecialCoolDown[33], Float: orgSpecial[33][3]
new NukeTarget[33], Explosion[33]

//Unique Attack
new UniqueAttack[33], Float: UniqueAng[3], Float: UniqueOrg[3]
new MissileFire, MissileTrail, MissileExplosion, Missile[33], Float: MissileOrg[33][3], MissileTarget[33], TargetCount[33][33], TargetCounter[33], bool: UniqueFireSwch[33], Float: MissileTargetVec[33][3]
new Float: UniqueCoolDown[33]
new Float: UniqueDelay[33]

public plugin_init( ) 
{
	register_plugin("Mr.Satan Special Attacks", "1.0", "ESFKAMI")
	register_srvcmd(".Special", "CharacterSpecialAttack")
	register_forward(FM_CmdStart, "@CommandStart")
	register_forward(FM_Touch, "fw_Touch")
	for(new i = 1; i <= 32; i++)
	{
		UniqueCoolDown[i] = -200.0
	}
}

public CharacterSpecialAttack(id)
{
	new Float: SpecialDelay[33]
	SpecialDelay[id] = get_gametime() - SpecialCoolDown[id]
	if(pev(id, pev_sequence) < 3 || pev(id, pev_sequence) == 28 && is_user_alive(id))
	{
		if(SpecialDelay[id] > 120.0)
		{
			SpecialCoolDown[id] = get_gametime()
			pev(id, pev_origin, orgSpecial[id])
			orgSpecial[id][2] += 100.0
			NukeTarget[id] = create_entity( "env_sprite" );
			set_pev( NukeTarget[id], pev_movetype, MOVETYPE_TOSS )
			set_pev( NukeTarget[id], pev_origin, orgSpecial[id]); //set the entity's position
			engfunc( EngFunc_SetModel, NukeTarget[id], "sprites/X/Nuke.spr" );
			set_rendering( NukeTarget[id], kRenderFxNone, 255, 255, 255, kRenderTransAdd, 255 );
			drop_to_floor(NukeTarget[id])
			emit_sound(id,CHAN_STATIC, "X/Mr.Satan/SpecialAttack.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			set_task(5.0, "SpecialAttackFX", id)
		}
	}
}

public SpecialAttackFX(id)
{
	orgSpecial[id][2] += 4900.0
	SpecialAttack[id] = create_entity( "info_target" );
	engfunc( EngFunc_SetModel, SpecialAttack[id], "models/X/Nuke.mdl" )
	entity_set_float(SpecialAttack[id], EV_FL_animtime, get_gametime())	//set the entity's animation time
	entity_set_float(SpecialAttack[id], EV_FL_framerate, 0.13)	//set the entity's animation rate
	entity_set_int(SpecialAttack[id], EV_INT_sequence, 1 )
	set_pev( SpecialAttack[id], pev_movetype, MOVETYPE_NOCLIP )
	set_pev( SpecialAttack[id], pev_scale, 15.0 )
	set_pev( SpecialAttack[id], pev_origin, orgSpecial[id] ); //set the entity's position
	new Float:vec[3], Float:ang[3] = {90.0, 0.0, 0.0}
	angle_vector(ang, 1, vec)
	xs_vec_mul_scalar(vec, 1000.0, vec)
	set_pev(SpecialAttack[id], pev_velocity, vec)
	set_task(0.5, "SpecialAttackCheck", id)
}

public SpecialAttackFX2(id)
{
	remove_entity(Explosion[id])
}

public SpecialAttackCheck(id)
{
	new Float: TargetOrg[3], Float: NukeOrg[3]
	pev(NukeTarget[id], pev_origin, TargetOrg)
	pev(SpecialAttack[id], pev_origin, NukeOrg)
	if(NukeOrg[2] <= TargetOrg[2])
	{
		TargetOrg[2] += 350.0
		remove_entity(NukeTarget[id])
		remove_entity(SpecialAttack[id])
		Explosion[id] = create_entity( "env_sprite" );
		engfunc( EngFunc_SetModel, Explosion[id], "sprites/X/Explosion.spr" );
		set_rendering( Explosion[id], kRenderFxNone, 255, 255, 255, kRenderTransAdd, 255 );
		set_pev( Explosion[id], pev_origin, TargetOrg ); //set the entity's position
		DispatchKeyValue( Explosion[id], "scale", "30.0");
		DispatchKeyValue( Explosion[id], "framerate", "8.0");
		DispatchSpawn( Explosion[id] )
		for(new i = 1; i <= 32; i++)
		{
			if(is_user_connected(i))
			{
				ScreenFade(i, 10, 255, 255, 255, 130)
				emit_sound(i, CHAN_STATIC, "X/Explosion.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			}
			if(is_user_alive(i) && entity_get_float( i, EV_FL_takedamage ) != 0.0)
			{
				if(pev(i, pev_health) > 50.0)
				{
					set_pev(i, pev_health, pev(i, pev_health) - 50.0)
				}
				else
				{
					new gmsgDeathMsg = get_user_msgid( "DeathMsg"	);
					new gmsgScoreInfo = get_user_msgid( "ScoreInfo"	);
					set_msg_block( gmsgDeathMsg, BLOCK_ONCE );
					set_msg_block( gmsgScoreInfo, BLOCK_ONCE );
					
					message_begin( MSG_ALL, get_user_msgid("DeathMsg") );
					write_byte( 1 );
					write_byte( i );
					write_string( "the Nuke Attack" );
					message_end();
					user_kill(i)
					entity_set_float( id, EV_FL_frags, entity_get_float( id, EV_FL_frags ) + 1 );
					entity_set_float( i, EV_FL_frags, entity_get_float( i, EV_FL_frags ) );
				}
			}
		}
		set_task(2.5, "SpecialAttackFX2", id)
	}
	else
	{
		set_task(0.5, "SpecialAttackCheck", id)
	}
}

public @CommandStart(id, Handle)
{
	static Control; Control = get_uc(Handle, UC_Buttons);

	if(Control == IN_ATTACK && get_user_weapon(id) == 8)
	{
		new gmsgDeathMsg = get_user_msgid( "ScreenFade"	);
		set_msg_block( gmsgDeathMsg, BLOCK_ONCE );
		UniqueDelay[id] = get_gametime() - UniqueCoolDown[id]
		if(UniqueDelay[id] > 200.0)
		{
			set_pev(id, pev_flags, pev(id, pev_flags) | FL_FROZEN)
			set_pev(id, pev_takedamage, 0.0)
			CharacterUniqueAttackFX(id)
		}
	}
	return PLUGIN_CONTINUE;
}

public CharacterUniqueAttackFX(id)
{
	UniqueCoolDown[id] = get_gametime()
	emit_sound(id, CHAN_ITEM, "X/Mr.Satan/UniqueAttack.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)

	UniqueAttack[id] = create_entity( "env_model" );
	engfunc(EngFunc_SetModel, UniqueAttack[id], "models/X/Mr.Satan/Mr.SatanAngry.mdl")
	pev(id, pev_angles, UniqueAng)
	pev(id, pev_origin, UniqueOrg)
	entity_set_float(UniqueAttack[id], EV_FL_animtime, get_gametime())	//set the entity's animation time
	entity_set_float(UniqueAttack[id], EV_FL_framerate, 1.0)	//set the entity's animation rate
	entity_set_int(UniqueAttack[id], EV_INT_sequence, 209 )
	set_entity_visibility(id, 0)
	set_pev(UniqueAttack[id], pev_angles, UniqueAng)
	set_pev(UniqueAttack[id], pev_origin, UniqueOrg)
	set_pev(UniqueAttack[id], pev_controller, 125)
	set_pev(UniqueAttack[id], pev_controller_0, 125)
	set_pev(UniqueAttack[id], pev_controller_1, 125)
	set_pev(UniqueAttack[id], pev_controller_2, 125)
	set_pev(UniqueAttack[id], pev_controller_3, 125)
	set_task(8.0, "CharacterUniqueAttackFX2", id)
	set_task(180.0, "StopUniqueAttacking", id)
}

public CharacterUniqueAttackFX2(id)
{
	set_entity_visibility(id, 1)
	UniqueOrg[0] += 60.0
	set_pev(UniqueAttack[id], pev_movetype, MOVETYPE_TOSS)
	set_pev(UniqueAttack[id], pev_solid, SOLID_BBOX)
	set_pev(UniqueAttack[id], pev_angles, {0.0, 0.0, 0.0})
	set_pev(UniqueAttack[id], pev_origin, UniqueOrg)
	set_pev(id, pev_flags, pev( id, pev_flags ) & ~FL_FROZEN )
	set_pev(id, pev_takedamage, 2.0)
	engfunc(EngFunc_SetModel, UniqueAttack[id], "models/X/Truck.mdl")
	entity_set_float(UniqueAttack[id], EV_FL_framerate, 0.15)	//set the entity's animation rate
	entity_set_int(UniqueAttack[id], EV_INT_sequence, 0 )
	drop_to_floor(UniqueAttack[id])
	emit_sound(UniqueAttack[id], CHAN_BODY, "X/TimeMachineArrived.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	set_task(2.0, "CharacterUniqueAttackFX3", id)
}

public CharacterUniqueAttackFX3(id)
{
	emit_sound(UniqueAttack[id], CHAN_BODY, "X/Mr.Satan/UniqueAttack2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
	engfunc(EngFunc_SetModel, UniqueAttack[id], "models/X/Vehicle.mdl")
	set_task(5.0, "CharacterUniqueAttackFX4", id)
}

public CharacterUniqueAttackFX4(id)
{
	entity_set_float(UniqueAttack[id], EV_FL_animtime, get_gametime())
	entity_set_int(UniqueAttack[id], EV_INT_sequence, 1)
	set_task(7.3, "CharacterUniqueAttackFX5", id)
}

public CharacterUniqueAttackFX5(id)
{
	if(is_valid_ent(UniqueAttack[id]))
	{
		
		for(new i = 1; i <= 32; i++)	//search for the target
		{
			if(is_user_alive(i))
			{
				TargetCount[id][TargetCounter[id] + 1] = i
				TargetCounter[id] += 1
			}
		}
		
		if(TargetCounter[id] != 0)
		{
			UniqueFireSwch[id] = false
			
			pev(UniqueAttack[id], pev_origin, MissileOrg[id])
			MissileOrg[id][1] -= 35.0
			MissileOrg[id][2] += 80.0
			
			Missile[id] = create_entity( "info_target" );
			engfunc(EngFunc_SetModel, Missile[id], "models/X/Missile.mdl")
			set_entity_visibility(Missile[id], 0)
			set_pev(Missile[id], pev_classname, "MissileEnt")
			set_pev(Missile[id], pev_solid, SOLID_BBOX)
			set_pev(Missile[id], pev_movetype, MOVETYPE_FLY)
			set_pev(Missile[id], pev_origin, MissileOrg[id])
			entity_set_float(Missile[id], EV_FL_animtime, get_gametime())
			entity_set_float(Missile[id], EV_FL_framerate, 1.0)
			entity_set_int(Missile[id], EV_INT_sequence, 0)
			
			message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
			write_byte(TE_BEAMFOLLOW)
			write_short(Missile[id])
			write_short(MissileTrail)
			write_byte(10)
			write_byte(20)
			write_byte(255)
			write_byte(255)
			write_byte(255)
			write_byte(255)
			message_end()
			
			new Float: FireOrg[3]
			pev(UniqueAttack[id], pev_origin, FireOrg)
			message_begin( MSG_BROADCAST, SVC_TEMPENTITY );	
			write_byte(TE_SPRITE)
			engfunc(EngFunc_WriteCoord, FireOrg[0])
			engfunc(EngFunc_WriteCoord, FireOrg[1] - 35.0)
			engfunc(EngFunc_WriteCoord, FireOrg[2] + 80.0)
			write_short(MissileFire) 
			write_byte(10)
			write_byte(255)
			message_end()
			
			emit_sound(UniqueAttack[id], CHAN_STATIC, "X/Mr.Satan/UniqueAttackFire.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
			entity_set_float(UniqueAttack[id], EV_FL_animtime, get_gametime())
			entity_set_float(UniqueAttack[id], EV_FL_framerate, 1.0)
			entity_set_int(UniqueAttack[id], EV_INT_sequence, 2)
			CharacterUniqueAttackFX6(id)
		}
		else
		{
			set_task(5.0, "CharacterUniqueAttackFX5", id)
		}
	}
}

public CharacterUniqueAttackFX6(id)
{
	if(!UniqueFireSwch[id])
	{
		MissileTarget[id] = random_num(1, TargetCounter[id])
		if(MissileTarget[id] != id)
		{
			UniqueFireSwch[id] = true
		}
		else
		{
			TargetCounter[id] = 0
			for(new i = 1; i <= 32; i++)	//search for the target
			{
				if(is_user_alive(i)) //idk whats going on, just no use when i wrote 'if(is_user_alive(i) && i != id)'
				{
					TargetCount[id][TargetCounter[id] + 1] = i
					TargetCounter[id] += 1
				}
			}
		}
	}
	client_print(id, print_center, "%d", MissileTarget[id])
	if(MissileTarget[id] != id)
	{
		if(is_valid_ent(Missile[id]))
		{
			new Float: MissileTargetOrg[3]
			pev(MissileTarget[id], pev_origin, MissileTargetOrg)
			pev(Missile[id], pev_origin, MissileOrg[id])
			entity_set_aim(Missile[id], MissileTargetOrg)
			set_entity_visibility(Missile[id], 1)
			if(!is_valid_ent(MissileTarget[id]) || !is_user_alive(MissileTarget[id]))
			{
				new Float: MissileExploOrg[3]
				pev(Missile[id], pev_origin, MissileExploOrg)
				TargetCounter[id] = 0
				message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
				write_byte(TE_SPRITE)
				engfunc(EngFunc_WriteCoord, MissileExploOrg[0])
				engfunc(EngFunc_WriteCoord, MissileExploOrg[1])
				engfunc(EngFunc_WriteCoord, MissileExploOrg[2])
				write_short(MissileExplosion)
				write_byte(20)
				write_byte(255)
				message_end()
				emit_sound(Missile[id], CHAN_STATIC, "X/Explosion2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
				remove_entity(Missile[id])
				set_task(5.0, "CharacterUniqueAttackFX5", id)
			}
			else if(MissileOrg[id][0] > (MissileTargetOrg[0] - 50.0) && MissileOrg[id][0] < (MissileTargetOrg[0] + 50.0) && MissileOrg[id][1] > (MissileTargetOrg[1] - 50.0) && MissileOrg[id][1] < (MissileTargetOrg[1] + 50.0) && MissileOrg[id][2] > (MissileTargetOrg[2] - 50.0) && MissileOrg[id][2] < (MissileTargetOrg[2] + 50.0))
			{
				new Float: MissileExplosionOrg[3]
				TargetCounter[id] = 0
				pev(MissileTarget[id], pev_origin, MissileExplosionOrg)
				
				message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
				write_byte(TE_SPRITE)
				engfunc(EngFunc_WriteCoord, MissileExplosionOrg[0])
				engfunc(EngFunc_WriteCoord, MissileExplosionOrg[1])
				engfunc(EngFunc_WriteCoord, MissileExplosionOrg[2])
				write_short(MissileExplosion)
				write_byte(20)
				write_byte(255)
				message_end()
				emit_sound(MissileTarget[id], CHAN_STATIC, "X/Explosion2.wav", 1.0, ATTN_NORM, 0, PITCH_NORM)
				if(pev(MissileTarget[id], pev_health) > 10.0)
				{
					set_pev(MissileTarget[id], pev_health, pev(MissileTarget[id], pev_health) - 10.0)
				}
				else
				{
					new gmsgDeathMsg = get_user_msgid( "DeathMsg"	);
					new gmsgScoreInfo = get_user_msgid( "ScoreInfo"	);
					set_msg_block( gmsgDeathMsg, BLOCK_ONCE );
					set_msg_block( gmsgScoreInfo, BLOCK_ONCE );
					message_begin( MSG_ALL, get_user_msgid("DeathMsg") );
					write_byte( 1 );
					write_byte( MissileTarget[id] );
					write_string( "the Air Defense Missile" );
					message_end();
					user_kill(MissileTarget[id])
					entity_set_float( id, EV_FL_frags, entity_get_float( id, EV_FL_frags ) + 1 );
					entity_set_float( MissileTarget[id], EV_FL_frags, entity_get_float( MissileTarget[id], EV_FL_frags ) );
				}
				remove_entity(Missile[id])
				set_task(5.0, "CharacterUniqueAttackFX5", id)
			}
			else
			{
				xs_vec_normalize(MissileTargetVec[id], MissileTargetVec[id])
				MissileTargetVec[id][0] = (MissileTargetOrg[0] - MissileOrg[id][0])
				MissileTargetVec[id][1] = (MissileTargetOrg[1] - MissileOrg[id][1])
				MissileTargetVec[id][2] = (MissileTargetOrg[2] - MissileOrg[id][2])
				xs_vec_mul_scalar(MissileTargetVec[id], 2.0, MissileTargetVec[id])
				set_pev(Missile[id], pev_velocity, MissileTargetVec[id])
				set_task(0.2,"CharacterUniqueAttackFX6",id)
			}
		}
	}
	else
	{
		//remove_entity(Missile[id])
		set_task(0.2,"CharacterUniqueAttackFX6",id)
	}
	
	return PLUGIN_HANDLED
}

public StopUniqueAttacking(id)
{
	remove_entity(UniqueAttack[id])
}

stock ScreenFade(id, Timer, R, G, B, Alpha) 
{
	message_begin(MSG_ONE_UNRELIABLE, get_user_msgid("ScreenFade"), _, id);
	write_short((1<<12) * Timer)
	write_short(1<<12)
	write_short(0)
	write_byte(R)
	write_byte(G)
	write_byte(B)
	write_byte(Alpha)
	message_end()
}

stock entity_set_aim(id,const Float:target_origin[3])
{
	if(!is_valid_ent(id)) return 0
	
	static Float:start[3], Float:end[3]
	pev(id,pev_origin,start)
	pev(id,pev_view_ofs,end)
	start[0] += end[0], start[1] += end[1], start[2] += end[2]
	
	static Float:aim_vector[3],Float:new_angles[3]
	aim_vector[0] = target_origin[0] - start[0]
	aim_vector[1] = target_origin[1] - start[1]
	aim_vector[2] = target_origin[2] - start[2]
	vector_to_angle(aim_vector,new_angles)
	
	while(new_angles[0]>360.0) new_angles[0] -= 360.0
	while(new_angles[0]<0.0) new_angles[0] += 360.0
	new_angles[0] *= -1
	while(new_angles[1]>360.0) new_angles[1] -= 360.0
	while(new_angles[1]<0.0) new_angles[1] += 360.0
	
	set_pev(id,pev_angles,new_angles)
	set_pev(id,pev_fixangle,1)
	
	return 1;
}

public plugin_precache()
{
	precache_model("sprites/X/Nuke.spr")
	precache_model("sprites/X/Explosion.spr")
	MissileFire = precache_model("sprites/X/Mr.SatanUniqueAttack.spr")
	MissileTrail = precache_model("sprites/smoke.spr")
	MissileExplosion = precache_model("sprites/X/Explosion2.spr")

	precache_model("models/X/Nuke.mdl")
	precache_model("models/X/Truck.mdl")
	precache_model("models/X/Vehicle.mdl")
	precache_model("models/X/Missile.mdl")
	precache_model("models/X/Mr.Satan/Mr.SatanAngry.mdl")


	precache_sound("X/Mr.Satan/SpecialAttack.wav")
	precache_sound("X/Explosion.wav")

	precache_sound("X/Mr.Satan/UniqueAttack.wav")
	precache_sound("X/Mr.Satan/UniqueAttack2.wav")
	precache_sound("X/Mr.Satan/UniqueAttackFire.wav")
	precache_sound("X/Explosion2.wav")
	precache_sound("X/Null.wav")
	precache_sound("X/TimeMachineArrived.wav")
}
Needed files: DownLoad Link

video: Video on youtube

Images:




 
Last edited:

ewl

SSB Member
✔️ HL Verified
🌟 Senior Member
Joined
Dec 31, 2011
Messages
42
Best answers
0
Nice Mr.Satan Special Attacks. :D
 
Freelance Mappzor
✔️ HL Verified
🚂 Steam Linked
💻 Oldtimer
Joined
Nov 21, 2003
Messages
17,065
Best answers
0
Location
Stairing at the Abyss
Satan not special, you kidding? Satan was a beast in the standard ECX RC2 release. His speed and the fact that he doesnt use KI to swoop, outweighs his inability to shoot beams or teleport. This makes him a melee badass thats practically uncatchable in the correct hands XD
 
Lost in space
Banned
Joined
Dec 29, 2014
Messages
253
Best answers
0
*ECX*

Video not working btw, try YouTube.
 
Last edited:
YEA
✔️ HL Verified
Joined
Oct 31, 2014
Messages
201
Best answers
0
Location
CHINA
Ačiū!!!;D

As a human being and as the No.1 in the world, Mr.Satan must own the power to call the Army for help with technology weapons, so he can rely on aerocraft to swoop


NOOOOO! youtube not working in my country, and my VPN has had some problems these days.... but i wonder if there is someone can upload them to youtube for me.. would appreciate for that...
 
Last edited:

Users who are viewing this thread

Top Bottom