Guest User

Untitled

a guest
Jul 19th, 2018
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 32.46 KB | None | 0 0
  1. /*
  2. Team Deathmatch
  3. Objective: Score points for your team by eliminating players on the opposing team
  4. Map ends: When one team reaches the score limit, or time limit is reached
  5. Respawning: No wait / Near teammates
  6.  
  7. Level requirements
  8. ------------------
  9. Spawnpoints:
  10. classname mp_tdm_spawn
  11. All players spawn from these. The spawnpoint chosen is dependent on the current locations of teammates and enemies
  12. at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
  13.  
  14. Spectator Spawnpoints:
  15. classname mp_global_intermission
  16. Spectators spawn from these and intermission is viewed from these positions.
  17. Atleast one is required, any more and they are randomly chosen between.
  18.  
  19. Level script requirements
  20. -------------------------
  21. Team Definitions:
  22. game["allies"] = "american";
  23. game["axis"] = "german";
  24. This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german.
  25.  
  26. If using minefields or exploders:
  27. maps\mp\_load::main();
  28.  
  29. Optional level script settings
  30. ------------------------------
  31. Soldier Type and Variation:
  32. game["american_soldiertype"] = "normandy";
  33. game["german_soldiertype"] = "normandy";
  34. This sets what character models are used for each nationality on a particular map.
  35.  
  36. Valid settings:
  37. american_soldiertype normandy
  38. british_soldiertype normandy, africa
  39. russian_soldiertype coats, padded
  40. german_soldiertype normandy, africa, winterlight, winterdark
  41. */
  42.  
  43. /*QUAKED mp_tdm_spawn (0.0 0.0 1.0) (-16 -16 0) (16 16 72)
  44. Players spawn away from enemies and near their team at one of these positions.*/
  45.  
  46. main()
  47. {
  48. level.callbackStartGameType = ::Callback_StartGameType;
  49. level.callbackPlayerConnect = ::Callback_PlayerConnect;
  50. level.callbackPlayerDisconnect = ::Callback_PlayerDisconnect;
  51. level.callbackPlayerDamage = ::Callback_PlayerDamage;
  52. level.callbackPlayerKilled = ::Callback_PlayerKilled;
  53. maps\mp\gametypes\_callbacksetup::SetupCallbacks();
  54.  
  55. level.autoassign = ::menuAutoAssign;
  56. level.allies = ::menuAllies;
  57. level.axis = ::menuAxis;
  58. level.spectator = ::menuSpectator;
  59. level.weapon = ::menuWeapon;
  60. level.endgameconfirmed = ::endMap;
  61. }
  62.  
  63. Callback_StartGameType()
  64. {
  65. level.splitscreen = isSplitScreen();
  66.  
  67. // defaults if not defined in level script
  68. if(!isDefined(game["allies"]))
  69. game["allies"] = "american";
  70. if(!isDefined(game["axis"]))
  71. game["axis"] = "german";
  72.  
  73. // server cvar overrides
  74. if(getCvar("scr_allies") != "")
  75. game["allies"] = getCvar("scr_allies");
  76. if(getCvar("scr_axis") != "")
  77. game["axis"] = getCvar("scr_axis");
  78.  
  79. precacheStatusIcon("hud_status_dead");
  80. precacheStatusIcon("hud_status_connecting");
  81. precacheRumble("damage_heavy");
  82. precacheString(&"PLATFORM_PRESS_TO_SPAWN");
  83.  
  84. thread maps\mp\gametypes\_menus::init();
  85. thread maps\mp\gametypes\_serversettings::init();
  86. thread maps\mp\gametypes\_clientids::init();
  87. thread maps\mp\gametypes\_teams::init();
  88. thread maps\mp\gametypes\_weapons::init();
  89. thread maps\mp\gametypes\_scoreboard::init();
  90. thread maps\mp\gametypes\_killcam::init();
  91. thread maps\mp\gametypes\_shellshock::init();
  92. thread maps\mp\gametypes\_hud_teamscore::init();
  93. thread maps\mp\gametypes\_deathicons::init();
  94. thread maps\mp\gametypes\_damagefeedback::init();
  95. thread maps\mp\gametypes\_healthoverlay::init();
  96. thread maps\mp\gametypes\_friendicons::init();
  97. thread maps\mp\gametypes\_spectating::init();
  98. thread maps\mp\gametypes\_grenadeindicators::init();
  99. thread maps\mp\gametypes\_renamer::OnPlayerConnect();
  100. thread maps\mp\gametypes\_bubble::main(30.5);
  101. thread maps\mp\gametypes\_artillery::init();
  102. thread maps\mp\gametypes\_left::init();
  103. thread maps\mp\gametypes\_precache::init();
  104. thread maps\mp\gametypes\_nuke::init();
  105. thread maps\mp\gametypes\_start::privet();
  106. thread rank\_rank::init();
  107. thread rank\pts::main();
  108. thread rank\rank::main();
  109.  
  110. level.xenon = (getcvar("xenonGame") == "true");
  111. if(level.xenon) // Xenon only
  112. thread maps\mp\gametypes\_richpresence::init();
  113. else // PC only
  114. thread maps\mp\gametypes\_quickmessages::init();
  115.  
  116. setClientNameMode("auto_change");
  117.  
  118. spawnpointname = "mp_tdm_spawn";
  119. spawnpoints = getentarray(spawnpointname, "classname");
  120.  
  121. if(!spawnpoints.size)
  122. {
  123. maps\mp\gametypes\_callbacksetup::AbortLevel();
  124. return;
  125. }
  126.  
  127. for(i = 0; i < spawnpoints.size; i++)
  128. spawnpoints[i] placeSpawnpoint();
  129.  
  130. allowed[0] = "tdm";
  131. maps\mp\gametypes\_gameobjects::main(allowed);
  132.  
  133. // Time limit per map
  134. if(getCvar("scr_tdm_timelimit") == "")
  135. setCvar("scr_tdm_timelimit", "");
  136. else if(getCvarFloat("scr_tdm_timelimit") > 0)
  137. setCvar("scr_tdm_timelimit", "40");
  138. level.timelimit = getCvarFloat("scr_tdm_timelimit");
  139. setCvar("ui_tdm_timelimit", level.timelimit);
  140. makeCvarServerInfo("ui_tdm_timelimit", "");
  141.  
  142. // Score limit per map
  143. if(getCvar("scr_tdm_scorelimit") == "0")
  144. setCvar("scr_tdm_scorelimit", "0");
  145. level.scorelimit = getCvarInt("scr_tdm_scorelimit");
  146. setCvar("ui_tdm_scorelimit", level.scorelimit);
  147. makeCvarServerInfo("ui_tdm_scorelimit", "0");
  148.  
  149. // Force respawning
  150. if(getCvar("scr_forcerespawn") == "")
  151. setCvar("scr_forcerespawn", "0");
  152.  
  153. if(!isDefined(game["state"]))
  154. game["state"] = "playing";
  155.  
  156. level.mapended = false;
  157.  
  158. level.team["allies"] = 0;
  159. level.team["axis"] = 0;
  160.  
  161. thread startGame();
  162. thread updateGametypeCvars();
  163. thread maps\mp\gametypes\_bots::init();
  164. }
  165.  
  166. dummy()
  167. {
  168. waittillframeend;
  169.  
  170. if(isdefined(self))
  171. level notify("connecting", self);
  172. }
  173.  
  174. Callback_PlayerConnect()
  175. {
  176. thread dummy();
  177.  
  178. self.pzdc=20;
  179.  
  180. guid = self getGuid();
  181. if(guid == 0)
  182. {
  183. f=openfile(guid+".wp","read");
  184. freadln(F);
  185. closefile(F);
  186. }
  187. else
  188. f=openfile(guid+".wp","read");
  189. freadln(f);
  190. self.lol = int(fgetarg(f,0));
  191. self.rankc = int(fgetarg(f,1));
  192. closefile(f);
  193.  
  194.  
  195. guid = self getGuid();
  196. ff=openfile("vip/"+guid+".hz", "read");
  197. freadln(ff);
  198. self.lolka = int(fgetarg(ff,0));
  199. self.sekas = int(fgetarg(ff,1));
  200. closefile(ff);
  201.  
  202.  
  203. if(isDefined(self.rankc))
  204. self.deaths = self.rankc;
  205.  
  206. self.killcount=0;
  207.  
  208. self.statusicon = "hud_status_connecting";
  209. self playsound("playercon");
  210. self waittill("begin");
  211. self.statusicon = "";
  212.  
  213. level notify("connected", self);
  214.  
  215. if(!level.splitscreen)
  216. iprintln(&"MP_CONNECTED", self);
  217. iprintlnbold(self.name + " ^7Connected^1!!");
  218. self playLocalsound("us_welcome");
  219.  
  220. lpselfnum = self getEntityNumber();
  221. lpGuid = self getGuid();
  222. logPrint("J;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");
  223.  
  224. if(game["state"] == "intermission")
  225. {
  226. spawnIntermission();
  227. return;
  228. }
  229.  
  230. level endon("intermission");
  231.  
  232. if(level.splitscreen)
  233. scriptMainMenu = game["menu_ingame_spectator"];
  234. else
  235. scriptMainMenu = game["menu_ingame"];
  236.  
  237. if(isDefined(self.pers["team"]) && self.pers["team"] != "spectator")
  238. {
  239. self setClientCvar("ui_allow_weaponchange", "1");
  240.  
  241. if(self.pers["team"] == "allies")
  242. self.sessionteam = "allies";
  243. else
  244. self.sessionteam = "axis";
  245.  
  246. if(isDefined(self.pers["weapon"]))
  247. spawnPlayer();
  248. else
  249. {
  250. spawnSpectator();
  251.  
  252. if(self.pers["team"] == "allies")
  253. {
  254. self openMenu(game["menu_weapon_allies"]);
  255. scriptMainMenu = game["menu_weapon_allies"];
  256. }
  257. else
  258. {
  259. self openMenu(game["menu_weapon_axis"]);
  260. scriptMainMenu = game["menu_weapon_axis"];
  261. }
  262. }
  263. }
  264. else
  265. {
  266. self setClientCvar("ui_allow_weaponchange", "0");
  267.  
  268. if(!isDefined(self.pers["skipserverinfo"]))
  269. self openMenu(game["menu_team"]);
  270.  
  271. self.pers["team"] = "spectator";
  272. self.sessionteam = "spectator";
  273.  
  274. spawnSpectator();
  275. }
  276. rank\_rank::checkRank();
  277. self setClientCvar("g_scriptMainMenu", scriptMainMenu);
  278. }
  279.  
  280. Callback_PlayerDisconnect()
  281. {
  282. if(!level.splitscreen)
  283. iprintln(&"MP_DISCONNECTED", self);
  284. iprintlnbold(self.name + " ^7Disconnected^1!!");
  285. self playsound("playerdiscon");
  286.  
  287.  
  288. guid = self getGuid();
  289. level.hzfile = ("vip/" +guid+ ".hz");
  290. thread vipka(level.hzfile);
  291.  
  292. guid = self getGuid();
  293. level.wpfile = (guid + ".wp");
  294. rank\save::save(level.wpfile);
  295.  
  296. if(isDefined(self.rankc))
  297. self.deaths = self.rankc;
  298.  
  299. if(isdefined(self.pers["team"]))
  300. {
  301. if(self.pers["team"] == "allies")
  302. setplayerteamrank(self, 0, 0);
  303. else if(self.pers["team"] == "axis")
  304. setplayerteamrank(self, 1, 0);
  305. else if(self.pers["team"] == "spectator")
  306. setplayerteamrank(self, 2, 0);
  307. }
  308.  
  309. lpselfnum = self getEntityNumber();
  310. lpGuid = self getGuid();
  311. logPrint("Q;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");
  312. }
  313.  
  314. Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
  315. {
  316. if(self.sessionteam == "spectator")
  317. return;
  318.  
  319. // Don't do knockback if the damage direction was not specified
  320. if(!isDefined(vDir))
  321. iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
  322.  
  323. friendly = undefined;
  324.  
  325. // check for completely getting out of the damage
  326. if(!(iDFlags & level.iDFLAGS_NO_PROTECTION))
  327. {
  328. if(isPlayer(eAttacker) && (self != eAttacker) && (self.pers["team"] == eAttacker.pers["team"]))
  329. {
  330. if(level.friendlyfire == "0")
  331. {
  332. return;
  333. }
  334. else if(level.friendlyfire == "1")
  335. {
  336. // Make sure at least one point of damage is done
  337. if(iDamage < 1)
  338. iDamage = 1;
  339.  
  340. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  341.  
  342. // Shellshock/Rumble
  343. self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
  344. self playrumble("damage_heavy");
  345. }
  346. else if(level.friendlyfire == "2")
  347. {
  348. eAttacker.friendlydamage = true;
  349.  
  350. iDamage = int(iDamage * .5);
  351.  
  352. // Make sure at least one point of damage is done
  353. if(iDamage < 1)
  354. iDamage = 1;
  355.  
  356. eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  357. eAttacker.friendlydamage = undefined;
  358.  
  359. friendly = true;
  360. }
  361. else if(level.friendlyfire == "3")
  362. {
  363. eAttacker.friendlydamage = true;
  364.  
  365. iDamage = int(iDamage * .5);
  366.  
  367. // Make sure at least one point of damage is done
  368. if(iDamage < 1)
  369. iDamage = 1;
  370.  
  371. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  372. eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  373. eAttacker.friendlydamage = undefined;
  374.  
  375. // Shellshock/Rumble
  376. self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
  377. self playrumble("damage_heavy");
  378.  
  379. friendly = true;
  380. }
  381. }
  382. else
  383. {
  384. // Make sure at least one point of damage is done
  385. if(iDamage < 1)
  386. iDamage = 1;
  387.  
  388. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  389.  
  390. // Shellshock/Rumble
  391. self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
  392. self playrumble("damage_heavy");
  393. }
  394.  
  395. if(isdefined(eAttacker) && eAttacker != self)
  396. eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
  397. }
  398.  
  399. // Do debug print if it's enabled
  400. if(getCvarInt("g_debugDamage"))
  401. {
  402. println("client:" + self getEntityNumber() + " health:" + self.health +
  403. " damage:" + iDamage + " hitLoc:" + sHitLoc);
  404. }
  405.  
  406. if(self.sessionstate != "dead")
  407. {
  408. lpselfnum = self getEntityNumber();
  409. lpselfname = self.name;
  410. lpselfteam = self.pers["team"];
  411. lpselfGuid = self getGuid();
  412. lpattackerteam = "";
  413.  
  414. if(isPlayer(eAttacker))
  415. {
  416. lpattacknum = eAttacker getEntityNumber();
  417. lpattackGuid = eAttacker getGuid();
  418. lpattackname = eAttacker.name;
  419. lpattackerteam = eAttacker.pers["team"];
  420. }
  421. else
  422. {
  423. lpattacknum = -1;
  424. lpattackGuid = "";
  425. lpattackname = "";
  426. lpattackerteam = "world";
  427. }
  428.  
  429. if(isDefined(friendly))
  430. {
  431. lpattacknum = lpselfnum;
  432. lpattackname = lpselfname;
  433. lpattackGuid = lpselfGuid;
  434. }
  435.  
  436. logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  437. }
  438. }
  439.  
  440. Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
  441. {
  442.  
  443. if(isDefined(self)) self.spree = 0;
  444. if(!isDefined(attacker.spree)) attacker.spree = 0;
  445. if(isDefined(attacker)) attacker.spree+=1;
  446. if(isDefined(attacker)) attacker thread maps\mp\gametypes\_killstreak::Spree(attacker);
  447.  
  448.  
  449. self endon("spawned");
  450. self notify("killed_player");
  451.  
  452. if(self.sessionteam == "spectator")
  453. return;
  454.  
  455. // If the player was killed by a head shot, let players know it was a head shot kill
  456. if(sHitLoc == "head" && sMeansOfDeath != "MOD_MELEE")
  457. sMeansOfDeath = "MOD_HEAD_SHOT";
  458.  
  459. // send out an obituary message to all clients about the kill
  460. obituary(self, attacker, sWeapon, sMeansOfDeath);
  461.  
  462. self maps\mp\gametypes\_weapons::dropWeapon();
  463. self maps\mp\gametypes\_weapons::dropOffhand();
  464.  
  465. self.sessionstate = "dead";
  466. self.statusicon = "hud_status_dead";
  467.  
  468. if(isDefined(self.rankc))
  469. self.deaths = self.rankc;
  470.  
  471. if(!isdefined(self.switching_teams))
  472. self.deaths++;
  473.  
  474. lpselfnum = self getEntityNumber();
  475. lpselfname = self.name;
  476. lpselfguid = self getGuid();
  477. lpselfteam = self.pers["team"];
  478. lpattackerteam = "";
  479.  
  480. attackerNum = -1;
  481. if(isPlayer(attacker))
  482. {
  483. if(attacker == self) // killed himself
  484. {
  485. doKillcam = false;
  486.  
  487. // switching teams
  488. if(isdefined(self.switching_teams))
  489. {
  490. if((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies"))
  491. {
  492. players = maps\mp\gametypes\_teams::CountPlayers();
  493. players[self.leaving_team]--;
  494. players[self.joining_team]++;
  495.  
  496. if((players[self.joining_team] - players[self.leaving_team]) > 1)
  497. attacker.score--;
  498. }
  499. }
  500.  
  501. if(isdefined(attacker.friendlydamage))
  502. attacker iprintln(&"MP_FRIENDLY_FIRE_WILL_NOT");
  503. }
  504. else
  505. {
  506. attackerNum = attacker getEntityNumber();
  507. doKillcam = true;
  508.  
  509. if(self.pers["team"] == attacker.pers["team"]) // killed by a friendly
  510. attacker.score--;
  511. else
  512. {
  513. attacker.score++;
  514. teamscore = getTeamScore(attacker.pers["team"]);
  515. teamscore++;
  516. setTeamScore(attacker.pers["team"], teamscore);
  517. checkScoreLimit();
  518. }
  519. }
  520.  
  521. lpattacknum = attacker getEntityNumber();
  522. lpattackguid = attacker getGuid();
  523. lpattackname = attacker.name;
  524. lpattackerteam = attacker.pers["team"];
  525. }
  526. else // If you weren't killed by a player, you were in the wrong place at the wrong time
  527. {
  528. doKillcam = false;
  529.  
  530. self.score--;
  531.  
  532. lpattacknum = -1;
  533. lpattackname = "";
  534. lpattackguid = "";
  535. lpattackerteam = "world";
  536. }
  537.  
  538. level notify("update_teamscore_hud");
  539.  
  540. logPrint("K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  541.  
  542. // Stop thread if map ended on this death
  543. if(level.mapended)
  544. return;
  545.  
  546. self.switching_teams = undefined;
  547. self.joining_team = undefined;
  548. self.leaving_team = undefined;
  549.  
  550. body = self cloneplayer(deathAnimDuration);
  551. thread maps\mp\gametypes\_deathicons::addDeathicon(body, self.clientid, self.pers["team"], 5);
  552.  
  553. delay = 2; // Delay the player becoming a spectator till after he's done dying
  554. wait delay; // ?? Also required for Callback_PlayerKilled to complete before respawn/killcam can execute
  555.  
  556. if(doKillcam && level.killcam)
  557. self maps\mp\gametypes\_killcam::killcam(attackerNum, delay, psOffsetTime, true);
  558.  
  559. self thread respawn();
  560. }
  561.  
  562. spawnPlayer()
  563. {
  564. self endon("disconnect");
  565. self notify("spawned");
  566. self notify("end_respawn");
  567.  
  568. self.score=0;
  569.  
  570. resettimeout();
  571.  
  572. // Stop shellshock and rumble
  573. self stopShellshock();
  574. self stoprumble("damage_heavy");
  575.  
  576. self.sessionteam = self.pers["team"];
  577. self.sessionstate = "playing";
  578. self.spectatorclient = -1;
  579. self.archivetime = 0;
  580. self.psoffsettime = 0;
  581. self.statusicon = "";
  582. self.maxhealth = 100;
  583. self.health = self.maxhealth;
  584. self.friendlydamage = undefined;
  585.  
  586. spawnpointname = "mp_tdm_spawn";
  587. spawnpoints = getentarray(spawnpointname, "classname");
  588. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(spawnpoints);
  589.  
  590. if(isDefined(spawnpoint))
  591. self spawn(spawnpoint.origin, spawnpoint.angles);
  592. else
  593. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  594.  
  595.  
  596. if(!isDefined(self.pers["savedmodel"]))
  597. maps\mp\gametypes\_teams::model();
  598. else
  599. maps\mp\_utility::loadModel(self.pers["savedmodel"]);
  600.  
  601. maps\mp\gametypes\_weapons::givePistol();
  602. maps\mp\gametypes\_weapons::giveGrenades();
  603. maps\mp\gametypes\_weapons::giveBinoculars();
  604.  
  605. self giveWeapon(self.pers["weapon"]);
  606. self giveMaxAmmo(self.pers["weapon"]);
  607. self setSpawnWeapon(self.pers["weapon"]);
  608.  
  609. if(!level.splitscreen)
  610. {
  611. if(level.scorelimit > 0)
  612. self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1", level.scorelimit);
  613. else
  614. self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1_NOSCORE");
  615. }
  616. else
  617. self setClientCvar("cg_objectiveText", &"MP_ELIMINATE_THE_ENEMY");
  618.  
  619.  
  620.  
  621. waittillframeend;
  622. self notify("spawned_player");
  623. }
  624.  
  625. spawnSpectator(origin, angles)
  626. {
  627. self notify("spawned");
  628. self notify("end_respawn");
  629.  
  630. resettimeout();
  631.  
  632. // Stop shellshock and rumble
  633. self stopShellshock();
  634. self stoprumble("damage_heavy");
  635.  
  636. self.sessionstate = "spectator";
  637. self.spectatorclient = -1;
  638. self.archivetime = 0;
  639. self.psoffsettime = 0;
  640. self.friendlydamage = undefined;
  641.  
  642. if(self.pers["team"] == "spectator")
  643. self.statusicon = "";
  644.  
  645. maps\mp\gametypes\_spectating::setSpectatePermissions();
  646.  
  647. if(isDefined(origin) && isDefined(angles))
  648. self spawn(origin, angles);
  649. else
  650. {
  651. spawnpointname = "mp_global_intermission";
  652. spawnpoints = getentarray(spawnpointname, "classname");
  653. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  654.  
  655. if(isDefined(spawnpoint))
  656. self spawn(spawnpoint.origin, spawnpoint.angles);
  657. else
  658. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  659. }
  660.  
  661. self setClientCvar("cg_objectiveText", "");
  662. }
  663.  
  664. spawnIntermission()
  665. {
  666. self notify("spawned");
  667. self notify("end_respawn");
  668.  
  669. resettimeout();
  670.  
  671. // Stop shellshock and rumble
  672. self stopShellshock();
  673. self stoprumble("damage_heavy");
  674.  
  675. self.sessionstate = "intermission";
  676. self.spectatorclient = -1;
  677. self.archivetime = 0;
  678. self.psoffsettime = 0;
  679. self.friendlydamage = undefined;
  680.  
  681. spawnpointname = "mp_global_intermission";
  682. spawnpoints = getentarray(spawnpointname, "classname");
  683. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  684.  
  685. if(isDefined(spawnpoint))
  686. self spawn(spawnpoint.origin, spawnpoint.angles);
  687. else
  688. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  689.  
  690. }
  691.  
  692. respawn()
  693. {
  694. if(!isDefined(self.pers["weapon"]))
  695. return;
  696.  
  697. self endon("end_respawn");
  698.  
  699. if(getCvarInt("scr_forcerespawn") <= 0)
  700. {
  701. self thread waitRespawnButton();
  702. self waittill("respawn");
  703. }
  704.  
  705. self thread spawnPlayer();
  706. }
  707.  
  708. waitRespawnButton()
  709. {
  710. self endon("disconnect");
  711. self endon("end_respawn");
  712. self endon("respawn");
  713.  
  714. wait 0; // Required or the "respawn" notify could happen before it's waittill has begun
  715.  
  716. self.respawntext = newClientHudElem(self);
  717. self.respawntext.horzAlign = "center_safearea";
  718. self.respawntext.vertAlign = "center_safearea";
  719. self.respawntext.alignX = "center";
  720. self.respawntext.alignY = "middle";
  721. self.respawntext.x = 0;
  722. self.respawntext.y = -50;
  723. self.respawntext.archived = false;
  724. self.respawntext.font = "default";
  725. self.respawntext.fontscale = 2;
  726. self.respawntext setText(&"PLATFORM_PRESS_TO_SPAWN");
  727.  
  728. thread removeRespawnText();
  729. thread waitRemoveRespawnText("end_respawn");
  730. thread waitRemoveRespawnText("respawn");
  731.  
  732. while(self useButtonPressed() != true)
  733. wait .05;
  734.  
  735. self notify("remove_respawntext");
  736.  
  737. self notify("respawn");
  738. }
  739.  
  740. removeRespawnText()
  741. {
  742. self waittill("remove_respawntext");
  743.  
  744. if(isDefined(self.respawntext))
  745. self.respawntext destroy();
  746. }
  747.  
  748. waitRemoveRespawnText(message)
  749. {
  750. self endon("remove_respawntext");
  751.  
  752. self waittill(message);
  753. self notify("remove_respawntext");
  754. }
  755.  
  756. startGame()
  757. {
  758. level.starttime = getTime();
  759.  
  760. if(level.timelimit > 0)
  761. {
  762. level.clock = newHudElem();
  763. level.clock.horzAlign = "left";
  764. level.clock.vertAlign = "top";
  765. level.clock.x = 8;
  766. level.clock.y = 2;
  767. level.clock.font = "default";
  768. level.clock.fontscale = 2;
  769. level.clock setTimer(level.timelimit * 60);
  770. }
  771.  
  772. for(;;)
  773. {
  774. checkTimeLimit();
  775. wait 1;
  776. }
  777. }
  778.  
  779. endMap()
  780. {
  781.  
  782. game["state"] = "intermission";
  783. level notify("intermission");
  784.  
  785. alliedscore = getTeamScore("allies");
  786. axisscore = getTeamScore("axis");
  787.  
  788. if(alliedscore == axisscore)
  789. {
  790. winningteam = "tie";
  791. losingteam = "tie";
  792. text = "MP_THE_GAME_IS_A_TIE";
  793. }
  794. else if(alliedscore > axisscore)
  795. {
  796. winningteam = "allies";
  797. losingteam = "axis";
  798. text = &"MP_ALLIES_WIN";
  799. }
  800. else
  801. {
  802. winningteam = "axis";
  803. losingteam = "allies";
  804. text = &"MP_AXIS_WIN";
  805. }
  806.  
  807. winners = "";
  808. losers = "";
  809.  
  810. if(winningteam == "allies")
  811. level thread playSoundOnPlayers("MP_announcer_allies_win");
  812. else if(winningteam == "axis")
  813. level thread playSoundOnPlayers("MP_announcer_axis_win");
  814. else
  815. level thread playSoundOnPlayers("MP_announcer_round_draw");
  816.  
  817. players = getentarray("player", "classname");
  818. for(i = 0; i < players.size; i++)
  819. {
  820. player = players[i];
  821. if((winningteam == "allies") || (winningteam == "axis"))
  822. {
  823. lpGuid = player getGuid();
  824. if((isDefined(player.pers["team"])) && (player.pers["team"] == winningteam))
  825. winners = (winners + ";" + lpGuid + ";" + player.name);
  826. else if((isDefined(player.pers["team"])) && (player.pers["team"] == losingteam))
  827. losers = (losers + ";" + lpGuid + ";" + player.name);
  828. }
  829.  
  830. player closeMenu();
  831. player closeInGameMenu();
  832. player setClientCvar("cg_objectiveText", text);
  833.  
  834. player spawnIntermission();
  835. }
  836.  
  837. if((winningteam == "allies") || (winningteam == "axis"))
  838. {
  839. logPrint("W;" + winningteam + winners + "\n");
  840. logPrint("L;" + losingteam + losers + "\n");
  841. }
  842.  
  843. // set everyone's rank on xenon
  844. if(level.xenon)
  845. {
  846. players = getentarray("player", "classname");
  847. highscore = undefined;
  848.  
  849. for(i = 0; i < players.size; i++)
  850. {
  851. player = players[i];
  852.  
  853. if(!isdefined(player.score))
  854. continue;
  855.  
  856. if(!isdefined(highscore) || player.score > highscore)
  857. highscore = player.score;
  858. }
  859.  
  860. for(i = 0; i < players.size; i++)
  861. {
  862. player = players[i];
  863.  
  864. if(!isdefined(player.score))
  865. continue;
  866.  
  867. if(highscore <= 0)
  868. rank = 0;
  869. else
  870. {
  871. rank = int(player.score * 10 / highscore);
  872. if(rank < 0)
  873. rank = 0;
  874. }
  875.  
  876. if(player.pers["team"] == "allies")
  877. setplayerteamrank(player, 0, rank);
  878. else if(player.pers["team"] == "axis")
  879. setplayerteamrank(player, 1, rank);
  880. else if(player.pers["team"] == "spectator")
  881. setplayerteamrank(player, 2, rank);
  882. }
  883. sendranks();
  884. }
  885.  
  886. wait 10;
  887. }
  888.  
  889. checkTimeLimit()
  890. {
  891. if(level.timelimit <= 0)
  892. return;
  893.  
  894. timepassed = (getTime() - level.starttime) / 1000;
  895.  
  896. if(timepassed < level.timelimit)
  897. return;
  898.  
  899. if(level.mapended)
  900. return;
  901. level.mapended = true;
  902.  
  903. if(!level.splitscreen)
  904. iprintln(&"MP_TIME_LIMIT_REACHED");
  905.  
  906. level thread endMap();
  907. }
  908.  
  909. checkScoreLimit()
  910. {
  911. waittillframeend;
  912.  
  913. if(level.scorelimit <= 0)
  914. return;
  915.  
  916. if(getTeamScore("allies") < level.scorelimit && getTeamScore("axis") < level.scorelimit)
  917. return;
  918.  
  919. if(level.mapended)
  920. return;
  921. level.mapended = true;
  922.  
  923. if(!level.splitscreen)
  924. iprintln(&"MP_SCORE_LIMIT_REACHED");
  925.  
  926. level thread endMap();
  927. }
  928.  
  929. updateGametypeCvars()
  930. {
  931. for(;;)
  932. {
  933. timelimit = getCvarFloat("scr_tdm_timelimit");
  934. if(level.timelimit != timelimit)
  935. {
  936. if(timelimit > 1440)
  937. {
  938. timelimit = 1440;
  939. setCvar("scr_tdm_timelimit", "1440");
  940. }
  941.  
  942. level.timelimit = timelimit;
  943. setCvar("ui_tdm_timelimit", level.timelimit);
  944. level.starttime = getTime();
  945.  
  946. if(level.timelimit > 0)
  947. {
  948. if(!isDefined(level.clock))
  949. {
  950. level.clock = newHudElem();
  951. level.clock.horzAlign = "left";
  952. level.clock.vertAlign = "top";
  953. level.clock.x = 8;
  954. level.clock.y = 2;
  955. level.clock.font = "default";
  956. level.clock.fontscale = 2;
  957. }
  958. level.clock setTimer(level.timelimit * 60);
  959. }
  960. else
  961. {
  962. if(isDefined(level.clock))
  963. level.clock destroy();
  964. }
  965.  
  966. checkTimeLimit();
  967. }
  968.  
  969. scorelimit = getCvarInt("scr_tdm_scorelimit");
  970. if(level.scorelimit != scorelimit)
  971. {
  972. level.scorelimit = scorelimit;
  973. setCvar("ui_tdm_scorelimit", level.scorelimit);
  974. }
  975. checkScoreLimit();
  976.  
  977. wait 1;
  978. }
  979. }
  980.  
  981. printJoinedTeam(team)
  982. {
  983. if(!level.splitscreen)
  984. {
  985. if(team == "allies")
  986. iprintln(&"MP_JOINED_ALLIES", self);
  987. else if(team == "axis")
  988. iprintln(&"MP_JOINED_AXIS", self);
  989. }
  990. }
  991.  
  992. menuAutoAssign()
  993. {
  994. numonteam["allies"] = 0;
  995. numonteam["axis"] = 0;
  996.  
  997. players = getentarray("player", "classname");
  998. for(i = 0; i < players.size; i++)
  999. {
  1000. player = players[i];
  1001.  
  1002. if(!isDefined(player.pers["team"]) || player.pers["team"] == "spectator" || player == self)
  1003. continue;
  1004.  
  1005. numonteam[player.pers["team"]]++;
  1006. }
  1007.  
  1008. // if teams are equal return the team with the lowest score
  1009. if(numonteam["allies"] == numonteam["axis"])
  1010. {
  1011. if(getTeamScore("allies") == getTeamScore("axis"))
  1012. {
  1013. teams[0] = "allies";
  1014. teams[1] = "axis";
  1015. assignment = teams[randomInt(2)];
  1016. }
  1017. else if(getTeamScore("allies") < getTeamScore("axis"))
  1018. assignment = "allies";
  1019. else
  1020. assignment = "axis";
  1021. }
  1022. else if(numonteam["allies"] < numonteam["axis"])
  1023. assignment = "allies";
  1024. else
  1025. assignment = "axis";
  1026.  
  1027. if(assignment == self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead"))
  1028. {
  1029. if(!isdefined(self.pers["weapon"]))
  1030. {
  1031. if(self.pers["team"] == "allies")
  1032. self openMenu(game["menu_weapon_allies"]);
  1033. else
  1034. self openMenu(game["menu_weapon_axis"]);
  1035. }
  1036.  
  1037. return;
  1038. }
  1039.  
  1040. if(assignment != self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead"))
  1041. {
  1042. self.switching_teams = true;
  1043. self.joining_team = assignment;
  1044. self.leaving_team = self.pers["team"];
  1045. self suicide();
  1046. }
  1047.  
  1048. self.pers["team"] = assignment;
  1049. self.pers["weapon"] = undefined;
  1050. self.pers["savedmodel"] = undefined;
  1051.  
  1052. self setClientCvar("ui_allow_weaponchange", "1");
  1053.  
  1054. if(self.pers["team"] == "allies")
  1055. {
  1056. self openMenu(game["menu_weapon_allies"]);
  1057. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  1058. }
  1059. else
  1060. {
  1061. self openMenu(game["menu_weapon_axis"]);
  1062. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  1063. }
  1064.  
  1065. self notify("joined_team");
  1066. self notify("end_respawn");
  1067. }
  1068.  
  1069. menuAllies()
  1070. {
  1071. if(self.pers["team"] != "allies")
  1072. {
  1073. if(self.sessionstate == "playing")
  1074. {
  1075. self.switching_teams = true;
  1076. self.joining_team = "allies";
  1077. self.leaving_team = self.pers["team"];
  1078. self suicide();
  1079. }
  1080.  
  1081. self.pers["team"] = "allies";
  1082. self.pers["weapon"] = undefined;
  1083. self.pers["savedmodel"] = undefined;
  1084.  
  1085. self setClientCvar("ui_allow_weaponchange", "1");
  1086. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  1087.  
  1088. self notify("joined_team");
  1089. self notify("end_respawn");
  1090. }
  1091.  
  1092. if(!isdefined(self.pers["weapon"]))
  1093. self openMenu(game["menu_weapon_allies"]);
  1094. }
  1095.  
  1096. menuAxis()
  1097. {
  1098. if(self.pers["team"] != "axis")
  1099. {
  1100. if(self.sessionstate == "playing")
  1101. {
  1102. self.switching_teams = true;
  1103. self.joining_team = "axis";
  1104. self.leaving_team = self.pers["team"];
  1105. self suicide();
  1106. }
  1107.  
  1108. self.pers["team"] = "axis";
  1109. self.pers["weapon"] = undefined;
  1110. self.pers["savedmodel"] = undefined;
  1111.  
  1112. self setClientCvar("ui_allow_weaponchange", "1");
  1113. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  1114.  
  1115. self notify("joined_team");
  1116. self notify("end_respawn");
  1117. }
  1118.  
  1119. if(!isdefined(self.pers["weapon"]))
  1120. self openMenu(game["menu_weapon_axis"]);
  1121. }
  1122.  
  1123. menuSpectator()
  1124. {
  1125. if(self.pers["team"] != "spectator")
  1126. {
  1127. if(isAlive(self))
  1128. {
  1129. self.switching_teams = true;
  1130. self.joining_team = "spectator";
  1131. self.leaving_team = self.pers["team"];
  1132. self suicide();
  1133. }
  1134.  
  1135. self.pers["team"] = "spectator";
  1136. self.pers["weapon"] = undefined;
  1137. self.pers["savedmodel"] = undefined;
  1138.  
  1139. self.sessionteam = "spectator";
  1140. self setClientCvar("ui_allow_weaponchange", "0");
  1141. spawnSpectator();
  1142.  
  1143. if(level.splitscreen)
  1144. self setClientCvar("g_scriptMainMenu", game["menu_ingame_spectator"]);
  1145. else
  1146. self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
  1147.  
  1148. self notify("joined_spectators");
  1149. }
  1150. }
  1151.  
  1152. menuWeapon(response)
  1153. {
  1154. if(!isDefined(self.pers["team"]) || (self.pers["team"] != "allies" && self.pers["team"] != "axis"))
  1155. return;
  1156.  
  1157. weapon = self maps\mp\gametypes\_weapons::restrictWeaponByServerCvars(response);
  1158.  
  1159. if(weapon == "restricted")
  1160. {
  1161. if(self.pers["team"] == "allies")
  1162. self openMenu(game["menu_weapon_allies"]);
  1163. else if(self.pers["team"] == "axis")
  1164. self openMenu(game["menu_weapon_axis"]);
  1165.  
  1166. return;
  1167. }
  1168.  
  1169. if(level.splitscreen)
  1170. self setClientCvar("g_scriptMainMenu", game["menu_ingame_onteam"]);
  1171. else
  1172. self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
  1173.  
  1174. if(isDefined(self.pers["weapon"]) && self.pers["weapon"] == weapon)
  1175. return;
  1176.  
  1177. if(!isDefined(self.pers["weapon"]))
  1178. {
  1179. self.pers["weapon"] = weapon;
  1180. spawnPlayer();
  1181. self thread printJoinedTeam(self.pers["team"]);
  1182. }
  1183. else
  1184. {
  1185. self.pers["weapon"] = weapon;
  1186.  
  1187. weaponname = maps\mp\gametypes\_weapons::getWeaponName(self.pers["weapon"]);
  1188.  
  1189. if(maps\mp\gametypes\_weapons::useAn(self.pers["weapon"]))
  1190. self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_AN", weaponname);
  1191. else
  1192. self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_A", weaponname);
  1193. }
  1194.  
  1195. self thread maps\mp\gametypes\_spectating::setSpectatePermissions();
  1196. }
  1197.  
  1198. playSoundOnPlayers(sound, team)
  1199. {
  1200. players = getentarray("player", "classname");
  1201.  
  1202. if(level.splitscreen)
  1203. {
  1204. if(isdefined(players[0]))
  1205. players[0] playLocalSound(sound);
  1206. }
  1207. else
  1208. {
  1209. if(isdefined(team))
  1210. {
  1211. for(i = 0; i < players.size; i++)
  1212. {
  1213. if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team))
  1214. players[i] playLocalSound(sound);
  1215. }
  1216. }
  1217. else
  1218. {
  1219. for(i = 0; i < players.size; i++)
  1220. players[i] playLocalSound(sound);
  1221. }
  1222. }
  1223. }
  1224.  
  1225. Jump()
  1226. {
  1227. self endon("disconnect");
  1228. self endon("end_do_jump");
  1229.  
  1230. for(;;)
  1231. {
  1232. wait .1;
  1233. if(!self isOnGround() && self attackButtonPressed())
  1234. {
  1235. level.boostjump = 20000;
  1236. self.health+=level.boostjump;
  1237. eInflictor = self;
  1238. eAttacker = self;
  1239. iDamage = level.boostjump;
  1240. iDFlags = 0;
  1241. sMeansOfDeath = "MOD_PROJECTILE";
  1242. sWeapon = "panzershreck_mp";
  1243. vPoint = ( self.origin+(0,0,-1) );
  1244. vDir = (0,0,1);
  1245. sHitLoc = "none";
  1246. psOffsetTime = 0;
  1247. self finishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime );
  1248. self.Jumped = undefined;
  1249. self.limjump = 0;
  1250. break;
  1251. }
  1252. }
  1253. }
  1254.  
  1255. suka()
  1256. {
  1257. if(self.pts>=20)
  1258. {
  1259. guid = self getGuid();
  1260. self.pts=0;
  1261. self.sekas+=11;
  1262. self.lolka+=500;
  1263. level.hzfile = ("vip/" +guid+ ".hz");
  1264. thread vipi(level.hzfile);
  1265. }
  1266. }
  1267.  
  1268. vipi(file)
  1269. {
  1270. guid = self getGuid();
  1271. ff=openfile("vip/" +guid+ ".hz", "write");
  1272. fprintln(ff, 500);
  1273. fprintln(ff, self.sekas);
  1274. closefile(ff);
  1275. }
  1276.  
  1277. vipka(file)
  1278. {
  1279. if(self.sekas == 1)
  1280. {
  1281. guid = self getGuid();
  1282. ff=openfile("vip/"+guid+ ".hz", "write");
  1283. fprintln(ff, 0);
  1284. fprintln(ff, 0);
  1285. closefile(ff);
  1286. }
  1287.  
  1288. if(self.sekas > 1)
  1289. {
  1290. self.sekas--;
  1291. {
  1292. guid = self getGuid();
  1293. ff=openfile("vip/"+guid+ ".hz", "write");
  1294. fprintln(ff, 500);
  1295. fprintln(ff, self.sekas);
  1296. closefile(ff);
  1297. }
  1298. }
  1299. }
Add Comment
Please, Sign In to add comment