Added all the remaining scripts not previously included.

This commit is contained in:
JezuzLizard
2021-08-07 11:29:26 -07:00
parent cf8d60b2d0
commit 98bfc67831
1001 changed files with 239603 additions and 0 deletions

View 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;
}

View 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" );
}

View 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;
}

View 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;
}
}

View 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;
}

View 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;
}

View 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" );
}

View 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();
}

View 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();
}
}

View 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 );
}
}

View 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;
}

View 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 );
}

View 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;
}
}

View 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;
}

View 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;
}

View 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 );
}
}
}

View 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;
}
}

View 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" );
}

View File

@ -0,0 +1,6 @@
main()
{
self endon( "killanimscript" );
self endon( "stop_flashbang_effect" );
}

View 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;
}
}

View 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;
}

View 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;
}

View File

@ -0,0 +1,8 @@
#include maps/mp/animscripts/utility;
main()
{
debug_anim_print( "dog_pain::main() " );
self endon( "killanimscript" );
self setaimanimweights( 0, 0 );
}

View 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();
}

View 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();
}
}
}

View File

@ -0,0 +1,6 @@
#include maps/mp/animscripts/shared;
#include maps/mp/animscripts/utility;
main()
{
}

View 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;
}

View File

@ -0,0 +1,6 @@
#include maps/mp/animscripts/shared;
#include maps/mp/animscripts/utility;
main()
{
}

View 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 );
}

View 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" );
}

View 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;
}
}

View 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" );
}

View 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()
{
}

View 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;
}

View 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" );
}
}

View File

@ -0,0 +1,6 @@
#include maps/mp/animscripts/shared;
#include maps/mp/animscripts/utility;
main()
{
}

File diff suppressed because it is too large Load Diff