Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.21 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4.  
  5. main()
  6. {
  7. if ( getdvar("mapname") == "mp_background" )
  8. return;
  9.  
  10. maps\mp\gametypes\_globallogic::init();
  11. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  12. maps\mp\gametypes\_globallogic::SetupCallbacks();
  13.  
  14. registerTimeLimitDvar( level.gameType, 30, 0, 1440 );
  15. registerScoreLimitDvar( level.gameType, 300, 0, 1000 );
  16. registerRoundLimitDvar( level.gameType, 1, 0, 10 );
  17. registerWinLimitDvar( level.gameType, 1, 0, 10 );
  18. registerNumLivesDvar( level.gameType, 0, 0, 10 );
  19. registerHalfTimeDvar( level.gameType, 0, 0, 1 );
  20.  
  21. level.teamBased = true;
  22. level.doPrematch = true;
  23. level.onStartGameType = ::onStartGameType;
  24. level.getSpawnPoint = ::getSpawnPoint;
  25. level.onSpawnPlayer = ::onSpawnPlayer;
  26. level.onPlayerKilled = ::onPlayerKilled;
  27. level.initGametypeAwards = ::initGametypeAwards;
  28.  
  29. precacheShader( "waypoint_captureneutral" );
  30. precacheShader( "waypoint_capture" );
  31. precacheShader( "waypoint_defend" );
  32.  
  33. precacheShader( "waypoint_targetneutral" );
  34. precacheShader( "waypoint_captureneutral" );
  35. precacheShader( "waypoint_capture" );
  36. precacheShader( "waypoint_defend" );
  37.  
  38. precacheString( &"MP_WAITING_FOR_HQ" );
  39.  
  40. if ( getdvar("koth_autodestroytime") == "" )
  41. setdvar("koth_autodestroytime", "60");
  42. level.hqAutoDestroyTime = getdvarint("koth_autodestroytime");
  43.  
  44. if ( getdvar("koth_spawntime") == "" )
  45. setdvar("koth_spawntime", "0");
  46. level.hqSpawnTime = getdvarint("koth_spawntime");
  47.  
  48. if ( getdvar("koth_kothmode") == "" )
  49. setdvar("koth_kothmode", "1");
  50. level.kothMode = getdvarint("koth_kothmode");
  51.  
  52. if ( getdvar("koth_captureTime") == "" )
  53. setdvar("koth_captureTime", "20");
  54. level.captureTime = getdvarint("koth_captureTime");
  55.  
  56. if ( getdvar("koth_destroyTime") == "" )
  57. setdvar("koth_destroyTime", "10");
  58. level.destroyTime = getdvarint("koth_destroyTime");
  59.  
  60. if ( getdvar("koth_delayPlayer") == "" )
  61. setdvar("koth_delayPlayer", 1);
  62. level.delayPlayer = getdvarint("koth_delayPlayer");
  63.  
  64. if ( getdvar("koth_spawnDelay") == "" )
  65. setdvar("koth_spawnDelay", 0);
  66. level.spawnDelay = getdvarint("koth_spawnDelay");
  67.  
  68. if ( getdvar("koth_extraDelay") == "" )
  69. setdvar("koth_extraDelay", 0.0 );
  70.  
  71. level.extraDelay = getdvarint("koth_extraDelay");
  72.  
  73. setDvarIfUninitialized( "koth_proMode", 0 );
  74.  
  75. level.proMode = getDvarInt( "koth_proMode" );
  76.  
  77. level.iconoffset = (0,0,32);
  78.  
  79. level.onRespawnDelay = ::getRespawnDelay;
  80.  
  81. game["dialog"]["gametype"] = "headquarters";
  82.  
  83. if ( getDvarInt( "g_hardcore" ) )
  84. game["dialog"]["gametype"] = "hc_" + game["dialog"]["gametype"];
  85. else if ( getDvarInt( "camera_thirdPerson" ) )
  86. game["dialog"]["gametype"] = "thirdp_" + game["dialog"]["gametype"];
  87. else if ( getDvarInt( "scr_diehard" ) )
  88. game["dialog"]["gametype"] = "dh_" + game["dialog"]["gametype"];
  89. else if (getDvarInt( "scr_" + level.gameType + "_promode" ) )
  90. game["dialog"]["gametype"] = game["dialog"]["gametype"] + "_pro";
  91. }
  92.  
  93.  
  94. updateObjectiveHintMessages( alliesObjective, axisObjective )
  95. {
  96. game["strings"]["objective_hint_allies"] = alliesObjective;
  97. game["strings"]["objective_hint_axis" ] = axisObjective;
  98.  
  99. for ( i = 0; i < level.players.size; i++ )
  100. {
  101. player = level.players[i];
  102. if ( isDefined( player.pers["team"] ) && player.pers["team"] != "spectator" )
  103. {
  104. hintText = getObjectiveHintText( player.pers["team"] );
  105. player thread maps\mp\gametypes\_hud_message::hintMessage( hintText );
  106. }
  107. }
  108. }
  109.  
  110.  
  111. getRespawnDelay()
  112. {
  113. self clearLowerMessage( "hq_respawn" );
  114.  
  115. if ( !isDefined( level.radioObject ) )
  116. return undefined;
  117.  
  118. hqOwningTeam = level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam();
  119. if ( self.pers["team"] == hqOwningTeam )
  120. {
  121. if ( !isDefined( level.hqDestroyTime ) )
  122. return undefined;
  123.  
  124. if (!level.spawnDelay )
  125. return undefined;
  126.  
  127. timeRemaining = (level.hqDestroyTime - gettime()) / 1000;
  128. timeRemaining += level.extraDelay + 1.0; // extra second for slowed spawning
  129.  
  130. if ( level.spawnDelay >= level.hqAutoDestroyTime )
  131. setLowerMessage( "hq_respawn", &"MP_WAITING_FOR_HQ", undefined, 10 );
  132.  
  133. if ( !isAlive( self ) )
  134. self.forceSpawnNearTeammates = true;
  135.  
  136. if ( level.delayPlayer )
  137. {
  138. return min( level.spawnDelay, timeRemaining );
  139. }
  140. else
  141. {
  142. return (int(timeRemaining) % level.spawnDelay);
  143. }
  144. }
  145. }
  146.  
  147.  
  148. onStartGameType()
  149. {
  150. setObjectiveText( "allies", &"OBJECTIVES_KOTH" );
  151. setObjectiveText( "axis", &"OBJECTIVES_KOTH" );
  152.  
  153. if ( level.splitscreen )
  154. {
  155. setObjectiveScoreText( "allies", &"OBJECTIVES_KOTH" );
  156. setObjectiveScoreText( "axis", &"OBJECTIVES_KOTH" );
  157. }
  158. else
  159. {
  160. setObjectiveScoreText( "allies", &"OBJECTIVES_KOTH_SCORE" );
  161. setObjectiveScoreText( "axis", &"OBJECTIVES_KOTH_SCORE" );
  162. }
  163.  
  164. level.objectiveHintPrepareHQ = &"MP_CONTROL_HQ";
  165. level.objectiveHintCaptureHQ = &"MP_CAPTURE_HQ";
  166. level.objectiveHintDestroyHQ = &"MP_DESTROY_HQ";
  167. level.objectiveHintDefendHQ = &"MP_DEFEND_HQ";
  168. precacheString( level.objectiveHintPrepareHQ );
  169. precacheString( level.objectiveHintCaptureHQ );
  170. precacheString( level.objectiveHintDestroyHQ );
  171. precacheString( level.objectiveHintDefendHQ );
  172.  
  173. if ( level.kothmode )
  174. level.objectiveHintDestroyHQ = level.objectiveHintCaptureHQ;
  175.  
  176. if ( level.hqSpawnTime )
  177. updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ );
  178. else
  179. updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ );
  180.  
  181. setClientNameMode("auto_change");
  182.  
  183. // TODO: HQ spawnpoints
  184. level.spawnMins = ( 0, 0, 0 );
  185. level.spawnMaxs = ( 0, 0, 0 );
  186. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_tdm_spawn" );
  187. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_tdm_spawn" );
  188.  
  189. level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
  190. setMapCenter( level.mapCenter );
  191.  
  192. level.spawn_all = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_tdm_spawn" );
  193. if ( !level.spawn_all.size )
  194. {
  195. println("^1No mp_tdm_spawn spawnpoints in level!");
  196. maps\mp\gametypes\_callbacksetup::AbortLevel();
  197. return;
  198. }
  199.  
  200.  
  201. allowed[0] = "hq";
  202. maps\mp\gametypes\_gameobjects::main(allowed);
  203.  
  204. thread SetupRadios();
  205.  
  206. maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
  207. maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 );
  208. maps\mp\gametypes\_rank::registerScoreInfo( "assist", 10 );
  209. maps\mp\gametypes\_rank::registerScoreInfo( "defend", 10 );
  210. maps\mp\gametypes\_rank::registerScoreInfo( "assault", 10 );
  211. maps\mp\gametypes\_rank::registerScoreInfo( "capture", 250 );
  212.  
  213. thread HQMainLoop();
  214. }
  215.  
  216.  
  217. HQMainLoop()
  218. {
  219. level endon("game_ended");
  220.  
  221. level.hqRevealTime = -100000;
  222.  
  223. hqSpawningInStr = &"MP_HQ_AVAILABLE_IN";
  224. if ( level.kothmode )
  225. {
  226. hqDestroyedInFriendlyStr = &"MP_HQ_DESPAWN_IN";
  227. hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN";
  228. }
  229. else
  230. {
  231.  
  232. if ( !level.splitscreen )
  233. {
  234. hqDestroyedInFriendlyStr = &"MP_HQ_REINFORCEMENTS_IN";
  235. hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN";
  236. }
  237. else
  238. {
  239. hqDestroyedInFriendlyStr = &"MP_HQ_REINFORCEMENTS_IN_SPLITSCREEN";
  240. hqDestroyedInEnemyStr = &"MP_HQ_DESPAWN_IN";
  241. }
  242. }
  243.  
  244. precacheString( hqSpawningInStr );
  245. precacheString( hqDestroyedInFriendlyStr );
  246. precacheString( hqDestroyedInEnemyStr );
  247. precacheString( &"MP_CAPTURING_HQ" );
  248. precacheString( &"MP_DESTROYING_HQ" );
  249.  
  250. gameFlagWait( "prematch_done" );
  251.  
  252. wait 5;
  253.  
  254. timerDisplay = [];
  255. timerDisplay["allies"] = createServerTimer( "objective", 1.4, "allies" );
  256. timerDisplay["allies"] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 );
  257. timerDisplay["allies"].label = hqSpawningInStr;
  258. timerDisplay["allies"].alpha = 0;
  259. timerDisplay["allies"].archived = false;
  260. timerDisplay["allies"].hideWhenInMenu = true;
  261.  
  262. timerDisplay["axis" ] = createServerTimer( "objective", 1.4, "axis" );
  263. timerDisplay["axis" ] setPoint( "TOPRIGHT", "TOPRIGHT", 0, 0 );
  264. timerDisplay["axis" ].label = hqSpawningInStr;
  265. timerDisplay["axis" ].alpha = 0;
  266. timerDisplay["axis" ].archived = false;
  267. timerDisplay["axis" ].hideWhenInMenu = true;
  268.  
  269. level.timerDisplay = timerDisplay;
  270.  
  271. thread hideTimerDisplayOnGameEnd( timerDisplay["allies"] );
  272. thread hideTimerDisplayOnGameEnd( timerDisplay["axis" ] );
  273.  
  274. locationObjID = maps\mp\gametypes\_gameobjects::getNextObjID();
  275.  
  276. objective_add( locationObjID, "invisible", (0,0,0) );
  277.  
  278. while( 1 )
  279. {
  280. radio = PickRadioToSpawn();
  281. radio makeRadioActive();
  282.  
  283. //iPrintLn( &"MP_HQ_REVEALED" );
  284. playSoundOnPlayers( "mp_suitcase_pickup" );
  285. leaderDialog( "hq_located" );
  286.  
  287. radioObject = radio.gameobject;
  288. level.radioObject = radioObject;
  289.  
  290. radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( true );
  291.  
  292. level.hqRevealTime = gettime();
  293.  
  294. if ( level.hqSpawnTime )
  295. {
  296. nextObjPoint = maps\mp\gametypes\_objpoints::createTeamObjpoint( "objpoint_next_hq", radio.origin + level.iconoffset, "all", "waypoint_targetneutral" );
  297. nextObjPoint setWayPoint( true, true );
  298. objective_position( locationObjID, radio.trigorigin );
  299. objective_icon( locationObjID, "waypoint_targetneutral" );
  300. objective_state( locationObjID, "active" );
  301.  
  302. updateObjectiveHintMessages( level.objectiveHintPrepareHQ, level.objectiveHintPrepareHQ );
  303.  
  304. timerDisplay["allies"].label = hqSpawningInStr;
  305. timerDisplay["allies"] setTimer( level.hqSpawnTime );
  306. //if ( !level.splitscreen )
  307. timerDisplay["allies"].alpha = 1;
  308.  
  309. timerDisplay["axis" ].label = hqSpawningInStr;
  310. timerDisplay["axis" ] setTimer( level.hqSpawnTime );
  311. //if ( !level.splitscreen )
  312. timerDisplay["axis" ].alpha = 1;
  313.  
  314. wait level.hqSpawnTime;
  315.  
  316. maps\mp\gametypes\_objpoints::deleteObjPoint( nextObjPoint );
  317. objective_state( locationObjID, "invisible" );
  318. leaderDialog( "hq_online" );
  319. }
  320.  
  321. timerDisplay["allies"].alpha = 0;
  322. timerDisplay["axis" ].alpha = 0;
  323.  
  324. waittillframeend;
  325.  
  326. leaderDialog( "obj_capture" );
  327. updateObjectiveHintMessages( level.objectiveHintCaptureHQ, level.objectiveHintCaptureHQ );
  328. playSoundOnPlayers( "mp_killstreak_radar" );
  329.  
  330. radioObject maps\mp\gametypes\_gameobjects::allowUse( "any" );
  331. radioObject maps\mp\gametypes\_gameobjects::setUseTime( level.captureTime );
  332. radioObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_CAPTURING_HQ" );
  333.  
  334. radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_captureneutral" );
  335. radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" );
  336. radioObject maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  337. radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( true );
  338.  
  339. radioObject.onUse = ::onRadioCapture;
  340. radioObject.onBeginUse = ::onBeginUse;
  341. radioObject.onEndUse = ::onEndUse;
  342.  
  343. level waittill( "hq_captured" );
  344.  
  345. ownerTeam = radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam();
  346. otherTeam = getOtherTeam( ownerTeam );
  347.  
  348. if ( level.hqAutoDestroyTime )
  349. {
  350. thread DestroyHQAfterTime( level.hqAutoDestroyTime );
  351. timerDisplay[ownerTeam] setTimer( level.hqAutoDestroyTime + level.extraDelay );
  352. timerDisplay[otherTeam] setTimer( level.hqAutoDestroyTime );
  353. }
  354. else
  355. {
  356. level.hqDestroyedByTimer = false;
  357. }
  358.  
  359. /#
  360. thread scriptDestroyHQ();
  361. #/
  362.  
  363. while( 1 )
  364. {
  365. ownerTeam = radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam();
  366. otherTeam = getOtherTeam( ownerTeam );
  367.  
  368. if ( ownerTeam == "allies" )
  369. {
  370. updateObjectiveHintMessages( level.objectiveHintDefendHQ, level.objectiveHintDestroyHQ );
  371. }
  372. else
  373. {
  374. updateObjectiveHintMessages( level.objectiveHintDestroyHQ, level.objectiveHintDefendHQ );
  375. }
  376.  
  377. radioObject maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  378. radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defend" );
  379. radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" );
  380. radioObject maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_capture" );
  381. radioObject maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" );
  382.  
  383. if ( !level.kothMode )
  384. radioObject maps\mp\gametypes\_gameobjects::setUseText( &"MP_DESTROYING_HQ" );
  385.  
  386. radioObject.onUse = ::onRadioDestroy;
  387.  
  388. if ( level.hqAutoDestroyTime )
  389. {
  390. timerDisplay[ownerTeam].label = hqDestroyedInFriendlyStr;
  391. //if ( !level.splitscreen )
  392. timerDisplay[ownerTeam].alpha = 1;
  393.  
  394. timerDisplay[otherTeam].label = hqDestroyedInEnemyStr;
  395. //if ( !level.splitscreen )
  396. timerDisplay[otherTeam].alpha = 1;
  397. }
  398.  
  399. level waittill( "hq_destroyed" );
  400.  
  401. timerDisplay[otherTeam].alpha = 0;
  402.  
  403. if ( !level.kothmode || level.hqDestroyedByTimer )
  404. break;
  405.  
  406. thread forceSpawnTeam( ownerTeam );
  407.  
  408. radioObject maps\mp\gametypes\_gameobjects::setOwnerTeam( getOtherTeam( ownerTeam ) );
  409. }
  410.  
  411. level notify("hq_reset");
  412.  
  413. radioObject maps\mp\gametypes\_gameobjects::allowUse( "none" );
  414. radioObject maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" );
  415. radioObject maps\mp\gametypes\_gameobjects::setModelVisibility( false );
  416.  
  417. radio makeRadioInactive();
  418.  
  419. level.radioObject = undefined;
  420.  
  421. thread forceSpawnTeam( ownerTeam, level.extraDelay );
  422.  
  423. wait ( level.extraDelay );
  424.  
  425. wait ( max ( 1.0, 6.0 - level.extraDelay ) );
  426. }
  427. }
  428.  
  429.  
  430. hideTimerDisplayOnGameEnd( timerDisplay )
  431. {
  432. level waittill("game_ended");
  433. timerDisplay.alpha = 0;
  434. }
  435.  
  436. forceSpawnTeam( team, extraDelay )
  437. {
  438. if ( extraDelay )
  439. {
  440. foreach ( player in level.players )
  441. {
  442. if ( isAlive( player ) )
  443. continue;
  444.  
  445. if ( player.pers["team"] == team )
  446. player setLowerMessage( "hq_respawn", game["strings"]["waiting_to_spawn"], extraDelay );
  447. }
  448.  
  449. wait ( extraDelay );
  450. }
  451.  
  452. level.timerDisplay[team].alpha = 0;
  453.  
  454. foreach ( player in level.players )
  455. {
  456. if ( player.pers["team"] == team )
  457. {
  458. player clearLowerMessage( "hq_respawn" );
  459. if ( !isAlive( player ) )
  460. player.forceSpawnNearTeammates = true;
  461. player notify( "force_spawn" );
  462. }
  463. }
  464. }
  465.  
  466.  
  467. onBeginUse( player )
  468. {
  469. ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
  470.  
  471. if ( ownerTeam == "neutral" )
  472. {
  473. self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing();
  474. }
  475. else
  476. {
  477. self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing();
  478. self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing();
  479. }
  480. }
  481.  
  482.  
  483. onEndUse( team, player, success )
  484. {
  485. self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing();
  486. self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing();
  487. }
  488.  
  489.  
  490. onRadioCapture( player )
  491. {
  492. team = player.pers["team"];
  493.  
  494. player thread [[level.onXPEvent]]( "capture" );
  495. maps\mp\gametypes\_gamescore::givePlayerScore( "capture", player );
  496. player incPlayerStat( "hqscaptured", 1 );
  497. player thread maps\mp\_matchdata::logGameEvent( "capture", player.origin );
  498.  
  499. oldTeam = maps\mp\gametypes\_gameobjects::getOwnerTeam();
  500. self maps\mp\gametypes\_gameobjects::setOwnerTeam( team );
  501. if ( !level.kothMode )
  502. self maps\mp\gametypes\_gameobjects::setUseTime( level.destroyTime );
  503.  
  504. otherTeam = "axis";
  505. if ( team == "axis" )
  506. otherTeam = "allies";
  507.  
  508. teamPlayerCardSplash( "callout_capturedhq", player );
  509.  
  510. leaderDialog( "hq_secured", team );
  511. leaderDialog( "hq_enemy_captured", otherTeam );
  512. thread playSoundOnPlayers( "mp_war_objective_taken", team );
  513. thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam );
  514.  
  515. level thread awardHQPoints( team );
  516.  
  517. player notify( "objective", "captured" );
  518. level notify( "hq_captured" );
  519. }
  520.  
  521. /#
  522. scriptDestroyHQ()
  523. {
  524. level endon("hq_destroyed");
  525. while(1)
  526. {
  527. if ( getdvar("scr_destroyhq") != "1" )
  528. {
  529. wait .1;
  530. continue;
  531. }
  532. setdvar("scr_destroyhq","0");
  533.  
  534. hqOwningTeam = level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam();
  535. for ( i = 0; i < level.players.size; i++ )
  536. {
  537. if ( level.players[i].team != hqOwningTeam )
  538. {
  539. onRadioDestroy( level.players[i] );
  540. break;
  541. }
  542. }
  543. }
  544. }
  545. #/
  546.  
  547. onRadioDestroy( player )
  548. {
  549. team = player.pers["team"];
  550. otherTeam = "axis";
  551. if ( team == "axis" )
  552. otherTeam = "allies";
  553.  
  554. //player logString( "radio destroyed" );
  555. player thread [[level.onXPEvent]]( "capture" );
  556. maps\mp\gametypes\_gamescore::givePlayerScore( "capture", player );
  557. player incPlayerStat( "hqsdestroyed", 1 );
  558. player thread maps\mp\_matchdata::logGameEvent( "destroy", player.origin );
  559.  
  560. if ( level.kothmode )
  561. {
  562. teamPlayerCardSplash( "callout_capturedhq", player );
  563. leaderDialog( "hq_secured", team );
  564. leaderDialog( "hq_enemy_captured", otherTeam );
  565. }
  566. else
  567. {
  568. teamPlayerCardSplash( "callout_destroyedhq", player );
  569. leaderDialog( "hq_secured", team );
  570. leaderDialog( "hq_enemy_destroyed", otherTeam );
  571. }
  572. thread playSoundOnPlayers( "mp_war_objective_taken", team );
  573. thread playSoundOnPlayers( "mp_war_objective_lost", otherTeam );
  574.  
  575. level notify( "hq_destroyed" );
  576.  
  577. if ( level.kothmode )
  578. level thread awardHQPoints( team );
  579. }
  580.  
  581.  
  582. DestroyHQAfterTime( time )
  583. {
  584. level endon( "game_ended" );
  585. level endon( "hq_reset" );
  586.  
  587. level.hqDestroyTime = gettime() + time * 1000;
  588. level.hqDestroyedByTimer = false;
  589.  
  590. wait time;
  591.  
  592. level.hqDestroyedByTimer = true;
  593.  
  594. leaderDialog( "hq_offline" );
  595.  
  596. level notify( "hq_destroyed" );
  597. }
  598.  
  599.  
  600. awardHQPoints( team )
  601. {
  602. level endon( "game_ended" );
  603. level endon( "hq_destroyed" );
  604.  
  605. level notify("awardHQPointsRunning");
  606. level endon("awardHQPointsRunning");
  607.  
  608. steps = 12;
  609. baseLine = 5;
  610. delta = 5;
  611.  
  612. if ( level.proMode )
  613. seconds = int(level.hqAutoDestroyTime / steps);
  614. else
  615. seconds = 5;
  616.  
  617. curStep = 0;
  618. while ( !level.gameEnded )
  619. {
  620. if ( level.proMode && level.hqAutoDestroyTime )
  621. maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( team, int(5*(curStep+1)) );
  622. else
  623. maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( team, seconds );
  624.  
  625. for ( index = 0; index < level.players.size; index++ )
  626. {
  627. player = level.players[index];
  628.  
  629. if ( player.pers["team"] == team )
  630. {
  631. if ( level.proMode )
  632. {
  633. if ( level.hqAutoDestroyTime )
  634. player thread maps\mp\gametypes\_rank::giveRankXP( "defend", int(baseLine+(delta*curStep)) );
  635. else
  636. player thread maps\mp\gametypes\_rank::giveRankXP( "defend", int(baseLine+delta) );
  637. }
  638. else
  639. {
  640. player thread maps\mp\gametypes\_rank::giveRankXP( "defend" );
  641. }
  642.  
  643. if ( isAlive( player ) )
  644. maps\mp\gametypes\_gamescore::givePlayerScore( "defend", player );
  645. }
  646. }
  647.  
  648. curStep++;
  649. wait seconds;
  650. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  651. }
  652. }
  653.  
  654.  
  655. getSpawnPoint()
  656. {
  657. spawnpoint = undefined;
  658.  
  659. if ( isdefined( level.radioObject ) )
  660. {
  661. hqOwningTeam = level.radioObject maps\mp\gametypes\_gameobjects::getOwnerTeam();
  662. if ( self.pers["team"] == hqOwningTeam )
  663. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radioObject.nearSpawns );
  664. //else if ( level.spawnDelay >= level.hqAutoDestroyTime && gettime() > level.hqRevealTime + 10000 )
  665. // spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radioObject.outerSpawns );
  666. else
  667. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, level.radioObject.outerSpawns );
  668. }
  669.  
  670. if ( !isDefined( spawnpoint ) )
  671. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all );
  672.  
  673. assert( isDefined(spawnpoint) );
  674.  
  675. return spawnpoint;
  676. }
  677.  
  678.  
  679. onSpawnPlayer()
  680. {
  681. self clearLowerMessage( "hq_respawn" );
  682. self.forceSpawnNearTeammates = undefined;
  683. }
  684.  
  685.  
  686. SetupRadios()
  687. {
  688. maperrors = [];
  689.  
  690. radios = getentarray( "hq_hardpoint", "targetname" );
  691.  
  692. if ( radios.size < 2 )
  693. {
  694. maperrors[maperrors.size] = "There are not at least 2 entities with targetname \"radio\"";
  695. }
  696.  
  697. trigs = getentarray("radiotrigger", "targetname");
  698. for ( i = 0; i < radios.size; i++ )
  699. {
  700. errored = false;
  701.  
  702. radio = radios[i];
  703. radio.trig = undefined;
  704. for ( j = 0; j < trigs.size; j++ )
  705. {
  706. if ( radio istouching( trigs[j] ) )
  707. {
  708. if ( isdefined( radio.trig ) )
  709. {
  710. maperrors[maperrors.size] = "Radio at " + radio.origin + " is touching more than one \"radiotrigger\" trigger";
  711. errored = true;
  712. break;
  713. }
  714. radio.trig = trigs[j];
  715. break;
  716. }
  717. }
  718.  
  719. if ( !isdefined( radio.trig ) )
  720. {
  721. if ( !errored )
  722. {
  723. maperrors[maperrors.size] = "Radio at " + radio.origin + " is not inside any \"radiotrigger\" trigger";
  724. continue;
  725. }
  726.  
  727. // possible fallback (has been tested)
  728. //radio.trig = spawn( "trigger_radius", radio.origin, 0, 128, 128 );
  729. //errored = false;
  730. }
  731.  
  732. assert( !errored );
  733.  
  734. radio.trigorigin = radio.trig.origin;
  735.  
  736. visuals = [];
  737. visuals[0] = radio;
  738.  
  739. otherVisuals = getEntArray( radio.target, "targetname" );
  740. for ( j = 0; j < otherVisuals.size; j++ )
  741. {
  742. visuals[visuals.size] = otherVisuals[j];
  743. }
  744.  
  745. radio.visuals = visuals;
  746. radio maps\mp\gametypes\_gameobjects::setModelVisibility( false );
  747. /*
  748. radio.gameObject = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", radio.trig, visuals, (radio.origin - radio.trigorigin) + level.iconoffset );
  749. radio.gameObject maps\mp\gametypes\_gameobjects::disableObject();
  750. radio.gameObject maps\mp\gametypes\_gameobjects::setModelVisibility( false );
  751. radio.trig.useObj = radio.gameObject;
  752.  
  753. radio setUpNearbySpawns();
  754. */
  755. }
  756.  
  757. if (maperrors.size > 0)
  758. {
  759. println("^1------------ Map Errors ------------");
  760. for(i = 0; i < maperrors.size; i++)
  761. println(maperrors[i]);
  762. println("^1------------------------------------");
  763.  
  764. error("Map errors. See above");
  765. maps\mp\gametypes\_callbacksetup::AbortLevel();
  766.  
  767. return;
  768. }
  769.  
  770. level.radios = radios;
  771.  
  772. level.prevradio = undefined;
  773. level.prevradio2 = undefined;
  774.  
  775. /#
  776. thread kothDebug();
  777. #/
  778.  
  779. return true;
  780. }
  781.  
  782.  
  783. makeRadioActive()
  784. {
  785. self.gameObject = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", self.trig, self.visuals, (self.origin - self.trigorigin) + level.iconoffset );
  786. self.gameObject maps\mp\gametypes\_gameobjects::setModelVisibility( false );
  787. self.trig.useObj = self.gameObject;
  788.  
  789. self setUpNearbySpawns();
  790. }
  791.  
  792.  
  793. makeRadioInactive()
  794. {
  795. self.gameObject maps\mp\gametypes\_gameobjects::deleteUseObject();
  796.  
  797. self.gameObject = undefined;
  798. }
  799.  
  800.  
  801. setUpNearbySpawns()
  802. {
  803. spawns = level.spawn_all;
  804.  
  805. for ( i = 0; i < spawns.size; i++ )
  806. {
  807. spawns[i].distsq = distanceSquared( spawns[i].origin, self.origin );
  808. }
  809.  
  810. // sort by distsq
  811. for ( i = 1; i < spawns.size; i++ )
  812. {
  813. thespawn = spawns[i];
  814. for ( j = i - 1; j >= 0 && thespawn.distsq < spawns[j].distsq; j-- )
  815. spawns[j + 1] = spawns[j];
  816. spawns[j + 1] = thespawn;
  817. }
  818.  
  819. first = [];
  820. outer = [];
  821.  
  822. thirdSize = spawns.size / 3;
  823. for ( i = 0; i < spawns.size; i++ )
  824. {
  825. if ( i <= thirdSize || spawns[i].distsq <= 700*700 )
  826. first[ first.size ] = spawns[i];
  827.  
  828. if ( i > thirdSize || spawns[i].distsq > 1000*1000 )
  829. {
  830. if ( outer.size < 10 || spawns[i].distsq < 1500*1500 ) // don't include too many far-away spawnpoints
  831. outer[ outer.size ] = spawns[i];
  832. }
  833. }
  834.  
  835. self.gameObject.nearSpawns = first;
  836. self.gameObject.outerSpawns = outer;
  837. }
  838.  
  839.  
  840. PickRadioToSpawn()
  841. {
  842. validAllies = [];
  843. validAxis = [];
  844.  
  845. foreach ( player in level.players )
  846. {
  847. if ( player.team == "spectator" )
  848. continue;
  849.  
  850. if ( !isAlive( player ) )
  851. continue;
  852.  
  853. player.dist = 0;
  854. if ( player.team == "allies" )
  855. validAllies[validAllies.size] = player;
  856. else
  857. validAxis[validAxis.size] = player;
  858. }
  859.  
  860. if ( !validAllies.size || !validAxis.size )
  861. {
  862. radio = level.radios[ randomint( level.radios.size) ];
  863. while ( isDefined( level.prevradio ) && radio == level.prevradio ) // so lazy
  864. radio = level.radios[ randomint( level.radios.size) ];
  865.  
  866. level.prevradio2 = level.prevradio;
  867. level.prevradio = radio;
  868.  
  869. return radio;
  870. }
  871.  
  872. for ( i = 0; i < validAllies.size; i++ )
  873. {
  874. for ( j = i + 1; j < validAllies.size; j++ )
  875. {
  876. dist = distanceSquared( validAllies[i].origin, validAllies[j].origin );
  877.  
  878. validAllies[i].dist += dist;
  879. validAllies[j].dist += dist;
  880. }
  881. }
  882.  
  883. for ( i = 0; i < validAxis.size; i++ )
  884. {
  885. for ( j = i + 1; j < validAxis.size; j++ )
  886. {
  887. dist = distanceSquared( validAxis[i].origin, validAxis[j].origin );
  888.  
  889. validAxis[i].dist += dist;
  890. validAxis[j].dist += dist;
  891. }
  892. }
  893.  
  894. bestPlayer = validAllies[0];
  895. foreach ( player in validAllies )
  896. {
  897. if ( player.dist < bestPlayer.dist )
  898. bestPlayer = player;
  899. }
  900. avgpos["allies"] = bestPlayer.origin;
  901.  
  902. bestPlayer = validAxis[0];
  903. foreach ( player in validAxis )
  904. {
  905. if ( player.dist < bestPlayer.dist )
  906. bestPlayer = player;
  907. }
  908. avgpos["axis"] = validAxis[0].origin;
  909.  
  910. bestradio = undefined;
  911. lowestcost = undefined;
  912. for ( i = 0; i < level.radios.size; i++ )
  913. {
  914. radio = level.radios[i];
  915.  
  916. // (purposefully using distance instead of distanceSquared)
  917. cost = abs( distance( radio.origin, avgpos["allies"] ) - distance( radio.origin, avgpos["axis"] ) );
  918.  
  919. if ( isdefined( level.prevradio ) && radio == level.prevradio )
  920. {
  921. continue;
  922. }
  923. if ( isdefined( level.prevradio2 ) && radio == level.prevradio2 )
  924. {
  925. if ( level.radios.size > 2 )
  926. continue;
  927. else
  928. cost += 512;
  929. }
  930.  
  931. if ( !isdefined( lowestcost ) || cost < lowestcost )
  932. {
  933. lowestcost = cost;
  934. bestradio = radio;
  935. }
  936. }
  937. assert( isdefined( bestradio ) );
  938.  
  939. level.prevradio2 = level.prevradio;
  940. level.prevradio = bestradio;
  941.  
  942. return bestradio;
  943. }
  944.  
  945.  
  946.  
  947. onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, killId )
  948. {
  949. if ( !isPlayer( attacker ) || (!self.touchTriggers.size && !attacker.touchTriggers.size) || attacker.pers["team"] == self.pers["team"] )
  950. return;
  951.  
  952. if ( self.touchTriggers.size )
  953. {
  954. foreach ( trigger in self.touchTriggers )
  955. {
  956. // TODO: way to check for koth specific triggers
  957. if ( !isDefined( trigger.useObj ) )
  958. continue;
  959.  
  960. ownerTeam = trigger.useObj.ownerTeam;
  961. team = self.pers["team"];
  962.  
  963. if ( ownerTeam == "neutral" )
  964. continue;
  965.  
  966. team = self.pers["team"];
  967. if ( team == ownerTeam )
  968. {
  969. attacker thread [[level.onXPEvent]]( "assault" );
  970. maps\mp\gametypes\_gamescore::givePlayerScore( "assault", attacker );
  971.  
  972. thread maps\mp\_matchdata::logKillEvent( killId, "defending" );
  973. }
  974. else
  975. {
  976. attacker thread [[level.onXPEvent]]( "defend" );
  977. maps\mp\gametypes\_gamescore::givePlayerScore( "defend", attacker );
  978.  
  979. self thread maps\mp\_matchdata::logKillEvent( killId, "assaulting" );
  980. }
  981. }
  982. }
  983.  
  984. if ( attacker.touchTriggers.size )
  985. {
  986. foreach ( trigger in attacker.touchTriggers )
  987. {
  988. // TODO: way to check for koth specific triggers
  989. if ( !isDefined( trigger.useObj ) )
  990. continue;
  991.  
  992. ownerTeam = trigger.useObj.ownerTeam;
  993. team = attacker.pers["team"];
  994.  
  995. if ( ownerTeam == "neutral" )
  996.  
  997. team = attacker.pers["team"];
  998. if ( team == ownerTeam )
  999. {
  1000. attacker thread [[level.onXPEvent]]( "defend" );
  1001. maps\mp\gametypes\_gamescore::givePlayerScore( "defend", attacker );
  1002.  
  1003. self thread maps\mp\_matchdata::logKillEvent( killId, "assaulting" );
  1004. }
  1005. else
  1006. {
  1007. attacker thread [[level.onXPEvent]]( "assault" );
  1008. maps\mp\gametypes\_gamescore::givePlayerScore( "assault", attacker );
  1009.  
  1010. thread maps\mp\_matchdata::logKillEvent( killId, "defending" );
  1011. }
  1012. }
  1013. }
  1014. }
  1015.  
  1016.  
  1017. initGametypeAwards()
  1018. {
  1019. maps\mp\_awards::initStatAward( "hqsdestroyed", 0, maps\mp\_awards::highestWins );
  1020. maps\mp\_awards::initStatAward( "hqscaptured", 0, maps\mp\_awards::highestWins );
  1021. }
  1022.  
  1023. /#
  1024. drawPoint( org, size, color )
  1025. {
  1026. for ( i = 0; i < 10; i++ )
  1027. {
  1028. a1 = (i / 10) * 360;
  1029. a2 = ((i + 1) / 10) * 360;
  1030.  
  1031. pt1 = org + (cos(a1), sin(a1), 0) * size;
  1032. pt2 = org + (cos(a2), sin(a2), 0) * size;
  1033.  
  1034. line( pt1, pt2, color );
  1035. }
  1036. }
  1037.  
  1038. kothDebug()
  1039. {
  1040. while(1)
  1041. {
  1042. if (getdvar("scr_kothdebug") != "1") {
  1043. wait 2;
  1044. continue;
  1045. }
  1046.  
  1047. while(1)
  1048. {
  1049. if (getdvar("scr_kothdebug") != "1")
  1050. break;
  1051. if ( !isdefined( level.players ) || level.players.size <= 0 )
  1052. {
  1053. wait .05;
  1054. continue;
  1055. }
  1056.  
  1057. // show nearest HQ and its "assault" spawnpoints
  1058.  
  1059. bestdistsq = 99999999999;
  1060. bestradio = level.radios[0];
  1061. foreach ( radio in level.radios )
  1062. {
  1063. distsq = distanceSquared( radio.origin, level.players[0].origin );
  1064. if ( distsq < bestdistsq )
  1065. {
  1066. bestdistsq = distsq;
  1067. bestradio = radio;
  1068. }
  1069. }
  1070.  
  1071. foreach ( radio in level.radios )
  1072. {
  1073. if ( radio != bestradio )
  1074. drawPoint( radio.origin, 50, (.5,.5,.5) );
  1075. }
  1076.  
  1077. radio = bestradio;
  1078. drawPoint( radio.origin, 100, (1,1,1) );
  1079.  
  1080. foreach ( spawnpoint in radio.gameObject.outerSpawns )
  1081. {
  1082. line( radio.origin, spawnpoint.origin, (1,.5,.5) );
  1083. drawPoint( spawnpoint.origin, 20, (1,.5,.5) );
  1084. }
  1085. foreach ( spawnpoint in radio.gameObject.nearSpawns )
  1086. {
  1087. line( radio.origin + (0,0,10), spawnpoint.origin + (0,0,10), (.5,1,.5) );
  1088. drawPoint( spawnpoint.origin, 30, (.5,1,.5) );
  1089. }
  1090.  
  1091. wait .05;
  1092. }
  1093. }
  1094. }
  1095. #/
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement