Advertisement
Guest User

Untitled

a guest
May 29th, 2017
521
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 63.58 KB | None | 0 0
  1. /*
  2. /*
  3. Search and Destroy
  4. Attackers objective: Bomb one of 2 positions
  5. Defenders objective: Defend these 2 positions / Defuse planted bombs
  6. Objective: Hide from the Seekers and Seekers look for Hiders.
  7. Map ends: Map ends once all hiders are found or if time runs out.
  8. Respawning: when you are killed by a seeker you have to wait till next round.
  9.  
  10. Level requirements
  11. ------------------
  12. Allied Spawnpoints:
  13. classname mp_searchanddestroy_spawn_allied
  14. Allied players spawn from these. Place atleast 16 of these relatively close together.
  15.  
  16. Axis Spawnpoints:
  17. classname mp_searchanddestroy_spawn_axis
  18. Axis players spawn from these. Place atleast 16 of these relatively close together.
  19.  
  20. Spectator Spawnpoints:
  21. classname mp_searchanddestroy_intermission
  22. Spectators spawn from these and intermission is viewed from these positions.
  23. Atleast one is required, any more and they are randomly chosen between.
  24.  
  25. Bombzone A:
  26. classname trigger_multiple
  27. targetname bombzone_A
  28. script_gameobjectname bombzone
  29. This is a volume of space in which the bomb can planted. Must contain an origin brush.
  30.  
  31. Bombzone B:
  32. classname trigger_multiple
  33. targetname bombzone_B
  34. script_gameobjectname bombzone
  35. This is a volume of space in which the bomb can planted. Must contain an origin brush.
  36.  
  37. Bomb:
  38. classname trigger_lookat
  39. targetname bombtrigger
  40. script_gameobjectname bombzone
  41. 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.
  42. Must be in the level somewhere. This is the trigger that is used when defusing a bomb.
  43. It gets moved to the position of the planted bomb model.
  44.  
  45. Level script requirements
  46. -------------------------
  47. Team Definitions:
  48. game["allies"] = "Seeker's";
  49. game["axis"] = "Hider's";
  50. This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german.
  51.  
  52. game["attackers"] = "allies";
  53. game["defenders"] = "axis";
  54. This sets which team is attacking and which team is defending. Attackers plant the bombs. Defenders protect the targets.
  55.  
  56. If using minefields or exploders:
  57. maps\mp\_load::main();
  58.  
  59. Optional level script settings
  60. ------------------------------
  61. Soldier Type and Variation:
  62. game["american_soldiertype"] = "airborne";
  63. game["american_soldiervariation"] = "normal";
  64. game["german_soldiertype"] = "wehrmacht";
  65. game["german_soldiervariation"] = "normal";
  66. This sets what models are used for each nationality on a particular map.
  67.  
  68. Valid settings:
  69. american_soldiertype airborne
  70. american_soldiervariation normal, winter
  71.  
  72. british_soldiertype airborne, commando
  73. british_soldiervariation normal, winter
  74.  
  75. russian_soldiertype conscript, veteran
  76. russian_soldiervariation normal, winter
  77.  
  78. german_soldiertype waffen, wehrmacht, fallschirmjagercamo, fallschirmjagergrey, kriegsmarine
  79. german_soldiervariation normal, winter
  80.  
  81. Layout Image:
  82. game["layoutimage"] = "yourlevelname";
  83. This sets the image that is displayed when players use the "View Map" button in game.
  84. Create an overhead image of your map and name it "hud@layout_yourlevelname".
  85. Then move it to main\levelshots\layouts. This is generally done by taking a screenshot in the game.
  86. Use the outsideMapEnts console command to keep models such as trees from vanishing when noclipping outside of the map.
  87.  
  88. Exploder Effects:
  89. Setting script_noteworthy on a bombzone trigger to an exploder group can be used to trigger additional effects.
  90.  
  91. Note
  92. ----
  93. Setting "script_gameobjectname" to "bombzone" on any entity in a level will cause that entity to be removed in any gametype that
  94. does not explicitly allow it. This is done to remove unused entities when playing a map in other gametypes that have no use for them.
  95. */
  96.  
  97. /*QUAKED mp_searchanddestroy_spawn_allied (0.0 1.0 0.0) (-16 -16 0) (16 16 72)
  98. defaultmdl="xmodel/airborne"
  99. Allied players spawn randomly at one of these positions at the beginning of a round.
  100. */
  101.  
  102. /*QUAKED mp_searchanddestroy_spawn_axis (1.0 0.0 0.0) (-16 -16 0) (16 16 72)
  103. defaultmdl="xmodel/wehrmacht_soldier"
  104. Axis players spawn randomly at one of these positions at the beginning of a round.
  105. */
  106.  
  107. /*QUAKED mp_searchanddestroy_intermission (1.0 0.0 1.0) (-16 -16 -16) (16 16 16)
  108. Intermission is randomly viewed from one of these positions.
  109. Spectators spawn randomly at one of these positions.
  110. */
  111.  
  112. main()
  113. {
  114. spawnpointname = "mp_searchanddestroy_spawn_allied";
  115. spawnpoints = getentarray(spawnpointname, "classname");
  116.  
  117. if(!spawnpoints.size)
  118. {
  119. maps\mp\gametypes\_callbacksetup::AbortLevel();
  120. return;
  121. }
  122.  
  123. for(i = 0; i < spawnpoints.size; i++)
  124. spawnpoints[i] placeSpawnpoint();
  125.  
  126. spawnpointname = "mp_searchanddestroy_spawn_axis";
  127. spawnpoints = getentarray(spawnpointname, "classname");
  128.  
  129. if(!spawnpoints.size)
  130. {
  131. maps\mp\gametypes\_callbacksetup::AbortLevel();
  132. return;
  133. }
  134.  
  135. for(i = 0; i < spawnpoints.size; i++)
  136. spawnpoints[i] PlaceSpawnpoint();
  137.  
  138. level.callbackStartGameType = ::Callback_StartGameType;
  139. level.callbackPlayerConnect = ::Callback_PlayerConnect;
  140. level.callbackPlayerDisconnect = ::Callback_PlayerDisconnect;
  141. level.callbackPlayerDamage = ::Callback_PlayerDamage;
  142. level.callbackPlayerKilled = ::Callback_PlayerKilled;
  143.  
  144. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  145.  
  146. level._effect["bombexplosion"] = loadfx("fx/explosions/mp_bomb.efx");
  147.  
  148. allowed[0] = "sd";
  149. allowed[1] = "bombzone";
  150. allowed[2] = "blocker";
  151. maps\mp\gametypes\_gameobjects::main(allowed);
  152.  
  153. if(getCvar("scr_hns_timelimit") == "") // Time limit per map
  154. setCvar("scr_hns_timelimit", "0");
  155. else if(getCvarFloat("scr_hns_timelimit") > 1440)
  156. setCvar("scr_hns_timelimit", "1440");
  157. level.timelimit = getCvarFloat("scr_hns_timelimit");
  158. setCvar("ui_hns_timelimit", level.timelimit);
  159. makeCvarServerInfo("ui_hns_timelimit", "0");
  160.  
  161. if(!isDefined(game["timepassed"]))
  162. game["timepassed"] = 0;
  163.  
  164. if(getCvar("scr_hns_scorelimit") == "") // Score limit per map
  165. setCvar("scr_hns_scorelimit", "10");
  166. level.scorelimit = getCvarInt("scr_hns_scorelimit");
  167. setCvar("ui_hns_scorelimit", level.scorelimit);
  168. makeCvarServerInfo("ui_hns_scorelimit", "10");
  169.  
  170. if(getCvar("scr_hns_roundlimit") == "") // Round limit per map
  171. setCvar("scr_hns_roundlimit", "0");
  172. level.roundlimit = getCvarInt("scr_hns_roundlimit");
  173. setCvar("ui_hns_roundlimit", level.roundlimit);
  174. makeCvarServerInfo("ui_hns_roundlimit", "0");
  175.  
  176. if(getCvar("scr_hns_roundlength") == "") // Time length of each round
  177. setCvar("scr_hns_roundlength", "4");
  178. else if(getCvarFloat("scr_hns_roundlength") > 10)
  179. setCvar("scr_hns_roundlength", "10");
  180. level.roundlength = getCvarFloat("scr_hns_roundlength");
  181.  
  182. if(getCvar("scr_hns_graceperiod") == "") // Time at round start where spawning and weapon choosing is still allowed
  183. setCvar("scr_hns_graceperiod", "15");
  184. else if(getCvarFloat("scr_hns_graceperiod") > 60)
  185. setCvar("scr_hns_graceperiod", "60");
  186. level.graceperiod = getCvarFloat("scr_hns_graceperiod");
  187.  
  188. killcam = getCvar("scr_killcam");
  189. if(killcam == "") // Kill cam
  190. killcam = "1";
  191. setCvar("scr_killcam", killcam, true);
  192. level.killcam = getCvarInt("scr_killcam");
  193.  
  194. if(getCvar("scr_teambalance") == "") // Auto Team Balancing
  195. setCvar("scr_teambalance", "0");
  196. level.teambalance = getCvarInt("scr_teambalance");
  197. level.lockteams = false;
  198.  
  199. if(getCvar("scr_freelook") == "") // Free look spectator
  200. setCvar("scr_freelook", "1");
  201. level.allowfreelook = getCvarInt("scr_freelook");
  202.  
  203. if(getCvar("scr_spectateenemy") == "") // Spectate Enemy Team
  204. setCvar("scr_spectateenemy", "1");
  205. level.allowenemyspectate = getCvarInt("scr_spectateenemy");
  206.  
  207. if(getCvar("scr_drawfriend") == "") // Draws a team icon over teammates
  208. setCvar("scr_drawfriend", "0");
  209. level.drawfriend = getCvarInt("scr_drawfriend");
  210.  
  211. if(!isDefined(game["state"]))
  212. game["state"] = "playing";
  213. if(!isDefined(game["roundsplayed"]))
  214. game["roundsplayed"] = 0;
  215. if(!isDefined(game["matchstarted"]))
  216. game["matchstarted"] = false;
  217.  
  218. if(!isDefined(game["alliedscore"]))
  219. game["alliedscore"] = 0;
  220. setTeamScore("allies", game["alliedscore"]);
  221.  
  222. if(!isDefined(game["axisscore"]))
  223. game["axisscore"] = 0;
  224. setTeamScore("axis", game["axisscore"]);
  225.  
  226. level.bombplanted = false;
  227. level.bombexploded = false;
  228. level.roundstarted = false;
  229. level.roundended = false;
  230. level.mapended = false;
  231.  
  232. if (!isdefined (game["BalanceTeamsNextRound"]))
  233. game["BalanceTeamsNextRound"] = false;
  234.  
  235. level.exist["allies"] = 0;
  236. level.exist["axis"] = 0;
  237. level.exist["teams"] = false;
  238. level.didexist["allies"] = false;
  239. level.didexist["axis"] = false;
  240.  
  241. maps\mp\gametypes\_moxhns::main(); //***HNS ADDED***
  242.  
  243. if(level.killcam >= 1)
  244. setarchive(true);
  245. }
  246.  
  247. Callback_StartGameType()
  248. {
  249. // if this is a fresh map start, set nationalities based on cvars, otherwise leave game variable nationalities as set in the level script
  250. if(!isDefined(game["gamestarted"]))
  251. {
  252. // defaults if not defined in level script
  253. if(!isDefined(game["allies"]))
  254. game["allies"] = "american";
  255. if(!isDefined(game["axis"]))
  256. game["axis"] = "german";
  257.  
  258. if(!isDefined(game["layoutimage"]))
  259. game["layoutimage"] = "default";
  260. layoutname = "levelshots/layouts/hud@layout_" + game["layoutimage"];
  261. precacheShader(layoutname);
  262. setCvar("scr_layoutimage", layoutname);
  263. makeCvarServerInfo("scr_layoutimage", "");
  264.  
  265. // server cvar overrides
  266. if(getCvar("scr_allies") != "")
  267. game["allies"] = getCvar("scr_allies");
  268. if(getCvar("scr_axis") != "")
  269. game["axis"] = getCvar("scr_axis");
  270.  
  271. game["menu_serverinfo"] = "serverinfo_" + getCvar("g_gametype");
  272. game["menu_team"] = "team_" + game["allies"] + game["axis"];
  273. game["menu_weapon_allies"] = "weapon_" + game["allies"];
  274. game["menu_weapon_axis"] = "weapon_" + game["axis"];
  275. game["menu_viewmap"] = "viewmap";
  276. game["menu_callvote"] = "callvote";
  277. game["menu_quickcommands"] = "quickcommands";
  278. game["menu_quickstatements"] = "quickstatements";
  279. game["menu_quickresponses"] = "quickresponses";
  280. game["menu_quickhns"] = "quickhns";
  281. game["menu_quickprop"] = "quickprop";
  282.  
  283. precacheString(&"MPSCRIPT_PRESS_ACTIVATE_TO_SKIP");
  284. precacheString(&"MPSCRIPT_KILLCAM");
  285. precacheString(&"SD_MATCHSTARTING");
  286. precacheString(&"SD_MATCHRESUMING");
  287. precacheString(&"SD_EXPLOSIVESPLANTED");
  288. precacheString(&"SD_EXPLOSIVESDEFUSED");
  289. precacheString(&"SD_ROUNDDRAW");
  290. precacheString(&"SD_TIMEHASEXPIRED");
  291. precacheString(&"SD_ALLIEDMISSIONACCOMPLISHED");
  292. precacheString(&"SD_AXISMISSIONACCOMPLISHED");
  293. precacheString(&"SD_ALLIESHAVEBEENELIMINATED");
  294. precacheString(&"SD_AXISHAVEBEENELIMINATED");
  295.  
  296. precacheMenu(game["menu_serverinfo"]);
  297. precacheMenu(game["menu_team"]);
  298. precacheMenu(game["menu_weapon_allies"]);
  299. precacheMenu(game["menu_weapon_axis"]);
  300. precacheMenu(game["menu_viewmap"]);
  301. precacheMenu(game["menu_callvote"]);
  302. precacheMenu(game["menu_quickcommands"]);
  303. precacheMenu(game["menu_quickstatements"]);
  304. precacheMenu(game["menu_quickresponses"]);
  305. precacheMenu(game["menu_quickhns"]);
  306. precacheMenu(game["menu_quickprop"]);
  307.  
  308. precacheShader("black");
  309. precacheShader("white");
  310. precacheShader("hudScoreboard_mp");
  311. precacheShader("gfx/hud/hud@mpflag_spectator.tga");
  312. precacheStatusIcon("gfx/hud/hud@status_dead.tga");
  313. precacheStatusIcon("gfx/hud/hud@status_connecting.tga");
  314.  
  315. precacheShader("ui_mp/assets/hud@plantbomb.tga");
  316. precacheShader("ui_mp/assets/hud@defusebomb.tga");
  317. precacheShader("gfx/hud/hud@objectiveA.tga");
  318. precacheShader("gfx/hud/hud@objectiveA_up.tga");
  319. precacheShader("gfx/hud/hud@objectiveA_down.tga");
  320. precacheShader("gfx/hud/hud@objectiveB.tga");
  321. precacheShader("gfx/hud/hud@objectiveB_up.tga");
  322. precacheShader("gfx/hud/hud@objectiveB_down.tga");
  323. precacheShader("gfx/hud/hud@bombplanted.tga");
  324. precacheShader("gfx/hud/hud@bombplanted_up.tga");
  325. precacheShader("gfx/hud/hud@bombplanted_down.tga");
  326. precacheShader("gfx/hud/hud@bombplanted_down.tga");
  327. precacheModel("xmodel/mp_bomb1_defuse");
  328. precacheModel("xmodel/mp_bomb1");
  329.  
  330. maps\mp\gametypes\_teams::precache();
  331. maps\mp\gametypes\_teams::scoreboard();
  332.  
  333. //thread addBotClients();
  334. }
  335.  
  336. maps\mp\gametypes\_teams::modeltype();
  337. maps\mp\gametypes\_teams::initGlobalCvars();
  338. maps\mp\gametypes\_teams::initWeaponCvars();
  339. maps\mp\gametypes\_teams::restrictPlacedWeapons();
  340. thread maps\mp\gametypes\_teams::updateGlobalCvars();
  341. thread maps\mp\gametypes\_teams::updateWeaponCvars();
  342.  
  343. game["gamestarted"] = true;
  344.  
  345. setClientNameMode("manual_change");
  346.  
  347. thread bombzones();
  348. thread startGame();
  349. thread updateGametypeCvars();
  350. //thread addBotClients();
  351. }
  352.  
  353. Callback_PlayerConnect()
  354. {
  355. self.statusicon = "gfx/hud/hud@status_connecting.tga";
  356. self waittill("begin");
  357. self.statusicon = "";
  358. self.pers["teamTime"] = 1000000;
  359.  
  360. if(!isDefined(self.pers["team"]))
  361. iprintln(&"MPSCRIPT_CONNECTED", self);
  362.  
  363. lpselfnum = self getEntityNumber();
  364. lpselfguid = self getGuid();
  365. logPrint("J;" + lpselfguid + ";" + lpselfnum + ";" + self.name + "\n");
  366.  
  367. if(game["state"] == "intermission")
  368. {
  369. spawnIntermission();
  370. return;
  371. }
  372.  
  373. level endon("intermission");
  374.  
  375. if(isDefined(self.pers["team"]) && self.pers["team"] != "spectator")
  376. {
  377. self setClientCvar("ui_weapontab", "1");
  378.  
  379. if(self.pers["team"] == "allies")
  380. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  381. else
  382. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  383.  
  384. if(isDefined(self.pers["weapon"]))
  385. spawnPlayer();
  386. else
  387. {
  388. self.sessionteam = "spectator";
  389.  
  390. spawnSpectator();
  391.  
  392. if(self.pers["team"] == "allies")
  393. self openMenu(game["menu_weapon_allies"]);
  394. else
  395. self openMenu(game["menu_weapon_axis"]);
  396. }
  397. }
  398. else
  399. {
  400. self setClientCvar("g_scriptMainMenu", game["menu_team"]);
  401. self setClientCvar("ui_weapontab", "0");
  402.  
  403. if(!isDefined(self.pers["skipserverinfo"]))
  404. self openMenu(game["menu_serverinfo"]);
  405.  
  406. self.pers["team"] = "spectator";
  407. self.sessionteam = "spectator";
  408.  
  409. spawnSpectator();
  410. }
  411.  
  412. for(;;)
  413. {
  414. self waittill("menuresponse", menu, response);
  415.  
  416. if(menu == game["menu_serverinfo"] && response == "close")
  417. {
  418. self.pers["skipserverinfo"] = true;
  419. self openMenu(game["menu_team"]);
  420. }
  421.  
  422. if(response == "open" || response == "close")
  423. continue;
  424.  
  425. if(menu == game["menu_team"])
  426. {
  427. switch(response)
  428. {
  429. case "allies":
  430. case "axis":
  431. case "autoassign":
  432. if (level.lockteams)
  433. break;
  434. if(response == "autoassign")
  435. {
  436. numonteam["allies"] = 0;
  437. numonteam["axis"] = 0;
  438.  
  439. players = getentarray("player", "classname");
  440. for(i = 0; i < players.size; i++)
  441. {
  442. player = players[i];
  443.  
  444. if(!isDefined(player.pers["team"]) || player.pers["team"] == "spectator" || player == self)
  445. continue;
  446.  
  447. numonteam[player.pers["team"]]++;
  448. }
  449.  
  450. // if teams are equal return the team with the lowest score
  451. if(numonteam["allies"] == numonteam["axis"])
  452. {
  453. if(getTeamScore("allies") == getTeamScore("axis"))
  454. {
  455. teams[0] = "allies";
  456. teams[1] = "axis";
  457. response = teams[randomInt(2)];
  458. }
  459. else if(getTeamScore("allies") < getTeamScore("axis"))
  460. response = "allies";
  461. else
  462. response = "axis";
  463. }
  464. else if(numonteam["allies"] < numonteam["axis"])
  465. response = "allies";
  466. else
  467. response = "axis";
  468. skipbalancecheck = true;
  469. }
  470.  
  471. if(response == self.pers["team"] && self.sessionstate == "playing")
  472. break;
  473.  
  474. //Check if the teams will become unbalanced when the player goes to this team...
  475. //------------------------------------------------------------------------------
  476. if ( (level.teambalance > 0) && (!isdefined (skipbalancecheck)) )
  477. {
  478. //Get a count of all players on Axis and Allies
  479. players = maps\mp\gametypes\_teams::CountPlayers();
  480.  
  481. if (self.sessionteam != "spectator")
  482. {
  483. if (((players[response] + 1) - (players[self.pers["team"]] - 1)) > level.teambalance)
  484. {
  485. if (response == "allies")
  486. {
  487. if (game["allies"] == "american")
  488. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED",&"PATCH_1_3_AMERICAN");
  489. else if (game["allies"] == "british")
  490. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED",&"PATCH_1_3_BRITISH");
  491. else if (game["allies"] == "russian")
  492. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED",&"PATCH_1_3_RUSSIAN");
  493. }
  494. else
  495. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED",&"PATCH_1_3_GERMAN");
  496. break;
  497. }
  498. }
  499. else
  500. {
  501. if (response == "allies")
  502. otherteam = "axis";
  503. else
  504. otherteam = "allies";
  505. if (((players[response] + 1) - players[otherteam]) > level.teambalance)
  506. {
  507. if (response == "allies")
  508. {
  509. if (game["allies"] == "american")
  510. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED2",&"PATCH_1_3_AMERICAN");
  511. else if (game["allies"] == "british")
  512. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED2",&"PATCH_1_3_BRITISH");
  513. else if (game["allies"] == "russian")
  514. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_ALLIED2",&"PATCH_1_3_RUSSIAN");
  515. }
  516. else
  517. {
  518. if (game["allies"] == "american")
  519. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_AXIS",&"PATCH_1_3_AMERICAN");
  520. else if (game["allies"] == "british")
  521. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_AXIS",&"PATCH_1_3_BRITISH");
  522. else if (game["allies"] == "russian")
  523. self iprintlnbold(&"PATCH_1_3_CANTJOINTEAM_AXIS",&"PATCH_1_3_RUSSIAN");
  524. }
  525. break;
  526. }
  527. }
  528. }
  529. skipbalancecheck = undefined;
  530. //------------------------------------------------------------------------------
  531.  
  532. if(response != self.pers["team"] && self.sessionstate == "playing")
  533. self suicide();
  534.  
  535. self.pers["team"] = response;
  536. self.pers["teamTime"] = (gettime() / 1000);
  537. self.pers["weapon"] = undefined;
  538. self.pers["weapon1"] = undefined;
  539. self.pers["weapon2"] = undefined;
  540. self.pers["spawnweapon"] = undefined;
  541. self.pers["savedmodel"] = undefined;
  542.  
  543. // update spectator permissions immediately on change of team
  544. maps\mp\gametypes\_teams::SetSpectatePermissions();
  545.  
  546. self setClientCvar("ui_weapontab", "1");
  547.  
  548. if(self.pers["team"] == "allies")
  549. {
  550. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  551. self openMenu(game["menu_weapon_allies"]);
  552. }
  553. else
  554. {
  555. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  556. self openMenu(game["menu_weapon_axis"]);
  557. }
  558. break;
  559.  
  560. case "spectator":
  561. if (level.lockteams)
  562. break;
  563. if(self.pers["team"] != "spectator")
  564. {
  565. if(isAlive(self))
  566. self suicide();
  567.  
  568. self.pers["team"] = "spectator";
  569. self.pers["teamTime"] = 1000000;
  570. self.pers["weapon"] = undefined;
  571. self.pers["weapon1"] = undefined;
  572. self.pers["weapon2"] = undefined;
  573. self.pers["spawnweapon"] = undefined;
  574. self.pers["savedmodel"] = undefined;
  575.  
  576. self.sessionteam = "spectator";
  577. self setClientCvar("g_scriptMainMenu", game["menu_team"]);
  578. self setClientCvar("ui_weapontab", "0");
  579. spawnSpectator();
  580. }
  581. break;
  582.  
  583. case "weapon":
  584. if(self.pers["team"] == "allies")
  585. self openMenu(game["menu_weapon_allies"]);
  586. else if(self.pers["team"] == "axis")
  587. self openMenu(game["menu_weapon_axis"]);
  588. break;
  589.  
  590. case "viewmap":
  591. self openMenu(game["menu_viewmap"]);
  592. break;
  593.  
  594. case "callvote":
  595. self openMenu(game["menu_callvote"]);
  596. break;
  597. }
  598. }
  599. else if(menu == game["menu_weapon_allies"] || menu == game["menu_weapon_axis"])
  600. {
  601. if(response == "team")
  602. {
  603. self openMenu(game["menu_team"]);
  604. continue;
  605. }
  606. else if(response == "viewmap")
  607. {
  608. self openMenu(game["menu_viewmap"]);
  609. continue;
  610. }
  611. else if(response == "callvote")
  612. {
  613. self openMenu(game["menu_callvote"]);
  614. continue;
  615. }
  616.  
  617. if(!isDefined(self.pers["team"]) || (self.pers["team"] != "allies" && self.pers["team"] != "axis"))
  618. continue;
  619.  
  620. weapon = self maps\mp\gametypes\_teams::restrict(response);
  621.  
  622. if(weapon == "restricted")
  623. {
  624. self openMenu(menu);
  625. continue;
  626. }
  627.  
  628. self.pers["selectedweapon"] = weapon;
  629.  
  630. if(isDefined(self.pers["weapon"]) && self.pers["weapon"] == weapon && !isDefined(self.pers["weapon1"]))
  631. continue;
  632.  
  633. if(!game["matchstarted"])
  634. {
  635. if(isDefined(self.pers["weapon"]))
  636. {
  637. self.pers["weapon"] = weapon;
  638. self setWeaponSlotWeapon("primary", weapon);
  639. self setWeaponSlotAmmo("primary", 999);
  640. self setWeaponSlotClipAmmo("primary", 999);
  641. self switchToWeapon(weapon);
  642.  
  643. maps\mp\gametypes\_teams::givePistol();
  644. maps\mp\gametypes\_teams::giveGrenades(self.pers["selectedweapon"]);
  645. }
  646. else
  647. {
  648. self.pers["weapon"] = weapon;
  649. self.spawned = undefined;
  650. spawnPlayer();
  651. self thread printJoinedTeam(self.pers["team"]);
  652. level checkMatchStart();
  653. }
  654. }
  655. else if(!level.roundstarted && !self.usedweapons)
  656. {
  657. if(isDefined(self.pers["weapon"]))
  658. {
  659. self.pers["weapon"] = weapon;
  660. self setWeaponSlotWeapon("primary", weapon);
  661. self setWeaponSlotAmmo("primary", 999);
  662. self setWeaponSlotClipAmmo("primary", 999);
  663. self switchToWeapon(weapon);
  664.  
  665. maps\mp\gametypes\_teams::givePistol();
  666. maps\mp\gametypes\_teams::giveGrenades(self.pers["selectedweapon"]);
  667. }
  668. else
  669. {
  670. self.pers["weapon"] = weapon;
  671. if(!level.exist[self.pers["team"]])
  672. {
  673. self.spawned = undefined;
  674. spawnPlayer();
  675. self thread printJoinedTeam(self.pers["team"]);
  676. level checkMatchStart();
  677. }
  678. else
  679. {
  680. spawnPlayer();
  681. self thread printJoinedTeam(self.pers["team"]);
  682. }
  683. }
  684. }
  685. else
  686. {
  687. if(isDefined(self.pers["weapon"]))
  688. self.oldweapon = self.pers["weapon"];
  689.  
  690. self.pers["weapon"] = weapon;
  691. self.sessionteam = self.pers["team"];
  692.  
  693. if(self.sessionstate != "playing")
  694. self.statusicon = "gfx/hud/hud@status_dead.tga";
  695.  
  696. if(self.pers["team"] == "allies")
  697. otherteam = "axis";
  698. else if(self.pers["team"] == "axis")
  699. otherteam = "allies";
  700.  
  701. // if joining a team that has no opponents, just spawn
  702. if(!level.didexist[otherteam] && !level.roundended)
  703. {
  704. self.spawned = undefined;
  705. spawnPlayer();
  706. self thread printJoinedTeam(self.pers["team"]);
  707. }
  708. else if(!level.didexist[self.pers["team"]] && !level.roundended)
  709. {
  710. self.spawned = undefined;
  711. spawnPlayer();
  712. self thread printJoinedTeam(self.pers["team"]);
  713. level checkMatchStart();
  714. }
  715. else
  716. {
  717. weaponname = maps\mp\gametypes\_teams::getWeaponName(self.pers["weapon"]);
  718.  
  719. if(self.pers["team"] == "allies")
  720. {
  721. if(maps\mp\gametypes\_teams::useAn(self.pers["weapon"]))
  722. self iprintln(&"MPSCRIPT_YOU_WILL_SPAWN_ALLIED_WITH_AN_NEXT_ROUND", weaponname);
  723. else
  724. self iprintln(&"MPSCRIPT_YOU_WILL_SPAWN_ALLIED_WITH_A_NEXT_ROUND", weaponname);
  725. }
  726. else if(self.pers["team"] == "axis")
  727. {
  728. if(maps\mp\gametypes\_teams::useAn(self.pers["weapon"]))
  729. self iprintln(&"MPSCRIPT_YOU_WILL_SPAWN_AXIS_WITH_AN_NEXT_ROUND", weaponname);
  730. else
  731. self iprintln(&"MPSCRIPT_YOU_WILL_SPAWN_AXIS_WITH_A_NEXT_ROUND", weaponname);
  732. }
  733. }
  734. }
  735. self thread maps\mp\gametypes\_teams::SetSpectatePermissions();
  736. if (isdefined (self.autobalance_notify))
  737. self.autobalance_notify destroy();
  738. }
  739. else if(menu == game["menu_viewmap"])
  740. {
  741. switch(response)
  742. {
  743. case "team":
  744. self openMenu(game["menu_team"]);
  745. break;
  746.  
  747. case "weapon":
  748. if(self.pers["team"] == "allies")
  749. self openMenu(game["menu_weapon_allies"]);
  750. else if(self.pers["team"] == "axis")
  751. self openMenu(game["menu_weapon_axis"]);
  752. break;
  753.  
  754. case "callvote":
  755. self openMenu(game["menu_callvote"]);
  756. break;
  757. }
  758. }
  759. else if(menu == game["menu_callvote"])
  760. {
  761. switch(response)
  762. {
  763. case "team":
  764. self openMenu(game["menu_team"]);
  765. break;
  766.  
  767. case "weapon":
  768. if(self.pers["team"] == "allies")
  769. self openMenu(game["menu_weapon_allies"]);
  770. else if(self.pers["team"] == "axis")
  771. self openMenu(game["menu_weapon_axis"]);
  772. break;
  773.  
  774. case "viewmap":
  775. self openMenu(game["menu_viewmap"]);
  776. break;
  777. }
  778. }
  779. else if(menu == game["menu_quickprop"])
  780. maps\mp\gametypes\_moxhns::quickprop(response);
  781. else if(menu == game["menu_quickhns"])
  782. maps\mp\gametypes\_moxhns::quickhns(response);
  783. else if(menu == game["menu_quickcommands"])
  784. maps\mp\gametypes\_teams::quickcommands(response);
  785. else if(menu == game["menu_quickstatements"])
  786. maps\mp\gametypes\_teams::quickstatements(response);
  787. else if(menu == game["menu_quickresponses"])
  788. maps\mp\gametypes\_teams::quickresponses(response);
  789. }
  790. }
  791.  
  792. Callback_PlayerDisconnect()
  793. {
  794. iprintln(&"MPSCRIPT_DISCONNECTED", self);
  795.  
  796. lpselfnum = self getEntityNumber();
  797. lpselfguid = self getGuid();
  798. logPrint("Q;" + lpselfguid + ";" + lpselfnum + ";" + self.name + "\n");
  799.  
  800. if(game["matchstarted"])
  801. level thread updateTeamStatus();
  802. }
  803.  
  804. Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc)
  805. {
  806. if(self.sessionteam == "spectator")
  807. return;
  808.  
  809. // Don't do knockback if the damage direction was not specified
  810. if(!isDefined(vDir))
  811. iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
  812.  
  813. // check for completely getting out of the damage
  814. if(!(iDFlags & level.iDFLAGS_NO_PROTECTION))
  815. {
  816. if(isPlayer(eAttacker) && (self != eAttacker) && (self.pers["team"] == eAttacker.pers["team"]))
  817. {
  818. if(level.friendlyfire == "0")
  819. {
  820. return;
  821. }
  822. else if(level.friendlyfire == "1")
  823. {
  824. // Make sure at least one point of damage is done
  825. if(iDamage < 1)
  826. iDamage = 1;
  827.  
  828. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc);
  829. }
  830. else if(level.friendlyfire == "2")
  831. {
  832. eAttacker.friendlydamage = true;
  833.  
  834. iDamage = iDamage * .5;
  835.  
  836. // Make sure at least one point of damage is done
  837. if(iDamage < 1)
  838. iDamage = 1;
  839.  
  840. eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc);
  841. eAttacker.friendlydamage = undefined;
  842.  
  843. friendly = true;
  844. }
  845. else if(level.friendlyfire == "3")
  846. {
  847. eAttacker.friendlydamage = true;
  848.  
  849. iDamage = iDamage * .5;
  850.  
  851. // Make sure at least one point of damage is done
  852. if(iDamage < 1)
  853. iDamage = 1;
  854.  
  855. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc);
  856. eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc);
  857. eAttacker.friendlydamage = undefined;
  858.  
  859. friendly = true;
  860. }
  861. }
  862. else
  863. {
  864. // Make sure at least one point of damage is done
  865. if(iDamage < 1)
  866. iDamage = 1;
  867.  
  868. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc);
  869. }
  870. }
  871.  
  872. // Do debug print if it's enabled
  873. if(getCvarInt("g_debugDamage"))
  874. {
  875. println("client:" + self getEntityNumber() + " health:" + self.health +
  876. " damage:" + iDamage + " hitLoc:" + sHitLoc);
  877. }
  878.  
  879. if(self.sessionstate != "dead")
  880. {
  881. lpselfnum = self getEntityNumber();
  882. lpselfguid = self getGuid();
  883. lpselfname = self.name;
  884. lpselfteam = self.pers["team"];
  885. lpattackerteam = "";
  886.  
  887. if(isPlayer(eAttacker))
  888. {
  889. lpattacknum = eAttacker getEntityNumber();
  890. lpattackguid = self getGuid();
  891. lpattackname = eAttacker.name;
  892. lpattackerteam = eAttacker.pers["team"];
  893. }
  894. else
  895. {
  896. lpattacknum = -1;
  897. lpattackguid = "";
  898. lpattackname = "";
  899. lpattackerteam = "world";
  900. }
  901.  
  902. if(isDefined(friendly))
  903. {
  904. lpattacknum = lpselfnum;
  905. lpattackname = lpselfname;
  906. lpattackguid = lpselfguid;
  907. }
  908.  
  909. logPrint("D;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  910. }
  911. }
  912.  
  913. Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc)
  914. {
  915. self endon("spawned");
  916.  
  917. if(self.sessionteam == "spectator")
  918. return;
  919.  
  920. // If the player was killed by a head shot, let players know it was a head shot kill
  921. if(sHitLoc == "head" && sMeansOfDeath != "MOD_MELEE")
  922. sMeansOfDeath = "MOD_HEAD_SHOT";
  923.  
  924. // send out an obituary message to all clients about the kill
  925. obituary(self, attacker, sWeapon, sMeansOfDeath);
  926.  
  927. self.sessionstate = "dead";
  928. self.statusicon = "gfx/hud/hud@status_dead.tga";
  929. self.headicon = "";
  930. if (!isdefined (self.autobalance))
  931. {
  932. self.pers["deaths"]++;
  933. self.deaths = self.pers["deaths"];
  934. }
  935.  
  936. lpselfnum = self getEntityNumber();
  937. lpselfguid = self getGuid();
  938. lpselfname = self.name;
  939. lpselfteam = self.pers["team"];
  940. lpattackerteam = "";
  941.  
  942. attackerNum = -1;
  943.  
  944. if(isPlayer(attacker))
  945. {
  946. if(attacker == self) // killed himself
  947. {
  948. doKillcam = false;
  949. if (!isdefined (self.autobalance))
  950. {
  951. attacker.pers["score"]--;
  952. attacker.score = attacker.pers["score"];
  953. }
  954.  
  955. if(isDefined(attacker.friendlydamage))
  956. clientAnnouncement(attacker, &"MPSCRIPT_FRIENDLY_FIRE_WILL_NOT");
  957. }
  958. else
  959. {
  960. attackerNum = attacker getEntityNumber();
  961. doKillcam = true;
  962.  
  963. if(self.pers["team"] == attacker.pers["team"]) // killed by a friendly
  964. {
  965. attacker.pers["score"]--;
  966. attacker.score = attacker.pers["score"];
  967. }
  968. else
  969. {
  970. attacker.pers["score"]++;
  971. attacker.score = attacker.pers["score"];
  972. }
  973. }
  974.  
  975. lpattacknum = attacker getEntityNumber();
  976. lpattackguid = attacker getGuid();
  977. lpattackname = attacker.name;
  978. lpattackerteam = attacker.pers["team"];
  979. }
  980. else // If you weren't killed by a player, you were in the wrong place at the wrong time
  981. {
  982. doKillcam = false;
  983.  
  984. self.pers["score"]--;
  985. self.score = self.pers["score"];
  986.  
  987. lpattacknum = -1;
  988. lpattackguid = "";
  989. lpattackname = "";
  990. lpattackerteam = "world";
  991. }
  992.  
  993. logPrint("K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  994.  
  995. thread maps\mp\gametypes\_moxhns::checkRound(); //***HNS ADDED***
  996.  
  997. // Make the player drop his weapon
  998. if (!isdefined (self.autobalance))
  999. self dropItem(self getcurrentweapon());
  1000.  
  1001. self.pers["weapon1"] = undefined;
  1002. self.pers["weapon2"] = undefined;
  1003. self.pers["spawnweapon"] = undefined;
  1004.  
  1005. if (!isdefined (self.autobalance))
  1006. body = self cloneplayer();
  1007. self.autobalance = undefined;
  1008.  
  1009. updateTeamStatus();
  1010.  
  1011. // TODO: Add additional checks that allow killcam when the last player killed wouldn't end the round (bomb is planted)
  1012. if((getCvarInt("scr_killcam") <= 0) || !level.exist[self.pers["team"]]) // If the last player on a team was just killed, don't do killcam
  1013. doKillcam = false;
  1014.  
  1015. delay = 2; // Delay the player becoming a spectator till after he's done dying
  1016. wait delay; // ?? Also required for Callback_PlayerKilled to complete before killcam can execute
  1017.  
  1018. if(doKillcam && !level.roundended)
  1019. self thread killcam(attackerNum, delay);
  1020. else
  1021. {
  1022. currentorigin = self.origin;
  1023. currentangles = self.angles;
  1024.  
  1025. self thread spawnSpectator(currentorigin + (0, 0, 60), currentangles);
  1026. }
  1027. }
  1028.  
  1029. spawnPlayer()
  1030. {
  1031. self notify("spawned");
  1032.  
  1033. resettimeout();
  1034.  
  1035. self.sessionteam = self.pers["team"];
  1036. self.spectatorclient = -1;
  1037. self.archivetime = 0;
  1038. self.friendlydamage = undefined;
  1039.  
  1040. if(isDefined(self.spawned))
  1041. return;
  1042.  
  1043. self.sessionstate = "playing";
  1044.  
  1045. if(self.pers["team"] == "allies")
  1046. spawnpointname = "mp_searchanddestroy_spawn_allied";
  1047. else
  1048. spawnpointname = "mp_searchanddestroy_spawn_axis";
  1049.  
  1050. spawnpoints = getentarray(spawnpointname, "classname");
  1051. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  1052.  
  1053. if(isDefined(spawnpoint))
  1054. self spawn(spawnpoint.origin, spawnpoint.angles);
  1055. else
  1056. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  1057.  
  1058. self.spawned = true;
  1059. self.statusicon = "";
  1060. self.maxhealth = 100;
  1061. self.health = self.maxhealth;
  1062.  
  1063. updateTeamStatus();
  1064.  
  1065. if(!isDefined(self.pers["score"]))
  1066. self.pers["score"] = 0;
  1067. self.score = self.pers["score"];
  1068.  
  1069. if(!isDefined(self.pers["deaths"]))
  1070. self.pers["deaths"] = 0;
  1071. self.deaths = self.pers["deaths"];
  1072.  
  1073. if(!isDefined(self.pers["savedmodel"]))
  1074. maps\mp\gametypes\_teams::model();
  1075. else
  1076. maps\mp\_utility::loadModel(self.pers["savedmodel"]);
  1077.  
  1078. if(isDefined(self.pers["weapon1"]) && isDefined(self.pers["weapon2"]))
  1079. {
  1080. self setWeaponSlotWeapon("primary", self.pers["weapon1"]);
  1081. self setWeaponSlotAmmo("primary", 999);
  1082. self setWeaponSlotClipAmmo("primary", 999);
  1083.  
  1084. self setWeaponSlotWeapon("primaryb", self.pers["weapon2"]);
  1085. self setWeaponSlotAmmo("primaryb", 999);
  1086. self setWeaponSlotClipAmmo("primaryb", 999);
  1087.  
  1088. self setSpawnWeapon(self.pers["spawnweapon"]);
  1089. }
  1090. else
  1091. {
  1092. self setWeaponSlotWeapon("primary", self.pers["weapon"]);
  1093. self setWeaponSlotAmmo("primary", 999);
  1094. self setWeaponSlotClipAmmo("primary", 999);
  1095.  
  1096. self setSpawnWeapon(self.pers["weapon"]);
  1097. }
  1098.  
  1099. maps\mp\gametypes\_teams::givePistol();
  1100. maps\mp\gametypes\_teams::giveGrenades(self.pers["selectedweapon"]);
  1101.  
  1102. self.usedweapons = false;
  1103. thread maps\mp\gametypes\_teams::watchWeaponUsage();
  1104.  
  1105. if(self.pers["team"] == "allies")
  1106. self setClientCvar("cg_objectiveText", "Seeker's find Hiders and kill them!");
  1107. else if(self.pers["team"] == "axis")
  1108. self setClientCvar("cg_objectiveText", "Hider's Hide From Seekers and try to stay alive for the time runs out!");
  1109.  
  1110. if(level.drawfriend)
  1111. {
  1112. if(self.pers["team"] == "allies")
  1113. {
  1114. self.headicon = game["headicon_allies"];
  1115. self.headiconteam = "allies";
  1116. }
  1117. else
  1118. {
  1119. self.headicon = game["headicon_axis"];
  1120. self.headiconteam = "axis";
  1121. }
  1122. }
  1123. }
  1124.  
  1125. spawnSpectator(origin, angles)
  1126. {
  1127. self notify("spawned");
  1128.  
  1129. resettimeout();
  1130.  
  1131. self.sessionstate = "spectator";
  1132. self.spectatorclient = -1;
  1133. self.archivetime = 0;
  1134. self.friendlydamage = undefined;
  1135.  
  1136. if(self.pers["team"] == "spectator")
  1137. self.statusicon = "";
  1138.  
  1139. maps\mp\gametypes\_teams::SetSpectatePermissions();
  1140.  
  1141. if(isDefined(origin) && isDefined(angles))
  1142. self spawn(origin, angles);
  1143. else
  1144. {
  1145. spawnpointname = "mp_searchanddestroy_intermission";
  1146. spawnpoints = getentarray(spawnpointname, "classname");
  1147. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  1148.  
  1149. if(isDefined(spawnpoint))
  1150. self spawn(spawnpoint.origin, spawnpoint.angles);
  1151. else
  1152. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  1153. }
  1154.  
  1155. updateTeamStatus();
  1156.  
  1157. self.usedweapons = false;
  1158.  
  1159. if(game["attackers"] == "allies")
  1160. self setClientCvar("cg_objectiveText", &"SD_OBJ_SPECTATOR_ALLIESATTACKING");
  1161. else if(game["attackers"] == "axis")
  1162. self setClientCvar("cg_objectiveText", &"SD_OBJ_SPECTATOR_AXISATTACKING");
  1163. }
  1164.  
  1165. spawnIntermission()
  1166. {
  1167. self notify("spawned");
  1168.  
  1169. resettimeout();
  1170.  
  1171. self.sessionstate = "intermission";
  1172. self.spectatorclient = -1;
  1173. self.archivetime = 0;
  1174. self.friendlydamage = undefined;
  1175.  
  1176. spawnpointname = "mp_searchanddestroy_intermission";
  1177. spawnpoints = getentarray(spawnpointname, "classname");
  1178. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  1179.  
  1180. if(isDefined(spawnpoint))
  1181. self spawn(spawnpoint.origin, spawnpoint.angles);
  1182. else
  1183. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  1184. }
  1185.  
  1186. killcam(attackerNum, delay)
  1187. {
  1188. self endon("spawned");
  1189.  
  1190. // killcam
  1191. if(attackerNum < 0)
  1192. return;
  1193.  
  1194. self.sessionstate = "spectator";
  1195. self.spectatorclient = attackerNum;
  1196. self.archivetime = delay + 7;
  1197.  
  1198. maps\mp\gametypes\_teams::SetKillcamSpectatePermissions();
  1199.  
  1200. // wait till the next server frame to allow code a chance to update archivetime if it needs trimming
  1201. wait 0.05;
  1202.  
  1203. if(self.archivetime <= delay)
  1204. {
  1205. self.spectatorclient = -1;
  1206. self.archivetime = 0;
  1207.  
  1208. maps\mp\gametypes\_teams::SetSpectatePermissions();
  1209. return;
  1210. }
  1211.  
  1212. self.killcam = true;
  1213.  
  1214. if(!isDefined(self.kc_topbar))
  1215. {
  1216. self.kc_topbar = newClientHudElem(self);
  1217. self.kc_topbar.archived = false;
  1218. self.kc_topbar.x = 0;
  1219. self.kc_topbar.y = 0;
  1220. self.kc_topbar.alpha = 0.5;
  1221. self.kc_topbar setShader("black", 640, 112);
  1222. }
  1223.  
  1224. if(!isDefined(self.kc_bottombar))
  1225. {
  1226. self.kc_bottombar = newClientHudElem(self);
  1227. self.kc_bottombar.archived = false;
  1228. self.kc_bottombar.x = 0;
  1229. self.kc_bottombar.y = 368;
  1230. self.kc_bottombar.alpha = 0.5;
  1231. self.kc_bottombar setShader("black", 640, 112);
  1232. }
  1233.  
  1234. if(!isDefined(self.kc_title))
  1235. {
  1236. self.kc_title = newClientHudElem(self);
  1237. self.kc_title.archived = false;
  1238. self.kc_title.x = 320;
  1239. self.kc_title.y = 40;
  1240. self.kc_title.alignX = "center";
  1241. self.kc_title.alignY = "middle";
  1242. self.kc_title.sort = 1; // force to draw after the bars
  1243. self.kc_title.fontScale = 3.5;
  1244. }
  1245. self.kc_title setText(&"MPSCRIPT_KILLCAM");
  1246.  
  1247. if(!isDefined(self.kc_skiptext))
  1248. {
  1249. self.kc_skiptext = newClientHudElem(self);
  1250. self.kc_skiptext.archived = false;
  1251. self.kc_skiptext.x = 320;
  1252. self.kc_skiptext.y = 70;
  1253. self.kc_skiptext.alignX = "center";
  1254. self.kc_skiptext.alignY = "middle";
  1255. self.kc_skiptext.sort = 1; // force to draw after the bars
  1256. }
  1257. self.kc_skiptext setText(&"MPSCRIPT_PRESS_ACTIVATE_TO_SKIP");
  1258.  
  1259. if(!isDefined(self.kc_timer))
  1260. {
  1261. self.kc_timer = newClientHudElem(self);
  1262. self.kc_timer.archived = false;
  1263. self.kc_timer.x = 320;
  1264. self.kc_timer.y = 428;
  1265. self.kc_timer.alignX = "center";
  1266. self.kc_timer.alignY = "middle";
  1267. self.kc_timer.fontScale = 3.5;
  1268. self.kc_timer.sort = 1;
  1269. }
  1270. self.kc_timer setTenthsTimer(self.archivetime - delay);
  1271.  
  1272. self thread spawnedKillcamCleanup();
  1273. self thread waitSkipKillcamButton();
  1274. self thread waitKillcamTime();
  1275. self waittill("end_killcam");
  1276.  
  1277. self removeKillcamElements();
  1278.  
  1279. self.spectatorclient = -1;
  1280. self.archivetime = 0;
  1281. self.killcam = undefined;
  1282.  
  1283. maps\mp\gametypes\_teams::SetSpectatePermissions();
  1284. }
  1285.  
  1286. waitKillcamTime()
  1287. {
  1288. self endon("end_killcam");
  1289.  
  1290. wait(self.archivetime - 0.05);
  1291. self notify("end_killcam");
  1292. }
  1293.  
  1294. waitSkipKillcamButton()
  1295. {
  1296. self endon("end_killcam");
  1297.  
  1298. while(self useButtonPressed())
  1299. wait .05;
  1300.  
  1301. while(!(self useButtonPressed()))
  1302. wait .05;
  1303.  
  1304. self notify("end_killcam");
  1305. }
  1306.  
  1307. removeKillcamElements()
  1308. {
  1309. if(isDefined(self.kc_topbar))
  1310. self.kc_topbar destroy();
  1311. if(isDefined(self.kc_bottombar))
  1312. self.kc_bottombar destroy();
  1313. if(isDefined(self.kc_title))
  1314. self.kc_title destroy();
  1315. if(isDefined(self.kc_skiptext))
  1316. self.kc_skiptext destroy();
  1317. if(isDefined(self.kc_timer))
  1318. self.kc_timer destroy();
  1319. }
  1320.  
  1321. spawnedKillcamCleanup()
  1322. {
  1323. self endon("end_killcam");
  1324.  
  1325. self waittill("spawned");
  1326. self removeKillcamElements();
  1327. }
  1328.  
  1329. startGame()
  1330. {
  1331. level.starttime = getTime();
  1332. thread startRound();
  1333.  
  1334. if ( (level.teambalance > 0) && (!game["BalanceTeamsNextRound"]) )
  1335. level thread maps\mp\gametypes\_teams::TeamBalance_Check_Roundbased();
  1336. }
  1337.  
  1338. startRound()
  1339. {
  1340. level endon("bomb_planted");
  1341.  
  1342. thread maps\mp\gametypes\_teams::sayMoveIn();
  1343.  
  1344. level.clock = newHudElem();
  1345. level.clock.x = 320;
  1346. level.clock.y = 460;
  1347. level.clock.alignX = "center";
  1348. level.clock.alignY = "middle";
  1349. level.clock.font = "bigfixed";
  1350. level.clock setTimer(level.roundlength * 60);
  1351.  
  1352. if(game["matchstarted"])
  1353. {
  1354. level.clock.color = (0, 1, 0);
  1355.  
  1356. if((level.roundlength * 60) > level.graceperiod)
  1357. {
  1358. wait level.graceperiod;
  1359.  
  1360. level notify("round_started");
  1361. level.roundstarted = true;
  1362. level.clock.color = (1, 1, 1);
  1363.  
  1364. // Players on a team but without a weapon show as dead since they can not get in this round
  1365. players = getentarray("player", "classname");
  1366. for(i = 0; i < players.size; i++)
  1367. {
  1368. player = players[i];
  1369.  
  1370. if(player.sessionteam != "spectator" && !isDefined(player.pers["weapon"]))
  1371. player.statusicon = "gfx/hud/hud@status_dead.tga";
  1372. }
  1373.  
  1374. wait((level.roundlength * 60) - level.graceperiod);
  1375. }
  1376. else
  1377. wait(level.roundlength * 60);
  1378. }
  1379. else
  1380. {
  1381. level.clock.color = (1, 1, 1);
  1382. wait(level.roundlength * 60);
  1383. }
  1384.  
  1385. if(level.roundended)
  1386. return;
  1387.  
  1388. if(!level.exist[game["attackers"]] || !level.exist[game["defenders"]])
  1389. {
  1390. announcement(&"SD_TIMEHASEXPIRED");
  1391. level thread endRound("draw");
  1392. return;
  1393. }
  1394.  
  1395. announcement(&"SD_TIMEHASEXPIRED");
  1396. level thread endRound(game["defenders"]);
  1397. }
  1398.  
  1399. checkMatchStart()
  1400. {
  1401. oldvalue["teams"] = level.exist["teams"];
  1402. level.exist["teams"] = false;
  1403.  
  1404. // If teams currently exist
  1405. if(level.exist["allies"] && level.exist["axis"])
  1406. level.exist["teams"] = true;
  1407.  
  1408. // If teams previously did not exist and now they do
  1409. if(!oldvalue["teams"] && level.exist["teams"])
  1410. {
  1411. if(!game["matchstarted"])
  1412. {
  1413. announcement(&"SD_MATCHSTARTING");
  1414.  
  1415. level notify("kill_endround");
  1416. level.roundended = false;
  1417. level thread endRound("reset");
  1418. }
  1419. else
  1420. {
  1421. announcement(&"SD_MATCHRESUMING");
  1422.  
  1423. level notify("kill_endround");
  1424. level.roundended = false;
  1425. level thread endRound("draw");
  1426. }
  1427.  
  1428. return;
  1429. }
  1430. }
  1431.  
  1432. resetScores()
  1433. {
  1434. players = getentarray("player", "classname");
  1435. for(i = 0; i < players.size; i++)
  1436. {
  1437. player = players[i];
  1438. player.pers["score"] = 0;
  1439. player.pers["deaths"] = 0;
  1440. }
  1441.  
  1442. game["alliedscore"] = 0;
  1443. setTeamScore("allies", game["alliedscore"]);
  1444. game["axisscore"] = 0;
  1445. setTeamScore("axis", game["axisscore"]);
  1446. }
  1447.  
  1448. endRound(roundwinner)
  1449. {
  1450. level endon("kill_endround");
  1451.  
  1452. if(level.roundended)
  1453. return;
  1454. level.roundended = true;
  1455.  
  1456. // End bombzone threads and remove related hud elements and objectives
  1457. level notify("round_ended");
  1458.  
  1459. players = getentarray("player", "classname");
  1460. for(i = 0; i < players.size; i++)
  1461. {
  1462. player = players[i];
  1463.  
  1464. if(isDefined(player.planticon))
  1465. player.planticon destroy();
  1466.  
  1467. if(isDefined(player.defuseicon))
  1468. player.defuseicon destroy();
  1469.  
  1470. if(isDefined(player.progressbackground))
  1471. player.progressbackground destroy();
  1472.  
  1473. if(isDefined(player.progressbar))
  1474. player.progressbar destroy();
  1475.  
  1476. player unlink();
  1477. player enableWeapon();
  1478. }
  1479.  
  1480. objective_delete(0);
  1481. objective_delete(1);
  1482.  
  1483. if(roundwinner == "allies")
  1484. {
  1485. players = getentarray("player", "classname");
  1486. for(i = 0; i < players.size; i++)
  1487. players[i] playLocalSound("MP_announcer_allies_win");
  1488. }
  1489. else if(roundwinner == "axis")
  1490. {
  1491. players = getentarray("player", "classname");
  1492. for(i = 0; i < players.size; i++)
  1493. players[i] playLocalSound("MP_announcer_axis_win");
  1494. }
  1495. else if(roundwinner == "draw")
  1496. {
  1497. players = getentarray("player", "classname");
  1498. for(i = 0; i < players.size; i++)
  1499. players[i] playLocalSound("MP_announcer_round_draw");
  1500. }
  1501.  
  1502. wait 5;
  1503.  
  1504. winners = "";
  1505. losers = "";
  1506.  
  1507. if(roundwinner == "allies")
  1508. {
  1509. game["alliedscore"]++;
  1510. setTeamScore("allies", game["alliedscore"]);
  1511.  
  1512. players = getentarray("player", "classname");
  1513. for(i = 0; i < players.size; i++)
  1514. {
  1515. lpGuid = players[i] getGuid();
  1516. if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "allies"))
  1517. winners = (winners + ";" + lpGuid + ";" + players[i].name);
  1518. else if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "axis"))
  1519. losers = (losers + ";" + lpGuid + ";" + players[i].name);
  1520. }
  1521. logPrint("W;allies" + winners + "\n");
  1522. logPrint("L;axis" + losers + "\n");
  1523. }
  1524. else if(roundwinner == "axis")
  1525. {
  1526. game["axisscore"]++;
  1527. setTeamScore("axis", game["axisscore"]);
  1528.  
  1529. players = getentarray("player", "classname");
  1530. for(i = 0; i < players.size; i++)
  1531. {
  1532. lpGuid = players[i] getGuid();
  1533. if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "axis"))
  1534. winners = (winners + ";" + lpGuid + ";" + players[i].name);
  1535. else if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == "allies"))
  1536. losers = (losers + ";" + lpGuid + ";" + players[i].name);
  1537. }
  1538. logPrint("W;axis" + winners + "\n");
  1539. logPrint("L;allies" + losers + "\n");
  1540. }
  1541.  
  1542. if(game["matchstarted"])
  1543. {
  1544. checkScoreLimit();
  1545. game["roundsplayed"]++;
  1546. checkRoundLimit();
  1547. }
  1548.  
  1549. if(!game["matchstarted"] && roundwinner == "reset")
  1550. {
  1551. game["matchstarted"] = true;
  1552. thread resetScores();
  1553. game["roundsplayed"] = 0;
  1554. }
  1555.  
  1556. game["timepassed"] = game["timepassed"] + ((getTime() - level.starttime) / 1000) / 60.0;
  1557.  
  1558. checkTimeLimit();
  1559.  
  1560. if(level.mapended)
  1561. return;
  1562. level.mapended = true;
  1563.  
  1564. // for all living players store their weapons
  1565. players = getentarray("player", "classname");
  1566. for(i = 0; i < players.size; i++)
  1567. {
  1568. player = players[i];
  1569.  
  1570. if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
  1571. {
  1572. primary = player getWeaponSlotWeapon("primary");
  1573. primaryb = player getWeaponSlotWeapon("primaryb");
  1574.  
  1575. // If a menu selection was made
  1576. if(isDefined(player.oldweapon))
  1577. {
  1578. // If a new weapon has since been picked up (this fails when a player picks up a weapon the same as his original)
  1579. if(player.oldweapon != primary && player.oldweapon != primaryb && primary != "none")
  1580. {
  1581. player.pers["weapon1"] = primary;
  1582. player.pers["weapon2"] = primaryb;
  1583. player.pers["spawnweapon"] = player getCurrentWeapon();
  1584. } // If the player's menu chosen weapon is the same as what is in the primaryb slot, swap the slots
  1585. else if(player.pers["weapon"] == primaryb)
  1586. {
  1587. player.pers["weapon1"] = primaryb;
  1588. player.pers["weapon2"] = primary;
  1589. player.pers["spawnweapon"] = player.pers["weapon1"];
  1590. } // Give them the weapon they chose from the menu
  1591. else
  1592. {
  1593. player.pers["weapon1"] = player.pers["weapon"];
  1594. player.pers["weapon2"] = primaryb;
  1595. player.pers["spawnweapon"] = player.pers["weapon1"];
  1596. }
  1597. } // No menu choice was ever made, so keep their weapons and spawn them with what they're holding, unless it's a pistol or grenade
  1598. else
  1599. {
  1600. if(primary == "none")
  1601. player.pers["weapon1"] = player.pers["weapon"];
  1602. else
  1603. player.pers["weapon1"] = primary;
  1604.  
  1605. player.pers["weapon2"] = primaryb;
  1606.  
  1607. spawnweapon = player getCurrentWeapon();
  1608. if(!maps\mp\gametypes\_teams::isPistolOrGrenade(spawnweapon))
  1609. player.pers["spawnweapon"] = spawnweapon;
  1610. else
  1611. player.pers["spawnweapon"] = player.pers["weapon1"];
  1612. }
  1613. }
  1614. }
  1615.  
  1616. if ( (level.teambalance > 0) && (game["BalanceTeamsNextRound"]) )
  1617. {
  1618. level.lockteams = true;
  1619. level thread maps\mp\gametypes\_teams::TeamBalance();
  1620. level waittill ("Teams Balanced");
  1621. wait 4;
  1622. }
  1623. map_restart(true);
  1624. }
  1625.  
  1626. endMap()
  1627. {
  1628. game["state"] = "intermission";
  1629. level notify("intermission");
  1630.  
  1631. if(isdefined(level.bombmodel))
  1632. level.bombmodel stopLoopSound();
  1633.  
  1634. if(game["alliedscore"] == game["axisscore"])
  1635. text = &"MPSCRIPT_THE_GAME_IS_A_TIE";
  1636. else if(game["alliedscore"] > game["axisscore"])
  1637. text = &"MPSCRIPT_ALLIES_WIN";
  1638. else
  1639. text = &"MPSCRIPT_AXIS_WIN";
  1640.  
  1641. players = getentarray("player", "classname");
  1642. for(i = 0; i < players.size; i++)
  1643. {
  1644. player = players[i];
  1645.  
  1646. player closeMenu();
  1647. player setClientCvar("g_scriptMainMenu", "main");
  1648. player setClientCvar("cg_objectiveText", text);
  1649. player spawnIntermission();
  1650. }
  1651.  
  1652. wait 10;
  1653. exitLevel(false);
  1654. }
  1655.  
  1656. checkTimeLimit()
  1657. {
  1658. if(level.timelimit <= 0)
  1659. return;
  1660.  
  1661. if(game["timepassed"] < level.timelimit)
  1662. return;
  1663.  
  1664. if(level.mapended)
  1665. return;
  1666. level.mapended = true;
  1667.  
  1668. iprintln(&"MPSCRIPT_TIME_LIMIT_REACHED");
  1669. level thread endMap();
  1670. }
  1671.  
  1672. checkScoreLimit()
  1673. {
  1674. if(level.scorelimit <= 0)
  1675. return;
  1676.  
  1677. if(game["alliedscore"] < level.scorelimit && game["axisscore"] < level.scorelimit)
  1678. return;
  1679.  
  1680. if(level.mapended)
  1681. return;
  1682. level.mapended = true;
  1683.  
  1684. iprintln(&"MPSCRIPT_SCORE_LIMIT_REACHED");
  1685. level thread endMap();
  1686. }
  1687.  
  1688. checkRoundLimit()
  1689. {
  1690. if(level.roundlimit <= 0)
  1691. return;
  1692.  
  1693. if(game["roundsplayed"] < level.roundlimit)
  1694. return;
  1695.  
  1696. if(level.mapended)
  1697. return;
  1698. level.mapended = true;
  1699.  
  1700. iprintln(&"MPSCRIPT_ROUND_LIMIT_REACHED");
  1701. level thread endMap();
  1702. }
  1703.  
  1704. updateGametypeCvars()
  1705. {
  1706. for(;;)
  1707. {
  1708. timelimit = getCvarFloat("scr_hns_timelimit");
  1709. if(level.timelimit != timelimit)
  1710. {
  1711. if(timelimit > 1440)
  1712. {
  1713. timelimit = 1440;
  1714. setCvar("scr_hns_timelimit", "1440");
  1715. }
  1716.  
  1717. level.timelimit = timelimit;
  1718. setCvar("ui_hns_timelimit", level.timelimit);
  1719. }
  1720.  
  1721. scorelimit = getCvarInt("scr_hns_scorelimit");
  1722. if(level.scorelimit != scorelimit)
  1723. {
  1724. level.scorelimit = scorelimit;
  1725. setCvar("ui_hns_scorelimit", level.scorelimit);
  1726.  
  1727. if(game["matchstarted"])
  1728. checkScoreLimit();
  1729. }
  1730.  
  1731. roundlimit = getCvarInt("scr_hns_roundlimit");
  1732. if(level.roundlimit != roundlimit)
  1733. {
  1734. level.roundlimit = roundlimit;
  1735. setCvar("ui_hns_roundlimit", level.roundlimit);
  1736.  
  1737. if(game["matchstarted"])
  1738. checkRoundLimit();
  1739. }
  1740.  
  1741. roundlength = getCvarFloat("scr_hns_roundlength");
  1742. if(roundlength > 10)
  1743. setCvar("scr_hns_roundlength", "10");
  1744.  
  1745. graceperiod = getCvarFloat("scr_hns_graceperiod");
  1746. if(graceperiod > 60)
  1747. setCvar("scr_hns_graceperiod", "60");
  1748.  
  1749. drawfriend = getCvarFloat("scr_drawfriend");
  1750. if(level.drawfriend != drawfriend)
  1751. {
  1752. level.drawfriend = drawfriend;
  1753.  
  1754. if(level.drawfriend)
  1755. {
  1756. // for all living players, show the appropriate headicon
  1757. players = getentarray("player", "classname");
  1758. for(i = 0; i < players.size; i++)
  1759. {
  1760. player = players[i];
  1761.  
  1762. if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
  1763. {
  1764. if(player.pers["team"] == "allies")
  1765. {
  1766. player.headicon = game["headicon_allies"];
  1767. player.headiconteam = "allies";
  1768. }
  1769. else
  1770. {
  1771. player.headicon = game["headicon_axis"];
  1772. player.headiconteam = "axis";
  1773. }
  1774. }
  1775. }
  1776. }
  1777. else
  1778. {
  1779. players = getentarray("player", "classname");
  1780. for(i = 0; i < players.size; i++)
  1781. {
  1782. player = players[i];
  1783.  
  1784. if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
  1785. player.headicon = "";
  1786. }
  1787. }
  1788. }
  1789.  
  1790. killcam = getCvarInt("scr_killcam");
  1791. if (level.killcam != killcam)
  1792. {
  1793. level.killcam = getCvarInt("scr_killcam");
  1794. if(level.killcam >= 1)
  1795. setarchive(true);
  1796. else
  1797. setarchive(false);
  1798. }
  1799.  
  1800. freelook = getCvarInt("scr_freelook");
  1801. if (level.allowfreelook != freelook)
  1802. {
  1803. level.allowfreelook = getCvarInt("scr_freelook");
  1804. level maps\mp\gametypes\_teams::UpdateSpectatePermissions();
  1805. }
  1806.  
  1807. enemyspectate = getCvarInt("scr_spectateenemy");
  1808. if (level.allowenemyspectate != enemyspectate)
  1809. {
  1810. level.allowenemyspectate = getCvarInt("scr_spectateenemy");
  1811. level maps\mp\gametypes\_teams::UpdateSpectatePermissions();
  1812. }
  1813.  
  1814. teambalance = getCvarInt("scr_teambalance");
  1815. if (level.teambalance != teambalance)
  1816. {
  1817. level.teambalance = getCvarInt("scr_teambalance");
  1818. if (level.teambalance > 0)
  1819. level thread maps\mp\gametypes\_teams::TeamBalance_Check_Roundbased();
  1820. }
  1821.  
  1822. wait 1;
  1823. }
  1824. }
  1825.  
  1826. updateTeamStatus()
  1827. {
  1828. wait 0; // Required for Callback_PlayerDisconnect to complete before updateTeamStatus can execute
  1829.  
  1830. resettimeout();
  1831.  
  1832. oldvalue["allies"] = level.exist["allies"];
  1833. oldvalue["axis"] = level.exist["axis"];
  1834. level.exist["allies"] = 0;
  1835. level.exist["axis"] = 0;
  1836.  
  1837. players = getentarray("player", "classname");
  1838. for(i = 0; i < players.size; i++)
  1839. {
  1840. player = players[i];
  1841.  
  1842. if(isDefined(player.pers["team"]) && player.pers["team"] != "spectator" && player.sessionstate == "playing")
  1843. level.exist[player.pers["team"]]++;
  1844. }
  1845.  
  1846. if(level.exist["allies"])
  1847. level.didexist["allies"] = true;
  1848. if(level.exist["axis"])
  1849. level.didexist["axis"] = true;
  1850.  
  1851. if(level.roundended)
  1852. return;
  1853.  
  1854. if(oldvalue["allies"] && !level.exist["allies"] && oldvalue["axis"] && !level.exist["axis"])
  1855. {
  1856. if(!level.bombplanted)
  1857. {
  1858. announcement(&"SD_ROUNDDRAW");
  1859. level thread endRound("draw");
  1860. return;
  1861. }
  1862.  
  1863. if(game["attackers"] == "allies")
  1864. {
  1865. announcement(&"SD_ALLIEDMISSIONACCOMPLISHED");
  1866. level thread endRound("allies");
  1867. return;
  1868. }
  1869.  
  1870. announcement(&"SD_AXISMISSIONACCOMPLISHED");
  1871. level thread endRound("axis");
  1872. return;
  1873. }
  1874.  
  1875. if(oldvalue["allies"] && !level.exist["allies"])
  1876. {
  1877. // no bomb planted, axis win
  1878. if(!level.bombplanted)
  1879. {
  1880. announcement(&"SD_ALLIESHAVEBEENELIMINATED");
  1881. level thread endRound("axis");
  1882. return;
  1883. }
  1884.  
  1885. if(game["attackers"] == "allies")
  1886. return;
  1887.  
  1888. // allies just died and axis have planted the bomb
  1889. if(level.exist["axis"])
  1890. {
  1891. announcement(&"SD_ALLIESHAVEBEENELIMINATED");
  1892. level thread endRound("axis");
  1893. return;
  1894. }
  1895.  
  1896. announcement(&"SD_AXISMISSIONACCOMPLISHED");
  1897. level thread endRound("axis");
  1898. return;
  1899. }
  1900.  
  1901. if(oldvalue["axis"] && !level.exist["axis"])
  1902. {
  1903. // no bomb planted, allies win
  1904. if(!level.bombplanted)
  1905. {
  1906. announcement(&"SD_AXISHAVEBEENELIMINATED");
  1907. level thread endRound("allies");
  1908. return;
  1909. }
  1910.  
  1911. if(game["attackers"] == "axis")
  1912. return;
  1913.  
  1914. // axis just died and allies have planted the bomb
  1915. if(level.exist["allies"])
  1916. {
  1917. announcement(&"SD_AXISHAVEBEENELIMINATED");
  1918. level thread endRound("allies");
  1919. return;
  1920. }
  1921.  
  1922. announcement(&"SD_ALLIEDMISSIONACCOMPLISHED");
  1923. level thread endRound("allies");
  1924. return;
  1925. }
  1926. }
  1927.  
  1928. bombzones()
  1929. {
  1930. level.barsize = 288;
  1931. level.planttime = 5; // seconds to plant a bomb
  1932. level.defusetime = 10; // seconds to defuse a bomb
  1933.  
  1934. bombtrigger = getent("bombtrigger", "targetname");
  1935. bombtrigger maps\mp\_utility::triggerOff();
  1936.  
  1937. bombzone_A = getent("bombzone_A", "targetname");
  1938. bombzone_B = getent("bombzone_B", "targetname");
  1939. bombzone_A thread bombzone_think(bombzone_B);
  1940. bombzone_B thread bombzone_think(bombzone_A);
  1941.  
  1942. wait 1; // TEMP: without this one of the objective icon is the default. Carl says we're overflowing something.
  1943. objective_add(0, "current", bombzone_A.origin, "gfx/hud/hud@objectiveA.tga");
  1944. objective_add(1, "current", bombzone_B.origin, "gfx/hud/hud@objectiveB.tga");
  1945. }
  1946.  
  1947. bombzone_think(bombzone_other)
  1948. {
  1949. level endon("round_ended");
  1950.  
  1951. level.barincrement = (level.barsize / (20.0 * level.planttime));
  1952.  
  1953. for(;;)
  1954. {
  1955. self waittill("trigger", other);
  1956.  
  1957. if(isDefined(bombzone_other.planting))
  1958. {
  1959. if(isDefined(other.planticon))
  1960. other.planticon destroy();
  1961.  
  1962. continue;
  1963. }
  1964.  
  1965. if(isPlayer(other) && (other.pers["team"] == game["attackers"]) && other isOnGround())
  1966. {
  1967. if(!isDefined(other.planticon))
  1968. {
  1969. other.planticon = newClientHudElem(other);
  1970. other.planticon.alignX = "center";
  1971. other.planticon.alignY = "middle";
  1972. other.planticon.x = 320;
  1973. other.planticon.y = 345;
  1974. other.planticon setShader("ui_mp/assets/hud@plantbomb.tga", 64, 64);
  1975. }
  1976.  
  1977. while(other istouching(self) && isAlive(other) && other useButtonPressed())
  1978. {
  1979. other notify("kill_check_bombzone");
  1980.  
  1981. self.planting = true;
  1982.  
  1983. if(!isDefined(other.progressbackground))
  1984. {
  1985. other.progressbackground = newClientHudElem(other);
  1986. other.progressbackground.alignX = "center";
  1987. other.progressbackground.alignY = "middle";
  1988. other.progressbackground.x = 320;
  1989. other.progressbackground.y = 385;
  1990. other.progressbackground.alpha = 0.5;
  1991. }
  1992. other.progressbackground setShader("black", (level.barsize + 4), 12);
  1993.  
  1994. if(!isDefined(other.progressbar))
  1995. {
  1996. other.progressbar = newClientHudElem(other);
  1997. other.progressbar.alignX = "left";
  1998. other.progressbar.alignY = "middle";
  1999. other.progressbar.x = (320 - (level.barsize / 2.0));
  2000. other.progressbar.y = 385;
  2001. }
  2002. other.progressbar setShader("white", 0, 8);
  2003. other.progressbar scaleOverTime(level.planttime, level.barsize, 8);
  2004.  
  2005. other playsound("MP_bomb_plant");
  2006. other linkTo(self);
  2007. other disableWeapon();
  2008.  
  2009. self.progresstime = 0;
  2010. while(isAlive(other) && other useButtonPressed() && (self.progresstime < level.planttime))
  2011. {
  2012. self.progresstime += 0.05;
  2013. wait 0.05;
  2014. }
  2015.  
  2016. if(isDefined(other.progressbackground))
  2017. other.progressbackground destroy();
  2018. if(isDefined(other.progressbar))
  2019. other.progressbar destroy();
  2020.  
  2021. if(self.progresstime >= level.planttime)
  2022. {
  2023. if(isDefined(other.planticon))
  2024. other.planticon destroy();
  2025.  
  2026. other enableWeapon();
  2027.  
  2028. level.bombexploder = self.script_noteworthy;
  2029.  
  2030. bombzone_A = getent("bombzone_A", "targetname");
  2031. bombzone_B = getent("bombzone_B", "targetname");
  2032. bombzone_A delete();
  2033. bombzone_B delete();
  2034. objective_delete(0);
  2035. objective_delete(1);
  2036.  
  2037. plant = other maps\mp\_utility::getPlant();
  2038.  
  2039. level.bombmodel = spawn("script_model", plant.origin);
  2040. level.bombmodel.angles = plant.angles;
  2041. level.bombmodel setmodel("xmodel/mp_bomb1_defuse");
  2042. level.bombmodel playSound("Explo_plant_no_tick");
  2043.  
  2044. bombtrigger = getent("bombtrigger", "targetname");
  2045. bombtrigger.origin = level.bombmodel.origin;
  2046.  
  2047. objective_add(0, "current", bombtrigger.origin, "gfx/hud/hud@bombplanted.tga");
  2048.  
  2049. level.bombplanted = true;
  2050.  
  2051. lpselfnum = other getEntityNumber();
  2052. lpselfguid = other getGuid();
  2053. logPrint("A;" + lpselfguid + ";" + lpselfnum + ";" + game["attackers"] + ";" + other.name + ";" + "bomb_plant" + "\n");
  2054.  
  2055. announcement(&"SD_EXPLOSIVESPLANTED");
  2056.  
  2057. players = getentarray("player", "classname");
  2058. for(i = 0; i < players.size; i++)
  2059. players[i] playLocalSound("MP_announcer_bomb_planted");
  2060.  
  2061. bombtrigger thread bomb_think();
  2062. bombtrigger thread bomb_countdown();
  2063.  
  2064. level notify("bomb_planted");
  2065. level.clock destroy();
  2066.  
  2067. return; //TEMP, script should stop after the wait .05
  2068. }
  2069. else
  2070. {
  2071. other unlink();
  2072. other enableWeapon();
  2073. }
  2074.  
  2075. wait .05;
  2076. }
  2077.  
  2078. self.planting = undefined;
  2079. other thread check_bombzone(self);
  2080. }
  2081. }
  2082. }
  2083.  
  2084. check_bombzone(trigger)
  2085. {
  2086. self notify("kill_check_bombzone");
  2087. self endon("kill_check_bombzone");
  2088. level endon("round_ended");
  2089.  
  2090. while(isDefined(trigger) && !isDefined(trigger.planting) && self istouching(trigger) && isAlive(self))
  2091. wait 0.05;
  2092.  
  2093. if(isDefined(self.planticon))
  2094. self.planticon destroy();
  2095. }
  2096.  
  2097. bomb_countdown()
  2098. {
  2099. self endon("bomb_defused");
  2100. level endon("intermission");
  2101.  
  2102. level.bombmodel playLoopSound("bomb_tick");
  2103.  
  2104. // set the countdown time
  2105. countdowntime = 60;
  2106.  
  2107. wait countdowntime;
  2108.  
  2109. // bomb timer is up
  2110. objective_delete(0);
  2111.  
  2112. level.bombexploded = true;
  2113. self notify("bomb_exploded");
  2114.  
  2115. // trigger exploder if it exists
  2116. if(isDefined(level.bombexploder))
  2117. maps\mp\_utility::exploder(level.bombexploder);
  2118.  
  2119. // explode bomb
  2120. origin = self getorigin();
  2121. range = 500;
  2122. maxdamage = 2000;
  2123. mindamage = 1000;
  2124.  
  2125. self delete(); // delete the defuse trigger
  2126. level.bombmodel stopLoopSound();
  2127. level.bombmodel delete();
  2128.  
  2129. playfx(level._effect["bombexplosion"], origin);
  2130. radiusDamage(origin, range, maxdamage, mindamage);
  2131.  
  2132. level thread endRound(game["attackers"]);
  2133. }
  2134.  
  2135. bomb_think()
  2136. {
  2137. self endon("bomb_exploded");
  2138. level.barincrement = (level.barsize / (20.0 * level.defusetime));
  2139.  
  2140. for(;;)
  2141. {
  2142. self waittill("trigger", other);
  2143.  
  2144. // check for having been triggered by a valid player
  2145. if(isPlayer(other) && (other.pers["team"] == game["defenders"]) && other isOnGround())
  2146. {
  2147. if(!isDefined(other.defuseicon))
  2148. {
  2149. other.defuseicon = newClientHudElem(other);
  2150. other.defuseicon.alignX = "center";
  2151. other.defuseicon.alignY = "middle";
  2152. other.defuseicon.x = 320;
  2153. other.defuseicon.y = 345;
  2154. other.defuseicon setShader("ui_mp/assets/hud@defusebomb.tga", 64, 64);
  2155. }
  2156.  
  2157. while(other islookingat(self) && distance(other.origin, self.origin) < 64 && isAlive(other) && other useButtonPressed())
  2158. {
  2159. other notify("kill_check_bomb");
  2160.  
  2161. if(!isDefined(other.progressbackground))
  2162. {
  2163. other.progressbackground = newClientHudElem(other);
  2164. other.progressbackground.alignX = "center";
  2165. other.progressbackground.alignY = "middle";
  2166. other.progressbackground.x = 320;
  2167. other.progressbackground.y = 385;
  2168. other.progressbackground.alpha = 0.5;
  2169. }
  2170. other.progressbackground setShader("black", (level.barsize + 4), 12);
  2171.  
  2172. if(!isDefined(other.progressbar))
  2173. {
  2174. other.progressbar = newClientHudElem(other);
  2175. other.progressbar.alignX = "left";
  2176. other.progressbar.alignY = "middle";
  2177. other.progressbar.x = (320 - (level.barsize / 2.0));
  2178. other.progressbar.y = 385;
  2179. }
  2180. other.progressbar setShader("white", 0, 8);
  2181. other.progressbar scaleOverTime(level.defusetime, level.barsize, 8);
  2182.  
  2183. other playsound("MP_bomb_defuse");
  2184. other linkTo(self);
  2185. other disableWeapon();
  2186.  
  2187. self.progresstime = 0;
  2188. while(isAlive(other) && other useButtonPressed() && (self.progresstime < level.defusetime))
  2189. {
  2190. self.progresstime += 0.05;
  2191. wait 0.05;
  2192. }
  2193.  
  2194. if(isDefined(other.progressbackground))
  2195. other.progressbackground destroy();
  2196. if(isDefined(other.progressbar))
  2197. other.progressbar destroy();
  2198.  
  2199. if(self.progresstime >= level.defusetime)
  2200. {
  2201. if(isDefined(other.defuseicon))
  2202. other.defuseicon destroy();
  2203.  
  2204. objective_delete(0);
  2205.  
  2206. self notify("bomb_defused");
  2207. level.bombmodel setmodel("xmodel/mp_bomb1");
  2208. level.bombmodel stopLoopSound();
  2209. self delete();
  2210.  
  2211. announcement(&"SD_EXPLOSIVESDEFUSED");
  2212.  
  2213. lpselfnum = other getEntityNumber();
  2214. lpselfguid = other getGuid();
  2215. logPrint("A;" + lpselfguid + ";" + lpselfnum + ";" + game["defenders"] + ";" + other.name + ";" + "bomb_defuse" + "\n");
  2216.  
  2217. players = getentarray("player", "classname");
  2218. for(i = 0; i < players.size; i++)
  2219. players[i] playLocalSound("MP_announcer_bomb_defused");
  2220.  
  2221. level thread endRound(game["defenders"]);
  2222. return; //TEMP, script should stop after the wait .05
  2223. }
  2224. else
  2225. {
  2226. other unlink();
  2227. other enableWeapon();
  2228. }
  2229.  
  2230. wait .05;
  2231. }
  2232.  
  2233. self.defusing = undefined;
  2234. other thread check_bomb(self);
  2235. }
  2236. }
  2237. }
  2238.  
  2239. check_bomb(trigger)
  2240. {
  2241. self notify("kill_check_bomb");
  2242. self endon("kill_check_bomb");
  2243.  
  2244. while(isDefined(trigger) && !isDefined(trigger.defusing) && distance(self.origin, trigger.origin) < 32 && self islookingat(trigger) && isAlive(self))
  2245. wait 0.05;
  2246.  
  2247. if(isDefined(self.defuseicon))
  2248. self.defuseicon destroy();
  2249. }
  2250.  
  2251. printJoinedTeam(team)
  2252. {
  2253. if(team == "allies")
  2254. iprintln(&"MPSCRIPT_JOINED_ALLIES", self);
  2255. else if(team == "axis")
  2256. iprintln(&"MPSCRIPT_JOINED_AXIS", self);
  2257. }
  2258.  
  2259. addBotClients()
  2260. {
  2261. wait 5;
  2262.  
  2263. for(i = 0; i < 2; i++)
  2264. {
  2265. ent[i] = addtestclient();
  2266. wait 0.5;
  2267.  
  2268. if(isPlayer(ent[i]))
  2269. {
  2270. if(i & 1)
  2271. {
  2272. ent[i] notify("menuresponse", game["menu_team"], "axis");
  2273. wait 0.5;
  2274. ent[i] notify("menuresponse", game["menu_weapon_axis"], "kar98k_mp");
  2275. }
  2276. else
  2277. {
  2278. ent[i] notify("menuresponse", game["menu_team"], "allies");
  2279. wait 0.5;
  2280. ent[i] notify("menuresponse", game["menu_weapon_allies"], "m1garand_mp");
  2281. }
  2282. }
  2283. }
  2284. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement