300 lines
12 KiB
Plaintext
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";
|
|
}
|