Advertisement
Guest User

koth - Notesblok

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