Advertisement
Guest User

dd - Notesblok

a guest
Nov 19th, 2011
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 36.86 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4.  
  5. /*
  6. Di$oRdER was here
  7. Attackers objective: Bomb both of 2 positions
  8. Defenders objective: Defend these 2 positions / Defuse planted bombs
  9. Round ends When one team defends for duration of match, both sites are destroyed.
  10. Map ends When one team reaches the score limit, or time limit or round limit is reached
  11. Respawning Players respawn indefinetly, immediately
  12.  
  13. Level requirements
  14. ------------------
  15. Allied Spawnpoints:
  16. classname mp_sd_spawn_attacker
  17. Allied players spawn from these. Place at least 16 of these relatively close together.
  18.  
  19. Axis Spawnpoints:
  20. classname mp_sd_spawn_defender
  21. Axis players spawn from these. Place at least 16 of these relatively close together.
  22.  
  23. Spectator Spawnpoints:
  24. classname mp_global_intermission
  25. Spectators spawn from these and intermission is viewed from these positions.
  26. Atleast one is required, any more and they are randomly chosen between.
  27.  
  28. Bombzones:
  29. classname trigger_multiple
  30. targetname bombzone
  31. script_gameobjectname bombzone
  32. script_bombmode_original <if defined this bombzone will be used in the original bomb mode>
  33. script_bombmode_single <if defined this bombzone will be used in the single bomb mode>
  34. script_bombmode_dual <if defined this bombzone will be used in the dual bomb mode>
  35. script_team Set to allies or axis. This is used to set which team a bombzone is used by in dual bomb mode.
  36. script_label Set to A or B. This sets the letter shown on the compass in original mode.
  37. This is a volume of space in which the bomb can planted. Must contain an origin brush.
  38.  
  39. Bomb:
  40. classname trigger_lookat
  41. targetname bombtrigger
  42. script_gameobjectname bombzone
  43. This should be a 16x16 unit trigger with an origin brush placed so that it's center lies on the bottom plane of the trigger.
  44. Must be in the level somewhere. This is the trigger that is used when defusing a bomb.
  45. It gets moved to the position of the planted bomb model.
  46.  
  47. Level script requirements
  48. -------------------------
  49. Team Definitions:
  50. game["attackers"] = "allies";
  51. game["defenders"] = "axis";
  52. This sets which team is attacking and which team is defending. Attackers plant the bombs. Defenders protect the targets.
  53.  
  54. Exploder Effects:
  55. Setting script_noteworthy on a bombzone trigger to an exploder group can be used to trigger additional effects.
  56.  
  57. multiple bombs
  58. multiple targets
  59. spawning
  60. round handling when both sites are destroyed
  61.  
  62. */
  63.  
  64. /*QUAKED mp_dd_spawn_attacker_a (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  65. Axis players spawn near bomb a.*/
  66.  
  67. /*QUAKED mp_dd_spawn_attacker_b (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  68. Axis players spawn near bomb b.*/
  69.  
  70. /*QUAKED mp_dd_spawn_attacker (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  71. Axis players spawn away from enemies and near their team at one of these positions.*/
  72.  
  73. /*QUAKED mp_dd_spawn_defender (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  74. Allied players spawn away from enemies and near their team at one of these positions.*/
  75.  
  76. /*QUAKED mp_dd_spawn_defender_a (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  77. Allied players spawn near bomb site a.*/
  78.  
  79. /*QUAKED mp_dd_spawn_defender_b (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  80. Allied players spawn near bomb site b.*/
  81.  
  82. /*QUAKED mp_dd_spawn_attacker_start (0.0 1.0 0.0) (-16 -16 0) (16 16 72)
  83. Attacking players spawn randomly at one of these positions at the beginning of a round.*/
  84.  
  85. /*QUAKED mp_dd_spawn_defender_start (1.0 0.0 0.0) (-16 -16 0) (16 16 72)
  86. Defending players spawn randomly at one of these positions at the beginning of a round.*/
  87.  
  88. main()
  89. {
  90. if(getdvar("mapname") == "mp_background")
  91. return;
  92.  
  93. maps\mp\gametypes\_globallogic::init();
  94. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  95. maps\mp\gametypes\_globallogic::SetupCallbacks();
  96.  
  97. if ( isUsingMatchRulesData() )
  98. {
  99. level.initializeMatchRules = ::initializeMatchRules;
  100. [[level.initializeMatchRules]]();
  101. level thread reInitializeMatchRulesOnMigration();
  102. }
  103. else
  104. {
  105. registerRoundSwitchDvar( level.gameType, 1, 0, 9 );
  106. registerTimeLimitDvar( level.gameType, 3 );
  107. registerScoreLimitDvar( level.gameType, 0 );
  108. registerRoundLimitDvar( level.gameType, 3 );
  109. registerWinLimitDvar( level.gameType, 2 );
  110. registerNumLivesDvar( level.gameType, 0 );
  111. registerHalfTimeDvar( level.gameType, 0 );
  112.  
  113. level.matchRules_damageMultiplier = 0;
  114. level.matchRules_vampirism = 0;
  115. }
  116.  
  117. setOverTimeLimitDvar( 3 );
  118.  
  119. level.objectiveBased = true;
  120. level.teamBased = true;
  121. level.onPrecacheGameType = ::onPrecacheGameType;
  122. level.onStartGameType = ::onStartGameType;
  123. level.getSpawnPoint = ::getSpawnPoint;
  124. level.onSpawnPlayer = ::onSpawnPlayer;
  125. level.onDeadEvent = ::onDeadEvent;
  126. level.onTimeLimit = ::onTimeLimit;
  127. level.onNormalDeath = ::onNormalDeath;
  128. level.initGametypeAwards = ::initGametypeAwards;
  129.  
  130. if ( level.matchRules_damageMultiplier || level.matchRules_vampirism )
  131. level.modifyPlayerDamage = maps\mp\gametypes\_damage::gamemodeModifyPlayerDamage;
  132.  
  133. level.dd = true;
  134. level.bombsPlanted = 0;
  135. level.ddBombModel = []
  136.  
  137. setBombTimerDvar();
  138.  
  139. makeDvarServerInfo( "ui_bombtimer_a", -1 );
  140. makeDvarServerInfo( "ui_bombtimer_b", -1 );
  141.  
  142. game["dialog"]["gametype"] = "demolition";
  143.  
  144. if ( getDvarInt( "g_hardcore" ) )
  145. game["dialog"]["gametype"] = "hc_" + game["dialog"]["gametype"];
  146. else if ( getDvarInt( "camera_thirdPerson" ) )
  147. game["dialog"]["gametype"] = "thirdp_" + game["dialog"]["gametype"];
  148. else if ( getDvarInt( "scr_diehard" ) )
  149. game["dialog"]["gametype"] = "dh_" + game["dialog"]["gametype"];
  150. else if (getDvarInt( "scr_" + level.gameType + "_promode" ) )
  151. game["dialog"]["gametype"] = game["dialog"]["gametype"] + "_pro";
  152.  
  153. game["dialog"]["offense_obj"] = "obj_destroy";
  154. game["dialog"]["defense_obj"] = "obj_defend";
  155.  
  156. /#
  157. SetDevDvarIfUninitialized( "scr_dd_debugBombKillCamEnt", 0 );
  158. #/
  159. }
  160.  
  161.  
  162. initializeMatchRules()
  163. {
  164. // set common values
  165. setCommonRulesFromMatchRulesData();
  166.  
  167. // set everything else (private match options, default .cfg file values, and what normally is registered in the 'else' below)
  168. roundSwitch = GetMatchRulesData( "demData", "roundSwitch" );
  169. SetDynamicDvar( "scr_dd_roundswitch", roundSwitch );
  170. registerRoundSwitchDvar( "dd", roundSwitch, 0, 9 );
  171.  
  172. SetDynamicDvar( "scr_dd_bombtimer", GetMatchRulesData( "demData", "bombTimer" ) );
  173. SetDynamicDvar( "scr_dd_planttime", GetMatchRulesData( "demData", "plantTime" ) );
  174. SetDynamicDvar( "scr_dd_defusetime", GetMatchRulesData( "demData", "defuseTime" ) );
  175. SetDynamicDvar( "scr_dd_addtime", GetMatchRulesData( "demData", "extraTime" ) );
  176.  
  177. SetDynamicDvar( "scr_dd_roundlimit", 3 );
  178. registerRoundLimitDvar( "dd", 3 );
  179. SetDynamicDvar( "scr_dd_winlimit", 2 );
  180. registerWinLimitDvar( "dd", 2 );
  181. SetDynamicDvar( "scr_dd_halftime", 0 );
  182. registerHalfTimeDvar( "dd", 0 );
  183.  
  184. SetDynamicDvar( "scr_dd_promode", 0 );
  185. }
  186.  
  187.  
  188. onPrecacheGameType()
  189. {
  190. game["bomb_dropped_sound"] = "mp_war_objective_lost";
  191. game["bomb_recovered_sound"] = "mp_war_objective_taken";
  192.  
  193. precacheShader("waypoint_bomb");
  194. precacheShader("hud_suitcase_bomb");
  195. precacheShader("waypoint_target");
  196. precacheShader("waypoint_target_a");
  197. precacheShader("waypoint_target_b");
  198. precacheShader("waypoint_defend");
  199. precacheShader("waypoint_defend_a");
  200. precacheShader("waypoint_defend_b");
  201. precacheShader("waypoint_defuse_a");
  202. precacheShader("waypoint_defuse_b");
  203. precacheShader("waypoint_target");
  204. precacheShader("waypoint_target_a");
  205. precacheShader("waypoint_target_b");
  206. precacheShader("waypoint_defend");
  207. precacheShader("waypoint_defend_a");
  208. precacheShader("waypoint_defend_b");
  209. precacheShader("waypoint_defuse");
  210. precacheShader("waypoint_defuse_a");
  211. precacheShader("waypoint_defuse_b");
  212.  
  213. precacheString( &"MP_EXPLOSIVES_RECOVERED_BY" );
  214. precacheString( &"MP_EXPLOSIVES_DROPPED_BY" );
  215. precacheString( &"MP_EXPLOSIVES_PLANTED_BY" );
  216. precacheString( &"MP_EXPLOSIVES_DEFUSED_BY" );
  217. precacheString( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
  218. precacheString( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
  219. precacheString( &"MP_CANT_PLANT_WITHOUT_BOMB" );
  220. precacheString( &"MP_PLANTING_EXPLOSIVE" );
  221. precacheString( &"MP_DEFUSING_EXPLOSIVE" );
  222. precacheString( &"MP_BOMB_A_TIMER" );
  223. precacheString( &"MP_BOMB_B_TIMER" );
  224. precacheString( &"MP_BOMBSITE_IN_USE" );
  225. }
  226.  
  227. onStartGameType()
  228. {
  229. if ( game["roundsPlayed"] == 2 )
  230. {
  231. game["status"] = "overtime";
  232. setDvar( "ui_overtime", 1 );
  233. }
  234.  
  235. if ( !isDefined( game["switchedsides"] ) )
  236. game["switchedsides"] = false;
  237.  
  238. if ( game["switchedsides"] )
  239. {
  240. oldAttackers = game["attackers"];
  241. oldDefenders = game["defenders"];
  242. game["attackers"] = oldDefenders;
  243. game["defenders"] = oldAttackers;
  244. }
  245.  
  246. level.useStartSpawns = true;
  247.  
  248. setClientNameMode( "manual_change" );
  249.  
  250. game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED";
  251. game["strings"]["bomb_defused"] = &"MP_BOMB_DEFUSED";
  252. if ( inOvertime() )
  253. {
  254. game["dialog"]["defense_obj"] = "obj_destroy";
  255. }
  256.  
  257. precacheString( game["strings"]["target_destroyed"] );
  258. precacheString( game["strings"]["bomb_defused"] );
  259.  
  260. level._effect["bombexplosion"] = loadfx("explosions/tanker_explosion");
  261.  
  262. setObjectiveText( game["attackers"], &"OBJECTIVES_DD_ATTACKER" );
  263. setObjectiveText( game["defenders"], &"OBJECTIVES_DD_DEFENDER" );
  264.  
  265. if ( level.splitscreen )
  266. {
  267. setObjectiveScoreText( game["attackers"], &"OBJECTIVES_DD_ATTACKER" );
  268. setObjectiveScoreText( game["defenders"], &"OBJECTIVES_DD_DEFENDER" );
  269. }
  270. else
  271. {
  272. setObjectiveScoreText( game["attackers"], &"OBJECTIVES_DD_ATTACKER_SCORE" );
  273. setObjectiveScoreText( game["defenders"], &"OBJECTIVES_DD_DEFENDER_SCORE" );
  274. }
  275.  
  276. if ( inOvertime() )
  277. {
  278. setObjectiveHintText( game["attackers"], &"OBJECTIVES_DD_OVERTIME_HINT" );
  279. setObjectiveHintText( game["defenders"], &"OBJECTIVES_DD_OVERTIME_HINT" );
  280. }
  281. else
  282. {
  283. setObjectiveHintText( game["attackers"], &"OBJECTIVES_DD_ATTACKER_HINT" );
  284. setObjectiveHintText( game["defenders"], &"OBJECTIVES_DD_DEFENDER_HINT" );
  285. }
  286.  
  287. level.spawnMins = ( 0, 0, 0 );
  288. level.spawnMaxs = ( 0, 0, 0 );
  289.  
  290. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dd_spawn_defender" );
  291. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dd_spawn_defender_a", true );
  292. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["defenders"], "mp_dd_spawn_defender_b", true );
  293.  
  294. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dd_spawn_defender_start" );
  295.  
  296. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dd_spawn_attacker" );
  297. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dd_spawn_attacker_a", true );
  298. maps\mp\gametypes\_spawnlogic::addSpawnPoints( game["attackers"], "mp_dd_spawn_attacker_b", true );
  299.  
  300. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_dd_spawn_attacker_start" );
  301.  
  302. level.spawn_defenders = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender" );
  303. level.spawn_defenders_a = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_a" );
  304. level.spawn_defenders_a = array_combine( level.spawn_defenders, level.spawn_defenders_a );
  305. level.spawn_defenders_b = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_b" );
  306. level.spawn_defenders_b = array_combine( level.spawn_defenders, level.spawn_defenders_b );
  307.  
  308. level.spawn_attackers = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker" );
  309. level.spawn_attackers_a = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_a" );
  310. level.spawn_attackers_a = array_combine( level.spawn_attackers, level.spawn_attackers_a );
  311. level.spawn_attackers_b = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_b" );
  312. level.spawn_attackers_b = array_combine( level.spawn_attackers, level.spawn_attackers_b );
  313.  
  314. level.spawn_defenders_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_defender_start" );
  315. level.spawn_attackers_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_dd_spawn_attacker_start" );
  316.  
  317. level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
  318. level.aPlanted = false;
  319. level.bPlanted = false;
  320.  
  321. setMapCenter( level.mapCenter );
  322.  
  323. maps\mp\gametypes\_rank::registerScoreInfo( "win", 2 );
  324. maps\mp\gametypes\_rank::registerScoreInfo( "loss", 1 );
  325. maps\mp\gametypes\_rank::registerScoreInfo( "tie", 1.5 );
  326.  
  327. maps\mp\gametypes\_rank::registerScoreInfo( "kill", 50 );
  328. maps\mp\gametypes\_rank::registerScoreInfo( "headshot", 50 );
  329. maps\mp\gametypes\_rank::registerScoreInfo( "assist", 20 );
  330. maps\mp\gametypes\_rank::registerScoreInfo( "plant", 100 );
  331. maps\mp\gametypes\_rank::registerScoreInfo( "defuse", 100 );
  332.  
  333. thread updateGametypeDvars();
  334. thread waitToProcess();
  335.  
  336. winlimit = getWatchedDvar("winlimit");
  337.  
  338. allowed[0] = "dd";
  339. allowed[1] = "dd_bombzone";
  340. allowed[2] = "blocker";
  341. maps\mp\gametypes\_gameobjects::main(allowed);
  342.  
  343. thread bombs();
  344. }
  345.  
  346. waitToProcess()
  347. {
  348. level endon( "game_end" );
  349.  
  350. for ( ;; )
  351. {
  352. if ( level.inGracePeriod == 0 )
  353. break;
  354.  
  355. wait ( 0.05 );
  356. }
  357.  
  358. level.useStartSpawns = false;
  359.  
  360. }
  361.  
  362. getSpawnPoint()
  363. {
  364. spawnteam = self.pers["team"];
  365.  
  366. if ( level.useStartSpawns )
  367. {
  368. if ( spawnteam == game["attackers"] )
  369. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_attackers_start);
  370. else
  371. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_defenders_start);
  372. }
  373. else
  374. {
  375. if (spawnteam == game["attackers"] )
  376. {
  377. if ( inOvertime() )
  378. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  379. else if ( (!level.aPlanted && !level.bPlanted) )
  380. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  381. else if ( level.aPlanted && !level.bPlanted )
  382. spawnPoints = level.spawn_attackers_a;
  383. else if ( level.bPlanted && !level.aPlanted )
  384. spawnPoints = level.spawn_attackers_b;
  385. else
  386. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  387.  
  388. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
  389. }
  390. else
  391. {
  392. if ( inOvertime() )
  393. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  394. else if ( (!level.aPlanted && !level.bPlanted) )
  395. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  396. else if ( level.aPlanted && !level.bPlanted )
  397. spawnPoints = level.spawn_defenders_a;
  398. else if ( level.bPlanted && !level.aPlanted )
  399. spawnPoints = level.spawn_defenders_b;
  400. else
  401. spawnPoints = maps\mp\gametypes\_spawnlogic::getTeamSpawnPoints( spawnteam );
  402.  
  403. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( spawnPoints );
  404. }
  405. }
  406.  
  407. assert( isDefined(spawnpoint) );
  408.  
  409. return spawnpoint;
  410. }
  411.  
  412. onSpawnPlayer()
  413. {
  414.  
  415. if ( inOvertime() || self.pers["team"] == game["attackers"] )
  416. {
  417. self.isPlanting = false;
  418. self.isDefusing = false;
  419. self.isBombCarrier = true;
  420.  
  421. if ( level.splitscreen )
  422. {
  423. self.carryIcon = createIcon( "hud_suitcase_bomb", 33, 33 );
  424. self.carryIcon setPoint( "BOTTOM RIGHT", "BOTTOM RIGHT", 0, -78 );
  425. self.carryIcon.alpha = 0.75;
  426. }
  427. else
  428. {
  429. self.carryIcon = createIcon( "hud_suitcase_bomb", 50, 50 );
  430. self.carryIcon setPoint( "BOTTOM RIGHT", "BOTTOM RIGHT", -90, -65 );
  431. self.carryIcon.alpha = 0.75;
  432. }
  433. self.carryIcon.hidewheninmenu = true;
  434. self thread hideCarryIconOnGameEnd();
  435. }
  436. else
  437. {
  438. self.isPlanting = false;
  439. self.isDefusing = false;
  440. self.isBombCarrier = false;
  441.  
  442. if ( isDefined( self.carryIcon ) )
  443. {
  444. self.carryIcon Destroy();
  445. }
  446. }
  447.  
  448. level notify ( "spawned_player" );
  449. }
  450.  
  451.  
  452. hideCarryIconOnGameEnd()
  453. {
  454. self endon( "disconnect" );
  455.  
  456. level waittill( "game_ended" );
  457.  
  458. if ( isDefined( self.carryIcon ) )
  459. self.carryIcon.alpha = 0;
  460. }
  461.  
  462.  
  463. dd_endGame( winningTeam, endReasonText )
  464. {
  465. if ( winningTeam == "tie" )
  466. level.finalKillCam_winner = "none";
  467. else
  468. level.finalKillCam_winner = winningTeam;
  469.  
  470. thread maps\mp\gametypes\_gamelogic::endGame( winningTeam, endReasonText );
  471. }
  472.  
  473.  
  474. onDeadEvent( team )
  475. {
  476. if ( level.bombExploded || level.bombDefused )
  477. return;
  478.  
  479. if ( team == "all" )
  480. {
  481. if ( level.bombPlanted )
  482. dd_endGame( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] );
  483. else
  484. dd_endGame( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] );
  485. }
  486. else if ( team == game["attackers"] )
  487. {
  488. if ( level.bombPlanted )
  489. return;
  490.  
  491. level thread dd_endGame( game["defenders"], game["strings"][game["attackers"]+"_eliminated"] );
  492. }
  493. else if ( team == game["defenders"] )
  494. {
  495. level thread dd_endGame( game["attackers"], game["strings"][game["defenders"]+"_eliminated"] );
  496. }
  497. }
  498.  
  499.  
  500. onNormalDeath( victim, attacker, lifeId )
  501. {
  502. score = maps\mp\gametypes\_rank::getScoreInfoValue( "kill" );
  503. assert( isDefined( score ) );
  504.  
  505. team = victim.team;
  506.  
  507. if ( game["state"] == "postgame" && (victim.team == game["defenders"] || !level.bombPlanted) )
  508. attacker.finalKill = true;
  509.  
  510. if ( victim.isPlanting )
  511. {
  512. thread maps\mp\_matchdata::logKillEvent( lifeId, "planting" );
  513.  
  514. attacker incPersStat( "defends", 1 );
  515. attacker maps\mp\gametypes\_persistence::statSetChild( "round", "defends", attacker.pers["defends"] );
  516.  
  517. }
  518. else if ( victim.isDefusing )
  519. {
  520. thread maps\mp\_matchdata::logKillEvent( lifeId, "defusing" );
  521.  
  522. attacker incPersStat( "defends", 1 );
  523. attacker maps\mp\gametypes\_persistence::statSetChild( "round", "defends", attacker.pers["defends"] );
  524. }
  525. }
  526.  
  527.  
  528. onTimeLimit()
  529. {
  530. if ( inOvertime() )
  531. {
  532. dd_endGame( "tie", game["strings"]["time_limit_reached"] );
  533. }
  534. else
  535. {
  536. dd_endGame( game["defenders"], game["strings"]["time_limit_reached"] );
  537. }
  538. }
  539.  
  540.  
  541. updateGametypeDvars()
  542. {
  543. level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 );
  544. level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 );
  545. level.bombTimer = dvarIntValue( "bombtimer", 45, 1, 300 );
  546. level.ddTimeToAdd = dvarFloatValue( "addtime", 2, 0, 5 );; //how much time is added to the match when a target is destroyed
  547. }
  548.  
  549.  
  550. verifyBombzones( bombZones )
  551. {
  552. missing = "";
  553. if ( bombZones.size != 3 )
  554. {
  555. foundA = false;
  556. foundB = false;
  557. foundC = false;
  558. foreach ( bombZone in BombZones )
  559. {
  560. if ( isSubStr( toLower( bombZone.script_label ), "a" ) )
  561. foundA = true;
  562. else if ( isSubStr( toLower( bombZone.script_label ), "b" ) )
  563. foundB = true;
  564. else if ( isSubStr( toLower( bombZone.script_label ), "c" ) )
  565. foundC = true;
  566. }
  567. if ( !foundA )
  568. missing += " A ";
  569. if ( !foundB )
  570. missing += " B ";
  571. if ( !foundC )
  572. missing += " C ";
  573. }
  574. if ( missing != "" )
  575. assertMsg( "Bombzones:" + missing + "missing." );
  576. }
  577.  
  578.  
  579. bombs()
  580. {
  581. level.bombPlanted = false;
  582. level.bombDefused = false;
  583. level.bombExploded = 0;
  584.  
  585. level.bombZones = [];
  586. bombZones = getEntArray( "dd_bombzone", "targetname" );
  587. verifyBombzones( bombZones );
  588.  
  589. // loop and create interaction elements for bomb sites
  590. for ( index = 0; index < bombZones.size; index++ )
  591. {
  592. // get the trigger and visuals for the bombsite
  593. trigger = bombZones[index];
  594. visuals = getEntArray( bombZones[index].target, "targetname" );
  595. label = bombZones[index].script_label;
  596. collision = getEnt( "dd_bombzone_clip" + label, "targetname" );
  597. if ( inOverTime() )
  598. {
  599. // remove A and B in overtime
  600. if ( label == "_a" || label == "_b" )
  601. {
  602. trigger delete();
  603. visuals[0] delete();
  604. collision delete();
  605. continue;
  606. }
  607.  
  608. // create neutral bombsite
  609. bombZone = maps\mp\gametypes\_gameobjects::createUseObject( "neutral", trigger, visuals, (0,0,64) );
  610. bombZone maps\mp\gametypes\_gameobjects::allowUse( "any" );
  611. }
  612. else
  613. {
  614. // remove C in rounds 1 and 2
  615. if ( label == "_c" )
  616. {
  617. trigger delete();
  618. visuals[0] delete();
  619. collision delete();
  620. continue;
  621. }
  622.  
  623. // create defender bombsites
  624. bombZone = maps\mp\gametypes\_gameobjects::createUseObject( game["defenders"], trigger, visuals, (0,0,64) );
  625. bombZone maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  626. }
  627.  
  628. bombZone maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime );
  629. bombZone maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" );
  630. bombZone maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
  631. bombZone maps\mp\gametypes\_gameobjects::setKeyObject( level.ddBomb );
  632.  
  633. // from this point on, in overtime, the neutral bombsite C will be labeled _a
  634. // the label will only be used to utilize the existing dvars for hud timer display
  635. if ( inOverTime() )
  636. label = "_a";
  637.  
  638. bombZone.label = label;
  639. bombZone.index = index;
  640. if ( inOvertime() )
  641. {
  642. bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_target" );
  643. bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_target" );
  644. bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_target" );
  645. bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" );
  646. }
  647. else
  648. {
  649. bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defend" + label );
  650. bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" + label );
  651. bombZone maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_target" + label );
  652. bombZone maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" + label );
  653. }
  654. bombZone maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  655. bombZone.onBeginUse = ::onBeginUse;
  656. bombZone.onEndUse = ::onEndUse;
  657. bombZone.onUse = ::onUseObject;
  658. bombZone.onCantUse = ::onCantUse;
  659. bombZone.useWeapon = "briefcase_bomb_mp";
  660. bombZone.bombPlanted = false;
  661.  
  662. bombZone.visuals[0] thread setupKillCamEnt();
  663.  
  664. for ( i = 0; i < visuals.size; i++ )
  665. {
  666. if ( isDefined( visuals[i].script_exploder ) )
  667. {
  668. bombZone.exploderIndex = visuals[i].script_exploder;
  669. break;
  670. }
  671. }
  672.  
  673. level.bombZones[level.bombZones.size] = bombZone;
  674.  
  675. bombZone.bombDefuseTrig = getent( visuals[0].target, "targetname" );
  676. assert( isdefined( bombZone.bombDefuseTrig ) );
  677. bombZone.bombDefuseTrig.origin += (0,0,-10000);
  678. bombZone.bombDefuseTrig.label = label;
  679. }
  680.  
  681. for ( index = 0; index < level.bombZones.size; index++ )
  682. {
  683. array = [];
  684. for ( otherindex = 0; otherindex < level.bombZones.size; otherindex++ )
  685. {
  686. if ( otherindex != index )
  687. array[ array.size ] = level.bombZones[otherindex];
  688. }
  689. level.bombZones[index].otherBombZones = array;
  690. }
  691. }
  692.  
  693. setupKillCamEnt() // self == bombZone.visuals[0]
  694. {
  695. tempOrg = Spawn( "script_origin", self.origin );
  696. tempOrg.angles = self.angles;
  697. tempOrg RotateYaw( -45, 0.05 );
  698. wait( 0.05 );
  699. bulletStart = self.origin + ( 0, 0, 5 );
  700. bulletEnd = ( self.origin + ( AnglesToForward( tempOrg.angles ) * 100 ) ) + ( 0, 0, 128 );
  701. result = BulletTrace( bulletStart, bulletEnd, false, self );
  702. self.killCamEnt = Spawn( "script_model", result[ "position" ] );
  703. tempOrg delete();
  704. /#
  705. self.killCamEnt thread debugKillCamEnt( self );
  706. #/
  707. }
  708.  
  709. /#
  710. debugKillCamEnt( visual ) // self == visuals[i].killCamEnt
  711. {
  712. self endon( "death" );
  713. level endon( "game_ended" );
  714. visual endon( "death" );
  715.  
  716. while( true )
  717. {
  718. if( GetDvarInt( "scr_dd_debugBombKillCamEnt" ) > 0 )
  719. {
  720. // show the kill cam ent
  721. Line( self.origin, self.origin + ( AnglesToForward( self.angles ) * 10 ), ( 1, 0, 0 ) );
  722. Line( self.origin, self.origin + ( AnglesToRight( self.angles ) * 10 ), ( 0, 1, 0 ) );
  723. Line( self.origin, self.origin + ( AnglesToUp( self.angles ) * 10 ), ( 0, 0, 1 ) );
  724.  
  725. // line from bomb site to kill cam ent
  726. Line( visual.origin + ( 0, 0, 5 ), self.origin, ( 0, 0, 1 ) );
  727.  
  728. // bomb site angles
  729. Line( visual.origin, visual.origin + ( AnglesToForward( visual.angles ) * 10 ), ( 1, 0, 0 ) );
  730. Line( visual.origin, visual.origin + ( AnglesToRight( visual.angles ) * 10 ), ( 0, 1, 0 ) );
  731. Line( visual.origin, visual.origin + ( AnglesToUp( visual.angles ) * 10 ), ( 0, 0, 1 ) );
  732. }
  733. wait( 0.05 );
  734. }
  735. }
  736. #/
  737.  
  738. onUseObject( player )
  739. {
  740. team = player.pers["team"];
  741. otherTeam = level.otherTeam[team];
  742.  
  743. if ( ( inOverTime() && self.bombPlanted == false ) || ( !inOvertime() && !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) )
  744. {
  745. self.bombPlanted = true;
  746. player notify ( "bomb_planted" );
  747. player playSound( "mp_bomb_plant" );
  748.  
  749. thread teamPlayerCardSplash( "callout_bombplanted", player );
  750.  
  751. player notify ( "objective", "plant" );
  752.  
  753. //iPrintLn( &"MP_EXPLOSIVES_PLANTED_BY", player );
  754. leaderDialog( "bomb_planted" );
  755.  
  756. player thread maps\mp\gametypes\_hud_message::SplashNotify( "plant", maps\mp\gametypes\_rank::getScoreInfoValue( "plant" ) );
  757. player thread maps\mp\gametypes\_rank::giveRankXP( "plant" );
  758. maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player );
  759. player incPlayerStat( "bombsplanted", 1 );
  760. player thread maps\mp\_matchdata::logGameEvent( "plant", player.origin );
  761. player.bombPlantedTime = getTime();
  762.  
  763. player incPersStat( "plants", 1 );
  764. player maps\mp\gametypes\_persistence::statSetChild( "round", "plants", player.pers["plants"] );
  765.  
  766. level thread bombPlanted( self, player );
  767.  
  768. level.bombOwner = player;
  769. self.useWeapon = "briefcase_bomb_defuse_mp";
  770. }
  771. else // defused the bomb
  772. {
  773. self.bombPlanted = false;
  774. self thread bombHandler( player, "defused" );
  775. player notify ( "objective", "defuse" );
  776. }
  777. }
  778.  
  779.  
  780. resetBombZone()
  781. {
  782. if ( inOvertime() )
  783. {
  784. self maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" );
  785. self maps\mp\gametypes\_gameobjects::allowUse( "any" );
  786. friendlyIcon = "waypoint_target";
  787. enemyIcon = "waypoint_target";
  788. }
  789. else
  790. {
  791. self maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  792. friendlyIcon = "waypoint_defend" + self.label;
  793. enemyIcon = "waypoint_target" + self.label;
  794. }
  795. self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime );
  796. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" );
  797. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
  798. self maps\mp\gametypes\_gameobjects::setKeyObject( level.ddBomb );
  799. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", friendlyIcon );
  800. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", friendlyIcon );
  801. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", enemyIcon );
  802. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", enemyIcon );
  803. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  804. self.useWeapon = "briefcase_bomb_mp";
  805. }
  806.  
  807. setUpForDefusing()
  808. {
  809. if ( inOvertime() )
  810. {
  811. friendlyIcon = "waypoint_defuse";
  812. enemyIcon = "waypoint_defend";
  813. }
  814. else
  815. {
  816. friendlyIcon = "waypoint_defuse" + self.label;
  817. enemyIcon = "waypoint_defend" + self.label;
  818. }
  819.  
  820. self maps\mp\gametypes\_gameobjects::allowUse( "friendly" );
  821. self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime );
  822. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" );
  823. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
  824. self maps\mp\gametypes\_gameobjects::setKeyObject( undefined );
  825. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", friendlyIcon );
  826. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", friendlyIcon );
  827. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", enemyIcon );
  828. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", enemyIcon );
  829. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  830. }
  831.  
  832. onBeginUse( player )
  833. {
  834. if ( ( inOverTime() && self.bombPlanted == true ) || ( !inOvertime() && self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) ) )
  835. {
  836. player playSound( "mp_bomb_defuse" );
  837. player.isDefusing = true;
  838.  
  839. bestDistance = 9000000;
  840. closestBomb = undefined;
  841.  
  842. if ( isDefined( level.ddBombModel ) )
  843. {
  844. foreach ( bomb in level.ddBombModel )
  845. {
  846. if ( !isDefined( bomb ) )
  847. continue;
  848.  
  849. dist = distanceSquared( player.origin, bomb.origin );
  850.  
  851. if ( dist < bestDistance )
  852. {
  853. bestDistance = dist;
  854. closestBomb = bomb;
  855. }
  856. }
  857.  
  858. assert( isDefined(closestBomb) );
  859. player.defusing = closestBomb;
  860. closestBomb hide();
  861. }
  862. }
  863. else
  864. {
  865. player.isPlanting = true;
  866. }
  867. }
  868.  
  869. onEndUse( team, player, result )
  870. {
  871. if ( !isDefined( player ) )
  872. return;
  873.  
  874. if ( player.isDefusing )
  875. {
  876. if ( isDefined( player.defusing ) && !result )
  877. {
  878. player.defusing show();
  879. }
  880. }
  881.  
  882. if ( isAlive( player ) )
  883. {
  884. player.isDefusing = false;
  885. player.isPlanting = false;
  886. }
  887. }
  888.  
  889. onCantUse( player )
  890. {
  891. player iPrintLnBold( &"MP_BOMBSITE_IN_USE" );
  892. }
  893.  
  894. onReset()
  895. {
  896. }
  897.  
  898. bombPlanted( destroyedObj, player )
  899. {
  900. destroyedObj endon( "defused" );
  901.  
  902. playerTeam = player.team;
  903.  
  904. level.bombsPlanted += 1;
  905. self setBombTimerDvar();
  906. maps\mp\gametypes\_gamelogic::pauseTimer();
  907. level.timePauseStart = getTime();
  908. level.timeLimitOverride = true;
  909.  
  910. level.bombPlanted = true;
  911. level.destroyedObject = destroyedObj;
  912.  
  913. // not used in overtime, just for spawns in rounds 1 and 2
  914. if ( level.destroyedObject.label == "_a" )
  915. level.aPlanted = true;
  916. else
  917. level.bPlanted = true;
  918.  
  919. level.destroyedObject.bombPlanted = true;
  920.  
  921. destroyedObj.visuals[0] thread playDemolitionTickingSound(destroyedObj);
  922. level.tickingObject = destroyedObj.visuals[0];
  923.  
  924. self dropBombModel( player, destroyedObj.label );
  925. destroyedObj.bombDefused = false;
  926. destroyedObj maps\mp\gametypes\_gameobjects::allowUse( "none" );
  927. destroyedObj maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  928. if ( inOvertime() )
  929. destroyedObj Maps\mp\gametypes\_gameobjects::setOwnerTeam( level.otherTeam[player.team] );
  930. destroyedObj setUpForDefusing();
  931.  
  932. destroyedObj BombTimerWait(destroyedObj); //waits for bomb to explode!
  933.  
  934. destroyedObj thread bombHandler( player ,"explode", playerTeam );
  935.  
  936. }
  937.  
  938. bombHandler( player, destType, playerTeam ) // playerTeam needed because bombHandler is called after a wait so the player could be gone
  939. {
  940. self.visuals[0] notify( "stopTicking" );
  941. level.bombsPlanted -= 1;
  942.  
  943. // not used in overtime, just for spawns in rounds 1 and 2
  944. if ( self.label == "_a" )
  945. level.aPlanted = false;
  946. else
  947. level.bPlanted = false;
  948.  
  949. self restartTimer();
  950. self setBombTimerDvar();
  951.  
  952. setDvar( "ui_bombtimer" + self.label, -1 );
  953. //self maps\mp\gametypes\_gameobjects::updateTimer( 0, false );
  954.  
  955. if ( level.gameEnded )
  956. return;
  957.  
  958. if ( destType == "explode" )
  959. {
  960. level notify("bomb_exploded" + self.label);
  961. level.bombExploded += 1;
  962.  
  963. explosionOrigin = self.curorigin;
  964. level.ddBombModel[ self.label ] Delete();
  965.  
  966. if ( isdefined( player ) )
  967. {
  968. self.visuals[0] RadiusDamage( explosionOrigin, 512, 200, 20, player, "MOD_EXPLOSIVE", "bomb_site_mp" );
  969.  
  970. //targets destroyed used for award
  971. player incPlayerStat( "targetsdestroyed", 1 );
  972. player incPersStat( "destructions", 1 );
  973. player maps\mp\gametypes\_persistence::statSetChild( "round", "destructions", player.pers["destructions"] );
  974. }
  975. else
  976. {
  977. self.visuals[0] RadiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "bomb_site_mp" );
  978. }
  979.  
  980. rot = randomfloat(360);
  981. explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
  982. triggerFx( explosionEffect );
  983.  
  984. PlayRumbleOnPosition( "grenade_rumble", explosionOrigin );
  985. earthquake( 0.75, 2.0, explosionOrigin, 2000 );
  986. wii_play_grenade_rumble( explosionOrigin );
  987.  
  988. thread playSoundinSpace( "exp_suitcase_bomb_main", explosionOrigin );
  989.  
  990. if ( isDefined( self.exploderIndex ) )
  991. exploder( self.exploderIndex );
  992.  
  993. self maps\mp\gametypes\_gameobjects::disableObject();
  994.  
  995. if ( !inOvertime() && level.bombExploded < 2 )
  996. {
  997. foreach ( splashPlayer in level.players )
  998. splashPlayer thread maps\mp\gametypes\_hud_message::SplashNotify( "time_added" );
  999. }
  1000.  
  1001. wait 2;
  1002.  
  1003. if ( inOvertime() || level.bombExploded > 1 )
  1004. dd_endGame( playerTeam, game["strings"]["target_destroyed"] );
  1005. else
  1006. level thread teamPlayerCardSplash( "callout_time_added", player );
  1007. }
  1008. else //defused
  1009. {
  1010. player notify ( "bomb_defused" );
  1011. self notify( "defused" );
  1012.  
  1013. // if ( !level.hardcoreMode )
  1014. // iPrintLn( &"MP_EXPLOSIVES_DEFUSED_BY", player );
  1015.  
  1016. leaderDialog( "bomb_defused" );
  1017.  
  1018. level thread teamPlayerCardSplash( "callout_bombdefused", player );
  1019.  
  1020. level thread bombDefused( self );
  1021. self resetBombzone();
  1022.  
  1023. if ( isDefined( level.bombOwner ) && ( level.bombOwner.bombPlantedTime + 4000 + (level.defuseTime*1000) ) > getTime() && isReallyAlive( level.bombOwner ) )
  1024. player thread maps\mp\gametypes\_hud_message::SplashNotify( "ninja_defuse", ( maps\mp\gametypes\_rank::getScoreInfoValue( "defuse" ) ) );
  1025. else
  1026. player thread maps\mp\gametypes\_hud_message::SplashNotify( "defuse", maps\mp\gametypes\_rank::getScoreInfoValue( "defuse" ) );
  1027.  
  1028. player thread maps\mp\gametypes\_rank::giveRankXP( "defuse" );
  1029. maps\mp\gametypes\_gamescore::givePlayerScore( "defuse", player );
  1030.  
  1031. player incPlayerStat( "bombsdefused", 1 );
  1032. player incPersStat( "defuses", 1 );
  1033. player maps\mp\gametypes\_persistence::statSetChild( "round", "defuses", player.pers["defuses"] );
  1034.  
  1035. player thread maps\mp\_matchdata::logGameEvent( "defuse", player.origIn );
  1036. }
  1037.  
  1038. }
  1039.  
  1040. playDemolitionTickingSound( site )
  1041. {
  1042. self endon("death");
  1043. self endon("stopTicking");
  1044. level endon("game_ended");
  1045.  
  1046. while(1)
  1047. {
  1048. self playSound( "ui_mp_suitcasebomb_timer" );
  1049.  
  1050. if ( !isDefined( site.waitTime ) || site.waitTime > 10 )
  1051. wait 1.0;
  1052. else if ( isDefined( site.waitTime ) && site.waitTime > 5 )
  1053. wait 0.5;
  1054. else
  1055. wait 0.25;
  1056. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  1057. }
  1058. }
  1059.  
  1060. setBombTimerDvar()
  1061. {
  1062. println( "BOMBS PLANTED: " + level.bombsPlanted );
  1063.  
  1064. if ( level.bombsPlanted == 1 )
  1065. setDvar( "ui_bomb_timer", 2 );
  1066. else if ( level.bombsPlanted == 2 )
  1067. setDvar( "ui_bomb_timer", 3 );
  1068. else
  1069. setDvar( "ui_bomb_timer", 0 );
  1070. }
  1071.  
  1072.  
  1073. dropBombModel( player, site )
  1074. {
  1075. trace = bulletTrace( player.origin + (0,0,20), player.origin - (0,0,2000), false, player );
  1076.  
  1077. tempAngle = randomfloat( 360 );
  1078. forward = (cos( tempAngle ), sin( tempAngle ), 0);
  1079. forward = VectorNormalize( forward - ( trace[ "normal" ] * VectorDot( forward, trace[ "normal" ] ) ) );
  1080. dropAngles = vectortoangles( forward );
  1081.  
  1082. level.ddBombModel[ site ] = spawn( "script_model", trace["position"] );
  1083. level.ddBombModel[ site ].angles = dropAngles;
  1084. level.ddBombModel[ site ] setModel( "prop_suitcase_bomb" );
  1085. }
  1086.  
  1087.  
  1088. restartTimer()
  1089. {
  1090. if ( level.bombsPlanted <= 0 )
  1091. {
  1092. maps\mp\gametypes\_gamelogic::resumeTimer();
  1093. level.timePaused = ( getTime() - level.timePauseStart ) ;
  1094. level.timeLimitOverride = false;
  1095. }
  1096. }
  1097.  
  1098.  
  1099. BombTimerWait(siteLoc)
  1100. {
  1101. level endon("game_ended");
  1102. level endon("bomb_defused" + siteLoc.label );
  1103.  
  1104. if ( inOverTime() )
  1105. siteLoc.waitTime = level.bombTimer; // might add player option for overtime bomb timer, use bomb timer for now
  1106. else
  1107. siteLoc.waitTime = level.bombTimer;
  1108.  
  1109. level thread update_ui_timers( siteLoc );
  1110.  
  1111. while ( siteLoc.waitTime >= 0 )
  1112. {
  1113. siteLoc.waitTime--;
  1114.  
  1115. //self maps\mp\gametypes\_gameobjects::updateTimer( waitTime, true );
  1116.  
  1117. if ( siteLoc.waitTime >= 0 )
  1118. wait( 1 );
  1119.  
  1120. maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  1121. }
  1122. }
  1123.  
  1124. update_ui_timers( siteLoc )
  1125. {
  1126. level endon ( "game_ended" );
  1127. level endon ( "disconnect" );
  1128. level endon ( "bomb_defused" + siteLoc.label );
  1129. level endon ( "bomb_exploded" + siteLoc.label );
  1130.  
  1131. bombEndMilliseconds = (siteLoc.waitTime * 1000) + gettime();
  1132. SetDvar( "ui_bombtimer" + siteLoc.label, bombEndMilliseconds );
  1133.  
  1134. level waittill( "host_migration_begin" );
  1135.  
  1136. timePassed = maps\mp\gametypes\_hostmigration::waitTillHostMigrationDone();
  1137.  
  1138. if ( timePassed > 0 )
  1139. {
  1140. SetDvar( "ui_bombtimer" + siteLoc.label, bombEndMilliseconds + timePassed );
  1141. }
  1142. }
  1143.  
  1144. bombDefused( siteDefused )
  1145. {
  1146. level.tickingObject maps\mp\gametypes\_gamelogic::stopTickingSound();
  1147. siteDefused.bombDefused = true;
  1148. self setBombTimerDvar();
  1149.  
  1150. setDvar( "ui_bombtimer" + siteDefused.label, -1 );
  1151.  
  1152. level notify("bomb_defused" + siteDefused.label);
  1153. }
  1154.  
  1155. initGametypeAwards()
  1156. {
  1157. maps\mp\_awards::initStatAward( "targetsdestroyed", 0, maps\mp\_awards::highestWins );
  1158. maps\mp\_awards::initStatAward( "bombsplanted", 0, maps\mp\_awards::highestWins );
  1159. maps\mp\_awards::initStatAward( "bombsdefused", 0, maps\mp\_awards::highestWins );
  1160. maps\mp\_awards::initStatAward( "bombcarrierkills", 0, maps\mp\_awards::highestWins );
  1161. maps\mp\_awards::initStatAward( "bombscarried", 0, maps\mp\_awards::highestWins );
  1162. maps\mp\_awards::initStatAward( "killsasbombcarrier", 0, maps\mp\_awards::highestWins );
  1163. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement