1 #using scripts\codescripts\struct;
2 #using scripts\shared\abilities\_ability_util;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\filter_shared;
6 #using scripts\shared\util_shared;
8 #insert scripts\shared\abilities\_ability_util.gsh;
9 #insert scripts\shared\duplicaterender.gsh;
10 #insert scripts\shared\shared.gsh;
11 #insert scripts\shared\version.gsh;
13 #using scripts\shared\system_shared;
19 #define TRAIL_FX_FOOT_L "player/fx_plyr_footstep_tracker_l"
20 #define TRAIL_FX_FOOT_R "player/fx_plyr_footstep_tracker_r"
21 #define TRAIL_FX_FLY_L "player/fx_plyr_flying_tracker_l"
22 #define TRAIL_FX_FLY_R "player/fx_plyr_flying_tracker_r"
23 #define TRAIL_FX_FOOT_L_FAST "player/fx_plyr_footstep_tracker_lf"
24 #define TRAIL_FX_FOOT_R_FAST "player/fx_plyr_footstep_tracker_rf"
25 #define TRAIL_FX_FLY_L_FAST "player/fx_plyr_flying_tracker_lf"
26 #define TRAIL_FX_FLY_R_FAST "player/fx_plyr_flying_tracker_rf"
28 #precache( "client_fx", TRAIL_FX_FOOT_L );
29 #precache( "client_fx", TRAIL_FX_FOOT_R );
30 #precache( "client_fx", TRAIL_FX_FLY_L );
31 #precache( "client_fx", TRAIL_FX_FLY_R );
32 #precache( "client_fx", TRAIL_FX_FOOT_L_FAST );
33 #precache( "client_fx", TRAIL_FX_FOOT_R_FAST );
34 #precache( "client_fx", TRAIL_FX_FLY_L_FAST );
35 #precache( "client_fx", TRAIL_FX_FLY_R_FAST );
47 level.killTrackerFXEnable =
true;
50 level.sitrepscan1_enable = GetDvarInt(
"scr_sitrepscan1_enable", 2 );
51 level.sitrepscan1_setoutline = GetDvarInt(
"scr_sitrepscan1_setoutline", 1 );
52 level.sitrepscan1_setsolid = GetDvarInt(
"scr_sitrepscan1_setsolid", 1 );
53 level.sitrepscan1_setlinewidth = GetDvarInt(
"scr_sitrepscan1_setlinewidth", 1 );
54 level.sitrepscan1_setradius = GetDvarInt(
"scr_sitrepscan1_setradius", 50000 );
55 level.sitrepscan1_setfalloff = GetDvarFloat(
"scr_sitrepscan1_setfalloff", .01 );
56 level.sitrepscan1_setdesat = GetDvarFloat(
"scr_sitrepscan1_setdesat", .4 );
58 level.sitrepscan2_enable = GetDvarInt(
"scr_sitrepscan2_enable", 2 );
59 level.sitrepscan2_setoutline = GetDvarInt(
"scr_sitrepscan2_setoutline", 10 );
60 level.sitrepscan2_setsolid = GetDvarInt(
"scr_sitrepscan2_setsolid", 0 );
61 level.sitrepscan2_setlinewidth = GetDvarInt(
"scr_sitrepscan2_setlinewidth", 1 );
62 level.sitrepscan2_setradius = GetDvarInt(
"scr_sitrepscan2_setradius", 50000 );
63 level.sitrepscan2_setfalloff = GetDvarFloat(
"scr_sitrepscan2_setfalloff", .01 );
64 level.sitrepscan2_setdesat = GetDvarFloat(
"scr_sitrepscan2_setdesat", .4 );
70 self endon (
"entityshutdown" );
73 self oed_sitrepscan_enable( level.sitrepscan1_enable );
74 self oed_sitrepscan_setoutline( level.sitrepscan1_setoutline );
75 self oed_sitrepscan_setsolid( level.sitrepscan1_setsolid );
76 self oed_sitrepscan_setlinewidth( level.sitrepscan1_setlinewidth );
77 self oed_sitrepscan_setradius( level.sitrepscan1_setradius );
78 self oed_sitrepscan_setfalloff( level.sitrepscan1_setfalloff );
79 self oed_sitrepscan_setdesat( level.sitrepscan1_setdesat );
81 self oed_sitrepscan_enable( level.sitrepscan2_enable, 1 );
82 self oed_sitrepscan_setoutline( level.sitrepscan2_setoutline, 1 );
83 self oed_sitrepscan_setsolid( level.sitrepscan2_setsolid, 1 );
84 self oed_sitrepscan_setlinewidth( level.sitrepscan2_setlinewidth, 1 );
85 self oed_sitrepscan_setradius( level.sitrepscan2_setradius, 1 );
86 self oed_sitrepscan_setfalloff( level.sitrepscan2_setfalloff, 1 );
87 self oed_sitrepscan_setdesat( level.sitrepscan2_setdesat, 1 );
92 function flying_callback( local_client_num, oldVal, newVal, bNewEnt, bInitialSnap, fieldName, bWasTimeJump )
111 if(
self != GetLocalPlayer( local_client_num ) )
121 self notify(
"perks_changed");
128 #define TRACKER_FX_FLY_HEIGHT GetDvarFloat( "perk_tracker_fx_fly_height", 0 )
129 #define TRACKER_FX_FLY_DISTANCE 32
130 #define TRACKER_FX_FLY_DISTANCE_SQ ( TRACKER_FX_FLY_DISTANCE * TRACKER_FX_FLY_DISTANCE )
132 #define TRACKER_FX_FOOT_HEIGHT GetDvarFloat( "perk_tracker_fx_foot_height", 0 )
133 #define TRACKER_FX_FOOT_DISTANCE 32
134 #define TRACKER_FX_FOOT_DISTANCE_SQ ( TRACKER_FX_FOOT_DISTANCE * TRACKER_FX_FOOT_DISTANCE )
136 #define TRACKER_STATIONARY_VEL 1
137 #define TRACKER_STATIONARY_VEL_SQ ( TRACKER_STATIONARY_VEL * TRACKER_STATIONARY_VEL )
139 #define TRACKER_KILLCAM_COUNT 20
140 #define TRACKER_KILLCAM_TIME 5000
142 #define TRACKER_KILLFX_COUNT 40 // keep the handle to the last 40 tracker fx
143 #define TRACKER_KILLFX_TIME 5000 // handle fx older than this are ignored
148 entities = GetEntArray( local_client_num );
149 if (IsDefined(entities))
151 foreach( ent
in entities )
153 if ( ent IsPlayer() )
155 players[players.size] = ent;
164 self endon(
"death" );
165 self endon (
"monitor_tracker_existing_players" );
166 self notify(
"monitor_tracker_existing_players" );
167 players = GetPlayers( local_client_num );
168 foreach( player
in players )
170 if ( isdefined( player ) && player !=
self )
180 self notify(
"monitor_tracker_perk_killcam" + local_client_num );
181 self endon(
"monitor_tracker_perk_killcam" + local_client_num );
182 self endon(
"entityshutdown" );
184 predictedLocalPlayer = getlocalplayer( local_client_num );
185 if ( !isdefined( level.trackerSpecialtySelf ) )
187 level.trackerSpecialtySelf = [];
189 level.trackerSpecialtyCounter = 0;
192 if ( !isdefined( level.trackerSpecialtySelf[local_client_num] ) )
194 level.trackerSpecialtySelf[local_client_num] = [];
197 if ( predictedLocalPlayer GetInKillcam( local_client_num ) )
199 nonPredictedLocalPlayer = GetNonPredictedLocalPlayer( local_client_num );
200 if ( predictedLocalPlayer HasPerk( local_client_num,
"specialty_tracker" ) )
203 for(count = 0; count < level.trackerSpecialtySelf[local_client_num].size; count++ )
207 positionAndRotationStruct = level.trackerSpecialtySelf[local_client_num][count];
220 if ( isdefined ( positionAndRotationStruct ) )
222 positionAndRotationStruct.time = getServerTime( local_client_num );
224 level.trackerSpecialtySelf[local_client_num][level.trackerSpecialtyCounter] = positionAndRotationStruct;
225 level.trackerSpecialtyCounter++;
228 level.trackerSpecialtyCounter = 0;
237 self notify(
"monitor_tracker_perk" );
238 self endon(
"monitor_tracker_perk" );
239 self endon(
"death" );
240 self endon(
"disconnect" );
241 self endon(
"entityshutdown" );
244 self.tracker_flying =
false;
245 self.tracker_last_pos =
self.origin;
250 while(IsDefined(
self))
254 watcher = GetLocalPlayer( local_client_num );
256 if ( !isdefined( watcher ) ||
self == watcher )
259 if ( IsDefined( watcher ) && watcher HasPerk( local_client_num,
"specialty_tracker" ) )
261 friend =
self isFriendly( local_client_num,
true );
264 if( !isDefined(
self._isClone ) || !
self._isClone )
273 if ( !
friend && IsAlive(
self) && camoOff )
276 if ( isdefined( positionAndRotationStruct ) )
283 self.tracker_flying =
false;
291 handle = playFX( local_client_num, positionAndRotationStruct.fx, positionAndRotationStruct.pos, positionAndRotationStruct.fwd, positionAndRotationStruct.up );
298 if ( handle && isdefined(
self.killTrackerFX ) )
302 killFXStruct = SpawnStruct();
304 killFXStruct.handle = handle;
306 index =
self.killTrackerFX.index;
313 self.killTrackerFX.array[index] = killFXStruct;
314 self.killTrackerFX.index = index + 1;
320 self endon(
"disconnect" );
322 if ( !
IS_TRUE( level.killTrackerFXEnable ) )
327 predictedLocalPlayer = getlocalplayer( local_client_num );
329 if ( predictedLocalPlayer ==
self )
334 if ( isdefined(
self.killTrackerFX ) )
336 self.killTrackerFX.array = [];
337 self.killTrackerFX.index = 0;
338 self.killTrackerFX = undefined;
341 killTrackerFX = SpawnStruct();
342 killTrackerFX.array = [];
343 killTrackerFX.index = 0;
345 self.killTrackerFX = killTrackerFX;
347 self waittill(
"entityshutdown" );
351 foreach( killFXStruct
in killTrackerFX.array )
355 KillFX( local_client_num, killFXStruct.handle );
359 killTrackerFX.array = [];
360 killTrackerFX.index = 0;
361 killTrackerFX = undefined;
366 positionAndRotation = undefined;
372 playFastFX = player hasperk( local_client_num,
"specialty_trackerjammer" );
377 if (
IS_TRUE(
self.trailRightFoot ) )
404 if (
IS_TRUE(
self.trailRightFoot ) )
428 pos =
self.origin + offset;
429 fwd = AnglesToForward(
self.angles );
430 right = AnglesToRight(
self.angles );
431 up = AnglesToUp(
self.angles );
433 vel =
self getvelocity();
436 up = VectorCross(vel,right);
437 if ( LengthSquared( up ) < 0.0001 )
439 up = VectorCross(fwd, vel);
444 if(
self isplayer() &&
self isplayerwallrunning() )
446 if(
self isplayerwallrunningright() )
448 up = VectorCross( up, fwd );
452 up = VectorCross( fwd, up );
456 if ( !
self.tracker_flying )
458 self.tracker_flying =
true;
459 self.tracker_last_pos =
self.origin;
463 if ( DistanceSquared(
self.tracker_last_pos, pos ) > dist2 )
465 positionAndRotation = SpawnStruct();
466 positionAndRotation.fx = fx;
467 positionAndRotation.pos = pos;
468 positionAndRotation.fwd = fwd;
469 positionAndRotation.up = up;
471 self.tracker_last_pos =
self.origin;
473 if (
IS_TRUE(
self.trailRightFoot ) )
475 self.trailRightFoot =
false;
479 self.trailRightFoot =
true;
484 return positionAndRotation;
488 #define DETECT_NEARBY_ENEMIES_WAIT_TIME 0.05
489 #define DETECT_Z_THRESHOLD 50
490 #define DETECT_LOSE_Z_THRESHOLD 350
491 #define DETECT_RADIUS_NEAR 300
492 #define DETECT_LOSE_RADIUS_NEAR 350
493 #define DETECT_RADIUS 300
494 #define DETECT_LOSE_RADIUS 350
495 #define DETECT_INDICATOR_APPEAR_DELAY 0.05
496 #define DETECT_INDICATOR_LOST_DELAY 0.05
499 #define DETECT_FRONT_MASK ( 1 << 0 )
500 #define DETECT_BACK_MASK ( 1 << 1 )
501 #define DETECT_LEFT_MASK ( 1 << 2 )
502 #define DETECT_RIGHT_MASK ( 1 << 3 )
507 self endon(
"entityshutdown" );
509 controllerModel = GetUIModelForController( local_client_num );
510 sixthsenseModel = CreateUIModel( controllerModel,
"hudItems.sixthsense" );
512 enemyNearbyTime = 0.0;
514 previousEnemyDetectedBitField = 0;
516 SetUIModelValue( sixthsenseModel, 0 );
520 localPlayer = GetLocalPlayer( local_client_num );
522 if ( !( localPlayer IsPlayer() ) ||
523 ( localPlayer HasPerk( local_client_num,
"specialty_detectnearbyenemies" ) ==
false ) ||
524 ( localPlayer GetInKillcam( local_client_num ) ==
true || IsAlive( localPlayer ) ==
false ) )
526 SetUIModelValue( sixthsenseModel, 0 );
527 previousEnemyDetectedBitField = 0;
532 enemyNearbyFront =
false;
533 enemyNearbyBack =
false;
534 enemyNearbyLeft =
false;
535 enemyNearbyRight =
false;
536 enemyDetectedBitField = 0;
538 team = localPlayer.team;
539 innerDetect = getdvarint(
"specialty_detectnearbyenemies_inner", 1 );
540 outerDetect = getdvarint(
"specialty_detectnearbyenemies_outer", 1 );
541 zDetect = getdvarint(
"specialty_detectnearbyenemies_zthreshold", 1 );
543 localPlayerAnglesToForward = anglesToForward( localPlayer.Angles );
545 players = getplayers( local_client_num );
546 clones = getclones( local_client_num );
547 sixthSenseEnts = arraycombine( players, clones,
false,
false );
548 foreach( sixthSenseEnt
in sixthSenseEnts )
550 if ( sixthSenseEnt isfriendly( local_client_num,
true ) || sixthSenseEnt == localPlayer )
553 if( !isAlive( sixthSenseEnt ) )
556 distanceScalarSq = 1;
559 player = sixthSenseEnt;
560 if(
IS_TRUE( sixthSenseEnt._isClone ) )
562 player = sixthSenseEnt.owner;
565 if ( player isplayer() && player HasPerk( local_client_num,
"specialty_sixthsensejammer" ) )
567 distanceScalarSq = GetDvarFloat(
"specialty_sixthsensejammer_distance_scalar", 0.01 );
568 zScalarSq = GetDvarFloat(
"specialty_sixthsensejammer_z_scalar", 0.01 );
571 if ( previousEnemyDetectedBitField == 0 )
580 distCurrentSq = DistanceSquared( sixthSenseEnt.origin, localPlayer.origin );
581 zdistCurrent = sixthSenseEnt.origin[2] - localPlayer.origin[2];
582 zdistCurrentSq = zdistCurrent * zdistCurrent;
583 if ( distCurrentSq < distanceSq )
587 if ( previousEnemyDetectedBitField > 16 )
596 if ( zdistCurrentSq < zNearbyCheck && zDetect )
601 vector = sixthSenseEnt.origin - localPlayer.origin;
602 vector = ( vector[0], vector[1], 0 );
603 vectorFlat = vectorNormalize( vector );
604 cosAngle = VectorDot( vectorFlat, localPlayerAnglesToForward );
608 enemyDetectedBitField = enemyDetectedBitField | (
DETECT_FRONT_MASK * distanceMask );
611 else if ( cosAngle < -
COS_45 )
613 enemyDetectedBitField = enemyDetectedBitField | (
DETECT_BACK_MASK * distanceMask );
617 localPlayerAnglesToRight = anglesToRight( localPlayer.Angles );
618 cosAngle = VectorDot( vectorFlat, localPlayerAnglesToRight );
621 enemyDetectedBitField = enemyDetectedBitField | (
DETECT_LEFT_MASK * distanceMask );
625 enemyDetectedBitField = enemyDetectedBitField | (
DETECT_RIGHT_MASK * distanceMask );
631 if ( enemyDetectedBitField )
636 SetUIModelValue( sixthsenseModel, enemyDetectedBitField );
639 diff = enemyDetectedBitField ^ previousEnemyDetectedBitField;
640 if ( diff & enemyDetectedBitField )
644 self playsound (0,
"uin_sixth_sense_ping_on");
646 if ( diff & previousEnemyDetectedBitField )
653 previousEnemyDetectedBitField = enemyDetectedBitField;
662 SetUIModelValue( sixthsenseModel, 0 );
663 previousEnemyDetectedBitField = 0;
670 SetUIModelValue( sixthsenseModel, 0 );