Advertisement
Guest User

Untitled

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