Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.39 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include common_scripts\utility;
  3.  
  4. InitJavelinUsage()
  5. {
  6. self.javelinStage = undefined;
  7. self.javelinPoints = undefined;
  8. self.javelinNormals = undefined;
  9. self.javelinLockMisses = undefined;
  10. self.javelinTargetPoint = undefined;
  11. self.javelinTargetNormal = undefined;
  12. self.javelinLockStartTime = undefined;
  13. }
  14.  
  15.  
  16. ResetJavelinLocking()
  17. {
  18. if ( !IsDefined( self.javelinUseEntered ) )
  19. return;
  20. self.javelinUseEntered = undefined;
  21.  
  22. self notify( "stop_lockon_sound" );
  23.  
  24. self WeaponLockFree();
  25. self WeaponLockTargetTooClose( false );
  26. self WeaponLockNoClearance( false );
  27. self.currentlyLocking = false;
  28. self.currentlyLocked = false;
  29. self.javelinTarget = undefined;
  30.  
  31. self StopLocalSound( "javelin_clu_lock" );
  32. self StopLocalSound( "javelin_clu_aquiring_lock" );
  33.  
  34. InitJavelinUsage();
  35. }
  36.  
  37.  
  38. /#
  39. DrawStar( point, color )
  40. {
  41. Line( point + (10,0,0), point - (10,0,0), color );
  42. Line( point + (0,10,0), point - (0,10,0), color );
  43. Line( point + (0,0,10), point - (0,0,10), color );
  44. }
  45. #/
  46.  
  47.  
  48. EyeTraceForward()
  49. {
  50. origin = self GetEye();
  51. angles = self GetPlayerAngles();
  52. forward = AnglesToForward( angles );
  53. endpoint = origin + forward * 15000;
  54.  
  55. res = BulletTrace( origin, endpoint, false, undefined );
  56.  
  57. if ( res["surfacetype"] == "none" )
  58. return undefined;
  59. if ( res["surfacetype"] == "default" )
  60. return undefined;
  61.  
  62. ent = res["entity"];
  63. if ( IsDefined( ent ) )
  64. {
  65. if ( ent == level.ac130.planeModel )
  66. return undefined;
  67. }
  68.  
  69. results = [];
  70. results[0] = res["position"];
  71. results[1] = res["normal"];
  72. return results;
  73. }
  74.  
  75.  
  76. LockMissesReset()
  77. {
  78. self.javelinLockMisses = undefined;
  79. }
  80.  
  81.  
  82. LockMissesIncr()
  83. {
  84. if ( !IsDefined( self.javelinLockMisses ) )
  85. self.javelinLockMisses = 1;
  86. else
  87. self.javelinLockMisses++;
  88. }
  89.  
  90.  
  91. LockMissesPassedThreshold()
  92. {
  93. MAX_MISSES = 4;
  94.  
  95. if ( IsDefined( self.javelinLockMisses ) && (self.javelinLockMisses >= MAX_MISSES) )
  96. return true;
  97. return false;
  98. }
  99.  
  100.  
  101. TargetPointTooClose( targetPoint )
  102. {
  103. MY_MIN_DIST = 1100;
  104.  
  105. dist = Distance( self.origin, targetPoint );
  106. if ( dist < MY_MIN_DIST )
  107. return true;
  108.  
  109. return false;
  110. }
  111.  
  112.  
  113. LoopLocalSeekSound( alias, interval )
  114. {
  115. self endon ( "death" );
  116. self endon ( "disconnect" );
  117. self endon ( "stop_lockon_sound" );
  118.  
  119. for ( ;; )
  120. {
  121. self PlayLocalSound( alias );
  122. wait interval;
  123. }
  124. }
  125.  
  126.  
  127. TopAttackPasses( targPoint, targNormal )
  128. {
  129. origin = targPoint + (targNormal * 10.0);
  130. endpoint = origin + (0,0,2000);
  131.  
  132. result = BulletTrace( origin, endpoint, false, undefined );
  133.  
  134. if ( BulletTracePassed( origin, endpoint, false, undefined ) )
  135. return true;
  136. return false;
  137. }
  138.  
  139.  
  140. JavelinUsageLoop()
  141. {
  142. self endon("death");
  143. self endon("disconnect");
  144.  
  145. LOCK_LENGTH = 1150;
  146. GATHER_DELAY = 25;
  147. ADS_DELAY = 100;
  148. MAX_POINT_PEER_DIST = 400;
  149. POINTS_NEEDED_TO_START_LOCK = 12;
  150.  
  151. lastGatherTime = 0;
  152. lastOutOfADS = 0;
  153. self.javelinTarget = undefined;
  154.  
  155. InitJavelinUsage();
  156.  
  157. for( ;; )
  158. {
  159. wait 0.05;
  160.  
  161. debugDraw = false;
  162. if ( GetDVar( "missileDebugDraw" ) == "1" )
  163. debugDraw = true;
  164.  
  165. debugText = false;
  166. if ( GetDVar( "missileDebugText" ) == "1" )
  167. debugText = true;
  168.  
  169. weapon = self getCurrentWeapon();
  170. if ( !isSubStr( weapon, "javelin" ) || self isEMPed() )
  171. {
  172. ResetJavelinLocking();
  173. continue;
  174. }
  175. if ( self PlayerADS() < 0.95 )
  176. {
  177. lastOutOfADS = GetTime();
  178.  
  179. ResetJavelinLocking();
  180. continue;
  181. }
  182.  
  183. self.javelinUseEntered = true;
  184. if ( !IsDefined( self.javelinStage ) )
  185. self.javelinStage = 1;
  186.  
  187. if ( self.javelinStage == 1 ) // SCANNING: try to find a good point to lock to
  188. {
  189.  
  190. targets = GetTargetList();
  191. if ( targets.size != 0 )
  192. {
  193.  
  194. targetsInReticle = [];
  195. foreach ( target in targets )
  196. {
  197. insideReticle = self WorldPointInReticle_Circle( target.origin, 65, 40 );
  198. if ( insideReticle )
  199. targetsInReticle[targetsInReticle.size] = target;
  200. }
  201.  
  202. if ( targetsInReticle.size != 0 )
  203. {
  204.  
  205. sortedTargets = SortByDistance( targetsInReticle, self.origin );
  206.  
  207. if ( !( self VehicleLockSightTest( sortedTargets[0] ) ) )
  208. continue;
  209.  
  210. if ( debugText )
  211. PrintLn( "Javeling found a vehicle target to lock to." );
  212.  
  213. self.javelinTarget = sortedTargets[0];
  214.  
  215. if ( !isDefined( self.javelinLockStartTime ) )
  216. self.javelinLockStartTime = GetTime();
  217.  
  218. self.javelinStage = 2;
  219. self.javelinLostSightlineTime = 0;
  220.  
  221. self javelinLockVehicle( LOCK_LENGTH );
  222. self.javelinStage = 1;
  223. continue;
  224. }
  225.  
  226. }
  227.  
  228. if ( LockMissesPassedThreshold() )
  229. {
  230. ResetJavelinLocking();
  231. continue;
  232. }
  233.  
  234. timePassed = GetTime() - lastOutOfADS;
  235. if ( timePassed < ADS_DELAY )
  236. continue;
  237.  
  238. /#
  239. if ( debugDraw && IsDefined( self.javelinPoints ) )
  240. {
  241. foreach( javPoint in self.javelinPoints )
  242. DrawStar( javPoint, (0.8, 1.0, 0.8) );
  243. DrawStar( self.javelinPoints[self.javelinPoints.size - 1], (1, 1, 0.2) );
  244. DrawStar( AveragePoint( self.javelinPoints ), (0.2, 0.2, 1) );
  245. }
  246. #/
  247.  
  248. timePassed = GetTime() - lastGatherTime;
  249. if ( timePassed < GATHER_DELAY )
  250. continue;
  251. lastGatherTime = GetTime();
  252.  
  253. traceRes = (self EyeTraceForward());
  254. if ( !IsDefined( traceRes ) )
  255. {
  256. self LockMissesIncr();
  257. continue;
  258. }
  259.  
  260. if ( self TargetPointTooClose( traceRes[0] ) )
  261. {
  262. self WeaponLockTargetTooClose( true );
  263. continue;
  264. }
  265. else
  266. {
  267. self WeaponLockTargetTooClose( false );
  268. }
  269.  
  270. // make sure we haven't strayed too far
  271. if ( IsDefined( self.javelinPoints ) )
  272. {
  273. prevAvgPoint = AveragePoint( self.javelinPoints );
  274. dist = Distance( prevAvgPoint, traceRes[0] );
  275. //PrintLn( "[", self.javelinPoints.size, "] - Dist: ", dist );
  276.  
  277. if ( dist > MAX_POINT_PEER_DIST )
  278. {
  279. LockMissesIncr();
  280. continue;
  281. }
  282. }
  283. else
  284. {
  285. self.javelinPoints = [];
  286. self.javelinNormals = [];
  287. }
  288.  
  289. self.javelinPoints[self.javelinPoints.size] = traceRes[0];
  290. self.javelinNormals[self.javelinNormals.size] = traceRes[1];
  291.  
  292. self LockMissesReset();
  293. if ( self.javelinPoints.size < POINTS_NEEDED_TO_START_LOCK )
  294. continue;
  295.  
  296. // Go to stage 2:
  297. self.javelinTargetPoint = AveragePoint( self.javelinPoints );;
  298. self.javelinTargetNormal = AverageNormal( self.javelinNormals );;
  299. self.javelinLockMisses = undefined;
  300. self.javelinPoints = undefined;
  301. self.javelinNormals = undefined;
  302. self.javelinLockStartTime = GetTime();
  303.  
  304. self WeaponLockStart( self.javelinTargetPoint );
  305. self thread LoopLocalSeekSound( "javelin_clu_aquiring_lock", 0.6 );
  306.  
  307. self.javelinStage = 2;
  308. }
  309.  
  310. if ( self.javelinStage == 2 ) // LOCKING: complete lockon to point
  311. {
  312. /#
  313. if ( debugDraw )
  314. DrawStar( self.javelinTargetPoint, (0.5, 1.0, 0.6) );
  315. #/
  316.  
  317. insideReticle = self WorldPointInReticle_Circle( self.javelinTargetPoint, 65, 45 );
  318. if ( !insideReticle )
  319. {
  320. ResetJavelinLocking();
  321. continue;
  322. }
  323.  
  324. if ( self TargetPointTooClose( self.javelinTargetPoint ) )
  325. self WeaponLockTargetTooClose( true );
  326. else
  327. self WeaponLockTargetTooClose( false );
  328.  
  329. timePassed = getTime() - self.javelinLockStartTime;
  330. //PrintLn( "Locking [", timePassed, "]..." );
  331. if ( timePassed < LOCK_LENGTH )
  332. continue;
  333.  
  334. self WeaponLockFinalize( self.javelinTargetPoint, (0,0,0), true );
  335. self notify( "stop_lockon_sound" );
  336. self PlayLocalSound( "javelin_clu_lock" );
  337. self.javelinStage = 3;
  338. }
  339.  
  340. if ( self.javelinStage == 3 ) // LOCKED: try and hold it
  341. {
  342. /#
  343. if ( debugDraw )
  344. DrawStar( self.javelinTargetPoint, (0.1, 0.15, 1.0) );
  345. #/
  346.  
  347. insideReticle = self WorldPointInReticle_Circle( self.javelinTargetPoint, 65, 45 );
  348. if ( !insideReticle )
  349. {
  350. ResetJavelinLocking();
  351. continue;
  352. }
  353.  
  354. if ( self TargetPointTooClose( self.javelinTargetPoint ) )
  355. self WeaponLockTargetTooClose( true );
  356. else
  357. self WeaponLockTargetTooClose( false );
  358.  
  359. continue;
  360. }
  361. }
  362. }
  363.  
  364. GetTargetList()
  365. {
  366. targets = [];
  367.  
  368. if ( level.teamBased )
  369. {
  370. if ( IsDefined( level.chopper ) && ( level.chopper.team != self.team || level.chopper.owner == self ) ) ///check for teams
  371. targets[targets.size] = level.chopper;
  372.  
  373. if ( isDefined( level.harriers) )
  374. {
  375. foreach( harrier in level.harriers )
  376. {
  377. if ( isDefined( harrier ) && ( harrier.team != self.team || ( isDefined( harrier.owner ) && harrier.owner == self ) ) )
  378. targets[targets.size] = harrier;
  379. }
  380. }
  381.  
  382. if ( level.UAVModels[level.otherTeam[self.team]].size )
  383. {
  384. foreach ( UAV in level.UAVModels[level.otherTeam[self.team]] )
  385. targets[targets.size] = UAV;
  386. }
  387.  
  388. if ( isDefined(level.ac130player) && ( level.ac130player.team != self.team ) )
  389. targets[targets.size] = level.ac130.planeModel;
  390. }
  391. else
  392. {
  393. if ( IsDefined( level.chopper ) && ( level.chopper.owner != self ) ) ///check for teams
  394. targets[targets.size] = level.chopper;
  395.  
  396. if ( isDefined(level.ac130player) )
  397. targets[targets.size] = level.ac130;
  398.  
  399. if ( isDefined( level.harriers) )
  400. {
  401. foreach( harrier in level.harriers )
  402. {
  403. if ( isDefined( harrier ) )
  404. targets[targets.size] = harrier;
  405. }
  406. }
  407.  
  408. if ( level.UAVModels.size )
  409. {
  410. foreach ( ownerGuid, UAV in level.UAVModels )
  411. {
  412. if ( isDefined( UAV.owner ) && UAV.owner == self )
  413. continue;
  414.  
  415. targets[targets.size] = UAV;
  416. }
  417. }
  418. }
  419.  
  420. return targets;
  421. }
  422.  
  423.  
  424. DebugSightLine( start, end, passed )
  425. {
  426. /#
  427. if ( GetDVar( "missileDebugDraw" ) != "1" )
  428. return;
  429.  
  430. if ( passed )
  431. color = ( 0.3, 1.0, 0.3 );
  432. else
  433. color = ( 1.0, 0.2, 0.2 );
  434.  
  435. MY_OFFSET = ( 0, 0, 5 );
  436.  
  437. Line( start + MY_OFFSET, end, color );
  438. #/
  439. }
  440.  
  441. VehicleLockSightTest( target )
  442. {
  443. eyePos = self GetEye();
  444.  
  445. center = target GetPointInBounds( 0, 0, 0 );
  446. passed = BulletTracePassed( eyePos, center, false, target );
  447. DebugSightLine( eyePos, center, passed );
  448. if ( passed )
  449. return true;
  450.  
  451. front = target GetPointInBounds( 1, 0, 0 );
  452. passed = BulletTracePassed( eyePos, front, false, target );
  453. DebugSightLine( eyePos, front, passed );
  454. if ( passed )
  455. return true;
  456.  
  457. back = target GetPointInBounds( -1, 0, 0 );
  458. passed = BulletTracePassed( eyePos, back, false, target );
  459. DebugSightLine( eyePos, back, passed );
  460. if ( passed )
  461. return true;
  462.  
  463. return false;
  464. }
  465.  
  466. javelinLockVehicle( lockLength )
  467. {
  468. if ( self.javelinStage == 2 ) // locking on to a target
  469. {
  470. self WeaponLockStart( self.javelinTarget );
  471.  
  472. if ( !(self StillValidJavelinLock( self.javelinTarget ) ) )
  473. {
  474. ResetJavelinLocking();
  475. self.javelinLockStartTime = undefined;
  476. return;
  477. }
  478.  
  479. passed = SoftSightTest();
  480. if ( !passed )
  481. {
  482. self.javelinLockStartTime = undefined;
  483. return;
  484. }
  485.  
  486. if ( !isDefined( self.currentlyLocking ) || !self.currentlyLocking )
  487. {
  488. self thread LoopLocalSeekSound( "javelin_clu_aquiring_lock", 0.6 );
  489. self.currentlyLocking = true;
  490. }
  491.  
  492. timePassed = getTime() - self.javelinLockStartTime;
  493.  
  494. if ( timePassed < lockLength )
  495. return;
  496.  
  497. //strangely buggy with the moving target...
  498. //javTarg = eyeTraceForward();
  499. //if ( !isDefined( javTarg ) )
  500. // return;
  501.  
  502. //topAttack = TopAttackPasses( javTarg[0], javTarg[1] );
  503.  
  504. self WeaponLockFinalize( self.javelinTarget, (0,0,0), false );
  505.  
  506. self notify( "stop_lockon_sound" );
  507.  
  508. if ( !isDefined( self.currentlyLocked ) || !self.currentlyLocked )
  509. {
  510. self PlayLocalSound( "javelin_clu_lock" );
  511. self.currentlyLocked = true;
  512. }
  513.  
  514. self.javelinStage = 3;
  515. }
  516.  
  517. if ( self.javelinStage == 3 ) // target locked
  518. {
  519. passed = SoftSightTest();
  520. if ( !passed )
  521. return;
  522.  
  523. if ( !(self StillValidJavelinLock( self.javelinTarget ) ) )
  524. {
  525. ResetJavelinLocking();
  526. return;
  527. }
  528. }
  529. }
  530.  
  531.  
  532. StillValidJavelinLock( ent )
  533. {
  534. assert( IsDefined( self ) );
  535.  
  536. if ( !IsDefined( ent ) )
  537. return false;
  538. if ( !(self WorldPointInReticle_Circle( ent.origin, 65, 85 )) )
  539. return false;
  540.  
  541. return true;
  542. }
  543.  
  544.  
  545. SoftSightTest()
  546. {
  547. LOST_SIGHT_LIMIT = 500;
  548.  
  549. if ( self VehicleLockSightTest( self.javelinTarget ) )
  550. {
  551. self.javelinLostSightlineTime = 0;
  552. return true;
  553. }
  554.  
  555. if ( self.javelinLostSightlineTime == 0 )
  556. self.javelinLostSightlineTime = getTime();
  557.  
  558. timePassed = GetTime() - self.javelinLostSightlineTime;
  559.  
  560. if ( timePassed >= LOST_SIGHT_LIMIT )
  561. {
  562. ResetJavelinLocking();
  563. return false;
  564. }
  565.  
  566. return true;
  567. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement