1 #using scripts\shared\ai_shared;
2 #using scripts\shared\clientfield_shared;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\spawner_shared;
5 #using scripts\shared\ai\archetype_utility;
6 #using scripts\shared\ai\zombie_utility;
7 #using scripts\shared\ai\systems\ai_interface;
8 #using scripts\shared\ai\systems\animation_state_machine_mocomp;
9 #using scripts\shared\ai\systems\animation_state_machine_utility;
10 #using scripts\shared\ai\systems\behavior_tree_utility;
11 #using scripts\shared\ai\systems\blackboard;
12 #using scripts\shared\ai\systems\debug;
13 #using scripts\shared\ai\systems\gib;
14 #using scripts\shared\ai\systems\shared;
17 #using scripts\shared\ai\archetype_human_riotshield_interface;
19 #using scripts\shared\ai\archetype_utility;
20 #using scripts\shared\ai\archetype_cover_utility;
21 #using scripts\shared\ai\archetype_locomotion_utility;
22 #using scripts\shared\ai\archetype_mocomps_utility;
24 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
25 #insert scripts\shared\shared.gsh;
26 #insert scripts\shared\version.gsh;
27 #insert scripts\shared\ai\archetype_human_riotshield.gsh;
28 #insert scripts\shared\ai\utility.gsh;
29 #insert scripts\shared\ai\systems\animation_state_machine.gsh;
30 #insert scripts\shared\ai\systems\behavior.gsh;
31 #insert scripts\shared\ai\systems\behavior_tree.gsh;
32 #insert scripts\shared\ai\systems\blackboard.gsh;
33 #insert scripts\shared\ai\systems\gib.gsh;
48 #namespace HumanRiotshieldBehavior;
94 entity.__blackboard = undefined;
120 if ( entity.damagelocation !=
"riotshield" )
125 if ( entity.damagelocation ==
"riotshield" &&
137 entity.flinchCount++;
138 entity.lastFlinchTime = GetTime();
143 entity.lastFlinchTime = GetTime();
144 entity.flinchCount = 0;
155 if ( IsDefined( behaviorTreeEntity.enemy ) )
157 if ( DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity LastKnownPos( behaviorTreeEntity.enemy ) ) >
RIOTSHIELD_RUN_DIST_SQ )
168 itsBeenAWhile = ( GetTime() > behaviorTreeEntity.nextFindBestCoverTime );
169 isAtScriptGoal = behaviorTreeEntity IsAtGoal();
170 tooLongAtNode =
false;
177 if ( IsDefined( behaviorTreeEntity.chosenNode ) )
179 dist_sq = DistanceSquared( behaviorTreeEntity.origin, behaviorTreeEntity.chosenNode.origin );
182 if ( !IsDefined( behaviorTreeEntity.timeAtChosenNode ) )
184 behaviorTreeEntity.timeAtChosenNode = GetTime();
189 if ( IsDefined( behaviorTreeEntity.timeAtChosenNode ) )
191 if ( GetTime() - behaviorTreeEntity.timeAtChosenNode > behaviorTreeEntity.timeAtNodeMax )
193 tooLongAtNode =
true;
194 behaviorTreeEntity.timeAtChosenNode = undefined;
198 shouldLookForBetterCover = itsBeenAWhile || !isAtScriptGoal || tooLongAtNode;
200 if ( shouldLookForBetterCover && IsDefined( behaviorTreeEntity.enemy ) )
202 closestRandomNode = undefined;
203 closestRandomNodes = behaviorTreeEntity FindBestCoverNodes( behaviorTreeEntity.goalradius, behaviorTreeEntity.goalpos );
205 foreach( node
in closestRandomNodes )
207 if ( IsDefined( behaviorTreeEntity.chosenNode ) && behaviorTreeEntity.chosenNode == node )
214 closestRandomNode = node;
219 if ( !IsDefined( closestRandomNode ) )
221 closestRandomNode = closestRandomNodes[0];
224 if( IsDefined( closestRandomNode )
225 && behaviorTreeEntity FindPath( behaviorTreeEntity.origin, closestRandomNode.origin,
true,
false )
228 AiUtility::ReleaseClaimNode( behaviorTreeEntity );
231 behaviorTreeEntity.chosenNode = closestRandomNode;
232 behaviorTreeEntity.timeAtNodeMax = RandomIntRange( behaviorTreeEntity.moveDelayMin, behaviorTreeEntity.moveDelayMax );
233 behaviorTreeEntity.timeAtChosenNode = undefined;
248 behaviorTreeEntity OrientMode(
"face enemy" );
263 foreach( index, value
in ai )
265 if ( value.team != behaviorTreeEntity.team && IsActor( value ) )
267 enemies[enemies.size] = value;
272 if ( enemies.size > 0 )
274 closestEnemy = undefined;
275 closestEnemyDistance = 0;
277 for ( index = 0; index < enemies.size; index++ )
279 enemy = enemies[index];
280 enemyDistance = DistanceSquared( behaviorTreeEntity.origin, enemy.origin );
283 if ( enemyDistance > behaviorTreeEntity.goalradius * behaviorTreeEntity.goalradius )
288 if ( !IsDefined( enemy.targeted_by ) || enemy.targeted_by == behaviorTreeEntity )
294 targetDistance = DistanceSquared( enemy.targeted_by.origin, enemy.origin );
295 if ( enemyDistance < targetDistance )
303 if ( !IsDefined( closestEnemy ) || enemyDistance < closestEnemyDistance )
305 closestEnemyDistance = enemyDistance;
306 closestEnemy = enemy;
311 if ( IsDefined( behaviorTreeEntity.favoriteenemy ) )
313 behaviorTreeEntity.favoriteenemy.targeted_by = undefined;
316 behaviorTreeEntity.favoriteenemy = closestEnemy;
318 if ( IsDefined( behaviorTreeEntity.favoriteenemy ) )
320 behaviorTreeEntity.favoriteenemy.targeted_by = behaviorTreeEntity;
331 if ( GetTime() < behaviorTreeEntity.nextFindBestCoverTime )
336 if( IsDefined( behaviorTreeEntity.favoriteenemy ) )
339 RecordLine( behaviorTreeEntity.favoriteenemy.origin, behaviorTreeEntity.origin,
ORANGE,
"Animscript", behaviorTreeEntity );
342 enemyDistance = DistanceSquared( behaviorTreeEntity.favoriteenemy.origin, behaviorTreeEntity.origin );
343 if ( enemyDistance < behaviorTreeEntity.goalradius * behaviorTreeEntity.goalradius )
345 behaviorTreeEntity UsePosition( behaviorTreeEntity.favoriteenemy.origin );
350 behaviorTreeEntity ClearUsePosition();
357 behaviorTreeEntity OrientMode(
"face enemy" );
362 inflictor, attacker,
damage, meansOfDeath, weapon, dir, hitLoc, offsetTime )
372 eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime, boneIndex, modelIndex )
376 if ( sHitLoc ==
"riotshield" )
384 if ( sWeapon.name ==
"incendiary_grenade" )
386 iDamage = entity.health;
392 #namespace HumanRiotshieldServerUtils;
402 entity.ignoreRunAndGunDist =
true;