1 #using scripts\shared\ai_shared;
2 #using scripts\shared\callbacks_shared;
3 #using scripts\shared\clientfield_shared;
4 #using scripts\shared\fx_shared;
5 #using scripts\shared\laststand_shared;
6 #using scripts\shared\math_shared;
7 #using scripts\shared\scene_shared;
8 #using scripts\shared\spawner_shared;
9 #using scripts\shared\util_shared;
10 #using scripts\shared\array_shared;
11 #using scripts\shared\system_shared;
13 #using scripts\shared\ai\systems\animation_state_machine_utility;
14 #using scripts\shared\ai\systems\animation_state_machine_notetracks;
15 #using scripts\shared\ai\archetype_utility;
16 #using scripts\shared\ai\systems\behavior_tree_utility;
17 #using scripts\shared\ai\systems\blackboard;
18 #using scripts\shared\ai\systems\debug;
19 #using scripts\shared\ai\systems\gib;
20 #using scripts\codescripts\struct;
21 #using scripts\shared\ai\archetype_mocomps_utility;
23 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
24 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
25 #insert scripts\shared\ai\systems\behavior.gsh;
26 #insert scripts\shared\ai\systems\behavior_tree.gsh;
27 #insert scripts\shared\ai\systems\blackboard.gsh;
28 #insert scripts\shared\ai\systems\gib.gsh;
29 #insert scripts\shared\ai\utility.gsh;
30 #insert scripts\shared\ai\skeleton.gsh;
31 #insert scripts\shared\shared.gsh;
32 #insert scripts\shared\version.gsh;
34 #namespace SkeletonBehavior;
62 self.zombie_move_speed =
"walk";
63 if(randomint( 2 ) == 0)
64 self.zombie_arms_position =
"up";
66 self.zombie_arms_position =
"down";
67 self.missingLegs =
false;
68 self setAvoidanceMask(
"avoid none" );
69 self PushActors(
true );
112 entity.__blackboard = undefined;
122 if( IsDefined(
self.skeleton_arms_position ) )
124 if(
self.zombie_arms_position ==
"up" )
134 if ( IsDefined(
self.zombie_move_speed ) )
136 if(
self.zombie_move_speed ==
"walk" )
140 else if(
self.zombie_move_speed ==
"run" )
144 else if(
self.zombie_move_speed ==
"sprint" )
148 else if(
self.zombie_move_speed ==
"super_sprint" )
158 if(
self.missingLegs )
169 if( !isdefined(behaviorTreeEntity.zombie_move_speed))
171 return behaviorTreeEntity.zombie_move_speed ==
"walk" && !
IS_TRUE(behaviorTreeEntity.missingLegs) && behaviorTreeEntity.zombie_arms_position ==
"up";
181 hitEnt = animationentity Melee();
182 if(isDefined(hitEnt) && isDefined(animationentity.aux_melee_damage) &&
self.team != hitEnt.team )
184 animationentity [[animationentity.aux_melee_damage]](hitEnt);
190 normal = VectorNormalize( end_origin - start_origin );
191 forward = AnglesToForward( start_angles );
192 dot = VectorDot( forward, normal );
197 #define LAST_SEEN_LOSS_LATENCY 3000
201 self endon(
"death" );
203 if(!isDefined(
self.players_visCache))
205 self.players_visCache = [];
207 entNum = player GetEntityNumber();
208 if(!isDefined(
self.players_visCache[entNum]))
210 self.players_visCache[entNum] = 0;
212 if (
self.players_visCache[entNum] > GetTime() )
218 zombie_eye =
self.origin + ( 0, 0, 40);
219 player_pos = player.origin + ( 0, 0, 40);
224 distanceSq = DistanceSquared( zombie_eye, player_pos );
232 else if( distanceSq > 1024*1024 )
237 if(
is_within_fov( zombie_eye,
self.angles, player_pos, cos(60.0) ) )
239 trace = GroundTrace( zombie_eye, player_pos,
false, undefined );
241 if(
trace[
"fraction"] < 1.0 )
258 if( !IsDefined( player ) )
263 if( !IsAlive( player ) )
268 if( !IsPlayer( player ) )
273 if( IsDefined(player.is_zombie) && player.is_zombie ==
true )
278 if( player.sessionstate ==
"spectator" )
283 if( player.sessionstate ==
"intermission" )
293 if(!
IS_TRUE(ignore_laststand_players))
307 if(
IS_TRUE(checkIgnoreMeFlag) && player.ignoreme )
313 if( IsDefined( level.is_player_valid_override ) )
315 return [[ level.is_player_valid_override ]]( player );
323 valid_player_found =
false;
325 players = GetPlayers();
327 if( IsDefined( ignore_player ) )
330 for(i = 0; i < ignore_player.size; i++ )
332 ArrayRemoveValue( players, ignore_player[i] );
339 while ( players.size && !done )
342 for(i = 0; i < players.size; i++ )
347 ArrayRemoveValue( players, player );
354 if( players.size == 0 )
359 while( !valid_player_found )
362 if( IsDefined(
self.closest_player_override ) )
364 player = [[
self.closest_player_override ]]( origin, players );
366 else if( isdefined( level.closest_player_override ) )
368 player = [[ level.closest_player_override ]]( origin, players );
372 player = ArrayGetClosest( origin, players );
375 if( !isdefined( player ) || players.size == 0 )
384 ArrayRemoveValue( players, player );
385 if( players.size == 0 )
400 if(isDefined(
self.setGoalOverrideCB))
402 return [[
self.setGoalOverrideCB]](goal);
412 self endon(
"death" );
414 if (
IS_TRUE( behaviorTreeEntity.ignoreall ) )
418 if(isDefined(behaviorTreeEntity.enemy) && behaviorTreeEntity.enemy.team == behaviorTreeEntity.team )
419 behaviorTreeEntity ClearEntityTarget();
421 if(behaviorTreeEntity.team ==
"allies")
423 if(isDefined(behaviorTreeEntity.favoriteenemy))
425 behaviorTreeEntity
skeletonSetGoal( behaviorTreeEntity.favoriteenemy.origin );
428 if(isDefined(behaviorTreeEntity.enemy))
434 if(isDefined(target))
450 if( !isDefined( player ) )
452 if( IsDefined( behaviorTreeEntity.ignore_player ) )
454 if(isDefined(level._should_skip_ignore_player_logic) && [[level._should_skip_ignore_player_logic]]() )
458 behaviorTreeEntity.ignore_player = [];
466 if ( IsDefined( player.last_valid_position ) )
480 influencePos = undefined;
484 if( isdefined(influencePos) )
489 if( DistanceSquared( influencePos, behaviorTreeEntity.origin ) > 32*32 )
495 behaviorTreeEntity ClearPath();
501 behaviorTreeEntity ClearPath();
545 if ( !isdefined( enemy ) )
555 angles = VectorToAngles(org-
self.origin);
565 pos =
self.enemy.origin;
569 forward = AnglesToForward(
self.angles);
570 forward = VectorScale (forward, 150);
571 pos =
self.origin + forward;
574 yaw =
self.angles[1] -
GetYaw(pos);
575 yaw = AngleClamp180( yaw );
581 if( !IsDefined( behaviortreeentity.enemy ) )
586 if( IsDefined( behaviorTreeEntity.marked_for_death ) )
591 if(
IS_TRUE( behaviorTreeEntity.stunned ) )
596 yaw = abs( getYawToEnemy() );
601 if( DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity.enemy.origin ) <
ZM_MELEE_DIST_SQ )
611 if ( IsDefined( behaviorTreeEntity.deathFunction ) )
613 behaviorTreeEntity [[ behaviorTreeEntity.deathFunction ]]();
622 if (!isDefined(entArray) )
625 if (entArray.size == 0 )
628 return ArrayGetClosest( origin, entArray );