mirror of
https://github.com/JezuzLizard/Recompilable-gscs-for-BO2-zombies-and-multiplayer.git
synced 2025-06-11 11:17:56 -05:00
Added all the remaining scripts not previously included.
This commit is contained in:
106
patch_zm/maps/mp/animscripts/dog_combat.gsc
Normal file
106
patch_zm/maps/mp/animscripts/dog_combat.gsc
Normal file
@ -0,0 +1,106 @@
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
}
|
||||
|
||||
combatidle()
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
idleanims = [];
|
||||
idleanims[ 0 ] = "combat_attackidle";
|
||||
idleanims[ 1 ] = "combat_attackidle_bark";
|
||||
idleanims[ 2 ] = "combat_attackidle_growl";
|
||||
idleanim = random( idleanims );
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstate( idleanim );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
}
|
||||
|
||||
meleebiteattackplayer( player )
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas", 0 );
|
||||
self setanimstate( "combat_attack_player_close_range" );
|
||||
wait 0,35;
|
||||
if ( isplayer( self.enemy ) && self.enemy getstance() == "prone" )
|
||||
{
|
||||
self meleewithoffset( vectorScale( ( 0, 0, -1 ), 9 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
self melee();
|
||||
}
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( 1,2, "done" );
|
||||
self animmode( "gravity", 0 );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstate( "combat_attack_run" );
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( attack_time, "done", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks( note, player )
|
||||
{
|
||||
if ( note == "dog_melee" )
|
||||
{
|
||||
self melee( anglesToForward( self.angles ) );
|
||||
}
|
||||
}
|
||||
|
||||
use_low_attack()
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
if ( self.enemy getstance() == "prone" )
|
||||
{
|
||||
attack_height = self.origin[ 2 ] + 16;
|
||||
if ( self.enemy.origin[ 2 ] < attack_height )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
30
patch_zm/maps/mp/animscripts/dog_death.gsc
Normal file
30
patch_zm/maps/mp/animscripts/dog_death.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
if ( isDefined( self.a.nodeath ) )
|
||||
{
|
||||
/#
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
#/
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
/#
|
||||
println( death_anim );
|
||||
#/
|
||||
self animmode( "gravity", 0 );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstate( death_anim );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
29
patch_zm/maps/mp/animscripts/dog_flashed.gsc
Normal file
29
patch_zm/maps/mp/animscripts/dog_flashed.gsc
Normal file
@ -0,0 +1,29 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
wait randomfloatrange( 0, 0,4 );
|
||||
duration = self startflashbanged() * 0,001;
|
||||
self setanimstate( "flashed" );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self setflashbanged( 0 );
|
||||
self.flashed = 0;
|
||||
self notify( "stop_flashbang_effect" );
|
||||
}
|
||||
|
||||
startflashbanged()
|
||||
{
|
||||
if ( isDefined( self.flashduration ) )
|
||||
{
|
||||
duration = self.flashduration;
|
||||
}
|
||||
else
|
||||
{
|
||||
duration = self getflashbangedstrength() * 1000;
|
||||
}
|
||||
self.flashendtime = getTime() + duration;
|
||||
self notify( "flashed" );
|
||||
return duration;
|
||||
}
|
62
patch_zm/maps/mp/animscripts/dog_init.gsc
Normal file
62
patch_zm/maps/mp/animscripts/dog_init.gsc
Normal file
@ -0,0 +1,62 @@
|
||||
#include maps/mp/animscripts/dog_combat;
|
||||
#include maps/mp/animscripts/dog_move;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps/mp/animscripts/dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
anim_get_dvar_int( "dog_force_walk", 0 );
|
||||
anim_get_dvar_int( "dog_force_run", 0 );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "run";
|
||||
set_anim_playback_rate();
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416,82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "dog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
if ( !isDefined( level.dog_hits_before_kill ) )
|
||||
{
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
}
|
||||
|
||||
set_anim_playback_rate()
|
||||
{
|
||||
self.animplaybackrate = 0,9 + randomfloat( 0,2 );
|
||||
self.moveplaybackrate = 1;
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
self.meleeattackdist = 0;
|
||||
if ( self maps/mp/animscripts/dog_combat::use_low_attack() )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
13
patch_zm/maps/mp/animscripts/dog_jump.gsc
Normal file
13
patch_zm/maps/mp/animscripts/dog_jump.gsc
Normal file
@ -0,0 +1,13 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstate( "traverse_wallhop" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self.safetochangescript = 1;
|
||||
}
|
185
patch_zm/maps/mp/animscripts/dog_move.gsc
Normal file
185
patch_zm/maps/mp/animscripts/dog_move.gsc
Normal file
@ -0,0 +1,185 @@
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
setup_sound_variables()
|
||||
{
|
||||
level.dog_sounds[ "far" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ].minrange = 0;
|
||||
level.dog_sounds[ "close" ].maxrange = 500;
|
||||
level.dog_sounds[ "close" ].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange;
|
||||
level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange;
|
||||
level.dog_sounds[ "far" ].minrange = 500;
|
||||
level.dog_sounds[ "far" ].maxrange = 0;
|
||||
level.dog_sounds[ "far" ].sound = "aml_dog_bark";
|
||||
level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange;
|
||||
level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
blendtime = 0,2;
|
||||
}
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
}
|
||||
}
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
while ( 1 )
|
||||
{
|
||||
self moveloop();
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
{
|
||||
self thread stopmove();
|
||||
}
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
moveloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
while ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
while ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
||||
if ( self.disablearrivals )
|
||||
{
|
||||
self.stopanimdistsq = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
}
|
||||
if ( shouldrun() )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstate( "move_walk" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstate( "move_start" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none", 0 );
|
||||
self set_orient_mode( "face motion" );
|
||||
}
|
||||
|
||||
stopmove()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstate( "move_stop" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
}
|
||||
|
||||
shouldrun()
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"DFB12081" ) != 0 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( getDvarInt( #"D5D7999B" ) != 0 )
|
||||
{
|
||||
return 0;
|
||||
#/
|
||||
}
|
||||
}
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( self.lookaheaddist <= 90 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
angles = vectorToAngle( self.lookaheaddir );
|
||||
yaw_desired = absangleclamp180( angles[ 1 ] );
|
||||
yaw = absangleclamp180( self.angles[ 1 ] );
|
||||
if ( abs( yaw_desired - yaw ) >= 8 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
26
patch_zm/maps/mp/animscripts/dog_pain.gsc
Normal file
26
patch_zm/maps/mp/animscripts/dog_pain.gsc
Normal file
@ -0,0 +1,26 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self unlink();
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
speed = length( self getvelocity() );
|
||||
pain_anim = getanimdirection( self.damageyaw );
|
||||
if ( speed > level.dogrunpainspeed )
|
||||
{
|
||||
pain_anim = "pain_run_" + pain_anim;
|
||||
}
|
||||
else
|
||||
{
|
||||
pain_anim = "pain_" + pain_anim;
|
||||
}
|
||||
self setanimstate( pain_anim );
|
||||
self maps/mp/animscripts/shared::donotetracksfortime( 0,2, "done" );
|
||||
}
|
132
patch_zm/maps/mp/animscripts/dog_stop.gsc
Normal file
132
patch_zm/maps/mp/animscripts/dog_stop.gsc
Normal file
@ -0,0 +1,132 @@
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstate( "stop_idle" );
|
||||
maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
}
|
||||
|
||||
isfacingenemy( tolerancecosangle )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
if ( disttoenemy < 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
forward = anglesToForward( self.angles );
|
||||
val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] );
|
||||
val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy;
|
||||
return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle;
|
||||
}
|
||||
|
||||
randomattackidle()
|
||||
{
|
||||
if ( isfacingenemy( -0,5 ) )
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
if ( isDefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
}
|
||||
rand = randomint( 100 );
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstate( "stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstate( "stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstate( "stop_attackidle_growl" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
if ( isDefined( self.enemy ) && isalive( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
should_growl()
|
||||
{
|
||||
if ( isDefined( self.script_growl ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return !self cansee( self.enemy );
|
||||
}
|
||||
|
||||
lookattarget( lookposeset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 );
|
||||
self maps/mp/animscripts/shared::trackloop();
|
||||
}
|
117
patch_zm/maps/mp/animscripts/dog_turn.gsc
Normal file
117
patch_zm/maps/mp/animscripts/dog_turn.gsc
Normal file
@ -0,0 +1,117 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_turn_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
{
|
||||
turn_180( deltayaw );
|
||||
}
|
||||
else
|
||||
{
|
||||
turn_90( deltayaw );
|
||||
}
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
||||
need_to_turn_around( deltayaw )
|
||||
{
|
||||
angle = getDvarFloat( "dog_turn180_angle" );
|
||||
if ( deltayaw >= angle || deltayaw <= ( -1 * angle ) )
|
||||
{
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " YES" );
|
||||
return 1;
|
||||
}
|
||||
debug_turn_print( "dog_turn::need_to_turn_around(): " + deltayaw + " NO" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time )
|
||||
{
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstate( do_anim );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( run_wait_time, "done" );
|
||||
debug_turn_print( "dog_turn::do_turn_anim() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
turn_180_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
move_out_of_turn()
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstate( "move_run" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,1, "done" );
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstate( "move_walk" );
|
||||
}
|
||||
}
|
||||
|
||||
turn_90( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_90() deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_90() right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
}
|
||||
|
||||
turn_180( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics", 0 );
|
||||
debug_turn_print( "dog_turn::turn_180() deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 0 )
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "dog_turn::turn_180() right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
}
|
306
patch_zm/maps/mp/animscripts/shared.gsc
Normal file
306
patch_zm/maps/mp/animscripts/shared.gsc
Normal file
@ -0,0 +1,306 @@
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
handledogsoundnotetracks( note )
|
||||
{
|
||||
if ( note == "sound_dogstep_run_default" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
if ( prefix != "sound" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
growling()
|
||||
{
|
||||
return isDefined( self.script_growl );
|
||||
}
|
||||
|
||||
handlenotetrack( note, flagname, customfunction, var1 )
|
||||
{
|
||||
/#
|
||||
if ( getDvarInt( #"6EBEB982" ) )
|
||||
{
|
||||
println( "dog notetrack: " + flagname + " " + note + " " + getTime() );
|
||||
#/
|
||||
}
|
||||
if ( isai( self ) && self.type == "dog" )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "end":
|
||||
case "finish":
|
||||
case "undefined":
|
||||
return note;
|
||||
default:
|
||||
if ( isDefined( customfunction ) )
|
||||
{
|
||||
if ( !isDefined( var1 ) )
|
||||
{
|
||||
return [[ customfunction ]]( note );
|
||||
}
|
||||
else
|
||||
{
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracks( flagname, customfunction, var1 )
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
if ( !isDefined( note ) )
|
||||
{
|
||||
note = "undefined";
|
||||
}
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
if ( isDefined( val ) )
|
||||
{
|
||||
return val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
if ( isDefined( killstring ) )
|
||||
{
|
||||
self endon( killstring );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
/#
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 )
|
||||
{
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
wait time;
|
||||
self notify( "stop_notetracks" );
|
||||
}
|
||||
|
||||
trackloop()
|
||||
{
|
||||
players = get_players();
|
||||
deltachangeperframe = 5;
|
||||
aimblendtime = 0,05;
|
||||
prevyawdelta = 0;
|
||||
prevpitchdelta = 0;
|
||||
maxyawdeltachange = 5;
|
||||
maxpitchdeltachange = 5;
|
||||
pitchadd = 0;
|
||||
yawadd = 0;
|
||||
if ( self.type != "dog" || self.type == "zombie" && self.type == "zombie_dog" )
|
||||
{
|
||||
domaxanglecheck = 0;
|
||||
self.shootent = self.enemy;
|
||||
}
|
||||
else
|
||||
{
|
||||
domaxanglecheck = 1;
|
||||
if ( self.a.script == "cover_crouch" && isDefined( self.a.covermode ) && self.a.covermode == "lean" )
|
||||
{
|
||||
pitchadd = -1 * anim.covercrouchleanpitch;
|
||||
}
|
||||
if ( self.a.script != "cover_left" && self.a.script == "cover_right" && isDefined( self.a.cornermode ) && self.a.cornermode == "lean" )
|
||||
{
|
||||
yawadd = self.covernode.angles[ 1 ] - self.angles[ 1 ];
|
||||
}
|
||||
}
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
firstframe = 1;
|
||||
for ( ;; )
|
||||
{
|
||||
incranimaimweight();
|
||||
selfshootatpos = ( self.origin[ 0 ], self.origin[ 1 ], self geteye()[ 2 ] );
|
||||
shootpos = undefined;
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
shootpos = self.enemy getshootatpos();
|
||||
}
|
||||
if ( !isDefined( shootpos ) )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
vectortoshootpos = shootpos - selfshootatpos;
|
||||
anglestoshootpos = vectorToAngle( vectortoshootpos );
|
||||
pitchdelta = 360 - anglestoshootpos[ 0 ];
|
||||
pitchdelta = angleClamp180( pitchdelta + pitchadd );
|
||||
yawdelta = self.angles[ 1 ] - anglestoshootpos[ 1 ];
|
||||
yawdelta = angleClamp180( yawdelta + yawadd );
|
||||
}
|
||||
if ( domaxanglecheck || abs( yawdelta ) > 60 && abs( pitchdelta ) > 60 )
|
||||
{
|
||||
yawdelta = 0;
|
||||
pitchdelta = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta > self.rightaimlimit )
|
||||
{
|
||||
yawdelta = self.rightaimlimit;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta < self.leftaimlimit )
|
||||
{
|
||||
yawdelta = self.leftaimlimit;
|
||||
}
|
||||
}
|
||||
if ( pitchdelta > self.upaimlimit )
|
||||
{
|
||||
pitchdelta = self.upaimlimit;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( pitchdelta < self.downaimlimit )
|
||||
{
|
||||
pitchdelta = self.downaimlimit;
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( firstframe )
|
||||
{
|
||||
firstframe = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
yawdeltachange = yawdelta - prevyawdelta;
|
||||
if ( abs( yawdeltachange ) > maxyawdeltachange )
|
||||
{
|
||||
yawdelta = prevyawdelta + ( maxyawdeltachange * sign( yawdeltachange ) );
|
||||
}
|
||||
pitchdeltachange = pitchdelta - prevpitchdelta;
|
||||
if ( abs( pitchdeltachange ) > maxpitchdeltachange )
|
||||
{
|
||||
pitchdelta = prevpitchdelta + ( maxpitchdeltachange * sign( pitchdeltachange ) );
|
||||
}
|
||||
}
|
||||
prevyawdelta = yawdelta;
|
||||
prevpitchdelta = pitchdelta;
|
||||
updown = 0;
|
||||
leftright = 0;
|
||||
if ( yawdelta > 0 )
|
||||
{
|
||||
/#
|
||||
assert( yawdelta <= self.rightaimlimit );
|
||||
#/
|
||||
weight = ( yawdelta / self.rightaimlimit ) * self.a.aimweight;
|
||||
leftright = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( yawdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( yawdelta >= self.leftaimlimit );
|
||||
#/
|
||||
weight = ( yawdelta / self.leftaimlimit ) * self.a.aimweight;
|
||||
leftright = -1 * weight;
|
||||
}
|
||||
}
|
||||
if ( pitchdelta > 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta <= self.upaimlimit );
|
||||
#/
|
||||
weight = ( pitchdelta / self.upaimlimit ) * self.a.aimweight;
|
||||
updown = weight;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( pitchdelta < 0 )
|
||||
{
|
||||
/#
|
||||
assert( pitchdelta >= self.downaimlimit );
|
||||
#/
|
||||
weight = ( pitchdelta / self.downaimlimit ) * self.a.aimweight;
|
||||
updown = -1 * weight;
|
||||
}
|
||||
}
|
||||
self setaimanimweights( updown, leftright );
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
setanimaimweight( goalweight, goaltime )
|
||||
{
|
||||
if ( !isDefined( goaltime ) || goaltime <= 0 )
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = goalweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.aimweight = goalweight;
|
||||
self.a.aimweight_start = self.a.aimweight;
|
||||
self.a.aimweight_end = goalweight;
|
||||
self.a.aimweight_transframes = int( goaltime * 20 );
|
||||
}
|
||||
self.a.aimweight_t = 0;
|
||||
}
|
||||
|
||||
incranimaimweight()
|
||||
{
|
||||
if ( self.a.aimweight_t < self.a.aimweight_transframes )
|
||||
{
|
||||
self.a.aimweight_t++;
|
||||
t = ( 1 * self.a.aimweight_t ) / self.a.aimweight_transframes;
|
||||
self.a.aimweight = ( self.a.aimweight_start * ( 1 - t ) ) + ( self.a.aimweight_end * t );
|
||||
}
|
||||
}
|
227
patch_zm/maps/mp/animscripts/traverse/shared.gsc
Normal file
227
patch_zm/maps/mp/animscripts/traverse/shared.gsc
Normal file
@ -0,0 +1,227 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
init_traverse()
|
||||
{
|
||||
point = getent( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
teleportthreadex( verticaloffset, delay, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
if ( verticaloffset == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait delay;
|
||||
amount = verticaloffset / frames;
|
||||
if ( amount > 10 )
|
||||
{
|
||||
amount = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( amount < -10 )
|
||||
{
|
||||
amount = -10;
|
||||
}
|
||||
}
|
||||
offset = ( 0, 0, amount );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
dog_wall_and_window_hop( traversename, height )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 36 )
|
||||
{
|
||||
self thread teleportthreadex( height - 36, 0,2, 7 );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - Setting " + traversename );
|
||||
self setanimstate( traversename );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 1, "done" );
|
||||
debug_anim_print( "traverse::dog_wall_and_window_hop() - " + traversename );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_down( height, frames, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
if ( !isDefined( time ) )
|
||||
{
|
||||
time = 0,3;
|
||||
}
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 40 )
|
||||
{
|
||||
self thread teleportthreadex( height - 40, 0,1, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_40" );
|
||||
self setanimstate( "traverse_jump_down_40" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_down_far( height, frames, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
if ( !isDefined( time ) )
|
||||
{
|
||||
time = 0,3;
|
||||
}
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 80 )
|
||||
{
|
||||
self thread teleportthreadex( 80 - height, 0,1, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_down() - Setting traverse_jump_down_80" );
|
||||
self setanimstate( "traverse_jump_down_80" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( time, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_down() - traverse_jump_down_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_up( height, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthread( realheight - height );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 40 )
|
||||
{
|
||||
self thread teleportthreadex( height - 40, 0,2, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_up() - Setting traverse_jump_up_40" );
|
||||
self setanimstate( "traverse_jump_up_40" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,5, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up() - traverse_jump_up_40 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
||||
|
||||
dog_jump_up_high( height, frames )
|
||||
{
|
||||
/#
|
||||
assert( self.type == "dog", "Only dogs can do this traverse currently." );
|
||||
#/
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
startnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( startnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", startnode.angles[ 1 ] );
|
||||
if ( isDefined( startnode.traverse_height ) )
|
||||
{
|
||||
realheight = startnode.traverse_height - startnode.origin[ 2 ];
|
||||
self thread teleportthreadex( height - 80, 0,2, frames );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( height != 80 )
|
||||
{
|
||||
self thread teleportthreadex( height - 80, 0,2, frames );
|
||||
}
|
||||
}
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - Setting traverse_jump_up_80" );
|
||||
self setanimstate( "traverse_jump_up_80" );
|
||||
maps/mp/animscripts/shared::donotetracksfortime( 0,6, "done" );
|
||||
debug_anim_print( "traverse::dog_jump_up_80() - traverse_jump_up_80 " );
|
||||
self traversemode( "gravity" );
|
||||
self.traversecomplete = 1;
|
||||
}
|
44
patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc
Normal file
44
patch_zm/maps/mp/animscripts/traverse/zm_mantle_over_40.gsc
Normal file
@ -0,0 +1,44 @@
|
||||
#include maps/mp/animscripts/traverse/zm_shared;
|
||||
#include maps/mp/animscripts/traverse/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
traversestate = "zm_traverse_barrier";
|
||||
traversealias = "barrier_walk";
|
||||
if ( self.has_legs )
|
||||
{
|
||||
switch( self.zombie_move_speed )
|
||||
{
|
||||
case "low_gravity_walk":
|
||||
case "walk":
|
||||
case "walk_slide":
|
||||
traversealias = "barrier_walk";
|
||||
break;
|
||||
case "low_gravity_run":
|
||||
case "run":
|
||||
case "run_slide":
|
||||
traversealias = "barrier_run";
|
||||
break;
|
||||
case "low_gravity_sprint":
|
||||
case "sprint":
|
||||
case "sprint_slide":
|
||||
case "super_sprint":
|
||||
traversealias = "barrier_sprint";
|
||||
break;
|
||||
default:
|
||||
if ( isDefined( level.zm_mantle_over_40_move_speed_override ) )
|
||||
{
|
||||
traversealias = self [[ level.zm_mantle_over_40_move_speed_override ]]();
|
||||
}
|
||||
else /#
|
||||
assertmsg( "Zombie '" + self.classname + "' move speed of '" + self.zombie_move_speed + "' is not supported for mantle_over_40." );
|
||||
#/
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
traversestate = "zm_traverse_barrier_crawl";
|
||||
traversealias = "barrier_crawl";
|
||||
}
|
||||
self dotraverse( traversestate, traversealias );
|
||||
}
|
151
patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc
Normal file
151
patch_zm/maps/mp/animscripts/traverse/zm_shared.gsc
Normal file
@ -0,0 +1,151 @@
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include common_scripts/utility;
|
||||
#include maps/mp/_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
init_traverse()
|
||||
{
|
||||
point = getent( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
point delete();
|
||||
}
|
||||
else
|
||||
{
|
||||
point = getstruct( self.target, "targetname" );
|
||||
if ( isDefined( point ) )
|
||||
{
|
||||
self.traverse_height = point.origin[ 2 ];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
teleportthread( verticaloffset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
reps = 5;
|
||||
offset = ( 0, 0, verticaloffset / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
teleportthreadex( verticaloffset, delay, frames )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self notify( "endTeleportThread" );
|
||||
self endon( "endTeleportThread" );
|
||||
if ( verticaloffset == 0 )
|
||||
{
|
||||
return;
|
||||
}
|
||||
wait delay;
|
||||
amount = verticaloffset / frames;
|
||||
if ( amount > 10 )
|
||||
{
|
||||
amount = 10;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( amount < -10 )
|
||||
{
|
||||
amount = -10;
|
||||
}
|
||||
}
|
||||
offset = ( 0, 0, amount );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
self teleport( self.origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
handletraversealignment()
|
||||
{
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
if ( isDefined( self.traverseheight ) && isDefined( self.traversestartnode.traverse_height ) )
|
||||
{
|
||||
currentheight = self.traversestartnode.traverse_height - self.traversestartz;
|
||||
self thread teleportthread( currentheight - self.traverseheight );
|
||||
}
|
||||
}
|
||||
|
||||
dosimpletraverse( traversealias, no_powerups, traversestate )
|
||||
{
|
||||
if ( !isDefined( traversestate ) )
|
||||
{
|
||||
traversestate = "zm_traverse";
|
||||
}
|
||||
if ( isDefined( level.ignore_traverse ) )
|
||||
{
|
||||
if ( self [[ level.ignore_traverse ]]() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.zm_traversal_override ) )
|
||||
{
|
||||
traversealias = self [[ level.zm_traversal_override ]]( traversealias );
|
||||
}
|
||||
if ( !self.has_legs )
|
||||
{
|
||||
traversestate += "_crawl";
|
||||
traversealias += "_crawl";
|
||||
}
|
||||
self dotraverse( traversestate, traversealias, no_powerups );
|
||||
}
|
||||
|
||||
dotraverse( traversestate, traversealias, no_powerups )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self traversemode( "nogravity" );
|
||||
self traversemode( "noclip" );
|
||||
old_powerups = 0;
|
||||
if ( isDefined( no_powerups ) && no_powerups )
|
||||
{
|
||||
old_powerups = self.no_powerups;
|
||||
self.no_powerups = 1;
|
||||
}
|
||||
self.is_traversing = 1;
|
||||
self notify( "zombie_start_traverse" );
|
||||
self.traversestartnode = self getnegotiationstartnode();
|
||||
/#
|
||||
assert( isDefined( self.traversestartnode ) );
|
||||
#/
|
||||
self orientmode( "face angle", self.traversestartnode.angles[ 1 ] );
|
||||
self.traversestartz = self.origin[ 2 ];
|
||||
if ( isDefined( self.pre_traverse ) )
|
||||
{
|
||||
self [[ self.pre_traverse ]]();
|
||||
}
|
||||
self setanimstatefromasd( traversestate, traversealias );
|
||||
self maps/mp/animscripts/zm_shared::donotetracks( "traverse_anim" );
|
||||
self traversemode( "gravity" );
|
||||
self.a.nodeath = 0;
|
||||
if ( isDefined( self.post_traverse ) )
|
||||
{
|
||||
self [[ self.post_traverse ]]();
|
||||
}
|
||||
self maps/mp/animscripts/zm_run::needsupdate();
|
||||
if ( !self.isdog )
|
||||
{
|
||||
self maps/mp/animscripts/zm_run::moverun();
|
||||
}
|
||||
self.is_traversing = 0;
|
||||
self notify( "zombie_end_traverse" );
|
||||
if ( isDefined( no_powerups ) && no_powerups )
|
||||
{
|
||||
self.no_powerups = old_powerups;
|
||||
}
|
||||
}
|
166
patch_zm/maps/mp/animscripts/utility.gsc
Normal file
166
patch_zm/maps/mp/animscripts/utility.gsc
Normal file
@ -0,0 +1,166 @@
|
||||
|
||||
anim_get_dvar_int( dvar, def )
|
||||
{
|
||||
return int( anim_get_dvar( dvar, def ) );
|
||||
}
|
||||
|
||||
anim_get_dvar( dvar, def )
|
||||
{
|
||||
if ( getDvar( dvar ) != "" )
|
||||
{
|
||||
return getDvarFloat( dvar );
|
||||
}
|
||||
else
|
||||
{
|
||||
setdvar( dvar, def );
|
||||
return def;
|
||||
}
|
||||
}
|
||||
|
||||
set_orient_mode( mode, val1 )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_orient == self getentnum() )
|
||||
{
|
||||
if ( isDefined( val1 ) )
|
||||
{
|
||||
println( "DOG: Setting orient mode: " + mode + " " + val1 + " " + getTime() );
|
||||
}
|
||||
else
|
||||
{
|
||||
println( "DOG: Setting orient mode: " + mode + " " + getTime() );
|
||||
#/
|
||||
}
|
||||
}
|
||||
if ( isDefined( val1 ) )
|
||||
{
|
||||
self orientmode( mode, val1 );
|
||||
}
|
||||
else
|
||||
{
|
||||
self orientmode( mode );
|
||||
}
|
||||
}
|
||||
|
||||
debug_anim_print( text )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_anims )
|
||||
{
|
||||
println( ( text + " " ) + getTime() );
|
||||
}
|
||||
if ( level.dog_debug_anims_ent == self getentnum() )
|
||||
{
|
||||
println( ( text + " " ) + getTime() );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_turn_print( text, line )
|
||||
{
|
||||
/#
|
||||
if ( level.dog_debug_turns == self getentnum() )
|
||||
{
|
||||
duration = 200;
|
||||
currentyawcolor = ( 1, 0, 1 );
|
||||
lookaheadyawcolor = ( 1, 0, 1 );
|
||||
desiredyawcolor = ( 1, 0, 1 );
|
||||
currentyaw = angleClamp180( self.angles[ 1 ] );
|
||||
desiredyaw = angleClamp180( self.desiredangle );
|
||||
lookaheaddir = self.lookaheaddir;
|
||||
lookaheadangles = vectorToAngle( lookaheaddir );
|
||||
lookaheadyaw = angleClamp180( lookaheadangles[ 1 ] );
|
||||
println( ( text + " " ) + getTime() + " cur: " + currentyaw + " look: " + lookaheadyaw + " desired: " + desiredyaw );
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
debug_allow_movement()
|
||||
{
|
||||
/#
|
||||
return anim_get_dvar_int( "debug_dog_allow_movement", "1" );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
|
||||
debug_allow_combat()
|
||||
{
|
||||
/#
|
||||
return anim_get_dvar_int( "debug_dog_allow_combat", "1" );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
|
||||
current_yaw_line_debug( duration )
|
||||
{
|
||||
/#
|
||||
currentyawcolor = [];
|
||||
currentyawcolor[ 0 ] = ( 1, 0, 1 );
|
||||
currentyawcolor[ 1 ] = ( 1, 0, 1 );
|
||||
current_color_index = 0;
|
||||
start_time = getTime();
|
||||
if ( !isDefined( level.lastdebugheight ) )
|
||||
{
|
||||
level.lastdebugheight = 15;
|
||||
}
|
||||
while ( ( getTime() - start_time ) < 1000 )
|
||||
{
|
||||
pos1 = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + level.lastdebugheight );
|
||||
pos2 = pos1 + vectorScale( anglesToForward( self.angles ), ( current_color_index + 1 ) * 10 );
|
||||
line( pos1, pos2, currentyawcolor[ current_color_index ], 0,3, 1, duration );
|
||||
current_color_index = ( current_color_index + 1 ) % currentyawcolor.size;
|
||||
wait 0,05;
|
||||
}
|
||||
if ( level.lastdebugheight == 15 )
|
||||
{
|
||||
level.lastdebugheight = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
level.lastdebugheight = 15;
|
||||
#/
|
||||
}
|
||||
}
|
||||
|
||||
getanimdirection( damageyaw )
|
||||
{
|
||||
if ( damageyaw > 135 || damageyaw <= -135 )
|
||||
{
|
||||
return "front";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damageyaw > 45 && damageyaw <= 135 )
|
||||
{
|
||||
return "right";
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( damageyaw > -45 && damageyaw <= 45 )
|
||||
{
|
||||
return "back";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "left";
|
||||
}
|
||||
}
|
||||
}
|
||||
return "front";
|
||||
}
|
||||
|
||||
setfootstepeffect( name, fx )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( name ), "Need to define the footstep surface type." );
|
||||
#/
|
||||
/#
|
||||
assert( isDefined( fx ), "Need to define the mud footstep effect." );
|
||||
#/
|
||||
if ( !isDefined( anim.optionalstepeffects ) )
|
||||
{
|
||||
anim.optionalstepeffects = [];
|
||||
}
|
||||
anim.optionalstepeffects[ anim.optionalstepeffects.size ] = name;
|
||||
level._effect[ "step_" + name ] = fx;
|
||||
}
|
71
patch_zm/maps/mp/animscripts/zm_combat.gsc
Normal file
71
patch_zm/maps/mp/animscripts/zm_combat.gsc
Normal file
@ -0,0 +1,71 @@
|
||||
#include maps/mp/animscripts/zm_melee;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "melee" );
|
||||
maps/mp/animscripts/zm_utility::initialize( "zombie_combat" );
|
||||
self animmode( "zonly_physics", 0 );
|
||||
if ( isDefined( self.combat_animmode ) )
|
||||
{
|
||||
self [[ self.combat_animmode ]]();
|
||||
}
|
||||
self orientmode( "face angle", self.angles[ 1 ] );
|
||||
for ( ;; )
|
||||
{
|
||||
if ( trymelee() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
exposedwait();
|
||||
}
|
||||
}
|
||||
|
||||
exposedwait()
|
||||
{
|
||||
if ( !isDefined( self.can_always_see ) || !isDefined( self.enemy ) && !self cansee( self.enemy ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait ( 0,2 + randomfloat( 0,1 ) );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
self endon( "enemy" );
|
||||
wait ( 0,2 + randomfloat( 0,1 ) );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trymelee()
|
||||
{
|
||||
if ( isDefined( self.cant_melee ) && self.cant_melee )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distancesquared( self.origin, self.enemy.origin ) > 262144 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
canmelee = maps/mp/animscripts/zm_melee::canmeleedesperate();
|
||||
if ( !canmelee )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self thread maps/mp/animscripts/zm_melee::meleecombat();
|
||||
return 1;
|
||||
}
|
439
patch_zm/maps/mp/animscripts/zm_death.gsc
Normal file
439
patch_zm/maps/mp/animscripts/zm_death.gsc
Normal file
@ -0,0 +1,439 @@
|
||||
#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 );
|
||||
}
|
||||
}
|
||||
}
|
510
patch_zm/maps/mp/animscripts/zm_dog_combat.gsc
Normal file
510
patch_zm/maps/mp/animscripts/zm_dog_combat.gsc
Normal file
@ -0,0 +1,510 @@
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_combat::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
/#
|
||||
if ( !debug_allow_combat() )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
/#
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
combatidle();
|
||||
return;
|
||||
}
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self meleebiteattackplayer( self.enemy );
|
||||
}
|
||||
}
|
||||
|
||||
combatidle()
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "zonly_physics" );
|
||||
idleanim = "zm_combat_attackidle";
|
||||
debug_anim_print( "dog_combat::combatIdle() - Setting " + idleanim );
|
||||
self setanimstatefromasd( idleanim );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "attack_combat" );
|
||||
debug_anim_print( "dog_combat::combatIdle() - " + idleanim + " notify done." );
|
||||
}
|
||||
|
||||
shouldwaitincombatidle()
|
||||
{
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
/#
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
assert( isalive( self.enemy ) );
|
||||
}
|
||||
#/
|
||||
if ( isDefined( self.enemy.dogattackallowtime ) )
|
||||
{
|
||||
return getTime() < self.enemy.dogattackallowtime;
|
||||
}
|
||||
}
|
||||
|
||||
setnextdogattackallowtime( time )
|
||||
{
|
||||
self.dogattackallowtime = getTime() + time;
|
||||
}
|
||||
|
||||
meleebiteattackplayer( player )
|
||||
{
|
||||
self animmode( "gravity", 0 );
|
||||
self.safetochangescript = 0;
|
||||
prepareattackplayer( player );
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none", 0 );
|
||||
}
|
||||
|
||||
meleebiteattackplayer2( player )
|
||||
{
|
||||
attackrangebuffer = 30;
|
||||
for ( ;; )
|
||||
{
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else meleerange = self.meleeattackdist + attackrangebuffer;
|
||||
if ( isDefined( player.syncedmeleetarget ) && player.syncedmeleetarget != self )
|
||||
{
|
||||
if ( checkendcombat( meleerange ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else combatidle();
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self shouldwaitincombatidle() )
|
||||
{
|
||||
combatidle();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
self animmode( "gravity" );
|
||||
self.safetochangescript = 0;
|
||||
/#
|
||||
if ( getDvarInt( "debug_dog_sound" ) )
|
||||
{
|
||||
iprintln( "dog " + self getentnum() + " attack player " + getTime() );
|
||||
#/
|
||||
}
|
||||
player setnextdogattackallowtime( 200 );
|
||||
if ( dog_cant_kill_in_one_hit( player ) )
|
||||
{
|
||||
level.lastdogmeleeplayertime = getTime();
|
||||
level.dogmeleeplayercounter++;
|
||||
if ( use_low_attack() )
|
||||
{
|
||||
self animmode( "angle deltas" );
|
||||
self setanimstatefromasd( "zm_combat_attack_player_close_range" );
|
||||
domeleeafterwait( 0,1 );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 1,4, "attack_combat" );
|
||||
self animmode( "gravity" );
|
||||
}
|
||||
else
|
||||
{
|
||||
attack_time = 1,2 + randomfloat( 0,4 );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_run_attack" );
|
||||
self setanimstatefromasd( "zm_combat_attackidle" );
|
||||
domeleeafterwait( 0,1 );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( attack_time, "attack_combat", ::handlemeleebiteattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_run notify done." );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread dog_melee_death( player );
|
||||
player.attacked_by_dog = 1;
|
||||
self thread clear_player_attacked_by_dog_on_death( player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - Setting combat_attack_player" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
self maps/mp/animscripts/shared::donotetracks( "done", ::handlemeleefinishattacknotetracks, player );
|
||||
debug_anim_print( "dog_combat::meleeBiteAttackPlayer() - combat_attack_player notify done." );
|
||||
self notify( "dog_no_longer_melee_able" );
|
||||
self setcandamage( 1 );
|
||||
self unlink();
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
if ( checkendcombat( meleerange ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
self.safetochangescript = 1;
|
||||
self animmode( "none" );
|
||||
}
|
||||
|
||||
domeleeafterwait( time )
|
||||
{
|
||||
self endon( "death" );
|
||||
wait time;
|
||||
hitent = self melee();
|
||||
if ( isDefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
{
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks2( note, player )
|
||||
{
|
||||
if ( note == "dog_melee" )
|
||||
{
|
||||
self melee( anglesToForward( self.angles ) );
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleebiteattacknotetracks( note, player )
|
||||
{
|
||||
switch( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isDefined( level.dogmeleebiteattacktime ) )
|
||||
{
|
||||
level.dogmeleebiteattacktime = getTime() - level.dogmeleebiteattacktimestart;
|
||||
level.dogmeleebiteattacktime += 50;
|
||||
}
|
||||
hitent = self melee( anglesToForward( self.angles ) );
|
||||
if ( isDefined( hitent ) )
|
||||
{
|
||||
if ( isplayer( hitent ) )
|
||||
{
|
||||
hitent shellshock( "dog_bite", 1 );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.dog_melee_miss ) )
|
||||
{
|
||||
self [[ level.dog_melee_miss ]]( player );
|
||||
}
|
||||
}
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
if ( !isDefined( level.dogmeleebiteattacktime ) )
|
||||
{
|
||||
level.dogmeleebiteattacktimestart = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
melee_time = level.dogmeleebiteattacktime;
|
||||
}
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
handlemeleefinishattacknotetracks( note, player )
|
||||
{
|
||||
switch( note )
|
||||
{
|
||||
case "dog_melee":
|
||||
if ( !isDefined( level.dogmeleefinishattacktime ) )
|
||||
{
|
||||
level.dogmeleefinishattacktime = getTime() - level.dogmeleefinishattacktimestart;
|
||||
level.dogmeleefinishattacktime += 50;
|
||||
}
|
||||
hitent = self melee( anglesToForward( self.angles ) );
|
||||
if ( isDefined( hitent ) && isalive( player ) )
|
||||
{
|
||||
if ( hitent == player )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else attackmiss();
|
||||
return 1;
|
||||
case "dog_early":
|
||||
self notify( "dog_early_notetrack" );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_early" );
|
||||
self setanimstate( "combat_attack_player_early" );
|
||||
break;
|
||||
case "dog_lunge":
|
||||
thread set_melee_timer( player );
|
||||
debug_anim_print( "dog_combat::handleMeleeFinishAttackNoteTracks() - Setting combat_attack_player_lunge" );
|
||||
self setanimstate( "combat_attack_player_lunge" );
|
||||
break;
|
||||
case "dogbite_damage":
|
||||
self thread killplayer( player );
|
||||
break;
|
||||
case "stop_tracking":
|
||||
melee_time = 200;
|
||||
if ( !isDefined( level.dogmeleefinishattacktime ) )
|
||||
{
|
||||
level.dogmeleefinishattacktimestart = getTime();
|
||||
}
|
||||
else
|
||||
{
|
||||
melee_time = level.dogmeleefinishattacktime;
|
||||
}
|
||||
self thread orienttoplayerdeadreckoning( player, melee_time );
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
orienttoplayerdeadreckoning( player, time_till_bite )
|
||||
{
|
||||
enemy_attack_current_origin = player.origin;
|
||||
enemy_attack_current_time = getTime();
|
||||
enemy_motion_time_delta = enemy_attack_current_time - self.enemy_attack_start_time;
|
||||
enemy_motion_direction = enemy_attack_current_origin - self.enemy_attack_start_origin;
|
||||
if ( enemy_motion_time_delta == 0 )
|
||||
{
|
||||
enemy_predicted_position = player.origin;
|
||||
}
|
||||
else
|
||||
{
|
||||
enemy_velocity = enemy_motion_direction / enemy_motion_time_delta;
|
||||
enemy_predicted_position = player.origin + ( enemy_velocity * time_till_bite );
|
||||
}
|
||||
self set_orient_mode( "face point", enemy_predicted_position );
|
||||
}
|
||||
|
||||
checkendcombat( meleerange )
|
||||
{
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
disttotargetsq = distancesquared( self.origin, self.enemy.origin );
|
||||
return disttotargetsq > ( meleerange * meleerange );
|
||||
}
|
||||
|
||||
use_low_attack( player )
|
||||
{
|
||||
height_diff = self.enemy_attack_start_origin[ 2 ] - self.origin[ 2 ];
|
||||
low_enough = 30;
|
||||
if ( height_diff < low_enough && self.enemy_attack_start_stance == "prone" )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
melee_origin = ( self.origin[ 0 ], self.origin[ 1 ], self.origin[ 2 ] + 65 );
|
||||
enemy_origin = ( self.enemy.origin[ 0 ], self.enemy.origin[ 1 ], self.enemy.origin[ 2 ] + 32 );
|
||||
if ( !bullettracepassed( melee_origin, enemy_origin, 0, self ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
prepareattackplayer( player )
|
||||
{
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_DO_NOTHING";
|
||||
distancetotarget = distance( self.origin, self.enemy.origin );
|
||||
targetheight = abs( self.enemy.origin[ 2 ] - self.origin[ 2 ] );
|
||||
self.enemy_attack_start_distance = distancetotarget;
|
||||
self.enemy_attack_start_origin = player.origin;
|
||||
self.enemy_attack_start_time = getTime();
|
||||
self.enemy_attack_start_stance = player getstance();
|
||||
}
|
||||
|
||||
attackteleportthread( offset )
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
reps = 5;
|
||||
increment = ( offset[ 0 ] / reps, offset[ 1 ] / reps, offset[ 2 ] / reps );
|
||||
i = 0;
|
||||
while ( i < reps )
|
||||
{
|
||||
self teleport( self.origin + increment );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
player_attacked()
|
||||
{
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
return self meleebuttonpressed();
|
||||
}
|
||||
}
|
||||
|
||||
set_melee_timer( player )
|
||||
{
|
||||
wait 0,15;
|
||||
self.melee_able_timer = getTime();
|
||||
}
|
||||
|
||||
clear_player_attacked_by_dog_on_death( player )
|
||||
{
|
||||
self waittill( "death" );
|
||||
player.attacked_by_dog = undefined;
|
||||
}
|
||||
|
||||
dog_cant_kill_in_one_hit( player )
|
||||
{
|
||||
return 1;
|
||||
if ( isDefined( player.dogs_dont_instant_kill ) )
|
||||
{
|
||||
/#
|
||||
assert( player.dogs_dont_instant_kill, "Dont set player.dogs_dont_instant_kill to false, set to undefined" );
|
||||
#/
|
||||
return 1;
|
||||
}
|
||||
if ( ( getTime() - level.lastdogmeleeplayertime ) > 8000 )
|
||||
{
|
||||
level.dogmeleeplayercounter = 0;
|
||||
}
|
||||
if ( level.dogmeleeplayercounter < level.dog_hits_before_kill )
|
||||
{
|
||||
return player.health > 25;
|
||||
}
|
||||
}
|
||||
|
||||
dog_melee_death( player )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "dog_no_longer_melee_able" );
|
||||
pressed = 0;
|
||||
press_time = anim.dog_presstime;
|
||||
self waittill( "dog_early_notetrack" );
|
||||
while ( player player_attacked() )
|
||||
{
|
||||
wait 0,05;
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
if ( !pressed )
|
||||
{
|
||||
if ( player player_attacked() )
|
||||
{
|
||||
pressed = 1;
|
||||
if ( isDefined( self.melee_able_timer ) && isalive( player ) )
|
||||
{
|
||||
if ( ( getTime() - self.melee_able_timer ) <= press_time )
|
||||
{
|
||||
player.player_view.custom_dog_save = "neck_snap";
|
||||
self notify( "melee_stop" );
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_player_neck_snap" );
|
||||
self waittillmatch( "done" );
|
||||
return "dog_death";
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - combat_player_neck_snap notify done." );
|
||||
self playsound( "aml_dog_neckbreak" );
|
||||
self setcandamage( 1 );
|
||||
self.a.nodeath = 1;
|
||||
dif = player.origin - self.origin;
|
||||
dif = ( dif[ 0 ], dif[ 1 ], 0 );
|
||||
self dodamage( self.health + 503, self geteye() - dif, player );
|
||||
self notify( "killanimscript" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_snap" );
|
||||
self setanimstate( "combat_attack_player" );
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_LATE";
|
||||
}
|
||||
return;
|
||||
}
|
||||
level.dog_death_quote = &"SCRIPT_PLATFORM_DOG_DEATH_TOO_SOON";
|
||||
debug_anim_print( "dog_combat::dog_melee_death() - Setting combat_player_neck_miss" );
|
||||
self setanimstate( "combat_player_neck_miss" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( !player player_attacked() )
|
||||
{
|
||||
pressed = 0;
|
||||
}
|
||||
}
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
attackmiss()
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
forward = anglesToForward( self.angles );
|
||||
dirtoenemy = self.enemy.origin - ( self.origin + vectorScale( forward, 50 ) );
|
||||
if ( vectordot( dirtoenemy, forward ) > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
}
|
||||
else self.skipstartmove = 1;
|
||||
self thread attackmisstracktargetthread();
|
||||
if ( ( ( dirtoenemy[ 0 ] * forward[ 1 ] ) - ( dirtoenemy[ 1 ] * forward[ 0 ] ) ) > 0 )
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_right" );
|
||||
self setanimstate( "combat_attack_miss_right" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss_left" );
|
||||
self setanimstate( "combat_attack_miss_left" );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_combat::attackMiss() - Setting combat_attack_miss" );
|
||||
self setanimstate( "combat_attack_miss" );
|
||||
}
|
||||
self maps/mp/animscripts/shared::donotetracks( "done" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - attackMiss notify done." );
|
||||
self notify( "stop tracking" );
|
||||
debug_anim_print( "dog_combat::attackMiss() - Stopped tracking" );
|
||||
}
|
||||
|
||||
attackmisstracktargetthread()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
wait 0,6;
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
|
||||
killplayer( player )
|
||||
{
|
||||
self endon( "pvd_melee_interrupted" );
|
||||
player.specialdeath = 1;
|
||||
player setcandamage( 1 );
|
||||
wait 1;
|
||||
damage = player.health + 1;
|
||||
if ( !isalive( player ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
30
patch_zm/maps/mp/animscripts/zm_dog_death.gsc
Normal file
30
patch_zm/maps/mp/animscripts/zm_dog_death.gsc
Normal file
@ -0,0 +1,30 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_death::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self endon( "killanimscript" );
|
||||
if ( isDefined( self.a.nodeath ) )
|
||||
{
|
||||
/#
|
||||
assert( self.a.nodeath, "Nodeath needs to be set to true or undefined." );
|
||||
#/
|
||||
wait 3;
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
if ( isDefined( self.enemy ) && isDefined( self.enemy.syncedmeleetarget ) && self.enemy.syncedmeleetarget == self )
|
||||
{
|
||||
self.enemy.syncedmeleetarget = undefined;
|
||||
}
|
||||
death_anim = "death_" + getanimdirection( self.damageyaw );
|
||||
/#
|
||||
println( death_anim );
|
||||
#/
|
||||
self animmode( "gravity" );
|
||||
debug_anim_print( "dog_death::main() - Setting " + death_anim );
|
||||
self setanimstatefromasd( death_anim );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "dead_dog" );
|
||||
}
|
6
patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc
Normal file
6
patch_zm/maps/mp/animscripts/zm_dog_flashed.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_flashbang_effect" );
|
||||
}
|
61
patch_zm/maps/mp/animscripts/zm_dog_init.gsc
Normal file
61
patch_zm/maps/mp/animscripts/zm_dog_init.gsc
Normal file
@ -0,0 +1,61 @@
|
||||
#include maps/mp/animscripts/dog_move;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
level.dog_debug_orient = 0;
|
||||
level.dog_debug_anims = 0;
|
||||
level.dog_debug_anims_ent = 0;
|
||||
level.dog_debug_turns = 0;
|
||||
debug_anim_print( "dog_init::main() " );
|
||||
maps/mp/animscripts/dog_move::setup_sound_variables();
|
||||
anim_get_dvar_int( "debug_dog_sound", "0" );
|
||||
anim_get_dvar_int( "debug_dog_notetracks", "0" );
|
||||
self.ignoresuppression = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.nododgemove = 1;
|
||||
level.dogattackplayerdist = 102;
|
||||
level.dogattackplayercloserangedist = 102;
|
||||
level.dogrunturnspeed = 20;
|
||||
level.dogrunpainspeed = 20;
|
||||
self.meleeattackdist = 0;
|
||||
self thread setmeleeattackdist();
|
||||
self.a = spawnstruct();
|
||||
self.a.pose = "stand";
|
||||
self.a.nextstandinghitdying = 0;
|
||||
self.a.movement = "walk";
|
||||
self.suppressionthreshold = 1;
|
||||
self.disablearrivals = 0;
|
||||
level.dogstoppingdistsq = 3416,82;
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
self.pathenemyfightdist = 512;
|
||||
self settalktospecies( "zombiedog" );
|
||||
level.lastdogmeleeplayertime = 0;
|
||||
level.dogmeleeplayercounter = 0;
|
||||
if ( !isDefined( level.dog_hits_before_kill ) )
|
||||
{
|
||||
level.dog_hits_before_kill = 1;
|
||||
}
|
||||
}
|
||||
|
||||
setmeleeattackdist()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
if ( isplayer( self.enemy ) )
|
||||
{
|
||||
self.meleeattackdist = 64;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.meleeattackdist = 102;
|
||||
}
|
||||
}
|
||||
wait 1;
|
||||
}
|
||||
}
|
14
patch_zm/maps/mp/animscripts/zm_dog_jump.gsc
Normal file
14
patch_zm/maps/mp/animscripts/zm_dog_jump.gsc
Normal file
@ -0,0 +1,14 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_jump::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
self setanimstatefromasd( "zm_traverse_wallhop" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "traverse_wallhop" );
|
||||
self.safetochangescript = 1;
|
||||
}
|
259
patch_zm/maps/mp/animscripts/zm_dog_move.gsc
Normal file
259
patch_zm/maps/mp/animscripts/zm_dog_move.gsc
Normal file
@ -0,0 +1,259 @@
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/dog_stop;
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
setup_sound_variables()
|
||||
{
|
||||
level.dog_sounds[ "far" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ] = spawnstruct();
|
||||
level.dog_sounds[ "close" ].minrange = 0;
|
||||
level.dog_sounds[ "close" ].maxrange = 500;
|
||||
level.dog_sounds[ "close" ].sound = "aml_dog_bark_close";
|
||||
level.dog_sounds[ "close" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "close" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "close" ].minrangesqr = level.dog_sounds[ "close" ].minrange * level.dog_sounds[ "close" ].minrange;
|
||||
level.dog_sounds[ "close" ].maxrangesqr = level.dog_sounds[ "close" ].maxrange * level.dog_sounds[ "close" ].maxrange;
|
||||
level.dog_sounds[ "far" ].minrange = 500;
|
||||
level.dog_sounds[ "far" ].maxrange = 0;
|
||||
level.dog_sounds[ "far" ].sound = "aml_dog_bark";
|
||||
level.dog_sounds[ "far" ].soundlengthplaceholder = 0,2;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmin = 0,1;
|
||||
level.dog_sounds[ "far" ].aftersoundwaitmax = 0,3;
|
||||
level.dog_sounds[ "far" ].minrangesqr = level.dog_sounds[ "far" ].minrange * level.dog_sounds[ "far" ].minrange;
|
||||
level.dog_sounds[ "far" ].maxrangesqr = level.dog_sounds[ "far" ].maxrange * level.dog_sounds[ "far" ].maxrange;
|
||||
}
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_move::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
if ( !isDefined( self.traversecomplete ) && !isDefined( self.skipstartmove ) && self.a.movement == "run" && do_movement )
|
||||
{
|
||||
self startmove();
|
||||
blendtime = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
blendtime = 0,2;
|
||||
}
|
||||
self.traversecomplete = undefined;
|
||||
self.skipstartmove = undefined;
|
||||
if ( do_movement )
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" );
|
||||
debug_anim_print( "dog_move::main() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::main() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
}
|
||||
self thread maps/mp/animscripts/dog_stop::lookattarget( "normal" );
|
||||
while ( 1 )
|
||||
{
|
||||
self moveloop();
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
if ( self.disablearrivals == 0 )
|
||||
{
|
||||
self thread stopmove();
|
||||
}
|
||||
self waittill( "run" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
moveloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
while ( 1 )
|
||||
{
|
||||
do_movement = 1;
|
||||
/#
|
||||
if ( !debug_allow_movement() )
|
||||
{
|
||||
do_movement = 0;
|
||||
#/
|
||||
}
|
||||
if ( isDefined( level.hostmigrationtimer ) )
|
||||
{
|
||||
do_movement = 0;
|
||||
}
|
||||
while ( !do_movement )
|
||||
{
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "stop_idle" );
|
||||
}
|
||||
if ( self.disablearrivals )
|
||||
{
|
||||
self.stopanimdistsq = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.stopanimdistsq = level.dogstoppingdistsq;
|
||||
}
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "move_run" );
|
||||
debug_anim_print( "dog_move::moveLoop() - move_run wait 0.2 done " );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/#
|
||||
assert( self.a.movement == "walk" );
|
||||
#/
|
||||
debug_anim_print( "dog_move::moveLoop() - Setting move_walk " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_walk" );
|
||||
if ( self need_to_run() )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
self notify( "dog_running" );
|
||||
}
|
||||
debug_anim_print( "dog_move::moveLoop() - move_walk wait 0.2 done " );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
startmovetracklookahead()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
i = 0;
|
||||
while ( i < 2 )
|
||||
{
|
||||
lookaheadangle = vectorToAngle( self.lookaheaddir );
|
||||
self set_orient_mode( "face angle", lookaheadangle );
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
startmove()
|
||||
{
|
||||
debug_anim_print( "dog_move::startMove() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_start" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_start" );
|
||||
debug_anim_print( "dog_move::startMove() - move_start notify done." );
|
||||
self animmode( "none" );
|
||||
self set_orient_mode( "face motion" );
|
||||
}
|
||||
|
||||
stopmove()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "run" );
|
||||
debug_anim_print( "dog_move::stopMove() - Setting move_stop" );
|
||||
self setanimstatefromasd( "zm_move_stop" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_stop" );
|
||||
debug_anim_print( "dog_move::stopMove() - move_stop notify done." );
|
||||
}
|
||||
|
||||
getenemydistancesqr()
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin );
|
||||
}
|
||||
return 100000000;
|
||||
}
|
||||
|
||||
getsoundkey( distancesqr )
|
||||
{
|
||||
keys = getarraykeys( level.dog_sounds );
|
||||
i = 0;
|
||||
while ( i < keys.size )
|
||||
{
|
||||
sound_set = level.dog_sounds[ keys[ i ] ];
|
||||
if ( sound_set.minrangesqr > distancesqr )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else if ( sound_set.maxrangesqr && sound_set.maxrangesqr < distancesqr )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return keys[ i ];
|
||||
}
|
||||
i++;
|
||||
}
|
||||
return keys[ keys.size - 1 ];
|
||||
}
|
||||
|
||||
need_to_run()
|
||||
{
|
||||
run_dist_squared = 147456;
|
||||
if ( getDvar( "scr_dog_run_distance" ) != "" )
|
||||
{
|
||||
dist = getDvarInt( "scr_dog_run_distance" );
|
||||
run_dist_squared = dist * dist;
|
||||
}
|
||||
run_yaw = 20;
|
||||
run_pitch = 30;
|
||||
run_height = 64;
|
||||
if ( self.a.movement != "walk" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.health < self.maxhealth )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) || !isalive( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !self cansee( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
dist = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( dist > run_dist_squared )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
height = self.origin[ 2 ] - self.enemy.origin[ 2 ];
|
||||
if ( abs( height ) > run_height )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = self maps/mp/animscripts/zm_utility::absyawtoenemy();
|
||||
if ( yaw > run_yaw )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
pitch = angleClamp180( vectorToAngle( self.origin - self.enemy.origin )[ 0 ] );
|
||||
if ( abs( pitch ) > run_pitch )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
8
patch_zm/maps/mp/animscripts/zm_dog_pain.gsc
Normal file
8
patch_zm/maps/mp/animscripts/zm_dog_pain.gsc
Normal file
@ -0,0 +1,8 @@
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_pain::main() " );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
}
|
148
patch_zm/maps/mp/animscripts/zm_dog_stop.gsc
Normal file
148
patch_zm/maps/mp/animscripts/zm_dog_stop.gsc
Normal file
@ -0,0 +1,148 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
debug_anim_print( "dog_stop::main()" );
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
while ( 1 )
|
||||
{
|
||||
if ( shouldattackidle() )
|
||||
{
|
||||
self randomattackidle();
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "attack_idle", ::dogidlenotetracks );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_idle" );
|
||||
self notify( "stop tracking" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromasd( "zm_stop_idle" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,2, "stop_idle", ::dogidlenotetracks );
|
||||
self thread lookattarget( "attackIdle" );
|
||||
}
|
||||
debug_anim_print( "dog_stop::main() - stop idle loop notify done." );
|
||||
}
|
||||
}
|
||||
|
||||
dogidlenotetracks( note )
|
||||
{
|
||||
if ( note == "breathe_fire" )
|
||||
{
|
||||
if ( isDefined( level._effect[ "dog_breath" ] ) )
|
||||
{
|
||||
self.breath_fx = spawn( "script_model", self gettagorigin( "TAG_MOUTH_FX" ) );
|
||||
self.breath_fx.angles = self gettagangles( "TAG_MOUTH_FX" );
|
||||
self.breath_fx setmodel( "tag_origin" );
|
||||
self.breath_fx linkto( self, "TAG_MOUTH_FX" );
|
||||
playfxontag( level._effect[ "dog_breath" ], self.breath_fx, "tag_origin" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
isfacingenemy( tolerancecosangle )
|
||||
{
|
||||
/#
|
||||
assert( isDefined( self.enemy ) );
|
||||
#/
|
||||
vectoenemy = self.enemy.origin - self.origin;
|
||||
disttoenemy = length( vectoenemy );
|
||||
if ( disttoenemy < 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
forward = anglesToForward( self.angles );
|
||||
val1 = ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] );
|
||||
val2 = ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy;
|
||||
return ( ( ( forward[ 0 ] * vectoenemy[ 0 ] ) + ( forward[ 1 ] * vectoenemy[ 1 ] ) ) / disttoenemy ) > tolerancecosangle;
|
||||
}
|
||||
|
||||
randomattackidle()
|
||||
{
|
||||
if ( isfacingenemy( -0,5 ) )
|
||||
{
|
||||
self set_orient_mode( "face current" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self set_orient_mode( "face enemy" );
|
||||
}
|
||||
if ( should_growl() )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
return;
|
||||
}
|
||||
idlechance = 33;
|
||||
barkchance = 66;
|
||||
if ( isDefined( self.mode ) )
|
||||
{
|
||||
if ( self.mode == "growl" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 30;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( self.mode == "bark" )
|
||||
{
|
||||
idlechance = 15;
|
||||
barkchance = 85;
|
||||
}
|
||||
}
|
||||
}
|
||||
rand = randomint( 100 );
|
||||
if ( rand < idlechance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle" );
|
||||
self setanimstatefromasd( "zm_stop_attackidle" );
|
||||
}
|
||||
else if ( rand < barkchance )
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_bark " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_bark" );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_stop::main() - Setting stop_attackidle_growl " );
|
||||
self setanimstatefromasd( "zm_stop_attackidle_growl" );
|
||||
}
|
||||
}
|
||||
|
||||
shouldattackidle()
|
||||
{
|
||||
if ( isDefined( self.enemy ) && isalive( self.enemy ) )
|
||||
{
|
||||
return distancesquared( self.origin, self.enemy.origin ) < 1000000;
|
||||
}
|
||||
}
|
||||
|
||||
should_growl()
|
||||
{
|
||||
if ( isDefined( self.script_growl ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
return !self cansee( self.enemy );
|
||||
}
|
||||
|
||||
lookattarget( lookposeset )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop tracking" );
|
||||
debug_anim_print( "dog_stop::lookAtTarget() - Starting look at " + lookposeset );
|
||||
self.rightaimlimit = 90;
|
||||
self.leftaimlimit = -90;
|
||||
self.upaimlimit = 45;
|
||||
self.downaimlimit = -45;
|
||||
self maps/mp/animscripts/shared::setanimaimweight( 1, 0,2 );
|
||||
self maps/mp/animscripts/shared::trackloop();
|
||||
}
|
136
patch_zm/maps/mp/animscripts/zm_dog_turn.gsc
Normal file
136
patch_zm/maps/mp/animscripts/zm_dog_turn.gsc
Normal file
@ -0,0 +1,136 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
debug_anim_print( "dog_turn::main()" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
self.safetochangescript = 0;
|
||||
deltayaw = self getdeltaturnyaw();
|
||||
if ( need_to_turn_around( deltayaw ) )
|
||||
{
|
||||
turn_180( deltayaw );
|
||||
}
|
||||
else
|
||||
{
|
||||
turn_90( deltayaw );
|
||||
}
|
||||
move_out_of_turn();
|
||||
self.skipstartmove = 1;
|
||||
self.safetochangescript = 1;
|
||||
}
|
||||
|
||||
need_to_turn_around( deltayaw )
|
||||
{
|
||||
angle = getDvarFloat( "dog_turn180_angle" );
|
||||
if ( deltayaw > angle || deltayaw < ( -1 * angle ) )
|
||||
{
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " YES" );
|
||||
return 1;
|
||||
}
|
||||
debug_turn_print( "need_to_turn_around: " + deltayaw + " NO" );
|
||||
return 0;
|
||||
}
|
||||
|
||||
do_turn_anim( stopped_anim, run_anim, wait_time, run_wait_time )
|
||||
{
|
||||
speed = length( self getvelocity() );
|
||||
do_anim = stopped_anim;
|
||||
if ( level.dogrunturnspeed < speed )
|
||||
{
|
||||
do_anim = run_anim;
|
||||
wait_time = run_wait_time;
|
||||
}
|
||||
debug_anim_print( "dog_move::do_turn_anim() - Setting " + do_anim );
|
||||
self setanimstatefromasd( do_anim );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( run_wait_time, "move_turn" );
|
||||
debug_anim_print( "dog_move::turn_around_right() - done with " + do_anim + " wait time " + run_wait_time );
|
||||
}
|
||||
|
||||
turn_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_left", "move_run_turn_left", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_right", "move_run_turn_right", 0,5, 0,5 );
|
||||
}
|
||||
|
||||
turn_180_left()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_left", "move_run_turn_around_left", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
turn_180_right()
|
||||
{
|
||||
self do_turn_anim( "move_turn_around_right", "move_run_turn_around_right", 0,5, 0,7 );
|
||||
}
|
||||
|
||||
move_out_of_turn()
|
||||
{
|
||||
if ( self.a.movement == "run" )
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_run" );
|
||||
self setanimstatefromasd( "zm_move_run" );
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,1, "move_run" );
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - move_run wait 0.1 done " );
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_anim_print( "dog_move::move_out_of_turn() - Setting move_start " );
|
||||
self setanimstatefromasd( "zm_move_walk" );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "move_walk" );
|
||||
}
|
||||
}
|
||||
|
||||
turn_90( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_90 deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > getDvarFloat( "dog_turn90_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_90 left", 1 );
|
||||
self turn_left();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_90 right", 1 );
|
||||
self turn_right();
|
||||
}
|
||||
}
|
||||
|
||||
turn_180( deltayaw )
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
debug_turn_print( "turn_180 deltaYaw: " + deltayaw );
|
||||
if ( deltayaw > 177 || deltayaw < -177 )
|
||||
{
|
||||
if ( randomint( 2 ) == 0 )
|
||||
{
|
||||
debug_turn_print( "turn_around random right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around random left", 1 );
|
||||
self turn_180_left();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( deltayaw > getDvarFloat( "dog_turn180_angle" ) )
|
||||
{
|
||||
debug_turn_print( "turn_around left", 1 );
|
||||
self turn_180_left();
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
debug_turn_print( "turn_around right", 1 );
|
||||
self turn_180_right();
|
||||
}
|
||||
}
|
||||
}
|
6
patch_zm/maps/mp/animscripts/zm_flashed.gsc
Normal file
6
patch_zm/maps/mp/animscripts/zm_flashed.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
158
patch_zm/maps/mp/animscripts/zm_init.gsc
Normal file
158
patch_zm/maps/mp/animscripts/zm_init.gsc
Normal file
@ -0,0 +1,158 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_init;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self.a = spawnstruct();
|
||||
self.team = level.zombie_team;
|
||||
firstinit();
|
||||
self.a.pose = "stand";
|
||||
self.a.movement = "stop";
|
||||
self.a.state = "stop";
|
||||
self.a.special = "none";
|
||||
self.a.combatendtime = getTime();
|
||||
self.a.script = "init";
|
||||
self.a.alertness = "casual";
|
||||
self.a.lastenemytime = getTime();
|
||||
self.a.forced_cover = "none";
|
||||
self.a.desired_script = "none";
|
||||
self.a.current_script = "none";
|
||||
self.a.lookangle = 0;
|
||||
self.a.paintime = 0;
|
||||
self.a.nextgrenadetrytime = 0;
|
||||
self.walk = 0;
|
||||
self.sprint = 0;
|
||||
self.a.runblendtime = 0,2;
|
||||
self.a.flamepaintime = 0;
|
||||
self.a.postscriptfunc = undefined;
|
||||
self.a.stance = "stand";
|
||||
self._animactive = 0;
|
||||
self thread deathnotify();
|
||||
self.baseaccuracy = self.accuracy;
|
||||
if ( !isDefined( self.script_accuracy ) )
|
||||
{
|
||||
self.script_accuracy = 1;
|
||||
}
|
||||
self.a.misstime = 0;
|
||||
self.a.yawtransition = "none";
|
||||
self.a.nodeath = 0;
|
||||
self.a.misstime = 0;
|
||||
self.a.misstimedebounce = 0;
|
||||
self.a.disablepain = 0;
|
||||
self.accuracystationarymod = 1;
|
||||
self.chatinitialized = 0;
|
||||
self.sightpostime = 0;
|
||||
self.sightposleft = 1;
|
||||
self.precombatrunenabled = 1;
|
||||
self.is_zombie = 1;
|
||||
self.a.crouchpain = 0;
|
||||
self.a.nextstandinghitdying = 0;
|
||||
if ( !isDefined( self.script_forcegrenade ) )
|
||||
{
|
||||
self.script_forcegrenade = 0;
|
||||
}
|
||||
/#
|
||||
self.a.lastdebugprint = "";
|
||||
#/
|
||||
self.lastenemysighttime = 0;
|
||||
self.combattime = 0;
|
||||
self.coveridleselecttime = -696969;
|
||||
self.old = spawnstruct();
|
||||
self.reacquire_state = 0;
|
||||
self.a.allow_shooting = 0;
|
||||
}
|
||||
|
||||
donothing()
|
||||
{
|
||||
}
|
||||
|
||||
empty( one, two, three, whatever )
|
||||
{
|
||||
}
|
||||
|
||||
clearenemy()
|
||||
{
|
||||
self notify( "stop waiting for enemy to die" );
|
||||
self endon( "stop waiting for enemy to die" );
|
||||
self.sightenemy waittill( "death" );
|
||||
self.sightpos = undefined;
|
||||
self.sighttime = 0;
|
||||
self.sightenemy = undefined;
|
||||
}
|
||||
|
||||
deathnotify()
|
||||
{
|
||||
self waittill( "death", other );
|
||||
self notify( anim.scriptchange );
|
||||
}
|
||||
|
||||
firstinit()
|
||||
{
|
||||
if ( isDefined( anim.notfirsttime ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
anim.notfirsttime = 1;
|
||||
anim.usefacialanims = 0;
|
||||
if ( !isDefined( anim.dog_health ) )
|
||||
{
|
||||
anim.dog_health = 1;
|
||||
}
|
||||
if ( !isDefined( anim.dog_presstime ) )
|
||||
{
|
||||
anim.dog_presstime = 350;
|
||||
}
|
||||
if ( !isDefined( anim.dog_hits_before_kill ) )
|
||||
{
|
||||
anim.dog_hits_before_kill = 1;
|
||||
}
|
||||
level.nextgrenadedrop = randomint( 3 );
|
||||
level.lastplayersighted = 100;
|
||||
anim.defaultexception = ::empty;
|
||||
setdvar( "scr_expDeathMayMoveCheck", "on" );
|
||||
anim.lastsidestepanim = 0;
|
||||
anim.meleerange = 64;
|
||||
anim.meleerangesq = anim.meleerange * anim.meleerange;
|
||||
anim.standrangesq = 262144;
|
||||
anim.chargerangesq = 40000;
|
||||
anim.chargelongrangesq = 262144;
|
||||
anim.aivsaimeleerangesq = 160000;
|
||||
anim.combatmemorytimeconst = 10000;
|
||||
anim.combatmemorytimerand = 6000;
|
||||
anim.scriptchange = "script_change";
|
||||
anim.lastgibtime = 0;
|
||||
anim.gibdelay = 3000;
|
||||
anim.mingibs = 2;
|
||||
anim.maxgibs = 4;
|
||||
anim.totalgibs = randomintrange( anim.mingibs, anim.maxgibs );
|
||||
anim.corner_straight_yaw_limit = 36;
|
||||
if ( !isDefined( anim.optionalstepeffectfunction ) )
|
||||
{
|
||||
anim.optionalstepeffects = [];
|
||||
anim.optionalstepeffectfunction = ::empty;
|
||||
}
|
||||
anim.notetracks = [];
|
||||
maps/mp/animscripts/zm_shared::registernotetracks();
|
||||
if ( !isDefined( level.flag ) )
|
||||
{
|
||||
level.flag = [];
|
||||
level.flags_lock = [];
|
||||
}
|
||||
level.painai = undefined;
|
||||
anim.maymovecheckenabled = 1;
|
||||
anim.badplaces = [];
|
||||
anim.badplaceint = 0;
|
||||
anim.covercrouchleanpitch = -55;
|
||||
anim.lastcarexplosiontime = -100000;
|
||||
}
|
||||
|
||||
onplayerconnect()
|
||||
{
|
||||
player = self;
|
||||
firstinit();
|
||||
player.invul = 0;
|
||||
}
|
6
patch_zm/maps/mp/animscripts/zm_jump.gsc
Normal file
6
patch_zm/maps/mp/animscripts/zm_jump.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
304
patch_zm/maps/mp/animscripts/zm_melee.gsc
Normal file
304
patch_zm/maps/mp/animscripts/zm_melee.gsc
Normal file
@ -0,0 +1,304 @@
|
||||
#include maps/mp/animscripts/zm_combat;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
meleecombat()
|
||||
{
|
||||
self endon( "end_melee" );
|
||||
self endon( "killanimscript" );
|
||||
/#
|
||||
assert( canmeleeanyrange() );
|
||||
#/
|
||||
self orientmode( "face enemy" );
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self animmode( "slide" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self animmode( "zonly_physics" );
|
||||
}
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( self.marked_for_death ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
angles = vectorToAngle( self.enemy.origin - self.origin );
|
||||
self orientmode( "face angle", angles[ 1 ] );
|
||||
}
|
||||
if ( isDefined( self.zmb_vocals_attack ) )
|
||||
{
|
||||
self playsound( self.zmb_vocals_attack );
|
||||
}
|
||||
if ( isDefined( self.nochangeduringmelee ) && self.nochangeduringmelee )
|
||||
{
|
||||
self.safetochangescript = 0;
|
||||
}
|
||||
if ( isDefined( self.is_inert ) && self.is_inert )
|
||||
{
|
||||
return;
|
||||
}
|
||||
set_zombie_melee_anim_state( self );
|
||||
if ( isDefined( self.melee_anim_func ) )
|
||||
{
|
||||
self thread [[ self.melee_anim_func ]]();
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self waittill( "melee_anim", note );
|
||||
if ( note == "end" )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( note == "fire" )
|
||||
{
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( isDefined( self.dont_die_on_me ) && self.dont_die_on_me )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.enemy notify( "melee_swipe" );
|
||||
oldhealth = self.enemy.health;
|
||||
self melee();
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
else if ( self.enemy.health >= oldhealth )
|
||||
{
|
||||
if ( isDefined( self.melee_miss_func ) )
|
||||
{
|
||||
self [[ self.melee_miss_func ]]();
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( isDefined( level.melee_miss_func ) )
|
||||
{
|
||||
self [[ level.melee_miss_func ]]();
|
||||
}
|
||||
}
|
||||
}
|
||||
/#
|
||||
if ( getDvarInt( #"7F11F572" ) )
|
||||
{
|
||||
if ( self.enemy.health < oldhealth )
|
||||
{
|
||||
zombie_eye = self geteye();
|
||||
player_eye = self.enemy geteye();
|
||||
trace = bullettrace( zombie_eye, player_eye, 1, self );
|
||||
hitpos = trace[ "position" ];
|
||||
dist = distance( zombie_eye, hitpos );
|
||||
iprintln( "melee HIT " + dist );
|
||||
#/
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( note == "stop" )
|
||||
{
|
||||
if ( !cancontinuetomelee() )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self orientmode( "face enemy" );
|
||||
}
|
||||
else self orientmode( "face default" );
|
||||
if ( isDefined( self.nochangeduringmelee ) || self.nochangeduringmelee && is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
if ( isDefined( self.enemy ) )
|
||||
{
|
||||
dist_sq = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( dist_sq > ( self.meleeattackdist * self.meleeattackdist ) )
|
||||
{
|
||||
self.safetochangescript = 1;
|
||||
wait 0,1;
|
||||
break;
|
||||
}
|
||||
else }
|
||||
else self.safetochangescript = 1;
|
||||
wait 0,1;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
}
|
||||
}
|
||||
if ( is_true( self.sliding_on_goo ) )
|
||||
{
|
||||
self animmode( "slide" );
|
||||
}
|
||||
else self animmode( "none" );
|
||||
self thread maps/mp/animscripts/zm_combat::main();
|
||||
}
|
||||
|
||||
cancontinuetomelee()
|
||||
{
|
||||
return canmeleeinternal( "already started" );
|
||||
}
|
||||
|
||||
canmeleeanyrange()
|
||||
{
|
||||
return canmeleeinternal( "any range" );
|
||||
}
|
||||
|
||||
canmeleedesperate()
|
||||
{
|
||||
return canmeleeinternal( "long range" );
|
||||
}
|
||||
|
||||
canmelee()
|
||||
{
|
||||
return canmeleeinternal( "normal" );
|
||||
}
|
||||
|
||||
canmeleeinternal( state )
|
||||
{
|
||||
if ( !issentient( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isalive( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.disablemelee ) )
|
||||
{
|
||||
/#
|
||||
assert( self.disablemelee );
|
||||
#/
|
||||
return 0;
|
||||
}
|
||||
yaw = abs( getyawtoenemy() );
|
||||
if ( yaw > 60 || state != "already started" && yaw > 110 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
enemypoint = self.enemy getorigin();
|
||||
vectoenemy = enemypoint - self.origin;
|
||||
self.enemydistancesq = lengthsquared( vectoenemy );
|
||||
if ( self.enemydistancesq <= anim.meleerangesq )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
if ( state != "any range" )
|
||||
{
|
||||
chargerangesq = anim.chargerangesq;
|
||||
if ( state == "long range" )
|
||||
{
|
||||
chargerangesq = anim.chargelongrangesq;
|
||||
}
|
||||
if ( self.enemydistancesq > chargerangesq )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( state == "already started" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.check_melee_path ) && self.check_melee_path )
|
||||
{
|
||||
if ( !ismeleepathclear( vectoenemy, enemypoint ) )
|
||||
{
|
||||
self notify( "melee_path_blocked" );
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
if ( isDefined( level.can_melee ) )
|
||||
{
|
||||
if ( !( self [[ level.can_melee ]]() ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
ismeleepathclear( vectoenemy, enemypoint )
|
||||
{
|
||||
dirtoenemy = vectornormalize( ( vectoenemy[ 0 ], vectoenemy[ 1 ], 0 ) );
|
||||
meleepoint = enemypoint - ( dirtoenemy[ 0 ] * 28, dirtoenemy[ 1 ] * 28, 0 );
|
||||
if ( !self isingoal( meleepoint ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self maymovetopoint( meleepoint ) )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
trace1 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 20 ), meleepoint + vectorScale( ( 0, 0, 1 ), 20 ), 1, self );
|
||||
trace2 = bullettrace( self.origin + vectorScale( ( 0, 0, 1 ), 72 ), meleepoint + vectorScale( ( 0, 0, 1 ), 72 ), 1, self );
|
||||
if ( isDefined( trace1[ "fraction" ] ) && trace1[ "fraction" ] == 1 && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( trace1[ "entity" ] ) && trace1[ "entity" ] == self.enemy && isDefined( trace2[ "entity" ] ) && trace2[ "entity" ] == self.enemy )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
if ( isDefined( level.zombie_melee_in_water ) && level.zombie_melee_in_water )
|
||||
{
|
||||
if ( isDefined( trace1[ "surfacetype" ] ) && trace1[ "surfacetype" ] == "water" && isDefined( trace2[ "fraction" ] ) && trace2[ "fraction" ] == 1 )
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
set_zombie_melee_anim_state( zombie )
|
||||
{
|
||||
if ( isDefined( level.melee_anim_state ) )
|
||||
{
|
||||
melee_anim_state = self [[ level.melee_anim_state ]]();
|
||||
}
|
||||
if ( !isDefined( melee_anim_state ) )
|
||||
{
|
||||
if ( !zombie.has_legs && zombie.a.gib_ref == "no_legs" )
|
||||
{
|
||||
melee_anim_state = "zm_stumpy_melee";
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
switch( zombie.zombie_move_speed )
|
||||
{
|
||||
case "walk":
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_walk_melee" );
|
||||
break;
|
||||
case "run":
|
||||
case "sprint":
|
||||
default:
|
||||
melee_anim_state = append_missing_legs_suffix( "zm_run_melee" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
zombie setanimstatefromasd( melee_anim_state );
|
||||
}
|
286
patch_zm/maps/mp/animscripts/zm_move.gsc
Normal file
286
patch_zm/maps/mp/animscripts/zm_move.gsc
Normal file
@ -0,0 +1,286 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_run;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self setaimanimweights( 0, 0 );
|
||||
previousscript = self.a.script;
|
||||
maps/mp/animscripts/zm_utility::initialize( "zombie_move" );
|
||||
movemainloop();
|
||||
}
|
||||
|
||||
movemainloop()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
self endon( "stop_soon" );
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
self sidestepinit();
|
||||
self thread trysidestepthread();
|
||||
for ( ;; )
|
||||
{
|
||||
self maps/mp/animscripts/zm_run::moverun();
|
||||
if ( isDefined( self.zombie_can_sidestep ) && self.zombie_can_sidestep )
|
||||
{
|
||||
self trysidestep();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sidestepinit()
|
||||
{
|
||||
self.a.steppeddir = 0;
|
||||
self.a.lastsidesteptime = getTime();
|
||||
}
|
||||
|
||||
trysidestepthread()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "new_trySideStepThread" );
|
||||
self endon( "new_trySideStepThread" );
|
||||
if ( !isDefined( self.zombie_can_sidestep ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( isDefined( self.zombie_can_sidestep ) && !self.zombie_can_sidestep )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
while ( 1 )
|
||||
{
|
||||
self trysidestep();
|
||||
wait 0,05;
|
||||
}
|
||||
}
|
||||
|
||||
trysidestep()
|
||||
{
|
||||
if ( isDefined( self.shouldsidestepfunc ) )
|
||||
{
|
||||
self.sidesteptype = self [[ self.shouldsidestepfunc ]]();
|
||||
}
|
||||
else
|
||||
{
|
||||
self.sidesteptype = shouldsidestep();
|
||||
}
|
||||
if ( self.sidesteptype == "none" )
|
||||
{
|
||||
if ( isDefined( self.zombie_can_forwardstep ) && self.zombie_can_forwardstep )
|
||||
{
|
||||
self.sidesteptype = shouldforwardstep();
|
||||
}
|
||||
}
|
||||
if ( self.sidesteptype == "none" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.desiredstepdir = getdesiredsidestepdir( self.sidesteptype );
|
||||
self.asd_name = "zm_" + self.sidesteptype + "_" + self.desiredstepdir;
|
||||
self.substate_index = self getanimsubstatefromasd( self.asd_name );
|
||||
self.stepanim = self getanimfromasd( self.asd_name, self.substate_index );
|
||||
if ( !self checkroomforanim( self.stepanim ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
self.allowpain = 0;
|
||||
self animcustom( ::dosidestep );
|
||||
self waittill( "sidestep_done" );
|
||||
self.allowpain = 1;
|
||||
}
|
||||
|
||||
getdesiredsidestepdir( sidesteptype )
|
||||
{
|
||||
if ( sidesteptype == "roll" || sidesteptype == "phase" )
|
||||
{
|
||||
self.desiredstepdir = "forward";
|
||||
return self.desiredstepdir;
|
||||
}
|
||||
/#
|
||||
assert( sidesteptype == "step", "Unsupported SideStepType" );
|
||||
#/
|
||||
randomroll = randomfloat( 1 );
|
||||
if ( self.a.steppeddir < 0 )
|
||||
{
|
||||
self.desiredstepdir = "right";
|
||||
}
|
||||
else if ( self.a.steppeddir > 0 )
|
||||
{
|
||||
self.desiredstepdir = "left";
|
||||
}
|
||||
else if ( randomroll < 0,5 )
|
||||
{
|
||||
self.desiredstepdir = "right";
|
||||
}
|
||||
else
|
||||
{
|
||||
self.desiredstepdir = "left";
|
||||
}
|
||||
return self.desiredstepdir;
|
||||
}
|
||||
|
||||
checkroomforanim( stepanim )
|
||||
{
|
||||
if ( !self maymovefrompointtopoint( self.origin, getanimendpos( stepanim ) ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldsidestep()
|
||||
{
|
||||
if ( cansidestep() && isplayer( self.enemy ) && self.enemy islookingat( self ) )
|
||||
{
|
||||
if ( self.zombie_move_speed != "sprint" || randomfloat( 1 ) < 0,7 )
|
||||
{
|
||||
return "step";
|
||||
}
|
||||
else
|
||||
{
|
||||
return "roll";
|
||||
}
|
||||
}
|
||||
return "none";
|
||||
}
|
||||
|
||||
cansidestep()
|
||||
{
|
||||
if ( !isDefined( self.zombie_can_sidestep ) || !self.zombie_can_sidestep )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( ( getTime() - self.a.lastsidesteptime ) < 2000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.a.pose != "stand" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( distsqfromenemy < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distsqfromenemy > 1000000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
if ( abs( yaw ) > 45 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
shouldforwardstep()
|
||||
{
|
||||
if ( canforwardstep() && isplayer( self.enemy ) )
|
||||
{
|
||||
return "phase";
|
||||
}
|
||||
return "none";
|
||||
}
|
||||
|
||||
canforwardstep()
|
||||
{
|
||||
if ( isDefined( self.a.lastsidesteptime ) && ( getTime() - self.a.lastsidesteptime ) < 2000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.enemy ) )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( self.a.pose != "stand" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
distsqfromenemy = distancesquared( self.origin, self.enemy.origin );
|
||||
if ( distsqfromenemy < 14400 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( distsqfromenemy > 5760000 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( !isDefined( self.pathgoalpos ) || distancesquared( self.origin, self.pathgoalpos ) < 4096 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
if ( abs( self getmotionangle() ) > 15 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
yaw = getyawtoorigin( self.enemy.origin );
|
||||
if ( abs( yaw ) > 45 )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
dosidestep()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
self playsidestepanim( self.stepanim, self.sidesteptype );
|
||||
if ( self.desiredstepdir == "left" )
|
||||
{
|
||||
self.a.steppeddir--;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.steppeddir++;
|
||||
}
|
||||
self.a.lastsidesteptime = getTime();
|
||||
self notify( "sidestep_done" );
|
||||
}
|
||||
|
||||
playsidestepanim( stepanim, sidesteptype )
|
||||
{
|
||||
self animmode( "gravity", 0 );
|
||||
self orientmode( "face angle", self.angles[ 1 ] );
|
||||
runblendouttime = 0,2;
|
||||
if ( isDefined( self.sidestepfunc ) )
|
||||
{
|
||||
self thread [[ self.sidestepfunc ]]( "step_anim", stepanim );
|
||||
}
|
||||
self setanimstatefromasd( self.asd_name, self.substate_index );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "step_anim" );
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self thread facelookaheadforabit();
|
||||
}
|
||||
}
|
||||
|
||||
facelookaheadforabit()
|
||||
{
|
||||
self endon( "death" );
|
||||
self endon( "killanimscript" );
|
||||
lookaheadangles = vectorToAngle( self.lookaheaddir );
|
||||
self orientmode( "face angle", lookaheadangles[ 1 ] );
|
||||
wait 0,2;
|
||||
self animmode( "normal", 0 );
|
||||
self orientmode( "face default" );
|
||||
}
|
18
patch_zm/maps/mp/animscripts/zm_pain.gsc
Normal file
18
patch_zm/maps/mp/animscripts/zm_pain.gsc
Normal file
@ -0,0 +1,18 @@
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include common_scripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
self setflashbanged( 0 );
|
||||
if ( isDefined( self.longdeathstarting ) )
|
||||
{
|
||||
self waittill( "killanimscript" );
|
||||
return;
|
||||
}
|
||||
if ( self.a.disablepain )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
61
patch_zm/maps/mp/animscripts/zm_run.gsc
Normal file
61
patch_zm/maps/mp/animscripts/zm_run.gsc
Normal file
@ -0,0 +1,61 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
moverun()
|
||||
{
|
||||
self endon( "death" );
|
||||
if ( isDefined( self.needs_run_update ) && !self.needs_run_update )
|
||||
{
|
||||
self waittill( "needs_run_update" );
|
||||
}
|
||||
if ( isDefined( self.is_inert ) && self.is_inert )
|
||||
{
|
||||
wait 0,1;
|
||||
return;
|
||||
}
|
||||
self setaimanimweights( 0, 0 );
|
||||
self setanimstatefromspeed();
|
||||
maps/mp/animscripts/zm_shared::donotetracksfortime( 0,05, "move_anim" );
|
||||
self.needs_run_update = 0;
|
||||
}
|
||||
|
||||
setanimstatefromspeed()
|
||||
{
|
||||
animstate = self append_missing_legs_suffix( "zm_move_" + self.zombie_move_speed );
|
||||
if ( isDefined( self.a.gib_ref ) && self.a.gib_ref == "no_legs" )
|
||||
{
|
||||
animstate = "zm_move_stumpy";
|
||||
}
|
||||
if ( isDefined( self.preserve_asd_substates ) && self.preserve_asd_substates && animstate == self getanimstatefromasd() )
|
||||
{
|
||||
substate = self getanimsubstatefromasd();
|
||||
self setanimstatefromasd( animstate, substate );
|
||||
}
|
||||
else
|
||||
{
|
||||
self setanimstatefromasd( animstate );
|
||||
}
|
||||
if ( isDefined( self.setanimstatefromspeed ) )
|
||||
{
|
||||
self [[ self.setanimstatefromspeed ]]( animstate, substate );
|
||||
}
|
||||
}
|
||||
|
||||
needsupdate()
|
||||
{
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
}
|
||||
|
||||
needsdelayedupdate()
|
||||
{
|
||||
self endon( "death" );
|
||||
while ( isDefined( self.needs_run_update ) && self.needs_run_update )
|
||||
{
|
||||
wait 0,1;
|
||||
}
|
||||
self.needs_run_update = 1;
|
||||
self notify( "needs_run_update" );
|
||||
}
|
39
patch_zm/maps/mp/animscripts/zm_scripted.gsc
Normal file
39
patch_zm/maps/mp/animscripts/zm_scripted.gsc
Normal file
@ -0,0 +1,39 @@
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "death" );
|
||||
self notify( "killanimscript" );
|
||||
self endon( "end_sequence" );
|
||||
if ( !isDefined( self.codescripted[ "animState" ] ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self startscriptedanim( self.codescripted[ "origin" ], self.codescripted[ "angles" ], self.codescripted[ "animState" ], self.codescripted[ "animSubState" ], self.codescripted[ "AnimMode" ] );
|
||||
self.a.script = "scripted";
|
||||
self.codescripted = undefined;
|
||||
if ( isDefined( self.deathstring_passed ) )
|
||||
{
|
||||
self.deathstring = self.deathstring_passed;
|
||||
}
|
||||
self waittill( "killanimscript" );
|
||||
}
|
||||
|
||||
init( origin, angles, animstate, animsubstate, animmode )
|
||||
{
|
||||
self.codescripted[ "origin" ] = origin;
|
||||
self.codescripted[ "angles" ] = angles;
|
||||
self.codescripted[ "animState" ] = animstate;
|
||||
self.codescripted[ "animSubState" ] = animsubstate;
|
||||
if ( isDefined( animmode ) )
|
||||
{
|
||||
self.codescripted[ "AnimMode" ] = animmode;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.codescripted[ "AnimMode" ] = "normal";
|
||||
}
|
||||
}
|
||||
|
||||
end_script()
|
||||
{
|
||||
}
|
509
patch_zm/maps/mp/animscripts/zm_shared.gsc
Normal file
509
patch_zm/maps/mp/animscripts/zm_shared.gsc
Normal file
@ -0,0 +1,509 @@
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
deleteatlimit()
|
||||
{
|
||||
wait 30;
|
||||
self delete();
|
||||
}
|
||||
|
||||
lookatentity( looktargetentity, lookduration, lookspeed, eyesonly, interruptothers )
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
lookatposition( looktargetpos, lookduration, lookspeed, eyesonly, interruptothers )
|
||||
{
|
||||
/#
|
||||
assert( isai( self ), "Can only call this function on an AI character" );
|
||||
#/
|
||||
/#
|
||||
assert( self.a.targetlookinitilized == 1, "LookAtPosition called on AI that lookThread was not called on" );
|
||||
#/
|
||||
/#
|
||||
if ( lookspeed != "casual" )
|
||||
{
|
||||
assert( lookspeed == "alert", "lookSpeed must be casual or alert" );
|
||||
}
|
||||
#/
|
||||
if ( isDefined( interruptothers ) || interruptothers == "interrupt others" && getTime() > self.a.lookendtime )
|
||||
{
|
||||
self.a.looktargetpos = looktargetpos;
|
||||
self.a.lookendtime = getTime() + ( lookduration * 1000 );
|
||||
if ( lookspeed == "casual" )
|
||||
{
|
||||
self.a.looktargetspeed = 800;
|
||||
}
|
||||
else
|
||||
{
|
||||
self.a.looktargetspeed = 1600;
|
||||
}
|
||||
if ( isDefined( eyesonly ) && eyesonly == "eyes only" )
|
||||
{
|
||||
self notify( "eyes look now" );
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
self notify( "look now" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
lookatanimations( leftanim, rightanim )
|
||||
{
|
||||
self.a.lookanimationleft = leftanim;
|
||||
self.a.lookanimationright = rightanim;
|
||||
}
|
||||
|
||||
handledogsoundnotetracks( note )
|
||||
{
|
||||
if ( note != "sound_dogstep_run_default" || note == "dogstep_rf" && note == "dogstep_lf" )
|
||||
{
|
||||
self playsound( "fly_dog_step_run_default" );
|
||||
return 1;
|
||||
}
|
||||
prefix = getsubstr( note, 0, 5 );
|
||||
if ( prefix != "sound" )
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
alias = "aml" + getsubstr( note, 5 );
|
||||
if ( isalive( self ) )
|
||||
{
|
||||
self thread play_sound_on_tag_endon_death( alias, "tag_eye" );
|
||||
}
|
||||
else
|
||||
{
|
||||
self thread play_sound_in_space( alias, self gettagorigin( "tag_eye" ) );
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
growling()
|
||||
{
|
||||
return isDefined( self.script_growl );
|
||||
}
|
||||
|
||||
registernotetracks()
|
||||
{
|
||||
anim.notetracks[ "anim_pose = "stand"" ] = ::notetrackposestand;
|
||||
anim.notetracks[ "anim_pose = "crouch"" ] = ::notetrackposecrouch;
|
||||
anim.notetracks[ "anim_movement = "stop"" ] = ::notetrackmovementstop;
|
||||
anim.notetracks[ "anim_movement = "walk"" ] = ::notetrackmovementwalk;
|
||||
anim.notetracks[ "anim_movement = "run"" ] = ::notetrackmovementrun;
|
||||
anim.notetracks[ "anim_alertness = causal" ] = ::notetrackalertnesscasual;
|
||||
anim.notetracks[ "anim_alertness = alert" ] = ::notetrackalertnessalert;
|
||||
anim.notetracks[ "gravity on" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "gravity off" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "gravity code" ] = ::notetrackgravity;
|
||||
anim.notetracks[ "bodyfall large" ] = ::notetrackbodyfall;
|
||||
anim.notetracks[ "bodyfall small" ] = ::notetrackbodyfall;
|
||||
anim.notetracks[ "footstep" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "step" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_right_large" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_right_small" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_left_large" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footstep_left_small" ] = ::notetrackfootstep;
|
||||
anim.notetracks[ "footscrape" ] = ::notetrackfootscrape;
|
||||
anim.notetracks[ "land" ] = ::notetrackland;
|
||||
anim.notetracks[ "start_ragdoll" ] = ::notetrackstartragdoll;
|
||||
}
|
||||
|
||||
notetrackstopanim( note, flagname )
|
||||
{
|
||||
}
|
||||
|
||||
notetrackstartragdoll( note, flagname )
|
||||
{
|
||||
if ( isDefined( self.noragdoll ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
self unlink();
|
||||
self startragdoll();
|
||||
}
|
||||
|
||||
notetrackmovementstop( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "stop";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementwalk( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "walk";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackmovementrun( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.movement = "run";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnesscasual( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "casual";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackalertnessalert( note, flagname )
|
||||
{
|
||||
if ( issentient( self ) )
|
||||
{
|
||||
self.a.alertness = "alert";
|
||||
}
|
||||
}
|
||||
|
||||
notetrackposestand( note, flagname )
|
||||
{
|
||||
self.a.pose = "stand";
|
||||
self notify( "entered_pose" + "stand" );
|
||||
}
|
||||
|
||||
notetrackposecrouch( note, flagname )
|
||||
{
|
||||
self.a.pose = "crouch";
|
||||
self notify( "entered_pose" + "crouch" );
|
||||
if ( self.a.crouchpain )
|
||||
{
|
||||
self.a.crouchpain = 0;
|
||||
self.health = 150;
|
||||
}
|
||||
}
|
||||
|
||||
notetrackgravity( note, flagname )
|
||||
{
|
||||
if ( issubstr( note, "on" ) )
|
||||
{
|
||||
self animmode( "gravity" );
|
||||
}
|
||||
else if ( issubstr( note, "off" ) )
|
||||
{
|
||||
self animmode( "nogravity" );
|
||||
self.nogravity = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( note, "code" ) )
|
||||
{
|
||||
self animmode( "none" );
|
||||
self.nogravity = undefined;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notetrackbodyfall( note, flagname )
|
||||
{
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
if ( issubstr( note, "large" ) )
|
||||
{
|
||||
self playsound( "fly_bodyfall_large_" + groundtype );
|
||||
}
|
||||
else
|
||||
{
|
||||
if ( issubstr( note, "small" ) )
|
||||
{
|
||||
self playsound( "fly_bodyfall_small_" + groundtype );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
notetrackfootstep( note, flagname )
|
||||
{
|
||||
if ( issubstr( note, "left" ) )
|
||||
{
|
||||
playfootstep( "J_Ball_LE" );
|
||||
}
|
||||
else
|
||||
{
|
||||
playfootstep( "J_BALL_RI" );
|
||||
}
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_gear_run" );
|
||||
}
|
||||
}
|
||||
|
||||
notetrackfootscrape( note, flagname )
|
||||
{
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
self playsound( "fly_step_scrape_" + groundtype );
|
||||
}
|
||||
|
||||
notetrackland( note, flagname )
|
||||
{
|
||||
if ( isDefined( self.groundtype ) )
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = "dirt";
|
||||
}
|
||||
self playsound( "fly_land_npc_" + groundtype );
|
||||
}
|
||||
|
||||
handlenotetrack( note, flagname, customfunction, var1 )
|
||||
{
|
||||
if ( isai( self ) && self.isdog )
|
||||
{
|
||||
if ( handledogsoundnotetracks( note ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
notetrackfunc = anim.notetracks[ note ];
|
||||
if ( isDefined( notetrackfunc ) )
|
||||
{
|
||||
return [[ notetrackfunc ]]( note, flagname );
|
||||
}
|
||||
}
|
||||
switch( note )
|
||||
{
|
||||
case "end":
|
||||
case "finish":
|
||||
case "undefined":
|
||||
if ( isai( self ) && self.a.pose == "back" )
|
||||
{
|
||||
}
|
||||
return note;
|
||||
case "swish small":
|
||||
self thread play_sound_in_space( "fly_gear_enemy", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "swish large":
|
||||
self thread play_sound_in_space( "fly_gear_enemy_large", self gettagorigin( "TAG_WEAPON_RIGHT" ) );
|
||||
break;
|
||||
case "no death":
|
||||
self.a.nodeath = 1;
|
||||
break;
|
||||
case "no pain":
|
||||
self.allowpain = 0;
|
||||
break;
|
||||
case "allow pain":
|
||||
self.allowpain = 1;
|
||||
break;
|
||||
case "anim_melee = "right"":
|
||||
case "anim_melee = right":
|
||||
self.a.meleestate = "right";
|
||||
break;
|
||||
case "anim_melee = "left"":
|
||||
case "anim_melee = left":
|
||||
self.a.meleestate = "left";
|
||||
break;
|
||||
case "swap taghelmet to tagleft":
|
||||
if ( isDefined( self.hatmodel ) )
|
||||
{
|
||||
if ( isDefined( self.helmetsidemodel ) )
|
||||
{
|
||||
self detach( self.helmetsidemodel, "TAG_HELMETSIDE" );
|
||||
self.helmetsidemodel = undefined;
|
||||
}
|
||||
self detach( self.hatmodel, "" );
|
||||
self attach( self.hatmodel, "TAG_WEAPON_LEFT" );
|
||||
self.hatmodel = undefined;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if ( isDefined( customfunction ) )
|
||||
{
|
||||
if ( !isDefined( var1 ) )
|
||||
{
|
||||
return [[ customfunction ]]( note );
|
||||
}
|
||||
else
|
||||
{
|
||||
return [[ customfunction ]]( note, var1 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracks( flagname, customfunction, var1 )
|
||||
{
|
||||
for ( ;; )
|
||||
{
|
||||
self waittill( flagname, note );
|
||||
if ( !isDefined( note ) )
|
||||
{
|
||||
note = "undefined";
|
||||
}
|
||||
val = self handlenotetrack( note, flagname, customfunction, var1 );
|
||||
if ( isDefined( val ) )
|
||||
{
|
||||
return val;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforeverproc( notetracksfunc, flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
if ( isDefined( killstring ) )
|
||||
{
|
||||
self endon( killstring );
|
||||
}
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
time = getTime();
|
||||
returnednote = [[ notetracksfunc ]]( flagname, customfunction, var1 );
|
||||
timetaken = getTime() - time;
|
||||
if ( timetaken < 0,05 )
|
||||
{
|
||||
/#
|
||||
println( getTime() + " mapsmpanimscriptsshared::DoNoteTracksForever is trying to cause an infinite loop on anim " + flagname + ", returned " + returnednote + "." );
|
||||
#/
|
||||
wait ( 0,05 - timetaken );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
donotetracksforever( flagname, killstring, customfunction, var1 )
|
||||
{
|
||||
donotetracksforeverproc( ::donotetracks, flagname, killstring, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeproc( donotetracksforeverfunc, time, flagname, customfunction, ent, var1 )
|
||||
{
|
||||
ent endon( "stop_notetracks" );
|
||||
[[ donotetracksforeverfunc ]]( flagname, undefined, customfunction, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortime( time, flagname, customfunction, var1 )
|
||||
{
|
||||
ent = spawnstruct();
|
||||
ent thread donotetracksfortimeendnotify( time );
|
||||
donotetracksfortimeproc( ::donotetracksforever, time, flagname, customfunction, ent, var1 );
|
||||
}
|
||||
|
||||
donotetracksfortimeendnotify( time )
|
||||
{
|
||||
wait time;
|
||||
self notify( "stop_notetracks" );
|
||||
}
|
||||
|
||||
playfootstep( foot )
|
||||
{
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
if ( !isai( self ) )
|
||||
{
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
return;
|
||||
}
|
||||
}
|
||||
groundtype = undefined;
|
||||
if ( !isDefined( self.groundtype ) )
|
||||
{
|
||||
if ( !isDefined( self.lastgroundtype ) )
|
||||
{
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_step_run_dirt" );
|
||||
}
|
||||
return;
|
||||
}
|
||||
groundtype = self.lastgroundtype;
|
||||
}
|
||||
else
|
||||
{
|
||||
groundtype = self.groundtype;
|
||||
self.lastgroundtype = self.groundtype;
|
||||
}
|
||||
if ( !level.clientscripts )
|
||||
{
|
||||
self playsound( "fly_step_run_" + groundtype );
|
||||
}
|
||||
[[ anim.optionalstepeffectfunction ]]( foot, groundtype );
|
||||
}
|
||||
|
||||
playfootstepeffect( foot, groundtype )
|
||||
{
|
||||
if ( level.clientscripts )
|
||||
{
|
||||
return;
|
||||
}
|
||||
i = 0;
|
||||
while ( i < anim.optionalstepeffects.size )
|
||||
{
|
||||
if ( isDefined( self.fire_footsteps ) && self.fire_footsteps )
|
||||
{
|
||||
groundtype = "fire";
|
||||
}
|
||||
if ( groundtype != anim.optionalstepeffects[ i ] )
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
org = self gettagorigin( foot );
|
||||
playfx( level._effect[ "step_" + anim.optionalstepeffects[ i ] ], org, org + vectorScale( ( 0, 0, 1 ), 100 ) );
|
||||
return;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
movetooriginovertime( origin, time )
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
if ( distancesquared( self.origin, origin ) > 256 && !self maymovetopoint( origin ) )
|
||||
{
|
||||
/#
|
||||
println( "^1Warning: AI starting behavior for node at " + origin + " but could not move to that point." );
|
||||
#/
|
||||
return;
|
||||
}
|
||||
self.keepclaimednodeingoal = 1;
|
||||
offset = self.origin - origin;
|
||||
frames = int( time * 20 );
|
||||
offsetreduction = vectorScale( offset, 1 / frames );
|
||||
i = 0;
|
||||
while ( i < frames )
|
||||
{
|
||||
offset -= offsetreduction;
|
||||
self teleport( origin + offset );
|
||||
wait 0,05;
|
||||
i++;
|
||||
}
|
||||
self.keepclaimednodeingoal = 0;
|
||||
}
|
||||
|
||||
returntrue()
|
||||
{
|
||||
return 1;
|
||||
}
|
26
patch_zm/maps/mp/animscripts/zm_stop.gsc
Normal file
26
patch_zm/maps/mp/animscripts/zm_stop.gsc
Normal file
@ -0,0 +1,26 @@
|
||||
#include maps/mp/animscripts/zm_shared;
|
||||
#include maps/mp/animscripts/zm_utility;
|
||||
#include maps/mp/animscripts/utility;
|
||||
#include maps/mp/animscripts/shared;
|
||||
|
||||
main()
|
||||
{
|
||||
self endon( "killanimscript" );
|
||||
for ( ;; )
|
||||
{
|
||||
if ( isDefined( level.ignore_stop_func ) )
|
||||
{
|
||||
if ( self [[ level.ignore_stop_func ]]() )
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if ( !self hasanimstatefromasd( "zm_idle" ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
animstate = maps/mp/animscripts/zm_utility::append_missing_legs_suffix( "zm_idle" );
|
||||
self setanimstatefromasd( animstate );
|
||||
maps/mp/animscripts/zm_shared::donotetracks( "idle_anim" );
|
||||
}
|
||||
}
|
6
patch_zm/maps/mp/animscripts/zm_turn.gsc
Normal file
6
patch_zm/maps/mp/animscripts/zm_turn.gsc
Normal file
@ -0,0 +1,6 @@
|
||||
#include maps/mp/animscripts/shared;
|
||||
#include maps/mp/animscripts/utility;
|
||||
|
||||
main()
|
||||
{
|
||||
}
|
1243
patch_zm/maps/mp/animscripts/zm_utility.gsc
Normal file
1243
patch_zm/maps/mp/animscripts/zm_utility.gsc
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user