Files
Recompilable-gscs-for-BO2-z…/patch_zm/maps/mp/animscripts/zm_death.gsc

440 lines
12 KiB
Plaintext

#include maps/mp/animscripts/zm_shared;
#include maps/mp/_utility;
#include maps/mp/animscripts/zm_utility;
#include maps/mp/animscripts/utility;
#include maps/mp/animscripts/shared;
#include common_scripts/utility;
main()
{
debug_anim_print( "zm_death::main()" );
self setaimanimweights( 0, 0 );
self endon( "killanimscript" );
if ( isDefined( self.deathfunction ) )
{
successful_death = self [[ self.deathfunction ]]();
if ( !isDefined( successful_death ) || successful_death )
{
return;
}
}
if ( isDefined( self.a.nodeath ) && self.a.nodeath == 1 )
{
/#
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
#/
wait 3;
return;
}
self unlink();
if ( isDefined( self.anchor ) )
{
self.anchor delete();
}
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
{
self.enemy.syncedmeleetarget = undefined;
}
self thread do_gib();
if ( isDefined( self.a.gib_ref ) && self.a.gib_ref != "no_legs" || self.a.gib_ref == "right_leg" && self.a.gib_ref == "left_leg" )
{
self.has_legs = 0;
}
if ( !isDefined( self.deathanim ) )
{
self.deathanim = "zm_death";
self.deathanim_substate = undefined;
}
self.deathanim = append_missing_legs_suffix( self.deathanim );
self animmode( "gravity" );
self setanimstatefromasd( self.deathanim, self.deathanim_substate );
if ( !self getanimhasnotetrackfromasd( "start_ragdoll" ) )
{
self thread waitforragdoll( self getanimlengthfromasd() * 0,35 );
}
if ( isDefined( self.skip_death_notetracks ) && self.skip_death_notetracks )
{
self waittillmatch( "death_anim" );
return "end";
}
else
{
self maps/mp/animscripts/zm_shared::donotetracks( "death_anim", self.handle_death_notetracks );
}
}
waitforragdoll( time )
{
wait time;
do_ragdoll = 1;
if ( isDefined( self.nodeathragdoll ) && self.nodeathragdoll )
{
do_ragdoll = 0;
}
if ( isDefined( self ) && do_ragdoll )
{
self startragdoll();
}
}
on_fire_timeout()
{
self endon( "death" );
wait 12;
if ( isDefined( self ) && isalive( self ) )
{
self.is_on_fire = 0;
self notify( "stop_flame_damage" );
}
}
flame_death_fx()
{
self endon( "death" );
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
{
return;
}
self.is_on_fire = 1;
self thread on_fire_timeout();
if ( isDefined( level._effect ) && isDefined( level._effect[ "character_fire_death_torso" ] ) )
{
if ( !self.isdog )
{
playfxontag( level._effect[ "character_fire_death_torso" ], self, "J_SpineLower" );
}
}
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" ] ) )
{
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( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
wait 1;
tagarray[ 0 ] = "J_Wrist_RI";
tagarray[ 1 ] = "J_Wrist_LE";
if ( isDefined( self.a ) || !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( level._effect[ "character_fire_death_sm" ], self, tagarray[ 0 ] );
playfxontag( level._effect[ "character_fire_death_sm" ], self, tagarray[ 1 ] );
}
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"" );
#/
}
}
randomize_array( array )
{
i = 0;
while ( i < array.size )
{
j = randomint( array.size );
temp = array[ i ];
array[ i ] = array[ j ];
array[ j ] = temp;
i++;
}
return array;
}
get_tag_for_damage_location()
{
tag = "J_SpineLower";
if ( self.damagelocation == "helmet" )
{
tag = "j_head";
}
else if ( self.damagelocation == "head" )
{
tag = "j_head";
}
else if ( self.damagelocation == "neck" )
{
tag = "j_neck";
}
else if ( self.damagelocation == "torso_upper" )
{
tag = "j_spineupper";
}
else if ( self.damagelocation == "torso_lower" )
{
tag = "j_spinelower";
}
else if ( self.damagelocation == "right_arm_upper" )
{
tag = "j_elbow_ri";
}
else if ( self.damagelocation == "left_arm_upper" )
{
tag = "j_elbow_le";
}
else if ( self.damagelocation == "right_arm_lower" )
{
tag = "j_wrist_ri";
}
else
{
if ( self.damagelocation == "left_arm_lower" )
{
tag = "j_wrist_le";
}
}
return tag;
}
set_last_gib_time()
{
anim notify( "stop_last_gib_time" );
anim endon( "stop_last_gib_time" );
wait 0,05;
anim.lastgibtime = getTime();
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
}
get_gib_ref( direction )
{
if ( isDefined( self.a.gib_ref ) )
{
return;
}
if ( self.damagetaken < 165 )
{
return;
}
if ( getTime() > ( anim.lastgibtime + anim.gibdelay ) && anim.totalgibs > 0 )
{
anim.totalgibs--;
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:
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;
}
}
get_random( array )
{
return array[ randomint( array.size ) ];
}
do_gib()
{
if ( !is_mature() )
{
return;
}
if ( !isDefined( self.a.gib_ref ) )
{
return;
}
if ( isDefined( self.is_on_fire ) && self.is_on_fire )
{
return;
}
if ( self is_zombie_gibbed() )
{
return;
}
self set_zombie_gibbed();
gib_ref = self.a.gib_ref;
limb_data = get_limb_data( gib_ref );
if ( !isDefined( limb_data ) )
{
/#
println( "^3animscriptszm_death.gsc - limb_data is not setup for gib_ref on model: " + self.model + " and gib_ref of: " + self.a.gib_ref );
#/
return;
}
if ( isDefined( self.dont_throw_gib ) && !self.dont_throw_gib )
{
self thread throw_gib( limb_data[ "spawn_tags_array" ] );
}
if ( gib_ref == "head" )
{
self.hat_gibbed = 1;
self.head_gibbed = 1;
size = self getattachsize();
i = 0;
while ( i < size )
{
model = self getattachmodelname( i );
if ( issubstr( model, "head" ) )
{
if ( isDefined( self.hatmodel ) )
{
self detach( self.hatmodel, "" );
}
self detach( model, "" );
if ( isDefined( self.torsodmg5 ) )
{
self attach( self.torsodmg5, "", 1 );
}
break;
}
else
{
i++;
}
}
}
else self setmodel( limb_data[ "body_model" ] );
self attach( limb_data[ "legs_model" ] );
}
precache_gib_fx()
{
anim._effect[ "animscript_gib_fx" ] = loadfx( "weapon/bullet/fx_flesh_gib_fatal_01" );
anim._effect[ "animscript_gibtrail_fx" ] = loadfx( "trail/fx_trail_blood_streak" );
anim._effect[ "death_neckgrab_spurt" ] = loadfx( "impacts/fx_flesh_hit_neck_fatal" );
}
get_limb_data( gib_ref )
{
temp_array = [];
if ( gib_ref == "right_arm" && isDefined( self.torsodmg2 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn1 ) && isDefined( self.gibspawntag1 ) )
{
temp_array[ "right_arm" ][ "body_model" ] = self.torsodmg2;
temp_array[ "right_arm" ][ "legs_model" ] = self.legdmg1;
temp_array[ "right_arm" ][ "spawn_tags_array" ] = [];
temp_array[ "right_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_arm;
}
if ( gib_ref == "left_arm" && isDefined( self.torsodmg3 ) && isDefined( self.legdmg1 ) && isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) )
{
temp_array[ "left_arm" ][ "body_model" ] = self.torsodmg3;
temp_array[ "left_arm" ][ "legs_model" ] = self.legdmg1;
temp_array[ "left_arm" ][ "spawn_tags_array" ] = [];
temp_array[ "left_arm" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_arm;
}
if ( gib_ref == "right_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg2 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) )
{
temp_array[ "right_leg" ][ "body_model" ] = self.torsodmg1;
temp_array[ "right_leg" ][ "legs_model" ] = self.legdmg2;
temp_array[ "right_leg" ][ "spawn_tags_array" ] = [];
temp_array[ "right_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg;
}
if ( gib_ref == "left_leg" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg3 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawntag4 ) )
{
temp_array[ "left_leg" ][ "body_model" ] = self.torsodmg1;
temp_array[ "left_leg" ][ "legs_model" ] = self.legdmg3;
temp_array[ "left_leg" ][ "spawn_tags_array" ] = [];
temp_array[ "left_leg" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_left_leg;
}
if ( gib_ref == "no_legs" && isDefined( self.torsodmg1 ) && isDefined( self.legdmg4 ) && isDefined( self.gibspawn4 ) && isDefined( self.gibspawn3 ) && isDefined( self.gibspawntag3 ) && isDefined( self.gibspawntag4 ) )
{
temp_array[ "no_legs" ][ "body_model" ] = self.torsodmg1;
temp_array[ "no_legs" ][ "legs_model" ] = self.legdmg4;
temp_array[ "no_legs" ][ "spawn_tags_array" ] = [];
temp_array[ "no_legs" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_right_leg;
temp_array[ "no_legs" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_leg;
}
if ( gib_ref == "guts" && isDefined( self.torsodmg4 ) && isDefined( self.legdmg1 ) )
{
temp_array[ "guts" ][ "body_model" ] = self.torsodmg4;
temp_array[ "guts" ][ "legs_model" ] = self.legdmg1;
temp_array[ "guts" ][ "spawn_tags_array" ] = [];
temp_array[ "guts" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_guts;
if ( isDefined( self.gibspawn2 ) && isDefined( self.gibspawntag2 ) )
{
temp_array[ "guts" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_left_arm;
}
}
if ( gib_ref == "head" && isDefined( self.torsodmg5 ) && isDefined( self.legdmg1 ) )
{
temp_array[ "head" ][ "body_model" ] = self.torsodmg5;
temp_array[ "head" ][ "legs_model" ] = self.legdmg1;
temp_array[ "head" ][ "spawn_tags_array" ] = [];
temp_array[ "head" ][ "spawn_tags_array" ][ 0 ] = level._zombie_gib_piece_index_head;
if ( isDefined( self.hat_gibbed ) && !self.hat_gibbed && isDefined( self.gibspawn5 ) && isDefined( self.gibspawntag5 ) )
{
temp_array[ "head" ][ "spawn_tags_array" ][ 1 ] = level._zombie_gib_piece_index_hat;
}
}
if ( isDefined( temp_array[ gib_ref ] ) )
{
return temp_array[ gib_ref ];
}
else
{
return undefined;
}
}
throw_gib( limb_tags_array )
{
if ( isDefined( limb_tags_array ) )
{
if ( isDefined( level.track_gibs ) )
{
level [[ level.track_gibs ]]( self, limb_tags_array );
}
if ( isDefined( self.launch_gib_up ) )
{
self gib( "up", limb_tags_array );
return;
}
else
{
self gib( "normal", limb_tags_array );
}
}
}