Advertisement
JoBoz

NEW Nuke better

Jun 5th, 2011
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.53 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3.  
  4. init()
  5. {
  6. precacheItem( "nuke_mp" );
  7. precacheLocationSelector( "map_nuke_selector" );
  8. precacheString( &"MP_TACTICAL_NUKE_CALLED" );
  9. precacheString( &"MP_FRIENDLY_TACTICAL_NUKE" );
  10. precacheString( &"MP_TACTICAL_NUKE" );
  11.  
  12. level._effect[ "nuke_player" ] = loadfx( "explosions/player_death_nuke" );
  13. level._effect[ "nuke_flash" ] = loadfx( "explosions/player_death_nuke_flash" );
  14. level._effect[ "nuke_aftermath" ] = loadfx( "dust/nuke_aftermath_mp" );
  15.  
  16. game["strings"]["nuclear_strike"] = &"MP_TACTICAL_NUKE";
  17.  
  18. level.killstreakFuncs["nuke"] = ::tryUseNuke;
  19.  
  20. setDvarIfUninitialized( "scr_nukeTimer", 3 );
  21. setDvarIfUninitialized( "scr_nukeCancelMode", 0 );
  22.  
  23. level.nukeTimer = getDvarInt( "scr_nukeTimer" );
  24. level.cancelMode = getDvarInt( "scr_nukeCancelMode" );
  25.  
  26. /#
  27. setDevDvarIfUninitialized( "scr_nukeDistance", 5000 );
  28. setDevDvarIfUninitialized( "scr_nukeEndsGame", false );
  29. setDevDvarIfUninitialized( "scr_nukeDebugPosition", false );
  30. #/
  31. }
  32.  
  33. tryUseNuke( lifeId, allowCancel )
  34. {
  35. /* if( isDefined( level.nukeIncoming ) )
  36. {
  37. self iPrintLnBold( &"MP_NUKE_ALREADY_INBOUND" );
  38. return false;
  39. } */
  40.  
  41. if ( self isUsingRemote() && ( !isDefined( level.gtnw ) || !level.gtnw ) )
  42. return false;
  43.  
  44. if ( !isDefined( allowCancel ) )
  45. allowCancel = true;
  46.  
  47. self thread doNuke( allowCancel );
  48. self notify( "used_nuke" );
  49.  
  50. return true;
  51. }
  52.  
  53. delaythread_nuke( delay, func )
  54. {
  55. level endon ( "nuke_cancelled" );
  56.  
  57. wait ( delay );
  58.  
  59. thread [[ func ]]();
  60. }
  61.  
  62. doNuke( allowCancel )
  63. {
  64. level endon ( "nuke_cancelled" );
  65.  
  66. level.nukeInfo = spawnStruct();
  67. level.nukeInfo.player = self;
  68. level.nukeInfo.team = self.pers["team"];
  69.  
  70. level.nukeIncoming = true;
  71.  
  72. maps\mp\gametypes\_gamelogic::pauseTimer();
  73. level.timeLimitOverride = true;
  74. setGameEndTime( int( gettime() + (level.nukeTimer * 1000) ) );
  75. setDvar( "ui_bomb_timer", 4 ); // Nuke sets '4' to avoid briefcase icon showing
  76.  
  77. if ( level.teambased )
  78. {
  79. thread teamPlayerCardSplash( "used_nuke", self, self.team );
  80. /*
  81. players = level.players;
  82.  
  83. foreach( player in level.players )
  84. {
  85. playerteam = player.pers["team"];
  86. if ( isdefined( playerteam ) )
  87. {
  88. if ( playerteam == self.pers["team"] )
  89. player iprintln( &"MP_TACTICAL_NUKE_CALLED", self );
  90. }
  91. }
  92. */
  93. }
  94. else
  95. {
  96. if ( !level.hardcoreMode )
  97. self iprintlnbold(&"MP_FRIENDLY_TACTICAL_NUKE");
  98. }
  99.  
  100. level thread delaythread_nuke( (level.nukeTimer - 3.3), ::nukeSoundIncoming );
  101. level thread delaythread_nuke( level.nukeTimer, ::nukeSoundExplosion );
  102. level thread delaythread_nuke( level.nukeTimer, ::nukeSlowMo );
  103. level thread delaythread_nuke( level.nukeTimer, ::nukeEffects );
  104. level thread delaythread_nuke( (level.nukeTimer + 0.25), ::nukeVision );
  105. //level thread delaythread_nuke( (level.nukeTimer + 1.5), ::nukeDeath );
  106. level thread delaythread_nuke( (level.nukeTimer + 1.5), ::nukeEarthquake );
  107. level thread nukeAftermathEffect();
  108.  
  109. if ( level.cancelMode && allowCancel )
  110. level thread cancelNukeOnDeath( self );
  111.  
  112. // leaks if lots of nukes are called due to endon above.
  113. clockObject = spawn( "script_origin", (0,0,0) );
  114. clockObject hide();
  115.  
  116. while ( !isDefined( level.nukeDetonated ) )
  117. {
  118. clockObject playSound( "ui_mp_nukebomb_timer" );
  119. wait( 1.0 );
  120. }
  121. }
  122.  
  123. cancelNukeOnDeath( player )
  124. {
  125. player waittill_any( "death", "disconnect" );
  126.  
  127. if ( isDefined( player ) && level.cancelMode == 2 )
  128. player thread maps\mp\killstreaks\_emp::EMP_Use( 0, 0 );
  129.  
  130.  
  131. maps\mp\gametypes\_gamelogic::resumeTimer();
  132. level.timeLimitOverride = false;
  133.  
  134. setDvar( "ui_bomb_timer", 0 ); // Nuke sets '4' to avoid briefcase icon showing
  135.  
  136. level notify ( "nuke_cancelled" );
  137. }
  138.  
  139. nukeSoundIncoming()
  140. {
  141. level endon ( "nuke_cancelled" );
  142.  
  143. foreach( player in level.players )
  144. player playlocalsound( "nuke_incoming" );
  145. }
  146.  
  147. nukeSoundExplosion()
  148. {
  149. level endon ( "nuke_cancelled" );
  150.  
  151. foreach( player in level.players )
  152. {
  153. player playlocalsound( "nuke_explosion" );
  154. player playlocalsound( "nuke_wave" );
  155. }
  156. }
  157.  
  158. nukeEffects()
  159. {
  160. level endon ( "nuke_cancelled" );
  161.  
  162. setDvar( "ui_bomb_timer", 0 );
  163. setGameEndTime( 0 );
  164.  
  165. level.nukeDetonated = true;
  166. level maps\mp\killstreaks\_emp::destroyActiveVehicles( level.nukeInfo.player );
  167.  
  168. foreach( player in level.players )
  169. {
  170. playerForward = anglestoforward( player.angles );
  171. playerForward = ( playerForward[0], playerForward[1], 0 );
  172. playerForward = VectorNormalize( playerForward );
  173.  
  174. nukeDistance = 5000;
  175. /# nukeDistance = getDvarInt( "scr_nukeDistance" ); #/
  176.  
  177. nukeEnt = Spawn( "script_model", player.origin + Vector_Multiply( playerForward, nukeDistance ) );
  178. nukeEnt setModel( "tag_origin" );
  179. nukeEnt.angles = ( 0, (player.angles[1] + 180), 90 );
  180.  
  181. /#
  182. if ( getDvarInt( "scr_nukeDebugPosition" ) )
  183. {
  184. lineTop = ( nukeEnt.origin[0], nukeEnt.origin[1], (nukeEnt.origin[2] + 500) );
  185. thread draw_line_for_time( nukeEnt.origin, lineTop, 1, 0, 0, 10 );
  186. }
  187. #/
  188.  
  189. nukeEnt thread nukeEffect( player );
  190. player.nuked = true;
  191. }
  192. }
  193.  
  194. nukeEffect( player )
  195. {
  196. level endon ( "nuke_cancelled" );
  197.  
  198. player endon( "disconnect" );
  199.  
  200. waitframe();
  201. PlayFXOnTagForClients( level._effect[ "nuke_flash" ], self, "tag_origin", player );
  202. }
  203.  
  204. nukeAftermathEffect()
  205. {
  206. level endon ( "nuke_cancelled" );
  207.  
  208. level waittill ( "spawning_intermission" );
  209.  
  210. afermathEnt = getEntArray( "mp_global_intermission", "classname" );
  211. afermathEnt = afermathEnt[0];
  212. up = anglestoup( afermathEnt.angles );
  213. right = anglestoright( afermathEnt.angles );
  214.  
  215. PlayFX( level._effect[ "nuke_aftermath" ], afermathEnt.origin, up, right );
  216. }
  217.  
  218. nukeSlowMo()
  219. {
  220. level endon ( "nuke_cancelled" );
  221.  
  222. //SetSlowMotion( <startTimescale>, <endTimescale>, <deltaTime> )
  223. setSlowMotion( 1.0, 0.25, 0.5 );
  224. wait 3;
  225. setSlowMotion( 0.25, 1, 2.0 );
  226. }
  227.  
  228. nukeVision()
  229. {
  230. level endon ( "nuke_cancelled" );
  231.  
  232. level.nukeVisionInProgress = true;
  233. visionSetNaked( "mpnuke", 3 );
  234. wait 3;
  235. visionSetNaked(getDvar("mapname"), 5);
  236.  
  237. level waittill( "nuke_death" );
  238.  
  239. visionSetNaked( "mpnuke_aftermath", 5 );
  240. wait 5;
  241. level.nukeVisionInProgress = undefined;
  242. }
  243.  
  244. nukeDeath()
  245. {
  246. level endon ( "nuke_cancelled" );
  247.  
  248. level notify( "nuke_death" );
  249.  
  250.  
  251.  
  252. AmbientStop(1);
  253.  
  254. foreach( player in level.players )
  255. {
  256. if ( isAlive( player ) )
  257. player thread maps\mp\gametypes\_damage::finishPlayerDamageWrapper( level.nukeInfo.player, level.nukeInfo.player, 0, 0, "MOD_EXPLOSIVE", "nuke_mp", player.origin, player.origin, "none", 0, 0 );
  258. }
  259.  
  260. level.postRoundTime = 10;
  261.  
  262. nukeEndsGame = false;
  263.  
  264. }
  265.  
  266. nukeEarthquake()
  267. {
  268. level endon ( "nuke_cancelled" );
  269.  
  270. level waittill( "nuke_death" );
  271.  
  272. // TODO: need to get a different position to call this on
  273. //earthquake( 0.6, 10, nukepos, 100000 );
  274.  
  275. //foreach( player in level.players )
  276. //player PlayRumbleOnEntity( "damage_heavy" );
  277. }
  278.  
  279.  
  280. waitForNukeCancel()
  281. {
  282. self waittill( "cancel_location" );
  283. self setblurforplayer( 0, 0.3 );
  284. }
  285.  
  286. endSelectionOn( waitfor )
  287. {
  288. self endon( "stop_location_selection" );
  289. self waittill( waitfor );
  290. self thread stopNukeLocationSelection( (waitfor == "disconnect") );
  291. }
  292.  
  293. endSelectionOnGameEnd()
  294. {
  295. self endon( "stop_location_selection" );
  296. level waittill( "game_ended" );
  297. self thread stopNukeLocationSelection( false );
  298. }
  299.  
  300. stopNukeLocationSelection( disconnected )
  301. {
  302. if ( !disconnected )
  303. {
  304. self setblurforplayer( 0, 0.3 );
  305. self endLocationSelection();
  306. self.selectingLocation = undefined;
  307. }
  308. self notify( "stop_location_selection" );
  309. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement