boiii-scripts/shared/weapons/_riotshield.csc
2023-04-13 17:30:38 +02:00

131 lines
11 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\clientfield_shared;
#using scripts\shared\system_shared;
#using scripts\shared\util_shared;
#precache( "client_fx", "_t6/weapon/riotshield/fx_riotshield_depoly_lights" );
#precache( "client_fx", "_t6/weapon/riotshield/fx_riotshield_depoly_dust" );
#using_animtree ( "mp_riotshield" );
#namespace riotshield;
function init_shared()
{
clientfield::register( "scriptmover", "riotshield_state", 1, 2, "int",&shield_state_change, !true, !true );
level._effect["riotshield_light"] = "_t6/weapon/riotshield/fx_riotshield_depoly_lights";
level._effect["riotshield_dust"] = "_t6/weapon/riotshield/fx_riotshield_depoly_dust";
}
//******************************************************************
// *
// *
//******************************************************************
function shield_state_change( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
{
self endon("entityshutdown");
switch( newVal )
{
case 1:
{
instant = ( oldVal == 2 );
self thread riotshield_deploy_anim( localClientNum, instant );
break;
}
case 2:
{
self thread riotshield_destroy_anim( localClientNum );
break;
}
}
}
//******************************************************************
// *
// *
//******************************************************************
function riotshield_deploy_anim( localClientNum, instant )
{
self endon("entityshutdown");
self thread watch_riotshield_damage();
self util::waittill_dobj( localClientNum );
self UseAnimTree( #animtree );
if ( instant )
{
self SetAnimTime( %o_riot_stand_deploy, 1.0 );
}
else
{
self SetAnim( %o_riot_stand_deploy, 1.0, 0.0, 1.0 );
PlayFXOnTag( localClientNum, level._effect["riotshield_dust"], self, "tag_origin" );
}
if ( !instant )
{
wait( 0.8 );
}
self.shieldLightFx = PlayFXOnTag( localClientNum, level._effect["riotshield_light"], self, "tag_fx" );
}
//******************************************************************
// *
// *
//******************************************************************
function watch_riotshield_damage()
{
self endon("entityshutdown");
while (1)
{
self waittill( "damage", damage_loc, damage_type );
self UseAnimTree( #animtree );
//println("CLIENT: Riotshield hit - " + damage_type + " " + damage_loc );
if ( damage_type == "MOD_MELEE" || damage_type == "MOD_MELEE_WEAPON_BUTT" || damage_type == "MOD_MELEE_ASSASSINATE" )
{
self SetAnim( %o_riot_stand_melee_front, 1.0, 0.0, 1.0 );
}
else
{
self SetAnim( %o_riot_stand_shot, 1.0, 0.0, 1.0 );
}
}
}
//******************************************************************
// *
// *
//******************************************************************
function riotshield_destroy_anim( localClientNum )
{
self endon("entityshutdown");
if ( isdefined( self.shieldLightFx ))
{
stopfx( localClientNum, self.shieldLightFx );
}
// tagTMR<NOTE>: Don't update the anim the same frame as the model swap
wait (0.05);
self PlaySound( localClientNum, "wpn_shield_destroy" );
self UseAnimTree( #animtree );
self SetAnim( %o_riot_stand_destroyed, 1.0, 0.0, 1.0 );
wait( 1.0 );
self SetForceNotSimple();
}