301 lines
16 KiB
Plaintext
301 lines
16 KiB
Plaintext
#using scripts\codescripts\struct;
|
|
|
|
#using scripts\shared\callbacks_shared;
|
|
#using scripts\shared\clientfield_shared;
|
|
#using scripts\shared\system_shared;
|
|
#using scripts\shared\util_shared;
|
|
#using scripts\shared\visionset_mgr_shared;
|
|
#using scripts\shared\ai\systems\gib;
|
|
|
|
#using scripts\shared\weapons\_weaponobjects;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#namespace hive_gun;
|
|
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_hunting" );
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_death" );
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_attack" );
|
|
#precache( "client_fx", "weapon/fx_ability_firefly_attack_1p" );
|
|
#precache( "client_fx", "weapon/fx_ability_firefly_chase_1p" );
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_attack_limb" );
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_attack_limb_reaper" );
|
|
//#precache( "client_fx", "weapon/fx_hero_firefly_start" );
|
|
#precache( "client_fx", "weapon/fx_hero_firefly_start_entity" );
|
|
|
|
function init_shared()
|
|
{
|
|
// visionset_mgr::register_overlay_info_style_postfx_bundle( "hive_gungun_splat", VERSION_SHIP, 7, "pstfx_hive_gun_splat", hive_gun_SPLAT_DURATION_MAX );
|
|
level thread register();
|
|
}
|
|
|
|
function register()
|
|
{
|
|
clientfield::register( "scriptmover", "firefly_state", 1, 3, "int",&firefly_state_change, !true, !true );
|
|
// clientfield::register( "scriptmover", "firefly_target", VERSION_SHIP, 6, "int",&firefly_target, !CF_HOST_ONLY, !CF_CALLBACK_ZERO_ON_NEW_ENT );
|
|
clientfield::register( "toplayer", "fireflies_attacking", 1, 1, "int", &fireflies_attacking, !true, true );
|
|
clientfield::register( "toplayer", "fireflies_chasing", 1, 1, "int", &fireflies_chasing, !true, true );
|
|
}
|
|
|
|
function getOtherTeam( team )
|
|
{
|
|
if ( team == "allies" )
|
|
return "axis";
|
|
else if ( team == "axis" )
|
|
return "allies";
|
|
else
|
|
return "free";
|
|
}
|
|
|
|
function fireflies_attacking( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self endon("entityshutdown");
|
|
self util::waittill_dobj( localClientNum );
|
|
|
|
if ( !isdefined(self) )
|
|
return;
|
|
|
|
if ( newVal )
|
|
{
|
|
self notify ( "stop_player_fx" );
|
|
|
|
if ( self IsLocalPlayer() && !(self GetInKillcam( localClientNum )) )
|
|
{
|
|
fx = PlayFXOnCamera( localClientNum, "weapon/fx_ability_firefly_attack_1p", (0,0,0), (1,0,0), (0,0,1) );
|
|
self thread watch_player_fx_finished( localClientNum, fx );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self notify ( "stop_player_fx" );
|
|
}
|
|
}
|
|
|
|
function fireflies_chasing( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self endon("entityshutdown");
|
|
self util::waittill_dobj( localClientNum );
|
|
|
|
if ( !isdefined(self) )
|
|
return;
|
|
|
|
if ( newVal )
|
|
{
|
|
self notify ( "stop_player_fx" );
|
|
|
|
if ( self IsLocalPlayer() && !(self GetInKillcam( localClientNum )) )
|
|
{
|
|
fx = PlayFXOnCamera( localClientNum, "weapon/fx_ability_firefly_chase_1p", (0,0,0), (1,0,0), (0,0,1) );
|
|
sound = self PlayLoopSound("wpn_gelgun_hive_hunt_lp" );
|
|
self PlayRumbleLoopOnEntity( localClientNum, "firefly_chase_rumble_loop" );
|
|
self thread watch_player_fx_finished( localClientNum, fx, sound );
|
|
}
|
|
}
|
|
else
|
|
{
|
|
self notify ( "stop_player_fx" );
|
|
}
|
|
}
|
|
|
|
function watch_player_fx_finished( localClientNum, fx, sound )
|
|
{
|
|
self util::waittill_any( "entityshutdown", "stop_player_fx" );
|
|
|
|
if( isDefined( self ) )
|
|
{
|
|
self StopRumble( localClientNum, "firefly_chase_rumble_loop" );
|
|
}
|
|
|
|
if ( IsDefined( fx ) )
|
|
{
|
|
StopFx( localClientNum, fx );
|
|
}
|
|
|
|
if ( isdefined( sound ) && isDefined( self ) )
|
|
{
|
|
self StopLoopSound( sound );
|
|
}
|
|
}
|
|
|
|
function firefly_state_change( localClientNum, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
|
|
{
|
|
self endon("entityshutdown");
|
|
|
|
self util::waittill_dobj( localClientNum );
|
|
|
|
if ( !isdefined(self) )
|
|
return;
|
|
|
|
if ( !isdefined( self.initied ) )
|
|
{
|
|
self thread firefly_init( localClientNum );
|
|
self.initied = true;
|
|
}
|
|
|
|
switch( newVal )
|
|
{
|
|
case 0:
|
|
{
|
|
break;
|
|
}
|
|
case 1:
|
|
{
|
|
self firefly_deploying( localClientNum );
|
|
break;
|
|
}
|
|
case 2:
|
|
{
|
|
self firefly_hunting( localClientNum );
|
|
break;
|
|
}
|
|
case 3:
|
|
{
|
|
self firefly_attacking( localClientNum );
|
|
break;
|
|
}
|
|
case 4:
|
|
{
|
|
self firefly_link_attacking( localClientNum );
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
function on_shutdown(localClientNum, ent)
|
|
{
|
|
if ( isdefined(ent) && isdefined(ent.origin) && self === ent && !( isdefined( self.no_death_fx ) && self.no_death_fx ) )
|
|
{
|
|
fx = PlayFX( localClientNum,"weapon/fx_hero_firefly_death", ent.origin, (0,0,1) );
|
|
SetFXTeam( localClientNum, fx, ent.team );
|
|
}
|
|
}
|
|
|
|
function firefly_init( localClientNum )
|
|
{
|
|
self callback::on_shutdown( &on_shutdown, self );
|
|
}
|
|
|
|
function firefly_deploying( localClientNum )
|
|
{
|
|
fx = PlayFX( localClientNum, "weapon/fx_hero_firefly_start", self.origin, AnglesToUp(self.angles) );
|
|
SetFXTeam( localClientNum, fx, self.team );
|
|
}
|
|
|
|
function firefly_hunting( localClientNum )
|
|
{
|
|
fx = PlayFXOnTag( localClientNum, "weapon/fx_hero_firefly_hunting", self, "tag_origin");
|
|
SetFXTeam( localClientNum, fx, self.team );
|
|
self thread firefly_watch_fx_finished( localClientNum, fx );
|
|
}
|
|
|
|
function firefly_watch_fx_finished( localClientNum, fx )
|
|
{
|
|
self util::waittill_any( "entityshutdown", "stop_effects" );
|
|
|
|
if ( isdefined( fx ) )
|
|
{
|
|
StopFx( localClientNum, fx );
|
|
}
|
|
}
|
|
|
|
function firefly_attacking( localClientNum )
|
|
{
|
|
self notify ( "stop_effects" );
|
|
self.no_death_fx = true;
|
|
}
|
|
|
|
function firefly_link_attacking( localClientNum )
|
|
{
|
|
fx = PlayFX( localClientNum, "weapon/fx_hero_firefly_start_entity", self.origin, AnglesToUp(self.angles) );
|
|
SetFXTeam( localClientNum, fx, self.team );
|
|
|
|
self notify ( "stop_effects" );
|
|
self.no_death_fx = true;
|
|
}
|
|
|
|
function gib_fx( localClientNum, fxFileName, gibFlag )
|
|
{
|
|
fxTag = GibClientUtils::PlayerGibTag( localClientNum, gibFlag );
|
|
if ( isdefined( fxTag ) )
|
|
{
|
|
fx = PlayFxOnTag( localClientNum, fxFileName, self, fxTag );
|
|
SetFXTeam( localClientNum, fx, getOtherTeam( self.team ) );
|
|
}
|
|
}
|
|
|
|
function gib_corpse( localClientNum, value )
|
|
{
|
|
self endon("entityshutdown");
|
|
|
|
self thread watch_for_gib_notetracks( localClientNum );
|
|
}
|
|
|
|
function watch_for_gib_notetracks( localClientNum )
|
|
{
|
|
self endon("entityshutdown");
|
|
|
|
if ( !util::is_mature() || util::is_gib_restricted_build() )
|
|
return;
|
|
|
|
fxFileName = "weapon/fx_hero_firefly_attack_limb";
|
|
bodyType = self GetCharacterBodyType();
|
|
if ( bodyType >= 0 )
|
|
{
|
|
bodyTypeFields = GetCharacterFields( bodyType, CurrentSessionMode() );
|
|
if( (isdefined(bodyTypeFields.digitalBlood)?bodyTypeFields.digitalBlood:false) )
|
|
{
|
|
fxFileName = "weapon/fx_hero_firefly_attack_limb_reaper";
|
|
}
|
|
}
|
|
|
|
|
|
arm_gib = 0;
|
|
leg_gib = 0;
|
|
while( 1 )
|
|
{
|
|
notetrack = self util::waittill_any_return( "gib_leftarm", "gib_leftleg", "gib_rightarm", "gib_rightleg", "entityshutdown" );
|
|
|
|
switch( noteTrack )
|
|
{
|
|
case "gib_rightarm":
|
|
{
|
|
arm_gib = arm_gib | 1;
|
|
gib_fx( localClientNum, fxFileName, 16 );
|
|
self GibClientUtils::PlayerGibLeftArm( localClientNum );
|
|
self SetCorpseGibState( leg_gib, arm_gib );
|
|
}
|
|
break;
|
|
case "gib_leftarm":
|
|
{
|
|
arm_gib = arm_gib | 2;
|
|
gib_fx( localClientNum, fxFileName, 32 );
|
|
self GibClientUtils::PlayerGibLeftArm( localClientNum );
|
|
self SetCorpseGibState( leg_gib, arm_gib );
|
|
}
|
|
break;
|
|
case "gib_rightleg":
|
|
{
|
|
leg_gib = leg_gib | 1;
|
|
gib_fx( localClientNum, fxFileName, 128 );
|
|
self GibClientUtils::PlayerGibLeftLeg( localClientNum );
|
|
self SetCorpseGibState( leg_gib, arm_gib );
|
|
}
|
|
break;
|
|
case "gib_leftleg":
|
|
{
|
|
leg_gib = leg_gib | 2;
|
|
gib_fx( localClientNum, fxFileName, 256 );
|
|
self GibClientUtils::PlayerGibLeftLeg( localClientNum );
|
|
self SetCorpseGibState( leg_gib, arm_gib );
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
}
|