Advertisement
Guest User

Untitled

a guest
Aug 28th, 2011
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.76 KB | None | 0 0
  1. #include maps\mp\_utility;
  2. #include maps\mp\gametypes\_hud_util;
  3. /*
  4. Sabotage
  5.  
  6. // ...etc...
  7. */
  8.  
  9. /*QUAKED mp_sab_spawn_axis (0.75 0.0 0.5) (-16 -16 0) (16 16 72)
  10. Axis players spawn away from enemies and near their team at one of these positions.*/
  11.  
  12. /*QUAKED mp_sab_spawn_allies (0.0 0.75 0.5) (-16 -16 0) (16 16 72)
  13. Allied players spawn away from enemies and near their team at one of these positions.*/
  14.  
  15. /*QUAKED mp_sab_spawn_axis_start (1.0 0.0 0.5) (-16 -16 0) (16 16 72)
  16. Axis players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  17.  
  18. /*QUAKED mp_sab_spawn_allies_start (0.0 1.0 0.5) (-16 -16 0) (16 16 72)
  19. Allied players spawn away from enemies and near their team at one of these positions at the start of a round.*/
  20.  
  21. main()
  22. {
  23. if ( GetDvar( #"mapname") == "mp_background" )
  24. return;
  25.  
  26. maps\mp\gametypes\_globallogic::init();
  27. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  28. maps\mp\gametypes\_globallogic::SetupCallbacks();
  29.  
  30. level.teamBased = true;
  31. level.overrideTeamScore = true;
  32.  
  33. maps\mp\gametypes\_globallogic_utils::registerRoundSwitchDvar( level.gameType, 0, 0, 9 );
  34. maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( level.gameType, 10, 0, 1440 );
  35. maps\mp\gametypes\_globallogic_utils::registerScoreLimitDvar( level.gameType, 0, 0, 500 );
  36. maps\mp\gametypes\_globallogic_utils::registerRoundLimitDvar( level.gameType, 1, 0, 10 );
  37. maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( level.gameType, 0, 0, 10 );
  38. maps\mp\gametypes\_globallogic_utils::registerRoundWinLimitDvar( level.gameType, 0, 0, 10 );
  39.  
  40. maps\mp\gametypes\_weapons::registerGrenadeLauncherDudDvar( level.gameType, 10, 0, 1440 );
  41. maps\mp\gametypes\_weapons::registerThrownGrenadeDudDvar( level.gameType, 0, 0, 1440 );
  42. maps\mp\gametypes\_weapons::registerKillstreakDelay( level.gameType, 0, 0, 1440 );
  43.  
  44. maps\mp\gametypes\_globallogic::registerFriendlyFireDelay( level.gameType, 15, 0, 1440 );
  45.  
  46. level.onStartGameType = ::onStartGameType;
  47. level.onSpawnPlayer = ::onSpawnPlayer;
  48. level.onSpawnPlayerUnified = ::onSpawnPlayerUnified;
  49. level.gamemodeSpawnDvars = ::sab_gamemodeSpawnDvars;
  50. level.onRoundEndGame = ::onRoundEndGame;
  51.  
  52. if ( !game["tiebreaker"] )
  53. {
  54. level.onPrecacheGameType = ::onPrecacheGameType;
  55. level.onTimeLimit = ::onTimeLimit;
  56. level.onDeadEvent = ::onDeadEvent;
  57. level.onRoundSwitch = ::onRoundSwitch;
  58. level.onPlayerKilled = ::onPlayerKilled;
  59.  
  60. level.endGameOnScoreLimit = false;
  61.  
  62. game["dialog"]["gametype"] = "sab_start";
  63. game["dialog"]["gametype_hardcore"] = "hcsab_start";
  64. game["dialog"]["offense_obj"] = "destroy_start";
  65. game["dialog"]["defense_obj"] = "destroy_start";
  66. game["dialog"]["sudden_death"] = "suddendeath";
  67. game["dialog"]["sudden_death_boost"] = "generic_boost";
  68. }
  69. else
  70. {
  71. level.onEndGame = ::onEndGame;
  72.  
  73. level.endGameOnScoreLimit = false;
  74.  
  75. game["dialog"]["gametype"] = "sab_start";
  76. game["dialog"]["gametype_hardcore"] = "hcsab_start";
  77. game["dialog"]["offense_obj"] = "generic_boost";
  78. game["dialog"]["defense_obj"] = "generic_boost";
  79. game["dialog"]["sudden_death"] = "suddendeath";
  80. game["dialog"]["sudden_death_boost"] = "generic_boost";
  81.  
  82. maps\mp\gametypes\_globallogic_utils::registerNumLivesDvar( "tb", 1, 1, 1 );
  83. maps\mp\gametypes\_globallogic_utils::registerTimeLimitDvar( "tb", 0, 0, 0 );
  84. }
  85.  
  86. badtrig = getent( "sab_bomb_defuse_allies", "targetname" );
  87. if ( isdefined( badtrig ) )
  88. badtrig delete();
  89.  
  90. badtrig = getent( "sab_bomb_defuse_axis", "targetname" );
  91. if ( isdefined( badtrig ) )
  92. badtrig delete();
  93.  
  94. level.lastDialogTime = 0;
  95.  
  96. // Sets the scoreboard columns and determines with data is sent across the network
  97. setscoreboardcolumns( "kills", "deaths", "plants", "defuses" );
  98. }
  99.  
  100. onPrecacheGameType()
  101. {
  102. game["bomb_dropped_sound"] = "mp_war_objective_lost";
  103. game["bomb_recovered_sound"] = "mp_war_objective_taken";
  104.  
  105. precacheShader("waypoint_bomb");
  106. precacheShader("waypoint_kill");
  107. precacheShader("waypoint_bomb_enemy");
  108. precacheShader("waypoint_defend");
  109. precacheShader("waypoint_defuse");
  110. precacheShader("waypoint_target");
  111. precacheShader("compass_waypoint_bomb");
  112. precacheShader("compass_waypoint_defend");
  113. precacheShader("compass_waypoint_defuse");
  114. precacheShader("compass_waypoint_target");
  115. precacheShader("hud_suitcase_bomb");
  116.  
  117. precacheString(&"MP_EXPLOSIVES_RECOVERED_BY");
  118. precacheString(&"MP_EXPLOSIVES_RECOVERED_BY");
  119. precacheString(&"MP_EXPLOSIVES_DROPPED_BY");
  120. precacheString(&"MP_EXPLOSIVES_PLANTED_BY");
  121. precacheString(&"MP_EXPLOSIVES_DEFUSED_BY");
  122. precacheString(&"MP_YOU_HAVE_RECOVERED_THE_BOMB");
  123. precacheString(&"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES");
  124. precacheString(&"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES");
  125. precacheString(&"MP_PLANTING_EXPLOSIVE");
  126. precacheString(&"MP_DEFUSING_EXPLOSIVE");
  127. precacheString(&"MP_TARGET_DESTROYED");
  128. precacheString(&"MP_NO_RESPAWN");
  129. precacheString(&"MP_TIE_BREAKER");
  130. precacheString(&"MP_NO_RESPAWN");
  131. precacheString(&"MP_SUDDEN_DEATH");
  132. }
  133.  
  134.  
  135. onRoundSwitch()
  136. {
  137. if ( !isdefined( game["switchedsides"] ) )
  138. game["switchedsides"] = false;
  139.  
  140. if ( game["teamScores"]["allies"] == level.scorelimit - 1 && game["teamScores"]["axis"] == level.scorelimit - 1 )
  141. {
  142. level.halftimeType = "overtime";
  143. level.halftimeSubCaption = &"MP_TIE_BREAKER";
  144. game["tiebreaker"] = true;
  145. }
  146. else
  147. {
  148. level.halftimeType = "halftime";
  149. game["switchedsides"] = !game["switchedsides"];
  150. }
  151. }
  152.  
  153.  
  154. onStartGameType()
  155. {
  156. if ( !isdefined( game["switchedsides"] ) )
  157. game["switchedsides"] = false;
  158.  
  159. setClientNameMode("auto_change");
  160.  
  161. game["strings"]["target_destroyed"] = &"MP_TARGET_DESTROYED";
  162.  
  163. if ( !game["tiebreaker"] )
  164. {
  165. maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_SAB" );
  166. maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_SAB" );
  167.  
  168. if ( level.splitscreen )
  169. {
  170. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_SAB" );
  171. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_SAB" );
  172. }
  173. else
  174. {
  175. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_SAB_SCORE" );
  176. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_SAB_SCORE" );
  177. }
  178. maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "allies", &"OBJECTIVES_SAB_HINT" );
  179. maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "axis", &"OBJECTIVES_SAB_HINT" );
  180. }
  181. else
  182. {
  183. maps\mp\gametypes\_globallogic_ui::setObjectiveText( "allies", &"OBJECTIVES_TDM" );
  184. maps\mp\gametypes\_globallogic_ui::setObjectiveText( "axis", &"OBJECTIVES_TDM" );
  185.  
  186. if ( level.splitscreen )
  187. {
  188. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_TDM" );
  189. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_TDM" );
  190. }
  191. else
  192. {
  193. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "allies", &"OBJECTIVES_TDM_SCORE" );
  194. maps\mp\gametypes\_globallogic_ui::setObjectiveScoreText( "axis", &"OBJECTIVES_TDM_SCORE" );
  195. }
  196. maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "allies", &"OBJECTIVES_TDM_HINT" );
  197. maps\mp\gametypes\_globallogic_ui::setObjectiveHintText( "axis", &"OBJECTIVES_TDM_HINT" );
  198. }
  199.  
  200. level.spawnMins = ( 0, 0, 0 );
  201. level.spawnMaxs = ( 0, 0, 0 );
  202. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_allies_start" );
  203. maps\mp\gametypes\_spawnlogic::placeSpawnPoints( "mp_sab_spawn_axis_start" );
  204. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "allies", "mp_sab_spawn_allies" );
  205. maps\mp\gametypes\_spawnlogic::addSpawnPoints( "axis", "mp_sab_spawn_axis" );
  206. maps\mp\gametypes\_spawning::updateAllSpawnPoints();
  207.  
  208. level.mapCenter = maps\mp\gametypes\_spawnlogic::findBoxCenter( level.spawnMins, level.spawnMaxs );
  209. setMapCenter( level.mapCenter );
  210.  
  211. spawnpoint = maps\mp\gametypes\_spawnlogic::getRandomIntermissionPoint();
  212. setDemoIntermissionPoint( spawnpoint.origin, spawnpoint.angles );
  213.  
  214. level.spawn_axis = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis" );
  215. level.spawn_allies = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies" );
  216. level.spawn_axis_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_axis_start" );
  217. level.spawn_allies_start = maps\mp\gametypes\_spawnlogic::getSpawnpointArray( "mp_sab_spawn_allies_start" );
  218.  
  219. maps\mp\gametypes\_rank::registerScoreInfo( "plant", 500 );
  220. maps\mp\gametypes\_rank::registerScoreInfo( "defuse", 500 );
  221.  
  222. allowed[0] = "sab";
  223. maps\mp\gametypes\_gameobjects::main(allowed);
  224.  
  225. // now that the game objects have been deleted place the influencers
  226. maps\mp\gametypes\_spawning::create_map_placed_influencers();
  227.  
  228. thread updateGametypeDvars();
  229.  
  230. thread sabotage();
  231. }
  232.  
  233.  
  234. onTimeLimit()
  235. {
  236. if ( level.inOvertime )
  237. return;
  238.  
  239. thread onOvertime();
  240. }
  241.  
  242.  
  243. onOvertime()
  244. {
  245. level endon ( "game_ended" );
  246.  
  247. level.timeLimitOverride = true;
  248. level.inOvertime = true;
  249. maps\mp\gametypes\_globallogic_audio::leaderDialog( "sudden_death" );
  250. maps\mp\gametypes\_globallogic_audio::leaderDialog( "sudden_death_boost" );
  251. for ( index = 0; index < level.players.size; index++ )
  252. {
  253. level.players[index] notify("force_spawn");
  254. level.players[index] thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_SUDDEN_DEATH", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" );
  255.  
  256. level.players[index] setClientUIVisibilityFlag( "g_compassShowEnemies", 1 );
  257. }
  258.  
  259. SetMatchTalkFlag( "DeadChatWithDead", 1 );
  260. SetMatchTalkFlag( "DeadChatWithTeam", 0 );
  261. SetMatchTalkFlag( "DeadHearTeamLiving", 0 );
  262. SetMatchTalkFlag( "DeadHearAllLiving", 0 );
  263. SetMatchTalkFlag( "EveryoneHearsEveryone", 0 );
  264.  
  265. waitTime = 0;
  266. while ( waitTime < 90 )
  267. {
  268. if ( !level.bombPlanted )
  269. {
  270. waitTime += 1;
  271. setGameEndTime( getTime() + ((90-waitTime)*1000) );
  272. }
  273. wait ( 1.0 );
  274. }
  275.  
  276. thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] );
  277. }
  278.  
  279.  
  280. onDeadEvent( team )
  281. {
  282. if ( level.bombExploded )
  283. return;
  284.  
  285. if ( team == "all" )
  286. {
  287. if ( level.bombPlanted )
  288. {
  289. [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 );
  290. thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.bombPlantedBy+"_mission_accomplished"] );
  291. }
  292. else
  293. {
  294. thread maps\mp\gametypes\_globallogic::endGame( "tie", game["strings"]["tie"] );
  295. }
  296. }
  297. else if ( level.bombPlanted )
  298. {
  299. if ( team == level.bombPlantedBy )
  300. {
  301. level.plantingTeamDead = true;
  302. return;
  303. }
  304.  
  305. [[level._setTeamScore]]( level.bombPlantedBy, [[level._getTeamScore]]( level.bombPlantedBy ) + 1 );
  306. thread maps\mp\gametypes\_globallogic::endGame( level.bombPlantedBy, game["strings"][level.otherTeam[level.bombPlantedBy]+"_eliminated"] );
  307. }
  308. else
  309. {
  310. [[level._setTeamScore]]( level.otherTeam[team], [[level._getTeamScore]]( level.otherTeam[team] ) + 1 );
  311. thread maps\mp\gametypes\_globallogic::endGame( level.otherTeam[team], game["strings"][team+"_eliminated"] );
  312. }
  313. }
  314.  
  315. onSpawnPlayerUnified()
  316. {
  317. self.isPlanting = false;
  318. self.isDefusing = false;
  319. self.isBombCarrier = false;
  320.  
  321. if ( game["tiebreaker"] )
  322. {
  323. self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_TIE_BREAKER", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" );
  324.  
  325. hintMessage = maps\mp\gametypes\_globallogic_ui::getObjectiveHintText( self.pers["team"] );
  326. if ( isDefined( hintMessage ) )
  327. self DisplayGameModeMessage( hintMessage, "uin_alert_slideout" );
  328.  
  329. self setClientUIVisibilityFlag( "g_compassShowEnemies", 1 );
  330.  
  331. // this is being redundantly set everytime a player spawns
  332. // need to move this to a once only for eveyone when tiebreaker round
  333. // starts
  334. SetMatchTalkFlag( "DeadChatWithDead", 1 );
  335. SetMatchTalkFlag( "DeadChatWithTeam", 0 );
  336. SetMatchTalkFlag( "DeadHearTeamLiving", 0 );
  337. SetMatchTalkFlag( "DeadHearAllLiving", 0 );
  338. SetMatchTalkFlag( "EveryoneHearsEveryone", 0 );
  339. }
  340.  
  341. maps\mp\gametypes\_spawning::onSpawnPlayer_Unified();
  342. }
  343.  
  344.  
  345. onSpawnPlayer()
  346. {
  347. self.isPlanting = false;
  348. self.isDefusing = false;
  349. self.isBombCarrier = false;
  350.  
  351. spawnteam = self.pers["team"];
  352. if ( game["switchedsides"] )
  353. spawnteam = getOtherTeam( spawnteam );
  354.  
  355. if ( level.useStartSpawns )
  356. {
  357. if (spawnteam == "axis")
  358. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_axis_start);
  359. else
  360. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(level.spawn_allies_start);
  361. }
  362. else
  363. {
  364. if (spawnteam == "axis")
  365. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_axis);
  366. else
  367. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(level.spawn_allies);
  368. }
  369.  
  370. if ( game["tiebreaker"] )
  371. {
  372. self thread maps\mp\gametypes\_hud_message::oldNotifyMessage( &"MP_TIE_BREAKER", &"MP_NO_RESPAWN", undefined, (1, 0, 0), "mp_last_stand" );
  373.  
  374. hintMessage = maps\mp\gametypes\_globallogic_ui::getObjectiveHintText( self.pers["team"] );
  375. if ( isDefined( hintMessage ) )
  376. self DisplayGameModeMessage( hintMessage, "uin_alert_slideout" );
  377.  
  378. self setClientUIVisibilityFlag( "g_compassShowEnemies", 1 );
  379. // this is being redundantly set everytime a player spawns
  380. // need to move this to a once only for eveyone when tiebreaker round
  381. // starts
  382. SetMatchTalkFlag( "DeadChatWithDead", 1 );
  383. SetMatchTalkFlag( "DeadChatWithTeam", 0 );
  384. SetMatchTalkFlag( "DeadHearTeamLiving", 0 );
  385. SetMatchTalkFlag( "DeadHearAllLiving", 0 );
  386. SetMatchTalkFlag( "EveryoneHearsEveryone", 0 );
  387. }
  388.  
  389. assert( isDefined(spawnpoint) );
  390.  
  391. self spawn( spawnpoint.origin, spawnpoint.angles, "sab" );
  392. }
  393.  
  394.  
  395. updateGametypeDvars()
  396. {
  397. level.plantTime = dvarFloatValue( "planttime", 5, 0, 20 );
  398. level.defuseTime = dvarFloatValue( "defusetime", 5, 0, 20 );
  399. level.bombTimer = dvarFloatValue( "bombtimer", 45, 1, 300 );
  400. level.hotPotato = dvarIntValue( "hotpotato", 1, 0, 1 );
  401. }
  402.  
  403.  
  404. sabotage()
  405. {
  406. level.bombPlanted = false;
  407. level.bombExploded = false;
  408.  
  409. level._effect["bombexplosion"] = loadfx("maps/mp_maps/fx_mp_exp_bomb");
  410.  
  411. trigger = getEnt( "sab_bomb_pickup_trig", "targetname" );
  412. if ( !isDefined( trigger ) )
  413. {
  414. error( "No sab_bomb_pickup_trig trigger found in map." );
  415. return;
  416. }
  417.  
  418. visuals[0] = getEnt( "sab_bomb", "targetname" );
  419. if ( !isDefined( visuals[0] ) )
  420. {
  421. error( "No sab_bomb script_model found in map." );
  422. return;
  423. }
  424.  
  425. //precacheModel( "t5_weapon_briefcase_world" );
  426. //visuals[0] setModel( "t5_weapon_briefcase_world" );
  427. level.sabBomb = maps\mp\gametypes\_gameobjects::createCarryObject( "neutral", trigger, visuals, (0,0,32) );
  428. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" );
  429. //level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" );
  430. //level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
  431. //level.sabBomb maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" );
  432. //level.sabBomb maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
  433. level.sabBomb maps\mp\gametypes\_gameobjects::setCarryIcon( "hud_suitcase_bomb" );
  434. level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  435. level.sabBomb.objIDPingEnemy = true;
  436. level.sabBomb.onPickup = ::onPickup;
  437. level.sabBomb.onDrop = ::onDrop;
  438. level.sabBomb.allowWeapons = true;
  439. level.sabBomb.objPoints["allies"].archived = true;
  440. level.sabBomb.objPoints["axis"].archived = true;
  441. level.sabBomb.autoResetTime = 60.0;
  442.  
  443. if ( !isDefined( getEnt( "sab_bomb_axis", "targetname" ) ) )
  444. {
  445. error("No sab_bomb_axis trigger found in map.");
  446. return;
  447. }
  448. if ( !isDefined( getEnt( "sab_bomb_allies", "targetname" ) ) )
  449. {
  450. error("No sab_bomb_allies trigger found in map.");
  451. return;
  452. }
  453.  
  454. if ( game["switchedsides"] )
  455. {
  456. level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_axis", "targetname" ) );
  457. level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_allies", "targetname" ) );
  458. }
  459. else
  460. {
  461. level.bombZones["allies"] = createBombZone( "allies", getEnt( "sab_bomb_allies", "targetname" ) );
  462. level.bombZones["axis"] = createBombZone( "axis", getEnt( "sab_bomb_axis", "targetname" ) );
  463. }
  464. }
  465.  
  466.  
  467. createBombZone( team, trigger )
  468. {
  469. visuals = getEntArray( trigger.target, "targetname" );
  470.  
  471. bombZone = maps\mp\gametypes\_gameobjects::createUseObject( team, trigger, visuals, (0,0,64) );
  472. bombZone resetBombsite();
  473. bombZone.onUse = ::onUse;
  474. bombZone.onBeginUse = ::onBeginUse;
  475. bombZone.onEndUse = ::onEndUse;
  476. bombZone.onCantUse = ::onCantUse;
  477. bombZone.useWeapon = "briefcase_bomb_mp";
  478. bombZone.visuals[0].killCamEnt = spawn( "script_model", bombZone.visuals[0].origin + (0,0,128) );
  479.  
  480. for ( i = 0; i < visuals.size; i++ )
  481. {
  482. if ( isDefined( visuals[i].script_exploder ) )
  483. {
  484. bombZone.exploderIndex = visuals[i].script_exploder;
  485. break;
  486. }
  487. }
  488.  
  489. return bombZone;
  490. }
  491.  
  492.  
  493. onBeginUse( player )
  494. {
  495. // planted the bomb
  496. if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) )
  497. {
  498. player.isPlanting = true;
  499. player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_friendlyplant", player.pers["team"] );
  500. }
  501. else
  502. {
  503. player.isDefusing = true;
  504. player thread maps\mp\gametypes\_battlechatter_mp::gametypeSpecificBattleChatter( "sd_enemyplant", player.pers["team"] );
  505. }
  506. }
  507.  
  508. onEndUse( team, player, result )
  509. {
  510. if ( !isAlive( player ) )
  511. return;
  512.  
  513. player.isPlanting = false;
  514. player.isDefusing = false;
  515. player notify( "event_ended" );
  516. }
  517.  
  518.  
  519. onPickup( player )
  520. {
  521. level notify ( "bomb_picked_up" );
  522.  
  523. self.autoResetTime = 60.0;
  524.  
  525. level.useStartSpawns = false;
  526.  
  527. team = player.pers["team"];
  528.  
  529. if ( team == "allies" )
  530. otherTeam = "axis";
  531. else
  532. otherTeam = "allies";
  533.  
  534. //player iPrintLnBold( &"MP_YOU_HAVE_RECOVERED_THE_BOMB" );
  535. player playLocalSound( "mp_suitcase_pickup" );
  536. player logString( "bomb taken" );
  537.  
  538. excludeList[0] = player;
  539.  
  540. if( getTime() - level.lastDialogTime > 10000 )
  541. {
  542. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_acquired", team );
  543. player maps\mp\gametypes\_globallogic_audio::leaderDialogOnPlayer( "obj_destroy", "bomb" );
  544.  
  545.  
  546. if ( !level.splitscreen )
  547. {
  548. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_taken", otherTeam );
  549. maps\mp\gametypes\_globallogic_audio::leaderDialog( "obj_defend", otherTeam );
  550. }
  551.  
  552. level.lastDialogTime = getTime();
  553. }
  554. player.isBombCarrier = true;
  555.  
  556. player maps\mp\gametypes\_persistence::statAddWithGameType( "PICKUPS", 1 );
  557.  
  558.  
  559. // recovered the bomb before abandonment timer elapsed
  560. if ( team == self maps\mp\gametypes\_gameobjects::getOwnerTeam() )
  561. {
  562. printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player );
  563. playSoundOnPlayers( game["bomb_recovered_sound"], team );
  564. }
  565. else
  566. {
  567. printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", team, player );
  568. // printOnTeamArg( &"MP_EXPLOSIVES_RECOVERED_BY", otherTeam, &"MP_THE_ENEMY" );
  569. playSoundOnPlayers( game["bomb_recovered_sound"] );
  570. }
  571.  
  572. self maps\mp\gametypes\_gameobjects::setOwnerTeam( team );
  573. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  574. //self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" );
  575. //self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_kill" );
  576. //self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" );
  577. //self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" );
  578.  
  579. level.bombZones[team] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  580. level.bombZones[otherTeam] maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  581.  
  582. level.bombZones[otherTeam].trigger SetInvisibleToAll();
  583. level.bombZones[otherTeam].trigger SetVisibleToPlayer( player );
  584. }
  585.  
  586.  
  587. onDrop( player )
  588. {
  589. if ( level.bombPlanted )
  590. {
  591.  
  592. }
  593. else
  594. {
  595. if ( isDefined( player ) )
  596. printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), player );
  597. // else
  598. // printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", self maps\mp\gametypes\_gameobjects::getOwnerTeam(), &"MP_YOUR_TEAM" );
  599.  
  600. playSoundOnPlayers( game["bomb_dropped_sound"], self maps\mp\gametypes\_gameobjects::getOwnerTeam() );
  601. if ( isDefined( player ) )
  602. player logString( "bomb dropped" );
  603. else
  604. logString( "bomb dropped" );
  605.  
  606. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_lost", self maps\mp\gametypes\_gameobjects::getOwnerTeam() );
  607.  
  608. player notify( "event_ended" );
  609.  
  610. level.bombZones["axis"].trigger SetInvisibleToAll();
  611. level.bombZones["allies"].trigger SetInvisibleToAll();
  612.  
  613. thread abandonmentThink( 0.0 );
  614. }
  615. }
  616.  
  617.  
  618. abandonmentThink( delay )
  619. {
  620. level endon ( "bomb_picked_up" );
  621.  
  622. wait ( delay );
  623.  
  624. if ( isDefined( self.carrier ) )
  625. return;
  626.  
  627. if ( self maps\mp\gametypes\_gameobjects::getOwnerTeam() == "allies" )
  628. otherTeam = "axis";
  629. else
  630. otherTeam = "allies";
  631.  
  632. // printOnTeamArg( &"MP_EXPLOSIVES_DROPPED_BY", otherTeam, &"MP_THE_ENEMY" );
  633. playSoundOnPlayers( game["bomb_dropped_sound"], otherTeam );
  634.  
  635. self maps\mp\gametypes\_gameobjects::setOwnerTeam( "neutral" );
  636. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  637. /**
  638. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_bomb" );
  639. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_bomb" );
  640. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_bomb" );
  641. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_bomb" );
  642. **/
  643.  
  644. level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  645. level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  646. }
  647.  
  648.  
  649. onUse( player )
  650. {
  651. team = player.pers["team"];
  652. otherTeam = level.otherTeam[team];
  653. // planted the bomb
  654. if ( !self maps\mp\gametypes\_gameobjects::isFriendlyTeam( player.pers["team"] ) )
  655. {
  656. player notify ( "bomb_planted" );
  657. // removed old playsound entry CDC 2/18/10
  658. // player playSound( "mpl_sab_bomb_plant" );
  659. player logString( "bomb planted" );
  660.  
  661. if( isdefined(player.pers["plants"]) )
  662. {
  663. player.pers["plants"]++;
  664. player.plants = player.pers["plants"];
  665. }
  666.  
  667. player maps\mp\_medals::saboteur();
  668.  
  669. player maps\mp\gametypes\_persistence::statAddWithGameType( "PLANTS", 1 );
  670.  
  671. level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_PLANTED_BY", player );
  672.  
  673. //thread playSoundOnPlayers( "mus_sab_planted"+"_"+level.teamPostfix[team] );
  674. // Play Action music
  675. //maps\mp\_music::setmusicstate( "ACTION" );
  676.  
  677. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted", team );
  678.  
  679. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_planted", otherTeam );
  680.  
  681. maps\mp\gametypes\_globallogic_score::givePlayerScore( "plant", player );
  682. //player thread [[level.onXPEvent]]( "plant" );
  683.  
  684. level thread bombPlanted( self, player.pers["team"] );
  685.  
  686. level.bombOwner = player;
  687.  
  688. player.isBombCarrier = false;
  689.  
  690. // self.keyObject maps\mp\gametypes\_gameobjects::disableObject();
  691. level.sabBomb.autoResetTime = undefined;
  692. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "none" );
  693. level.sabBomb maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  694. level.sabBomb maps\mp\gametypes\_gameobjects::setDropped();
  695. self.useWeapon = "briefcase_bomb_defuse_mp";
  696.  
  697. self setUpForDefusing();
  698. }
  699. else // defused the bomb
  700. {
  701. player notify ( "bomb_defused" );
  702. player logString( "bomb defused" );
  703.  
  704. if( isdefined(player.pers["defuses"]) )
  705. {
  706. player.pers["defuses"]++;
  707. player.defuses = player.pers["defuses"];
  708. }
  709.  
  710. player maps\mp\_medals::hero();
  711.  
  712. player maps\mp\gametypes\_persistence::statAddWithGameType( "DEFUSES", 1 );
  713.  
  714. level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_DEFUSED_BY", player );
  715. //thread playSoundOnPlayers( "mus_sab_defused"+"_"+level.teamPostfix[team] );
  716. maps\mp\gametypes\_globallogic_audio::set_music_on_team( "UNDERSCORE", "both", true );
  717.  
  718. maps\mp\gametypes\_globallogic_audio::leaderDialog( "bomb_defused" );
  719.  
  720. maps\mp\gametypes\_globallogic_score::givePlayerScore( "defuse", player );
  721. //player thread [[level.onXPEvent]]( "defuse" );
  722.  
  723. level thread bombDefused( self );
  724.  
  725. if ( level.inOverTime && isDefined( level.plantingTeamDead ) )
  726. {
  727. thread maps\mp\gametypes\_globallogic::endGame( player.pers["team"], game["strings"][level.bombPlantedBy+"_eliminated"] );
  728. return;
  729. }
  730.  
  731. self resetBombsite();
  732.  
  733. level.sabBomb maps\mp\gametypes\_gameobjects::allowCarry( "any" );
  734. level.sabBomb maps\mp\gametypes\_gameobjects::setPickedUp( player );
  735. }
  736. }
  737.  
  738.  
  739. onCantUse( player )
  740. {
  741. player iPrintLnBold( &"MP_CANT_PLANT_WITHOUT_BOMB" );
  742. }
  743.  
  744.  
  745. bombPlanted( destroyedObj, team )
  746. {
  747. game["challenge"][team]["plantedBomb"] = true;
  748. maps\mp\gametypes\_globallogic_utils::pauseTimer();
  749. level.bombPlanted = true;
  750. level.bombPlantedBy = team;
  751. level.timeLimitOverride = true;
  752. setMatchFlag( "bomb_timer", 1 );
  753.  
  754. // communicate timer information to menus
  755. setGameEndTime( int( getTime() + (level.bombTimer * 1000) ) );
  756.  
  757. destroyedObj.visuals[0] thread maps\mp\gametypes\_globallogic_utils::playTickingSound( "mpl_sab_ui_suitcasebomb_timer" );
  758.  
  759. starttime = gettime();
  760. bombTimerWait();
  761.  
  762. setMatchFlag( "bomb_timer", 0 );
  763. destroyedObj.visuals[0] maps\mp\gametypes\_globallogic_utils::stopTickingSound();
  764.  
  765. if ( !level.bombPlanted )
  766. {
  767. if ( level.hotPotato )
  768. {
  769. timePassed = (gettime() - starttime) / 1000;
  770. level.bombTimer -= timePassed;
  771. }
  772. return;
  773. }
  774. /*
  775. for ( index = 0; index < level.players.size; index++ )
  776. {
  777. player = level.players[index];
  778. if ( player.pers["team"] == team )
  779. player thread maps\mp\gametypes\_hud_message::oldNotifyMessage( "Your team scored!", undefined, undefined, (0, 1, 0) );
  780. else if ( player.pers["team"] == level.otherTeam[team] )
  781. player thread maps\mp\gametypes\_hud_message::oldNotifyMessage( "Enemy team scored!", undefined, undefined, (1, 0, 0) );
  782. }
  783. */
  784. explosionOrigin = level.sabBomb.visuals[0].origin+(0,0,12);
  785. level.bombExploded = true;
  786.  
  787.  
  788. if ( isdefined( level.bombowner ) )
  789. {
  790. destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, level.bombowner, "MOD_EXPLOSIVE", "briefcase_bomb_mp" );
  791. level thread maps\mp\_popups::DisplayTeamMessageToAll( &"MP_EXPLOSIVES_BLOWUP_BY", level.bombowner );
  792. level.bombowner maps\mp\_medals::bomber();
  793.  
  794. level.bombowner maps\mp\gametypes\_persistence::statAddWithGameType( "DESTRUCTIONS", 1 );
  795.  
  796. }
  797. else
  798. destroyedObj.visuals[0] radiusDamage( explosionOrigin, 512, 200, 20, undefined, "MOD_EXPLOSIVE", "briefcase_bomb_mp" );
  799.  
  800. rot = randomfloat(360);
  801. explosionEffect = spawnFx( level._effect["bombexplosion"], explosionOrigin + (0,0,50), (0,0,1), (cos(rot),sin(rot),0) );
  802. triggerFx( explosionEffect );
  803.  
  804. thread playSoundinSpace( "mpl_sab_exp_suitcase_bomb_main", explosionOrigin );
  805.  
  806. if ( isDefined( destroyedObj.exploderIndex ) )
  807. exploder( destroyedObj.exploderIndex );
  808.  
  809. [[level._setTeamScore]]( team, [[level._getTeamScore]]( team ) + 1 );
  810.  
  811. setGameEndTime( 0 );
  812.  
  813. level.bombZones["allies"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  814. level.bombZones["axis"] maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  815. wait 3;
  816.  
  817. // end the round without resetting the timer
  818. thread maps\mp\gametypes\_globallogic::endGame( team, game["strings"]["target_destroyed"] );
  819. }
  820.  
  821. bombTimerWait()
  822. {
  823. level endon("bomb_defused");
  824. maps\mp\gametypes\_hostmigration::waitLongDurationWithGameEndTimeUpdate( level.bombTimer );
  825. }
  826.  
  827.  
  828. resetBombsite()
  829. {
  830. self maps\mp\gametypes\_gameobjects::allowUse( "enemy" );
  831. self maps\mp\gametypes\_gameobjects::setUseTime( level.plantTime );
  832. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_PLANTING_EXPLOSIVE" );
  833. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_PLANT_EXPLOSIVES" );
  834. self maps\mp\gametypes\_gameobjects::setKeyObject( level.sabBomb );
  835. /**
  836. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defend" );
  837. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defend" );
  838. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_target" );
  839. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_target" );
  840. **/
  841. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "none" );
  842. self.trigger SetInvisibleToAll();
  843. self.useWeapon = "briefcase_bomb_mp";
  844. }
  845.  
  846. setUpForDefusing()
  847. {
  848. self maps\mp\gametypes\_gameobjects::allowUse( "friendly" );
  849. self maps\mp\gametypes\_gameobjects::setUseTime( level.defuseTime );
  850. self maps\mp\gametypes\_gameobjects::setUseText( &"MP_DEFUSING_EXPLOSIVE" );
  851. self maps\mp\gametypes\_gameobjects::setUseHintText( &"PLATFORM_HOLD_TO_DEFUSE_EXPLOSIVES" );
  852. self maps\mp\gametypes\_gameobjects::setKeyObject( undefined );
  853. /**
  854. self maps\mp\gametypes\_gameobjects::set2DIcon( "friendly", "compass_waypoint_defuse" );
  855. self maps\mp\gametypes\_gameobjects::set3DIcon( "friendly", "waypoint_defuse" );
  856. self maps\mp\gametypes\_gameobjects::set2DIcon( "enemy", "compass_waypoint_defend" );
  857. self maps\mp\gametypes\_gameobjects::set3DIcon( "enemy", "waypoint_defend" );
  858. **/
  859. self maps\mp\gametypes\_gameobjects::setVisibleTeam( "any" );
  860. self.trigger SetVisibleToAll();
  861. }
  862.  
  863. bombDefused( object )
  864. {
  865. setMatchFlag( "bomb_timer", 0 );
  866. maps\mp\gametypes\_globallogic_utils::resumeTimer();
  867. level.bombPlanted = false;
  868. if ( !level.inOvertime )
  869. level.timeLimitOverride = false;
  870.  
  871. level notify("bomb_defused");
  872. }
  873.  
  874. onPlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
  875. {
  876. inBombZone = false;
  877. inBombZoneTeam = "none";
  878.  
  879. if ( isdefined( sWeapon ) && maps\mp\gametypes\_hardpoints::isKillstreakWeapon( sWeapon ) )
  880. return;
  881.  
  882. if ( isdefined( level.bombZones["allies"] ) )
  883. {
  884. dist = Distance2d(self.origin, level.bombZones["allies"].curorigin);
  885. if ( dist < level.defaultOffenseRadius )
  886. {
  887. inBombZoneTeam = "allies";
  888. inBombZone = true;
  889. }
  890. }
  891. if ( isdefined( level.bombZones["axis"] ) )
  892. {
  893. dist = Distance2d(self.origin, level.bombZones["axis"].curorigin);
  894. if ( dist < level.defaultOffenseRadius )
  895. {
  896. inBombZoneTeam = "axis";
  897. inBombZone = true;
  898. }
  899. }
  900.  
  901. if ( inBombZone && isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] )
  902. {
  903. if ( inBombZoneTeam == self.pers["team"] )
  904. {
  905. attacker maps\mp\_medals::offense( sWeapon );
  906. attacker maps\mp\gametypes\_persistence::statAddWithGameType( "OFFENDS", 1 );
  907. }
  908. else
  909. {
  910. if( isdefined(attacker.pers["defends"]) )
  911. {
  912. attacker.pers["defends"]++;
  913. attacker.defends = attacker.pers["defends"];
  914. }
  915.  
  916. attacker maps\mp\_medals::defense( sWeapon );
  917. attacker maps\mp\gametypes\_persistence::statAddWithGameType( "DEFENDS", 1 );
  918. }
  919. }
  920.  
  921. if ( isPlayer( attacker ) && attacker.pers["team"] != self.pers["team"] && isdefined( self.isBombCarrier ) && self.isBombCarrier == true )
  922. attacker maps\mp\_challenges::killedBombCarrier();
  923. }
  924.  
  925. onEndGame( winningTeam )
  926. {
  927. if ( isdefined( winningTeam ) && (winningTeam == "allies" || winningTeam == "axis") )
  928. [[level._setTeamScore]]( winningTeam, [[level._getTeamScore]]( winningTeam ) + 1 );
  929. }
  930.  
  931. onRoundEndGame( roundWinner )
  932. {
  933. if ( game["roundswon"]["allies"] == game["roundswon"]["axis"] )
  934. winner = "tie";
  935. else if ( game["roundswon"]["axis"] > game["roundswon"]["allies"] )
  936. winner = "axis";
  937. else
  938. winner = "allies";
  939.  
  940. return winner;
  941. }
  942.  
  943. sab_gamemodeSpawnDvars()
  944. {
  945. ss = level.spawnsystem;
  946.  
  947. // sabotage: influencer around friendly base
  948. ss.sab_friendly_base_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_friendly_base_influencer_score", "100");
  949. ss.sab_friendly_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_friendly_base_influencer_score_curve", "constant");
  950. ss.sab_friendly_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_friendly_base_influencer_radius", "" + 15.0*get_player_height());
  951.  
  952. // sabotage: influencer around enemy base
  953. ss.sab_enemy_base_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_enemy_base_influencer_score", "-500");
  954. ss.sab_enemy_base_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_enemy_base_influencer_score_curve", "constant");
  955. ss.sab_enemy_base_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_enemy_base_influencer_radius", "" + 15.0*get_player_height());
  956.  
  957. // sabotage: negative influencer around carrier
  958. ss.sab_carrier_influencer_score = set_dvar_float_if_unset("scr_spawn_sab_carrier_influencer_score", "-75");
  959. ss.sab_carrier_influencer_score_curve = set_dvar_if_unset("scr_spawn_sab_carrier_influencer_score_curve", "linear");
  960. ss.sab_carrier_influencer_radius = set_dvar_float_if_unset("scr_spawn_sab_carrier_influencer_radius", "" + 8.0*get_player_height());
  961.  
  962. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement