Advertisement
Guest User

Untitled

a guest
Sep 29th, 2010
173
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 29.15 KB | None | 0 0
  1. #include common_scripts\utility;
  2. #include maps\mp\_utility;
  3. #include maps\mp\gametypes\_hud_util;
  4. /*
  5. Sabotage
  6.  
  7. // ...etc...
  8. */
  9.  
  10. /*QUAKED mp_sab_spawn_axis (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  11. Axis players spawn away from enemies and near their team at one of these positions.*/
  12.  
  13. /*QUAKED mp_sab_spawn_axis_planted (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  14. Axis players spawn away from enemies and near their team at one of these positions.*/
  15.  
  16. /*QUAKED mp_sab_spawn_allies (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  17. Allied players spawn away from enemies and near their team at one of these positions.*/
  18.  
  19. /*QUAKED mp_sab_spawn_allies_planted (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  20. Allied players spawn away from enemies and near their team at one of these positions.*/
  21.  
  22. /*QUAKED mp_sab_spawn_axis_start (1.0 0.0 0.5) (-16 -16 0) (16 16 72)
  23. Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  24.  
  25. /*QUAKED mp_sab_spawn_allies_start (0.0 1.0 0.5) (-16 -16 0) (16 16 72)
  26. Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  27.  
  28. main()
  29. {
  30. if ( getdvar("mapname") == "mp_background" )
  31. return;
  32.  
  33. maps\mp\gametypes\_globallogic::init();
  34. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  35. maps\mp\gametypes\_globallogic::SetupCallbacks();
  36.  
  37. //level.objectiveBased = true;
  38. level.teamBased = true;
  39.  
  40. registerRoundSwitchDvar( level.gameType, 0, 0, 9 );
  41. registerTimeLimitDvar( level.gameType, 10, 0, 1440 );
  42. registerScoreLimitDvar( level.gameType, 0, 0, 500 );
  43. registerRoundLimitDvar( level.gameType, 1, 0, 10 );
  44. registerWinLimitDvar( level.gameType, 1, 0, 10 );
  45. registerNumLivesDvar( level.gameType, 0, 0, 10 );
  46. registerHalfTimeDvar( level.gameType, 0, 0, 1 );
  47.  
  48. setOverTimeLimitDvar( 2 );
  49.  
  50. level.onPrecacheGameType = ::onPrecacheGameType;
  51. level.onStartGameType = ::onStartGameType;
  52. level.getSpawnPoint = ::getSpawnPoint;
  53. level.onSpawnPlayer = ::onSpawnPlayer;
  54. level.onOneLeftEvent = ::onOneLeftEvent;
  55. level.onTimeLimit = ::onTimeLimit;
  56. level.onNormalDeath = ::onNormalDeath;
  57. level.initGametypeAwards = ::initGametypeAwards;
  58.  
  59. game["dialog"]["gametype"] = "sabotage";
  60.  
  61. if ( getDvarInt( "g_hardcore" ) )
  62. game["dialog"]["gametype"] = "hc_" + game["dialog"]["gametype"];
  63. else if ( getDvarInt( "camera_thirdPerson" ) )
  64. game["dialog"]["gametype"] = "thirdp_" + game["dialog"]["gametype"];
  65. else if ( getDvarInt( "scr_diehard" ) )
  66. game["dialog"]["gametype"] = "dh_" + game["dialog"]["gametype"];
  67. else if (getDvarInt( "scr_" + level.gameType + "_promode" ) )
  68. game["dialog"]["gametype"] = game["dialog"]["gametype"] + "_pro";
  69.  
  70. game["dialog"]["offense_obj"] = "capture_obj";
  71. game["dialog"]["defense_obj"] = "capture_obj";
  72.  
  73. badtrig = getent( "sab_bomb_defuse_allies", "targetname" );
  74. if ( isdefined( badtrig ) )
  75. badtrig delete();
  76.  
  77. badtrig = getent( "sab_bomb_defuse_axis", "targetname" );
  78. if ( isdefined( badtrig ) )
  79. badtrig delete();
  80. }
  81.  
  82. onPrecacheGameType()
  83. {
  84. game["bomb_dropped_sound"] = "mp_war_objective_lost";
  85. game["bomb_recovered_sound"] = "mp_war_objective_taken";
  86.  
  87. precacheShader("waypoint_bomb");
  88. precacheShader("waypoint_kill");
  89. precacheShader("waypoint_bomb_enemy");
  90. precacheShader("waypoint_defend");
  91. precacheShader("waypoint_defuse");
  92. precacheShader("waypoint_target");
  93. precacheShader("waypoint_escort");
  94. precacheShader("waypoint_bomb");
  95. precacheShader("waypoint_defend");
  96. precacheShader("waypoint_defuse");
  97. precacheShader("waypoint_target");
  98. precacheShader("hud_suitcase_bomb");
  99.  
  100. precacheString(&"MP_EXPLOSIVES_RECOVERED_BY");
  101. precacheString(&"MP_EXPLOSIVES_DROPPED_BY");
  102. precacheString(&"MP_EXPLOSIVES_PLANTED_BY");
  103. precacheString(&"MP_EXPLOSIVES_DEFUSED_BY");
  104. precacheString(&"MP_YOU_HAVE_RECOVERED_THE_BOMB");
  105. precacheString(&"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES");
  106. precacheString(&"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES");
  107. precacheString(&"MP_PLANTING_EXPLOSIVE");
  108. precacheString(&"MP_DEFUSING_EXPLOSIVE");
  109. precacheString(&"MP_TARGET_DESTROYED");
  110. precacheString(&"MP_NO_RESPAWN");
  111. precacheString(&"MP_TIE_BREAKER");
  112. precacheString(&"MP_NO_RESPAWN");
  113. precacheString(&"MP_SUDDEN_DEATH");
  114. }
  115.  
  116.  
  117. onStartGameType()
  118. {
  119. if ( !isdefined( game["switchedsides"] ) )
  120. game["switchedsides"] = false;
  121.  
  122. setClientNameMode("auto_change");
  123.  
  124. game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED";
  125. game["strings"]["target_defended"] = &"MP_TARGET_DEDEFEND";
  126.  
  127. setObjectiveText( "allies", &"OBJECTIVES_SAB" );
  128. setObjectiveText( "axis", &"OBJECTIVES_SAB" );
  129.  
  130. if ( level.splitscreen )
  131. {
  132. setObjectiveScoreText( "allies", &"OBJECTIVES_SAB" );
  133. setObjectiveScoreText( "axis", &"OBJECTIVES_SAB" );
  134. }
  135. else
  136. {
  137. setObjectiveScoreText( "allies", &"OBJECTIVES_SAB_SCORE" );
  138. setObjectiveScoreText( "axis", &"OBJECTIVES_SAB_SCORE" );
  139. }
  140. setObjectiveHintText( "allies", &"OBJECTIVES_SAB_HINT" );
  141. setObjectiveHintText( "axis", &"OBJECTIVES_SAB_HINT" );
  142.  
  143. level.spawnMins = ( 0, 0, 0 );
  144. level.spawnMaxs = ( 0, 0, 0 );
  145. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" );
  146. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" );
  147. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_sab_spawn_allies" );
  148. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_sab_spawn_axis" );
  149. maps\mp\gametypes\_spawnlogic::addSpawnPoints("allies", "mp_sab_spawn_allies_planted", true );
  150. maps\mp\gametypes\_spawnlogic::addSpawnPoints("axis", "mp_sab_spawn_axis_planted", true );
  151.  
  152. level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
  153. setMapCenter( level.mapCenter );
  154.  
  155. level.spawn_axis = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis" );
  156. level.spawn_axis_planted = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis_planted" );
  157. level.spawn_axis_planted = array_combine( level.spawn_axis_planted, level.spawn_axis );
  158.  
  159. level.spawn_allies = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies" );
  160. level.spawn_allies_planted = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies_planted" );
  161. level.spawn_allies_planted = array_combine( level.spawn_allies_planted, level.spawn_allies );
  162.  
  163. level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis_start" );
  164. level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies_start" );
  165.  
  166. maps\mp\gametypes\_rank::registerScoreInfo( "plant", 200 );
  167. maps\mp\gametypes\_rank::registerScoreInfo( "destroy", 1000 );
  168. maps\mp\gametypes\_rank::registerScoreInfo( "defuse", 150 );
  169.  
  170. allowed[0] = "sab";
  171. maps\mp\gametypes\_gameobjects::main(allowed);
  172.  
  173. thread updateGametypeDvars();
  174.  
  175. thread sabotage();
  176. }
  177.  
  178.  
  179. getSpawnPoint()
  180. {
  181. spawnteam = self.pers["team"];
  182. if ( game["switchedsides"] )
  183. spawnteam = getOtherTeam( spawnteam );
  184.  
  185. if ( level.useStartSpawns )
  186. {
  187. if (spawnteam == "axis")
  188. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
  189. else
  190. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
  191. }
  192. else
  193. {
  194. if ( isDefined( level.bombplanted ) && level.bombplanted && ( isDefined( level.bombOwner ) && spawnTeam == level.bombOwner.team ) )
  195. {
  196. if (spawnteam == "axis")
  197. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_axis_planted );
  198. else
  199. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam( level.spawn_allies_planted );
  200.  
  201. }
  202. else
  203. {
  204. if (spawnteam == "axis")
  205. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis);
  206. else
  207. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies);
  208. }
  209. }
  210.  
  211. assert( isDefined(spawnpoint) );
  212.  
  213. return spawnpoint;
  214. }
  215.  
  216.  
  217. onSpawnPlayer()
  218. {
  219. self.isPlanting = false;
  220. self.isDefusing = false;
  221. self.isBombCarrier = false;
  222.  
  223. if( ( inOvertime() ) && !isDefined( self.otSpawned ) )
  224. self thread printOTHint();
  225. }
  226.  
  227.  
  228. printOTHint()
  229. {
  230. self endon ( "disconnect" );
  231.  
  232. // give the "Overtime!" message time to show
  233. wait ( 0.25 );
  234.  
  235. self thread maps\mp\gametypes\_hud_message::SplashNotify( "sudden_death" );
  236. self.otSpawned = true;
  237.  
  238. }
  239.  
  240. updateGametypeDvars()
  241. {
  242. level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 );
  243. level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 );
  244. level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 );
  245. level.hotPotato = dvarIntValue( "hotpotato", 1, 0, 1 );
  246. level.scoreMode = getWatchedDvar( "scorelimit" );
  247. }
  248.  
  249.  
  250. sabotage()
  251. {
  252. level.bombPlanted = false;
  253. level.bombExploded = false;
  254.  
  255. level._effect["bombexplosion"] = loadfx("explosions/tanker_explosion");
  256.  
  257. trigger = getEnt( "sab_bomb_pickup_trig", "targetname" );
  258. if ( !isDefined( trigger ) )
  259. {
  260. error( "No sab_bomb_pickup_trig trigger found in map." );
  261. return;
  262. }
  263.  
  264. visuals[0] = getEnt( "sab_bomb", "targetname" );
  265. if ( !isDefined( visuals[0] ) )
  266. {
  267. error( "No sab_bomb script_model found in map." );
  268. return;
  269. }
  270.  
  271. precacheModel( "prop_suitcase_bomb" );
  272. visuals[0] setModel( "prop_suitcase_bomb" );
  273. level.sabBomb = maps\mp\gametypes\_gameobjects::createCarryObject( "neutral", trigger, visuals, (0,0,32) );
  274. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" );
  275. level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_bomb" );
  276. level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
  277. level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_bomb" );
  278. level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
  279. level.sabBomb maps\mp\gametypes\_gameobjects::setCarryIcon( "hud_suitcase_bomb" );
  280. level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  281. level.sabBomb.objIDPingEnemy = true;
  282. level.sabBomb.onPickup = ::onPickup;
  283. level.sabBomb.onDrop = ::onDrop;
  284. level.sabBomb.allowWeapons = true;
  285. level.sabBomb.objPoints["allies"].archived = true;
  286. level.sabBomb.objPoints["axis"].archived = true;
  287. level.sabBomb.autoResetTime = 60.0;
  288.  
  289. if ( !isDefined( getEnt( "sab_bomb_axis", "targetname" ) ) )
  290. {
  291. error("No sab_bomb_axis trigger found in map.");
  292. return;
  293. }
  294. if ( !isDefined( getEnt( "sab_bomb_allies", "targetname" ) ) )
  295. {
  296. error("No sab_bomb_allies trigger found in map.");
  297. return;
  298. }
  299.  
  300. if ( game["switchedsides"] )
  301. {
  302. level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_axis", "targetname" ) );
  303. level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_allies", "targetname" ) );
  304. }
  305. else
  306. {
  307. level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_allies", "targetname" ) );
  308. level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_axis", "targetname" ) );
  309. }
  310.  
  311. if ( level.scoreMode )
  312. level thread scoreThread();
  313.  
  314. if ( inOvertime() )
  315. level thread overtimeThread();
  316. }
  317.  
  318.  
  319. getClosestSite()
  320. {
  321. if ( distance2d( self.origin, level.bombZones["allies"].trigger.origin ) < distance2d( self.origin, level.bombZones["axis"].trigger.origin ) )
  322. return ( "allies" );
  323. else
  324. return ( "axis" );
  325. }
  326.  
  327. distanceToSite( team )
  328. {
  329. return ( distance2d( self.origin, level.bombZones[team].trigger.origin ) );
  330. }
  331.  
  332. scoreThread()
  333. {
  334. level.bombDistance = distance2d( getEnt( "sab_bomb_axis", "targetname" ) getOrigin(), getEnt( "sab_bomb_allies", "targetname" ) getOrigin() );
  335.  
  336. threatDistance = (level.bombDistance/2) - 384;
  337.  
  338. bombEnt = level.sabBomb.trigger;
  339.  
  340. // failsafe for bad bomb placement
  341. if ( threatDistance > bombEnt distanceToSite( "allies" ) || threatDistance > bombEnt distanceToSite( "axis" ) )
  342. threatDistance = bombEnt distanceToSite( bombEnt getClosestSite() ) - 128;
  343.  
  344. dangerTeam = "";
  345.  
  346. for ( ;; )
  347. {
  348. if ( isDefined( level.sabBomb.carrier ) )
  349. bombEnt = level.sabBomb.carrier;
  350. else
  351. bombEnt = level.sabBomb.trigger;
  352.  
  353. lastDangerTeam = dangerTeam;
  354. dangerTeam = "none";
  355.  
  356. if ( bombEnt distanceToSite( "allies" ) < threatDistance )
  357. dangerTeam = level.bombZones["allies"] maps\mp\gametypes\_gameobjects::getOwnerTeam();
  358. else if ( bombEnt distanceToSite( "axis" ) < threatDistance )
  359. dangerTeam = level.bombZones["axis"] maps\mp\gametypes\_gameobjects::getOwnerTeam();
  360. else if ( bombEnt distanceToSite( "allies" ) > level.bombDistance && bombEnt getClosestSite() != "allies" )
  361. dangerTeam = level.bombZones["axis"] maps\mp\gametypes\_gameobjects::getOwnerTeam();
  362. else if ( bombEnt distanceToSite( "axis" ) > level.bombDistance && bombEnt getClosestSite() != "axis" )
  363. dangerTeam = level.bombZones["allies"] maps\mp\gametypes\_gameobjects::getOwnerTeam();
  364.  
  365. if ( dangerTeam != "none" )
  366. {
  367. if ( !level.bombPlanted || !getWatchedDvar( "scorelimit" ) || (level.bombPlanted && (maps\mp\gametypes\_gamescore::_getTeamScore( level.otherTeam[dangerTeam] ) < getWatchedDvar( "scorelimit" ) - 1)) )
  368. {
  369. maps\mp\gametypes\_gamescore::_setTeamScore( level.otherTeam[dangerTeam], maps\mp\gametypes\_gamescore::_getTeamScore( level.otherTeam[dangerTeam] ) + 1 );
  370. maps\mp\gametypes\_gamescore::updateTeamScore( level.otherTeam[dangerTeam] );
  371. }
  372. }
  373.  
  374. if ( dangerTeam != lastDangerTeam && !level.bombExploded )
  375. {
  376. setDvar( "ui_danger_team", dangerTeam );
  377. }
  378.  
  379. wait ( 2.5 );
  380. }
  381. }
  382.  
  383. createBombZone( team, trigger )
  384. {
  385. visuals = getEntArray( trigger.target, "targetname" );
  386.  
  387. bombZone = maps\mp\gametypes\_gameobjects::createUseObject( team, trigger, visuals, (0,0,64) );
  388. bombZone resetBombsite();
  389. bombZone.onUse = ::onUse;
  390. bombZone.onBeginUse = ::onBeginUse;
  391. bombZone.onEndUse = ::onEndUse;
  392. bombZone.onCantUse = ::onCantUse;
  393. bombZone.useWeapon = "briefcase_bomb_mp";
  394.  
  395. for ( i = 0; i < visuals.size; i++ )
  396. {
  397. if ( isDefined( visuals[i].script_exploder ) )
  398. {
  399. bombZone.exploderIndex = visuals[i].script_exploder;
  400. break;
  401. }
  402. }
  403.  
  404. return bombZone;
  405. }
  406.  
  407.  
  408. onBeginUse( player )
  409. {
  410. // planted the bomb
  411. if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) )
  412. player.isPlanting = true;
  413. else
  414. player.isDefusing = true;
  415. }
  416.  
  417. onEndUse( team, player, result )
  418. {
  419. if ( !isAlive( player ) )
  420. return;
  421.  
  422. player.isPlanting = false;
  423. player.isDefusing = false;
  424. }
  425.  
  426.  
  427. onPickup( player )
  428. {
  429. level notify ( "bomb_picked_up" );
  430.  
  431. self.autoResetTime = 60.0;
  432.  
  433. level.useStartSpawns = false;
  434.  
  435. team = player.pers["team"];
  436.  
  437. if ( team == "allies" )
  438. otherTeam = "axis";
  439. else
  440. otherTeam = "allies";
  441.  
  442. player playLocalSound( "mp_suitcase_pickup" );
  443.  
  444. player leaderDialogOnPlayer( "obj_destroy", "bomb" );
  445. excludeList[0] = player;
  446. leaderDialog( "bomb_taken", team, "bomb", excludeList );
  447.  
  448. if ( !level.splitscreen )
  449. {
  450. leaderDialog( "bomb_lost", otherTeam, "bomb" );
  451. leaderDialog( "obj_defend", otherTeam, "bomb" );
  452. }
  453. player.isBombCarrier = true;
  454.  
  455. // recovered the bomb before abandonment timer elapsed
  456. if ( team == self maps\mp\gametypes\_gameobjects::getOwnerTeam() )
  457. {
  458. //printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player );
  459. playSoundOnPlayers( game["bomb_recovered_sound"], team );
  460. }
  461. else
  462. {
  463. //printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player );
  464. playSoundOnPlayers( game["bomb_recovered_sound"] );
  465. }
  466.  
  467. self maps\mp\gametypes\_gameobjects::setOwnerTeam( team );
  468. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  469. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_target" );
  470. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_kill" );
  471. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_escort" );
  472. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_escort" );
  473.  
  474. level.bombZones[team] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  475. level.bombZones[otherTeam] maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  476.  
  477. player incPlayerStat( "bombscarried", 1 );
  478. player thread maps\mp\_matchdata::logGameEvent( "pickup", player.origin );
  479. }
  480.  
  481.  
  482. onDrop( player )
  483. {
  484. if ( level.bombPlanted )
  485. {
  486.  
  487. }
  488. else
  489. {
  490. if ( isDefined( player ) )
  491. printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), player );
  492.  
  493. playSoundOnPlayers( game["bomb_dropped_sound"], self maps\mp\gametypes\_gameobjects::getOwnerTeam() );
  494.  
  495. thread abandonmentThink( 0.0 );
  496. }
  497. }
  498.  
  499.  
  500. abandonmentThink( delay )
  501. {
  502. level endon ( "bomb_picked_up" );
  503.  
  504. wait ( delay );
  505.  
  506. if ( isDefined( self.carrier ) )
  507. return;
  508.  
  509. if ( self maps\mp\gametypes\_gameobjects::getOwnerTeam() == "allies" )
  510. otherTeam = "axis";
  511. else
  512. otherTeam = "allies";
  513.  
  514. // printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", otherTeam, &"MP_THE_ENEMY" );
  515. playSoundOnPlayers( game["bomb_dropped_sound"], otherTeam );
  516.  
  517. self maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" );
  518. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  519. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_bomb" );
  520. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
  521. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_bomb" );
  522. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
  523.  
  524. level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  525. level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  526. }
  527.  
  528.  
  529. onUse( player )
  530. {
  531. team = player.pers["team"];
  532. otherTeam = level.otherTeam[team];
  533. // planted the bomb
  534. if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) )
  535. {
  536. player notify ( "bomb_planted" );
  537.  
  538. player playSound( "mp_bomb_plant" );
  539.  
  540. level thread teamPlayerCardSplash( "callout_bombplanted", player );
  541.  
  542. leaderDialog( "bomb_planted" );
  543.  
  544. player thread maps\mp\gametypes\_hud_message::SplashNotify( "plant", maps\mp\gametypes\_rank::getScoreInfoValue( "plant" ) );
  545. player thread maps\mp\gametypes\_rank::giveRankXP( "plant" );
  546. maps\mp\gametypes\_gamescore::givePlayerScore( "plant", player );
  547. player incPlayerStat( "bombsplanted", 1 );
  548. player thread maps\mp\_matchdata::logGameEvent( "plant", player.origin );
  549. player.bombPlantedTime = getTime();
  550.  
  551. //if ( !inOvertime() )
  552. level thread bombPlanted( self, player.pers["team"] );
  553.  
  554. level.bombOwner = player;
  555.  
  556. level.sabBomb.autoResetTime = undefined;
  557. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" );
  558. level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  559. level.sabBomb maps\mp\gametypes\_gameobjects::setDropped();
  560. self.useWeapon = "briefcase_bomb_defuse_mp";
  561.  
  562. self setUpForDefusing();
  563. }
  564. else // defused the bomb
  565. {
  566. player notify ( "bomb_defused" );
  567.  
  568. leaderDialog( "bomb_defused" );
  569.  
  570. level thread teamPlayerCardSplash( "callout_bombdefused", player );
  571.  
  572. if ( isDefined( level.bombOwner ) && ( level.bombOwner.bombPlantedTime + 3000 + (level.defuseTime*1000) ) > getTime() && isReallyAlive( level.bombOwner ) )
  573. player thread maps\mp\gametypes\_hud_message::SplashNotify( "ninja_defuse", ( maps\mp\gametypes\_rank::getScoreInfoValue( "defuse" ) ) );
  574. else
  575. player thread maps\mp\gametypes\_hud_message::SplashNotify( "defuse", maps\mp\gametypes\_rank::getScoreInfoValue( "defuse" ) );
  576.  
  577. player thread maps\mp\gametypes\_rank::giveRankXP( "defuse" );
  578. maps\mp\gametypes\_gamescore::givePlayerScore( "defuse", player );
  579. player incPlayerStat( "bombsdefused", 1 );
  580. player thread maps\mp\_matchdata::logGameEvent( "defuse", player.origin );
  581.  
  582. if ( inOvertime() )
  583. {
  584. thread maps\mp\gametypes\_gamelogic::endGame( team, game["strings"]["target_destroyed"] );
  585. return;
  586. }
  587.  
  588. level thread bombDefused( self );
  589.  
  590. self resetBombsite();
  591.  
  592. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" );
  593. level.sabBomb maps\mp\gametypes\_gameobjects::setPickedUp( player );
  594. }
  595. }
  596.  
  597.  
  598. onCantUse( player )
  599. {
  600. player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" );
  601. }
  602.  
  603.  
  604. bombPlanted( destroyedObj, team )
  605. {
  606. level endon ( "overtime" );
  607.  
  608. maps\mp\gametypes\_gamelogic::pauseTimer();
  609. level.bombPlanted = true;
  610. level.timeLimitOverride = true;
  611. level.scoreLimitOverride = true;
  612. setDvar( "ui_bomb_timer", 1 );
  613.  
  614. // communicate timer information to menus
  615. setGameEndTime( int( getTime() + (level.bombTimer * 1000) ) );
  616.  
  617. destroyedObj.visuals[0] thread maps\mp\gametypes\_gamelogic::playTickingSound();
  618.  
  619. starttime = gettime();
  620. bombTimerWait();
  621.  
  622. setDvar( "ui_bomb_timer", 0 );
  623. destroyedObj.visuals[0] maps\mp\gametypes\_gamelogic::stopTickingSound();
  624.  
  625. if ( !level.bombPlanted )
  626. {
  627. if ( level.hotPotato )
  628. {
  629. timePassed = (gettime() - starttime) / 1000;
  630. level.bombTimer -= timePassed;
  631. }
  632. return;
  633. }
  634.  
  635. explosionOrigin = level.sabBomb.visuals[0].origin;
  636. level.bombExploded = true;
  637. setDvar( "ui_danger_team", "BombExploded" );
  638.  
  639. if ( isdefined( level.bombowner ) )
  640. {
  641. destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, level.bombowner );
  642. level.bombowner incPlayerStat( "targetsdestroyed", 1 );
  643. }
  644. else
  645. destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20 );
  646.  
  647. rot = randomfloat(360);
  648. explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
  649. triggerFx( explosionEffect );
  650.  
  651. PlayRumbleOnPosition( "grenade_rumble", explosionOrigin );
  652. earthquake( 0.75, 2.0, explosionOrigin, 2000 );
  653.  
  654. thread playSoundinSpace( "exp_suitcase_bomb_main", explosionOrigin );
  655.  
  656. if ( isDefined( destroyedObj.exploderIndex ) )
  657. exploder( destroyedObj.exploderIndex );
  658.  
  659. level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  660. level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  661. level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  662.  
  663. setGameEndTime( 0 );
  664.  
  665. level.scoreLimitOverride = true;
  666.  
  667. if ( level.scoreMode )
  668. maps\mp\gametypes\_gamescore::_setTeamScore( team, int( max( getWatchedDvar( "scorelimit" ), maps\mp\gametypes\_gamescore::_getTeamScore( level.otherTeam[team] ) + 1 ) ) );
  669. else
  670. maps\mp\gametypes\_gamescore::_setTeamScore( team, 1 );
  671. maps\mp\gametypes\_gamescore::updateTeamScore( team );
  672.  
  673. if ( isDefined( level.bombOwner ) )
  674. {
  675. level.bombOwner thread maps\mp\gametypes\_rank::giveRankXP( "destroy" );
  676. maps\mp\gametypes\_gamescore::givePlayerScore( "destroy", level.bombOwner );
  677. level thread teamPlayerCardSplash( "callout_destroyed_objective", level.bombOwner );
  678. }
  679.  
  680. wait 3;
  681.  
  682. thread maps\mp\gametypes\_gamelogic::endGame( team, game["strings"]["target_destroyed"] );
  683. }
  684.  
  685.  
  686. bombTimerWait()
  687. {
  688. level endon("bomb_defused");
  689. level endon("overtime_ended");
  690.  
  691. maps\mp\gametypes\_hostmigration::waitLongDurationWithGameEndTimeUpdate( level.bombTimer );
  692. }
  693.  
  694.  
  695. giveLastOnTeamWarning()
  696. {
  697. self endon("death");
  698. self endon("disconnect");
  699. level endon( "game_ended" );
  700.  
  701. self waitTillRecoveredHealth( 3 );
  702.  
  703. otherTeam = getOtherTeam( self.pers["team"] );
  704. level thread teamPlayerCardSplash( "callout_lastteammemberalive", self, self.pers["team"] );
  705. level thread teamPlayerCardSplash( "callout_lastenemyalive", self, otherTeam );
  706. level notify ( "last_alive", self );
  707. //self maps\mp\gametypes\_missions::lastManSD();
  708. }
  709.  
  710.  
  711. onTimeLimit()
  712. {
  713. if ( level.bombExploded )
  714. return;
  715.  
  716. if( game["teamScores"]["axis"] > game["teamScores"]["allies"] )
  717. {
  718. thread maps\mp\gametypes\_gamelogic::endGame( "axis", game["strings"]["time_limit_reached"] );
  719. }
  720. else if( game["teamScores"]["axis"] < game["teamScores"]["allies"] )
  721. {
  722. thread maps\mp\gametypes\_gamelogic::endGame( "allies", game["strings"]["time_limit_reached"] );
  723. }
  724. else if( game["teamScores"]["axis"] == game["teamScores"]["allies"] )
  725. {
  726. if ( inOvertime() )
  727. thread maps\mp\gametypes\_gamelogic::endGame( "tie", game["strings"]["time_limit_reached"] );
  728. else
  729. thread maps\mp\gametypes\_gamelogic::endGame( "overtime", game["strings"]["time_limit_reached"] );
  730. }
  731. }
  732.  
  733.  
  734. overtimeThread( time )
  735. {
  736. level endon( "game_ended" );
  737.  
  738. level.inOvertime = true;
  739.  
  740. wait ( 5.0 );
  741. level.disableSpawning = true;
  742. }
  743.  
  744.  
  745. /*
  746. overtimeThread()
  747. {
  748. level.inOvertime = getTime();
  749. level notify ( "overtime" );
  750.  
  751. thread bombDistanceThread();
  752.  
  753. foreach ( player in level.players )
  754. player thread maps\mp\gametypes\_hud_message::SplashNotify( "sab_overtime" );
  755.  
  756. maps\mp\gametypes\_gamelogic::pauseTimer();
  757. level.bombPlanted = true;
  758. level.timeLimitOverride = true;
  759. setDvar( "ui_bomb_timer", 1 );
  760.  
  761. // communicate timer information to menus
  762. setGameEndTime( int( getTime() + (level.bombTimer * 1000) ) );
  763.  
  764. maps\mp\gametypes\_hostmigration::waitLongDurationWithGameEndTimeUpdate( level.bombTimer );
  765.  
  766. setDvar( "ui_bomb_timer", 0 );
  767.  
  768. if ( isDefined( level.sabBomb.carrier ) )
  769. {
  770. explosionEnt = level.sabBomb.carrier;
  771. }
  772. else
  773. {
  774. explosionEnt = level.sabBomb.visuals[0];
  775. }
  776.  
  777. level.bombExploded = true;
  778.  
  779. if ( isdefined( level.bombowner ) )
  780. explosionEnt radiusDamage( explosionEnt.origin, 512, 200, 20, level.bombowner );
  781. else
  782. explosionEnt radiusDamage( explosionEnt.origin, 512, 200, 20 );
  783.  
  784. rot = randomfloat(360);
  785. explosionEffect = spawnFx( level._effect["bombexplosion"], explosionEnt.origin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
  786. triggerFx( explosionEffect );
  787.  
  788. thread playSoundinSpace( "exp_suitcase_bomb_main", explosionEnt.origin );
  789.  
  790. setGameEndTime( 0 );
  791.  
  792. team = getOtherTeam( level.dangerTeam );
  793.  
  794. wait 3;
  795.  
  796. //maps\mp\gametypes\_gamescore::giveTeamScoreForObjective( team, 1 );
  797. maps\mp\gametypes\_gamelogic::endGame( team, game["strings"]["target_destroyed"] );
  798. }
  799. */
  800.  
  801. bombDistanceThread()
  802. {
  803. level endon ( "game_ended" );
  804.  
  805. if ( cointoss() )
  806. level.dangerTeam = "allies";
  807. else
  808. level.dangerTeam = "axis";
  809.  
  810. for ( ;; )
  811. {
  812. if ( isDefined( level.sabBomb.carrier ) )
  813. bombEnt = level.sabBomb.carrier;
  814. else
  815. bombEnt = level.sabBomb.visuals[0];
  816.  
  817. if ( distance( bombEnt.origin, level.bombZones[getOtherTeam(level.dangerTeam)].visuals[0].origin ) < distance( bombEnt.origin, level.bombZones[level.dangerTeam].visuals[0].origin ) )
  818. level.dangerTeam = getOtherTeam( level.dangerTeam );
  819.  
  820. wait ( 0.05 );
  821. }
  822. }
  823.  
  824.  
  825. resetBombsite()
  826. {
  827. self maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  828. self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime );
  829. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" );
  830. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
  831. self maps\mp\gametypes\_gameobjects::setKeyObject( level.sabBomb );
  832. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defend" );
  833. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" );
  834. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_target" );
  835. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" );
  836. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  837. self.useWeapon = "briefcase_bomb_mp";
  838. }
  839.  
  840.  
  841. setUpForDefusing()
  842. {
  843. self maps\mp\gametypes\_gameobjects::allowUse( "friendly" );
  844. self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime );
  845. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" );
  846. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
  847. self maps\mp\gametypes\_gameobjects::setKeyObject( undefined );
  848. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "waypoint_defuse" );
  849. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" );
  850. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "waypoint_defend" );
  851. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" );
  852. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  853. }
  854.  
  855.  
  856. bombDefused( object )
  857. {
  858. setDvar( "ui_bomb_timer", 0 );
  859. maps\mp\gametypes\_gamelogic::resumeTimer();
  860. level.bombPlanted = false;
  861. level.timeLimitOverride = false;
  862. level.scoreLimitOverride = false;
  863.  
  864. level notify("bomb_defused");
  865. }
  866.  
  867.  
  868. onOneLeftEvent( team )
  869. {
  870. if ( level.bombExploded )
  871. return;
  872.  
  873. lastPlayer = getLastLivingPlayer( team );
  874.  
  875. lastPlayer thread giveLastOnTeamWarning();
  876. }
  877.  
  878.  
  879. onNormalDeath( victim, attacker, lifeId, lifeId )
  880. {
  881. if ( victim.isPlanting )
  882. {
  883. thread maps\mp\_matchdata::logKillEvent( lifeId, "planting" );
  884. }
  885. else if ( victim.isBombCarrier )
  886. {
  887. attacker incPlayerStat( "bombcarrierkills", 1 );
  888. thread maps\mp\_matchdata::logKillEvent( lifeId, "carrying" );
  889. }
  890. else if ( victim.isDefusing )
  891. {
  892. thread maps\mp\_matchdata::logKillEvent( lifeId, "defusing" );
  893. }
  894.  
  895. if ( attacker.isBombCarrier )
  896. attacker incPlayerStat( "killsasbombcarrier", 1 );
  897. }
  898.  
  899. initGametypeAwards()
  900. {
  901. maps\mp\_awards::initStatAward( "targetsdestroyed", 0, maps\mp\_awards::highestWins );
  902. maps\mp\_awards::initStatAward( "bombsplanted", 0, maps\mp\_awards::highestWins );
  903. maps\mp\_awards::initStatAward( "bombsdefused", 0, maps\mp\_awards::highestWins );
  904. maps\mp\_awards::initStatAward( "bombcarrierkills", 0, maps\mp\_awards::highestWins );
  905. maps\mp\_awards::initStatAward( "bombscarried", 0, maps\mp\_awards::highestWins );
  906. maps\mp\_awards::initStatAward( "killsasbombcarrier", 0, maps\mp\_awards::highestWins );
  907. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement