mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-10 10:47:58 -05:00
440 lines
12 KiB
Plaintext
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 );
|
|
}
|
|
}
|
|
}
|