Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
275
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.35 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5. init()
  6. {
  7. precacheString( &"MP_WAR_RADAR_ACQUIRED" );
  8. precacheString( &"MP_WAR_RADAR_ACQUIRED_ENEMY" );
  9. precacheString( &"MP_WAR_RADAR_EXPIRED" );
  10. precacheString( &"MP_WAR_RADAR_EXPIRED_ENEMY" );
  11.  
  12. precacheString( &"MP_WAR_COUNTER_RADAR_ACQUIRED" );
  13. precacheString( &"MP_WAR_COUNTER_RADAR_ACQUIRED_ENEMY" );
  14. precacheString( &"MP_WAR_COUNTER_RADAR_EXPIRED" );
  15. precacheString( &"MP_WAR_COUNTER_RADAR_EXPIRED_ENEMY" );
  16.  
  17. precacheModel( "vehicle_uav_static_mp" );
  18.  
  19. level.radarViewTime = 30; // time radar remains active
  20. level.uavBlockTime = 30; // this only seems to be used for the FFA version.
  21.  
  22. assert( level.radarViewTime > 7 );
  23. assert( level.uavBlockTime > 7 );
  24.  
  25. level.uav_fx[ "explode" ] = loadFx( "explosions/helicopter_explosion_cobra_low" );
  26.  
  27. level.killStreakFuncs["uav"] = ::tryUseUAV;
  28. level.killStreakFuncs["double_uav"] = ::tryUseDoubleUAV;
  29. level.killStreakFuncs["counter_uav"] = ::tryUseCounterUAV;
  30.  
  31. minimapOrigins = getEntArray( "minimap_corner", "targetname" );
  32. if ( miniMapOrigins.size )
  33. uavOrigin = maps\mp\gametypes\_spawnlogic::findBoxCenter( miniMapOrigins[0].origin, miniMapOrigins[1].origin );
  34. else
  35. uavOrigin = (0,0,0);
  36.  
  37. level.UAVRig = spawn( "script_model", uavOrigin );
  38. level.UAVRig setModel( "c130_zoomrig" );
  39. level.UAVRig.angles = (0,115,0);
  40. level.UAVRig hide();
  41.  
  42. level.UAVRig thread rotateUAVRig();
  43.  
  44. if ( level.teamBased )
  45. {
  46. level.radarMode["allies"] = "normal_radar";
  47. level.radarMode["axis"] = "normal_radar";
  48. level.activeUAVs["allies"] = 0;
  49. level.activeUAVs["axis"] = 0;
  50. level.activeCounterUAVs["allies"] = 0;
  51. level.activeCounterUAVs["axis"] = 0;
  52.  
  53. level.uavModels["allies"] = [];
  54. level.uavModels["axis"] = [];
  55. }
  56. else
  57. {
  58. level.radarMode = [];
  59. level.activeUAVs = [];
  60. level.activeCounterUAVs = [];
  61.  
  62. level.uavModels = [];
  63.  
  64. level thread onPlayerConnect();
  65. }
  66.  
  67. level thread UAVTracker();
  68. }
  69.  
  70.  
  71. onPlayerConnect()
  72. {
  73. for(;;)
  74. {
  75. level waittill( "connected", player );
  76.  
  77. level.activeUAVs[ player.guid ] = 0;
  78. level.activeCounterUAVs[ player.guid ] = 0;
  79.  
  80. level.radarMode[ player.guid ] = "normal_radar";
  81. }
  82. }
  83.  
  84. rotateUAVRig()
  85. {
  86. for (;;)
  87. {
  88. self rotateyaw( -360, 60 );
  89. wait ( 60 );
  90. }
  91. }
  92.  
  93.  
  94. launchUAV( owner, team, duration, isCounter )
  95. {
  96. UAVModel = spawn( "script_model", level.UAVRig getTagOrigin( "tag_origin" ) );
  97.  
  98. UAVModel setModel( "vehicle_uav_static_mp" );
  99.  
  100. UAVModel thread damageTracker( isCounter );
  101. UAVModel.team = team;
  102. UAVModel.owner = owner;
  103.  
  104. UAVModel thread handleIncomingStinger();
  105.  
  106. addUAVModel( UAVModel );
  107.  
  108. zOffset = randomIntRange( 3000, 5000 );
  109.  
  110. angle = randomInt( 360 );
  111. radiusOffset = randomInt( 2000 ) + 5000;
  112.  
  113. xOffset = cos( angle ) * radiusOffset;
  114. yOffset = sin( angle ) * radiusOffset;
  115.  
  116. angleVector = vectorNormalize( (xOffset,yOffset,zOffset) );
  117. angleVector = vector_multiply( angleVector, randomIntRange( 6000, 7000 ) );
  118.  
  119. UAVModel linkTo( level.UAVRig, "tag_origin", angleVector, (0,angle - 90,0) );
  120.  
  121. UAVModel thread updateUAVModelVisibility();
  122.  
  123. if ( isCounter )
  124. UAVModel addActiveCounterUAV();
  125. else
  126. UAVModel addActiveUAV();
  127.  
  128. level notify ( "uav_update" );
  129.  
  130. UAVModel waittill_notify_or_timeout_hostmigration_pause( "death", duration - 7 );
  131.  
  132. if ( UAVModel.health <= 0 )
  133. {
  134. forward = vector_multiply( anglesToRight( UAVModel.angles ), 200 );
  135. playFx ( level.uav_fx[ "explode" ], UAVModel.origin, forward );
  136. }
  137. else
  138. {
  139. UAVModel unlink();
  140.  
  141. destPoint = UAVModel.origin + vector_multiply( anglestoforward( UAVModel.angles ), 20000 );
  142. UAVModel moveTo( destPoint, 60 );
  143. PlayFXOnTag( level._effect[ "ac130_engineeffect" ] , UAVModel, "tag_origin" );
  144.  
  145. UAVModel waittill_notify_or_timeout_hostmigration_pause( "death", 3 );
  146.  
  147. UAVModel moveTo( destPoint, 4, 4, 0.0 );
  148.  
  149. UAVModel waittill_notify_or_timeout_hostmigration_pause( "death", 4 );
  150. }
  151.  
  152. if ( isCounter )
  153. UAVModel removeActiveCounterUAV();
  154. else
  155. UAVModel removeActiveUAV();
  156.  
  157. UAVModel delete();
  158. removeUAVModel( UAVModel );
  159.  
  160. level notify ( "uav_update" );
  161. }
  162.  
  163.  
  164. waittill_notify_or_timeout_hostmigration_pause( msg, timer )
  165. {
  166. self endon( msg );
  167.  
  168. maps\mp\gametypes\_hostmigration::waitLongDurationWithHostMigrationPause( timer );
  169. }
  170.  
  171.  
  172. updateUAVModelVisibility()
  173. {
  174. self endon ( "death" );
  175.  
  176. for ( ;; )
  177. {
  178. level waittill_either ( "joined_team", "uav_update" );
  179.  
  180. self hide();
  181. foreach ( player in level.players )
  182. {
  183. if ( level.teamBased )
  184. {
  185. if ( player.team != self.team )
  186. self showToPlayer( player );
  187. }
  188. else
  189. {
  190. if ( isDefined( self.owner ) && player == self.owner )
  191. continue;
  192.  
  193. self showToPlayer( player );
  194. }
  195. }
  196. }
  197. }
  198.  
  199.  
  200. damageTracker( isCounterUAV )
  201. {
  202. level endon ( "game_ended" );
  203.  
  204. self setCanDamage( true );
  205. self.maxhealth = 700;
  206. self.health = self.maxhealth;
  207.  
  208. for ( ;; )
  209. {
  210. self waittill ( "damage", damage, attacker, direction_vec, point, sMeansOfDeath );
  211.  
  212. if ( !isPlayer( attacker ) )
  213. {
  214. if ( !isDefined( self ) )
  215. return;
  216.  
  217. continue;
  218. }
  219.  
  220. attacker maps\mp\gametypes\_damagefeedback::updateDamageFeedback( "" );
  221.  
  222. if ( attacker _hasPerk( "specialty_armorpiercing" ) && isDefined( self ) )
  223. {
  224. damageAdd = damage*level.armorPiercingMod;
  225. self.health -= int(damageAdd);
  226. }
  227.  
  228. if ( !isDefined( self ) )
  229. {
  230. if ( isPlayer( attacker ) && (!isDefined(self.owner) || attacker != self.owner) )
  231. {
  232. if ( isCounterUAV )
  233. thread teamPlayerCardSplash( "callout_destroyed_counter_uav", attacker );
  234. else
  235. thread teamPlayerCardSplash( "callout_destroyed_uav", attacker );
  236.  
  237. thread maps\mp\gametypes\_missions::vehicleKilled( self.owner, self, undefined, attacker, damage, sMeansOfDeath );
  238. attacker thread maps\mp\gametypes\_rank::giveRankXP( "kill", 50 );
  239. attacker notify( "destroyed_killstreak" );
  240. }
  241. return;
  242. }
  243. }
  244. }
  245.  
  246.  
  247. tryUseUAV( lifeId )
  248. {
  249. return useUAV( "uav" );
  250. }
  251.  
  252.  
  253. tryUseDoubleUAV( lifeId )
  254. {
  255. return useUAV( "double_uav" );
  256. }
  257.  
  258.  
  259. tryUseCounterUAV( lifeId )
  260. {
  261. return useUAV( "counter_uav" );
  262. }
  263.  
  264.  
  265. useUAV( uavType )
  266. {
  267. self maps\mp\_matchdata::logKillstreakEvent( uavType, self.origin );
  268.  
  269. team = self.pers["team"];
  270. useTime = level.radarViewTime;
  271.  
  272. level thread launchUAV( self, team, useTime, uavType == "counter_uav" );
  273.  
  274. if ( uavType == "counter_uav" )
  275. self notify( "used_counter_uav" );
  276. else
  277. self notify( "used_uav" );
  278.  
  279. return true;
  280. }
  281.  
  282.  
  283. UAVTracker()
  284. {
  285. level endon ( "game_ended" );
  286.  
  287. for ( ;; )
  288. {
  289. level waittill ( "uav_update" );
  290.  
  291. if ( level.teamBased )
  292. {
  293. updateTeamUAVStatus( "allies" );
  294. updateTeamUAVStatus( "axis" );
  295. }
  296. else
  297. {
  298. updatePlayersUAVStatus();
  299. }
  300. }
  301. }
  302.  
  303.  
  304. updateTeamUAVStatus( team )
  305. {
  306. activeUAVs = level.activeUAVs[team];
  307. activeCounterUAVs = level.activeCounterUAVs[level.otherTeam[team]];
  308.  
  309. if ( !activeCounterUAVs )
  310. unblockTeamRadar( team );
  311. else
  312. blockTeamRadar( team );
  313.  
  314. if ( !activeUAVs )
  315. {
  316. setTeamRadarWrapper( team, 0 );
  317. return;
  318. }
  319.  
  320. if ( activeUAVs > 1 )
  321. level.radarMode[team] = "fast_radar";
  322. else
  323. level.radarMode[team] = "normal_radar";
  324.  
  325. updateTeamUAVType();
  326. setTeamRadarWrapper( team, 1 );
  327. }
  328.  
  329.  
  330. updatePlayersUAVStatus()
  331. {
  332. totalActiveCounterUAVs = 0;
  333. counterUAVPlayer = undefined;
  334.  
  335. foreach ( player in level.players )
  336. {
  337. activeUAVs = level.activeUAVs[ player.guid ];
  338. activeCounterUAVs = level.activeCounterUAVs[ player.guid ];
  339.  
  340. if ( activeCounterUAVs )
  341. {
  342. totalActiveCounterUAVs++;
  343. counterUAVPlayer = player;
  344. }
  345.  
  346. if ( !activeUAVs )
  347. {
  348. player.hasRadar = false;
  349. player.radarMode = "normal_radar";
  350. continue;
  351. }
  352.  
  353. if ( activeUAVs > 1 )
  354. player.radarMode = "fast_radar";
  355. else
  356. player.radarMode = "normal_radar";
  357.  
  358. player.hasRadar = true;
  359. }
  360.  
  361. foreach ( player in level.players )
  362. {
  363. if ( !totalActiveCounterUAVs )
  364. {
  365. player.isRadarBlocked = false;
  366. continue;
  367. }
  368.  
  369. if ( totalActiveCounterUAVs == 1 && player == counterUAVPlayer )
  370. player.isRadarBlocked = false;
  371. else
  372. player.isRadarBlocked = true;
  373. }
  374. }
  375.  
  376.  
  377. blockPlayerUAV()
  378. {
  379. self endon ( "disconnect" );
  380.  
  381. self notify ( "blockPlayerUAV" );
  382. self endon ( "blockPlayerUAV" );
  383.  
  384. self.isRadarBlocked = true;
  385.  
  386. wait ( level.uavBlockTime );
  387.  
  388. self.isRadarBlocked = false;
  389.  
  390. //self iPrintLn( &"MP_WAR_COUNTER_RADAR_EXPIRED" );
  391. }
  392.  
  393.  
  394. updateTeamUAVType()
  395. {
  396. foreach ( player in level.players )
  397. {
  398. if ( player.team == "spectator" )
  399. continue;
  400.  
  401. player.radarMode = level.radarMode[player.team];
  402. }
  403. }
  404.  
  405.  
  406.  
  407. usePlayerUAV( doubleUAV, useTime )
  408. {
  409. level endon("game_ended");
  410. self endon("disconnect");
  411.  
  412. self notify ( "usePlayerUAV" );
  413. self endon ( "usePlayerUAV" );
  414.  
  415. if ( doubleUAV )
  416. self.radarMode = "fast_radar";
  417. else
  418. self.radarMode = "normal_radar";
  419.  
  420. self.hasRadar = true;
  421.  
  422. wait ( useTime );
  423.  
  424. self.hasRadar = false;
  425.  
  426. //self iPrintLn( &"MP_WAR_RADAR_EXPIRED" );
  427. }
  428.  
  429.  
  430. setTeamRadarWrapper( team, value )
  431. {
  432. setTeamRadar( team, value );
  433. level notify( "radar_status_change", team );
  434. }
  435.  
  436.  
  437.  
  438. handleIncomingStinger()
  439. {
  440. level endon ( "game_ended" );
  441. self endon ( "death" );
  442.  
  443. for ( ;; )
  444. {
  445. level waittill ( "stinger_fired", player, missile, lockTarget );
  446.  
  447. if ( !IsDefined( lockTarget ) || (lockTarget != self) )
  448. continue;
  449.  
  450. missile thread stingerProximityDetonate( lockTarget, player );
  451. }
  452. }
  453.  
  454.  
  455. stingerProximityDetonate( targetEnt, player )
  456. {
  457. self endon ( "death" );
  458.  
  459. minDist = distance( self.origin, targetEnt GetPointInBounds( 0, 0, 0 ) );
  460. lastCenter = targetEnt GetPointInBounds( 0, 0, 0 );
  461.  
  462. for ( ;; )
  463. {
  464. // UAV already destroyed
  465. if ( !isDefined( targetEnt ) )
  466. center = lastCenter;
  467. else
  468. center = targetEnt GetPointInBounds( 0, 0, 0 );
  469.  
  470. lastCenter = center;
  471.  
  472. curDist = distance( self.origin, center );
  473.  
  474. if ( curDist < minDist )
  475. minDist = curDist;
  476.  
  477. if ( curDist > minDist )
  478. {
  479. if ( curDist > 1536 )
  480. return;
  481.  
  482. radiusDamage( self.origin, 1536, 600, 600, player );
  483. playFx( level.stingerFXid, self.origin );
  484.  
  485. //self playSound( "remotemissile_explode" );
  486. self hide();
  487.  
  488. self notify("deleted");
  489. wait ( 0.05 );
  490. self delete();
  491. player notify( "killstreak_destroyed" );
  492. }
  493.  
  494. wait ( 0.05 );
  495. }
  496. }
  497.  
  498.  
  499. addUAVModel( UAVModel )
  500. {
  501. if ( level.teamBased )
  502. level.UAVModels[UAVModel.team][level.UAVModels[UAVModel.team].size] = UAVModel;
  503. else
  504. level.UAVModels[UAVModel.owner.guid + "_" + getTime()] = UAVModel;
  505. }
  506.  
  507.  
  508. removeUAVModel( UAVModel )
  509. {
  510. UAVModels = [];
  511.  
  512. if ( level.teamBased )
  513. {
  514. team = UAVModel.team;
  515.  
  516. foreach ( uavModel in level.UAVModels[team] )
  517. {
  518. if ( !isDefined( uavModel ) )
  519. continue;
  520.  
  521. UAVModels[UAVModels.size] = uavModel;
  522. }
  523.  
  524. level.UAVModels[team] = UAVModels;
  525. }
  526. else
  527. {
  528. foreach ( uavModel in level.UAVModels )
  529. {
  530. if ( !isDefined( uavModel ) )
  531. continue;
  532.  
  533. UAVModels[UAVModels.size] = uavModel;
  534. }
  535.  
  536. level.UAVModels = UAVModels;
  537. }
  538. }
  539.  
  540.  
  541. addActiveUAV()
  542. {
  543. if ( level.teamBased )
  544. level.activeUAVs[self.team]++;
  545. else
  546. level.activeUAVs[self.owner.guid]++;
  547. /*
  548. if ( level.teamBased )
  549. {
  550. foreach ( player in level.players )
  551. {
  552. if ( player.team == self.team )
  553. player iPrintLn( &"MP_WAR_RADAR_ACQUIRED", self.owner, level.radarViewTime );
  554. else if ( player.team == level.otherTeam[self.team] )
  555. player iPrintLn( &"MP_WAR_RADAR_ACQUIRED_ENEMY", level.radarViewTime );
  556. }
  557. }
  558. else
  559. {
  560. foreach ( player in level.players )
  561. {
  562. if ( player == self.owner )
  563. player iPrintLn( &"MP_WAR_RADAR_ACQUIRED", self.owner, level.radarViewTime );
  564. else
  565. player iPrintLn( &"MP_WAR_RADAR_ACQUIRED_ENEMY", level.radarViewTime );
  566. }
  567. }
  568. */
  569. }
  570.  
  571.  
  572. addActiveCounterUAV()
  573. {
  574. if ( level.teamBased )
  575. level.activeCounterUAVs[self.team]++;
  576. else
  577. level.activeCounterUAVs[self.owner.guid]++;
  578. /*
  579. if ( level.teamBased )
  580. {
  581. foreach ( player in level.players )
  582. {
  583. if ( player.team == self.team )
  584. player iPrintLn( &"MP_WAR_COUNTER_RADAR_ACQUIRED", self.owner, level.uavBlockTime );
  585. else if ( player.team == level.otherTeam[self.team] )
  586. player iPrintLn( &"MP_WAR_COUNTER_RADAR_ACQUIRED_ENEMY", level.uavBlockTime );
  587. }
  588. }
  589. else
  590. {
  591. foreach ( player in level.players )
  592. {
  593. if ( player == self.owner )
  594. player iPrintLn( &"MP_WAR_COUNTER_RADAR_ACQUIRED", self.owner, level.uavBlockTime );
  595. else
  596. player iPrintLn( &"MP_WAR_COUNTER_RADAR_ACQUIRED_ENEMY", level.uavBlockTime );
  597. }
  598. }
  599. */
  600. }
  601.  
  602.  
  603. removeActiveUAV()
  604. {
  605. if ( level.teamBased )
  606. {
  607. level.activeUAVs[self.team]--;
  608.  
  609. if ( !level.activeUAVs[self.team] )
  610. {
  611. //printOnTeam( &"MP_WAR_RADAR_EXPIRED", self.team );
  612. //printOnTeam( &"MP_WAR_RADAR_EXPIRED_ENEMY", level.otherTeam[self.team] );
  613. }
  614. }
  615. else if ( isDefined( self.owner ) )
  616. {
  617. level.activeUAVs[self.owner.guid]--;
  618. }
  619. }
  620.  
  621.  
  622. removeActiveCounterUAV()
  623. {
  624. if ( level.teamBased )
  625. {
  626. level.activeCounterUAVs[self.team]--;
  627.  
  628. if ( !level.activeCounterUAVs[self.team] )
  629. {
  630. //printOnTeam( &"MP_WAR_COUNTER_RADAR_EXPIRED", self.team );
  631. //printOnTeam( &"MP_WAR_COUNTER_RADAR_EXPIRED_ENEMY", level.otherTeam[self.team] );
  632. }
  633. }
  634. else if ( isDefined( self.owner ) )
  635. {
  636. level.activeCounterUAVs[self.owner.guid]--;
  637. }
  638. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement