Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
651
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.84 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. #include common_scripts\utility;
  4.  
  5. KILLSTREAK_STRING_TABLE = "mp/killstreakTable.csv";
  6.  
  7. init()
  8. {
  9. // &&1 Kill Streak!
  10. precacheString( &"MP_KILLSTREAK_N" );
  11. precacheString( &"MP_NUKE_ALREADY_INBOUND" );
  12. precacheString( &"MP_UNAVILABLE_IN_LASTSTAND" );
  13. precacheString( &"MP_UNAVAILABLE_WHEN_EMP" );
  14. precacheString( &"MP_UNAVAILABLE_USING_TURRET" );
  15. precacheString( &"MP_UNAVAILABLE_WHEN_INCAP" );
  16. precacheString( &"MP_HELI_IN_QUEUE" );
  17.  
  18. initKillstreakData();
  19.  
  20. level.killstreakFuncs = [];
  21. level.killstreakSetupFuncs = [];
  22. level.killstreakWeapons = [];
  23.  
  24. level.killStreakMod = 0;
  25.  
  26. thread maps\mp\killstreaks\_ac130::init();
  27. thread maps\mp\killstreaks\_remotemissile::init();
  28. thread maps\mp\killstreaks\_uav::init();
  29. thread maps\mp\killstreaks\_airstrike::init();
  30. thread maps\mp\killstreaks\_airdrop::init();
  31. thread maps\mp\killstreaks\_helicopter::init();
  32. thread maps\mp\killstreaks\_autosentry::init();
  33. thread maps\mp\killstreaks\_tank::init();
  34. thread maps\mp\killstreaks\_emp::init();
  35. thread maps\mp\killstreaks\_nuke::init();
  36.  
  37. level.killstreakRoundDelay = getIntProperty( "scr_game_killstreakdelay", 8 );
  38.  
  39. level thread onPlayerConnect();
  40. }
  41.  
  42.  
  43. initKillstreakData()
  44. {
  45. for ( i = 1; true; i++ )
  46. {
  47. retVal = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 1 );
  48. if ( !isDefined( retVal ) || retVal == "" )
  49. break;
  50.  
  51. streakRef = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 1 );
  52. assert( streakRef != "" );
  53.  
  54. streakUseHint = tableLookupIString( KILLSTREAK_STRING_TABLE, 0, i, 6 );
  55. assert( streakUseHint != &"" );
  56. precacheString( streakUseHint );
  57.  
  58. streakEarnDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 8 );
  59. assert( streakEarnDialog != "" );
  60. game[ "dialog" ][ streakRef ] = streakEarnDialog;
  61.  
  62. streakAlliesUseDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 9 );
  63. assert( streakAlliesUseDialog != "" );
  64. game[ "dialog" ][ "allies_friendly_" + streakRef + "_inbound" ] = "use_" + streakAlliesUseDialog;
  65. game[ "dialog" ][ "allies_enemy_" + streakRef + "_inbound" ] = "enemy_" + streakAlliesUseDialog;
  66.  
  67. streakAxisUseDialog = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 10 );
  68. assert( streakAxisUseDialog != "" );
  69. game[ "dialog" ][ "axis_friendly_" + streakRef + "_inbound" ] = "use_" + streakAxisUseDialog;
  70. game[ "dialog" ][ "axis_enemy_" + streakRef + "_inbound" ] = "enemy_" + streakAxisUseDialog;
  71.  
  72. streakWeapon = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 12 );
  73. precacheItem( streakWeapon );
  74.  
  75. streakPoints = int( tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 13 ) );
  76. assert( streakPoints != 0 );
  77. maps\mp\gametypes\_rank::registerScoreInfo( "killstreak_" + streakRef, streakPoints );
  78.  
  79. streakShader = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 14 );
  80. precacheShader( streakShader );
  81.  
  82. streakShader = tableLookup( KILLSTREAK_STRING_TABLE, 0, i, 15 );
  83. if ( streakShader != "" )
  84. precacheShader( streakShader );
  85. }
  86. }
  87.  
  88.  
  89. onPlayerConnect()
  90. {
  91. for ( ;; )
  92. {
  93. level waittill( "connected", player );
  94.  
  95. if( !isDefined ( player.pers[ "killstreaks" ] ) )
  96. player.pers[ "killstreaks" ] = [];
  97.  
  98. player.lifeId = 0;
  99.  
  100. if ( isDefined( player.pers["deaths"] ) )
  101. player.lifeId = player.pers["deaths"];
  102.  
  103. player VisionSetMissilecamForPlayer( game["thermal_vision"] );
  104.  
  105. player thread onPlayerSpawned();
  106. player thread onPlayerChangeKit();
  107. }
  108. }
  109.  
  110.  
  111. onPlayerSpawned()
  112. {
  113. self endon( "disconnect" );
  114.  
  115. for ( ;; )
  116. {
  117. self waittill( "spawned_player" );
  118. self thread killstreakUseWaiter();
  119. self thread waitForChangeTeam();
  120.  
  121. self giveOwnedKillstreakItem( true );
  122. }
  123. }
  124.  
  125. onPlayerChangeKit()
  126. {
  127. self endon( "disconnect" );
  128.  
  129. for ( ;; )
  130. {
  131. self waittill( "changed_kit" );
  132. self giveOwnedKillstreakItem();
  133. }
  134. }
  135.  
  136.  
  137. waitForChangeTeam()
  138. {
  139. self endon ( "disconnect" );
  140.  
  141. self notify ( "waitForChangeTeam" );
  142. self endon ( "waitForChangeTeam" );
  143.  
  144. for ( ;; )
  145. {
  146. self waittill ( "joined_team" );
  147. clearKillstreaks();
  148. }
  149. }
  150.  
  151.  
  152. isRideKillstreak( streakName )
  153. {
  154. switch( streakName )
  155. {
  156. case "helicopter_minigun":
  157. case "helicopter_mk19":
  158. case "ac130":
  159. case "predator_missile":
  160. return true;
  161.  
  162. default:
  163. return false;
  164. }
  165. }
  166.  
  167. isCarryKillstreak( streakName )
  168. {
  169. switch( streakName )
  170. {
  171. case "sentry":
  172. case "sentry_gl":
  173. return true;
  174.  
  175. default:
  176. return false;
  177. }
  178. }
  179.  
  180.  
  181. deadlyKillstreak( streakName )
  182. {
  183. switch ( streakName )
  184. {
  185. case "predator_missile":
  186. case "precision_airstrike":
  187. case "harrier_airstrike":
  188. //case "helicopter":
  189. //case "helicopter_flares":
  190. case "stealth_airstrike":
  191. //case "helicopter_minigun":
  192. case "ac130":
  193. return true;
  194. }
  195.  
  196. return false;
  197. }
  198.  
  199.  
  200. killstreakUsePressed()
  201. {
  202. streakName = self.pers["killstreaks"][0].streakName;
  203. lifeId = self.pers["killstreaks"][0].lifeId;
  204. isEarned = self.pers["killstreaks"][0].earned;
  205. awardXp = self.pers["killstreaks"][0].awardXp;
  206.  
  207. assert( isDefined( streakName ) );
  208. assert( isDefined( level.killstreakFuncs[ streakName ] ) );
  209.  
  210. if ( !self isOnGround() && ( isRideKillstreak( streakName ) || isCarryKillstreak( streakName ) ) )
  211. return ( false );
  212.  
  213. if ( self isUsingRemote() )
  214. return ( false );
  215.  
  216. if ( isDefined( self.selectingLocation ) )
  217. return ( false );
  218.  
  219. if ( deadlyKillstreak( streakName ) && level.killstreakRoundDelay && getGametypeNumLives() )
  220. {
  221. if ( level.gracePeriod - level.inGracePeriod < level.killstreakRoundDelay )
  222. {
  223. self iPrintLnBold( &"MP_UNAVAILABLE_FOR_N", (level.killstreakRoundDelay - (level.gracePeriod - level.inGracePeriod)) );
  224. return ( false );
  225. }
  226. }
  227.  
  228. if ( (level.teamBased && level.teamEMPed[self.team]) || (!level.teamBased && isDefined( level.empPlayer ) && level.empPlayer != self) )
  229. {
  230. self iPrintLnBold( &"MP_UNAVAILABLE_WHEN_EMP" );
  231. return ( false );
  232. }
  233.  
  234. if ( self IsUsingTurret() && ( isRideKillstreak( streakName ) || isCarryKillstreak( streakName ) ) )
  235. {
  236. self iPrintLnBold( &"MP_UNAVAILABLE_USING_TURRET" );
  237. return ( false );
  238. }
  239.  
  240. if ( isDefined( self.lastStand ) && isRideKillstreak( streakName ) )
  241. {
  242. self iPrintLnBold( &"MP_UNAVILABLE_IN_LASTSTAND" );
  243. return ( false );
  244. }
  245.  
  246. if ( !self isWeaponEnabled() )
  247. return ( false );
  248.  
  249. if ( !self [[ level.killstreakFuncs[ streakName ] ]]( lifeId ) )
  250. return ( false );
  251.  
  252. self usedKillstreak( streakName, awardXp );
  253. self shuffleKillStreaksFILO( streakName );
  254. self giveOwnedKillstreakItem();
  255.  
  256. return ( true );
  257. }
  258.  
  259.  
  260. //this overwrites killstreak at index 0 and decrements all other killstreaks (FCLS style)
  261. shuffleKillStreaksFILO( streakName )
  262. {
  263. self _setActionSlot( 4, "" );
  264.  
  265. arraySize = self.pers["killstreaks"].size;
  266.  
  267. streakIndex = -1;
  268. for ( i = 0; i < arraySize; i++ )
  269. {
  270. if ( self.pers["killstreaks"][i].streakName != streakName )
  271. continue;
  272.  
  273. streakIndex = i;
  274. break;
  275. }
  276. assert( streakIndex >= 0 );
  277.  
  278. self.pers["killstreaks"][streakIndex] = undefined;
  279.  
  280. for( i = streakIndex + 1; i < arraySize; i++ )
  281. {
  282. if ( i == arraySize - 1 )
  283. {
  284. self.pers["killstreaks"][i-1] = self.pers["killstreaks"][i];
  285. self.pers["killstreaks"][i] = undefined;
  286. }
  287. else
  288. {
  289. self.pers["killstreaks"][i-1] = self.pers["killstreaks"][i];
  290. }
  291. }
  292. }
  293.  
  294.  
  295. usedKillstreak( streakName, awardXp )
  296. {
  297. self playLocalSound( "weap_c4detpack_trigger_plr" );
  298.  
  299. if ( awardXp )
  300. self thread [[ level.onXPEvent ]]( "killstreak_" + streakName );
  301.  
  302. self thread maps\mp\gametypes\_missions::useHardpoint( streakName );
  303.  
  304. awardref = maps\mp\_awards::getKillstreakAwardRef( streakName );
  305. if ( isDefined( awardref ) )
  306. self thread incPlayerStat( awardref, 1 );
  307.  
  308. team = self.team;
  309.  
  310. if ( level.teamBased )
  311. {
  312. thread leaderDialog( team + "_friendly_" + streakName + "_inbound", team );
  313.  
  314. if ( getKillstreakInformEnemy( streakName ) )
  315. thread leaderDialog( team + "_enemy_" + streakName + "_inbound", level.otherTeam[ team ] );
  316. }
  317. else
  318. {
  319. self thread leaderDialogOnPlayer( team + "_friendly_" + streakName + "_inbound" );
  320.  
  321. if ( getKillstreakInformEnemy( streakName ) )
  322. {
  323. excludeList[0] = self;
  324. thread leaderDialog( team + "_enemy_" + streakName + "_inbound", undefined, undefined, excludeList );
  325. }
  326. }
  327. }
  328.  
  329.  
  330. clearKillstreaks()
  331. {
  332. foreach ( index, streakStruct in self.pers["killstreaks"] )
  333. self.pers["killstreaks"][index] = undefined;
  334. }
  335.  
  336.  
  337. killstreakUseWaiter()
  338. {
  339. self endon( "disconnect" );
  340. self endon( "finish_death" );
  341. level endon( "game_ended" );
  342.  
  343. self.lastKillStreak = 0;
  344. if ( !isDefined( self.pers["lastEarnedStreak"] ) )
  345. self.pers["lastEarnedStreak"] = undefined;
  346.  
  347. self thread finishDeathWaiter();
  348.  
  349. for ( ;; )
  350. {
  351. self waittill ( "weapon_change", newWeapon );
  352.  
  353. if ( !isAlive( self ) )
  354. continue;
  355.  
  356. if ( !isDefined( self.pers["killstreaks"][0] ) )
  357. continue;
  358.  
  359. if ( newWeapon != getKillstreakWeapon( self.pers["killstreaks"][0].streakName ) )
  360. continue;
  361.  
  362. waittillframeend;
  363.  
  364. streakName = self.pers["killstreaks"][0].streakName;
  365. result = self killstreakUsePressed();
  366.  
  367. //no force switching weapon for ridable killstreaks
  368. if ( !isRideKillstreak( streakName ) || !result )
  369. self switchToWeapon( self getLastWeapon() );
  370.  
  371. // give time to switch to the near weapon; when the weapon is none (such as during a "disableWeapon()" period
  372. // re-enabling the weapon immediately does a "weapon_change" to the killstreak weapon we just used. In the case that
  373. // we have two of that killstreak, it immediately uses the second one
  374. if ( self getCurrentWeapon() == "none" )
  375. {
  376. while ( self getCurrentWeapon() == "none" )
  377. wait ( 0.05 );
  378.  
  379. waittillframeend;
  380. }
  381. }
  382. }
  383.  
  384.  
  385. finishDeathWaiter()
  386. {
  387. self endon ( "disconnect" );
  388.  
  389. self waittill ( "death" );
  390. wait ( 0.05 );
  391. self notify ( "finish_death" );
  392. self.pers["lastEarnedStreak"] = undefined;
  393. }
  394.  
  395.  
  396. checkKillstreakReward( streakCount )
  397. {
  398. self notify( "got_killstreak", streakCount );
  399.  
  400. maxVal = 0;
  401. killStreaks = [];
  402. foreach ( streakVal, streakName in self.killStreaks )
  403. {
  404. killStreaks[streakName] = streakVal;
  405. if ( streakVal > maxVal )
  406. maxVal = streakVal;
  407. }
  408.  
  409. foreach ( streakVal, streakName in self.killStreaks )
  410. {
  411. actualVal = streakVal + level.killStreakMod;
  412.  
  413. if ( actualVal > streakCount )
  414. break;
  415.  
  416. if ( isDefined( self.pers["lastEarnedStreak"] ) && killStreaks[streakName] <= killStreaks[self.pers["lastEarnedStreak"]] )
  417. continue;
  418.  
  419. if ( isSubStr( streakName, "-rollover" ) )
  420. {
  421. continue;
  422. /*
  423. if ( game["defcon"] > 2 )
  424. {
  425. self.pers["lastEarnedStreak"] = streakName;
  426. continue;
  427. }
  428.  
  429. useStreakName = strTok( streakName, "-" )[0];
  430. */
  431. }
  432. else
  433. {
  434. useStreakName = streakName;
  435. }
  436.  
  437. if ( self tryGiveKillstreak( useStreakName, int(max( actualVal, streakCount )) ) )
  438. {
  439. self thread killstreakEarned( useStreakName );
  440. self.pers["lastEarnedStreak"] = streakName;
  441. }
  442. }
  443. }
  444.  
  445.  
  446. killstreakEarned( streakName )
  447. {
  448. if ( self getPlayerData( "killstreaks", 0 ) == streakName )
  449. {
  450. self.firstKillstreakEarned = getTime();
  451. }
  452. else if ( self getPlayerData( "killstreaks", 2 ) == streakName && isDefined( self.firstKillstreakEarned ) )
  453. {
  454. if ( getTime() - self.firstKillstreakEarned < 20000 )
  455. self thread maps\mp\gametypes\_missions::genericChallenge( "wargasm" );
  456. }
  457. }
  458.  
  459.  
  460. rewardNotify( streakName, streakVal )
  461. {
  462. self endon( "disconnect" );
  463.  
  464. self maps\mp\gametypes\_hud_message::killstreakSplashNotify( streakName, streakVal );
  465. }
  466.  
  467.  
  468. tryGiveKillstreak( streakName, streakVal )
  469. {
  470. level notify ( "gave_killstreak", streakName );
  471.  
  472. if ( !level.gameEnded )
  473. self thread rewardNotify( streakName, streakVal );
  474.  
  475. self giveKillstreak( streakName, streakVal, true );
  476. return true;
  477. }
  478.  
  479.  
  480. giveKillstreak( streakName, isEarned, awardXp, owner )
  481. {
  482. self endon ( "disconnect" );
  483.  
  484. weapon = getKillstreakWeapon( streakName );
  485.  
  486. self giveKillstreakWeapon( weapon );
  487.  
  488. // shuffle existing killstreaks up a notch
  489. for( i = self.pers["killstreaks"].size; i >= 0; i-- )
  490. self.pers["killstreaks"][i + 1] = self.pers["killstreaks"][i];
  491.  
  492. self.pers["killstreaks"][0] = spawnStruct();
  493. self.pers["killstreaks"][0].streakName = streakName;
  494. self.pers["killstreaks"][0].earned = isDefined( isEarned ) && isEarned;
  495. self.pers["killstreaks"][0].awardxp = isDefined( awardXp ) && awardXp;
  496. self.pers["killstreaks"][0].owner = owner;
  497. if ( !self.pers["killstreaks"][0].earned )
  498. self.pers["killstreaks"][0].lifeId = -1;
  499. else
  500. self.pers["killstreaks"][0].lifeId = self.pers["deaths"];
  501.  
  502. // probably obsolete unless we bring back the autoshotty
  503. if ( isdefined( level.killstreakSetupFuncs[ streakName ] ) )
  504. self [[ level.killstreakSetupFuncs[ streakName ] ]]();
  505.  
  506. if ( isDefined( isEarned ) && isEarned && isDefined( awardXp ) && awardXp )
  507. self notify( "received_earned_killstreak" );
  508. }
  509.  
  510.  
  511. giveKillstreakWeapon( weapon )
  512. {
  513. weaponList = self getWeaponsListItems();
  514.  
  515. foreach ( item in weaponList )
  516. {
  517. if ( !isSubStr( item, "killstreak" ) )
  518. continue;
  519.  
  520. if ( self getCurrentWeapon() == item )
  521. continue;
  522.  
  523. self takeWeapon( item );
  524. }
  525.  
  526. self _giveWeapon( weapon, 0 );
  527. self _setActionSlot( 4, "weapon", weapon );
  528. }
  529.  
  530.  
  531. getStreakCost( streakName )
  532. {
  533. return int( tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 4 ) );
  534. }
  535.  
  536.  
  537. getKillstreakHint( streakName )
  538. {
  539. return tableLookupIString( KILLSTREAK_STRING_TABLE, 1, streakName, 6 );
  540. }
  541.  
  542.  
  543. getKillstreakInformEnemy( streakName )
  544. {
  545. return int( tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 11 ) );
  546. }
  547.  
  548.  
  549. getKillstreakSound( streakName )
  550. {
  551. return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 7 );
  552. }
  553.  
  554.  
  555. getKillstreakDialog( streakName )
  556. {
  557. return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 8 );
  558. }
  559.  
  560.  
  561. getKillstreakWeapon( streakName )
  562. {
  563. return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 12 );
  564. }
  565.  
  566. getKillstreakIcon( streakName )
  567. {
  568. return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 14 );
  569. }
  570.  
  571. getKillstreakCrateIcon( streakName )
  572. {
  573. return tableLookup( KILLSTREAK_STRING_TABLE, 1, streakName, 15 );
  574. }
  575.  
  576.  
  577. giveOwnedKillstreakItem( skipDialog )
  578. {
  579. if ( !isDefined( self.pers["killstreaks"][0] ) )
  580. return;
  581.  
  582. streakName = self.pers["killstreaks"][0].streakName;
  583.  
  584. weapon = getKillstreakWeapon( streakName );
  585. self giveKillstreakWeapon( weapon );
  586.  
  587. if ( !isDefined( skipDialog ) && !level.inGracePeriod )
  588. self leaderDialogOnPlayer( streakName, "killstreak_earned" );
  589. }
  590.  
  591.  
  592. initRideKillstreak()
  593. {
  594. self _disableUsability();
  595. result = self initRideKillstreak_internal();
  596.  
  597. if ( isDefined( self ) )
  598. self _enableUsability();
  599.  
  600. return result;
  601. }
  602.  
  603. initRideKillstreak_internal()
  604. {
  605. laptopWait = self waittill_any_timeout( 1.0, "disconnect", "death", "weapon_switch_started" );
  606.  
  607. if ( laptopWait == "weapon_switch_started" )
  608. return ( "fail" );
  609.  
  610. if ( !isAlive( self ) )
  611. return "fail";
  612.  
  613. if ( laptopWait == "disconnect" || laptopWait == "death" )
  614. {
  615. if ( laptopWait == "disconnect" )
  616. return ( "disconnect" );
  617.  
  618. if ( self.team == "spectator" )
  619. return "fail";
  620.  
  621. return ( "success" );
  622. }
  623.  
  624. if ( self isEMPed() || self isNuked() )
  625. {
  626. return ( "fail" );
  627. }
  628.  
  629. self VisionSetNakedForPlayer( "black_bw", 0.75 );
  630. blackOutWait = self waittill_any_timeout( 0.80, "disconnect", "death" );
  631.  
  632. if ( blackOutWait != "disconnect" )
  633. {
  634. self thread clearRideIntro( 1.0 );
  635.  
  636. if ( self.team == "spectator" )
  637. return "fail";
  638. }
  639.  
  640. if ( !isAlive( self ) )
  641. return "fail";
  642.  
  643. if ( self isEMPed() || self isNuked() )
  644. return "fail";
  645.  
  646. if ( blackOutWait == "disconnect" )
  647. return ( "disconnect" );
  648. else
  649. return ( "success" );
  650. }
  651.  
  652.  
  653. clearRideIntro( delay )
  654. {
  655. self endon( "disconnect" );
  656.  
  657. if ( isDefined( delay ) )
  658. wait( delay );
  659.  
  660. //self freezeControlsWrapper( false );
  661.  
  662. if ( !isDefined( level.nukeVisionInProgress ) )
  663. self VisionSetNakedForPlayer( getDvar( "mapname" ), 0 );
  664. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement