Advertisement
Guest User

dom - Notesblok

a guest
Nov 19th, 2011
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 31.25 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4. /*
  5. Domination
  6. Objective: Capture all the flags by touching them
  7. Map ends: When one team captures all the flags, or time limit is reached
  8. Respawning: No wait / Near teammates
  9.  
  10. Level requirements
  11. ------------------
  12. Spawnpoints:
  13. classname mp_tdm_spawn
  14. All players spawn from these. The spawnpoint chosen is dependent on the current locations of owned flags, teammates and
  15. enemies at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
  16. Optionally, give a spawnpoint a script_linkto to specify which flag it "belongs" to (see Flag Descriptors).
  17.  
  18. Spectator Spawnpoints:
  19. classname mp_global_intermission
  20. Spectators spawn from these and intermission is viewed from these positions.
  21. Atleast one is required, any more and they are randomly chosen between.
  22.  
  23. Flags:
  24. classname trigger_radius
  25. targetname flag_primary or flag_secondary
  26. Flags that need to be captured to win. Primary flags take time to capture; secondary flags are instant.
  27.  
  28. Flag Descriptors:
  29. classname script_origin
  30. targetname flag_descriptor
  31. Place one flag descriptor close to each flag. Use the script_linkname and script_linkto properties to say which flags
  32. it can be considered "adjacent" to in the level. For instance, if players have a primary path from flag1 to flag2, and
  33. from flag2 to flag3, flag2 would have a flag_descriptor with these properties:
  34. script_linkname flag2
  35. script_linkto flag1 flag3
  36.  
  37. Set scr_domdebug to 1 to see flag connections and what spawnpoints are considered connected to each flag.
  38. */
  39.  
  40. /*QUAKED mp_dom_spawn (0.5 0.5 1.0) (-16 -16 0) (16 16 72)
  41. Players spawn near their flags at one of these positions.*/
  42.  
  43. /*QUAKED mp_dom_spawn_axis_start (1.0 0.0 1.0) (-16 -16 0) (16 16 72)
  44. Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  45.  
  46. /*QUAKED mp_dom_spawn_allies_start (0.0 1.0 1.0) (-16 -16 0) (16 16 72)
  47. Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  48.  
  49.  
  50. main()
  51. {
  52. if(getdvar("mapname") == "mp_background")
  53. return;
  54.  
  55. maps\mp\gametypes\_globallogic::init();
  56. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  57. maps\mp\gametypes\_globallogic::SetupCallbacks();
  58.  
  59. if ( isUsingMatchRulesData() )
  60. {
  61. level.initializeMatchRules = ::initializeMatchRules;
  62. [[level.initializeMatchRules]]();
  63. level thread reInitializeMatchRulesOnMigration();
  64. }
  65. else
  66. {
  67. registerTimeLimitDvar( level.gameType, 30 );
  68. registerScoreLimitDvar( level.gameType, 300 );
  69. registerRoundLimitDvar( level.gameType, 1 );
  70. registerWinLimitDvar( level.gameType, 1 );
  71. registerNumLivesDvar( level.gameType, 0 );
  72. registerHalfTimeDvar( level.gameType, 0 );
  73.  
  74. level.matchRules_damageMultiplier = 0;
  75. level.matchRules_vampirism = 0;
  76. }
  77.  
  78. level.teamBased = true;
  79. level.onStartGameType = ::onStartGameType;
  80. level.getSpawnPoint = ::getSpawnPoint;
  81. level.onPlayerKilled = ::onPlayerKilled;
  82. level.onPrecacheGameType = ::onPrecacheGameType;
  83. level.initGametypeAwards = ::initGametypeAwards;
  84. level.onSpawnPlayer = ::onSpawnPlayer;
  85.  
  86. if ( level.matchRules_damageMultiplier || level.matchRules_vampirism )
  87. level.modifyPlayerDamage = maps\mp\gametypes\_damage::gamemodeModifyPlayerDamage;
  88.  
  89. game["dialog"]["gametype"] = "domination";
  90.  
  91. if ( getDvarInt( "g_hardcore" ) )
  92. game["dialog"]["gametype"] = "hc_" + game["dialog"]["gametype"];
  93. else if ( getDvarInt( "camera_thirdPerson" ) )
  94. game["dialog"]["gametype"] = "thirdp_" + game["dialog"]["gametype"];
  95. else if ( getDvarInt( "scr_diehard" ) )
  96. game["dialog"]["gametype"] = "dh_" + game["dialog"]["gametype"];
  97. else if (getDvarInt( "scr_" + level.gameType + "_promode" ) )
  98. game["dialog"]["gametype"] = game["dialog"]["gametype"] + "_pro";
  99.  
  100. game["dialog"]["offense_obj"] = "capture_objs";
  101. game["dialog"]["defense_obj"] = "capture_objs";
  102. }
  103.  
  104.  
  105. initializeMatchRules()
  106. {
  107. assert( isUsingMatchRulesData() );
  108.  
  109. // set common values
  110. setCommonRulesFromMatchRulesData();
  111.  
  112. // set everything else (private match options, default .cfg file values, and what normally is registered in the 'else' below)
  113. SetDynamicDvar( "scr_dom_roundlimit", 1 );
  114. registerRoundLimitDvar( "dom", 1 );
  115. SetDynamicDvar( "scr_dom_winlimit", 1 );
  116. registerWinLimitDvar( "dom", 1 );
  117. SetDynamicDvar( "scr_dom_halftime", 0 );
  118. registerHalfTimeDvar( "dom", 0 );
  119.  
  120. SetDynamicDvar( "scr_dom_promode", 0 );
  121. }
  122.  
  123.  
  124. onPrecacheGameType()
  125. {
  126. precacheShader( "waypoint_captureneutral" );
  127. precacheShader( "waypoint_capture" );
  128. precacheShader( "waypoint_defend" );
  129. precacheShader( "waypoint_captureneutral_a" );
  130. precacheShader( "waypoint_capture_a" );
  131. precacheShader( "waypoint_defend_a" );
  132. precacheShader( "waypoint_captureneutral_b" );
  133. precacheShader( "waypoint_capture_b" );
  134. precacheShader( "waypoint_defend_b" );
  135. precacheShader( "waypoint_captureneutral_c" );
  136. precacheShader( "waypoint_capture_c" );
  137. precacheShader( "waypoint_defend_c" );
  138.  
  139. precacheShader( "waypoint_captureneutral" );
  140. precacheShader( "waypoint_capture" );
  141. precacheShader( "waypoint_defend" );
  142. precacheShader( "waypoint_captureneutral_a" );
  143. precacheShader( "waypoint_capture_a" );
  144. precacheShader( "waypoint_defend_a" );
  145. precacheShader( "waypoint_captureneutral_b" );
  146. precacheShader( "waypoint_capture_b" );
  147. precacheShader( "waypoint_defend_b" );
  148. precacheShader( "waypoint_captureneutral_c" );
  149. precacheShader( "waypoint_capture_c" );
  150. precacheShader( "waypoint_defend_c" );
  151. }
  152.  
  153.  
  154. onStartGameType()
  155. {
  156. setObjectiveText( "allies", &"OBJECTIVES_DOM" );
  157. setObjectiveText( "axis", &"OBJECTIVES_DOM" );
  158.  
  159. if ( level.splitscreen )
  160. {
  161. setObjectiveScoreText( "allies", &"OBJECTIVES_DOM" );
  162. setObjectiveScoreText( "axis", &"OBJECTIVES_DOM" );
  163. }
  164. else
  165. {
  166. setObjectiveScoreText( "allies", &"OBJECTIVES_DOM_SCORE" );
  167. setObjectiveScoreText( "axis", &"OBJECTIVES_DOM_SCORE" );
  168. }
  169. setObjectiveHintText( "allies", &"OBJECTIVES_DOM_HINT" );
  170. setObjectiveHintText( "axis", &"OBJECTIVES_DOM_HINT" );
  171.  
  172. setClientNameMode("auto_change");
  173.  
  174. level.spawnMins = ( 0, 0, 0 );
  175. level.spawnMaxs = ( 0, 0, 0 );
  176. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_allies_start" );
  177. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dom_spawn_axis_start" );
  178. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_dom_spawn" );
  179. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_dom_spawn" );
  180.  
  181. level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
  182. setMapCenter( level.mapCenter );
  183.  
  184. level.spawn_all = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn" );
  185. level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_axis_start" );
  186. level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn_allies_start" );
  187.  
  188. level.startPos["allies"] = level.spawn_allies_start[0].origin;
  189. level.startPos["axis"] = level.spawn_axis_start[0].origin;
  190.  
  191. level.flagBaseFXid[ "allies" ] = loadfx( maps\mp\gametypes\_teams::getTeamFlagFX( "allies" ) );
  192. level.flagBaseFXid[ "axis" ] = loadfx( maps\mp\gametypes\_teams::getTeamFlagFX( "axis" ) );
  193.  
  194. allowed[0] = "dom";
  195. // allowed[1] = "hardpoint";
  196. maps\mp\gametypes\_gameobjects::main(allowed);
  197.  
  198. maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
  199. maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 );
  200. maps\mp\gametypes\_rank::registerScoreInfo( "assist", 10 );
  201.  
  202. maps\mp\gametypes\_rank::registerScoreInfo( "capture", 150 );
  203.  
  204. maps\mp\gametypes\_rank::registerScoreInfo( "defend", 50 );
  205. maps\mp\gametypes\_rank::registerScoreInfo( "defend_assist", 10 );
  206.  
  207. maps\mp\gametypes\_rank::registerScoreInfo( "assault", 50 );
  208. maps\mp\gametypes\_rank::registerScoreInfo( "assault_assist", 10 );
  209.  
  210. thread domFlags();
  211. thread updateDomScores();
  212. }
  213.  
  214.  
  215. getSpawnPoint()
  216. {
  217. spawnpoint = undefined;
  218.  
  219. if ( !level.useStartSpawns )
  220. {
  221. flagsOwned = 0;
  222. enemyFlagsOwned = 0;
  223. myTeam = self.pers["team"];
  224. enemyTeam = getOtherTeam( myTeam );
  225. for ( i = 0; i < level.flags.size; i++ )
  226. {
  227. team = level.flags[i] getFlagTeam();
  228. if ( team == myTeam )
  229. flagsOwned++;
  230. else if ( team == enemyTeam )
  231. enemyFlagsOwned++;
  232. }
  233.  
  234. if ( flagsOwned == level.flags.size )
  235. {
  236. // own all flags! pretend we don't own the last one we got, so enemies can spawn there
  237. enemyBestSpawnFlag = level.bestSpawnFlag[ getOtherTeam( self.pers["team"] ) ];
  238.  
  239. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getSpawnsBoundingFlag( enemyBestSpawnFlag ) );
  240. }
  241. else if ( flagsOwned > 0 )
  242. {
  243. // spawn near any flag we own that's nearish something we can capture
  244. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, getBoundaryFlagSpawns( myTeam ) );
  245. }
  246. else
  247. {
  248. // own no flags!
  249. bestFlag = undefined;
  250. if ( enemyFlagsOwned > 0 && enemyFlagsOwned < level.flags.size )
  251. {
  252. // there should be an unowned one to use
  253. bestFlag = getUnownedFlagNearestStart( myTeam );
  254. }
  255. if ( !isdefined( bestFlag ) )
  256. {
  257. // pretend we still own the last one we lost
  258. bestFlag = level.bestSpawnFlag[ self.pers["team"] ];
  259. }
  260. level.bestSpawnFlag[ self.pers["team"] ] = bestFlag;
  261.  
  262. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all, bestFlag.nearbyspawns );
  263. }
  264. }
  265.  
  266. if ( !isdefined( spawnpoint ) )
  267. {
  268. if (self.pers["team"] == "axis")
  269. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
  270. else
  271. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
  272. }
  273.  
  274. //spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_all );
  275.  
  276. assert( isDefined(spawnpoint) );
  277.  
  278. return spawnpoint;
  279. }
  280.  
  281.  
  282. domFlags()
  283. {
  284. level.lastStatus["allies"] = 0;
  285. level.lastStatus["axis"] = 0;
  286.  
  287. game["flagmodels"] = [];
  288. game["flagmodels"]["neutral"] = "prop_flag_neutral";
  289.  
  290. game["flagmodels"]["allies"] = maps\mp\gametypes\_teams::getTeamFlagModel( "allies" );
  291. game["flagmodels"]["axis"] = maps\mp\gametypes\_teams::getTeamFlagModel( "axis" );
  292.  
  293. precacheModel( game["flagmodels"]["neutral"] );
  294. precacheModel( game["flagmodels"]["allies"] );
  295. precacheModel( game["flagmodels"]["axis"] );
  296.  
  297. precacheString( &"MP_SECURING_POSITION" );
  298.  
  299. primaryFlags = getEntArray( "flag_primary", "targetname" );
  300. secondaryFlags = getEntArray( "flag_secondary", "targetname" );
  301.  
  302. if ( (primaryFlags.size + secondaryFlags.size) < 2 )
  303. {
  304. printLn( "^1Not enough domination flags found in level!" );
  305. maps\mp\gametypes\_callbacksetup::AbortLevel();
  306. return;
  307. }
  308.  
  309. level.flags = [];
  310. for ( index = 0; index < primaryFlags.size; index++ )
  311. level.flags[level.flags.size] = primaryFlags[index];
  312.  
  313. for ( index = 0; index < secondaryFlags.size; index++ )
  314. level.flags[level.flags.size] = secondaryFlags[index];
  315.  
  316. level.domFlags = [];
  317. for ( index = 0; index < level.flags.size; index++ )
  318. {
  319. trigger = level.flags[index];
  320. if ( isDefined( trigger.target ) )
  321. {
  322. visuals[0] = getEnt( trigger.target, "targetname" );
  323. }
  324. else
  325. {
  326. visuals[0] = spawn( "script_model", trigger.origin );
  327. visuals[0].angles = trigger.angles;
  328. }
  329.  
  330. visuals[0] setModel( game["flagmodels"]["neutral"] );
  331.  
  332. domFlag = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", trigger, visuals, (0,0,100) );
  333. domFlag maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  334. domFlag maps\mp\gametypes\_gameobjects::setUseTime( 10.0 );
  335. domFlag maps\mp\gametypes\_gameobjects::setUseText( &"MP_SECURING_POSITION" );
  336. label = domFlag maps\mp\gametypes\_gameobjects::getLabel();
  337. domFlag.label = label;
  338. domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defend" + label );
  339. domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label );
  340. domFlag maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_captureneutral" + label );
  341. domFlag maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_captureneutral" + label );
  342. domFlag maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  343. domFlag.onUse = ::onUse;
  344. domFlag.onBeginUse = ::onBeginUse;
  345. domFlag.onUseUpdate = ::onUseUpdate;
  346. domFlag.onEndUse = ::onEndUse;
  347.  
  348.  
  349. traceStart = visuals[0].origin + (0,0,32);
  350. traceEnd = visuals[0].origin + (0,0,-32);
  351. trace = bulletTrace( traceStart, traceEnd, false, undefined );
  352.  
  353. upangles = vectorToAngles( trace["normal"] );
  354. domFlag.baseeffectforward = anglesToForward( upangles );
  355. domFlag.baseeffectright = anglesToRight( upangles );
  356.  
  357. domFlag.baseeffectpos = trace["position"];
  358.  
  359. // legacy spawn code support
  360. level.flags[index].useObj = domFlag;
  361. level.flags[index].adjflags = [];
  362. level.flags[index].nearbyspawns = [];
  363.  
  364. domFlag.levelFlag = level.flags[index];
  365.  
  366. level.domFlags[level.domFlags.size] = domFlag;
  367. }
  368.  
  369. // level.bestSpawnFlag is used as a last resort when the enemy holds all flags.
  370. level.bestSpawnFlag = [];
  371. level.bestSpawnFlag[ "allies" ] = getUnownedFlagNearestStart( "allies", undefined );
  372. level.bestSpawnFlag[ "axis" ] = getUnownedFlagNearestStart( "axis", level.bestSpawnFlag[ "allies" ] );
  373.  
  374. flagSetup();
  375.  
  376. /#
  377. thread domDebug();
  378. #/
  379. }
  380.  
  381. getUnownedFlagNearestStart( team, excludeFlag )
  382. {
  383. best = undefined;
  384. bestdistsq = undefined;
  385. for ( i = 0; i < level.flags.size; i++ )
  386. {
  387. flag = level.flags[i];
  388.  
  389. if ( flag getFlagTeam() != "neutral" )
  390. continue;
  391.  
  392. distsq = distanceSquared( flag.origin, level.startPos[team] );
  393. if ( (!isDefined( excludeFlag ) || flag != excludeFlag) && (!isdefined( best ) || distsq < bestdistsq) )
  394. {
  395. bestdistsq = distsq;
  396. best = flag;
  397. }
  398. }
  399. return best;
  400. }
  401.  
  402. /#
  403. domDebug()
  404. {
  405. while(1)
  406. {
  407. if (getdvar("scr_domdebug") != "1") {
  408. wait 2;
  409. continue;
  410. }
  411.  
  412. while(1)
  413. {
  414. if (getdvar("scr_domdebug") != "1")
  415. break;
  416. // show flag connections and each flag's spawnpoints
  417. for (i = 0; i < level.flags.size; i++) {
  418. for (j = 0; j < level.flags[i].adjflags.size; j++) {
  419. line(level.flags[i].origin, level.flags[i].adjflags[j].origin, (1,1,1));
  420. }
  421.  
  422. for (j = 0; j < level.flags[i].nearbyspawns.size; j++) {
  423. line(level.flags[i].origin, level.flags[i].nearbyspawns[j].origin, (.2,.2,.6));
  424. }
  425.  
  426. if ( level.flags[i] == level.bestSpawnFlag["allies"] )
  427. print3d( level.flags[i].origin, "allies best spawn flag" );
  428. if ( level.flags[i] == level.bestSpawnFlag["axis"] )
  429. print3d( level.flags[i].origin, "axis best spawn flag" );
  430. }
  431. wait .05;
  432. }
  433. }
  434. }
  435. #/
  436.  
  437. onBeginUse( player )
  438. {
  439. ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
  440. self.didStatusNotify = false;
  441.  
  442. if ( ownerTeam == "neutral" )
  443. {
  444. statusDialog( "securing"+self.label, player.pers["team"] );
  445. self.objPoints[player.pers["team"]] thread maps\mp\gametypes\_objpoints::startFlashing();
  446. return;
  447. }
  448.  
  449. if ( ownerTeam == "allies" )
  450. otherTeam = "axis";
  451. else
  452. otherTeam = "allies";
  453.  
  454. self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::startFlashing();
  455. self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::startFlashing();
  456. }
  457.  
  458.  
  459. onUseUpdate( team, progress, change )
  460. {
  461. if ( progress > 0.066 && change && !self.didStatusNotify )
  462. {
  463. ownerTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
  464. if ( ownerTeam == "neutral" )
  465. {
  466. statusDialog( "securing"+self.label, team );
  467. }
  468. else
  469. {
  470. statusDialog( "losing"+self.label, ownerTeam );
  471. statusDialog( "securing"+self.label, team );
  472. }
  473.  
  474. self.didStatusNotify = true;
  475. }
  476. }
  477.  
  478.  
  479. statusDialog( dialog, team, forceDialog )
  480. {
  481. time = getTime();
  482.  
  483. if ( getTime() < level.lastStatus[team] + 5000 && (!isDefined( forceDialog ) || !forceDialog) )
  484. return;
  485.  
  486. thread delayedLeaderDialog( dialog, team );
  487. level.lastStatus[team] = getTime();
  488. }
  489.  
  490.  
  491. onEndUse( team, player, success )
  492. {
  493. self.objPoints["allies"] thread maps\mp\gametypes\_objpoints::stopFlashing();
  494. self.objPoints["axis"] thread maps\mp\gametypes\_objpoints::stopFlashing();
  495. }
  496.  
  497.  
  498. resetFlagBaseEffect()
  499. {
  500. if ( isdefined( self.baseeffect ) )
  501. self.baseeffect delete();
  502.  
  503. team = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
  504.  
  505. if ( team != "axis" && team != "allies" )
  506. return;
  507.  
  508. fxid = level.flagBaseFXid[ team ];
  509.  
  510. self.baseeffect = spawnFx( fxid, self.baseeffectpos, self.baseeffectforward, self.baseeffectright );
  511. triggerFx( self.baseeffect );
  512. }
  513.  
  514. onUse( player )
  515. {
  516. team = player.pers["team"];
  517. oldTeam = self maps\mp\gametypes\_gameobjects::getOwnerTeam();
  518. label = self maps\mp\gametypes\_gameobjects::getLabel();
  519.  
  520. //player logString( "flag captured: " + self.label );
  521.  
  522. self.captureTime = getTime();
  523.  
  524. self maps\mp\gametypes\_gameobjects::setOwnerTeam( team );
  525. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_capture" + label );
  526. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_capture" + label );
  527. self.visuals[0] setModel( game["flagmodels"][team] );
  528.  
  529. self resetFlagBaseEffect();
  530.  
  531. level.useStartSpawns = false;
  532.  
  533. assert( team != "neutral" );
  534.  
  535. if ( oldTeam == "neutral" )
  536. {
  537. otherTeam = getOtherTeam( team );
  538. thread printAndSoundOnEveryone( team, otherTeam, undefined, undefined, "mp_war_objective_taken", undefined, player );
  539.  
  540. statusDialog( "secured"+self.label, team, true );
  541. statusDialog( "enemy_has"+self.label, otherTeam, true );
  542. }
  543. else
  544. {
  545. thread printAndSoundOnEveryone( team, oldTeam, undefined, undefined, "mp_war_objective_taken", "mp_war_objective_lost", player );
  546.  
  547. // thread delayedLeaderDialogBothTeams( "obj_lost", oldTeam, "obj_taken", team );
  548.  
  549. if ( getTeamFlagCount( team ) == level.flags.size )
  550. {
  551. statusDialog( "secure_all", team );
  552. statusDialog( "lost_all", oldTeam );
  553. }
  554. else
  555. {
  556. statusDialog( "secured"+self.label, team, true );
  557. statusDialog( "lost"+self.label, oldTeam, true );
  558. }
  559.  
  560. level.bestSpawnFlag[ oldTeam ] = self.levelFlag;
  561. }
  562.  
  563. player notify( "objective", "captured" );
  564. self thread giveFlagCaptureXP( self.touchList[team] );
  565. }
  566.  
  567. giveFlagCaptureXP( touchList )
  568. {
  569. level endon ( "game_ended" );
  570.  
  571. players = getArrayKeys( touchList );
  572. for ( index = 0; index < players.size; index++ )
  573. {
  574. player = touchList[players[index]].player;
  575. player thread maps\mp\gametypes\_hud_message::SplashNotify( "capture", maps\mp\gametypes\_rank::getScoreInfoValue( "capture" ) );
  576. player thread updateCPM();
  577. player thread maps\mp\gametypes\_rank::giveRankXP( "capture", maps\mp\gametypes\_rank::getScoreInfoValue( "capture" ) * player getCapXPScale() );
  578. printLn( maps\mp\gametypes\_rank::getScoreInfoValue( "capture" ) * player getCapXPScale() );
  579. maps\mp\gametypes\_gamescore::givePlayerScore( "capture", player );
  580.  
  581. player incPlayerStat( "pointscaptured", 1 );
  582. player incPersStat( "captures", 1 );
  583. player maps\mp\gametypes\_persistence::statSetChild( "round", "captures", player.pers["captures"] );
  584.  
  585. if ( player != self )
  586. player notify( "objective", "assistedCapture" );
  587. }
  588.  
  589. player = self maps\mp\gametypes\_gameobjects::getEarliestClaimPlayer();
  590.  
  591. level thread teamPlayerCardSplash( "callout_securedposition" + self.label, player );
  592.  
  593. player thread maps\mp\_matchdata::logGameEvent( "capture", player.origin );
  594. }
  595.  
  596. delayedLeaderDialog( sound, team )
  597. {
  598. level endon ( "game_ended" );
  599. wait .1;
  600. WaitTillSlowProcessAllowed();
  601.  
  602. leaderDialog( sound, team );
  603. }
  604. delayedLeaderDialogBothTeams( sound1, team1, sound2, team2 )
  605. {
  606. level endon ( "game_ended" );
  607. wait .1;
  608. WaitTillSlowProcessAllowed();
  609.  
  610. leaderDialogBothTeams( sound1, team1, sound2, team2 );
  611. }
  612.  
  613.  
  614. updateDomScores()
  615. {
  616. level endon ( "game_ended" );
  617.  
  618. while ( !level.gameEnded )
  619. {
  620. domFlags = getOwnedDomFlags();
  621.  
  622. if ( domFlags.size )
  623. {
  624. for ( i = 1; i < domFlags.size; i++ )
  625. {
  626. domFlag = domFlags[i];
  627. flagScore = getTime() - domFlag.captureTime;
  628. for ( j = i - 1; j >= 0 && flagScore > (getTime() - domFlags[j].captureTime); j-- )
  629. domFlags[j + 1] = domFlags[j];
  630. domFlags[j + 1] = domFlag;
  631. }
  632.  
  633. foreach( domFlag in domFlags )
  634. {
  635. team = domFlag maps\mp\gametypes\_gameobjects::getOwnerTeam();
  636. assert( team == "allies" || team == "axis" );
  637. maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( team, 1 );
  638. }
  639. }
  640.  
  641. // end the game if people aren't playing
  642. if ( (((getTimePassed() / 1000) > 120 && domFlags.size < 2) || ((getTimePassed() / 1000) > 300 && domFlags.size < 3)) && matchMakingGame() )
  643. {
  644. thread maps\mp\gametypes\_gamelogic::endGame( "none", game["strings"]["time_limit_reached"] );
  645. return;
  646. }
  647.  
  648. wait ( 5.0 );
  649. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  650. }
  651. }
  652.  
  653.  
  654. onPlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration, killId )
  655. {
  656. if( !isPlayer( attacker ) ||
  657. attacker.pers["team"] == self.pers["team"] )
  658. return;
  659.  
  660. awardedAssault = false;
  661. awardedDefend = false;
  662.  
  663. victim = self;
  664.  
  665. foreach( trigger in victim.touchTriggers )
  666. {
  667. if( trigger != level.flags[0] &&
  668. trigger != level.flags[1] &&
  669. trigger != level.flags[2] )
  670. continue;
  671.  
  672. ownerTeam = trigger.useObj.ownerTeam;
  673. victimTeam = victim.pers["team"];
  674.  
  675. if ( ownerTeam == "neutral" )
  676. continue;
  677.  
  678. // if the victim owns the flag and is touching the flag when killed, then the attacker gets the assault medal
  679. if ( victimTeam == ownerTeam )
  680. {
  681. awardedAssault = true;
  682. attacker thread maps\mp\gametypes\_hud_message::SplashNotify( "assault", maps\mp\gametypes\_rank::getScoreInfoValue( "assault" ) );
  683. attacker thread maps\mp\gametypes\_rank::giveRankXP( "assault" );
  684. maps\mp\gametypes\_gamescore::givePlayerScore( "assault", attacker );
  685.  
  686. thread maps\mp\_matchdata::logKillEvent( killId, "defending" );
  687. }
  688. // if the victim doesn't own the flag and is touching the flag when killed, then the attacker gets the defend medal
  689. else
  690. {
  691. awardedDefend = true;
  692. attacker thread maps\mp\gametypes\_hud_message::SplashNotify( "defend", maps\mp\gametypes\_rank::getScoreInfoValue( "defend" ) );
  693. attacker thread maps\mp\gametypes\_rank::giveRankXP( "defend" );
  694. maps\mp\gametypes\_gamescore::givePlayerScore( "defend", attacker );
  695.  
  696. attacker incPersStat( "defends", 1 );
  697. attacker maps\mp\gametypes\_persistence::statSetChild( "round", "defends", attacker.pers["defends"] );
  698.  
  699. thread maps\mp\_matchdata::logKillEvent( killId, "assaulting" );
  700. }
  701. }
  702.  
  703. foreach( trigger in attacker.touchTriggers )
  704. {
  705. if( trigger != level.flags[0] &&
  706. trigger != level.flags[1] &&
  707. trigger != level.flags[2] )
  708. continue;
  709.  
  710. ownerTeam = trigger.useObj.ownerTeam;
  711. attackerTeam = attacker.pers["team"];
  712.  
  713. if ( ownerTeam == "neutral" )
  714. continue;
  715.  
  716. // if the attacker doesn't own the flag and is touching the flag when killing the victim, then the attacker gets an assault medal
  717. if ( attackerTeam != ownerTeam )
  718. {
  719. if ( !awardedAssault )
  720. attacker thread maps\mp\gametypes\_hud_message::SplashNotify( "assault", maps\mp\gametypes\_rank::getScoreInfoValue( "assault" ) );
  721. attacker thread maps\mp\gametypes\_rank::giveRankXP( "assault" );
  722. maps\mp\gametypes\_gamescore::givePlayerScore( "assault", attacker );
  723.  
  724. thread maps\mp\_matchdata::logKillEvent( killId, "defending" );
  725. }
  726. }
  727.  
  728. // now if the attacker kills the victim within a radius of a flag that the attacker owns, the attacker gets a defend medal
  729. foreach( trigger in level.flags )
  730. {
  731. ownerTeam = trigger.useObj.ownerTeam;
  732. attackerTeam = attacker.pers["team"];
  733.  
  734. victimDistanceToFlag = DistanceSquared( trigger.origin, victim.origin );
  735. defendDistance = 300 * 300;
  736.  
  737. if( attackerTeam == ownerTeam && victimDistanceToFlag < defendDistance )
  738. {
  739. if ( !awardedDefend )
  740. attacker thread maps\mp\gametypes\_hud_message::SplashNotify( "defend", maps\mp\gametypes\_rank::getScoreInfoValue( "defend" ) );
  741. attacker thread maps\mp\gametypes\_rank::giveRankXP( "defend" );
  742. maps\mp\gametypes\_gamescore::givePlayerScore( "defend", attacker );
  743.  
  744. thread maps\mp\_matchdata::logKillEvent( killId, "assaulting" );
  745. }
  746. }
  747. }
  748.  
  749.  
  750. getOwnedDomFlags()
  751. {
  752. domFlags = [];
  753. foreach ( domFlag in level.domFlags )
  754. {
  755. if ( domFlag maps\mp\gametypes\_gameobjects::getOwnerTeam() != "neutral" && isDefined( domFlag.captureTime ) )
  756. domFlags[domFlags.size] = domFlag;
  757. }
  758.  
  759. return domFlags;
  760. }
  761.  
  762.  
  763. getTeamFlagCount( team )
  764. {
  765. score = 0;
  766. for (i = 0; i < level.flags.size; i++)
  767. {
  768. if ( level.domFlags[i] maps\mp\gametypes\_gameobjects::getOwnerTeam() == team )
  769. score++;
  770. }
  771. return score;
  772. }
  773.  
  774. getFlagTeam()
  775. {
  776. return self.useObj maps\mp\gametypes\_gameobjects::getOwnerTeam();
  777. }
  778.  
  779. getBoundaryFlags()
  780. {
  781. // get all flags which are adjacent to flags that aren't owned by the same team
  782. bflags = [];
  783. for (i = 0; i < level.flags.size; i++)
  784. {
  785. for (j = 0; j < level.flags[i].adjflags.size; j++)
  786. {
  787. if (level.flags[i].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() != level.flags[i].adjflags[j].useObj maps\mp\gametypes\_gameobjects::getOwnerTeam() )
  788. {
  789. bflags[bflags.size] = level.flags[i];
  790. break;
  791. }
  792. }
  793. }
  794.  
  795. return bflags;
  796. }
  797.  
  798. getBoundaryFlagSpawns(team)
  799. {
  800. spawns = [];
  801.  
  802. bflags = getBoundaryFlags();
  803. for (i = 0; i < bflags.size; i++)
  804. {
  805. if (isdefined(team) && bflags[i] getFlagTeam() != team)
  806. continue;
  807.  
  808. for (j = 0; j < bflags[i].nearbyspawns.size; j++)
  809. spawns[spawns.size] = bflags[i].nearbyspawns[j];
  810. }
  811.  
  812. return spawns;
  813. }
  814.  
  815. getSpawnsBoundingFlag( avoidflag )
  816. {
  817. spawns = [];
  818.  
  819. for (i = 0; i < level.flags.size; i++)
  820. {
  821. flag = level.flags[i];
  822. if ( flag == avoidflag )
  823. continue;
  824.  
  825. isbounding = false;
  826. for (j = 0; j < flag.adjflags.size; j++)
  827. {
  828. if ( flag.adjflags[j] == avoidflag )
  829. {
  830. isbounding = true;
  831. break;
  832. }
  833. }
  834.  
  835. if ( !isbounding )
  836. continue;
  837.  
  838. for (j = 0; j < flag.nearbyspawns.size; j++)
  839. spawns[spawns.size] = flag.nearbyspawns[j];
  840. }
  841.  
  842. return spawns;
  843. }
  844.  
  845. // gets an array of all spawnpoints which are near flags that are
  846. // owned by the given team, or that are adjacent to flags owned by the given team.
  847. getOwnedAndBoundingFlagSpawns(team)
  848. {
  849. spawns = [];
  850.  
  851. for (i = 0; i < level.flags.size; i++)
  852. {
  853. if ( level.flags[i] getFlagTeam() == team )
  854. {
  855. // add spawns near this flag
  856. for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
  857. spawns[spawns.size] = level.flags[i].nearbyspawns[s];
  858. }
  859. else
  860. {
  861. for (j = 0; j < level.flags[i].adjflags.size; j++)
  862. {
  863. if ( level.flags[i].adjflags[j] getFlagTeam() == team )
  864. {
  865. // add spawns near this flag
  866. for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
  867. spawns[spawns.size] = level.flags[i].nearbyspawns[s];
  868. break;
  869. }
  870. }
  871. }
  872. }
  873.  
  874. return spawns;
  875. }
  876.  
  877. // gets an array of all spawnpoints which are near flags that are
  878. // owned by the given team
  879. getOwnedFlagSpawns(team)
  880. {
  881. spawns = [];
  882.  
  883. for (i = 0; i < level.flags.size; i++)
  884. {
  885. if ( level.flags[i] getFlagTeam() == team )
  886. {
  887. // add spawns near this flag
  888. for (s = 0; s < level.flags[i].nearbyspawns.size; s++)
  889. spawns[spawns.size] = level.flags[i].nearbyspawns[s];
  890. }
  891. }
  892.  
  893. return spawns;
  894. }
  895.  
  896. flagSetup()
  897. {
  898. maperrors = [];
  899. descriptorsByLinkname = [];
  900.  
  901. // (find each flag_descriptor object)
  902. descriptors = getentarray("flag_descriptor", "targetname");
  903.  
  904. flags = level.flags;
  905.  
  906. for (i = 0; i < level.domFlags.size; i++)
  907. {
  908. closestdist = undefined;
  909. closestdesc = undefined;
  910. for (j = 0; j < descriptors.size; j++)
  911. {
  912. dist = distance(flags[i].origin, descriptors[j].origin);
  913. if (!isdefined(closestdist) || dist < closestdist) {
  914. closestdist = dist;
  915. closestdesc = descriptors[j];
  916. }
  917. }
  918.  
  919. if (!isdefined(closestdesc)) {
  920. maperrors[maperrors.size] = "there is no flag_descriptor in the map! see explanation in dom.gsc";
  921. break;
  922. }
  923. if (isdefined(closestdesc.flag)) {
  924. maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + closestdesc.script_linkname + "\" is nearby more than one flag; is there a unique descriptor near each flag?";
  925. continue;
  926. }
  927. flags[i].descriptor = closestdesc;
  928. closestdesc.flag = flags[i];
  929. descriptorsByLinkname[closestdesc.script_linkname] = closestdesc;
  930. }
  931.  
  932. if (maperrors.size == 0)
  933. {
  934. // find adjacent flags
  935. for (i = 0; i < flags.size; i++)
  936. {
  937. if (isdefined(flags[i].descriptor.script_linkto))
  938. adjdescs = strtok(flags[i].descriptor.script_linkto, " ");
  939. else
  940. adjdescs = [];
  941. for (j = 0; j < adjdescs.size; j++)
  942. {
  943. otherdesc = descriptorsByLinkname[adjdescs[j]];
  944. if (!isdefined(otherdesc) || otherdesc.targetname != "flag_descriptor") {
  945. maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to \"" + adjdescs[j] + "\" which does not exist as a script_linkname of any other entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)";
  946. continue;
  947. }
  948. adjflag = otherdesc.flag;
  949. if (adjflag == flags[i]) {
  950. maperrors[maperrors.size] = "flag_descriptor with script_linkname \"" + flags[i].descriptor.script_linkname + "\" linked to itself";
  951. continue;
  952. }
  953. flags[i].adjflags[flags[i].adjflags.size] = adjflag;
  954. }
  955. }
  956. }
  957.  
  958. // assign each spawnpoint to nearest flag
  959. spawnpoints = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dom_spawn" );
  960. for (i = 0; i < spawnpoints.size; i++)
  961. {
  962. if (isdefined(spawnpoints[i].script_linkto)) {
  963. desc = descriptorsByLinkname[spawnpoints[i].script_linkto];
  964. if (!isdefined(desc) || desc.targetname != "flag_descriptor") {
  965. maperrors[maperrors.size] = "Spawnpoint at " + spawnpoints[i].origin + "\" linked to \"" + spawnpoints[i].script_linkto + "\" which does not exist as a script_linkname of any entity with a targetname of flag_descriptor (or, if it does, that flag_descriptor has not been assigned to a flag)";
  966. continue;
  967. }
  968. nearestflag = desc.flag;
  969. }
  970. else {
  971. nearestflag = undefined;
  972. nearestdist = undefined;
  973. for (j = 0; j < flags.size; j++)
  974. {
  975. dist = distancesquared(flags[j].origin, spawnpoints[i].origin);
  976. if (!isdefined(nearestflag) || dist < nearestdist)
  977. {
  978. nearestflag = flags[j];
  979. nearestdist = dist;
  980. }
  981. }
  982. }
  983. nearestflag.nearbyspawns[nearestflag.nearbyspawns.size] = spawnpoints[i];
  984. }
  985.  
  986. if (maperrors.size > 0)
  987. {
  988. println("^1------------ Map Errors ------------");
  989. for(i = 0; i < maperrors.size; i++)
  990. println(maperrors[i]);
  991. println("^1------------------------------------");
  992.  
  993. error("Map errors. See above");
  994. maps\mp\gametypes\_callbacksetup::AbortLevel();
  995.  
  996. return;
  997. }
  998. }
  999.  
  1000. initGametypeAwards()
  1001. {
  1002. maps\mp\_awards::initStatAward( "pointscaptured", 0, maps\mp\_awards::highestWins );
  1003. }
  1004.  
  1005. onSpawnPlayer()
  1006. {
  1007. }
  1008.  
  1009. updateCPM()
  1010. {
  1011. if ( !isDefined( self.CPM ) )
  1012. {
  1013. self.numCaps = 0;
  1014. self.CPM = 0;
  1015. }
  1016.  
  1017. self.numCaps++;
  1018.  
  1019. if ( getMinutesPassed() < 1 )
  1020. return;
  1021.  
  1022. self.CPM = self.numCaps / getMinutesPassed();
  1023. }
  1024.  
  1025. getCapXPScale()
  1026. {
  1027. if ( self.CPM < 4 )
  1028. return 1;
  1029. else
  1030. return 0.25;
  1031. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement