Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
395
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 57.91 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\gametypes\_hud_util;
  3.  
  4. exploder_sound()
  5. {
  6. if ( isdefined( self.script_delay ) )
  7. wait self.script_delay;
  8.  
  9. self playSound( level.scr_sound[ self.script_sound ] );
  10. }
  11.  
  12. /*
  13. saveModel()
  14. {
  15. info["model"] = self.model;
  16. info["viewmodel"] = self getViewModel();
  17. attachSize = self getAttachSize();
  18. info["attach"] = [];
  19.  
  20. assert(info["viewmodel"] != ""); // No viewmodel was associated with the player's model
  21.  
  22. for(i = 0; i < attachSize; i++)
  23. {
  24. info["attach"][i]["model"] = self getAttachModelName(i);
  25. info["attach"][i]["tag"] = self getAttachTagName(i);
  26. info["attach"][i]["ignoreCollision"] = self getAttachIgnoreCollision(i);
  27. }
  28.  
  29. return info;
  30. }
  31.  
  32. loadModel(info)
  33. {
  34. self detachAll();
  35. self setModel(info["model"]);
  36. self setViewModel(info["viewmodel"]);
  37.  
  38. attachInfo = info["attach"];
  39. attachSize = attachInfo.size;
  40.  
  41. for(i = 0; i < attachSize; i++)
  42. self attach(attachInfo[i]["model"], attachInfo[i]["tag"], attachInfo[i]["ignoreCollision"]);
  43. }
  44. */
  45.  
  46. /*
  47. =============
  48. ///ScriptDocBegin
  49. "Name: delayThread( <delay>, <function>, <arg1>, <arg2>, <arg3>, <arg4> )"
  50. "Summary: Delaythread is cool! It saves you from having to write extra script for once off commands. Note you don?t have to thread it off. Delaythread is that smart!"
  51. "Module: Utility"
  52. "MandatoryArg: <delay> : The delay before the function occurs"
  53. "MandatoryArg: <delay> : The function to run."
  54. "OptionalArg: <arg1> : parameter 1 to pass to the process"
  55. "OptionalArg: <arg2> : parameter 2 to pass to the process"
  56. "OptionalArg: <arg3> : parameter 3 to pass to the process"
  57. "OptionalArg: <arg4> : parameter 4 to pass to the process"
  58. "OptionalArg: <arg5> : parameter 5 to pass to the process"
  59. "Example: delayThread( 3, ::flag_set, "player_can_rappel" );
  60. "SPMP: both"
  61. ///ScriptDocEnd
  62. =============
  63. */
  64. delayThread( timer, func, param1, param2, param3, param4, param5 )
  65. {
  66. // to thread it off
  67. thread delayThread_proc( func, timer, param1, param2, param3, param4, param5 );
  68. }
  69.  
  70.  
  71. delayThread_proc( func, timer, param1, param2, param3, param4, param5 )
  72. {
  73. wait( timer );
  74. if ( !IsDefined( param1 ) )
  75. {
  76. assertex( !isdefined( param2 ), "Delaythread does not support vars after undefined." );
  77. assertex( !isdefined( param3 ), "Delaythread does not support vars after undefined." );
  78. assertex( !isdefined( param4 ), "Delaythread does not support vars after undefined." );
  79. assertex( !isdefined( param5 ), "Delaythread does not support vars after undefined." );
  80. thread [[ func ]]();
  81. }
  82. else
  83. if ( !IsDefined( param2 ) )
  84. {
  85. assertex( !isdefined( param3 ), "Delaythread does not support vars after undefined." );
  86. assertex( !isdefined( param4 ), "Delaythread does not support vars after undefined." );
  87. assertex( !isdefined( param5 ), "Delaythread does not support vars after undefined." );
  88. thread [[ func ]]( param1 );
  89. }
  90. else
  91. if ( !IsDefined( param3 ) )
  92. {
  93. assertex( !isdefined( param4 ), "Delaythread does not support vars after undefined." );
  94. assertex( !isdefined( param5 ), "Delaythread does not support vars after undefined." );
  95. thread [[ func ]]( param1, param2 );
  96. }
  97. else
  98. if ( !IsDefined( param4 ) )
  99. {
  100. assertex( !isdefined( param5 ), "Delaythread does not support vars after undefined." );
  101. thread [[ func ]]( param1, param2, param3 );
  102. }
  103. else
  104. if ( !IsDefined( param5 ) )
  105. {
  106. thread [[ func ]]( param1, param2, param3, param4 );
  107. }
  108. else
  109. {
  110. thread [[ func ]]( param1, param2, param3, param4, param5 );
  111. }
  112. }
  113.  
  114. getPlant()
  115. {
  116. start = self.origin + ( 0, 0, 10 );
  117.  
  118. range = 11;
  119. forward = anglesToForward( self.angles );
  120. forward = vector_multiply( forward, range );
  121.  
  122. traceorigins[ 0 ] = start + forward;
  123. traceorigins[ 1 ] = start;
  124.  
  125. trace = bulletTrace( traceorigins[ 0 ], ( traceorigins[ 0 ] + ( 0, 0, -18 ) ), false, undefined );
  126. if ( trace[ "fraction" ] < 1 )
  127. {
  128. //println("^6Using traceorigins[0], tracefraction is", trace["fraction"]);
  129.  
  130. temp = spawnstruct();
  131. temp.origin = trace[ "position" ];
  132. temp.angles = orientToNormal( trace[ "normal" ] );
  133. return temp;
  134. }
  135.  
  136. trace = bulletTrace( traceorigins[ 1 ], ( traceorigins[ 1 ] + ( 0, 0, -18 ) ), false, undefined );
  137. if ( trace[ "fraction" ] < 1 )
  138. {
  139. //println("^6Using traceorigins[1], tracefraction is", trace["fraction"]);
  140.  
  141. temp = spawnstruct();
  142. temp.origin = trace[ "position" ];
  143. temp.angles = orientToNormal( trace[ "normal" ] );
  144. return temp;
  145. }
  146.  
  147. traceorigins[ 2 ] = start + ( 16, 16, 0 );
  148. traceorigins[ 3 ] = start + ( 16, -16, 0 );
  149. traceorigins[ 4 ] = start + ( -16, -16, 0 );
  150. traceorigins[ 5 ] = start + ( -16, 16, 0 );
  151.  
  152. besttracefraction = undefined;
  153. besttraceposition = undefined;
  154. for ( i = 0; i < traceorigins.size; i++ )
  155. {
  156. trace = bulletTrace( traceorigins[ i ], ( traceorigins[ i ] + ( 0, 0, -1000 ) ), false, undefined );
  157.  
  158. //ent[i] = spawn("script_model",(traceorigins[i]+(0, 0, -2)));
  159. //ent[i].angles = (0, 180, 180);
  160. //ent[i] setmodel("105");
  161.  
  162. //println("^6trace ", i ," fraction is ", trace["fraction"]);
  163.  
  164. if ( !isdefined( besttracefraction ) || ( trace[ "fraction" ] < besttracefraction ) )
  165. {
  166. besttracefraction = trace[ "fraction" ];
  167. besttraceposition = trace[ "position" ];
  168.  
  169. //println("^6besttracefraction set to ", besttracefraction, " which is traceorigin[", i, "]");
  170. }
  171. }
  172.  
  173. if ( besttracefraction == 1 )
  174. besttraceposition = self.origin;
  175.  
  176. temp = spawnstruct();
  177. temp.origin = besttraceposition;
  178. temp.angles = orientToNormal( trace[ "normal" ] );
  179. return temp;
  180. }
  181.  
  182. orientToNormal( normal )
  183. {
  184. hor_normal = ( normal[ 0 ], normal[ 1 ], 0 );
  185. hor_length = length( hor_normal );
  186.  
  187. if ( !hor_length )
  188. return( 0, 0, 0 );
  189.  
  190. hor_dir = vectornormalize( hor_normal );
  191. neg_height = normal[ 2 ] * - 1;
  192. tangent = ( hor_dir[ 0 ] * neg_height, hor_dir[ 1 ] * neg_height, hor_length );
  193. plant_angle = vectortoangles( tangent );
  194.  
  195. //println("^6hor_normal is ", hor_normal);
  196. //println("^6hor_length is ", hor_length);
  197. //println("^6hor_dir is ", hor_dir);
  198. //println("^6neg_height is ", neg_height);
  199. //println("^6tangent is ", tangent);
  200. //println("^6plant_angle is ", plant_angle);
  201.  
  202. return plant_angle;
  203. }
  204.  
  205. deletePlacedEntity( entity )
  206. {
  207. entities = getentarray( entity, "classname" );
  208. for ( i = 0; i < entities.size; i++ )
  209. {
  210. //println("DELETED: ", entities[i].classname);
  211. entities[ i ] delete();
  212. }
  213. }
  214.  
  215. playSoundOnPlayers( sound, team, excludeList )
  216. {
  217. assert( isdefined( level.players ) );
  218.  
  219. if ( level.splitscreen )
  220. {
  221. if ( isdefined( level.players[ 0 ] ) )
  222. level.players[ 0 ] playLocalSound( sound );
  223. }
  224. else
  225. {
  226. if ( isDefined( team ) )
  227. {
  228. if ( isdefined( excludeList ) )
  229. {
  230. for ( i = 0; i < level.players.size; i++ )
  231. {
  232. player = level.players[ i ];
  233. if ( isdefined( player.pers[ "team" ] ) && ( player.pers[ "team" ] == team ) && !isExcluded( player, excludeList ) )
  234. player playLocalSound( sound );
  235. }
  236. }
  237. else
  238. {
  239. for ( i = 0; i < level.players.size; i++ )
  240. {
  241. player = level.players[ i ];
  242. if ( isdefined( player.pers[ "team" ] ) && ( player.pers[ "team" ] == team ) )
  243. player playLocalSound( sound );
  244. }
  245. }
  246. }
  247. else
  248. {
  249. if ( isdefined( excludeList ) )
  250. {
  251. for ( i = 0; i < level.players.size; i++ )
  252. {
  253. if ( !isExcluded( level.players[ i ], excludeList ) )
  254. level.players[ i ] playLocalSound( sound );
  255. }
  256. }
  257. else
  258. {
  259. for ( i = 0; i < level.players.size; i++ )
  260. level.players[ i ] playLocalSound( sound );
  261. }
  262. }
  263. }
  264. }
  265.  
  266.  
  267. sortLowerMessages()
  268. {
  269. for ( i = 1; i < self.lowerMessages.size; i++ )
  270. {
  271. message = self.lowerMessages[ i ];
  272. priority = message.priority;
  273. for ( j = i - 1; j >= 0 && priority > self.lowerMessages[ j ].priority; j -- )
  274. self.lowerMessages[ j + 1 ] = self.lowerMessages[ j ];
  275. self.lowerMessages[ j + 1 ] = message;
  276. }
  277. }
  278.  
  279.  
  280. addLowerMessage( name, text, time, priority )
  281. {
  282. newMessage = undefined;
  283. foreach ( message in self.lowerMessages )
  284. {
  285. if ( message.name == name )
  286. {
  287. if ( message.text == text && message.priority == priority )
  288. return;
  289.  
  290. newMessage = message;
  291. break;
  292. }
  293. }
  294.  
  295. if ( !isDefined( newMessage ) )
  296. {
  297. newMessage = spawnStruct();
  298. self.lowerMessages[ self.lowerMessages.size ] = newMessage;
  299. }
  300.  
  301. newMessage.name = name;
  302. newMessage.text = text;
  303. newMessage.time = time;
  304. newMessage.addTime = getTime();
  305. newMessage.priority = priority;
  306.  
  307. sortLowerMessages();
  308. }
  309.  
  310.  
  311. removeLowerMessage( name )
  312. {
  313. for ( i = 0; i < self.lowerMessages.size; i++ )
  314. {
  315. if ( self.lowerMessages[ i ].name != name )
  316. continue;
  317.  
  318. message = self.lowerMessages[ i ];
  319. if ( i < self.lowerMessages.size - 1 )
  320. self.lowerMessages[ i ] = self.lowerMessages[ self.lowerMessages.size - 1 ];
  321.  
  322. self.lowerMessages[ self.lowerMessages.size - 1 ] = undefined;
  323. }
  324.  
  325. sortLowerMessages();
  326. }
  327.  
  328.  
  329. getLowerMessage()
  330. {
  331. return self.lowerMessages[ 0 ];
  332. }
  333.  
  334.  
  335. setLowerMessage( name, text, time, priority )
  336. {
  337. if ( !isDefined( priority ) )
  338. priority = 1;
  339.  
  340. if ( !isDefined( time ) )
  341. time = 0;
  342.  
  343. self addLowerMessage( name, text, time, priority );
  344. self updateLowerMessage();
  345. //self notify( "lower_message_set" );
  346. }
  347.  
  348.  
  349. updateLowerMessage()
  350. {
  351. message = self getLowerMessage();
  352.  
  353. if ( !isDefined( message ) )
  354. {
  355. self.lowerMessage.alpha = 0;
  356. self.lowerTimer.alpha = 0;
  357. return;
  358. }
  359.  
  360. self.lowerMessage setText( message.text );
  361. if ( isDefined( message.time ) && message.time > 0 )
  362. self.lowerTimer setTimer( max( message.time - ( ( getTime() - message.addTime ) / 1000 ), 0.1 ) );
  363. else
  364. self.lowerTimer setText( "" );
  365.  
  366. self.lowerMessage.alpha = 0.85;
  367. self.lowerTimer.alpha = 1;
  368. }
  369.  
  370. clearLowerMessage( name, fadetime )
  371. {
  372. self removeLowerMessage( name );
  373. self updateLowerMessage();
  374. }
  375.  
  376. clearLowerMessages()
  377. {
  378. for ( i = 0; i < self.lowerMessages.size; i++ )
  379. self.lowerMessages[ i ] = undefined;
  380.  
  381. if ( !isDefined( self.lowerMessage ) )
  382. return;
  383.  
  384. self updateLowerMessage();
  385. }
  386.  
  387. printOnTeam( printString, team )
  388. {
  389. foreach ( player in level.players )
  390. {
  391. if ( player.team != team )
  392. continue;
  393.  
  394. player iPrintLn( printString );
  395. }
  396. }
  397.  
  398. printBoldOnTeam( text, team )
  399. {
  400. assert( isdefined( level.players ) );
  401. for ( i = 0; i < level.players.size; i++ )
  402. {
  403. player = level.players[ i ];
  404. if ( ( isdefined( player.pers[ "team" ] ) ) && ( player.pers[ "team" ] == team ) )
  405. player iprintlnbold( text );
  406. }
  407. }
  408.  
  409. printBoldOnTeamArg( text, team, arg )
  410. {
  411. assert( isdefined( level.players ) );
  412. for ( i = 0; i < level.players.size; i++ )
  413. {
  414. player = level.players[ i ];
  415. if ( ( isdefined( player.pers[ "team" ] ) ) && ( player.pers[ "team" ] == team ) )
  416. player iprintlnbold( text, arg );
  417. }
  418. }
  419.  
  420. printOnTeamArg( text, team, arg )
  421. {
  422. assert( isdefined( level.players ) );
  423. for ( i = 0; i < level.players.size; i++ )
  424. {
  425. player = level.players[ i ];
  426. if ( ( isdefined( player.pers[ "team" ] ) ) && ( player.pers[ "team" ] == team ) )
  427. player iprintln( text, arg );
  428. }
  429. }
  430.  
  431. printOnPlayers( text, team )
  432. {
  433. players = level.players;
  434. for ( i = 0; i < players.size; i++ )
  435. {
  436. if ( isDefined( team ) )
  437. {
  438. if ( ( isdefined( players[ i ].pers[ "team" ] ) ) && ( players[ i ].pers[ "team" ] == team ) )
  439. players[ i ] iprintln( text );
  440. }
  441. else
  442. {
  443. players[ i ] iprintln( text );
  444. }
  445. }
  446. }
  447.  
  448. printAndSoundOnEveryone( team, otherteam, printFriendly, printEnemy, soundFriendly, soundEnemy, printarg )
  449. {
  450. shouldDoSounds = isDefined( soundFriendly );
  451.  
  452. shouldDoEnemySounds = false;
  453. if ( isDefined( soundEnemy ) )
  454. {
  455. assert( shouldDoSounds );// can't have an enemy sound without a friendly sound
  456. shouldDoEnemySounds = true;
  457. }
  458.  
  459. if ( level.splitscreen || !shouldDoSounds )
  460. {
  461. for ( i = 0; i < level.players.size; i++ )
  462. {
  463. player = level.players[ i ];
  464. playerteam = player.pers[ "team" ];
  465. if ( isdefined( playerteam ) )
  466. {
  467. if ( playerteam == team && isdefined( printFriendly ) )
  468. player iprintln( printFriendly, printarg );
  469. else if ( playerteam == otherteam && isdefined( printEnemy ) )
  470. player iprintln( printEnemy, printarg );
  471. }
  472. }
  473. if ( shouldDoSounds )
  474. {
  475. assert( level.splitscreen );
  476. level.players[ 0 ] playLocalSound( soundFriendly );
  477. }
  478. }
  479. else
  480. {
  481. assert( shouldDoSounds );
  482. if ( shouldDoEnemySounds )
  483. {
  484. for ( i = 0; i < level.players.size; i++ )
  485. {
  486. player = level.players[ i ];
  487. playerteam = player.pers[ "team" ];
  488. if ( isdefined( playerteam ) )
  489. {
  490. if ( playerteam == team )
  491. {
  492. if ( isdefined( printFriendly ) )
  493. player iprintln( printFriendly, printarg );
  494. player playLocalSound( soundFriendly );
  495. }
  496. else if ( playerteam == otherteam )
  497. {
  498. if ( isdefined( printEnemy ) )
  499. player iprintln( printEnemy, printarg );
  500. player playLocalSound( soundEnemy );
  501. }
  502. }
  503. }
  504. }
  505. else
  506. {
  507. for ( i = 0; i < level.players.size; i++ )
  508. {
  509. player = level.players[ i ];
  510. playerteam = player.pers[ "team" ];
  511. if ( isdefined( playerteam ) )
  512. {
  513. if ( playerteam == team )
  514. {
  515. if ( isdefined( printFriendly ) )
  516. player iprintln( printFriendly, printarg );
  517. player playLocalSound( soundFriendly );
  518. }
  519. else if ( playerteam == otherteam )
  520. {
  521. if ( isdefined( printEnemy ) )
  522. player iprintln( printEnemy, printarg );
  523. }
  524. }
  525. }
  526. }
  527. }
  528. }
  529.  
  530. printAndSoundOnTeam( team, printString, soundAlias )
  531. {
  532. foreach ( player in level.players )
  533. {
  534. if ( player.team != team )
  535. continue;
  536.  
  537. player printAndSoundOnPlayer( printString, soundAlias );
  538. }
  539. }
  540.  
  541. printAndSoundOnPlayer( printString, soundAlias )
  542. {
  543. self iPrintLn( printString );
  544. self playLocalSound( soundAlias );
  545. }
  546.  
  547. _playLocalSound( soundAlias )
  548. {
  549. if ( level.splitscreen && self getEntityNumber() != 0 )
  550. return;
  551.  
  552. self playLocalSound( soundAlias );
  553. }
  554.  
  555. dvarIntValue( dVar, defVal, minVal, maxVal )
  556. {
  557. dVar = "scr_" + level.gameType + "_" + dVar;
  558. if ( getDvar( dVar ) == "" )
  559. {
  560. setDvar( dVar, defVal );
  561. return defVal;
  562. }
  563.  
  564. value = getDvarInt( dVar );
  565.  
  566. if ( value > maxVal )
  567. value = maxVal;
  568. else if ( value < minVal )
  569. value = minVal;
  570. else
  571. return value;
  572.  
  573. setDvar( dVar, value );
  574. return value;
  575. }
  576.  
  577. dvarFloatValue( dVar, defVal, minVal, maxVal )
  578. {
  579. dVar = "scr_" + level.gameType + "_" + dVar;
  580. if ( getDvar( dVar ) == "" )
  581. {
  582. setDvar( dVar, defVal );
  583. return defVal;
  584. }
  585.  
  586. value = getDvarFloat( dVar );
  587.  
  588. if ( value > maxVal )
  589. value = maxVal;
  590. else if ( value < minVal )
  591. value = minVal;
  592. else
  593. return value;
  594.  
  595. setDvar( dVar, value );
  596. return value;
  597. }
  598.  
  599. play_sound_on_tag( alias, tag )
  600. {
  601. if ( isdefined( tag ) )
  602. {
  603. playsoundatpos( self getTagOrigin( tag ), alias );
  604. }
  605. else
  606. {
  607. playsoundatpos( self.origin, alias );
  608. }
  609. }
  610.  
  611. getOtherTeam( team )
  612. {
  613. if ( team == "allies" )
  614. return "axis";
  615. else if ( team == "axis" )
  616. return "allies";
  617.  
  618. assertMsg( "getOtherTeam: invalid team " + team );
  619. }
  620.  
  621. wait_endon( waitTime, endOnString, endonString2, endonString3 )
  622. {
  623. self endon( endOnString );
  624. if ( isDefined( endonString2 ) )
  625. self endon( endonString2 );
  626. if ( isDefined( endonString3 ) )
  627. self endon( endonString3 );
  628.  
  629. wait( waitTime );
  630. }
  631.  
  632. isMG( weapon )
  633. {
  634. return ( isSubStr( weapon, "_bipod_" ) || weapon == "turret_minigun_mp" );
  635. }
  636.  
  637. initPersStat( dataName )
  638. {
  639. if ( !isDefined( self.pers[ dataName ] ) )
  640. self.pers[ dataName ] = 0;
  641. }
  642.  
  643. getPersStat( dataName )
  644. {
  645. return self.pers[ dataName ];
  646. }
  647.  
  648. incPersStat( dataName, increment )
  649. {
  650. self.pers[ dataName ] += increment;
  651. self maps\mp\gametypes\_persistence::statAdd( dataName, increment );
  652. }
  653.  
  654. setPersStat( dataName, value )
  655. {
  656. assertEx( isDefined( dataName ), "Called setPersStat with no dataName defined." );
  657. assertEx( isDefined( value ), "Called setPersStat for " + dataName + " with no value defined." );
  658.  
  659. self.pers[ dataName ] = value;
  660. }
  661.  
  662. initPlayerStat( ref, defaultvalue )
  663. {
  664. if ( !isDefined( self.stats["stats_" + ref ] ) )
  665. {
  666. if ( !isDefined( defaultvalue ) )
  667. defaultvalue = 0;
  668.  
  669. self.stats["stats_" + ref ] = spawnstruct();
  670. self.stats["stats_" + ref ].value = defaultvalue;
  671. }
  672. }
  673.  
  674. incPlayerStat( ref, increment )
  675. {
  676. stat = self.stats["stats_" + ref ];
  677. stat.value += increment;
  678. }
  679.  
  680. setPlayerStat( ref, value )
  681. {
  682. stat = self.stats["stats_" + ref ];
  683. stat.value = value;
  684. stat.time = getTime();
  685. }
  686.  
  687. getPlayerStat( ref )
  688. {
  689. return self.stats["stats_" + ref ].value;
  690. }
  691.  
  692. getPlayerStatTime( ref )
  693. {
  694. return self.stats["stats_" + ref ].time;
  695. }
  696.  
  697. setPlayerStatIfGreater( ref, newvalue )
  698. {
  699. currentvalue = self getPlayerStat( ref );
  700.  
  701. if ( newvalue > currentvalue )
  702. self setPlayerStat( ref, newvalue );
  703. }
  704.  
  705. setPlayerStatIfLower( ref, newvalue )
  706. {
  707. currentvalue = self getPlayerStat( ref );
  708.  
  709. if ( newvalue < currentvalue )
  710. self setPlayerStat( ref, newvalue );
  711. }
  712.  
  713. updatePersRatio( ratio, num, denom )
  714. {
  715. numValue = self maps\mp\gametypes\_persistence::statGet( num );
  716. denomValue = self maps\mp\gametypes\_persistence::statGet( denom );
  717. if ( denomValue == 0 )
  718. denomValue = 1;
  719.  
  720. self maps\mp\gametypes\_persistence::statSet( ratio, int( ( numValue * 1000 ) / denomValue ) );
  721. }
  722.  
  723. updatePersRatioBuffered( ratio, num, denom )
  724. {
  725. numValue = self maps\mp\gametypes\_persistence::statGetBuffered( num );
  726. denomValue = self maps\mp\gametypes\_persistence::statGetBuffered( denom );
  727. if ( denomValue == 0 )
  728. denomValue = 1;
  729.  
  730. self maps\mp\gametypes\_persistence::statSetBuffered( ratio, int( ( numValue * 1000 ) / denomValue ) );
  731. }
  732.  
  733.  
  734. // to be used with things that are slow.
  735. // unfortunately, it can only be used with things that aren't time critical.
  736. WaitTillSlowProcessAllowed( allowLoop )
  737. {
  738. // wait only a few frames if necessary
  739. // if we wait too long, we might get too many threads at once and run out of variables
  740. // i'm trying to avoid using a loop because i don't want any extra variables
  741. if ( level.lastSlowProcessFrame == gettime() )
  742. {
  743. if ( isDefined( allowLoop ) && allowLoop )
  744. {
  745. while ( level.lastSlowProcessFrame == getTime() )
  746. wait( 0.05 );
  747. }
  748. else
  749. {
  750. wait .05;
  751. if ( level.lastSlowProcessFrame == gettime() )
  752. {
  753. wait .05;
  754. if ( level.lastSlowProcessFrame == gettime() )
  755. {
  756. wait .05;
  757. if ( level.lastSlowProcessFrame == gettime() )
  758. {
  759. wait .05;
  760. }
  761. }
  762. }
  763. }
  764. }
  765.  
  766. level.lastSlowProcessFrame = getTime();
  767. }
  768.  
  769.  
  770. waitForTimeOrNotify( time, notifyname )
  771. {
  772. self endon( notifyname );
  773. wait time;
  774. }
  775.  
  776.  
  777. isExcluded( entity, entityList )
  778. {
  779. for ( index = 0; index < entityList.size; index++ )
  780. {
  781. if ( entity == entityList[ index ] )
  782. return true;
  783. }
  784. return false;
  785. }
  786.  
  787.  
  788. leaderDialog( dialog, team, group, excludeList )
  789. {
  790. assert( isdefined( level.players ) );
  791.  
  792. if ( level.splitscreen )
  793. return;
  794.  
  795. if ( dialog == "null" )
  796. return;
  797.  
  798. if ( !isDefined( team ) )
  799. {
  800. leaderDialogBothTeams( dialog, "allies", dialog, "axis", group, excludeList );
  801. return;
  802. }
  803.  
  804. if ( level.splitscreen )
  805. {
  806. if ( level.players.size )
  807. level.players[ 0 ] leaderDialogOnPlayer( dialog, group );
  808. return;
  809. }
  810.  
  811. if ( isDefined( excludeList ) )
  812. {
  813. for ( i = 0; i < level.players.size; i++ )
  814. {
  815. player = level.players[ i ];
  816. if ( ( isDefined( player.pers[ "team" ] ) && ( player.pers[ "team" ] == team ) ) && !isExcluded( player, excludeList ) )
  817. player leaderDialogOnPlayer( dialog, group );
  818. }
  819. }
  820. else
  821. {
  822. for ( i = 0; i < level.players.size; i++ )
  823. {
  824. player = level.players[ i ];
  825. if ( isDefined( player.pers[ "team" ] ) && ( player.pers[ "team" ] == team ) )
  826. player leaderDialogOnPlayer( dialog, group );
  827. }
  828. }
  829. }
  830.  
  831.  
  832. leaderDialogBothTeams( dialog1, team1, dialog2, team2, group, excludeList )
  833. {
  834. assert( isdefined( level.players ) );
  835.  
  836. if ( level.splitscreen )
  837. return;
  838.  
  839. if ( level.splitscreen )
  840. {
  841. if ( level.players.size )
  842. level.players[ 0 ] leaderDialogOnPlayer( dialog1, group );
  843. return;
  844. }
  845.  
  846. if ( isDefined( excludeList ) )
  847. {
  848. for ( i = 0; i < level.players.size; i++ )
  849. {
  850. player = level.players[ i ];
  851. team = player.pers[ "team" ];
  852.  
  853. if ( !isDefined( team ) )
  854. continue;
  855.  
  856. if ( isExcluded( player, excludeList ) )
  857. continue;
  858.  
  859. if ( team == team1 )
  860. player leaderDialogOnPlayer( dialog1, group );
  861. else if ( team == team2 )
  862. player leaderDialogOnPlayer( dialog2, group );
  863. }
  864. }
  865. else
  866. {
  867. for ( i = 0; i < level.players.size; i++ )
  868. {
  869. player = level.players[ i ];
  870. team = player.pers[ "team" ];
  871.  
  872. if ( !isDefined( team ) )
  873. continue;
  874.  
  875. if ( team == team1 )
  876. player leaderDialogOnPlayer( dialog1, group );
  877. else if ( team == team2 )
  878. player leaderDialogOnPlayer( dialog2, group );
  879. }
  880. }
  881. }
  882.  
  883.  
  884. leaderDialogOnPlayers( dialog, players, group )
  885. {
  886. foreach ( player in players )
  887. player leaderDialogOnPlayer( dialog, group );
  888. }
  889.  
  890.  
  891. leaderDialogOnPlayer( dialog, group, groupOverride )
  892. {
  893. if ( !isDefined( groupOverride ) )
  894. groupOverride = false;
  895.  
  896. team = self.pers[ "team" ];
  897.  
  898. if ( level.splitscreen )
  899. return;
  900.  
  901. if ( !isDefined( team ) )
  902. return;
  903.  
  904. if ( team != "allies" && team != "axis" )
  905. return;
  906.  
  907. if ( isDefined( group ) )
  908. {
  909. // ignore the message if one from the same group is already playing
  910. if ( self.leaderDialogGroup == group )
  911. {
  912. if ( groupOverride )
  913. {
  914. self stopLocalSound( self.leaderDialogActive );
  915. self thread playLeaderDialogOnPlayer( dialog, team );
  916. }
  917.  
  918. return;
  919. }
  920.  
  921. hadGroupDialog = isDefined( self.leaderDialogGroups[ group ] );
  922.  
  923. self.leaderDialogGroups[ group ] = dialog;
  924. dialog = group;
  925.  
  926. // exit because the "group" dialog call is already in the queue
  927. if ( hadGroupDialog )
  928. return;
  929. }
  930.  
  931. if ( self.leaderDialogActive == "" )
  932. self thread playLeaderDialogOnPlayer( dialog, team );
  933. else
  934. self.leaderDialogQueue[ self.leaderDialogQueue.size ] = dialog;
  935. }
  936.  
  937.  
  938. playLeaderDialogOnPlayer( dialog, team )
  939. {
  940. self endon( "disconnect" );
  941.  
  942. self notify ( "playLeaderDialogOnPlayer" );
  943. self endon ( "playLeaderDialogOnPlayer" );
  944.  
  945. if ( isDefined( self.leaderDialogGroups[ dialog ] ) )
  946. {
  947. group = dialog;
  948. dialog = self.leaderDialogGroups[ group ];
  949. self.leaderDialogGroups[ group ] = undefined;
  950. self.leaderDialogGroup = group;
  951. }
  952.  
  953. assertEx( isDefined( game[ "dialog" ][ dialog ] ), "Dialog " + dialog + " was not defined in game[dialog] array." );
  954.  
  955. if ( isSubStr( game[ "dialog" ][ dialog ], "null" ) )
  956. return;
  957.  
  958. self.leaderDialogActive = game[ "voice" ][ team ] + game[ "dialog" ][ dialog ];
  959. self playLocalSound( game[ "voice" ][ team ] + game[ "dialog" ][ dialog ] );
  960.  
  961. wait( 3.0 );
  962. self.leaderDialogLocalSound = "";
  963.  
  964. self.leaderDialogActive = "";
  965. self.leaderDialogGroup = "";
  966.  
  967. if ( self.leaderDialogQueue.size > 0 )
  968. {
  969. nextDialog = self.leaderDialogQueue[ 0 ];
  970.  
  971. for ( i = 1; i < self.leaderDialogQueue.size; i++ )
  972. self.leaderDialogQueue[ i - 1 ] = self.leaderDialogQueue[ i ];
  973. self.leaderDialogQueue[ i - 1 ] = undefined;
  974.  
  975. self thread playLeaderDialogOnPlayer( nextDialog, team );
  976. }
  977. }
  978.  
  979.  
  980. updateMainMenu()
  981. {
  982. if (self.pers[ "team" ] == "spectator" )
  983. {
  984. self setClientDvar("g_scriptMainMenu", game["menu_team"]);
  985. }
  986. else
  987. {
  988. self setClientDvar( "g_scriptMainMenu", game[ "menu_class_" + self.pers["team"] ] );
  989. }
  990. }
  991.  
  992.  
  993. updateObjectiveText()
  994. {
  995. if ( self.pers[ "team" ] == "spectator" )
  996. {
  997. self setClientDvar( "cg_objectiveText", "" );
  998. return;
  999. }
  1000.  
  1001. if ( getWatchedDvar( "scorelimit" ) > 0 && !isObjectiveBased() )
  1002. {
  1003. if ( level.splitScreen )
  1004. self setclientdvar( "cg_objectiveText", getObjectiveScoreText( self.pers[ "team" ] ) );
  1005. else
  1006. self setclientdvar( "cg_objectiveText", getObjectiveScoreText( self.pers[ "team" ] ), getWatchedDvar( "scorelimit" ) );
  1007. }
  1008. else
  1009. {
  1010. self setclientdvar( "cg_objectiveText", getObjectiveText( self.pers[ "team" ] ) );
  1011. }
  1012. }
  1013.  
  1014.  
  1015. setObjectiveText( team, text )
  1016. {
  1017. game[ "strings" ][ "objective_" + team ] = text;
  1018. precacheString( text );
  1019. }
  1020.  
  1021. setObjectiveScoreText( team, text )
  1022. {
  1023. game[ "strings" ][ "objective_score_" + team ] = text;
  1024. precacheString( text );
  1025. }
  1026.  
  1027. setObjectiveHintText( team, text )
  1028. {
  1029. game[ "strings" ][ "objective_hint_" + team ] = text;
  1030. precacheString( text );
  1031. }
  1032.  
  1033. getObjectiveText( team )
  1034. {
  1035. return game[ "strings" ][ "objective_" + team ];
  1036. }
  1037.  
  1038. getObjectiveScoreText( team )
  1039. {
  1040. return game[ "strings" ][ "objective_score_" + team ];
  1041. }
  1042.  
  1043. getObjectiveHintText( team )
  1044. {
  1045. return game[ "strings" ][ "objective_hint_" + team ];
  1046. }
  1047.  
  1048.  
  1049.  
  1050. getTimePassed()
  1051. {
  1052. if ( !isDefined( level.startTime ) )
  1053. return 0;
  1054.  
  1055. if ( level.timerStopped )
  1056. return( level.timerPauseTime - level.startTime ) - level.discardTime;
  1057. else
  1058. return( gettime() - level.startTime ) - level.discardTime;
  1059.  
  1060. }
  1061.  
  1062. getSecondsPassed()
  1063. {
  1064. return (getTimePassed() / 1000);
  1065. }
  1066.  
  1067. getMinutesPassed()
  1068. {
  1069. return (getSecondsPassed() / 60);
  1070. }
  1071.  
  1072. ClearKillcamState()
  1073. {
  1074. self.forcespectatorclient = -1;
  1075. self.killcamentity = -1;
  1076. self.archivetime = 0;
  1077. self.psoffsettime = 0;
  1078. }
  1079.  
  1080. isInKillcam()
  1081. {
  1082. return ( self.forcespectatorclient != -1 || self.killcamentity != -1 );
  1083. }
  1084.  
  1085. isValidClass( class )
  1086. {
  1087. return isDefined( class ) && class != "";
  1088. }
  1089.  
  1090.  
  1091.  
  1092. getValueInRange( value, minValue, maxValue )
  1093. {
  1094. if ( value > maxValue )
  1095. return maxValue;
  1096. else if ( value < minValue )
  1097. return minValue;
  1098. else
  1099. return value;
  1100. }
  1101.  
  1102.  
  1103.  
  1104.  
  1105. waitForTimeOrNotifies( desiredDelay )
  1106. {
  1107. startedWaiting = getTime();
  1108.  
  1109. waitedTime = ( getTime() - startedWaiting ) / 1000;
  1110.  
  1111. if ( waitedTime < desiredDelay )
  1112. {
  1113. wait desiredDelay - waitedTime;
  1114. return desiredDelay;
  1115. }
  1116. else
  1117. {
  1118. return waitedTime;
  1119. }
  1120. }
  1121.  
  1122. closeMenus()
  1123. {
  1124. self closepopupMenu();
  1125. self closeInGameMenu();
  1126. }
  1127.  
  1128.  
  1129. logXPGains()
  1130. {
  1131. if ( !isDefined( self.xpGains ) )
  1132. return;
  1133.  
  1134. xpTypes = getArrayKeys( self.xpGains );
  1135. for ( index = 0; index < xpTypes.size; index++ )
  1136. {
  1137. gain = self.xpGains[ xpTypes[ index ] ];
  1138. if ( !gain )
  1139. continue;
  1140.  
  1141. self logString( "xp " + xpTypes[ index ] + ": " + gain );
  1142. }
  1143. }
  1144.  
  1145.  
  1146. registerRoundSwitchDvar( dvarString, defaultValue, minValue, maxValue )
  1147. {
  1148. registerWatchDvarInt( "roundswitch", defaultValue );
  1149.  
  1150. dvarString = ( "scr_" + dvarString + "_roundswitch" );
  1151.  
  1152. level.roundswitchDvar = dvarString;
  1153. level.roundswitchMin = minValue;
  1154. level.roundswitchMax = maxValue;
  1155. level.roundswitch = getDvarInt( dvarString, defaultValue );
  1156.  
  1157. if ( level.roundswitch < minValue )
  1158. level.roundswitch = minValue;
  1159. else if ( level.roundswitch > maxValue )
  1160. level.roundswitch = maxValue;
  1161. }
  1162.  
  1163.  
  1164. registerRoundLimitDvar( dvarString, defaultValue, minValue, maxValue )
  1165. {
  1166. registerWatchDvarInt( "roundlimit", defaultValue );
  1167. }
  1168.  
  1169.  
  1170. registerWinLimitDvar( dvarString, defaultValue, minValue, maxValue )
  1171. {
  1172. registerWatchDvarInt( "winlimit", defaultValue );
  1173. }
  1174.  
  1175.  
  1176. registerScoreLimitDvar( dvarString, defaultValue, minValue, maxValue )
  1177. {
  1178. registerWatchDvarInt( "scorelimit", defaultValue );
  1179. }
  1180.  
  1181.  
  1182. registerTimeLimitDvar( dvarString, defaultValue, minValue, maxValue )
  1183. {
  1184. registerWatchDvarFloat( "timelimit", defaultValue );
  1185. makeDvarServerInfo( "ui_timelimit", getTimeLimit() );
  1186. }
  1187.  
  1188. registerHalfTimeDvar( dvarString, defaultValue, minValue, maxValue)
  1189. {
  1190. registerWatchDvarInt( "halftime", defaultValue );
  1191. makeDvarServerInfo( "ui_halftime", getHalfTime() );
  1192. }
  1193.  
  1194. registerNumLivesDvar( dvarString, defaultValue, minValue, maxValue )
  1195. {
  1196. registerWatchDvarInt( "numlives", defaultValue );
  1197. }
  1198.  
  1199. setOverTimeLimitDvar( value )
  1200. {
  1201. makeDvarServerInfo( "overtimeTimeLimit", value );
  1202. }
  1203.  
  1204. get_damageable_player( player, playerpos )
  1205. {
  1206. newent = spawnstruct();
  1207. newent.isPlayer = true;
  1208. newent.isADestructable = false;
  1209. newent.entity = player;
  1210. newent.damageCenter = playerpos;
  1211. return newent;
  1212. }
  1213.  
  1214. get_damageable_sentry( sentry, sentryPos )
  1215. {
  1216. newent = spawnstruct();
  1217. newent.isPlayer = false;
  1218. newent.isADestructable = false;
  1219. newent.isSentry = true;
  1220. newent.entity = sentry;
  1221. newent.damageCenter = sentryPos;
  1222. return newent;
  1223. }
  1224.  
  1225. get_damageable_grenade( grenade, entpos )
  1226. {
  1227. newent = spawnstruct();
  1228. newent.isPlayer = false;
  1229. newent.isADestructable = false;
  1230. newent.entity = grenade;
  1231. newent.damageCenter = entpos;
  1232. return newent;
  1233. }
  1234.  
  1235. get_damageable_player_pos( player )
  1236. {
  1237. return player.origin + ( 0, 0, 32 );
  1238. }
  1239.  
  1240. get_damageable_grenade_pos( grenade )
  1241. {
  1242. return grenade.origin;
  1243. }
  1244.  
  1245. // this should be a code function.
  1246. getDvarVec( dvarName )
  1247. {
  1248. dvarString = getDvar( dvarName );
  1249.  
  1250. if ( dvarString == "" )
  1251. return( 0, 0, 0 );
  1252.  
  1253. dvarTokens = strTok( dvarString, " " );
  1254.  
  1255. if ( dvarTokens.size < 3 )
  1256. return( 0, 0, 0 );
  1257.  
  1258. setDvar( "tempR", dvarTokens[ 0 ] );
  1259. setDvar( "tempG", dvarTokens[ 1 ] );
  1260. setDvar( "tempB", dvarTokens[ 2 ] );
  1261.  
  1262. return( ( getDvarFloat( "tempR" ), getDvarFloat( "tempG" ), getDvarFloat( "tempB" ) ) );
  1263. }
  1264.  
  1265. strip_suffix( lookupString, stripString )
  1266. {
  1267. if ( lookupString.size <= stripString.size )
  1268. return lookupString;
  1269.  
  1270. if ( getSubStr( lookupString, lookupString.size - stripString.size, lookupString.size ) == stripString )
  1271. return getSubStr( lookupString, 0, lookupString.size - stripString.size );
  1272.  
  1273. return lookupString;
  1274. }
  1275.  
  1276. _takeWeaponsExcept( saveWeapon )
  1277. {
  1278. weaponsList = self GetWeaponsListAll();
  1279.  
  1280. foreach ( weapon in weaponsList )
  1281. {
  1282. if ( weapon == saveWeapon )
  1283. {
  1284. continue;
  1285. }
  1286. else
  1287. {
  1288. self takeWeapon( weapon );
  1289. }
  1290. }
  1291. }
  1292.  
  1293. saveData()
  1294. {
  1295. saveData = spawnstruct();
  1296.  
  1297. saveData.offhandClass = self getOffhandSecondaryClass();
  1298. saveData.actionSlots = self.saved_actionSlotData;
  1299.  
  1300. saveData.currentWeapon = self getCurrentWeapon();
  1301.  
  1302. weaponsList = self GetWeaponsListAll();
  1303. saveData.weapons = [];
  1304. foreach ( weapon in weaponsList )
  1305. {
  1306. if ( weaponInventoryType( weapon ) == "exclusive" )
  1307. continue;
  1308.  
  1309. if ( weaponInventoryType( weapon ) == "altmode" )
  1310. continue;
  1311.  
  1312. saveWeapon = spawnStruct();
  1313. saveWeapon.name = weapon;
  1314. saveWeapon.clipAmmoR = self getWeaponAmmoClip( weapon, "right" );
  1315. saveWeapon.clipAmmoL = self getWeaponAmmoClip( weapon, "left" );
  1316. saveWeapon.stockAmmo = self getWeaponAmmoStock( weapon );
  1317. /* save camo? */
  1318.  
  1319. if ( isDefined( self.throwingGrenade ) && self.throwingGrenade == weapon )
  1320. saveWeapon.stockAmmo--;
  1321.  
  1322. assert( saveWeapon.stockAmmo >= 0 );
  1323.  
  1324. saveData.weapons[saveData.weapons.size] = saveWeapon;
  1325. }
  1326.  
  1327. self.script_saveData = saveData;
  1328. }
  1329.  
  1330.  
  1331. restoreData()
  1332. {
  1333. saveData = self.script_saveData;
  1334.  
  1335. self setOffhandSecondaryClass( saveData.offhandClass );
  1336.  
  1337. foreach ( weapon in saveData.weapons )
  1338. {
  1339. //if ( weapon.name == self.loadoutPrimary + "_mp" )
  1340. self _giveWeapon( weapon.name, int(tableLookup( "mp/camoTable.csv", 1, self.loadoutPrimaryCamo, 0 )) );
  1341. //else
  1342. //self _giveWeapon( weapon.name );
  1343.  
  1344. self setWeaponAmmoClip( weapon.name, weapon.clipAmmoR, "right" );
  1345. if ( isSubStr( weapon.name, "akimbo" ) )
  1346. self setWeaponAmmoClip( weapon.name, weapon.clipAmmoL, "left" );
  1347.  
  1348. self setWeaponAmmoStock( weapon.name, weapon.stockAmmo );
  1349. }
  1350.  
  1351. foreach ( slotID, actionSlot in saveData.actionSlots )
  1352. self _setActionSlot( slotID, actionSlot.type, actionSlot.item );
  1353.  
  1354. if ( self getCurrentWeapon() == "none" )
  1355. {
  1356. weapon = saveData.currentWeapon;
  1357.  
  1358. if ( weapon == "none" )
  1359. weapon = self getLastWeapon();
  1360.  
  1361. // Can remove this when "spawn" isn't used after final stand
  1362. self setSpawnWeapon( weapon );
  1363. self switchToWeapon( weapon );
  1364. }
  1365. }
  1366.  
  1367.  
  1368. _setActionSlot( slotID, type, item )
  1369. {
  1370. self.saved_actionSlotData[slotID].type = type;
  1371. self.saved_actionSlotData[slotID].item = item;
  1372.  
  1373. self setActionSlot( slotID, type, item );
  1374. }
  1375.  
  1376.  
  1377. isFloat( value )
  1378. {
  1379. if ( int( value ) != value )
  1380. return true;
  1381.  
  1382. return false;
  1383. }
  1384.  
  1385. registerWatchDvarInt( nameString, defaultValue )
  1386. {
  1387. dvarString = "scr_" + level.gameType + "_" + nameString;
  1388.  
  1389. level.watchDvars[ dvarString ] = spawnStruct();
  1390. level.watchDvars[ dvarString ].value = getDvarInt( dvarString, defaultValue );
  1391. level.watchDvars[ dvarString ].type = "int";
  1392. level.watchDvars[ dvarString ].notifyString = "update_" + nameString;
  1393. }
  1394.  
  1395.  
  1396. registerWatchDvarFloat( nameString, defaultValue )
  1397. {
  1398. dvarString = "scr_" + level.gameType + "_" + nameString;
  1399.  
  1400. level.watchDvars[ dvarString ] = spawnStruct();
  1401. level.watchDvars[ dvarString ].value = getDvarFloat( dvarString, defaultValue );
  1402. level.watchDvars[ dvarString ].type = "float";
  1403. level.watchDvars[ dvarString ].notifyString = "update_" + nameString;
  1404. }
  1405.  
  1406.  
  1407. registerWatchDvar( nameString, defaultValue )
  1408. {
  1409. dvarString = "scr_" + level.gameType + "_" + nameString;
  1410.  
  1411. level.watchDvars[ dvarString ] = spawnStruct();
  1412. level.watchDvars[ dvarString ].value = getDvar( dvarString, defaultValue );
  1413. level.watchDvars[ dvarString ].type = "string";
  1414. level.watchDvars[ dvarString ].notifyString = "update_" + nameString;
  1415. }
  1416.  
  1417.  
  1418. getWatchedDvar( dvarString )
  1419. {
  1420. dvarString = "scr_" + level.gameType + "_" + dvarString;
  1421. return( level.watchDvars[ dvarString ].value );
  1422. }
  1423.  
  1424.  
  1425. updateWatchedDvars()
  1426. {
  1427. while ( game[ "state" ] == "playing" )
  1428. {
  1429. watchDvars = getArrayKeys( level.watchDvars );
  1430.  
  1431. foreach ( dvarString in watchDvars )
  1432. {
  1433. if ( level.watchDvars[ dvarString ].type == "string" )
  1434. dvarValue = getProperty( dvarString, level.watchDvars[ dvarString ].value );
  1435. else if ( level.watchDvars[ dvarString ].type == "float" )
  1436. dvarValue = getFloatProperty( dvarString, level.watchDvars[ dvarString ].value );
  1437. else
  1438. dvarValue = getIntProperty( dvarString, level.watchDvars[ dvarString ].value );
  1439.  
  1440. if ( dvarValue != level.watchDvars[ dvarString ].value )
  1441. {
  1442. level.watchDvars[ dvarString ].value = dvarValue;
  1443. level notify( level.watchDvars[ dvarString ].notifyString, dvarValue );
  1444. }
  1445. }
  1446.  
  1447. wait( 1.0 );
  1448. }
  1449. }
  1450.  
  1451.  
  1452. isRoundBased()
  1453. {
  1454. if ( !level.teamBased )
  1455. return false;
  1456.  
  1457. if ( getWatchedDvar( "winlimit" ) != 1 && getWatchedDvar( "roundlimit" ) != 1 )
  1458. return true;
  1459.  
  1460. return false;
  1461. }
  1462.  
  1463.  
  1464. isLastRound()
  1465. {
  1466. if ( !level.teamBased )
  1467. return true;
  1468.  
  1469. if ( getWatchedDvar( "roundlimit" ) > 1 && game[ "roundsPlayed" ] >= ( getWatchedDvar( "roundlimit" ) - 1 ) )
  1470. return true;
  1471.  
  1472. if ( getWatchedDvar( "winlimit" ) > 1 && game[ "roundsWon" ][ "allies" ] >= getWatchedDvar( "winlimit" ) - 1 && game[ "roundsWon" ][ "axis" ] >= getWatchedDvar( "winlimit" ) - 1 )
  1473. return true;
  1474.  
  1475. return false;
  1476. }
  1477.  
  1478.  
  1479. wasOnlyRound()
  1480. {
  1481. if ( !level.teamBased )
  1482. return true;
  1483.  
  1484. if ( getWatchedDvar( "winlimit" ) == 1 && hitWinLimit() )
  1485. return true;
  1486.  
  1487. if ( getWatchedDvar( "roundlimit" ) == 1 )
  1488. return true;
  1489.  
  1490. return false;
  1491. }
  1492.  
  1493.  
  1494. wasLastRound()
  1495. {
  1496. if ( level.forcedEnd )
  1497. return true;
  1498.  
  1499. if ( !level.teamBased )
  1500. return true;
  1501.  
  1502. if ( hitRoundLimit() || hitWinLimit() )
  1503. return true;
  1504.  
  1505. return false;
  1506. }
  1507.  
  1508.  
  1509. hitRoundLimit()
  1510. {
  1511. if ( getWatchedDvar( "roundlimit" ) <= 0 )
  1512. return false;
  1513.  
  1514. return( game[ "roundsPlayed" ] >= getWatchedDvar( "roundlimit" ) );
  1515. }
  1516.  
  1517.  
  1518. hitScoreLimit()
  1519. {
  1520. if ( isObjectiveBased() )
  1521. return false;
  1522.  
  1523. if ( getWatchedDvar( "scorelimit" ) <= 0 )
  1524. return false;
  1525.  
  1526. if ( level.teamBased )
  1527. {
  1528. if ( game[ "teamScores" ][ "allies" ] >= getWatchedDvar( "scorelimit" ) || game[ "teamScores" ][ "axis" ] >= getWatchedDvar( "scorelimit" ) )
  1529. return true;
  1530. }
  1531. else
  1532. {
  1533. for ( i = 0; i < level.players.size; i++ )
  1534. {
  1535. player = level.players[ i ];
  1536. if ( isDefined( player.score ) && player.score >= getWatchedDvar( "scorelimit" ) )
  1537. return true;
  1538. }
  1539. }
  1540. return false;
  1541. }
  1542.  
  1543.  
  1544. hitWinLimit()
  1545. {
  1546. if ( getWatchedDvar( "winlimit" ) <= 0 )
  1547. return false;
  1548.  
  1549. if ( !level.teamBased )
  1550. return true;
  1551.  
  1552. if ( getRoundsWon( "allies" ) >= getWatchedDvar( "winlimit" ) || getRoundsWon( "axis" ) >= getWatchedDvar( "winlimit" ) )
  1553. return true;
  1554.  
  1555. return false;
  1556. }
  1557.  
  1558.  
  1559. getScoreLimit()
  1560. {
  1561. if ( isRoundBased() )
  1562. {
  1563. if ( getWatchedDvar( "roundlimit" ) )
  1564. return ( getWatchedDvar( "roundlimit" ) );
  1565. else
  1566. return ( getWatchedDvar( "winlimit" ) );
  1567. }
  1568. else
  1569. {
  1570. return ( getWatchedDvar( "scorelimit" ) );
  1571. }
  1572. }
  1573.  
  1574.  
  1575. getRoundsWon( team )
  1576. {
  1577. return game[ "roundsWon" ][ team ];
  1578. }
  1579.  
  1580.  
  1581. isObjectiveBased()
  1582. {
  1583. return level.objectiveBased;
  1584. }
  1585.  
  1586.  
  1587. getTimeLimit()
  1588. {
  1589. if ( inOvertime() && ( !isDefined(game[ "inNukeOvertime" ]) || !game[ "inNukeOvertime" ] ) )
  1590. {
  1591. timeLimit = int( getDvar( "overtimeTimeLimit" ) );
  1592.  
  1593. if ( isDefined( timeLimit ) )
  1594. return timeLimit;
  1595. else
  1596. return 1;
  1597. }
  1598. else if ( isDefined(level.dd) && level.dd && isDefined( level.bombexploded ) && level.bombexploded > 0 ) //to handle extra time added by dd bombs
  1599. {
  1600. return ( getWatchedDvar( "timelimit" ) + ( level.bombexploded * level.ddTimeToAdd ) );
  1601. }
  1602. else
  1603. {
  1604. return getWatchedDvar( "timelimit" );
  1605. }
  1606. }
  1607.  
  1608.  
  1609. getHalfTime()
  1610. {
  1611. if ( inOvertime() )
  1612. return false;
  1613. else if ( isDefined( game[ "inNukeOvertime" ] ) && game[ "inNukeOvertime" ] )
  1614. return false;
  1615. else
  1616. return getWatchedDvar( "halftime" );
  1617. }
  1618.  
  1619.  
  1620. inOvertime()
  1621. {
  1622. return ( isDefined( game["status"] ) && game["status"] == "overtime" );
  1623. }
  1624.  
  1625.  
  1626. gameHasStarted()
  1627. {
  1628. if ( level.teamBased )
  1629. return( level.hasSpawned[ "axis" ] && level.hasSpawned[ "allies" ] );
  1630. else
  1631. return( level.maxPlayerCount > 1 );
  1632. }
  1633.  
  1634.  
  1635. getAverageOrigin( ent_array )
  1636. {
  1637. avg_origin = ( 0, 0, 0 );
  1638.  
  1639. if ( !ent_array.size )
  1640. return undefined;
  1641.  
  1642. foreach ( ent in ent_array )
  1643. avg_origin += ent.origin;
  1644.  
  1645. avg_x = int( avg_origin[ 0 ] / ent_array.size );
  1646. avg_y = int( avg_origin[ 1 ] / ent_array.size );
  1647. avg_z = int( avg_origin[ 2 ] / ent_array.size );
  1648.  
  1649. avg_origin = ( avg_x, avg_y, avg_z );
  1650.  
  1651. return avg_origin;
  1652. }
  1653.  
  1654.  
  1655. getLivingPlayers( team )
  1656. {
  1657. player_array = [];
  1658.  
  1659. foreach ( player in level.players )
  1660. {
  1661. if ( !isAlive( player ) )
  1662. continue;
  1663.  
  1664. if ( level.teambased && isdefined( team ) )
  1665. {
  1666. if ( team == player.pers[ "team" ] )
  1667. player_array[ player_array.size ] = player;
  1668. }
  1669. else
  1670. {
  1671. player_array[ player_array.size ] = player;
  1672. }
  1673. }
  1674.  
  1675. return player_array;
  1676. }
  1677.  
  1678.  
  1679. setUsingRemote( remoteName )
  1680. {
  1681. if ( isDefined( self.carryIcon) )
  1682. self.carryIcon.alpha = 0;
  1683.  
  1684. assert( !self isUsingRemote() );
  1685. self.usingRemote = remoteName;
  1686.  
  1687. self _disableOffhandWeapons();
  1688. self notify( "using_remote" );
  1689. }
  1690.  
  1691. getRemoteName()
  1692. {
  1693. assert( self isUsingRemote() );
  1694.  
  1695. return self.usingRemote;
  1696. }
  1697.  
  1698. freezeControlsWrapper( frozen )
  1699. {
  1700. if ( isDefined( level.hostMigrationTimer ) )
  1701. {
  1702. self freezeControls( true );
  1703. return;
  1704. }
  1705.  
  1706. self freezeControls( frozen );
  1707. }
  1708.  
  1709.  
  1710. clearUsingRemote()
  1711. {
  1712. //if ( !isWeaponEnabled() )
  1713. // self disableWeapons();
  1714.  
  1715. if ( isDefined( self.carryIcon) )
  1716. self.carryIcon.alpha = 1;
  1717.  
  1718. self.usingRemote = undefined;
  1719. self _enableOffhandWeapons();
  1720.  
  1721. curWeapon = self getCurrentWeapon();
  1722.  
  1723. if( curWeapon == "none" || isKillstreakWeapon( curWeapon ) )
  1724. self switchToWeapon( self Getlastweapon() );
  1725.  
  1726. self freezeControlsWrapper( false );
  1727.  
  1728. self notify( "stopped_using_remote" );
  1729. }
  1730.  
  1731.  
  1732. isUsingRemote()
  1733. {
  1734. return( isDefined( self.usingRemote ) );
  1735. }
  1736.  
  1737.  
  1738. queueCreate( queueName )
  1739. {
  1740. if ( !isDefined( level.queues ) )
  1741. level.queues = [];
  1742.  
  1743. assert( !isDefined( level.queues[ queueName ] ) );
  1744.  
  1745. level.queues[ queueName ] = [];
  1746. }
  1747.  
  1748.  
  1749. queueAdd( queueName, entity )
  1750. {
  1751. assert( isDefined( level.queues[ queueName ] ) );
  1752. level.queues[ queueName ][ level.queues[ queueName ].size ] = entity;
  1753. }
  1754.  
  1755.  
  1756. queueRemoveFirst( queueName )
  1757. {
  1758. assert( isDefined( level.queues[ queueName ] ) );
  1759.  
  1760. first = undefined;
  1761. newQueue = [];
  1762. foreach ( element in level.queues[ queueName ] )
  1763. {
  1764. if ( !isDefined( element ) )
  1765. continue;
  1766.  
  1767. if ( !isDefined( first ) )
  1768. first = element;
  1769. else
  1770. newQueue[ newQueue.size ] = element;
  1771. }
  1772.  
  1773. level.queues[ queueName ] = newQueue;
  1774.  
  1775. return first;
  1776. }
  1777.  
  1778.  
  1779. _giveWeapon( weapon, variant, dualWieldOverRide )
  1780. {
  1781. if ( !isDefined(variant) )
  1782. variant = 0;
  1783.  
  1784. if ( isSubstr( weapon, "_akimbo" ) || isDefined(dualWieldOverRide) && dualWieldOverRide == true)
  1785. self giveWeapon(weapon, variant, true);
  1786. else
  1787. self giveWeapon(weapon, variant, false);
  1788. }
  1789.  
  1790. _hasPerk( perkName )
  1791. {
  1792. if ( isDefined( self.perks[perkName] ) )
  1793. return true;
  1794.  
  1795. return false;
  1796. }
  1797.  
  1798.  
  1799. _setPerk( perkName )
  1800. {
  1801. self.perks[perkName] = true;
  1802.  
  1803. if ( isDefined( level.perkSetFuncs[perkName] ) )
  1804. self thread [[level.perkSetFuncs[perkName]]]();
  1805.  
  1806. self setPerk( perkName, !isDefined( level.scriptPerks[perkName] ) );
  1807. }
  1808.  
  1809.  
  1810. _unsetPerk( perkName )
  1811. {
  1812. self.perks[perkName] = undefined;
  1813.  
  1814. if ( isDefined( level.perkUnsetFuncs[perkName] ) )
  1815. self thread [[level.perkUnsetFuncs[perkName]]]();
  1816.  
  1817. self unsetPerk( perkName, !isDefined( level.scriptPerks[perkName] ) );
  1818. }
  1819.  
  1820.  
  1821. _clearPerks()
  1822. {
  1823. foreach ( perkName, perkValue in self.perks )
  1824. {
  1825. if ( isDefined( level.perkUnsetFuncs[perkName] ) )
  1826. self [[level.perkUnsetFuncs[perkName]]]();
  1827. }
  1828.  
  1829. self.perks = [];
  1830. self clearPerks();
  1831. }
  1832.  
  1833. // Quick Sort - pass it an array it will come back sorted
  1834. quickSort(array)
  1835. {
  1836. return quickSortMid(array, 0, array.size -1 );
  1837. }
  1838.  
  1839. quickSortMid(array, start, end)
  1840. {
  1841. i = start;
  1842. k = end;
  1843.  
  1844. if (end - start >= 1)
  1845. {
  1846. pivot = array[start];
  1847.  
  1848. while (k > i)
  1849. {
  1850. while (array[i] <= pivot && i <= end && k > i)
  1851. i++;
  1852. while (array[k] > pivot && k >= start && k >= i)
  1853. k--;
  1854. if (k > i)
  1855. array = swap(array, i, k);
  1856. }
  1857. array = swap(array, start, k);
  1858. array = quickSortMid(array, start, k - 1);
  1859. array = quickSortMid(array, k + 1, end);
  1860. }
  1861. else
  1862. return array;
  1863.  
  1864. return array;
  1865. }
  1866.  
  1867. swap(array, index1, index2)
  1868. {
  1869. temp = array[index1];
  1870. array[index1] = array[index2];
  1871. array[index2] = temp;
  1872. return array;
  1873. }
  1874.  
  1875. _suicide()
  1876. {
  1877. if ( self isUsingRemote() && !isDefined( self.fauxDead ) )
  1878. self thread maps\mp\gametypes\_damage::PlayerKilled_internal( self, self, self, 10000, "MOD_SUICIDE", "frag_grenade_mp", (0,0,0), "none", 0, 1116, true );
  1879. else if( !self isUsingRemote() && !isDefined( self.fauxDead ) )
  1880. self suicide();
  1881. }
  1882.  
  1883. isReallyAlive( player )
  1884. {
  1885. if ( isAlive( player ) && !isDefined( player.fauxDead ) )
  1886. return true;
  1887.  
  1888. return false;
  1889. }
  1890.  
  1891. playDeathSound()
  1892. {
  1893. rand = RandomIntRange( 1,8 );
  1894.  
  1895. if ( self.team == "axis" )
  1896. self PlaySound( "generic_death_russian_"+ rand );
  1897. else
  1898. self PlaySound( "generic_death_american_"+ rand );
  1899.  
  1900. }
  1901.  
  1902.  
  1903. rankingEnabled()
  1904. {
  1905. assert( isPlayer( self ) );
  1906. return ( level.rankedMatch && !self.usingOnlineDataOffline );
  1907. }
  1908.  
  1909. // only true for private match
  1910. privateMatch()
  1911. {
  1912. return ( level.onlineGame && getDvarInt( "xblive_privatematch" ) );
  1913. }
  1914.  
  1915. // only true for playlist based LIVE and PSN games
  1916. matchMakingGame()
  1917. {
  1918. return ( level.onlineGame && !getDvarInt( "xblive_privatematch" ) );
  1919. }
  1920.  
  1921. setAltSceneObj( object, tagName, fov, forceLink )
  1922. {
  1923. /*
  1924. if ( !isDefined( forceLink ) )
  1925. forceLink = false;
  1926.  
  1927. if ( !getDvarInt( "scr_pipmode" ) && !forceLink )
  1928. return;
  1929.  
  1930. self endon ( "disconnect" );
  1931.  
  1932. if ( !isReallyAlive( self ) )
  1933. return;
  1934.  
  1935. if ( !forceLink && isDefined( self.altSceneObject ) )
  1936. return;
  1937.  
  1938. self notify ( "altscene" );
  1939.  
  1940. self.altSceneObject = object;
  1941.  
  1942. self AlternateSceneCameraLinkTo( object, tagName, fov );
  1943. self setClientDvar( "ui_altscene", 1 );
  1944.  
  1945. self thread endSceneOnDeath( object );
  1946. self thread endSceneOnDeath( self );
  1947.  
  1948. self waittill ( "end_altScene" );
  1949.  
  1950. self.altSceneObject = undefined;
  1951. self AlternateSceneCameraUnlink();
  1952.  
  1953. if ( !forceLink )
  1954. {
  1955. self setClientDvar( "ui_altscene", 2 );
  1956.  
  1957. self endon ( "altscene" );
  1958. wait ( 2.0 );
  1959. }
  1960. self setClientDvar( "ui_altscene", 0 );
  1961. */
  1962. }
  1963.  
  1964.  
  1965. endSceneOnDeath( object )
  1966. {
  1967. self endon ( "altscene" );
  1968.  
  1969. object waittill ( "death" );
  1970. self notify ( "end_altScene" );
  1971. }
  1972.  
  1973.  
  1974. getGametypeNumLives()
  1975. {
  1976. //commented out to allow diehardhard rules to support mulitiple life gametypes
  1977. //if ( level.dieHardMode && !getWatchedDvar( "numlives" ) )
  1978. // return 1;
  1979. //else
  1980. return getWatchedDvar( "numlives" );
  1981. }
  1982.  
  1983.  
  1984. registerAdrenalineInfo( type, value )
  1985. {
  1986. if ( !isDefined( level.adrenalineInfo ) )
  1987. level.adrenalineInfo = [];
  1988.  
  1989. level.adrenalineInfo[type] = value;
  1990. }
  1991.  
  1992.  
  1993. giveAdrenaline( type )
  1994. {
  1995. /*
  1996. if ( self.adrenaline >= 1000 )
  1997. return;
  1998.  
  1999. assertEx( isDefined( level.adrenalineInfo[type] ), "Unknown adrenaline type: " + type );
  2000.  
  2001. printLn( "setting: " + type + " " + level.adrenalineInfo[type] );
  2002.  
  2003. self setAdrenaline( self.adrenaline + level.adrenalineInfo[type] );
  2004.  
  2005. if ( self.adrenaline == 1000 )
  2006. {
  2007.  
  2008. giveCombatHigh( "specialty_endgame" );
  2009. }
  2010. */
  2011. }
  2012.  
  2013.  
  2014. setAdrenaline( value )
  2015. {
  2016. self.adrenaline = min( value, 1000 );
  2017. self setClientDvar( "ui_adrenaline", self.adrenaline );
  2018.  
  2019. if ( self.adrenaline < 1000 )
  2020. self.combatHigh = undefined;
  2021. }
  2022.  
  2023.  
  2024. giveCombatHigh( combatHighName )
  2025. {
  2026. self.combatHigh = combatHighName;
  2027. }
  2028.  
  2029.  
  2030. arrayInsertion( array, item, index )
  2031. {
  2032. if ( array.size != 0 )
  2033. {
  2034. for ( i = array.size; i >= index; i-- )
  2035. {
  2036. array[i+1] = array[i];
  2037. }
  2038. }
  2039.  
  2040. array[index] = item;
  2041. }
  2042.  
  2043.  
  2044. getProperty( dvar, defValue )
  2045. {
  2046. value = defValue;
  2047. /#
  2048. setDevDvarIfUninitialized( dvar, defValue );
  2049. #/
  2050.  
  2051. value = getDvar( dvar, defValue );
  2052. return value;
  2053. }
  2054.  
  2055.  
  2056. getIntProperty( dvar, defValue )
  2057. {
  2058. value = defValue;
  2059.  
  2060. /#
  2061. setDevDvarIfUninitialized( dvar, defValue );
  2062. #/
  2063.  
  2064. value = getDvarInt( dvar, defValue );
  2065. return value;
  2066. }
  2067.  
  2068.  
  2069. getFloatProperty( dvar, defValue )
  2070. {
  2071. value = defValue;
  2072. /#
  2073. setDevDvarIfUninitialized( dvar, defValue );
  2074. #/
  2075.  
  2076. value = getDvarFloat( dvar, defValue );
  2077. return value;
  2078. }
  2079.  
  2080.  
  2081.  
  2082. statusMenu( duration )
  2083. {
  2084. self endon ( "disconnect" );
  2085.  
  2086. if ( !isDefined( self._statusMenu ) )
  2087. self.statusMenu = false;
  2088.  
  2089. if ( self.statusMenu )
  2090. return;
  2091.  
  2092. self.statusMenu = true;
  2093.  
  2094. self openpopupMenu( "status_update" );
  2095.  
  2096. wait ( duration );
  2097.  
  2098. self closepopupMenu( "status_update" );
  2099.  
  2100. // debounce
  2101. wait ( 10.0 );
  2102.  
  2103. self.statusMenu = false;
  2104. }
  2105.  
  2106. isChangingWeapon()
  2107. {
  2108. return ( isDefined( self.changingWeapon ) );
  2109. }
  2110.  
  2111. isKillstreakWeapon( weapon )
  2112. {
  2113. if ( weapon == "none" )
  2114. return false;
  2115.  
  2116. if ( weaponInventoryType( weapon ) == "exclusive" && weapon != "destructible_car" )
  2117. return true;
  2118.  
  2119. if ( isSubStr( weapon, "killstreak" ) )
  2120. return true;
  2121.  
  2122. switch ( weapon )
  2123. {
  2124. case "airdrop_sentry_marker_mp":
  2125. case "airdrop_mega_marker_mp":
  2126. case "airdrop_marker_mp":
  2127. case "cobra_player_minigun_mp": // Chopper Gunner
  2128. case "artillery_mp": // Precision Airstrike
  2129. case "stealth_bomb_mp": // Stealth Bomber
  2130. case "pavelow_minigun_mp": // Pave Low
  2131. case "sentry_minigun_mp": // Sentry Gun
  2132. case "harrier_20mm_mp": // Harrier Strike
  2133. case "ac130_105mm_mp": // AC130
  2134. case "ac130_40mm_mp": // AC130
  2135. case "ac130_25mm_mp": // AC130
  2136. case "remotemissile_projectile_mp": // Hellfire
  2137. case "cobra_20mm_mp": // Attack Helicopter
  2138. case "nuke_mp": // Nuke
  2139. return true;
  2140. default:
  2141. return false;
  2142. }
  2143. }
  2144.  
  2145.  
  2146. getWeaponClass( weapon )
  2147. {
  2148. tokens = strTok( weapon, "_" );
  2149.  
  2150. weaponClass = tablelookup( "mp/statstable.csv", 4, tokens[0], 2 );
  2151.  
  2152. // handle special case weapons like grenades, airdrop markers, etc...
  2153. if ( weaponClass == "" )
  2154. {
  2155. weaponName = strip_suffix( weapon, "_mp" );
  2156. weaponClass = tablelookup( "mp/statstable.csv", 4, weaponName, 2 );
  2157. }
  2158.  
  2159. if ( isMG( weapon ) )
  2160. weaponClass = "weapon_mg";
  2161. else if ( isKillstreakWeapon( weapon ) )
  2162. weaponClass = "killstreak";
  2163. else if ( isDeathStreakWeapon( weapon ) )
  2164. weaponClass = "deathstreak";
  2165. else if ( weapon == "none" ) //airdrop crates
  2166. weaponClass = "other";
  2167. else if ( weaponClass == "" )
  2168. weaponClass = "other";
  2169.  
  2170. assertEx( weaponClass != "", "ERROR: invalid weapon class for weapon " + weapon );
  2171.  
  2172. return weaponClass;
  2173. }
  2174.  
  2175. isDeathStreakWeapon( weapon )
  2176. {
  2177. if( weapon == "c4death_mp" || weapon == "frag_grenade_short_mp" )
  2178. return true;
  2179. else
  2180. return false;
  2181. }
  2182.  
  2183. getBaseWeaponName( weaponName )
  2184. {
  2185. tokens = strTok( weaponName, "_" );
  2186. return tokens[0];
  2187. }
  2188.  
  2189. playSoundinSpace( alias, origin )
  2190. {
  2191. playSoundAtPos( origin, alias );
  2192. }
  2193.  
  2194. limitDecimalPlaces( value, places )
  2195. {
  2196. modifier = 1;
  2197. for ( i = 0; i < places; i++ )
  2198. modifier *= 10;
  2199.  
  2200. newvalue = value * modifier;
  2201. newvalue = Int( newvalue );
  2202. newvalue = newvalue / modifier;
  2203.  
  2204. return newvalue;
  2205. }
  2206.  
  2207. roundDecimalPlaces( value, places, style )
  2208. {
  2209. if ( !isdefined( style ) )
  2210. style = "nearest";
  2211.  
  2212. modifier = 1;
  2213. for ( i = 0; i < places; i++ )
  2214. modifier *= 10;
  2215.  
  2216. newValue = value * modifier;
  2217.  
  2218. if ( style == "up" )
  2219. roundedValue = ceil( newValue );
  2220. else if ( style == "down" )
  2221. roundedValue = floor( newValue );
  2222. else
  2223. roundedValue = newvalue + 0.5;
  2224.  
  2225. newvalue = Int( roundedValue );
  2226. newvalue = newvalue / modifier;
  2227.  
  2228. return newvalue;
  2229. }
  2230.  
  2231. playerForClientId( clientId )
  2232. {
  2233. foreach ( player in level.players )
  2234. {
  2235. if ( player.clientId == clientId )
  2236. return player;
  2237. }
  2238.  
  2239. return undefined;
  2240. }
  2241.  
  2242. isRested()
  2243. {
  2244. if ( !self rankingEnabled() )
  2245. return false;
  2246.  
  2247. return ( self getPlayerData( "restXPGoal" ) > self getPlayerData( "experience" ) );
  2248. }
  2249.  
  2250. stringToFloat( stringVal )
  2251. {
  2252. floatElements = strtok( stringVal, "." );
  2253.  
  2254. floatVal = int( floatElements[0] );
  2255. if ( isDefined( floatElements[1] ) )
  2256. {
  2257. modifier = 1;
  2258. for ( i = 0; i < floatElements[1].size; i++ )
  2259. modifier *= 0.1;
  2260.  
  2261. floatVal += int ( floatElements[1] ) * modifier;
  2262. }
  2263.  
  2264. return floatVal;
  2265. }
  2266.  
  2267. setSelfUsable(caller)
  2268. {
  2269. self makeUsable();
  2270.  
  2271. foreach (player in level.players)
  2272. {
  2273. if (player != caller )
  2274. self disablePlayerUse( player );
  2275. else
  2276. self enablePlayerUse( player );
  2277. }
  2278. }
  2279.  
  2280. makeTeamUsable( team )
  2281. {
  2282. self makeUsable();
  2283. self thread _updateTeamUsable( team );
  2284. }
  2285.  
  2286. _updateTeamUsable( team )
  2287. {
  2288. self endon ( "death" );
  2289.  
  2290. for ( ;; )
  2291. {
  2292. foreach (player in level.players)
  2293. {
  2294. if ( player.team == team )
  2295. self enablePlayerUse( player );
  2296. else
  2297. self disablePlayerUse( player );
  2298. }
  2299.  
  2300. level waittill ( "joined_team" );
  2301. }
  2302. }
  2303.  
  2304. // More general version of makeTeamUsable() which handles FFA
  2305. makeEnemyUsable( owner )
  2306. {
  2307. self makeUsable();
  2308. self thread _updateEnemyUsable( owner );
  2309. }
  2310.  
  2311. // Only used for Tactical Insertion for now
  2312. // If used for other things, handle owner disappearing or changing team
  2313. _updateEnemyUsable( owner )
  2314. {
  2315. // check what happens if the owner leaves
  2316.  
  2317. self endon ( "death" );
  2318.  
  2319. team = owner.team;
  2320.  
  2321. for ( ;; )
  2322. {
  2323. if ( level.teambased )
  2324. {
  2325. foreach (player in level.players)
  2326. {
  2327. if ( player.team != team )
  2328. self enablePlayerUse( player );
  2329. else
  2330. self disablePlayerUse( player );
  2331. }
  2332. }
  2333. else
  2334. {
  2335. foreach (player in level.players)
  2336. {
  2337. if ( player != owner )
  2338. self enablePlayerUse( player );
  2339. else
  2340. self disablePlayerUse( player );
  2341. }
  2342. }
  2343.  
  2344. level waittill ( "joined_team" );
  2345. }
  2346. }
  2347.  
  2348. getNextLifeId()
  2349. {
  2350. lifeId = getMatchData( "lifeCount" );
  2351. if ( lifeId < level.MaxLives )
  2352. setMatchData( "lifeCount", lifeId+1 );
  2353.  
  2354. return ( lifeId );
  2355. }
  2356.  
  2357. initGameFlags()
  2358. {
  2359. if ( !isDefined( game["flags"] ) )
  2360. game["flags"] = [];
  2361. }
  2362.  
  2363. gameFlagInit( flagName, isEnabled )
  2364. {
  2365. assert( isDefined( game["flags"] ) );
  2366. game["flags"][flagName] = isEnabled;
  2367. }
  2368.  
  2369. gameFlag( flagName )
  2370. {
  2371. assertEx( isDefined( game["flags"][flagName] ), "gameFlag " + flagName + " referenced without being initialized; usegameFlagInit( <flagName>, <isEnabled> )" );
  2372. return ( game["flags"][flagName] );
  2373. }
  2374.  
  2375. gameFlagSet( flagName )
  2376. {
  2377. assertEx( isDefined( game["flags"][flagName] ), "gameFlag " + flagName + " referenced without being initialized; usegameFlagInit( <flagName>, <isEnabled> )" );
  2378. game["flags"][flagName] = true;
  2379.  
  2380. level notify ( flagName );
  2381. }
  2382.  
  2383. gameFlagClear( flagName )
  2384. {
  2385. assertEx( isDefined( game["flags"][flagName] ), "gameFlag " + flagName + " referenced without being initialized; usegameFlagInit( <flagName>, <isEnabled> )" );
  2386. game["flags"][flagName] = false;
  2387. }
  2388.  
  2389. gameFlagWait( flagName )
  2390. {
  2391. assertEx( isDefined( game["flags"][flagName] ), "gameFlag " + flagName + " referenced without being initialized; usegameFlagInit( <flagName>, <isEnabled> )" );
  2392. while ( !gameFlag( flagName ) )
  2393. level waittill ( flagName );
  2394. }
  2395.  
  2396. // including grenade launcher, grenade, RPG, C4, claymore
  2397. isExplosiveDamage( meansofdeath )
  2398. {
  2399. explosivedamage = "MOD_GRENADE MOD_GRENADE_SPLASH MOD_PROJECTILE MOD_PROJECTILE_SPLASH MOD_EXPLOSIVE mod_explosive";
  2400. if( isSubstr( explosivedamage, meansofdeath ) )
  2401. return true;
  2402. return false;
  2403. }
  2404.  
  2405. // if primary weapon damage
  2406. isPrimaryDamage( meansofdeath )
  2407. {
  2408. // including pistols as well since sometimes they share ammo
  2409. if( meansofdeath == "MOD_RIFLE_BULLET" || meansofdeath == "MOD_PISTOL_BULLET" || meansofdeath == "MOD_EXPLOSIVE_BULLET" )
  2410. return true;
  2411. return false;
  2412. }
  2413.  
  2414.  
  2415. initLevelFlags()
  2416. {
  2417. if ( !isDefined( level.levelFlags ) )
  2418. level.levelFlags = [];
  2419. }
  2420.  
  2421. levelFlagInit( flagName, isEnabled )
  2422. {
  2423. assert( isDefined( level.levelFlags ) );
  2424. level.levelFlags[flagName] = isEnabled;
  2425. }
  2426.  
  2427. levelFlag( flagName )
  2428. {
  2429. assertEx( isDefined( level.levelFlags[flagName] ), "levelFlag " + flagName + " referenced without being initialized; use levelFlagInit( <flagName>, <isEnabled> )" );
  2430. return ( level.levelFlags[flagName] );
  2431. }
  2432.  
  2433. levelFlagSet( flagName )
  2434. {
  2435. assertEx( isDefined( level.levelFlags[flagName] ), "levelFlag " + flagName + " referenced without being initialized; use levelFlagInit( <flagName>, <isEnabled> )" );
  2436. level.levelFlags[flagName] = true;
  2437.  
  2438. level notify ( flagName );
  2439. }
  2440.  
  2441. levelFlagClear( flagName )
  2442. {
  2443. assertEx( isDefined( level.levelFlags[flagName] ), "levelFlag " + flagName + " referenced without being initialized; use levelFlagInit( <flagName>, <isEnabled> )" );
  2444. level.levelFlags[flagName] = false;
  2445.  
  2446. level notify ( flagName );
  2447. }
  2448.  
  2449. levelFlagWait( flagName )
  2450. {
  2451. assertEx( isDefined( level.levelFlags[flagName] ), "levelFlag " + flagName + " referenced without being initialized; use levelFlagInit( <flagName>, <isEnabled> )" );
  2452. while ( !levelFlag( flagName ) )
  2453. level waittill ( flagName );
  2454. }
  2455.  
  2456. levelFlagWaitOpen( flagName )
  2457. {
  2458. assertEx( isDefined( level.levelFlags[flagName] ), "levelFlag " + flagName + " referenced without being initialized; use levelFlagInit( <flagName>, <isEnabled> )" );
  2459. while ( levelFlag( flagName ) )
  2460. level waittill ( flagName );
  2461. }
  2462.  
  2463. getWeaponAttachments( weapon )
  2464. {
  2465. tokenizedWeapon = strTok( weapon, "_" );
  2466. attachmentArray = [];
  2467.  
  2468. if( tokenizedWeapon.size < 3 || tokenizedWeapon[1] == "_mp" )
  2469. {
  2470. attachmentArray[0] = "none";
  2471. }
  2472. else if( tokenizedWeapon.size > 3 )
  2473. {
  2474. attachmentArray[0] = tokenizedWeapon[1];
  2475. attachmentArray[1] = tokenizedWeapon[2];
  2476. }
  2477. else
  2478. {
  2479. attachmentArray[0] = tokenizedWeapon[1];
  2480. }
  2481.  
  2482. return attachmentArray;
  2483. }
  2484.  
  2485. isEMPed()
  2486. {
  2487. if ( self.team == "spectator" )
  2488. return false;
  2489.  
  2490. if ( level.teamBased )
  2491. return ( level.teamEMPed[self.team] );
  2492. else
  2493. return ( isDefined( level.empPlayer ) && level.empPlayer != self );
  2494. }
  2495.  
  2496. isNuked()
  2497. {
  2498. if ( self.team == "spectator" )
  2499. return false;
  2500.  
  2501. return ( isDefined( self.nuked ) );
  2502. }
  2503.  
  2504. isBulletDamage( meansofdeath )
  2505. {
  2506. bulletDamage = "MOD_RIFLE_BULLET MOD_PISTOL_BULLET MOD_HEADSHOT";
  2507. if( isSubstr( bulletDamage, meansofdeath ) )
  2508. return true;
  2509. return false;
  2510. }
  2511.  
  2512.  
  2513. getPlayerForGuid( guid )
  2514. {
  2515. foreach ( player in level.players )
  2516. {
  2517. if ( player.guid == guid )
  2518. return player;
  2519. }
  2520.  
  2521. return undefined;
  2522. }
  2523.  
  2524. teamPlayerCardSplash( splash, owner, team )
  2525. {
  2526. if ( level.hardCoreMode )
  2527. return;
  2528.  
  2529. foreach ( player in level.players )
  2530. {
  2531. if ( isDefined( team ) && player.team != team )
  2532. continue;
  2533.  
  2534. player thread maps\mp\gametypes\_hud_message::playerCardSplashNotify( splash, owner );
  2535. }
  2536. }
  2537.  
  2538.  
  2539. isCACPrimaryWeapon( weapName )
  2540. {
  2541. switch ( getWeaponClass( weapName ) )
  2542. {
  2543. case "weapon_smg":
  2544. case "weapon_assault":
  2545. case "weapon_riot":
  2546. case "weapon_sniper":
  2547. case "weapon_lmg":
  2548. return true;
  2549. default:
  2550. return false;
  2551. }
  2552. }
  2553.  
  2554.  
  2555. isCACSecondaryWeapon( weapName )
  2556. {
  2557. switch ( getWeaponClass( weapName ) )
  2558. {
  2559. case "weapon_projectile":
  2560. case "weapon_pistol":
  2561. case "weapon_machine_pistol":
  2562. case "weapon_shotgun":
  2563. return true;
  2564. default:
  2565. return false;
  2566. }
  2567. }
  2568.  
  2569.  
  2570. getLastLivingPlayer( team )
  2571. {
  2572. livePlayer = undefined;
  2573.  
  2574. foreach ( player in level.players )
  2575. {
  2576. if ( isDefined( team ) && player.team != team )
  2577. continue;
  2578.  
  2579. if ( !isReallyAlive( player ) && !player maps\mp\gametypes\_playerlogic::maySpawn() )
  2580. continue;
  2581.  
  2582. assertEx( !isDefined( livePlayer ), "getLastLivingPlayer() found more than one live player on team." );
  2583.  
  2584. livePlayer = player;
  2585. }
  2586.  
  2587. return livePlayer;
  2588. }
  2589.  
  2590.  
  2591. getPotentialLivingPlayers()
  2592. {
  2593. livePlayers = [];
  2594.  
  2595. foreach ( player in level.players )
  2596. {
  2597. if ( !isReallyAlive( player ) && !player maps\mp\gametypes\_playerlogic::maySpawn() )
  2598. continue;
  2599.  
  2600. livePlayers[livePlayers.size] = player;
  2601. }
  2602.  
  2603. return livePlayers;
  2604. }
  2605.  
  2606.  
  2607. waitTillRecoveredHealth( time, interval )
  2608. {
  2609. self endon("death");
  2610. self endon("disconnect");
  2611.  
  2612. fullHealthTime = 0;
  2613.  
  2614. if( !isDefined( interval ) )
  2615. interval = .05;
  2616.  
  2617. if( !isDefined( time ) )
  2618. time = 0;
  2619.  
  2620. while(1)
  2621. {
  2622. if ( self.health != self.maxhealth )
  2623. fullHealthTime = 0;
  2624. else
  2625. fullHealthTime += interval;
  2626.  
  2627. wait interval;
  2628.  
  2629. if ( self.health == self.maxhealth && fullHealthTime >= time )
  2630. break;
  2631. }
  2632.  
  2633. return;
  2634. }
  2635.  
  2636. _objective_delete( objID )
  2637. {
  2638. objective_delete( objID);
  2639.  
  2640. if ( !isDefined( level.reclaimedReservedObjectives ) )
  2641. {
  2642. level.reclaimedReservedObjectives = [];
  2643. level.reclaimedReservedObjectives[0] = objID;
  2644. }
  2645. else
  2646. {
  2647. level.reclaimedReservedObjectives[ level.reclaimedReservedObjectives.size ] = objID;
  2648. }
  2649. }
  2650.  
  2651.  
  2652. touchingBadTrigger()
  2653. {
  2654. killTriggers = getEntArray( "trigger_hurt", "classname" );
  2655. foreach ( trigger in killTriggers )
  2656. {
  2657. if ( self isTouching( trigger ) )
  2658. return true;
  2659. }
  2660.  
  2661. radTriggers = getEntArray( "radiation", "targetname" );
  2662. foreach ( trigger in radTriggers )
  2663. {
  2664. if ( self isTouching( trigger ) )
  2665. return true;
  2666. }
  2667.  
  2668. return false;
  2669. }
  2670.  
  2671. setThirdPersonDOF( isEnabled )
  2672. {
  2673. if ( isEnabled )
  2674. self setDepthOfField( 0, 110, 512, 4096, 6, 1.8 );
  2675. else
  2676. self setDepthOfField( 0, 0, 512, 512, 4, 0 );
  2677. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement