1 #using scripts\codescripts\struct;
2 #using scripts\shared\array_shared;
3 #using scripts\shared\callbacks_shared;
4 #using scripts\shared\clientfield_shared;
5 #using scripts\shared\flagsys_shared;
6 #using scripts\shared\hud_util_shared;
7 #using scripts\shared\system_shared;
8 #using scripts\shared\util_shared;
9 #using scripts\shared\abilities\_ability_util;
11 #insert scripts\shared\weapons\antipersonnelguidance.gsh;
12 #insert scripts\shared\shared.gsh;
13 #insert scripts\shared\version.gsh;
15 #precache( "string", "MP_CANNOT_LOCKON_TO_TARGET" );
17 #namespace singlelockap_guidance;
19 #define MAX_SIMULTANEOUS_LOCKONS 1 //this number corresponds to a code define
30 self endon(
"disconnect" );
39 if (!IsDefined(
self.multiLockList))
41 self.multiLockList=[];
46 for(i=0;i<
self.multiLockList.size;i++)
48 if (whom.apTarget ==
self.multiLockList[i].apTarget)
50 self.multiLockList[i].apTarget notify(
"missile_unlocked" );
51 self notify(
"stop_sound"+whom.apSoundId );
52 self WeaponLockRemoveSlot(i);
53 ArrayRemoveValue(
self.multiLockList,whom,
false);
60 for(i=0;i<
self.multiLockList.size;i++)
62 self.multiLockList[i].apTarget notify(
"missile_unlocked" );
63 self notify(
"stop_sound"+
self.multiLockList[i].apSoundId );
65 self.multiLockList = [];
68 if (
self.multiLockList.size==0)
70 self StopRumble(
"stinger_lock_rumble" );
72 self WeaponLockRemoveSlot(-1);
74 if (IsDefined(weapon))
76 if (IsDefined(weapon.lockonSeekerSearchSound))
77 self StopLocalSound( weapon.lockonSeekerSearchSound );
78 if (IsDefined(weapon.lockonSeekerLockedSound))
79 self StopLocalSound( weapon.lockonSeekerLockedSound );
89 self endon(
"disconnect" );
90 self endon (
"death" );
94 self waittill(
"missile_fire", missile, weapon );
96 if ( weapon.lockonType ==
"AP Single" )
98 foreach(target
in self.multiLockList)
100 if( isdefined(target.apTarget) && target.apLockFinalized )
102 target.apTarget notify(
"stinger_fired_at_me", missile, weapon,
self );
111 self endon(
"disconnect" );
112 self endon (
"death" );
116 self waittill(
"weapon_change", weapon );
118 while ( weapon.lockonType ==
"AP Single" )
122 while( !(
self PlayerAds() == 1.0 ) )
126 currentWeapon =
self GetCurrentWeapon();
127 if ( currentWeapon.lockonType !=
"AP Single" )
141 while( (
self PlayerAds() == 1.0 ) )
146 self notify(
"ap_off" );
149 weapon =
self GetCurrentWeapon();
156 self endon(
"disconnect" );
157 self endon(
"death" );
158 self endon(
"ap_off" );
160 lockLength =
self getLockOnSpeed();
161 self.multiLockList = [];
178 foreach(target
in self.multiLockList)
180 if ( target.apLockFinalized )
195 inLockingState=
false;
200 for(i=0;i<
self.multiLockList.size;i++)
202 target=
self.multiLockList[i];
203 if ( target.apLocking )
215 timePassed = getTime() - target.apLockStartTime;
216 if ( timePassed < lockLength )
219 assert( isdefined( target.apTarget ) );
220 target.apLockFinalized =
true;
221 target.apLocking =
false;
222 target.apLockPending =
false;
223 self WeaponLockFinalize( target.apTarget, i );
224 self thread
SeekerSound( weapon.lockonSeekerLockedSound, weapon.lockonSeekerLockedSoundLoops, target.apSoundId );
225 target.apTarget notify(
"missile_lock",
self, weapon );
237 for(i=0;i<
self.multiLockList.size;i++)
239 target=
self.multiLockList[i];
240 if ( target.apLockPending )
250 target.apLockStartTime = getTime();
252 target.apLockFinalized =
false;
253 target.apLockPending =
false;
254 target.apLocking =
true;
256 self thread
SeekerSound( weapon.lockonSeekerSearchSound, weapon.lockonSeekerSearchSoundLoops, target.apSoundId );
273 if ( !IsDefined(bestTarget) &&
self.multiLockList.size==0 )
282 self WeaponLockStart(bestTarget.apTarget,
self.multiLockList.size);
283 self.multiLockList[
self.multiLockList.size] = bestTarget;
290 if( isdefined(
self.LockOnCanceledMessage ) )
291 self.LockOnCanceledMessage
destroy();
296 if( isdefined(
self.LockOnCanceledMessage ) )
299 self.LockOnCanceledMessage = newclienthudelem(
self );
300 self.LockOnCanceledMessage.fontScale = 1.25;
301 self.LockOnCanceledMessage.x = 0;
302 self.LockOnCanceledMessage.y = 50;
303 self.LockOnCanceledMessage.alignX =
"center";
304 self.LockOnCanceledMessage.alignY =
"top";
305 self.LockOnCanceledMessage.horzAlign =
"center";
306 self.LockOnCanceledMessage.vertAlign =
"top";
307 self.LockOnCanceledMessage.foreground =
true;
308 self.LockOnCanceledMessage.hidewhendead =
false;
309 self.LockOnCanceledMessage.hidewheninmenu =
true;
310 self.LockOnCanceledMessage.archived =
false;
311 self.LockOnCanceledMessage.alpha = 1.0;
312 self.LockOnCanceledMessage SetText( &
"MP_CANNOT_LOCKON_TO_TARGET" );
317 playerTargets = GetPlayers();
318 vehicleTargets = target_getArray();
319 targetsAll = GetAITeamArray();
320 targetsAll = ArrayCombine(targetsAll, playerTargets,
false,
false);
321 targetsAll = ArrayCombine(targetsAll, vehicleTargets,
false,
false);
324 for ( idx = 0; idx < targetsAll.size; idx++ )
326 if ( level.teamBased )
328 if ( isdefined(targetsAll[idx].team) && targetsAll[idx].team !=
self.team)
334 targetsValid[targetsValid.size] = targetsAll[idx];
343 if( isdefined( targetsAll[idx].owner ) &&
self != targetsAll[idx].owner )
347 targetsValid[targetsValid.size] = targetsAll[idx];
354 if ( targetsValid.size == 0 )
359 playerForward = AnglesToForward(
self GetPlayerAngles());
361 for (i=0;i<targetsValid.size;i++)
363 newitem=spawnstruct();
365 newitem.dot = VectorDot(playerForward,VectorNormalize(targetsValid[i].origin-
self.origin));
373 foreach(
lock in self.multiLockList)
375 if (
lock.apTarget == targetsValid[dot.index])
386 newEntry = spawnstruct();
387 newEntry.apTarget = targetsValid[dot.index];
388 newEntry.apLockStartTime = getTime();
389 newEntry.apLockPending =
true;
390 newEntry.apLocking =
false;
391 newEntry.apLockFinalized =
false;
392 newEntry.apLostSightlineTime = 0;
393 newEntry.apSoundId = RandomInt(
INT_MAX);
411 radius =
self getLockOnRadius();
412 return target_isincircle( target,
self, 65, radius );
417 radius = (
self getLockOnLossRadius());
418 return target_isincircle( target,
self, 65, radius );
423 if ( ! isdefined( ent ) )
427 if ( !IsAlive( ent ) )
437 self notify(
"stop_sound"+
id);
439 self endon (
"stop_sound"+
id );
440 self endon(
"disconnect" );
441 self endon (
"death" );
443 if (IsDefined(alias))
445 self PlayRumbleOnEntity(
"stinger_lock_rumble" );
446 time = SoundGetPlaybackTime(alias)*0.001;
449 self playLocalSound( alias );
453 self StopRumble(
"stinger_lock_rumble" );
459 eyePos =
self GetEye();
461 if ( !isdefined( target ) )
464 if ( !IsAlive( target ) )
467 pos = target GetShootAtPos();
470 passed = BulletTracePassed( eyePos, pos,
false, target, undefined,
true,
true );
475 pos = target GetCentroid();
478 passed = BulletTracePassed( eyePos, pos,
false, target, undefined,
true,
true );
484 passed = BulletTracePassed( eyePos, pos,
false, target, undefined,
true,
true );