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
Needed files: DownLoad Link
video: Video on youtube
Images:
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")
}
video: Video on youtube
Images:
Last edited: