Advertisement
Guest User

Untitled

a guest
Nov 13th, 2015
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 94.59 KB | None | 0 0
  1. #include maps\_utility;
  2. #include common_scripts\utility;
  3. /#
  4. mainDebug()
  5. {
  6. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  7. if ( getdebugdvar( "replay_debug" ) == "1" )
  8. PrintLn( "File: _debug.gsc. Function: mainDebug()\n" );
  9.  
  10. level.animsound_hudlimit = 14;
  11. thread lastSightPosWatch();
  12.  
  13. if ( level.script != "background" )
  14. thread camera();
  15.  
  16. if ( getdebugdvar( "debug_corner" ) == "" )
  17. setdvar( "debug_corner", "off" );
  18. else
  19. if ( getdebugdvar( "debug_corner" ) == "on" )
  20. debug_corner();
  21.  
  22. if ( getdvar( "chain" ) == "1" )
  23. thread debugchains();
  24.  
  25. if ( getdebugdvar( "debug_bayonet" ) == "" )
  26. {
  27. setdvar( "debug_bayonet", "0" );
  28. }
  29. thread debug_bayonet();
  30.  
  31. thread debugDvars();
  32. precacheShader( "white" );
  33. thread debugColorFriendlies();
  34.  
  35. thread watchMinimap();
  36.  
  37. if ( getdvar( "level_transition_test" ) != "off" )
  38. thread complete_me();
  39.  
  40. if ( getdvar( "level_completeall" ) != "off" )
  41. maps\_endmission::force_all_complete();
  42.  
  43. if ( getdvar( "level_clear_all" ) != "off" )
  44. maps\_endmission::clearall();
  45.  
  46. // SRS 3/19/08: engagement distance debug dvar toggle watcher
  47. thread engagement_distance_debug_toggle();
  48.  
  49. // thread playerNode();
  50. // thread colordebug();
  51. // thread debuggoalpos();
  52.  
  53. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  54. if ( getdebugdvar( "replay_debug" ) == "1" )
  55. PrintLn( "File: _debug.gsc. Function: mainDebug() - COMPLETE\n" );
  56. }
  57. #/
  58.  
  59. debugchains()
  60. {
  61. nodes = getallnodes();
  62. fnodenum = 0;
  63.  
  64. fnodes = [];
  65. for ( i=0;i<nodes.size;i++ )
  66. {
  67. if ( ( !( nodes[ i ].spawnflags & 2 ) ) &&
  68. (
  69. ( ( IsDefined( nodes[ i ].target ) ) &&( ( getnodearray( nodes[ i ].target, "targetname" ) ).size > 0 ) ) ||
  70. ( ( IsDefined( nodes[ i ].targetname ) ) &&( ( getnodearray( nodes[ i ].targetname, "target" ) ).size > 0 ) )
  71. )
  72. )
  73. {
  74. fnodes[ fnodenum ] = nodes[ i ];
  75. fnodenum++;
  76. }
  77. }
  78.  
  79. count = 0;
  80.  
  81. while ( 1 )
  82. {
  83. if ( getdvar( "chain" ) == "1" )
  84. {
  85. for ( i=0;i<fnodes.size;i++ )
  86. {
  87. // SCRIPTER_MOD
  88. // JesseS ( 3/20/2007 ): removed level.player, added players[ 0 ]
  89. players = get_players();
  90. if ( distance ( players[ 0 ] getorigin(), fnodes[ i ].origin ) < 1500 )
  91. {
  92. print3d( fnodes[ i ].origin, "yo", ( 0.2, 0.8, 0.5 ), 0.45 );
  93. }
  94. }
  95.  
  96. friends = getaiarray( "allies" );
  97. for ( i=0;i<friends.size;i++ )
  98. {
  99. node = friends[ i ] animscripts\utility::GetClaimedNode();
  100. if ( IsDefined( node ) )
  101. line( friends[ i ].origin +( 0, 0, 35 ), node.origin, ( 0.2, 0.5, 0.8 ), 0.5 );
  102. }
  103.  
  104. }
  105. maps\_spawner::waitframe();
  106. }
  107. }
  108.  
  109. debug_enemyPos( num )
  110. {
  111. ai = getaiarray();
  112.  
  113. for ( i=0;i<ai.size;i++ )
  114. {
  115. if ( ai[ i ] getentitynumber() != num )
  116. continue;
  117.  
  118. ai[ i ] thread debug_enemyPosProc();
  119. break;
  120. }
  121. }
  122.  
  123. debug_stopEnemyPos( num )
  124. {
  125. ai = getaiarray();
  126.  
  127. for ( i=0;i<ai.size;i++ )
  128. {
  129. if ( ai[ i ] getentitynumber() != num )
  130. continue;
  131.  
  132. ai[ i ] notify( "stop_drawing_enemy_pos" );
  133. break;
  134. }
  135. }
  136.  
  137. debug_enemyPosProc()
  138. {
  139. self endon( "death" );
  140. self endon( "stop_drawing_enemy_pos" );
  141. for ( ;; )
  142. {
  143. wait( 0.05 );
  144.  
  145. if ( isalive( self.enemy ) )
  146. line( self.origin +( 0, 0, 70 ), self.enemy.origin +( 0, 0, 70 ), ( 0.8, 0.2, 0.0 ), 0.5 );
  147.  
  148. if ( !self animscripts\utility::hasEnemySightPos() )
  149. continue;
  150.  
  151. pos = animscripts\utility::getEnemySightPos();
  152. line( self.origin +( 0, 0, 70 ), pos, ( 0.9, 0.5, 0.3 ), 0.5 );
  153. }
  154. }
  155.  
  156. debug_enemyPosReplay()
  157. {
  158. ai = getaiarray();
  159. guy = undefined;
  160.  
  161. for ( i=0;i<ai.size;i++ )
  162. {
  163. // if ( ai[ i ] getentitynumber() != num )
  164. // continue;
  165.  
  166. guy = ai[ i ];
  167. if ( !isalive( guy ) )
  168. continue;
  169.  
  170.  
  171. if ( IsDefined( guy.lastEnemySightPos ) )
  172. line( guy.origin +( 0, 0, 65 ), guy.lastEnemySightPos, ( 1, 0, 1 ), 0.5 );
  173.  
  174. if ( guy.goodShootPosValid )
  175. {
  176. if ( guy.team == "axis" )
  177. color =( 1, 0, 0 );
  178. else
  179. color =( 0, 0, 1 );
  180.  
  181. // nodeOffset = guy GetEye();
  182. nodeOffset = guy.origin +( 0, 0, 54 );
  183. if ( IsDefined( guy.node ) )
  184. {
  185. if ( guy.node.type == "Cover Left" )
  186. {
  187. cornerNode = true;
  188. nodeOffset = anglestoright( guy.node.angles );
  189. nodeOffset = vectorScale( nodeOffset, -32 );
  190. nodeOffset =( nodeOffset[ 0 ] , nodeOffset[ 1 ], 64 );
  191. nodeOffset = guy.node.origin + nodeOffset;
  192. }
  193. else
  194. if ( guy.node.type == "Cover Right" )
  195. {
  196. cornerNode = true;
  197. nodeOffset = anglestoright( guy.node.angles );
  198. nodeOffset = vectorScale( nodeOffset, 32 );
  199. nodeOffset =( nodeOffset[ 0 ] , nodeOffset[ 1 ], 64 );
  200. nodeOffset = guy.node.origin + nodeOffset;
  201. }
  202. }
  203. draw_arrow( nodeOffset, guy.goodShootPos, color );
  204. }
  205. // break;
  206. }
  207. if ( 1 ) return;
  208.  
  209. if ( !isalive( guy ) )
  210. return;
  211.  
  212. if ( isalive( guy.enemy ) )
  213. line( guy.origin +( 0, 0, 70 ), guy.enemy.origin +( 0, 0, 70 ), ( 0.6, 0.2, 0.2 ), 0.5 );
  214.  
  215. if ( IsDefined( guy.lastEnemySightPos ) )
  216. line( guy.origin +( 0, 0, 65 ), guy.lastEnemySightPos, ( 0, 0, 1 ), 0.5 );
  217.  
  218. if ( isalive( guy.goodEnemy ) )
  219. line( guy.origin +( 0, 0, 50 ), guy.goodEnemy.origin, ( 1, 0, 0 ), 0.5 );
  220.  
  221.  
  222. if ( !guy animscripts\utility::hasEnemySightPos() )
  223. return;
  224.  
  225. pos = guy animscripts\utility::getEnemySightPos();
  226. line( guy.origin +( 0, 0, 55 ), pos, ( 0.2, 0.2, 0.6 ), 0.5 );
  227.  
  228. if ( guy.goodShootPosValid )
  229. line( guy.origin +( 0, 0, 45 ), guy.goodShootPos, ( 0.2, 0.6, 0.2 ), 0.5 );
  230. }
  231.  
  232. drawEntTag( num )
  233. {
  234. /#
  235. ai = getaiarray();
  236. for ( i=0;i<ai.size;i++ )
  237. {
  238. if ( ai[ i ] getentnum() != num )
  239. continue;
  240. ai[ i ] thread dragTagUntilDeath( getdebugdvar( "debug_tag" ) );
  241. }
  242. setdvar( "debug_enttag", "" );
  243. #/
  244. }
  245.  
  246. drawTag( tag, opcolor )
  247. {
  248. org = self GetTagOrigin( tag );
  249. ang = self GetTagAngles( tag );
  250. drawArrow( org, ang, opcolor );
  251. }
  252.  
  253. drawOrgForever( opcolor )
  254. {
  255. for ( ;; )
  256. {
  257. drawArrow( self.origin, self.angles, opcolor );
  258. wait( 0.05 );
  259. }
  260. }
  261.  
  262.  
  263. drawArrowForever( org, ang )
  264. {
  265. for ( ;; )
  266. {
  267. drawArrow( org, ang );
  268. wait( 0.05 );
  269. }
  270. }
  271.  
  272. drawOriginForever()
  273. {
  274. for ( ;; )
  275. {
  276. drawArrow( self.origin, self.angles );
  277. wait( 0.05 );
  278. }
  279. }
  280.  
  281. drawArrow( org, ang, opcolor )
  282. {
  283. scale = 50;
  284. forward = anglestoforward( ang );
  285. forwardFar = vectorScale( forward, scale );
  286. forwardClose = vectorScale( forward, ( scale * 0.8 ) );
  287. right = anglestoright( ang );
  288. leftdraw = vectorScale( right, ( scale * -0.2 ) );
  289. rightdraw = vectorScale( right, ( scale * 0.2 ) );
  290.  
  291. up = anglestoup( ang );
  292. right = vectorScale( right, scale );
  293. up = vectorScale( up, scale );
  294.  
  295. red = ( 0.9, 0.2, 0.2 );
  296. green = ( 0.2, 0.9, 0.2 );
  297. blue = ( 0.2, 0.2, 0.9 );
  298. if ( IsDefined( opcolor ) )
  299. {
  300. red = opcolor;
  301. green = opcolor;
  302. blue = opcolor;
  303. }
  304.  
  305. line( org, org + forwardFar, red, 0.9 );
  306. line( org + forwardFar, org + forwardClose + rightdraw, red, 0.9 );
  307. line( org + forwardFar, org + forwardClose + leftdraw, red, 0.9 );
  308.  
  309. line( org, org + right, blue, 0.9 );
  310. line( org, org + up, green, 0.9 );
  311. }
  312.  
  313. drawPlayerViewForever()
  314. {
  315. for ( ;; )
  316. {
  317. drawArrow( level.player.origin, level.player getplayerangles(), ( 1,1,1 ) );
  318. wait( 0.05 );
  319. }
  320. }
  321.  
  322.  
  323.  
  324. drawTagForever( tag, opcolor )
  325. {
  326. self endon( "death" );
  327. for ( ;; )
  328. {
  329. drawTag( tag, opcolor );
  330. wait( 0.05 );
  331. }
  332. }
  333.  
  334.  
  335. dragTagUntilDeath( tag )
  336. {
  337. for ( ;; )
  338. {
  339. if ( !IsDefined( self.origin ) )
  340. break;
  341. drawTag( tag );
  342. wait( 0.05 );
  343. }
  344. }
  345.  
  346. viewTag( type, tag )
  347. {
  348. if ( type == "ai" )
  349. {
  350. ai = getaiarray();
  351. for ( i=0;i<ai.size;i++ )
  352. ai[ i ] drawTag( tag );
  353. }
  354. else
  355. {
  356. vehicle = getentarray( "script_vehicle", "classname" );
  357. for ( i=0;i<vehicle.size;i++ )
  358. vehicle[ i ] drawTag( tag );
  359. }
  360. }
  361.  
  362.  
  363. debug_corner()
  364. {
  365. // SCRIPTER_MOD
  366. // JesseS ( 3/20/2007 ): removed level.player, added ignoreme for all players
  367. players = get_players();
  368. for ( i=0; i < players.size; i++ )
  369. {
  370. players[ i ].ignoreme = true;
  371. }
  372.  
  373. nodes = getallnodes();
  374. corners = [];
  375. for ( i=0;i<nodes.size;i++ )
  376. {
  377. if ( nodes[ i ].type == "Cover Left" )
  378. corners[ corners.size ] = nodes[ i ];
  379. if ( nodes[ i ].type == "Cover Right" )
  380. corners[ corners.size ] = nodes[ i ];
  381. }
  382.  
  383. ai = getaiarray();
  384. for ( i=0;i<ai.size;i++ )
  385. ai[ i ] delete();
  386.  
  387. level.debugspawners = getspawnerarray();
  388. level.activeNodes = [];
  389. level.completedNodes = [];
  390. for ( i=0;i<level.debugspawners.size;i++ )
  391. level.debugspawners[ i ].targetname = "blah";
  392.  
  393. covered = 0;
  394. for ( i=0;i<30;i++ )
  395. {
  396. if ( i >= corners.size )
  397. break;
  398.  
  399. corners[ i ] thread coverTest();
  400. covered++;
  401. }
  402.  
  403. if ( corners.size <= 30 )
  404. return;
  405.  
  406. for ( ;; )
  407. {
  408. level waittill( "debug_next_corner" );
  409. if ( covered >= corners.size )
  410. covered = 0;
  411. corners[ covered ] thread coverTest();
  412. covered++;
  413. }
  414. }
  415.  
  416. coverTest()
  417. {
  418. coverSetupAnim();
  419. }
  420.  
  421. #using_animtree( "generic_human" );
  422. coverSetupAnim()
  423. {
  424. spawn = undefined;
  425. spawner = undefined;
  426. for ( ;; )
  427. {
  428. for ( i=0;i<level.debugspawners.size;i++ )
  429. {
  430. wait( 0.05 );
  431. spawner = level.debugspawners[ i ];
  432. nearActive = false;
  433. for ( p=0;p<level.activeNodes.size;p++ )
  434. {
  435. if ( distance( level.activeNodes[ p ].origin, self.origin ) > 250 )
  436. continue;
  437. nearActive = true;
  438. break;
  439. }
  440. if ( nearActive )
  441. continue;
  442.  
  443. completed = false;
  444. for ( p=0;p<level.completedNodes.size;p++ )
  445. {
  446. if ( level.completedNodes[ p ] != self )
  447. continue;
  448. completed = true;
  449. break;
  450. }
  451. if ( completed )
  452. continue;
  453.  
  454. level.activeNodes[ level.activeNodes.size ] = self;
  455. spawner.origin = self.origin;
  456. spawner.angles = self.angles;
  457. spawner.count = 1;
  458. spawn = spawner stalingradspawn();
  459. if ( spawn_failed( spawn ) )
  460. {
  461. removeActiveSpawner( self );
  462. continue;
  463. }
  464.  
  465. break;
  466. }
  467. if ( isalive( spawn ) )
  468. break;
  469. }
  470.  
  471. wait( 1 );
  472. if ( isalive( spawn ) )
  473. {
  474. spawn.ignoreme = true;
  475. spawn.team = "neutral";
  476. spawn setgoalpos( spawn.origin );
  477. thread createLine( self.origin );
  478. spawn thread debugorigin();
  479. thread createLineConstantly( spawn );
  480. spawn waittill( "death" );
  481. }
  482. removeActiveSpawner( self );
  483. level.completedNodes[ level.completedNodes.size ] = self;
  484. }
  485.  
  486. removeActiveSpawner( spawner )
  487. {
  488. newSpawners = [];
  489. for ( p=0;p<level.activeNodes.size;p++ )
  490. {
  491. if ( level.activeNodes[ p ] == spawner )
  492. continue;
  493. newSpawners[ newSpawners.size ] = level.activeNodes[ p ];
  494. }
  495. level.activeNodes = newSpawners;
  496. }
  497.  
  498.  
  499. createLine( org )
  500. {
  501. for ( ;; )
  502. {
  503. line( org +( 0, 0, 35 ), org, ( 0.2, 0.5, 0.8 ), 0.5 );
  504. wait( 0.05 );
  505. }
  506. }
  507.  
  508. createLineConstantly( ent )
  509. {
  510. org = undefined;
  511. while ( isalive( ent ) )
  512. {
  513. org = ent.origin;
  514. wait( 0.05 );
  515. }
  516.  
  517. for ( ;; )
  518. {
  519. line( org +( 0, 0, 35 ), org, ( 1.0, 0.2, 0.1 ), 0.5 );
  520. wait( 0.05 );
  521. }
  522. }
  523.  
  524. debugMisstime()
  525. {
  526. self notify( "stopdebugmisstime" );
  527. self endon( "stopdebugmisstime" );
  528. self endon( "death" );
  529. for ( ;; )
  530. {
  531. if ( self.a.misstime <= 0 )
  532. print3d( self gettagorigin( "TAG_EYE" ) +( 0, 0, 15 ), "hit", ( 0.3, 1, 1 ), 1 );
  533. else
  534. print3d( self gettagorigin( "TAG_EYE" ) +( 0, 0, 15 ), self.a.misstime/20, ( 0.3, 1, 1 ), 1 );
  535. wait( 0.05 );
  536. }
  537. }
  538.  
  539. debugMisstimeOff()
  540. {
  541. self notify( "stopdebugmisstime" );
  542. }
  543.  
  544. setEmptyDvar( dvar, setting )
  545. {
  546. /#
  547. if ( getdebugdvar( dvar ) == "" )
  548. setdvar( dvar, setting );
  549. #/
  550. }
  551.  
  552. debugJump( num )
  553. {
  554. /#
  555. ai = getaiarray();
  556. for ( i=0;i<ai.size;i++ )
  557. {
  558. if ( ai[ i ] getentnum() != num )
  559. continue;
  560.  
  561. // SCRIPTER_MOD
  562. // JesseS ( 3/20/2007 ): removed level.player, added players[ 0 ]
  563. players = get_players();
  564. line ( players[ 0 ].origin, ai[ i ].origin, ( 0.2,0.3,1.0 ) );
  565. return;
  566. }
  567. #/
  568. }
  569.  
  570. debugDvars()
  571. {
  572. /#
  573. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  574. if ( getdebugdvar( "replay_debug" ) == "1" )
  575. PrintLn( "File: _debug.gsc. Function: debugDvars()\n" );
  576.  
  577. precachemodel( "test_sphere_silver" );
  578. if ( getdebugdvar( "debug_vehiclesittags" ) == "" )
  579. setdvar( "debug_vehiclesittags", "off" );
  580.  
  581. if ( getDvar( "level_transition_test" ) == "" )
  582. setDvar( "level_transition_test", "off" );
  583.  
  584. if ( getDvar( "level_completeall" ) == "" )
  585. setDvar( "level_completeall", "off" );
  586.  
  587. if ( getDvar( "level_clear_all" ) == "" )
  588. setDvar( "level_clear_all", "off" );
  589.  
  590. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  591. if ( getdebugdvar( "replay_debug" ) == "1" )
  592. PrintLn( "File: _debug.gsc. Function: debugDvars() - WAIT FINISHED\n" );
  593.  
  594. setEmptyDvar( "debug_accuracypreview", "off" );
  595.  
  596. if ( getdebugdvar( "debug_lookangle" ) == "" )
  597. setdvar( "debug_lookangle", "off" );
  598.  
  599. if ( getdebugdvar( "debug_grenademiss" ) == "" )
  600. setdvar( "debug_grenademiss", "off" );
  601.  
  602. if ( getdebugdvar( "debug_enemypos" ) == "" )
  603. setdvar( "debug_enemypos", "-1" );
  604.  
  605. if ( getdebugdvar( "debug_dotshow" ) == "" )
  606. setdvar( "debug_dotshow", "-1" );
  607.  
  608. if ( getdebugdvar( "debug_stopenemypos" ) == "" )
  609. setdvar( "debug_stopenemypos", "-1" );
  610.  
  611. if ( getdebugdvar( "debug_replayenemypos" ) == "" )
  612. setdvar( "debug_replayenemypos", "-1" );
  613.  
  614. if ( getdebugdvar( "debug_tag" ) == "" )
  615. setdvar( "debug_tag", "" );
  616.  
  617. if ( getdebugdvar( "debug_arrivals" ) == "" )
  618. setdvar( "debug_arrivals", "" );
  619.  
  620. if ( getdebugdvar( "debug_chatlook" ) == "" )
  621. setdvar( "debug_chatlook", "" );
  622.  
  623. if ( getdebugdvar( "debug_vehicletag" ) == "" )
  624. setdvar( "debug_vehicletag", "" );
  625.  
  626.  
  627. if ( getdebugdvar( "debug_colorfriendlies" ) == "" )
  628. setdvar( "debug_colorfriendlies", "off" );
  629.  
  630. if ( getdebugdvar( "debug_animreach" ) == "" )
  631. setdvar( "debug_animreach", "off" );
  632.  
  633. if ( getdebugdvar( "debug_hatmodel" ) == "" )
  634. setdvar( "debug_hatmodel", "on" );
  635.  
  636. if ( getdebugdvar( "debug_trace" ) == "" )
  637. setdvar( "debug_trace", "off" );
  638.  
  639. level.debug_badpath = false;
  640. if ( getdebugdvar( "debug_badpath" ) == "" )
  641. setdvar( "debug_badpath", "off" );
  642.  
  643. if ( getdebugdvar( "anim_lastsightpos" ) == "" )
  644. setdvar( "debug_lastsightpos", "off" );
  645.  
  646. if ( getdebugdvar( "debug_dog_sound" ) == "" )
  647. setdvar( "debug_dog_sound", "" );
  648.  
  649. if ( getdvar( "debug_nuke" ) == "" )
  650. setdvar( "debug_nuke", "off" );
  651.  
  652. if ( getdebugdvar( "debug_deathents" ) == "on" )
  653. setdvar( "debug_deathents", "off" );
  654.  
  655. if ( getdvar( "debug_jump" ) == "" )
  656. setdvar( "debug_jump", "" );
  657.  
  658. if ( getdvar( "debug_hurt" ) == "" )
  659. setdvar( "debug_hurt", "" );
  660.  
  661. if ( getdebugdvar( "animsound" ) == "" )
  662. setdvar( "animsound", "off" );
  663. if ( getdvar( "tag" ) == "" )
  664. setdvar( "tag", "" );
  665.  
  666. for ( i=1; i <= level.animsound_hudlimit; i++ )
  667. {
  668. if ( getdvar( "tag" + i ) == "" )
  669. setdvar( "tag" + i, "" );
  670. }
  671.  
  672. if ( getdebugdvar( "animsound_save" ) == "" )
  673. setdvar( "animsound_save", "" );
  674.  
  675. if ( getdvar( "debug_depth" ) == "" )
  676. setdvar( "debug_depth", "" );
  677.  
  678. if ( getdebugdvar( "debug_colornodes" ) == "" )
  679. setdvar( "debug_colornodes", "" );
  680.  
  681. if ( getdebugdvar( "debug_reflection" ) == "" )
  682. setdvar( "debug_reflection", "0" );
  683.  
  684. // SCRIPTER_MOD: JesseS ( 3/18/2008 ): added dynamic guy spawning
  685. if ( getdebugdvar( "debug_dynamic_ai_spawning" ) == "" )
  686. setdvar( "debug_dynamic_ai_spawning", "0" );
  687.  
  688. level.last_threat_debug = -23430;
  689. if ( getdebugdvar( "debug_threat" ) == "" )
  690. setdvar( "debug_threat", "-1" );
  691.  
  692. waittillframeend; // for vars to get init'd elsewhere
  693.  
  694. red =( 1, 0, 0 );
  695. blue =( 0, 0, 1 );
  696. yellow =( 1, 1, 0 );
  697. cyan =( 0, 1, 1 );
  698. green =( 0, 1, 0 );
  699. purple =( 1, 0, 1 );
  700. orange =( 1, 0.5, 0 );
  701.  
  702. level.color_debug[ "r" ] = red;
  703. level.color_debug[ "b" ] = blue;
  704. level.color_debug[ "y" ] = yellow;
  705. level.color_debug[ "c" ] = cyan;
  706. level.color_debug[ "g" ] = green;
  707. level.color_debug[ "p" ] = purple;
  708. level.color_debug[ "o" ] = orange;
  709.  
  710. level.debug_reflection = 0;
  711.  
  712.  
  713. if ( getdvar( "debug_character_count" ) == "" )
  714. setdvar( "debug_character_count","off" );
  715.  
  716. // thread hatmodel();
  717. thread debug_character_count();
  718.  
  719. // MikeD ( 11/2/2007 ): Show's the player's position
  720. level thread debug_show_viewpos();
  721.  
  722. noAnimscripts = getdvar( "debug_noanimscripts" ) == "on";
  723. for ( ;; )
  724. {
  725. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  726. if ( getdebugdvar( "replay_debug" ) == "1" )
  727. PrintLn( "File: _debug.gsc. Function: debugDvars() - INNNER LOOP START\n" );
  728.  
  729. if ( getdebugdvar( "debug_jump" ) != "" )
  730. debugJump( getdebugdvarint( "debug_jump" ) );
  731.  
  732. if ( getdebugdvar( "debug_tag" ) != "" )
  733. {
  734. thread viewTag( "ai", getdebugdvar( "debug_tag" ) );
  735. if ( getdebugdvarInt( "debug_enttag" ) > 0 )
  736. thread drawEntTag( getdebugdvarInt( "debug_enttag" ) );
  737. }
  738.  
  739. if ( getdebugdvar( "debug_vehicletag" ) != "" )
  740. thread viewTag( "vehicle", getdebugdvar( "debug_vehicletag" ) );
  741.  
  742. if ( getdebugdvar( "debug_colornodes" ) == "on" )
  743. thread debug_colornodes();
  744.  
  745. if ( getdebugdvar( "debug_vehiclesittags" ) != "off" )
  746. thread debug_vehiclesittags();
  747.  
  748. if ( getdebugdvar( "debug_replayenemypos" ) == "on" )
  749. thread debug_enemyPosReplay();
  750.  
  751. thread debug_animSound();
  752.  
  753. if ( getdvar( "tag" ) != "" )
  754. thread debug_animSoundTagSelected();
  755.  
  756. for ( i=1; i <= level.animsound_hudlimit; i++ )
  757. {
  758. if ( getdvar( "tag" + i ) != "" )
  759. thread debug_animSoundTag( i );
  760. }
  761.  
  762. if ( getdebugdvar( "animsound_save" ) != "" )
  763. thread debug_animSoundSave();
  764.  
  765. if ( getdvar( "debug_nuke" ) != "off" )
  766. {
  767. thread debug_nuke();
  768. }
  769.  
  770. if ( getdvar( "debug_misstime" ) == "on" )
  771. {
  772. setdvar( "debug_misstime", "start" );
  773. array_thread( getaiarray(), ::debugMisstime );
  774. }
  775. else
  776. if ( getdvar( "debug_misstime" ) == "off" )
  777. {
  778. setdvar( "debug_misstime", "start" );
  779. array_thread( getaiarray(), ::debugMisstimeOff );
  780. }
  781.  
  782. if ( getdvar( "debug_deathents" ) == "on" )
  783. thread deathspawnerPreview();
  784.  
  785. if ( getdvar( "debug_hurt" ) == "on" )
  786. {
  787. setdvar( "debug_hurt", "off" );
  788.  
  789. // SCRIPTER_MOD
  790. // JesseS ( 3/20/2007 ): dodamage on all players instead of level.player
  791. players = get_players();
  792. for ( i = 0; i < players.size; i++ )
  793. {
  794. players[ i ] dodamage( 50, ( 324234,3423423,2323 ) );
  795. }
  796. }
  797.  
  798. if ( getdvar( "debug_hurt" ) == "on" )
  799. {
  800. setdvar( "debug_hurt", "off" );
  801.  
  802. // SCRIPTER_MOD
  803. // JesseS ( 3/20/2007 ): dodamage on all players instead of level.player
  804. players = get_players();
  805. for ( i = 0; i < players.size; i++ )
  806. {
  807. players[ i ] dodamage( 50, ( 324234,3423423,2323 ) );
  808. }
  809. }
  810.  
  811. if ( getdvar( "debug_depth" ) == "on" )
  812. {
  813. thread fogcheck();
  814. }
  815.  
  816. if ( getdebugdvar( "debug_threat" ) != "-1" && getdebugdvar( "debug_threat" ) != "" )
  817. {
  818. debugThreat();
  819. }
  820.  
  821. level.debug_badpath = getdebugdvar( "debug_badpath" ) == "on";
  822.  
  823. if ( getdebugdvarint( "debug_enemypos" ) != -1 )
  824. {
  825. thread debug_enemypos( getdebugdvarint( "debug_enemypos" ) );
  826. setdvar( "debug_enemypos", "-1" );
  827. }
  828. if ( getdebugdvarint( "debug_stopenemypos" ) != -1 )
  829. {
  830. thread debug_stopenemypos( getdebugdvarint( "debug_stopenemypos" ) );
  831. setdvar( "debug_stopenemypos", "-1" );
  832. }
  833.  
  834. if ( !noAnimscripts && getdvar( "debug_noanimscripts" ) == "on" )
  835. {
  836. anim.defaultException = animscripts\init::infiniteLoop;
  837. noAnimscripts = true;
  838. }
  839.  
  840. if ( noAnimscripts && getdvar( "debug_noanimscripts" ) == "off" )
  841. {
  842. anim.defaultException = animscripts\init::empty;
  843. anim notify( "new exceptions" );
  844. noAnimscripts = false;
  845. }
  846.  
  847. if ( getdebugdvar( "debug_trace" ) == "on" )
  848. {
  849. if ( !IsDefined( level.traceStart ) )
  850. {
  851. thread showDebugTrace();
  852. }
  853.  
  854. // SCRIPTER_MOD
  855. // JesseS ( 3/20/2007 ): level.player replaced with players[ 0 ]
  856. players = get_players();
  857.  
  858. level.traceStart = players[ 0 ] geteye();
  859. setdvar( "debug_trace", "off" );
  860. }
  861.  
  862. // SCRIPTER_MOD: JesseS ( 3/18/2008 ): Trying to add dynamic spawning in levels
  863. if ( getdebugdvar( "debug_dynamic_ai_spawning" ) == "1" && ( !IsDefined( level.spawn_anywhere_active ) || level.spawn_anywhere_active == false ) )
  864. {
  865. level.spawn_anywhere_active = true;
  866. thread dynamic_ai_spawner();
  867. }
  868. else if ( getdebugdvar( "debug_dynamic_ai_spawning" ) == "0" )
  869. {
  870. level.spawn_anywhere_active = false;
  871. level notify ( "kill dynamic spawning" );
  872. }
  873.  
  874. debug_reflection();
  875.  
  876. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  877. if ( getdebugdvar( "replay_debug" ) == "1" )
  878. PrintLn( "File: _debug.gsc. Function: debugDvars() - INNNER LOOP START WAIT 0.05\n" );
  879.  
  880. wait( 0.05 );
  881.  
  882. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  883. if ( getdebugdvar( "replay_debug" ) == "1" )
  884. PrintLn( "File: _debug.gsc. Function: debugDvars() - INNNER LOOP STOP WAIT 0.05\n" );
  885.  
  886. if ( getdebugdvar( "replay_debug" ) == "1" )
  887. PrintLn( "File: _debug.gsc. Function: debugDvars() - INNNER LOOP END\n" );
  888. }
  889.  
  890. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  891. if ( getdebugdvar( "replay_debug" ) == "1" )
  892. PrintLn( "File: _debug.gsc. Function: debugDvars() - COMPLETE\n" );
  893. #/
  894. }
  895.  
  896. remove_reflection_objects()
  897. {
  898. /#
  899. if ( ( level.debug_reflection == 2 || level.debug_reflection == 3 ) && IsDefined( level.debug_reflection_objects ) )
  900. {
  901. for ( i = 0; i < level.debug_reflection_objects.size; i++ )
  902. {
  903. level.debug_reflection_objects[ i ] delete();
  904. }
  905. level.debug_reflection_objects = undefined;
  906. }
  907.  
  908. if ( level.debug_reflection == 1 || level.debug_reflection == 3 )
  909. {
  910. level.debug_reflectionobject delete();
  911. }
  912. #/
  913. }
  914.  
  915. create_reflection_objects()
  916. {
  917. /#
  918. reflection_locs = GetReflectionLocs();
  919. for ( i = 0; i < reflection_locs.size; i++ )
  920. {
  921. level.debug_reflection_objects[ i ] = spawn( "script_model", reflection_locs[ i ] );
  922. level.debug_reflection_objects[ i ] setmodel( "test_sphere_silver" );
  923. }
  924. #/
  925. }
  926.  
  927. create_reflection_object()
  928. {
  929. /#
  930. players = get_players();
  931. player = players[ 0 ];
  932. level.debug_reflectionobject = spawn( "script_model", player geteye() +( vector_multiply( anglestoforward( player.angles ), 100 ) ) );
  933. level.debug_reflectionobject setmodel( "test_sphere_silver" );
  934. level.debug_reflectionobject.origin = player geteye() + ( vector_multiply ( anglestoforward ( player getplayerangles() ), 100 ) );
  935. level.debug_reflectionobject linkto ( player );
  936. thread debug_reflection_buttons();
  937. #/
  938. }
  939.  
  940.  
  941. debug_reflection()
  942. {
  943. /#
  944. if ( ( getdebugdvar( "debug_reflection" ) == "2" && level.debug_reflection != 2 ) || ( getdebugdvar( "debug_reflection" ) == "3" && level.debug_reflection != 3 ) )
  945. {
  946. remove_reflection_objects();
  947. if ( getdebugdvar( "debug_reflection" ) == "2" )
  948. {
  949. create_reflection_objects();
  950. level.debug_reflection = 2;
  951. }
  952. else
  953. {
  954. create_reflection_objects();
  955. create_reflection_object();
  956. level.debug_reflection = 3;
  957. }
  958. }
  959. else if ( getdebugdvar( "debug_reflection" ) == "1" && level.debug_reflection != 1 )
  960. {
  961. remove_reflection_objects();
  962. create_reflection_object();
  963. level.debug_reflection = 1;
  964. }
  965. else if ( getdebugdvar( "debug_reflection" ) == "0" && level.debug_reflection != 0 )
  966. {
  967. remove_reflection_objects();
  968. level.debug_reflection = 0;
  969. }
  970. #/
  971. }
  972.  
  973. debug_reflection_buttons()
  974. {
  975. /#
  976. offset = 100;
  977. lastoffset = offset;
  978. offsetinc = 50;
  979. while ( getdebugdvar( "debug_reflection" ) == "1" || getdebugdvar( "debug_reflection" ) == "3" )
  980. {
  981. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  982. if ( getdebugdvar( "replay_debug" ) == "1" )
  983. PrintLn( "File: _debug.gsc. Function: debug_reflection_buttons() - INNER LOOP START\n" );
  984.  
  985. players = get_players();
  986.  
  987. if ( players[ 0 ] buttonpressed ( "BUTTON_X" ) )
  988. {
  989. offset+=offsetinc;
  990. }
  991. if ( players[ 0 ] buttonpressed ( "BUTTON_Y" ) )
  992. {
  993. offset-=offsetinc;
  994. }
  995. if ( offset > 1000 )
  996. {
  997. offset = 1000;
  998. }
  999. if ( offset < 64 )
  1000. {
  1001. offset = 64;
  1002. }
  1003. // if ( offset!=lastoffset )
  1004. // {
  1005. level.debug_reflectionobject unlink();
  1006. level.debug_reflectionobject.origin = players[ 0 ] geteye() + ( vector_multiply ( anglestoforward ( players[ 0 ] getplayerangles() ), offset ) );
  1007. lastoffset = offset;
  1008. // }
  1009.  
  1010. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1011. if ( getdebugdvar( "replay_debug" ) == "1" )
  1012. PrintLn( "File: _debug.gsc. Function: debug_reflection_buttons() - INNER LOOP END\n" );
  1013.  
  1014. line( level.debug_reflectionobject.origin,
  1015. getreflectionorigin( level.debug_reflectionobject.origin ),
  1016. ( 1,0,0 ),
  1017. true,
  1018. 1 );
  1019.  
  1020. wait .05;
  1021. level.debug_reflectionobject linkto ( players[ 0 ] );
  1022. }
  1023. #/
  1024. }
  1025.  
  1026. showDebugTrace()
  1027. {
  1028. startOverride = undefined;
  1029. endOverride = undefined;
  1030. startOverride =( 15.1859, -12.2822, 4.071 );
  1031. endOverride =( 947.2, -10918, 64.9514 );
  1032.  
  1033. assert( !IsDefined( level.traceEnd ) );
  1034. for ( ;; )
  1035. {
  1036. // SCRIPTER_MOD
  1037. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1038. players = get_players();
  1039. wait( 0.05 );
  1040. start = startOverride;
  1041. end = endOverride;
  1042. if ( !IsDefined( startOverride ) )
  1043. {
  1044. start = level.traceStart;
  1045. }
  1046. if ( !IsDefined( endOverride ) )
  1047. {
  1048. end = players[ 0 ] geteye();
  1049. }
  1050.  
  1051. trace = bulletTrace( start, end, false, undefined );
  1052. line( start, trace[ "position" ], ( 0.9, 0.5, 0.8 ), 0.5 );
  1053. }
  1054. }
  1055.  
  1056. hatmodel()
  1057. {
  1058. /#
  1059. for ( ;; )
  1060. {
  1061. if ( getdebugdvar( "debug_hatmodel" ) == "off" )
  1062. return;
  1063. noHat = [];
  1064. ai = getaiarray();
  1065.  
  1066. for ( i=0;i<ai.size;i++ )
  1067. {
  1068. if ( IsDefined( ai[ i ].hatmodel ) )
  1069. continue;
  1070.  
  1071. alreadyKnown = false;
  1072. for ( p=0;p<noHat.size;p++ )
  1073. {
  1074. if ( noHat[ p ] != ai[ i ].classname )
  1075. continue;
  1076. alreadyKnown = true;
  1077. break;
  1078. }
  1079. if ( !alreadyKnown )
  1080. noHat[ noHat.size ] = ai[ i ].classname;
  1081. }
  1082.  
  1083. if ( noHat.size )
  1084. {
  1085. PrintLn( " " );
  1086. PrintLn( "The following AI have no Hatmodel, so helmets can not pop off on head-shot death:" );
  1087. for ( i=0;i<noHat.size;i++ )
  1088. PrintLn( "Classname: ", noHat[ i ] );
  1089. PrintLn( "To disable hatModel spam, type debug_hatmodel off" );
  1090. }
  1091. wait( 15 );
  1092. }
  1093. #/
  1094. }
  1095.  
  1096. debug_character_count()
  1097. {
  1098. //drones
  1099. drones = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  1100. drones.alignX = "left";
  1101. drones.alignY = "middle";
  1102. drones.x = 620;
  1103. drones.y = 275;
  1104. drones.label = &"DEBUG_DRONES";
  1105. drones.alpha = 0;
  1106. drones.fontscale = 1.2;
  1107.  
  1108. //allies
  1109. allies = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  1110. allies.alignX = "left";
  1111. allies.alignY = "middle";
  1112. allies.x = 620;
  1113. allies.y = 290;
  1114. allies.label = &"DEBUG_ALLIES";
  1115. allies.alpha = 0;
  1116. allies.fontscale = 1.2;
  1117.  
  1118. //allies
  1119. axis = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  1120. axis.alignX = "left";
  1121. axis.alignY = "middle";
  1122. axis.x = 620;
  1123. axis.y = 305;
  1124. axis.label = &"DEBUG_AXIS";
  1125. axis.alpha = 0;
  1126. axis.fontscale = 1.2;
  1127.  
  1128.  
  1129. //vehicles
  1130. vehicles = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  1131. vehicles.alignX = "left";
  1132. vehicles.alignY = "middle";
  1133. vehicles.x = 620;
  1134. vehicles.y = 320;
  1135. vehicles.label = &"DEBUG_VEHICLES";
  1136. vehicles.alpha = 0;
  1137. vehicles.fontscale = 1.2;
  1138.  
  1139. //total
  1140. total = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  1141. total.alignX = "left";
  1142. total.alignY = "middle";
  1143. total.x = 620;
  1144. total.y = 335;
  1145. total.label = &"DEBUG_TOTAL";
  1146. total.alpha = 0;
  1147. total.fontscale = 1.2;
  1148.  
  1149. lastdvar = "off";
  1150. for ( ;; )
  1151. {
  1152. dvar = getdvar( "debug_character_count" );
  1153. if ( dvar == "off" )
  1154. {
  1155. if ( dvar != lastdvar )
  1156. {
  1157. drones.alpha = 0;
  1158. allies.alpha = 0;
  1159. axis.alpha = 0;
  1160. vehicles.alpha = 0;
  1161. total.alpha = 0;
  1162. lastdvar = dvar;
  1163. }
  1164. wait .25;
  1165. continue;
  1166. }
  1167. else
  1168. {
  1169. if ( dvar != lastdvar )
  1170. {
  1171. drones.alpha = 1;
  1172. allies.alpha = 1;
  1173. axis.alpha = 1;
  1174. vehicles.alpha = 1;
  1175. total.alpha = 1;
  1176. lastdvar = dvar;
  1177.  
  1178. }
  1179. }
  1180.  
  1181. //drones
  1182. count_drones = getentarray( "drone", "targetname" ).size;
  1183. drones setValue( count_drones );
  1184.  
  1185. //allies
  1186. count_allies = getaiarray( "allies" ).size;
  1187. allies setValue( count_allies );
  1188.  
  1189. //axis
  1190. count_axis = getaiarray( "axis" ).size;
  1191. axis setValue( count_axis );
  1192.  
  1193. vehicles setValue( getentarray( "script_vehicle", "classname" ).size );
  1194.  
  1195. //total
  1196. total setValue( count_drones + count_allies + count_axis );
  1197.  
  1198. wait 0.25;
  1199. }
  1200. }
  1201.  
  1202. debug_nuke()
  1203. {
  1204. // CODER_MOD - no more level.player
  1205. players = get_players();
  1206. player = players[ 0 ];
  1207. dvar = getdvar( "debug_nuke" );
  1208. if ( dvar == "on" )
  1209. {
  1210. ai = getaispeciesarray( "axis", "all" );
  1211. for ( i=0;i<ai.size;i++ )
  1212. ai[ i ] dodamage( 300, ( 0, 0, 0 ), player );
  1213. }
  1214. else
  1215. if ( dvar == "ai" )
  1216. {
  1217. ai = getaiarray( "axis" );
  1218. for ( i=0;i<ai.size;i++ )
  1219. ai[ i ] dodamage( 300, ( 0, 0, 0 ), player );
  1220. }
  1221. else
  1222. if ( dvar == "dogs" )
  1223. {
  1224. ai = getaispeciesarray( "axis", "dog" );
  1225. for ( i=0;i<ai.size;i++ )
  1226. ai[ i ] dodamage( 300, ( 0, 0, 0 ), player );
  1227. }
  1228. setdvar( "debug_nuke", "off" );
  1229. }
  1230.  
  1231. debug_missTime()
  1232. {
  1233.  
  1234. }
  1235.  
  1236. camera()
  1237. {
  1238. wait( 0.05 );
  1239. cameras = getentarray( "camera", "targetname" );
  1240. for ( i=0;i<cameras.size;i++ )
  1241. {
  1242. ent = getent( cameras[ i ].target, "targetname" );
  1243. cameras[ i ].origin2 = ent.origin;
  1244. cameras[ i ].angles = vectortoangles( ent.origin - cameras[ i ].origin );
  1245. }
  1246. for ( ;; )
  1247. {
  1248. /#
  1249. if ( getdebugdvar( "camera" ) != "on" )
  1250. {
  1251. if ( getdebugdvar( "camera" ) != "off" )
  1252. setdvar( "camera", "off" );
  1253. wait( 1 );
  1254. continue;
  1255. }
  1256. #/
  1257.  
  1258. ai = getaiarray( "axis" );
  1259. if ( !ai.size )
  1260. {
  1261. freePlayer();
  1262. wait( 0.5 );
  1263. continue;
  1264. }
  1265. cameraWithEnemy = [];
  1266. for ( i=0;i<cameras.size;i++ )
  1267. {
  1268. for ( p=0;p<ai.size;p++ )
  1269. {
  1270. if ( distance( cameras[ i ].origin, ai[ p ].origin ) > 256 )
  1271. continue;
  1272. cameraWithEnemy[ cameraWithEnemy.size ] = cameras[ i ];
  1273. break;
  1274. }
  1275. }
  1276. if ( !cameraWithEnemy.size )
  1277. {
  1278. freePlayer();
  1279. wait( 0.5 );
  1280. continue;
  1281. }
  1282.  
  1283. cameraWithPlayer = [];
  1284. for ( i=0;i<cameraWithEnemy.size;i++ )
  1285. {
  1286. camera = cameraWithEnemy[ i ];
  1287.  
  1288. start = camera.origin2;
  1289. end = camera.origin;
  1290. difference = vectorToAngles( ( end[ 0 ], end[ 1 ], end[ 2 ] ) -( start[ 0 ], start[ 1 ], start[ 2 ] ) );
  1291. angles =( 0, difference[ 1 ], 0 );
  1292. forward = anglesToForward( angles );
  1293.  
  1294. // SCRIPTER_MOD
  1295. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1296. players = get_players();
  1297. difference = vectornormalize( end - players[ 0 ].origin );
  1298. dot = vectordot( forward, difference );
  1299. if ( dot < 0.85 )
  1300. continue;
  1301.  
  1302. cameraWithPlayer[ cameraWithPlayer.size ] = camera;
  1303. }
  1304.  
  1305. if ( !cameraWithPlayer.size )
  1306. {
  1307. freePlayer();
  1308. wait( 0.5 );
  1309. continue;
  1310. }
  1311.  
  1312. // SCRIPTER_MOD
  1313. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1314. players = get_players();
  1315. dist = distance( players[ 0 ].origin, cameraWithPlayer[ 0 ].origin );
  1316. newcam = cameraWithPlayer[ 0 ];
  1317. for ( i=1;i<cameraWithPlayer.size;i++ )
  1318. {
  1319. newdist = distance( players[ 0 ].origin, cameraWithPlayer[ i ].origin );
  1320. if ( newdist > dist )
  1321. continue;
  1322.  
  1323. newcam = cameraWithPlayer[ i ];
  1324. dist = newdist;
  1325. }
  1326.  
  1327. setPlayerToCamera( newcam );
  1328. wait( 3 );
  1329. }
  1330. }
  1331.  
  1332. freePlayer()
  1333. {
  1334. setdvar( "cl_freemove", "0" );
  1335. }
  1336.  
  1337. setPlayerToCamera( camera )
  1338. {
  1339. setdvar( "cl_freemove", "2" );
  1340. setdebugangles( camera.angles );
  1341. setdebugorigin( camera.origin +( 0, 0, -60 ) );
  1342. }
  1343.  
  1344. anglescheck()
  1345. {
  1346. while ( 1 )
  1347. {
  1348. // SCRIPTER_MOD
  1349. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1350. players = get_players();
  1351. if ( getdvar( "angles" ) == "1" )
  1352. {
  1353. PrintLn ( "origin " + players[ 0 ] getorigin() );
  1354. PrintLn ( "angles " + players[ 0 ].angles );
  1355. setdvar( "angles", "0" );
  1356. }
  1357. wait( 1 );
  1358. }
  1359. }
  1360.  
  1361. dolly()
  1362. {
  1363. if ( !IsDefined( level.dollyTime ) )
  1364. level.dollyTime = 5;
  1365. setdvar( "dolly", "" );
  1366. thread dollyStart();
  1367. thread dollyEnd();
  1368. thread dollyGo();
  1369. }
  1370.  
  1371. dollyStart()
  1372. {
  1373. while ( 1 )
  1374. {
  1375. // SCRIPTER_MOD
  1376. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1377. players = get_players();
  1378. if ( getdvar( "dolly" ) == "start" )
  1379. {
  1380. level.dollystart = players[ 0 ].origin;
  1381. setdvar( "dolly", "" );
  1382. }
  1383. wait( 1 );
  1384. }
  1385. }
  1386.  
  1387. dollyEnd()
  1388. {
  1389. while ( 1 )
  1390. {
  1391. if ( getdvar( "dolly" ) == "end" )
  1392. {
  1393. // SCRIPTER_MOD
  1394. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1395. players = get_players();
  1396. level.dollyend = players[ 0 ].origin;
  1397. setdvar( "dolly", "" );
  1398. }
  1399. wait( 1 );
  1400. }
  1401. }
  1402.  
  1403. dollyGo()
  1404. {
  1405. while ( 1 )
  1406. {
  1407. // SCRIPTER_MOD
  1408. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1409. players = get_players();
  1410.  
  1411. wait( 1 );
  1412. if ( getdvar( "dolly" ) == "go" )
  1413. {
  1414. setdvar( "dolly", "" );
  1415. if ( !IsDefined( level.dollystart ) )
  1416. {
  1417. PrintLn( "NO Dolly Start!" );
  1418. continue;
  1419. }
  1420. if ( !IsDefined( level.dollyend ) )
  1421. {
  1422. PrintLn( "NO Dolly End!" );
  1423. continue;
  1424. }
  1425.  
  1426. org = spawn( "script_origin", ( 0, 0, 0 ) );
  1427. org.origin = level.dollystart;
  1428. players[ 0 ] setorigin ( org.origin );
  1429. players[ 0 ] linkto ( org );
  1430.  
  1431. org moveto( level.dollyend, level.dollyTime );
  1432. wait( level.dollyTime );
  1433. org delete();
  1434. }
  1435. }
  1436. }
  1437.  
  1438. deathspawnerPreview()
  1439. {
  1440. waittillframeend;
  1441. for ( i=0;i<50;i++ )
  1442. {
  1443. if ( !IsDefined( level.deathspawnerents[ i ] ) )
  1444. continue;
  1445. array = level.deathspawnerents[ i ];
  1446. for ( p=0;p<array.size;p++ )
  1447. {
  1448. ent = array[ p ];
  1449. if ( IsDefined( ent.truecount ) )
  1450. print3d( ent.origin, i + ": " + ent.truecount, ( 0, 0.8, 0.6 ), 5 );
  1451. else
  1452. print3d( ent.origin, i + ": " + ".", ( 0, 0.8, 0.6 ), 5 );
  1453. }
  1454. }
  1455. }
  1456.  
  1457.  
  1458. lastSightPosWatch()
  1459. {
  1460. /#
  1461. for ( ;; )
  1462. {
  1463. wait( 0.05 );
  1464.  
  1465. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1466. if ( getdebugdvar( "replay_debug" ) == "1" )
  1467. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER LOOP START\n" );
  1468.  
  1469. num = getdvarint( "lastsightpos" );
  1470. if ( !num )
  1471. {
  1472. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1473. if ( getdebugdvar( "replay_debug" ) == "1" )
  1474. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER LOOP END EARLY 1\n" );
  1475. continue;
  1476. }
  1477.  
  1478. guy = undefined;
  1479. ai = getaiarray();
  1480. for ( i=0;i<ai.size;i++ )
  1481. {
  1482. if ( ai[ i ] getentnum() != num )
  1483. continue;
  1484.  
  1485. guy = ai[ i ];
  1486. break;
  1487. }
  1488.  
  1489. if ( !isalive( guy ) )
  1490. {
  1491. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1492. if ( getdebugdvar( "replay_debug" ) == "1" )
  1493. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER LOOP END EARLY 2\n" );
  1494. continue;
  1495. }
  1496.  
  1497. if ( guy animscripts\utility::hasEnemySightPos() )
  1498. org = guy animscripts\utility::getEnemySightPos();
  1499. else
  1500. org = undefined;
  1501.  
  1502.  
  1503. for ( ;; )
  1504. {
  1505. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1506. if ( getdebugdvar( "replay_debug" ) == "1" )
  1507. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER INNER LOOP START\n" );
  1508.  
  1509. newnum = getdvarint( "lastsightpos" );
  1510. if ( num != newnum )
  1511. break;
  1512.  
  1513. if ( ( isalive( guy ) ) &&( guy animscripts\utility::hasEnemySightPos() ) )
  1514. org = guy animscripts\utility::getEnemySightPos();
  1515.  
  1516. if ( !IsDefined( org ) )
  1517. {
  1518. wait( 0.05 );
  1519. continue;
  1520. }
  1521.  
  1522. range = 10;
  1523. color =( 0.2, 0.9, 0.8 );
  1524. line( org +( 0, 0, range ), org +( 0, 0, range * -1 ), color, 1.0 );
  1525. line( org +( range, 0, 0 ), org +( range * -1, 0, 0 ), color, 1.0 );
  1526. line( org +( 0, range, 0 ), org +( 0, range * -1, 0 ), color, 1.0 );
  1527.  
  1528. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1529. if ( getdebugdvar( "replay_debug" ) == "1" )
  1530. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER INNER LOOP END\n" );
  1531.  
  1532. wait( 0.05 );
  1533. }
  1534.  
  1535. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1536. if ( getdebugdvar( "replay_debug" ) == "1" )
  1537. PrintLn( "File: _debug.gsc. Function: lastSightPosWatch() - INNER LOOP END\n" );
  1538. }
  1539. #/
  1540. }
  1541.  
  1542. watchMinimap()
  1543. {
  1544. precacheItem( "defaultweapon" );
  1545. while ( 1 )
  1546. {
  1547. updateMinimapSetting();
  1548. wait .25;
  1549. }
  1550. }
  1551.  
  1552. updateMinimapSetting()
  1553. {
  1554. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1555. /#
  1556. if ( getdebugdvar( "replay_debug" ) == "1" )
  1557. PrintLn( "File: _debug.gsc. Function: updateMinimapSetting()\n" );
  1558. #/
  1559.  
  1560. // use 0 for no required map aspect ratio.
  1561. requiredMapAspectRatio = getdvarfloat( "scr_requiredMapAspectRatio" );
  1562.  
  1563. if ( !IsDefined( level.minimapheight ) ) {
  1564. setdvar( "scr_minimap_height", "0" );
  1565. level.minimapheight = 0;
  1566. }
  1567. minimapheight = getdvarfloat( "scr_minimap_height" );
  1568. if ( minimapheight != level.minimapheight )
  1569. {
  1570. if ( IsDefined( level.minimaporigin ) ) {
  1571. level.minimapplayer unlink();
  1572. level.minimaporigin delete();
  1573. level notify( "end_draw_map_bounds" );
  1574. }
  1575.  
  1576. if ( minimapheight > 0 )
  1577. {
  1578. level.minimapheight = minimapheight;
  1579.  
  1580. // SCRIPTER_MOD
  1581. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1582. players = get_players();
  1583. player = players[ 0 ];
  1584.  
  1585. corners = getentarray( "minimap_corner", "targetname" );
  1586. if ( corners.size == 2 )
  1587. {
  1588. viewpos =( corners[ 0 ].origin + corners[ 1 ].origin );
  1589. viewpos =( viewpos[ 0 ]*.5, viewpos[ 1 ]*.5, viewpos[ 2 ]*.5 );
  1590.  
  1591. maxcorner =( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] );
  1592. mincorner =( corners[ 0 ].origin[ 0 ], corners[ 0 ].origin[ 1 ], viewpos[ 2 ] );
  1593. if ( corners[ 1 ].origin[ 0 ] > corners[ 0 ].origin[ 0 ] )
  1594. maxcorner =( corners[ 1 ].origin[ 0 ], maxcorner[ 1 ], maxcorner[ 2 ] );
  1595. else
  1596. mincorner =( corners[ 1 ].origin[ 0 ], mincorner[ 1 ], mincorner[ 2 ] );
  1597. if ( corners[ 1 ].origin[ 1 ] > corners[ 0 ].origin[ 1 ] )
  1598. maxcorner =( maxcorner[ 0 ], corners[ 1 ].origin[ 1 ], maxcorner[ 2 ] );
  1599. else
  1600. mincorner =( mincorner[ 0 ], corners[ 1 ].origin[ 1 ], mincorner[ 2 ] );
  1601.  
  1602. viewpostocorner = maxcorner - viewpos;
  1603. viewpos =( viewpos[ 0 ], viewpos[ 1 ], viewpos[ 2 ] + minimapheight );
  1604.  
  1605. origin = spawn( "script_origin", player.origin );
  1606.  
  1607. northvector =( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
  1608. eastvector =( northvector[ 1 ], 0 - northvector[ 0 ], 0 );
  1609. disttotop = vectordot( northvector, viewpostocorner );
  1610. if ( disttotop < 0 )
  1611. disttotop = 0 - disttotop;
  1612. disttoside = vectordot( eastvector, viewpostocorner );
  1613. if ( disttoside < 0 )
  1614. disttoside = 0 - disttoside;
  1615.  
  1616. // extend map bounds to meet the required aspect ratio
  1617. if ( requiredMapAspectRatio > 0 )
  1618. {
  1619. mapAspectRatio = disttoside / disttotop;
  1620. if ( mapAspectRatio < requiredMapAspectRatio )
  1621. {
  1622. incr = requiredMapAspectRatio / mapAspectRatio;
  1623. disttoside *= incr;
  1624. addvec = vecscale( eastvector, vectordot( eastvector, maxcorner - viewpos ) *( incr - 1 ) );
  1625. mincorner -= addvec;
  1626. maxcorner += addvec;
  1627. }
  1628. else
  1629. {
  1630. incr = mapAspectRatio / requiredMapAspectRatio;
  1631. disttotop *= incr;
  1632. addvec = vecscale( northvector, vectordot( northvector, maxcorner - viewpos ) *( incr - 1 ) );
  1633. mincorner -= addvec;
  1634. maxcorner += addvec;
  1635. }
  1636. }
  1637.  
  1638. if ( level.console )
  1639. {
  1640. aspectratioguess = 16.0/9.0;
  1641. // .8 would be .75 but it needs to be bigger because of safe area
  1642. angleside = 2 * atan( disttoside * .8 / minimapheight );
  1643. angletop = 2 * atan( disttotop * aspectratioguess * .8 / minimapheight );
  1644. }
  1645. else
  1646. {
  1647. aspectratioguess = 4.0/3.0;
  1648. // multiply by 1.05 to give some margin to work with
  1649. angleside = 2 * atan( disttoside * 1.05 / minimapheight );
  1650. angletop = 2 * atan( disttotop * aspectratioguess * 1.05 / minimapheight );
  1651. }
  1652. if ( angleside > angletop )
  1653. angle = angleside;
  1654. else
  1655. angle = angletop;
  1656.  
  1657. znear = minimapheight - 1000;
  1658. if ( znear < 16 ) znear = 16;
  1659. if ( znear > 10000 ) znear = 10000;
  1660.  
  1661. player playerlinktoabsolute( origin );
  1662. origin.origin = viewpos +( 0, 0, -62 );
  1663. origin.angles =( 90, getnorthyaw(), 0 );
  1664.  
  1665. // because some guns can mess up the field of view, require default weapon
  1666. player GiveWeapon( "defaultweapon" );
  1667. setsaveddvar( "cg_fov", angle );
  1668.  
  1669. // Internal Dvar set: cg_drawgun - Internal Dvars cannot be changed by script. Use 'setsaveddvar' to alter SAVED internal dvars
  1670. // setsaveddvar can only be called on dvars with the SAVED flag set
  1671. // Error: "cg_drawgun" is not a valid dvar to set using setclientdvar
  1672.  
  1673. level.minimapplayer = player;
  1674. level.minimaporigin = origin;
  1675.  
  1676. thread drawMiniMapBounds( viewpos, mincorner, maxcorner );
  1677. }
  1678. else
  1679. PrintLn( "^1Error: There are not exactly 2 \"minimap_corner\" entities in the level." );
  1680. }
  1681. }
  1682. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  1683. /#
  1684. if ( getdebugdvar( "replay_debug" ) == "1" )
  1685. PrintLn( "File: _debug.gsc. Function: updateMinimapSetting() - COMPLETE\n" );
  1686. #/
  1687. }
  1688.  
  1689. getchains()
  1690. {
  1691. chainarray = [];
  1692. chainarray = getentarray( "minimap_line", "script_noteworthy" );
  1693. array = [];
  1694. for ( i=0;i<chainarray.size;i++ )
  1695. {
  1696. array[ i ] = chainarray[ i ] getchain();
  1697. }
  1698. return array;
  1699. }
  1700.  
  1701. getchain()
  1702. {
  1703. array = [];
  1704. ent = self;
  1705. while ( IsDefined( ent ) )
  1706. {
  1707. array[ array.size ] = ent;
  1708. if ( !IsDefined( ent ) || !IsDefined( ent.target ) )
  1709. break;
  1710. ent = getent( ent.target, "targetname" );
  1711. if ( IsDefined( ent ) && ent == array[ 0 ] )
  1712. {
  1713. array[ array.size ] = ent;
  1714. break;
  1715. }
  1716. }
  1717. originarray = [];
  1718. for ( i=0;i<array.size;i++ )
  1719. originarray[ i ] = array[ i ].origin;
  1720. return originarray;
  1721.  
  1722. }
  1723.  
  1724. vecscale( vec, scalar )
  1725. {
  1726. return( vec[ 0 ]*scalar, vec[ 1 ]*scalar, vec[ 2 ]*scalar );
  1727. }
  1728. drawMiniMapBounds( viewpos, mincorner, maxcorner )
  1729. {
  1730. level notify( "end_draw_map_bounds" );
  1731. level endon( "end_draw_map_bounds" );
  1732.  
  1733. viewheight =( viewpos[ 2 ] - maxcorner[ 2 ] );
  1734.  
  1735. diaglen = length( mincorner - maxcorner );
  1736.  
  1737. mincorneroffset =( mincorner - viewpos );
  1738. mincorneroffset = vectornormalize( ( mincorneroffset[ 0 ], mincorneroffset[ 1 ], 0 ) );
  1739. mincorner = mincorner + vecscale( mincorneroffset, diaglen * 1/800*0 );
  1740. maxcorneroffset =( maxcorner - viewpos );
  1741. maxcorneroffset = vectornormalize( ( maxcorneroffset[ 0 ], maxcorneroffset[ 1 ], 0 ) );
  1742. maxcorner = maxcorner + vecscale( maxcorneroffset, diaglen * 1/800*0 );
  1743.  
  1744. north =( cos( getnorthyaw() ), sin( getnorthyaw() ), 0 );
  1745.  
  1746. diagonal = maxcorner - mincorner;
  1747. side = vecscale( north, vectordot( diagonal, north ) );
  1748. sidenorth = vecscale( north, abs( vectordot( diagonal, north ) ) );
  1749.  
  1750. corner0 = mincorner;
  1751. corner1 = mincorner + side;
  1752. corner2 = maxcorner;
  1753. corner3 = maxcorner - side;
  1754.  
  1755. toppos = vecscale( mincorner + maxcorner, .5 ) + vecscale( sidenorth, .51 );
  1756. textscale = diaglen * .003;
  1757. chains = getchains();
  1758.  
  1759.  
  1760. while ( 1 )
  1761. {
  1762. line( corner0, corner1 );
  1763. line( corner1, corner2 );
  1764. line( corner2, corner3 );
  1765. line( corner3, corner0 );
  1766.  
  1767. array_levelthread( chains, maps\_utility::plot_points );
  1768.  
  1769. print3d( toppos, "This Side Up", ( 1, 1, 1 ), 1, textscale );
  1770.  
  1771. wait .05;
  1772. }
  1773. }
  1774.  
  1775.  
  1776. debug_vehiclesittags()
  1777. {
  1778. vehicles = getentarray( "script_vehicle", "classname" );
  1779. type = "none";
  1780. /# type = getdebugdvar( "debug_vehiclesittags" );#/
  1781. for ( i=0;i<vehicles.size;i++ )
  1782. {
  1783. // if ( !IsDefined( level.vehicle_aianims[ vehicles[ i ].vehicletype ] ) || vehicles[ i ].vehicletype != type )
  1784. if ( !IsDefined( level.vehicle_aianims[ vehicles[ i ].vehicletype ] ) )
  1785. continue;
  1786.  
  1787. anims = level.vehicle_aianims[ vehicles[ i ].vehicletype ];
  1788. for ( j=0;j<anims.size;j++ )
  1789. {
  1790. // SCRIPTER_MOD
  1791. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1792. players = get_players();
  1793.  
  1794. if ( IsDefined( anims[ j ].sittag ) )
  1795. {
  1796. vehicles[ i ] thread drawtag( anims[ j ].sittag );
  1797. org = vehicles[ i ] gettagorigin( anims[ j ].sittag );
  1798. if ( players[ 0 ] islookingatorigin( org ) )
  1799. print3d( org+( 0, 0, 16 ), anims[ j ].sittag, ( 1, 1, 1 ), 1, 1 );
  1800. }
  1801. }
  1802. }
  1803. }
  1804.  
  1805. islookingatorigin( origin )
  1806. {
  1807. normalvec = vectorNormalize( origin-self getShootAtPos() );
  1808. veccomp = vectorNormalize( ( origin-( 0, 0, 24 ) )-self getShootAtPos() );
  1809. insidedot = vectordot( normalvec, veccomp );
  1810.  
  1811. anglevec = anglestoforward( self getplayerangles() );
  1812. vectordot = vectordot( anglevec, normalvec );
  1813. if ( vectordot > insidedot )
  1814. return true;
  1815. else
  1816. return false;
  1817. }
  1818.  
  1819. debug_colornodes()
  1820. {
  1821. wait( 0.05 );
  1822. ai = getaiarray();
  1823.  
  1824. array = [];
  1825. array[ "axis" ] = [];
  1826. array[ "allies" ] = [];
  1827. array[ "neutral" ] = [];
  1828. for ( i=0; i<ai.size; i++ )
  1829. {
  1830. guy = ai[ i ];
  1831.  
  1832. if ( !IsDefined( guy.currentColorCode ) )
  1833. continue;
  1834.  
  1835. array[ guy.team ][ guy.currentColorCode ] = true;
  1836.  
  1837. color =( 1, 1, 1 );
  1838. if ( IsDefined( guy.script_forceColor ) )
  1839. color = level.color_debug[ guy.script_forceColor ];
  1840.  
  1841. print3d( guy.origin +( 0, 0, 50 ), guy.currentColorCode, color, 1, 1 );
  1842.  
  1843. // axis dont do forcecolor behavior, they do follow the leader for force color
  1844. if ( guy.team == "axis" )
  1845. continue;
  1846.  
  1847. guy try_to_draw_line_to_node();
  1848. }
  1849.  
  1850. draw_colorNodes( array, "allies" );
  1851. draw_colorNodes( array, "axis" );
  1852. }
  1853.  
  1854. draw_colorNodes( array, team )
  1855. {
  1856. keys = getArrayKeys( array[ team ] );
  1857. for ( i=0; i<keys.size; i++ )
  1858. {
  1859. color =( 1, 1, 1 );
  1860. // use the first letter of the key as the color
  1861. color = level.color_debug[ getsubstr( keys[ i ], 0, 1 ) ];
  1862.  
  1863. if ( IsDefined( level.colorNodes_debug_array[ team ][ keys[ i ] ] ) )
  1864. {
  1865. teamArray = level.colorNodes_debug_array[ team ][ keys[ i ] ];
  1866. for ( p=0; p < teamArray.size; p++ )
  1867. {
  1868. print3d( teamArray[ p ].origin, "N-" + keys[ i ], color, 1, 1 );
  1869. }
  1870. }
  1871. }
  1872. }
  1873.  
  1874. get_team_substr()
  1875. {
  1876. if ( self.team == "allies" )
  1877. {
  1878. if ( !IsDefined( self.node.script_color_allies ) )
  1879. return;
  1880.  
  1881. return self.node.script_color_allies;
  1882. }
  1883.  
  1884. if ( self.team == "axis" )
  1885. {
  1886. if ( !IsDefined( self.node.script_color_axis ) )
  1887. return;
  1888.  
  1889. return self.node.script_color_axis;
  1890. }
  1891. }
  1892.  
  1893. try_to_draw_line_to_node()
  1894. {
  1895. if ( !IsDefined( self.node ) )
  1896. return;
  1897.  
  1898. if ( !IsDefined( self.script_forceColor ) )
  1899. return;
  1900.  
  1901. substr = get_team_substr();
  1902. if ( !IsDefined( substr ) )
  1903. return;
  1904.  
  1905. if ( !issubstr( substr, self.script_forceColor ) )
  1906. return;
  1907.  
  1908. line( self.origin +( 0, 0, 64 ), self.node.origin, level.color_debug[ self.script_forceColor ] );
  1909. }
  1910.  
  1911. fogcheck()
  1912. {
  1913. if ( getdvar( "depth_close" ) == "" )
  1914. setdvar( "depth_close", "0" );
  1915.  
  1916. if ( getdvar( "depth_far" ) == "" )
  1917. setdvar( "depth_far", "1500" );
  1918.  
  1919. close = getdvarint( "depth_close" );
  1920. far = getdvarint( "depth_far" );
  1921. setexpfog( close, far, 1, 1, 1, 0 );
  1922. }
  1923.  
  1924. debugThreat()
  1925. {
  1926. // if ( gettime() > level.last_threat_debug + 1000 )
  1927. {
  1928. level.last_threat_debug = gettime();
  1929. thread debugThreatCalc();
  1930. }
  1931. }
  1932.  
  1933. debugThreatCalc()
  1934. {
  1935. // debug the threatbias from entities towards the specified ent
  1936. /#
  1937. ai = getaiarray();
  1938. entnum = getdebugdvarint( "debug_threat" );
  1939. entity = undefined;
  1940.  
  1941. // SCRIPTER_MOD
  1942. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  1943. // TODO: This one should be checked for co-op more closely
  1944. players = get_players();
  1945.  
  1946. if ( entnum == 0 )
  1947. {
  1948. entity = players[ 0 ];
  1949. }
  1950. else
  1951. {
  1952. for ( i=0; i < ai.size; i++ )
  1953. {
  1954. if ( entnum != ai[ i ] getentnum() )
  1955. continue;
  1956. entity = ai[ i ];
  1957. break;
  1958. }
  1959. }
  1960.  
  1961. if ( !isalive( entity ) )
  1962. return;
  1963.  
  1964. entityGroup = entity getthreatbiasgroup();
  1965. array_thread( ai, ::displayThreat, entity, entityGroup );
  1966. players[ 0 ] thread displayThreat( entity, entityGroup );
  1967. #/
  1968. }
  1969.  
  1970. displayThreat( entity, entityGroup )
  1971. {
  1972. self endon( "death" );
  1973.  
  1974. if ( self.team == entity.team )
  1975. {
  1976. return;
  1977. }
  1978.  
  1979. selfthreat = 0;
  1980. selfthreat+= self.threatBias;
  1981.  
  1982. threat = 0;
  1983. threat+= entity.threatBias;
  1984. myGroup = undefined;
  1985.  
  1986. if ( IsDefined( entityGroup ) )
  1987. {
  1988. myGroup = self getthreatbiasgroup();
  1989. if ( IsDefined( myGroup ) )
  1990. {
  1991. threat += getthreatbias( entityGroup, myGroup );
  1992. selfThreat += getthreatbias( myGroup, entityGroup );
  1993. }
  1994. }
  1995.  
  1996. if ( entity.ignoreme || threat < -900000 )
  1997. {
  1998. threat = "Ignore";
  1999. }
  2000.  
  2001. if ( self.ignoreme || selfthreat < -900000 )
  2002. {
  2003. selfthreat = "Ignore";
  2004. }
  2005.  
  2006. // SCRIPTER_MOD
  2007. // JesseS ( 3/20/2007 ): level.player changed to players[ 0 ]
  2008. // TODO: This one should be checked for co-op more closely
  2009. players = get_players();
  2010.  
  2011. timer = 1*20;
  2012. col =( 1, 0.5, 0.2 );
  2013. col2 =( 0.2, 0.5, 1 );
  2014. pacifist = self != players[ 0 ] && self.pacifist;
  2015.  
  2016. for ( i=0; i <= timer; i++ )
  2017. {
  2018. print3d( self.origin +( 0, 0, 65 ), "Him to Me:", col, 3 );
  2019. print3d( self.origin +( 0, 0, 50 ), threat, col, 5 );
  2020. if ( IsDefined( entityGroup ) )
  2021. {
  2022. print3d( self.origin +( 0, 0, 35 ), entityGroup, col, 2 );
  2023. }
  2024.  
  2025. print3d( self.origin +( 0, 0, 15 ), "Me to Him:", col2, 3 );
  2026. print3d( self.origin +( 0, 0, 0 ), selfThreat, col2, 5 );
  2027. if ( IsDefined( mygroup ) )
  2028. {
  2029. print3d( self.origin +( 0, 0, -15 ), mygroup, col2, 2 );
  2030. }
  2031.  
  2032. if ( pacifist )
  2033. {
  2034. print3d( self.origin +( 0, 0, 25 ), "( Pacifist )", col2, 5 );
  2035. }
  2036.  
  2037. wait( 0.05 );
  2038. }
  2039. }
  2040.  
  2041. debugColorFriendlies()
  2042. {
  2043. level.debug_color_friendlies = [];
  2044. level.debug_color_huds = [];
  2045.  
  2046. for ( ;; )
  2047. {
  2048. level waittill( "updated_color_friendlies" );
  2049. draw_color_friendlies();
  2050. }
  2051. }
  2052.  
  2053. draw_color_friendlies()
  2054. {
  2055. level endon( "updated_color_friendlies" );
  2056. keys = getarraykeys( level.debug_color_friendlies );
  2057.  
  2058. colored_friendlies = [];
  2059. colors = [];
  2060. colors[ colors.size ] = "r";
  2061. colors[ colors.size ] = "o";
  2062. colors[ colors.size ] = "y";
  2063. colors[ colors.size ] = "g";
  2064. colors[ colors.size ] = "c";
  2065. colors[ colors.size ] = "b";
  2066. colors[ colors.size ] = "p";
  2067.  
  2068. rgb = get_script_palette();
  2069.  
  2070.  
  2071. for ( i=0; i < colors.size; i++ )
  2072. {
  2073. colored_friendlies[ colors[ i ] ] = 0;
  2074. }
  2075.  
  2076. for ( i=0; i < keys.size; i++ )
  2077. {
  2078. color = level.debug_color_friendlies[ keys[ i ] ];
  2079. colored_friendlies[ color ]++;
  2080. }
  2081.  
  2082. for ( i=0; i < level.debug_color_huds.size; i++ )
  2083. {
  2084. level.debug_color_huds[ i ] destroy();
  2085. }
  2086. level.debug_color_huds = [];
  2087.  
  2088. /#
  2089. if ( getdebugdvar( "debug_colorfriendlies" ) != "on" )
  2090. return;
  2091. #/
  2092.  
  2093. x = 15;
  2094. y = 365;
  2095. offset_x = 25;
  2096. offset_y = 25;
  2097. for ( i=0; i < colors.size; i++ )
  2098. {
  2099. if ( colored_friendlies[ colors[ i ] ] <= 0 )
  2100. continue;
  2101. for ( p=0; p < colored_friendlies[ colors[ i ] ]; p++ )
  2102. {
  2103. overlay = newHudElem();
  2104. overlay.x = x + 25*p;
  2105. overlay.y = y;
  2106. overlay setshader( "white", 16, 16 );
  2107. overlay.alignX = "left";
  2108. overlay.alignY = "bottom";
  2109. overlay.alpha = 1;
  2110. overlay.color = rgb[ colors[ i ] ];
  2111. level.debug_color_huds[ level.debug_color_huds.size ] = overlay;
  2112. }
  2113.  
  2114. y += offset_y;
  2115. }
  2116. }
  2117.  
  2118. playerNode()
  2119. {
  2120. for ( ;; )
  2121. {
  2122. players = get_players();
  2123. if ( IsDefined( players[ 0 ].node ) )
  2124. print3d( players[ 0 ].node.origin +( 0, 0, 25 ), "P-Node", ( 0.3, 1, 1 ), 1 );
  2125.  
  2126. wait( 0.05 );
  2127. }
  2128. }
  2129.  
  2130.  
  2131. drawUsers()
  2132. {
  2133. if ( isalive( self.color_user ) )
  2134. {
  2135. line( self.origin +( 0, 0, 35 ), self.color_user.origin +( 0, 0, 35 ), ( 1, 1, 1 ), 1.0 );
  2136.  
  2137. print3d( self.origin +( 0, 0, -25 ), "in-use", ( 1, 1, 1 ), 1, 1 );
  2138. }
  2139. }
  2140.  
  2141.  
  2142. debuggoalpos()
  2143. {
  2144. for ( ;; )
  2145. {
  2146. ai = getaiarray();
  2147. array_thread( ai, ::view_goal_pos );
  2148. wait( 0.05 );
  2149. }
  2150. }
  2151.  
  2152. view_goal_pos()
  2153. {
  2154. if ( !IsDefined( self.goalpos ) )
  2155. return;
  2156.  
  2157. line( self.origin +( 0, 0, 35 ), self.goalpos +( 0, 0, 35 ), ( 1, 1, 1 ), 1.0 );
  2158. }
  2159.  
  2160. colordebug()
  2161. {
  2162. wait( 0.5 );
  2163. col = [];
  2164. col[ col.size ] = "r";
  2165. col[ col.size ] = "g";
  2166. col[ col.size ] = "b";
  2167. col[ col.size ] = "y";
  2168. col[ col.size ] = "o";
  2169. col[ col.size ] = "p";
  2170. col[ col.size ] = "c";
  2171.  
  2172. for ( ;; )
  2173. {
  2174. for ( i=0; i < col.size; i++ )
  2175. {
  2176. color = level.currentColorForced[ "allies" ][ col[ i ] ];
  2177. if ( IsDefined( color ) )
  2178. draw_colored_nodes( color );
  2179. }
  2180. wait( 0.05 );
  2181. }
  2182. }
  2183.  
  2184. draw_colored_nodes( color )
  2185. {
  2186. nodes = level.arrays_of_colorCoded_nodes[ "allies" ][ color ];
  2187. array_thread( nodes, ::drawUsers );
  2188. }
  2189.  
  2190. init_animSounds()
  2191. {
  2192. level.animSounds = [];
  2193. level.animSound_aliases = [];
  2194. waittillframeend; // now we know _load has run and the level.scr_notetracks have been defined
  2195. waittillframeend; // wait one extra frameend because _audio.gso files waittillframeend and we have to start after them
  2196.  
  2197. animnames = getarraykeys( level.scr_notetrack );
  2198. for ( i=0; i < animnames.size; i++ )
  2199. {
  2200. init_notetracks_for_animname( animnames[ i ] );
  2201. }
  2202.  
  2203. animnames = getarraykeys( level.scr_animSound );
  2204. for ( i=0; i < animnames.size; i++ )
  2205. {
  2206. init_animSounds_for_animname( animnames[ i ] );
  2207. }
  2208. }
  2209.  
  2210. init_notetracks_for_animname( animname )
  2211. {
  2212. // copy all the scr_notetracks into animsound_aliases so they show up properly
  2213. notetracks = getarraykeys( level.scr_notetrack[ animname ] );
  2214.  
  2215. for ( i=0; i < notetracks.size; i++ )
  2216. {
  2217. soundalias = level.scr_notetrack[ animname ][ i ][ "sound" ];
  2218. if ( !IsDefined( soundalias ) )
  2219. continue;
  2220.  
  2221. anime = level.scr_notetrack[ animname ][ i ][ "anime" ];
  2222. notetrack = level.scr_notetrack[ animname ][ i ][ "notetrack" ];
  2223. level.animSound_aliases[ animname ][ anime ][ notetrack ][ "soundalias" ] = soundalias;
  2224. if ( IsDefined( level.scr_notetrack[ animname ][ i ][ "created_by_animSound" ] ) )
  2225. {
  2226. level.animSound_aliases[ animname ][ anime ][ notetrack ][ "created_by_animSound" ] = true;
  2227. }
  2228. }
  2229. }
  2230.  
  2231. init_animSounds_for_animname( animname )
  2232. {
  2233. // copy all the scr_animSounds into animsound_aliases so they show up properly
  2234. animes = getarraykeys( level.scr_animSound[ animname ] );
  2235.  
  2236. for ( i=0; i < animes.size; i++ )
  2237. {
  2238. anime = animes[ i ];
  2239. soundalias = level.scr_animSound[ animname ][ anime ];
  2240. level.animSound_aliases[ animname ][ anime ][ "#" + anime ][ "soundalias" ] = soundalias;
  2241. level.animSound_aliases[ animname ][ anime ][ "#" + anime ][ "created_by_animSound" ] = true;
  2242. }
  2243. }
  2244.  
  2245. add_hud_line( x, y, msg )
  2246. {
  2247. hudelm = newHudElem();
  2248. hudelm.alignX = "left";
  2249. hudelm.alignY = "middle";
  2250. hudelm.x = x;
  2251. hudelm.y = y;
  2252. hudelm.alpha = 1;
  2253. hudelm.fontScale = 1;
  2254. hudelm.label = msg;
  2255. level.animsound_hud_extralines[ level.animsound_hud_extralines.size ] = hudelm;
  2256. return hudelm;
  2257. }
  2258.  
  2259. debug_animSound()
  2260. {
  2261. /#
  2262. enabled = getdebugdvar( "animsound" ) == "on";
  2263. if ( !IsDefined( level.animsound_hud ) )
  2264. {
  2265. if ( !enabled )
  2266. return;
  2267.  
  2268. // init the related variables
  2269. level.animsound_selected = 0;
  2270. level.animsound_input = "none";
  2271. level.animsound_hud = [];
  2272. level.animsound_hud_timer = [];
  2273. level.animsound_hud_alias = [];
  2274. level.animsound_hud_extralines = [];
  2275.  
  2276. level.animsound_locked = false;
  2277. level.animsound_locked_pressed = false;
  2278.  
  2279. level.animsound_hud_animname = add_hud_line( -30, 180, "Actor: " );
  2280. level.animsound_hud_anime = add_hud_line( 100, 180, "Anim: " );
  2281.  
  2282. add_hud_line( 10, 190, "Notetrack or label" );
  2283. add_hud_line( -30, 190, "Elapsed" );
  2284. add_hud_line( -30, 160, "Del: Delete selected soundalias" );
  2285. add_hud_line( -30, 150, "F12: Lock selection" );
  2286. add_hud_line( -30, 140, "Add a soundalias with /tag alias or /tag# alias" );
  2287.  
  2288. level.animsound_hud_locked = add_hud_line( -30, 170, "*LOCKED*" );
  2289. level.animsound_hud_locked.alpha = 0;
  2290.  
  2291. for ( i=0; i < level.animsound_hudlimit; i++ )
  2292. {
  2293. hudelm = newHudElem();
  2294. hudelm.alignX = "left";
  2295. hudelm.alignY = "middle";
  2296. hudelm.x = 10;
  2297. hudelm.y = 200 + i*10;
  2298. hudelm.alpha = 1;
  2299. hudelm.fontScale = 1;
  2300. hudelm.label = "";
  2301. level.animsound_hud[ level.animsound_hud.size ] = hudelm;
  2302.  
  2303. hudelm = newHudElem();
  2304. hudelm.alignX = "right";
  2305. hudelm.alignY = "middle";
  2306. hudelm.x = -10;
  2307. hudelm.y = 200 + i*10;
  2308. hudelm.alpha = 1;
  2309. hudelm.fontScale = 1;
  2310. hudelm.label = "";
  2311. level.animsound_hud_timer[ level.animsound_hud_timer.size ] = hudelm;
  2312.  
  2313. hudelm = newHudElem();
  2314. hudelm.alignX = "right";
  2315. hudelm.alignY = "middle";
  2316. hudelm.x = 210;
  2317. hudelm.y = 200 + i*10;
  2318. hudelm.alpha = 1;
  2319. hudelm.fontScale = 1;
  2320. hudelm.label = "";
  2321. level.animsound_hud_alias[ level.animsound_hud_alias.size ] = hudelm;
  2322. }
  2323.  
  2324. // selected is yellow
  2325. level.animsound_hud[ 0 ].color =( 1, 1, 0 );
  2326. level.animsound_hud_timer[ 0 ].color =( 1, 1, 0 );
  2327. }
  2328. else
  2329. if ( !enabled )
  2330. {
  2331. // animsound got turned off so delete the hud stuff
  2332. for ( i=0; i < level.animsound_hudlimit; i++ )
  2333. {
  2334. level.animsound_hud[ i ] destroy();
  2335. level.animsound_hud_timer[ i ] destroy();
  2336. level.animsound_hud_alias[ i ] destroy();
  2337. }
  2338.  
  2339. for ( i=0; i < level.animsound_hud_extralines.size; i++ )
  2340. {
  2341. level.animsound_hud_extralines[ i ] destroy();
  2342. }
  2343.  
  2344. level.animsound_hud = undefined;
  2345. level.animsound_hud_timer = undefined;
  2346. level.animsound_hud_alias = undefined;
  2347. level.animsound_hud_extralines = undefined;
  2348. level.animSounds = undefined;
  2349. return;
  2350. }
  2351.  
  2352. if ( !IsDefined( level.animsound_tagged ) )
  2353. level.animsound_locked = false;
  2354.  
  2355. if ( level.animsound_locked )
  2356. level.animsound_hud_locked.alpha = 1;
  2357. else
  2358. level.animsound_hud_locked.alpha = 0;
  2359.  
  2360. if ( !IsDefined( level.animSounds ) )
  2361. init_animSounds();
  2362.  
  2363. level.animSounds_thisframe = [];
  2364. level.animSounds = remove_undefined_from_array( level.animSounds );
  2365. array_thread( level.animSounds, ::display_animSound );
  2366.  
  2367. players = get_players();
  2368.  
  2369. if ( level.animsound_locked )
  2370. {
  2371. for ( i=0; i < level.animSounds_thisframe.size; i++ )
  2372. {
  2373. animSound = level.animSounds_thisframe[ i ];
  2374. animSound.animsound_color =( 0.5, 0.5, 0.5 );
  2375. }
  2376. }
  2377. else if ( players.size > 0 )
  2378. {
  2379. dot = 0.85;
  2380.  
  2381. forward = anglestoforward( players[ 0 ] getplayerangles() );
  2382. for ( i=0; i < level.animSounds_thisframe.size; i++ )
  2383. {
  2384. animSound = level.animSounds_thisframe[ i ];
  2385. animSound.animsound_color =( 0.25, 1.0, 0.5 );
  2386.  
  2387. difference = vectornormalize( ( animSound.origin +( 0, 0, 40 ) ) -( players[ 0 ].origin +( 0, 0, 55 ) ) );
  2388. newdot = vectordot( forward, difference );
  2389. if ( newdot < dot )
  2390. continue;
  2391.  
  2392. dot = newdot;
  2393. level.animsound_tagged = animSound;
  2394. }
  2395. }
  2396.  
  2397. if ( IsDefined( level.animsound_tagged ) )
  2398. {
  2399. level.animsound_tagged.animsound_color =( 1.0, 1.0, 0.0 );
  2400. }
  2401.  
  2402. is_tagged = IsDefined( level.animsound_tagged );
  2403. for ( i=0; i < level.animSounds_thisframe.size; i++ )
  2404. {
  2405. animSound = level.animSounds_thisframe[ i ];
  2406. scale = 1;
  2407.  
  2408. msg = "*";
  2409. if ( level.animsound_locked )
  2410. msg = "*LOCK";
  2411. print3d( animSound.origin +( 0, 0, 40 ), msg + animSound.animsounds.size, animSound.animsound_color, 1, scale );
  2412. }
  2413.  
  2414. if ( is_tagged )
  2415. {
  2416. draw_animsounds_in_hud();
  2417. }
  2418. #/
  2419. }
  2420.  
  2421. draw_animsounds_in_hud()
  2422. {
  2423. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  2424. /#
  2425. if ( getdebugdvar( "replay_debug" ) == "1" )
  2426. PrintLn( "File: _debug.gsc. Function: draw_animsounds_in_hud()\n" );
  2427. #/
  2428.  
  2429. guy = level.animsound_tagged;
  2430. animsounds = guy.animSounds;
  2431.  
  2432. animname = "generic";
  2433. if ( IsDefined( guy.animname ) )
  2434. animname = guy.animname;
  2435. level.animsound_hud_animname.label = "Actor: " + animname;
  2436.  
  2437. players = get_players();
  2438. if ( players[ 0 ] buttonPressed( "f12" ) )
  2439. {
  2440. if ( !level.animsound_locked_pressed )
  2441. {
  2442. level.animsound_locked = !level.animsound_locked;
  2443. level.animsound_locked_pressed = true;
  2444. }
  2445. }
  2446. else
  2447. {
  2448. level.animsound_locked_pressed = false;
  2449. }
  2450.  
  2451. if ( players[ 0 ] buttonPressed( "UPARROW" ) )
  2452. {
  2453. if ( level.animsound_input != "up" )
  2454. {
  2455. level.animsound_selected--;
  2456. }
  2457.  
  2458. level.animsound_input = "up";
  2459. }
  2460. else
  2461. if ( players[ 0 ] buttonPressed( "DOWNARROW" ) )
  2462. {
  2463. if ( level.animsound_input != "down" )
  2464. {
  2465. level.animsound_selected++;
  2466. }
  2467.  
  2468. level.animsound_input = "down";
  2469. }
  2470. else
  2471. level.animsound_input = "none";
  2472.  
  2473. // clear out the hudelems
  2474. for ( i=0; i < level.animsound_hudlimit; i++ )
  2475. {
  2476. hudelm = level.animsound_hud[ i ];
  2477. hudelm.label = "";
  2478. hudelm.color =( 1, 1, 1 );
  2479. hudelm = level.animsound_hud_timer[ i ];
  2480. hudelm.label = "";
  2481. hudelm.color =( 1, 1, 1 );
  2482. hudelm = level.animsound_hud_alias[ i ];
  2483. hudelm.label = "";
  2484. hudelm.color =( 1, 1, 1 );
  2485. }
  2486.  
  2487. // get the highest existing animsound on the guy
  2488. keys = getarraykeys( animsounds );
  2489. highest = -1;
  2490. for ( i=0; i < keys.size; i++ )
  2491. {
  2492. if ( keys[ i ] > highest )
  2493. highest = keys[ i ];
  2494. }
  2495. if ( highest == -1 )
  2496. return;
  2497.  
  2498. if ( level.animsound_selected > highest )
  2499. level.animsound_selected = highest;
  2500. if ( level.animsound_selected < 0 )
  2501. level.animsound_selected = 0;
  2502.  
  2503. // make sure the selected one exists
  2504. for ( ;; )
  2505. {
  2506. if ( IsDefined( animsounds[ level.animsound_selected ] ) )
  2507. break;
  2508.  
  2509. level.animsound_selected--;
  2510. if ( level.animsound_selected < 0 )
  2511. level.animsound_selected = highest;
  2512. }
  2513.  
  2514. level.animsound_hud_anime.label = "Anim: " + animsounds[ level.animsound_selected ].anime;
  2515.  
  2516. level.animsound_hud[ level.animsound_selected ].color =( 1, 1, 0 );
  2517. level.animsound_hud_timer[ level.animsound_selected ].color =( 1, 1, 0 );
  2518. level.animsound_hud_alias[ level.animsound_selected ].color =( 1, 1, 0 );
  2519.  
  2520. time = gettime();
  2521. for ( i=0; i < keys.size; i++ )
  2522. {
  2523. key = keys[ i ];
  2524. animsound = animsounds[ key ];
  2525. hudelm = level.animsound_hud[ key ];
  2526. soundalias = get_alias_from_stored( animSound );
  2527. hudelm.label =( key + 1 ) + ". " + animsound.notetrack;
  2528.  
  2529. hudelm = level.animsound_hud_timer[ key ];
  2530. hudelm.label = int( ( time -( animsound.end_time - 60000 ) ) * 0.001 );
  2531.  
  2532. if ( IsDefined( soundalias ) )
  2533. {
  2534. hudelm = level.animsound_hud_alias[ key ];
  2535. hudelm.label = soundalias;
  2536. if ( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) )
  2537. {
  2538. hudelm.color =( 0.7, 0.7, 0.7 );
  2539. }
  2540. }
  2541. }
  2542.  
  2543. players = get_players();
  2544. if ( players[ 0 ] buttonPressed( "del" ) )
  2545. {
  2546. // delete a sound on a guy
  2547. animsound = animsounds[ level.animsound_selected ];
  2548. soundalias = get_alias_from_stored( animsound );
  2549. if ( !IsDefined( soundalias ) )
  2550. return;
  2551.  
  2552. if ( !is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) )
  2553. return;
  2554.  
  2555. level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] = undefined;
  2556. debug_animSoundSave();
  2557. }
  2558.  
  2559. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  2560. /#
  2561. if ( getdebugdvar( "replay_debug" ) == "1" )
  2562. PrintLn( "File: _debug.gsc. Function: draw_animsounds_in_hud() - COMPLETE\n" );
  2563. #/
  2564. }
  2565.  
  2566. get_alias_from_stored( animSound )
  2567. {
  2568. if ( !IsDefined( level.animSound_aliases[ animSound.animname ] ) )
  2569. return;
  2570.  
  2571. if ( !IsDefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ] ) )
  2572. return;
  2573.  
  2574. if ( !IsDefined( level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ] ) )
  2575. return;
  2576. return level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ];
  2577. }
  2578.  
  2579. is_from_animsound( animname, anime, notetrack )
  2580. {
  2581. return IsDefined( level.animSound_aliases[ animname ][ anime ][ notetrack ][ "created_by_animSound" ] );
  2582. }
  2583.  
  2584. display_animSound()
  2585. {
  2586. players = get_players();
  2587. if ( distance( players[ 0 ].origin, self.origin ) > 1500 )
  2588. return;
  2589.  
  2590. level.animSounds_thisframe[ level.animSounds_thisframe.size ] = self;
  2591. }
  2592.  
  2593. debug_animSoundTag( tagnum )
  2594. {
  2595. /#
  2596. tag = getdvar( "tag" + tagnum );
  2597. if ( tag == "" )
  2598. {
  2599. iPrintLnbold( "Enter the soundalias with /tag# aliasname" );
  2600. return;
  2601. }
  2602.  
  2603. tag_sound( tag, tagnum - 1 );
  2604.  
  2605. setdvar( "tag" + tagnum, "" );
  2606. #/
  2607. }
  2608.  
  2609. debug_animSoundTagSelected()
  2610. {
  2611. /#
  2612. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  2613. if ( getdebugdvar( "replay_debug" ) == "1" )
  2614. PrintLn( "File: _debug.gsc. Function: debug_animSoundTagSelected()\n" );
  2615.  
  2616. tag = getdvar( "tag" );
  2617. if ( tag == "" )
  2618. {
  2619. iPrintLnbold( "Enter the soundalias with /tag aliasname" );
  2620.  
  2621. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  2622. if ( getdebugdvar( "replay_debug" ) == "1" )
  2623. PrintLn( "File: _debug.gsc. Function: debug_animSoundTagSelected() - COMPLETE EARLY\n" );
  2624. return;
  2625. }
  2626.  
  2627. tag_sound( tag, level.animsound_selected );
  2628.  
  2629. setdvar( "tag", "" );
  2630.  
  2631. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  2632. if ( getdebugdvar( "replay_debug" ) == "1" )
  2633. PrintLn( "File: _debug.gsc. Function: debug_animSoundTagSelected() - COMPLETE\n" );
  2634. #/
  2635. }
  2636.  
  2637. tag_sound( tag, tagnum )
  2638. {
  2639. if ( !IsDefined( level.animsound_tagged ) )
  2640. return;
  2641. if ( !IsDefined( level.animsound_tagged.animsounds[ tagnum ] ) )
  2642. return;
  2643.  
  2644. animSound = level.animsound_tagged.animsounds[ tagnum ];
  2645. // store the alias to the array of aliases
  2646. soundalias = get_alias_from_stored( animSound );
  2647. if ( !IsDefined( soundalias ) || is_from_animsound( animSound.animname, animSound.anime, animSound.notetrack ) )
  2648. {
  2649. level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "soundalias" ] = tag;
  2650. level.animSound_aliases[ animSound.animname ][ animSound.anime ][ animSound.notetrack ][ "created_by_animSound" ] = true;
  2651. debug_animSoundSave();
  2652. }
  2653. }
  2654.  
  2655. debug_animSoundSave()
  2656. {
  2657. /#
  2658. filename = "createfx/" + level.script + "_audio.gsc";
  2659. file = openfile( filename, "write" );
  2660. if ( file == -1 )
  2661. {
  2662. iPrintLnbold( "Couldn't write to " + filename + ", make sure it is open for edit." );
  2663. return;
  2664. }
  2665.  
  2666. iPrintLnbold( "Saved to " + filename );
  2667. print_aliases_to_file( file );
  2668. saved = closefile( file );
  2669. setdvar( "animsound_save", "" );
  2670. #/
  2671. }
  2672.  
  2673. print_aliases_to_file( file )
  2674. {
  2675. tab = " ";
  2676. fPrintLn( file, "#include maps\\_anim;" );
  2677. fPrintLn( file, "main()" );
  2678. fPrintLn( file, "{" );
  2679. fPrintLn( file, tab + "// Autogenerated by AnimSounds. Threaded off so that it can be placed before _load( has to create level.scr_notetrack first )." );
  2680. fPrintLn( file, tab + "thread init_animsounds();" );
  2681. fPrintLn( file, "}" );
  2682. fPrintLn( file, "" );
  2683. fPrintLn( file, "init_animsounds()" );
  2684. fPrintLn( file, "{" );
  2685. fPrintLn( file, tab + "waittillframeend;" );
  2686.  
  2687. animnames = getarraykeys( level.animSound_aliases );
  2688. for ( i=0; i < animnames.size; i++ )
  2689. {
  2690. animes = getarraykeys( level.animSound_aliases[ animnames[ i ] ] );
  2691. for ( p=0; p < animes.size; p++ )
  2692. {
  2693. anime = animes[ p ];
  2694. notetracks = getarraykeys( level.animSound_aliases[ animnames[ i ] ][ anime ] );
  2695. for ( z=0; z < notetracks.size; z++ )
  2696. {
  2697. notetrack = notetracks[ z ];
  2698. if ( !is_from_animsound( animnames[ i ], anime, notetrack ) )
  2699. continue;
  2700.  
  2701. alias = level.animSound_aliases[ animnames[ i ] ][ anime ][ notetrack ][ "soundalias" ];
  2702.  
  2703. if ( notetrack == "#" + anime )
  2704. {
  2705. // this isn't really a notetrack, its from the _anim call.
  2706. fPrintLn( file, tab + "addOnStart_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( alias ) + " ); " );
  2707. }
  2708. else
  2709. {
  2710. // this is attached to a notetrack
  2711. fPrintLn( file, tab + "addNotetrack_animSound( " + tostr( animnames[ i ] ) + ", " + tostr( anime ) + ", " + tostr( notetrack ) + ", " + tostr( alias ) + " ); " );
  2712. }
  2713. PrintLn( "^1Saved alias ^4" + alias + "^1 to notetrack ^4" + notetrack );
  2714. }
  2715. }
  2716. }
  2717. fPrintLn( file, "}" );
  2718. }
  2719.  
  2720. tostr( str )
  2721. {
  2722. newstr = "\"";
  2723. for ( i=0; i < str.size; i++ )
  2724. {
  2725. if ( str[ i ] == "\"" )
  2726. {
  2727. newstr += "\\";
  2728. newstr += "\"";
  2729. continue;
  2730. }
  2731.  
  2732. newstr += str[ i ];
  2733. }
  2734. newstr += "\"";
  2735. return newstr;
  2736. }
  2737. linedraw( start, end, color, timer )
  2738. {
  2739. if ( !IsDefined( color ) )
  2740. color = ( 1,1,1 );
  2741.  
  2742. if ( IsDefined( timer ) )
  2743. {
  2744. timer *= 20;
  2745. for ( i = 0; i < timer; i++ )
  2746. {
  2747. line( start, end, color );
  2748. wait( 0.05 );
  2749. }
  2750. }
  2751. else
  2752. {
  2753. for ( ;; )
  2754. {
  2755. line( start, end, color );
  2756. wait( 0.05 );
  2757. }
  2758. }
  2759. }
  2760.  
  2761. print3ddraw( org, text, color )
  2762. {
  2763. for ( ;; )
  2764. {
  2765. print3d( org, text, color );
  2766. wait( 0.05 );
  2767. }
  2768. }
  2769.  
  2770. complete_me()
  2771. {
  2772. if ( getdvar( "credits_active" ) == "1" )
  2773. {
  2774. wait 7;
  2775. setdvar( "credits_active", "0" );
  2776. maps\_endmission::credits_end();
  2777. return;
  2778. }
  2779. wait 7;
  2780. nextmission();
  2781. }
  2782.  
  2783.  
  2784. debug_bayonet()
  2785. {
  2786. /*
  2787. x = 0;
  2788. y = 20;
  2789. menu_name = "bayonet_menu";
  2790.  
  2791. menu_bkg = new_hud( menu_name, undefined, x, y, 1 );
  2792. menu_bkg SetShader( "white", 220, 100 );
  2793. menu_bkg.alignX = "left";
  2794. menu_bkg.alignY = "top";
  2795. menu_bkg.sort = 10;
  2796. menu_bkg.alpha = 0.6;
  2797. menu_bkg.color = ( 0.0, 0.0, 0.5 );
  2798.  
  2799. menu[ 0 ] = new_hud( menu_name, "Weapon Name:", x + 5, y + 10, 1 );
  2800. menu[ 1 ] = new_hud( menu_name, "Bayonet Weapon:", x + 5, y + 20, 1 );
  2801. menu[ 2 ] = new_hud( menu_name, "Melee Time:", x + 5, y + 30, 1 );
  2802. menu[ 3 ] = new_hud( menu_name, "Melee Anim:", x + 5, y + 40, 1 );
  2803. menu[ 4 ] = new_hud( menu_name, "Charge Time:", x + 5, y + 50, 1 );
  2804. menu[ 5 ] = new_hud( menu_name, "Charge Anim:", x + 5, y + 60, 1 );
  2805. menu[ 6 ] = new_hud( menu_name, "Bayonet Damage:", x + 5, y + 70, 1 );
  2806. menu[ 7 ] = new_hud( menu_name, "Melee Range", x + 5, y + 80, 1 );
  2807. menu[ 8 ] = new_hud( menu_name, "Aim Assist Range:", x + 5, y + 90, 1 );
  2808.  
  2809. thread debug_bayonet_think( menu_name, menu_bkg, menu, x, y );
  2810. */
  2811. }
  2812.  
  2813. debug_bayonet_think( menu_name, menu_bkg, menu, x, y )
  2814. {
  2815. x_offset = 90;
  2816.  
  2817. // enum
  2818. menu_weapon_name = menu.size;
  2819. menu_bayonet_weapon = menu.size + 1;
  2820. menu_bayonet_melee_time = menu.size + 2;
  2821. menu_bayonet_melee_anim = menu.size + 3;
  2822. menu_bayonet_charge_time = menu.size + 4;
  2823. menu_bayonet_charge_anim = menu.size + 5;
  2824. menu_bayonet_damage = menu.size + 6;
  2825. menu_bayonet_range = menu.size + 7;
  2826. menu_bayonet_aim_range = menu.size + 8;
  2827.  
  2828. menu[ menu_weapon_name ] = new_hud( menu_name, "", x + x_offset, y + 10, 1 );
  2829. menu[ menu_bayonet_weapon ] = new_hud( menu_name, "", x + x_offset, y + 20, 1 );
  2830. menu[ menu_bayonet_melee_time ] = new_hud( menu_name, "", x + x_offset, y + 30, 1 );
  2831. menu[ menu_bayonet_melee_anim ] = new_hud( menu_name, "", x + x_offset, y + 40, 1 );
  2832. menu[ menu_bayonet_charge_time ] = new_hud( menu_name, "", x + x_offset, y + 50, 1 );
  2833. menu[ menu_bayonet_charge_anim ] = new_hud( menu_name, "", x + x_offset, y + 60, 1 );
  2834. menu[ menu_bayonet_damage ] = new_hud( menu_name, "", x + x_offset, y + 70, 1 );
  2835. menu[ menu_bayonet_range ] = new_hud( menu_name, "", x + x_offset, y + 80, 1 );
  2836. menu[ menu_bayonet_aim_range ] = new_hud( menu_name, "", x + x_offset, y + 90, 1 );
  2837.  
  2838. while ( true )
  2839. {
  2840. if ( getdvar( "debug_bayonet" ) == "0" )
  2841. {
  2842. menu_bkg.alpha = 0;
  2843.  
  2844. for ( i = 0; i < menu.size; i++ )
  2845. menu[ i ].alpha = 0;
  2846. }
  2847. else
  2848. {
  2849. player = get_players()[ 0 ];
  2850.  
  2851. if ( IsDefined( player ) )
  2852. {
  2853. // weapon name
  2854. weapon = player GetCurrentWeapon();
  2855. menu[ menu_weapon_name ] setText( weapon );
  2856.  
  2857. // bayonet weapon
  2858. info_array = weaponbayonetinfo( weapon );
  2859.  
  2860. if ( info_array.size > 0 )
  2861. {
  2862. menu[ menu_bayonet_weapon ] setText( "true" );
  2863. menu[ menu_bayonet_melee_time ] setText( info_array[ 0 ] + " ms" );
  2864. menu[ menu_bayonet_melee_anim ] setText( info_array[ 1 ] );
  2865. menu[ menu_bayonet_charge_time ] setText( info_array[ 2 ] + " ms" );
  2866. menu[ menu_bayonet_charge_anim ] setText( info_array[ 3 ] );
  2867. menu[ menu_bayonet_damage ] setText( info_array[ 4 ] );
  2868. menu[ menu_bayonet_range ] setText( info_array[ 5 ] );
  2869. menu[ menu_bayonet_aim_range ] setText( info_array[ 6 ] );
  2870. }
  2871. else
  2872. {
  2873. menu[ menu_bayonet_weapon ] setText( "false" );
  2874.  
  2875. for ( i = menu_bayonet_melee_time; i < menu.size; i++ )
  2876. menu[ i ] setText( "" );
  2877. }
  2878.  
  2879. menu_bkg.alpha = 0.6;
  2880.  
  2881. for ( i = 0; i < menu.size; i++ )
  2882. menu[ i ].alpha = 1;
  2883. }
  2884. }
  2885.  
  2886. wait( 1 );
  2887. }
  2888. }
  2889.  
  2890. new_hud( hud_name, msg, x, y, scale )
  2891. {
  2892. if ( !IsDefined( level.hud_array ) )
  2893. {
  2894. level.hud_array = [];
  2895. }
  2896.  
  2897. if ( !IsDefined( level.hud_array[ hud_name ] ) )
  2898. {
  2899. level.hud_array[ hud_name ] = [];
  2900. }
  2901.  
  2902. hud = maps\_createmenu::set_hudelem( msg, x, y, scale );
  2903. level.hud_array[ hud_name ][ level.hud_array[ hud_name ].size ] = hud;
  2904. return hud;
  2905. }
  2906.  
  2907. debug_show_viewpos()
  2908. {
  2909. wait_for_first_player();
  2910.  
  2911. hud_title = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  2912. hud_title.x = 10;
  2913. hud_title.y = 300;
  2914. hud_title.alpha = 0;
  2915. hud_title.alignX = "left";
  2916. hud_title.fontscale = 1.2;
  2917. hud_title SetText( &"DEBUG_POSITION" );
  2918.  
  2919. x_pos = hud_title.x + 50;
  2920.  
  2921. hud_x = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  2922. hud_x.x = x_pos;
  2923. hud_x.y = 300;
  2924. hud_x.alpha = 0;
  2925. hud_x.alignX = "left";
  2926. hud_x.fontscale = 1.2;
  2927. hud_x SetValue( 0 );
  2928.  
  2929. hud_y = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  2930. hud_y.x = 10;
  2931. hud_y.y = 300;
  2932. hud_y.alpha = 0;
  2933. hud_y.alignX = "left";
  2934. hud_y.fontscale = 1.2;
  2935. hud_y SetValue( 0 );
  2936.  
  2937. hud_z = NewHudElem(); // SparkyMcSparks ( 5/31/2014 1:07:21 AM ): Changed from Debug to Regular
  2938. hud_z.x = 10;
  2939. hud_z.y = 300;
  2940. hud_z.alpha = 0;
  2941. hud_z.alignX = "left";
  2942. hud_z.fontscale = 1.2;
  2943. hud_z SetValue( 0 );
  2944.  
  2945. SetDvar( "debug_show_viewpos", "0" );
  2946.  
  2947. players = get_players();
  2948. while ( 1 )
  2949. {
  2950. if ( GetDvarInt( "debug_show_viewpos" ) > 0 )
  2951. {
  2952. hud_title.alpha = 1;
  2953. hud_x.alpha = 1;
  2954. hud_y.alpha = 1;
  2955. hud_z.alpha = 1;
  2956.  
  2957. x = players[ 0 ].origin[ 0 ];
  2958. y = players[ 0 ].origin[ 1 ];
  2959. z = players[ 0 ].origin[ 2 ];
  2960.  
  2961. spacing1 = ( ( 2 + number_before_decimal( x ) ) * 8 ) + 10;
  2962. spacing2 = ( ( 2 + number_before_decimal( y ) ) * 8 ) + 10;
  2963.  
  2964. hud_y.x = x_pos + spacing1;
  2965. hud_z.x = x_pos + spacing1 + spacing2;
  2966.  
  2967. hud_x SetValue( round_to( x, 100 ) );
  2968. hud_y SetValue( round_to( y, 100 ) );
  2969. hud_z SetValue( round_to( z, 100 ) );
  2970. }
  2971. else
  2972. {
  2973. hud_title.alpha = 0;
  2974. hud_x.alpha = 0;
  2975. hud_y.alpha = 0;
  2976. hud_z.alpha = 0;
  2977. }
  2978.  
  2979. wait( 0.5 );
  2980. }
  2981. }
  2982.  
  2983. number_before_decimal( num )
  2984. {
  2985. abs_num = abs( num );
  2986. count = 0;
  2987. while ( 1 )
  2988. {
  2989. abs_num *= 0.1; // Really doing num / 10
  2990. count += 1;
  2991.  
  2992. if ( abs_num < 1 )
  2993. {
  2994. return count;
  2995. }
  2996. }
  2997. }
  2998.  
  2999. round_to( val, num )
  3000. {
  3001. return Int( val * num ) / num;
  3002. }
  3003.  
  3004. // MikeD ( 3/11/2008 ): New feature to show where you are at in the level during a playthrough
  3005. set_event_printname( text, focus )
  3006. {
  3007. /#
  3008. level thread set_event_printname_thread( text, focus );
  3009. #/
  3010. }
  3011.  
  3012. clear_event_printname()
  3013. {
  3014. /#
  3015. if ( GetDvarInt( "loc_warnings" ) > 0 )
  3016. {
  3017. return;
  3018. }
  3019.  
  3020. level notify( "stop_event_name_thread" );
  3021.  
  3022. if ( IsDefined( level.event_hudelem ) )
  3023. {
  3024. level.event_hudelem Destroy();
  3025. }
  3026. #/
  3027. }
  3028.  
  3029. set_event_printname_thread( text, focus )
  3030. {
  3031. /#
  3032. level notify( "stop_event_name_thread" );
  3033. level endon( "stop_event_name_thread" );
  3034.  
  3035. // We don't localize these, so don't get out! :P
  3036. if ( GetDvarInt( "loc_warnings" ) > 0 )
  3037. {
  3038. return;
  3039. }
  3040.  
  3041. if ( !IsDefined( focus ) )
  3042. {
  3043. focus = false;
  3044. }
  3045.  
  3046. suffix = "";
  3047. if ( focus )
  3048. {
  3049. suffix = " [ Focus Event ]";
  3050. }
  3051.  
  3052. SetDvar( "cg_zoneName", text );
  3053. text = "Event: " + text + suffix;
  3054.  
  3055. if ( !IsDefined( level.event_hudelem ) )
  3056. {
  3057. hud = NewHudElem();
  3058. hud.horzAlign = "center";
  3059. hud.alignX = "center";
  3060. hud.alignY = "top";
  3061. hud.foreground = 1;
  3062. hud.fontScale = 1.5;
  3063. hud.sort = 50;
  3064. hud.alpha = 1;
  3065. hud.y = 15;
  3066.  
  3067. level.event_hudelem = hud;
  3068. }
  3069.  
  3070. if ( focus )
  3071. {
  3072. level.event_hudelem.color = ( 1, 1, 0 );
  3073. }
  3074. else
  3075. {
  3076. level.event_hudelem.color = ( 1, 1, 1 );
  3077. }
  3078.  
  3079. if ( GetDvar( "debug_draw_event" ) == "" )
  3080. {
  3081. SetDvar( "debug_draw_event", "1" );
  3082. }
  3083.  
  3084. level.event_hudelem SetText( text );
  3085.  
  3086. enabled = true;
  3087. while ( 1 )
  3088. {
  3089. toggle = false;
  3090.  
  3091. if ( GetDvarInt( "debug_draw_event" ) < 1 )
  3092. {
  3093. toggle = true;
  3094. enabled = false;
  3095. }
  3096. else if ( GetDvarInt( "debug_draw_event" ) > 0 )
  3097. {
  3098. toggle = true;
  3099. enabled = true;
  3100. }
  3101.  
  3102. if ( toggle && enabled )
  3103. {
  3104. level.event_hudelem.alpha = 1;
  3105. }
  3106. else if ( toggle )
  3107. {
  3108. level.event_hudelem.alpha = 0;
  3109. }
  3110.  
  3111. wait( 0.5 );
  3112. }
  3113. #/
  3114. }
  3115.  
  3116. // -- SRS 3/19/08: engagement distance debug. only works for P1 --
  3117.  
  3118. get_playerone()
  3119. {
  3120. return get_players()[ 0 ];
  3121. }
  3122.  
  3123. // this controls the engagement distance debug stuff with a dvar
  3124. engagement_distance_debug_toggle()
  3125. {
  3126. /#
  3127. level endon( "kill_engage_dist_debug_toggle_watcher" );
  3128.  
  3129. lastState = GetDebugDvarInt( "debug_engage_dists" );
  3130.  
  3131. while ( 1 )
  3132. {
  3133. currentState = GetDebugDvarInt( "debug_engage_dists" );
  3134.  
  3135. if ( dvar_turned_on( currentState ) && !dvar_turned_on( lastState ) )
  3136. {
  3137. // turn it on
  3138. weapon_engage_dists_init();
  3139. thread debug_realtime_engage_dist();
  3140. thread debug_ai_engage_dist();
  3141.  
  3142. lastState = currentState;
  3143. }
  3144. else if ( !dvar_turned_on( currentState ) && dvar_turned_on( lastState ) )
  3145. {
  3146. // send notify to turn off threads
  3147. level notify( "kill_all_engage_dist_debug" );
  3148.  
  3149. lastState = currentState;
  3150. }
  3151.  
  3152. wait( 0.3 );
  3153. }
  3154. #/
  3155. }
  3156.  
  3157. dvar_turned_on( val )
  3158. {
  3159. if ( val <= 0 )
  3160. {
  3161. return false;
  3162. }
  3163. else
  3164. {
  3165. return true;
  3166. }
  3167. }
  3168.  
  3169. engagement_distance_debug_init()
  3170. {
  3171. // set up debug stuff
  3172. level.debug_xPos = -50;
  3173. level.debug_yPos = 250;
  3174. level.debug_yInc = 18;
  3175.  
  3176. level.debug_fontScale = 1.5;
  3177.  
  3178. level.white = ( 1, 1, 1 );
  3179. level.green = ( 0, 1, 0 );
  3180. level.yellow = ( 1, 1, 0 );
  3181. level.red = ( 1, 0, 0 );
  3182.  
  3183. level.realtimeEngageDist = NewHudElem();
  3184. level.realtimeEngageDist.alignX = "left";
  3185. level.realtimeEngageDist.fontScale = level.debug_fontScale;
  3186. level.realtimeEngageDist.x = level.debug_xPos;
  3187. level.realtimeEngageDist.y = level.debug_yPos;
  3188. level.realtimeEngageDist.color = level.white;
  3189. level.realtimeEngageDist SetText( "Current Engagement Distance: " );
  3190.  
  3191. xPos = level.debug_xPos + 207;
  3192.  
  3193. level.realtimeEngageDist_value = NewHudElem();
  3194. level.realtimeEngageDist_value.alignX = "left";
  3195. level.realtimeEngageDist_value.fontScale = level.debug_fontScale;
  3196. level.realtimeEngageDist_value.x = xPos;
  3197. level.realtimeEngageDist_value.y = level.debug_yPos;
  3198. level.realtimeEngageDist_value.color = level.white;
  3199. level.realtimeEngageDist_value SetValue( 0 );
  3200.  
  3201. xPos += 37;
  3202.  
  3203. level.realtimeEngageDist_middle = NewHudElem();
  3204. level.realtimeEngageDist_middle.alignX = "left";
  3205. level.realtimeEngageDist_middle.fontScale = level.debug_fontScale;
  3206. level.realtimeEngageDist_middle.x = xPos;
  3207. level.realtimeEngageDist_middle.y = level.debug_yPos;
  3208. level.realtimeEngageDist_middle.color = level.white;
  3209. level.realtimeEngageDist_middle SetText( " units, SHORT/LONG by " );
  3210.  
  3211. xPos += 105;
  3212.  
  3213. level.realtimeEngageDist_offvalue = NewHudElem();
  3214. level.realtimeEngageDist_offvalue.alignX = "left";
  3215. level.realtimeEngageDist_offvalue.fontScale = level.debug_fontScale;
  3216. level.realtimeEngageDist_offvalue.x = xPos;
  3217. level.realtimeEngageDist_offvalue.y = level.debug_yPos;
  3218. level.realtimeEngageDist_offvalue.color = level.white;
  3219. level.realtimeEngageDist_offvalue SetValue( 0 );
  3220.  
  3221. hudObjArray = [];
  3222. hudObjArray[ 0 ] = level.realtimeEngageDist;
  3223. hudObjArray[ 1 ] = level.realtimeEngageDist_value;
  3224. hudObjArray[ 2 ] = level.realtimeEngageDist_middle;
  3225. hudObjArray[ 3 ] = level.realtimeEngageDist_offvalue;
  3226.  
  3227. return hudObjArray;
  3228. }
  3229.  
  3230. engage_dist_debug_hud_destroy( hudArray, killNotify )
  3231. {
  3232. level waittill( killNotify );
  3233.  
  3234. for ( i = 0; i < hudArray.size; i++ )
  3235. {
  3236. hudArray[ i ] Destroy();
  3237. }
  3238. }
  3239.  
  3240. weapon_engage_dists_init()
  3241. {
  3242. level.engageDists = [];
  3243.  
  3244. // first pass ok
  3245. genericPistol = spawnstruct();
  3246. genericPistol.engageDistMin = 125;
  3247. genericPistol.engageDistOptimal = 225;
  3248. genericPistol.engageDistMulligan = 50; // range around the optimal value that is still optimal
  3249. genericPistol.engageDistMax = 400;
  3250.  
  3251. // first pass ok
  3252. shotty = spawnstruct();
  3253. shotty.engageDistMin = 50;
  3254. shotty.engageDistOptimal = 200;
  3255. shotty.engageDistMulligan = 75;
  3256. shotty.engageDistMax = 350;
  3257.  
  3258. // first pass ok
  3259. genericSMG = spawnstruct();
  3260. genericSMG.engageDistMin = 100;
  3261. genericSMG.engageDistOptimal = 275;
  3262. genericSMG.engageDistMulligan = 100;
  3263. genericSMG.engageDistMax = 500;
  3264.  
  3265. // first pass NEED TEST
  3266. genericLMG = spawnstruct();
  3267. genericLMG.engageDistMin = 325;
  3268. genericLMG.engageDistOptimal = 550;
  3269. genericLMG.engageDistMulligan = 150;
  3270. genericLMG.engageDistMax = 850;
  3271.  
  3272. // first pass ok
  3273. genericRifleSA = spawnstruct();
  3274. genericRifleSA.engageDistMin = 325;
  3275. genericRifleSA.engageDistOptimal = 550;
  3276. genericRifleSA.engageDistMulligan = 150;
  3277. genericRifleSA.engageDistMax = 850;
  3278.  
  3279. // first pass ok
  3280. genericRifleBolt = spawnstruct();
  3281. genericRifleBolt.engageDistMin = 350;
  3282. genericRifleBolt.engageDistOptimal = 600;
  3283. genericRifleBolt.engageDistMulligan = 150;
  3284. genericRifleBolt.engageDistMax = 900;
  3285.  
  3286. // first pass NEED TEST
  3287. genericHMG = spawnstruct();
  3288. genericHMG.engageDistMin = 390;
  3289. genericHMG.engageDistOptimal = 600;
  3290. genericHMG.engageDistMulligan = 100;
  3291. genericHMG.engageDistMax = 900;
  3292.  
  3293. // first pass ok
  3294. genericSniper = spawnstruct();
  3295. genericSniper.engageDistMin = 950;
  3296. genericSniper.engageDistOptimal = 1700;
  3297. genericSniper.engageDistMulligan = 300;
  3298. genericSniper.engageDistMax = 3000;
  3299.  
  3300. // Pistols
  3301. engage_dists_add( "colt", genericPistol );
  3302. engage_dists_add( "sw_357", genericPistol );
  3303. engage_dists_add( "nambu", genericPistol );
  3304. engage_dists_add( "tokarev", genericPistol );
  3305. engage_dists_add( "walther", genericPistol );
  3306.  
  3307. // SMGs
  3308. engage_dists_add( "thompson", genericSMG );
  3309. engage_dists_add( "type100_smg", genericSMG );
  3310. engage_dists_add( "ppsh", genericSMG );
  3311. engage_dists_add( "mp40", genericSMG );
  3312. engage_dists_add( "stg44", genericSMG );
  3313. engage_dists_add( "sten", genericSMG );
  3314. engage_dists_add( "sten_silenced", genericSMG );
  3315.  
  3316. // shotgun
  3317. engage_dists_add( "shotgun", shotty );
  3318.  
  3319. // LMGs
  3320. engage_dists_add( "bar", genericLMG );
  3321. engage_dists_add( "bar_bipod", genericLMG );
  3322. engage_dists_add( "type99_lmg", genericLMG );
  3323. engage_dists_add( "type99_lmg_bipod", genericLMG );
  3324. engage_dists_add( "dp28", genericLMG );
  3325. engage_dists_add( "dp28_bipod", genericLMG );
  3326. engage_dists_add( "fg42", genericLMG );
  3327. engage_dists_add( "fg42_bipod", genericLMG );
  3328. engage_dists_add( "bren", genericLMG );
  3329. engage_dists_add( "bren_bipod", genericLMG );
  3330.  
  3331. // Rifles ( semiautomatic )
  3332. engage_dists_add( "m1garand", genericRifleSA );
  3333. engage_dists_add( "m1garand_bayonet", genericRifleSA );
  3334. engage_dists_add( "m1carbine", genericRifleSA );
  3335. engage_dists_add( "m1carbine_bayonet", genericRifleSA );
  3336. engage_dists_add( "svt40", genericRifleSA );
  3337. engage_dists_add( "gewehr43", genericRifleSA );
  3338.  
  3339. // Rifles ( bolt-action )
  3340. engage_dists_add( "springfield", genericRifleBolt );
  3341. engage_dists_add( "springfield_bayonet", genericRifleBolt );
  3342. engage_dists_add( "type99_rifle", genericRifleBolt );
  3343. engage_dists_add( "type99_rifle_bayonet", genericRifleBolt );
  3344. engage_dists_add( "mosin_rifle", genericRifleBolt );
  3345. engage_dists_add( "mosin_rifle_bayonet", genericRifleBolt );
  3346. engage_dists_add( "kar98k", genericRifleBolt );
  3347. engage_dists_add( "kar98k_bayonet", genericRifleBolt );
  3348. engage_dists_add( "lee_enfield", genericRifleBolt );
  3349. engage_dists_add( "lee_enfield_bayonet", genericRifleBolt );
  3350.  
  3351. // HMGs
  3352. engage_dists_add( "30cal", genericHMG );
  3353. engage_dists_add( "30cal_bipod", genericHMG );
  3354. engage_dists_add( "mg42", genericHMG );
  3355. engage_dists_add( "mg42_bipod", genericHMG );
  3356.  
  3357. // Sniper Rifles
  3358. engage_dists_add( "springfield_scoped", genericSniper );
  3359. engage_dists_add( "type99_rifle_scoped", genericSniper );
  3360. engage_dists_add( "mosin_rifle_scoped", genericSniper );
  3361. engage_dists_add( "kar98k_scoped", genericSniper );
  3362. engage_dists_add( "fg42_scoped", genericSniper );
  3363. engage_dists_add( "lee_enfield_scoped", genericSniper );
  3364.  
  3365. // start waiting for weapon changes
  3366. level thread engage_dists_watcher();
  3367. }
  3368.  
  3369. engage_dists_add( weapontypeStr, values )
  3370. {
  3371. level.engageDists[ weapontypeStr ] = values;
  3372. }
  3373.  
  3374. // returns a script_struct, or undefined, if the lookup failed
  3375. get_engage_dists( weapontypeStr )
  3376. {
  3377. if ( IsDefined( level.engageDists[ weapontypeStr ] ) )
  3378. {
  3379. return level.engageDists[ weapontypeStr ];
  3380. }
  3381. else
  3382. {
  3383. return undefined;
  3384. }
  3385. }
  3386.  
  3387. // checks currently equipped weapon to make sure that engagement distance values are correct
  3388. engage_dists_watcher()
  3389. {
  3390. level endon( "kill_all_engage_dist_debug" );
  3391. level endon( "kill_engage_dists_watcher" );
  3392.  
  3393. while ( 1 )
  3394. {
  3395. player = get_playerone();
  3396. playerWeapon = player GetCurrentWeapon();
  3397.  
  3398. if ( !IsDefined( player.lastweapon ) )
  3399. {
  3400. player.lastweapon = playerWeapon;
  3401. }
  3402. else
  3403. {
  3404. if ( player.lastweapon == playerWeapon )
  3405. {
  3406. wait( 0.05 );
  3407. continue;
  3408. }
  3409. }
  3410.  
  3411. values = get_engage_dists( playerWeapon );
  3412.  
  3413. if ( IsDefined( values ) )
  3414. {
  3415. level.weaponEngageDistValues = values;
  3416. }
  3417. else
  3418. {
  3419. level.weaponEngageDistValues = undefined;
  3420. }
  3421.  
  3422. player.lastweapon = playerWeapon;
  3423.  
  3424. wait( 0.05 );
  3425. }
  3426. }
  3427.  
  3428. debug_realtime_engage_dist()
  3429. {
  3430. level endon( "kill_all_engage_dist_debug" );
  3431. level endon( "kill_realtime_engagement_distance_debug" );
  3432.  
  3433. hudObjArray = engagement_distance_debug_init();
  3434. level thread engage_dist_debug_hud_destroy( hudObjArray, "kill_all_engage_dist_debug" );
  3435.  
  3436. level.debugRTEngageDistColor = level.green;
  3437.  
  3438. player = get_playerone();
  3439.  
  3440. while ( 1 )
  3441. {
  3442. lastTracePos = ( 0, 0, 0 );
  3443.  
  3444. // Trace to where the player is looking
  3445. direction = player GetPlayerAngles();
  3446. direction_vec = AnglesToForward( direction );
  3447. eye = player GetEye();
  3448.  
  3449. trace = BulletTrace( eye, eye + vector_multiply( direction_vec, 10000 ), true, player );
  3450. tracePoint = trace[ "position" ];
  3451. traceNormal = trace[ "normal" ];
  3452. traceDist = int( Distance( eye, tracePoint ) ); // just need an int, thanks
  3453.  
  3454. if ( tracePoint != lastTracePos )
  3455. {
  3456. lastTracePos = tracePoint;
  3457.  
  3458. if ( !IsDefined( level.weaponEngageDistValues ) )
  3459. {
  3460. hudobj_changecolor( hudObjArray, level.white );
  3461. hudObjArray engagedist_hud_changetext( "nodata", tracedist );
  3462. }
  3463. else
  3464. {
  3465. // for convenience
  3466. engageDistMin = level.weaponEngageDistValues.engageDistMin;
  3467. engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal;
  3468. engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan;
  3469. engageDistMax = level.weaponEngageDistValues.engageDistMax;
  3470.  
  3471. // if inside our engagement distance range...
  3472. if ( ( traceDist >= engageDistMin ) && ( traceDist <= engageDistMax ) )
  3473. {
  3474. // if in the optimal range...
  3475. if ( ( traceDist >= ( engageDistOptimal - engageDistMulligan ) )
  3476. && ( traceDist <= ( engageDistOptimal + engageDistMulligan ) ) )
  3477. {
  3478. hudObjArray engagedist_hud_changetext( "optimal", tracedist );
  3479. hudobj_changecolor( hudObjArray, level.green );
  3480. }
  3481. else
  3482. {
  3483. hudObjArray engagedist_hud_changetext( "ok", tracedist );
  3484. hudobj_changecolor( hudObjArray, level.yellow );
  3485. }
  3486. }
  3487. else if ( traceDist < engageDistMin )
  3488. {
  3489. hudobj_changecolor( hudObjArray, level.red );
  3490. hudObjArray engagedist_hud_changetext( "short", tracedist );
  3491. }
  3492. else if ( traceDist > engageDistMax )
  3493. {
  3494. hudobj_changecolor( hudObjArray, level.red );
  3495. hudObjArray engagedist_hud_changetext( "long", tracedist );
  3496. }
  3497. }
  3498. }
  3499.  
  3500. // draw our trace spot
  3501. // plot_circle_fortime( radius1,radius2,time,color,origin,normal )
  3502. thread plot_circle_fortime( 1, 5, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal );
  3503. thread plot_circle_fortime( 1, 1, 0.05, level.debugRTEngageDistColor, tracePoint, traceNormal );
  3504.  
  3505. wait( 0.05 );
  3506. }
  3507. }
  3508.  
  3509. hudobj_changecolor( hudObjArray, newcolor )
  3510. {
  3511. for ( i = 0; i < hudObjArray.size; i++ )
  3512. {
  3513. hudObj = hudObjArray[ i ];
  3514.  
  3515. if ( hudObj.color != newcolor )
  3516. {
  3517. hudObj.color = newcolor;
  3518. level.debugRTEngageDistColor = newcolor;
  3519. }
  3520. }
  3521. }
  3522.  
  3523. // self = an array of hud objects
  3524. engagedist_hud_changetext( engageDistType, units )
  3525. {
  3526. if ( !IsDefined( level.lastDistType ) )
  3527. {
  3528. level.lastDistType = "none";
  3529. }
  3530.  
  3531. if ( engageDistType == "optimal" )
  3532. {
  3533. self[ 1 ] SetValue( units );
  3534. self[ 2 ] SetText( "units: OPTIMAL!" );
  3535. self[ 3 ].alpha = 0;
  3536. }
  3537. else if ( engageDistType == "ok" )
  3538. {
  3539. self[ 1 ] SetValue( units );
  3540. self[ 2 ] SetText( "units: OK!" );
  3541. self[ 3 ].alpha = 0;
  3542. }
  3543. else if ( engageDistType == "short" )
  3544. {
  3545. amountUnder = level.weaponEngageDistValues.engageDistMin - units;
  3546. self[ 1 ] SetValue( units );
  3547. self[ 3 ] SetValue( amountUnder );
  3548. self[ 3 ].alpha = 1;
  3549.  
  3550. if ( level.lastDistType != engageDistType )
  3551. {
  3552. self[ 2 ] SetText( "units: SHORT by " );
  3553. }
  3554. }
  3555. else if ( engageDistType == "long" )
  3556. {
  3557. amountOver = units - level.weaponEngageDistValues.engageDistMax;
  3558. self[ 1 ] SetValue( units );
  3559. self[ 3 ] SetValue( amountOver );
  3560. self[ 3 ].alpha = 1;
  3561.  
  3562. if ( level.lastDistType != engageDistType )
  3563. {
  3564. self[ 2 ] SetText( "units: LONG by " );
  3565. }
  3566. }
  3567. else if ( engageDistType == "nodata" )
  3568. {
  3569. self[ 1 ] SetValue( units );
  3570. self[ 2 ] SetText( " units: ( NO CURRENT WEAPON VALUES )" );
  3571. self[ 3 ].alpha = 0;
  3572. }
  3573.  
  3574. level.lastDistType = engageDistType;
  3575. }
  3576.  
  3577. // draws print3ds above enemy AI heads to show contact distances
  3578. debug_ai_engage_dist()
  3579. {
  3580. level endon( "kill_all_engage_dist_debug" );
  3581. level endon( "kill_ai_engagement_distance_debug" );
  3582.  
  3583. player = get_playerone();
  3584.  
  3585. while ( 1 )
  3586. {
  3587. axis = GetAIArray( "axis" );
  3588.  
  3589. if ( IsDefined( axis ) && axis.size > 0 )
  3590. {
  3591. playerEye = player GetEye();
  3592.  
  3593. for ( i = 0; i < axis.size; i++ )
  3594. {
  3595. ai = axis[ i ];
  3596. aiEye = ai GetEye();
  3597.  
  3598. if ( SightTracePassed( playerEye, aiEye, false, player ) )
  3599. {
  3600. dist = Distance( playerEye, aiEye );
  3601.  
  3602. drawColor = level.white;
  3603. drawString = "-";
  3604.  
  3605. if ( !IsDefined( level.weaponEngageDistValues ) )
  3606. {
  3607. drawColor = level.white;
  3608. }
  3609. else
  3610. {
  3611. // for convenience
  3612. engageDistMin = level.weaponEngageDistValues.engageDistMin;
  3613. engageDistOptimal = level.weaponEngageDistValues.engageDistOptimal;
  3614. engageDistMulligan = level.weaponEngageDistValues.engageDistMulligan;
  3615. engageDistMax = level.weaponEngageDistValues.engageDistMax;
  3616.  
  3617. // if inside our engagement distance range...
  3618. if ( ( dist >= engageDistMin ) && ( dist <= engageDistMax ) )
  3619. {
  3620. // if in the optimal range...
  3621. if ( ( dist >= ( engageDistOptimal - engageDistMulligan ) )
  3622. && ( dist <= ( engageDistOptimal + engageDistMulligan ) ) )
  3623. {
  3624. drawColor = level.green;
  3625. drawString = "RAD";
  3626. }
  3627. // else it's just ok
  3628. else
  3629. {
  3630. drawColor = level.yellow;
  3631. drawString = "MEH";
  3632. }
  3633. }
  3634. else if ( dist < engageDistMin )
  3635. {
  3636. drawColor = level.red;
  3637. drawString = "BAD";
  3638. }
  3639. else if ( dist > engageDistMax )
  3640. {
  3641. drawColor = level.red;
  3642. drawString = "BAD";
  3643. }
  3644. }
  3645.  
  3646. scale = dist / 525;
  3647. Print3d( ai.origin + ( 0, 0, 67 ), drawString, drawColor, 1, scale );
  3648. }
  3649. }
  3650. }
  3651.  
  3652. wait( 0.05 );
  3653. }
  3654. }
  3655.  
  3656. // draws a circle in script
  3657. plot_circle_fortime( radius1,radius2,time,color,origin,normal )
  3658. {
  3659. if ( !IsDefined( color ) )
  3660. color = ( 0,1,0 );
  3661. hangtime = .05;
  3662. circleres = 6;
  3663. hemires = circleres/2;
  3664. circleinc = 360/circleres;
  3665. circleres++;
  3666. plotpoints = [];
  3667.  
  3668. rad = 0.00;
  3669. timer = gettime()+( time*1000 );
  3670. radius = radius1;
  3671.  
  3672. while ( gettime()<timer )
  3673. {
  3674. // radius = radius1+( ( radius2-radius1 )*( 1-( ( timer-gettime() )/( time*1000 ) ) ) );
  3675. radius = radius2;
  3676. angletoplayer = vectortoangles( normal );
  3677. for ( i=0;i<circleres;i++ )
  3678. {
  3679. plotpoints[ plotpoints.size ] = origin+vector_multiply( anglestoforward( ( angletoplayer+( rad,90,0 ) ) ),radius );
  3680. rad+=circleinc;
  3681. }
  3682. maps\_utility::plot_points( plotpoints,color[ 0 ],color[ 1 ],color[ 2 ],hangtime );
  3683. plotpoints = [];
  3684. wait hangtime;
  3685. }
  3686. }
  3687.  
  3688. // -- end engagement distance debug --
  3689.  
  3690. // -- dynamic AI spawning --
  3691. // This allows guys to be spawned in whereever. Need an enemy spawner in the map,
  3692. // or a specially designated spawner.
  3693. dynamic_ai_spawner()
  3694. {
  3695. if ( !IsDefined( level.debug_dynamic_ai_spawner ) )
  3696. {
  3697. dynamic_ai_spawner_init();
  3698. level.debug_dynamic_ai_spawner = true;
  3699. }
  3700.  
  3701. get_players()[ 0 ] thread spawn_guy_placement( level.enemy_spawner );
  3702.  
  3703. // Cleanup hudelems, dummy models, etc.
  3704. level waittill ( "kill dynamic spawning" );
  3705.  
  3706. if ( IsDefined( level.dynamic_spawn_hud ) )
  3707. {
  3708. level.dynamic_spawn_hud destroy();
  3709. }
  3710.  
  3711. if ( IsDefined( level.dynamic_spawn_dummy_model ) )
  3712. {
  3713. level.dynamic_spawn_dummy_model delete();
  3714. }
  3715.  
  3716. }
  3717.  
  3718. dynamic_ai_spawner_init()
  3719. {
  3720. level.enemy_spawner = dynamic_ai_spawner_create_enemy_spawner();
  3721. if ( !IsDefined( level.enemy_spawner ) )
  3722. {
  3723. return;
  3724. }
  3725.  
  3726. }
  3727.  
  3728. // We want to create a spawner here eventually, but grabbing one in the map will
  3729. // do for now.
  3730. dynamic_ai_spawner_create_enemy_spawner()
  3731. {
  3732. spawners = getspawnerarray();
  3733.  
  3734. for ( i = 0; i < spawners.size; i++ )
  3735. {
  3736. if ( IsDefined( spawners[ i ].targetname ) && issubstr( spawners[ i ].targetname, "debug_spawner" ) )
  3737. {
  3738. enemy_spawner = spawners[ i ];
  3739. enemy_spawner.script_forcespawn = 1;
  3740. return enemy_spawner;
  3741. }
  3742. }
  3743.  
  3744. // if we made it through, find any enemy spawner and use him
  3745. for ( i = 0; i < spawners.size; i++ )
  3746. {
  3747. if ( issubstr( spawners[ i ].classname, "jap" ) || issubstr( spawners[ i ].classname, "ger" ) )
  3748. {
  3749. enemy_spawner = spawners[ i ];
  3750. enemy_spawner.script_forcespawn = 1; // we want to make sure he will spawn in
  3751. return enemy_spawner;
  3752. }
  3753. }
  3754. }
  3755.  
  3756. // Where to spawn the AI
  3757. spawn_guy_placement( spawner )
  3758. {
  3759. level endon ( "kill dynamic spawning" );
  3760.  
  3761. if ( !IsDefined( spawner ) )
  3762. {
  3763. assertEX( IsDefined ( spawner ) , "No spawners in the level!" );
  3764. return;
  3765. }
  3766.  
  3767. level.dynamic_spawn_hud = NewClientHudElem( get_players()[ 0 ] );
  3768. level.dynamic_spawn_hud.alignX = "right";
  3769. level.dynamic_spawn_hud.x = 110;
  3770. level.dynamic_spawn_hud.y = 225;
  3771. level.dynamic_spawn_hud.fontscale = 2;
  3772.  
  3773. level.dynamic_spawn_hud settext( "Press X to spawn AI" );
  3774.  
  3775. level.dynamic_spawn_dummy_model = spawn( "script_model",( 0,0,0 ) );
  3776. level.dynamic_spawn_dummy_model setmodel( "defaultactor" );
  3777.  
  3778. wait 0.1;
  3779.  
  3780. for ( ;; )
  3781. {
  3782. // Trace to where the player is looking
  3783. direction = self getPlayerAngles();
  3784. direction_vec = anglesToForward( direction );
  3785. eye = self getEye();
  3786.  
  3787. // offset 2 units on the Z to fix the bug where it would drop through the ground sometimes
  3788. trace = bullettrace( eye, eye + vector_multiply( direction_vec , 8000 ), 0, undefined );
  3789.  
  3790. dist = distance ( eye, trace[ "position" ] );
  3791. position = eye + vector_multiply( direction_vec , ( dist - 64 ) );
  3792.  
  3793. // debug
  3794. //thread draw_line_for_time( eye - ( 1,1,1 ), position, 1, 0, 0, 0.05 );
  3795.  
  3796. spawner.origin = position;
  3797. spawner.angles = self.angles+ ( 0,180,0 );
  3798.  
  3799. level.dynamic_spawn_dummy_model.origin = position;
  3800. level.dynamic_spawn_dummy_model.angles = self.angles+ ( 0,180,0 );
  3801.  
  3802. self spawn_anywhere( spawner );
  3803.  
  3804. wait ( 0.05 );
  3805. }
  3806. }
  3807.  
  3808. spawn_anywhere( spawner )
  3809. {
  3810. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  3811. /#
  3812. if ( getdebugdvar( "replay_debug" ) == "1" )
  3813. PrintLn( "File: _debug.gsc. Function: spawn_anywhere()\n" );
  3814. #/
  3815.  
  3816. level endon ( "kill dynamic spawning" );
  3817.  
  3818. if ( self UseButtonPressed() )
  3819. {
  3820. spawn = spawner spawn_ai();
  3821.  
  3822. if ( spawn_failed( spawn ) )
  3823. {
  3824. assertex( 0, "spawn failed from spawn anywhere guy" );
  3825. return;
  3826. }
  3827. wait 0.4;
  3828. }
  3829. spawner.count = 50;
  3830.  
  3831. // CODER_MOD: Bryce ( 05/08/08 ): Useful output for debugging replay system
  3832. /#
  3833. if ( getdebugdvar( "replay_debug" ) == "1" )
  3834. PrintLn( "File: _debug.gsc. Function: spawn_anywhere() - COMPLETE\n" );
  3835. #/
  3836. }
  3837. // -- end dynamic AI spawning --
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement