boiii-scripts/shared/ai/zombie_death.gsc
2023-04-13 17:30:38 +02:00

300 lines
12 KiB
Plaintext

#using scripts\codescripts\struct;
#using scripts\shared\util_shared;
#using scripts\shared\ai\zombie_shared;
#using scripts\shared\ai\zombie_utility;
#using scripts\shared\ai\systems\gib;
#precache( "fx", "zombie/fx_blood_torso_explo_zmb" );
#precache( "fx", "_t6/trail/fx_trail_blood_streak" );
#precache( "fx", "_t6/impacts/fx_flesh_hit_neck_fatal" );
function on_fire_timeout()
{
self endon ("death");
// about the length of the flame fx
if( isdefined(self.flame_fx_timeout) )
{
wait self.flame_fx_timeout;
}
else
{
wait 12;
}
if (isdefined(self) && IsAlive(self))
{
self.is_on_fire = false;
self notify ("stop_flame_damage");
}
}
function flame_death_fx()
{
self endon( "death" );
if (isdefined(self.is_on_fire) && self.is_on_fire )
{
return;
}
if( ( isdefined( self.disable_flame_fx ) && self.disable_flame_fx ) )
{
return;
}
self.is_on_fire = true;
self thread on_fire_timeout();
if( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_torso"] ) )
{
fire_tag = "j_spinelower";
fire_death_torso_fx = level._effect["character_fire_death_torso"];
if( isDefined( self.weapon_specific_fire_death_torso_fx ))
{
fire_death_torso_fx = self.weapon_specific_fire_death_torso_fx;
}
if( !isDefined( self GetTagOrigin( fire_tag))) //allows effect to play on parasite and insanity elementals
{
fire_tag = "tag_origin";
}
if ( !isDefined( self.isdog) || !self.isdog )
{
PlayFxOnTag( fire_death_torso_fx, self, fire_tag );
}
self.weapon_specific_fire_death_torso_fx = undefined;
}
else
{
/#
println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_torso\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_player_torso\"" );
#/
}
if( isdefined( level._effect ) && isdefined( level._effect["character_fire_death_sm"] ) )
{
if( self.archetype !== "parasite" && self.archetype !== "raps" && self.archetype !== "spider")
{
fire_death_sm_fx = level._effect["character_fire_death_sm"];
if( isDefined( self.weapon_specific_fire_death_sm_fx ))
{
fire_death_sm_fx = self.weapon_specific_fire_death_sm_fx;
}
if( isDefined( self.weapon_specific_fire_death_torso_fx ))
{
fire_death_torso_fx = self.weapon_specific_fire_death_torso_fx;
}
wait 1;
tagArray = [];
tagArray[0] = "J_Elbow_LE";
tagArray[1] = "J_Elbow_RI";
tagArray[2] = "J_Knee_RI";
tagArray[3] = "J_Knee_LE";
tagArray = randomize_array( tagArray );
PlayFxOnTag( fire_death_sm_fx, self, tagArray[0] );
wait 1;
tagArray[0] = "J_Wrist_RI";
tagArray[1] = "J_Wrist_LE";
if( !isdefined( self.a.gib_ref ) || self.a.gib_ref != "no_legs" )
{
tagArray[2] = "J_Ankle_RI";
tagArray[3] = "J_Ankle_LE";
}
tagArray = randomize_array( tagArray );
PlayFxOnTag( fire_death_sm_fx, self, tagArray[0] );
PlayFxOnTag( fire_death_sm_fx, self, tagArray[1] );
self.weapon_specific_fire_death_sm_fx = undefined;
}
}
else
{
/#
println( "^3ANIMSCRIPT WARNING: You are missing level._effect[\"character_fire_death_sm\"], please set it in your levelname_fx.gsc. Use \"env/fire/fx_fire_zombie_md\"" );
#/
}
}
// MikeD( 9/30/2007 ): Taken from maps\_utility "array_randomize:, for some reason maps\_utility is included in a animscript
// somewhere, but I can't call it within in this... So I made a new one.
function randomize_array( array )
{
for( i = 0; i < array.size; i++ )
{
j = RandomInt( array.size );
temp = array[i];
array[i] = array[j];
array[j] = temp;
}
return array;
}
function set_last_gib_time()
{
anim notify( "stop_last_gib_time" );
anim endon( "stop_last_gib_time" );
{wait(.05);};
anim.lastGibTime = GetTime();
anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs );
}
function get_gib_ref( direction )
{
// If already set, then use it. Useful for canned gib deaths.
if( isdefined( self.a.gib_ref ) )
{
return;
}
// Don't gib if we haven't taken enough damage by the explosive
// Grenade damage usually range from 160 - 250, so we go above teh minimum
// so if the splash damage is near it's lowest, don't gib.
if( self.damageTaken < 165 )
{
return;
}
if( GetTime() > anim.lastGibTime + anim.gibDelay && anim.totalGibs > 0 )
{
anim.totalGibs--;
// MikeD( 5/5/2008 ): Allows multiple guys to GIB at once.
anim thread set_last_gib_time();
refs = [];
switch( direction )
{
case "right":
refs[refs.size] = "left_arm";
refs[refs.size] = "left_leg";
gib_ref = get_random( refs );
break;
case "left":
refs[refs.size] = "right_arm";
refs[refs.size] = "right_leg";
gib_ref = get_random( refs );
break;
case "forward":
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "guts";
refs[refs.size] = "no_legs";
gib_ref = get_random( refs );
break;
case "back":
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
gib_ref = get_random( refs );
break;
default: // "up"
refs[refs.size] = "right_arm";
refs[refs.size] = "left_arm";
refs[refs.size] = "right_leg";
refs[refs.size] = "left_leg";
refs[refs.size] = "no_legs";
refs[refs.size] = "guts";
gib_ref = get_random( refs );
break;
}
self.a.gib_ref = gib_ref;
}
else
{
self.a.gib_ref = undefined;
}
}
function get_random( array )
{
return array[RandomInt( array.size )];
}
function do_gib()
{
if( !isdefined( self.a.gib_ref ) )
{
return;
}
if (isdefined(self.is_on_fire) && self.is_on_fire)
{
return;
}
switch ( self.a.gib_ref )
{
case "right_arm":
GibServerUtils::GibRightArm( self );
break;
case "left_arm":
GibServerUtils::GibLeftArm( self );
break;
case "right_leg":
GibServerUtils::GibRightLeg( self );
break;
case "left_leg":
GibServerUtils::GibLeftLeg( self );
break;
case "no_legs":
GibServerUtils::GibLegs( self );
break;
case "head":
GibServerUtils::GibHead( self );
break;
case "guts":
// TODO(David Young 9-17-14): Currently no characters have gut torso models, unsupported.
break;
default:
AssertMsg( "Unknown gib_ref \"" + self.a.gib_ref + "\", unable to gib entity." );
break;
}
}
function precache_gib_fx()
{
anim._effect["animscript_gib_fx"] = "zombie/fx_blood_torso_explo_zmb";
anim._effect["animscript_gibtrail_fx"] = "_t6/trail/fx_trail_blood_streak";
// Not gib; split out into another function before this gets out of hand.
anim._effect["death_neckgrab_spurt"] = "_t6/impacts/fx_flesh_hit_neck_fatal";
}