2023-04-13 17:30:38 +02:00

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;
}
}
}