1 #using scripts\codescripts\struct;
3 #using scripts\shared\math_shared;
4 #using scripts\shared\statemachine_shared;
5 #using scripts\shared\clientfield_shared;
6 #using scripts\shared\system_shared;
7 #using scripts\shared\array_shared;
8 #using scripts\shared\util_shared;
10 #using scripts\shared\vehicle_shared;
11 #using scripts\shared\vehicle_death_shared;
12 #using scripts\shared\vehicle_ai_shared;
14 #using scripts\shared\ai\systems\blackboard;
15 #using scripts\shared\ai\blackboard_vehicle;
16 #using scripts\shared\animation_shared;
17 #using scripts\shared\ai\systems\gib;
18 #using scripts\shared\ai\zombie_utility;
19 #using scripts\shared\ai\margwa;
21 #insert scripts\shared\shared.gsh;
22 #insert scripts\shared\statemachine.gsh;
23 #insert scripts\shared\version.gsh;
24 #insert scripts\shared\archetype_shared\archetype_shared.gsh;
25 #insert scripts\shared\ai\utility.gsh;
26 #insert scripts\shared\ai\systems\gib.gsh;
27 #insert scripts\shared\vehicles\_glaive.gsh;
33 #using_animtree( "generic" );
35 #define SWORD_MODE_MINPOWER 0.0
45 self useanimtree( #animtree );
49 self.health =
self.healthdefault;
56 self SetHoverParams( 0, 0, 40 );
57 self playloopsound(
"wpn_sword2_looper" );
59 if ( isdefined(
self.scriptbundlesettings ) )
69 self.fovcosinebusy = 0.574;
71 self.vehAirCraftCollisionEnabled =
false;
73 self.goalRadius = 9999999;
74 self.goalHeight = 512;
75 self SetGoal(
self.origin,
false,
self.goalRadius,
self.goalHeight );
81 self._glaive_settings_lifetime =
self.settings.lifetime;
85 if( IsDefined( level.vehicle_initializer_cb ) )
87 [[level.vehicle_initializer_cb]]( self );
104 SetDvar(
"debug_sword_threat_selection", 1 );
110 self.startTime = GetTime();
116 if( !IsDefined( target ) )
121 if( !IsAlive( target ) )
136 if( target IsNoTarget() )
141 if(
IS_TRUE( target._glaive_ignoreme ) )
154 if( IsDefined( target.archetype ) && target.archetype ==
ARCHETYPE_ZOMBIE && !
IS_TRUE( target.completed_emerging_into_playable_area ) )
159 if( DistanceSquared(
self.owner.origin, target.origin ) >
SQR(
self.settings.guardradius ) )
164 if( !SightTracePassed(
self.origin, target.origin + ( 0, 0, 16 ),
false, target ) )
175 glaive_enemies = GetAITeamArray(
"axis" );
176 ArraySortClosest( glaive_enemies,
self.owner.origin );
178 foreach( glaive_enemy
in glaive_enemies )
190 self endon(
"death" );
195 if( !IsDefined(
self.owner ) )
209 if( GetDvarInt(
"debug_sword_threat_selection", 0 ) )
211 if( IsDefined(
self.glaiveEnemy ) )
213 line(
self.origin,
self.glaiveEnemy.origin, ( 1, 0, 0 ), 1.0,
false, 5 );
224 if(
IS_TRUE(
self._glaive_must_return_to_owner ) )
233 if( !isDefined( target ) )
235 self.glaiveEnemy = undefined;
239 self.glaiveEnemy = target;
248 b_is_lifetime_over = GetTime() -
self.starttime >
self._glaive_settings_lifetime * 1000;
260 if(
IS_TRUE( b_is_lifetime_over ) )
274 if( IsDefined(
self.owner ) && DistanceSquared(
self.origin,
self.owner.origin ) >
SQR(
self.settings.guardradius ) )
278 if( IsDefined(
self.owner ) && !
self is_enemy_valid(
self.glaiveEnemy ) )
297 self ASMRequestSubstate(
"idle@movement" );
302 self endon(
"change_state" );
303 self endon(
"death" );
307 while ( !isdefined(
self.owner ) )
311 if ( !isdefined(
self.owner ) )
313 self.owner = GetPlayers(
self.team )[0];
321 self._glaive_must_return_to_owner =
true;
323 if( !IsAlive(
self.glaiveEnemy ) )
332 else if( IsDefined(
self.glaiveEnemy ) )
339 if( IsDefined(
self.glaiveEnemy.archetype ) &&
self.glaiveEnemy.archetype ==
ARCHETYPE_MARGWA )
345 targetPos = targetPos + (
self.glaiveEnemy GetVelocity() * 0.4 );
347 if ( isdefined( targetPos ) )
359 if( IsDefined(
self.glaiveEnemy ) )
361 PositionQuery_Filter_Sight( queryResult, targetPos,
self GetEye() -
self.origin,
self, 0,
self.glaiveEnemy );
364 if(
IS_TRUE( queryResult.centerOnNav ) )
366 foreach ( point
in queryResult.data )
370 self.current_pathto_pos = point.origin;
372 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
true );
376 self ASMRequestSubstate(
"forward@movement" );
379 self ASMRequestSubstate(
"idle@movement" );
388 foreach ( point
in queryResult.data )
392 self.current_pathto_pos = point.origin;
394 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
false );
398 self ASMRequestSubstate(
"forward@movement" );
401 self ASMRequestSubstate(
"idle@movement" );
416 if ( pathfailcount > 3 )
418 if ( isdefined(
self.owner ) )
437 if( IsDefined(
self.glaiveEnemy.archetype ) &&
self.glaiveEnemy.archetype !=
ARCHETYPE_ZOMBIE )
441 else if( IsDefined(
self.glaiveEnemy.archetype ) &&
self.glaiveEnemy.archetype ==
ARCHETYPE_ZOMBIE &&
IS_TRUE(
self.glaiveEnemy.completed_emerging_into_playable_area ) )
455 while ( queryResult.data.size < 1 )
461 if ( queryResult.data.size && !queryResult.centerOnNav )
463 best_point = undefined;
466 foreach ( point
in queryResult.data )
468 point.score = Abs( point.origin[2] - queryResult.origin[2] );
470 if ( point.score < best_score )
472 best_score = point.score;
477 if( IsDefined( best_point ) )
480 self SetNearGoalNotifyDist( 2 );
484 self.current_pathto_pos = point.origin;
486 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
false );
499 self endon(
"change_state" );
500 self endon(
"death" );
502 sword_anim =
"o_zombie_zod_sword_projectile_melee_synced_a";
503 self._glaive_linkToTag =
"tag_origin";
505 if( IsDefined( enemy.archetype ) )
507 switch( enemy.archetype )
510 sword_anim =
"o_zombie_zod_sword_projectile_melee_parasite_synced_a";
513 sword_anim =
"o_zombie_zod_sword_projectile_melee_elemental_synced_a";
516 sword_anim =
"o_zombie_zod_sword_projectile_melee_margwa_m_synced_a";
517 self._glaive_linkToTag =
"tag_sync";
527 self endon(
"change_state" );
528 self endon(
"death" );
530 enemy =
self.glaiveEnemy;
531 should_reevaluate_target =
false;
534 self AnimScripted(
"anim_notify", enemy GetTagOrigin(
self._glaive_linkToTag ), enemy GetTagAngles(
self._glaive_linkToTag ), sword_anim,
"normal", undefined, undefined, 0.3, 0.3 );
537 self waittill(
"anim_notify" );
539 if( IsAlive( enemy ) && IsDefined( enemy.archetype ) && enemy.archetype ==
ARCHETYPE_MARGWA )
541 if ( IsDefined( enemy.chop_actor_cb ) )
543 should_reevaluate_target =
true;
544 enemy._glaive_ignoreme =
true;
546 self.owner [[ enemy.chop_actor_cb ]]( enemy,
self,
self.weapon );
551 target_enemies = GetAITeamArray(
"axis" );
552 foreach( target
in target_enemies )
554 if( Distance2DSquared(
self.origin, target.origin ) <
SQR( 128 ) )
560 target DoDamage( target.health + 100,
self.origin,
self.owner,
self,
"none",
"MOD_UNKNOWN", 0,
self.weapon );
561 self playsound(
"wpn_sword2_imp" );
562 if( IsActor( target ) )
565 target StartRagdoll();
566 target LaunchRagdoll( 100 * VectorNormalize( target.origin -
self.origin ) );
572 self waittill(
"anim_notify", notetrack );
573 while ( !isdefined( notetrack ) || notetrack !=
"end" )
575 self waittill(
"anim_notify", notetrack );
580 if( should_reevaluate_target )
584 self.glaiveEnemy = target;
592 self endon(
"death" );
596 self._glaive_ignoreme = undefined;
601 self endon(
"near_owner" );
605 starttime = GetTime();
608 self ASMRequestSubstate(
"forward@movement" );
610 while ( GetTime() - starttime <
self._glaive_settings_lifetime * 1000 * 0.1 )
617 ownerForwardVec = AnglesToForward(
self.owner.angles );
621 searchCenter =
self GetClosestPointOnNavVolume( ownerTargetPos );
622 if( IsDefined( searchCenter ) )
628 foreach ( point
in queryResult.data )
630 ADD_POINT_SCORE( point,
"score", -DistanceSquared( point.origin, targetPos ) );
636 foreach( point
in queryResult.data )
638 self.current_pathto_pos = point.origin;
639 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
true );
648 self.current_pathto_pos = searchCenter;
649 self SetVehGoalPos(
self.current_pathto_pos,
true,
true );
656 self ASMRequestSubstate(
"idle@movement" );
663 starttime = GetTime();
666 self ASMRequestSubstate(
"forward@movement" );
668 while ( GetTime() - starttime <
self._glaive_settings_lifetime * 1000 * 0.3 )
677 foreach ( point
in queryResult.data )
679 if( SightTracePassed(
self.origin, point.origin,
false, undefined ) )
682 if( trace_count > 3 )
687 if( !BulletTracePassed(
self.origin, point.origin,
false,
self ) )
697 self.current_pathto_pos = point.origin;
698 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
true );
707 foreach ( point
in queryResult.data )
709 self.current_pathto_pos = point.origin;
710 foundpath =
self SetVehGoalPos(
self.current_pathto_pos,
true,
false );
721 if ( isdefined(
self.owner ) )
725 self notify(
"returned_to_owner" );
732 self endon(
"death" );
739 self notify(
"returned_to_owner" );
744 self endon(
"death" );
752 self ASMRequestSubstate(
"idle@movement" );
753 self notify(
"near_owner" );
761 function glaive_callback_damage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, weapon, vPoint, vDir, sHitLoc, vDamageOrigin, psOffsetTime, damageFromUnderneath, modelIndex, partName, vSurfaceNormal )