Advertisement
Guest User

Untitled

a guest
Sep 3rd, 2015
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 22.93 KB | None | 0 0
  1. /*
  2. Deathmatch
  3. Objective: Score points by eliminating other players
  4. Map ends: When one player reaches the score limit, or time limit is reached
  5. Respawning: No wait / Away from other players
  6.  
  7. Level requirements
  8. ------------------
  9. Spawnpoints:
  10. classname mp_dm_spawn
  11. All players spawn from these. The spawnpoint chosen is dependent on the current locations of enemies at the time of spawn.
  12. Players generally spawn away from 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. Because Deathmatch doesn't have teams with regard to gameplay or scoring, this effectively sets the available weapons.
  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_dm_spawn (1.0 0.5 0.0) (-16 -16 0) (16 16 72)
  44. Players spawn away from enemies 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_playerscore::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\_grenadeindicators::init();
  97.  
  98. level.xenon = (getcvar("xenonGame") == "true");
  99. if(level.xenon) // Xenon only
  100. thread maps\mp\gametypes\_richpresence::init();
  101. else // PC only
  102. thread maps\mp\gametypes\_quickmessages::init();
  103.  
  104. setClientNameMode("auto_change");
  105.  
  106. spawnpointname = "mp_dm_spawn";
  107. spawnpoints = getentarray(spawnpointname, "classname");
  108.  
  109. if(!spawnpoints.size)
  110. {
  111. maps\mp\gametypes\_callbacksetup::AbortLevel();
  112. return;
  113. }
  114.  
  115. for(i = 0; i < spawnpoints.size; i++)
  116. spawnpoints[i] placeSpawnpoint();
  117.  
  118. allowed[0] = "dm";
  119. maps\mp\gametypes\_gameobjects::main(allowed);
  120.  
  121. // Time limit per map
  122. if(getCvar("scr_dm_timelimit") == "")
  123. setCvar("scr_dm_timelimit", "30");
  124. else if(getCvarFloat("scr_dm_timelimit") > 1440)
  125. setCvar("scr_dm_timelimit", "1440");
  126. level.timelimit = getCvarFloat("scr_dm_timelimit");
  127. setCvar("ui_dm_timelimit", level.timelimit);
  128. makeCvarServerInfo("ui_dm_timelimit", "30");
  129.  
  130. // Score limit per map
  131. if(getCvar("scr_dm_scorelimit") == "")
  132. setCvar("scr_dm_scorelimit", "100");
  133. level.scorelimit = getCvarInt("scr_dm_scorelimit");
  134. setCvar("ui_dm_scorelimit", level.scorelimit);
  135. makeCvarServerInfo("ui_dm_scorelimit", "100");
  136.  
  137. // Force respawning
  138. if(getCvar("scr_forcerespawn") == "")
  139. setCvar("scr_forcerespawn", "0");
  140.  
  141. if(!isdefined(game["state"]))
  142. game["state"] = "playing";
  143.  
  144. level.QuickMessageToAll = true;
  145. level.mapended = false;
  146.  
  147. thread startGame();
  148. thread updateGametypeCvars();
  149. //thread maps\mp\gametypes\_teams::addTestClients();
  150. }
  151.  
  152. dummy()
  153. {
  154. waittillframeend;
  155.  
  156. if(isdefined(self))
  157. level notify("connecting", self);
  158. }
  159.  
  160. Callback_PlayerConnect()
  161. {
  162. thread dummy();
  163.  
  164. self.statusicon = "hud_status_connecting";
  165. self waittill("begin");
  166. self.statusicon = "";
  167.  
  168. level notify("connected", self);
  169.  
  170. if(!level.splitscreen)
  171. iprintln(&"MP_CONNECTED", self);
  172.  
  173. lpselfnum = self getEntityNumber();
  174. lpselfguid = self getGuid();
  175. logPrint("J;" + lpselfguid + ";" + lpselfnum + ";" + self.name + "\n");
  176.  
  177. if(game["state"] == "intermission")
  178. {
  179. spawnIntermission();
  180. return;
  181. }
  182.  
  183. level endon("intermission");
  184.  
  185. if(level.splitscreen)
  186. scriptMainMenu = game["menu_ingame_spectator"];
  187. else
  188. scriptMainMenu = game["menu_ingame"];
  189.  
  190. if(isdefined(self.pers["team"]) && self.pers["team"] != "spectator")
  191. {
  192. self setClientCvar("ui_allow_weaponchange", "1");
  193. self.sessionteam = "none";
  194.  
  195. if(isdefined(self.pers["weapon"]))
  196. spawnPlayer();
  197. else
  198. {
  199. spawnSpectator();
  200.  
  201. if(self.pers["team"] == "allies")
  202. {
  203. self openMenu(game["menu_weapon_allies"]);
  204. scriptMainMenu = game["menu_weapon_allies"];
  205. }
  206. else
  207. {
  208. self openMenu(game["menu_weapon_axis"]);
  209. scriptMainMenu = game["menu_weapon_axis"];
  210. }
  211. }
  212. }
  213. else
  214. {
  215. self setClientCvar("ui_allow_weaponchange", "0");
  216.  
  217. if(!isdefined(self.pers["skipserverinfo"]))
  218. self openMenu(game["menu_team"]);
  219.  
  220. self.pers["team"] = "spectator";
  221. self.sessionteam = "spectator";
  222.  
  223. spawnSpectator();
  224. }
  225.  
  226. self setClientCvar("g_scriptMainMenu", scriptMainMenu);
  227. }
  228.  
  229. Callback_PlayerDisconnect()
  230. {
  231. if(!level.splitscreen)
  232. iprintln(&"MP_DISCONNECTED", self);
  233.  
  234. if(isdefined(self.clientid))
  235. setplayerteamrank(self, self.clientid, 0);
  236.  
  237. lpselfnum = self getEntityNumber();
  238. lpselfguid = self getGuid();
  239. logPrint("Q;" + lpselfguid + ";" + lpselfnum + ";" + self.name + "\n");
  240. }
  241.  
  242. Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
  243. {
  244. if(self.sessionteam == "spectator")
  245. return;
  246.  
  247. // Don't do knockback if the damage direction was not specified
  248. if(!isdefined(vDir))
  249. iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
  250.  
  251. // Make sure at least one point of damage is done
  252. if(iDamage < 1)
  253. iDamage = 1;
  254.  
  255. // Do debug print if it's enabled
  256. if(getCvarInt("g_debugDamage"))
  257. {
  258. println("client:" + self getEntityNumber() + " health:" + self.health +
  259. " damage:" + iDamage + " hitLoc:" + sHitLoc);
  260. }
  261.  
  262. // Apply the damage to the player
  263. self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
  264.  
  265. // Shellshock/Rumble
  266. self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
  267. self playrumble("damage_heavy");
  268. if(isdefined(eAttacker) && eAttacker != self)
  269. eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
  270.  
  271. if(self.sessionstate != "dead")
  272. {
  273. lpselfnum = self getEntityNumber();
  274. lpselfname = self.name;
  275. lpselfteam = self.pers["team"];
  276. lpselfGuid = self getGuid();
  277. lpattackerteam = "";
  278.  
  279. if(isPlayer(eAttacker))
  280. {
  281. lpattacknum = eAttacker getEntityNumber();
  282. lpattackGuid = eAttacker getGuid();
  283. lpattackname = eAttacker.name;
  284. lpattackerteam = eAttacker.pers["team"];
  285. }
  286. else
  287. {
  288. lpattacknum = -1;
  289. lpattackGuid = "";
  290. lpattackname = "";
  291. lpattackerteam = "world";
  292. }
  293.  
  294. logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  295. }
  296. }
  297.  
  298. Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
  299. {
  300. self endon("spawned");
  301. self notify("killed_player");
  302.  
  303. if(self.sessionteam == "spectator")
  304. return;
  305.  
  306. // If the player was killed by a head shot, let players know it was a head shot kill
  307. if(sHitLoc == "head" && sMeansOfDeath != "MOD_MELEE")
  308. sMeansOfDeath = "MOD_HEAD_SHOT";
  309.  
  310. // send out an obituary message to all clients about the kill
  311. obituary(self, attacker, sWeapon, sMeansOfDeath);
  312.  
  313. self maps\mp\gametypes\_weapons::dropWeapon();
  314. self maps\mp\gametypes\_weapons::dropOffhand();
  315.  
  316. self.sessionstate = "dead";
  317. self.statusicon = "hud_status_dead";
  318.  
  319. if(!isdefined(self.switching_teams))
  320. self.deaths++;
  321.  
  322. lpselfnum = self getEntityNumber();
  323. lpselfname = self.name;
  324. lpselfteam = "";
  325. lpselfguid = self getGuid();
  326. lpattackerteam = "";
  327.  
  328. attackerNum = -1;
  329. if(isPlayer(attacker))
  330. {
  331. if(attacker == self) // killed himself
  332. {
  333. doKillcam = false;
  334.  
  335. if(!isdefined(self.switching_teams))
  336. attacker.score--;
  337. }
  338. else
  339. {
  340. attackerNum = attacker getEntityNumber();
  341. doKillcam = true;
  342.  
  343. attacker.score++;
  344. attacker checkScoreLimit();
  345. }
  346.  
  347. lpattacknum = attacker getEntityNumber();
  348. lpattackguid = attacker getGuid();
  349. lpattackname = attacker.name;
  350.  
  351. attacker notify("update_playerscore_hud");
  352. }
  353. else // If you weren't killed by a player, you were in the wrong place at the wrong time
  354. {
  355. doKillcam = false;
  356.  
  357. self.score--;
  358.  
  359. lpattacknum = -1;
  360. lpattackguid = "";
  361. lpattackname = "";
  362.  
  363. self notify("update_playerscore_hud");
  364. }
  365.  
  366. logPrint("K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
  367.  
  368. // Stop thread if map ended on this death
  369. if(level.mapended)
  370. return;
  371.  
  372. self.switching_teams = undefined;
  373. self.joining_team = undefined;
  374. self.leaving_team = undefined;
  375.  
  376. body = self cloneplayer(deathAnimDuration);
  377. thread maps\mp\gametypes\_deathicons::addDeathicon(body, self.clientid, self.pers["team"]);
  378.  
  379. delay = 2; // Delay the player becoming a spectator till after he's done dying
  380. wait delay; // ?? Also required for Callback_PlayerKilled to complete before respawn/killcam can execute
  381.  
  382. if(doKillcam && level.killcam)
  383. self maps\mp\gametypes\_killcam::killcam(attackerNum, delay, psOffsetTime, true);
  384.  
  385. self thread respawn();
  386. }
  387.  
  388. spawnPlayer()
  389. {
  390. self endon("disconnect");
  391. self notify("spawned");
  392. self notify("end_respawn");
  393.  
  394. resettimeout();
  395.  
  396. // Stop shellshock and rumble
  397. self stopShellshock();
  398. self stoprumble("damage_heavy");
  399.  
  400. self.sessionteam = "none";
  401. self.sessionstate = "playing";
  402. self.spectatorclient = -1;
  403. self.archivetime = 0;
  404. self.psoffsettime = 0;
  405. self.statusicon = "";
  406. self.maxhealth = 100;
  407. self.health = self.maxhealth;
  408.  
  409. spawnpointname = "mp_dm_spawn";
  410. spawnpoints = getentarray(spawnpointname, "classname");
  411. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_DM(spawnpoints);
  412.  
  413. if(isdefined(spawnpoint))
  414. self spawn(spawnpoint.origin, spawnpoint.angles);
  415. else
  416. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  417.  
  418. if(!isdefined(self.pers["savedmodel"]))
  419. maps\mp\gametypes\_teams::model();
  420. else
  421. maps\mp\_utility::loadModel(self.pers["savedmodel"]);
  422.  
  423. maps\mp\gametypes\_weapons::givePistol();
  424. maps\mp\gametypes\_weapons::giveGrenades();
  425. maps\mp\gametypes\_weapons::giveBinoculars();
  426.  
  427. self giveWeapon(self.pers["weapon"]);
  428. self giveMaxAmmo(self.pers["weapon"]);
  429. self setSpawnWeapon(self.pers["weapon"]);
  430.  
  431. if(!level.splitscreen)
  432. {
  433. if(level.scorelimit > 0)
  434. self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING", level.scorelimit);
  435. else
  436. self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING_NOSCORE");
  437. }
  438. else
  439. self setClientCvar("cg_objectiveText", &"MP_ELIMINATE_ENEMIES");
  440.  
  441. waittillframeend;
  442. self notify("spawned_player");
  443. }
  444.  
  445. spawnSpectator(origin, angles)
  446. {
  447. self notify("spawned");
  448. self notify("end_respawn");
  449.  
  450. resettimeout();
  451.  
  452. // Stop shellshock and rumble
  453. self stopShellshock();
  454. self stoprumble("damage_heavy");
  455.  
  456. self.sessionstate = "spectator";
  457. self.spectatorclient = -1;
  458. self.archivetime = 0;
  459.  
  460. if(self.pers["team"] == "spectator")
  461. self.statusicon = "";
  462.  
  463. if(isdefined(origin) && isdefined(angles))
  464. self spawn(origin, angles);
  465. else
  466. {
  467. spawnpointname = "mp_global_intermission";
  468. spawnpoints = getentarray(spawnpointname, "classname");
  469. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  470.  
  471. if(isdefined(spawnpoint))
  472. self spawn(spawnpoint.origin, spawnpoint.angles);
  473. else
  474. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  475. }
  476.  
  477. self setClientCvar("cg_objectiveText", "");
  478. }
  479.  
  480. spawnIntermission()
  481. {
  482. self notify("spawned");
  483. self notify("end_respawn");
  484.  
  485. resettimeout();
  486.  
  487. // Stop shellshock and rumble
  488. self stopShellshock();
  489. self stoprumble("damage_heavy");
  490.  
  491. self.sessionstate = "intermission";
  492. self.spectatorclient = -1;
  493. self.archivetime = 0;
  494.  
  495. spawnpointname = "mp_global_intermission";
  496. spawnpoints = getentarray(spawnpointname, "classname");
  497. spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
  498.  
  499. if(isdefined(spawnpoint))
  500. self spawn(spawnpoint.origin, spawnpoint.angles);
  501. else
  502. maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
  503. }
  504.  
  505. respawn()
  506. {
  507. if(!isdefined(self.pers["weapon"]))
  508. return;
  509.  
  510. self endon("end_respawn");
  511.  
  512. if(getCvarInt("scr_forcerespawn") <= 0)
  513. {
  514. self thread waitRespawnButton();
  515. self waittill("respawn");
  516. }
  517.  
  518. self thread spawnPlayer();
  519. }
  520.  
  521. waitRespawnButton()
  522. {
  523. self endon("end_respawn");
  524. self endon("respawn");
  525.  
  526. wait 0; // Required or the "respawn" notify could happen before it's waittill has begun
  527.  
  528. self.respawntext = newClientHudElem(self);
  529. self.respawntext.horzAlign = "center_safearea";
  530. self.respawntext.vertAlign = "center_safearea";
  531. self.respawntext.alignX = "center";
  532. self.respawntext.alignY = "middle";
  533. self.respawntext.x = 0;
  534. self.respawntext.y = -50;
  535. self.respawntext.archived = false;
  536. self.respawntext.font = "default";
  537. self.respawntext.fontscale = 2;
  538. self.respawntext setText(&"PLATFORM_PRESS_TO_SPAWN");
  539.  
  540. thread removeRespawnText();
  541. thread waitRemoveRespawnText("end_respawn");
  542. thread waitRemoveRespawnText("respawn");
  543.  
  544. while((isdefined(self)) && (self useButtonPressed() != true))
  545. wait .05;
  546.  
  547. if(isdefined(self))
  548. {
  549. self notify("remove_respawntext");
  550. self notify("respawn");
  551. }
  552. }
  553.  
  554. removeRespawnText()
  555. {
  556. self waittill("remove_respawntext");
  557.  
  558. if(isdefined(self.respawntext))
  559. self.respawntext destroy();
  560. }
  561.  
  562. waitRemoveRespawnText(message)
  563. {
  564. self endon("remove_respawntext");
  565.  
  566. self waittill(message);
  567. self notify("remove_respawntext");
  568. }
  569.  
  570. startGame()
  571. {
  572. level.starttime = getTime();
  573.  
  574. if(level.timelimit > 0)
  575. {
  576. level.clock = newHudElem();
  577. level.clock.horzAlign = "left";
  578. level.clock.vertAlign = "top";
  579. level.clock.x = 8;
  580. level.clock.y = 2;
  581. level.clock.font = "default";
  582. level.clock.fontscale = 2;
  583. level.clock setTimer(level.timelimit * 60);
  584. }
  585.  
  586. for(;;)
  587. {
  588. checkTimeLimit();
  589. wait 1;
  590. }
  591. }
  592.  
  593. endMap()
  594. {
  595. game["state"] = "intermission";
  596. level notify("intermission");
  597.  
  598. players = getentarray("player", "classname");
  599. highscore = undefined;
  600. tied = undefined;
  601. playername = undefined;
  602. name = undefined;
  603. guid = undefined;
  604.  
  605. for(i = 0; i < players.size; i++)
  606. {
  607. player = players[i];
  608.  
  609. if(isdefined(player.pers["team"]) && player.pers["team"] == "spectator")
  610. continue;
  611.  
  612. if(!isdefined(highscore))
  613. {
  614. highscore = player.score;
  615. playername = player;
  616. name = player.name;
  617. guid = player getGuid();
  618. continue;
  619. }
  620.  
  621. if(player.score == highscore)
  622. tied = true;
  623. else if(player.score > highscore)
  624. {
  625. tied = false;
  626. highscore = player.score;
  627. playername = player;
  628. name = player.name;
  629. guid = player getGuid();
  630. }
  631. }
  632.  
  633. players = getentarray("player", "classname");
  634. for(i = 0; i < players.size; i++)
  635. {
  636. player = players[i];
  637.  
  638. player closeMenu();
  639. player closeInGameMenu();
  640.  
  641. if(isdefined(tied) && tied == true)
  642. player setClientCvar("cg_objectiveText", &"MP_THE_GAME_IS_A_TIE");
  643. else if(isdefined(playername))
  644. player setClientCvar("cg_objectiveText", &"MP_WINS", playername);
  645.  
  646. player spawnIntermission();
  647. }
  648.  
  649. if(isdefined(name))
  650. logPrint("W;;" + guid + ";" + name + "\n");
  651.  
  652. // set everyone's rank on xenon
  653. if(level.xenon)
  654. {
  655. for(i = 0; i < players.size; i++)
  656. {
  657. player = players[i];
  658.  
  659. if(isdefined(player.pers["team"]) && player.pers["team"] == "spectator")
  660. continue;
  661.  
  662. if(highscore <= 0)
  663. rank = 0;
  664. else
  665. {
  666. rank = int(player.score * 10 / highscore);
  667. if(rank < 0)
  668. rank = 0;
  669. }
  670.  
  671. // since DM is a free-for-all, give every player their own team number
  672. setplayerteamrank(player, player.clientid, rank);
  673. }
  674. sendranks();
  675. }
  676.  
  677. wait 10;
  678. exitLevel(false);
  679. }
  680.  
  681. checkTimeLimit()
  682. {
  683. if(level.timelimit <= 0)
  684. return;
  685.  
  686. timepassed = (getTime() - level.starttime) / 1000;
  687. timepassed = timepassed / 60.0;
  688.  
  689. if(timepassed < level.timelimit)
  690. return;
  691.  
  692. if(level.mapended)
  693. return;
  694. level.mapended = true;
  695.  
  696. if(!level.splitscreen)
  697. iprintln(&"MP_TIME_LIMIT_REACHED");
  698.  
  699. level thread endMap();
  700. }
  701.  
  702. checkScoreLimit()
  703. {
  704. waittillframeend;
  705.  
  706. if(level.scorelimit <= 0)
  707. return;
  708.  
  709. if(self.score < level.scorelimit)
  710. return;
  711.  
  712. if(level.mapended)
  713. return;
  714. level.mapended = true;
  715.  
  716. if(!level.splitscreen)
  717. iprintln(&"MP_SCORE_LIMIT_REACHED");
  718.  
  719. level thread endMap();
  720. }
  721.  
  722. updateGametypeCvars()
  723. {
  724. for(;;)
  725. {
  726. timelimit = getCvarFloat("scr_dm_timelimit");
  727. if(level.timelimit != timelimit)
  728. {
  729. if(timelimit > 1440)
  730. {
  731. timelimit = 1440;
  732. setCvar("scr_dm_timelimit", "1440");
  733. }
  734.  
  735. level.timelimit = timelimit;
  736. setCvar("ui_dm_timelimit", level.timelimit);
  737. level.starttime = getTime();
  738.  
  739. if(level.timelimit > 0)
  740. {
  741. if(!isdefined(level.clock))
  742. {
  743. level.clock = newHudElem();
  744. level.clock.horzAlign = "left";
  745. level.clock.vertAlign = "top";
  746. level.clock.x = 8;
  747. level.clock.y = 2;
  748. level.clock.font = "default";
  749. level.clock.fontscale = 2;
  750. }
  751. level.clock setTimer(level.timelimit * 60);
  752. }
  753. else
  754. {
  755. if(isdefined(level.clock))
  756. level.clock destroy();
  757. }
  758.  
  759. checkTimeLimit();
  760. }
  761.  
  762. scorelimit = getCvarInt("scr_dm_scorelimit");
  763. if(level.scorelimit != scorelimit)
  764. {
  765. level.scorelimit = scorelimit;
  766. setCvar("ui_dm_scorelimit", level.scorelimit);
  767.  
  768. players = getentarray("player", "classname");
  769. for(i = 0; i < players.size; i++)
  770. players[i] checkScoreLimit();
  771. }
  772.  
  773. wait 1;
  774. }
  775. }
  776.  
  777. menuAutoAssign()
  778. {
  779. if(self.pers["team"] != "allies" && self.pers["team"] != "axis")
  780. {
  781. if(self.sessionstate == "playing")
  782. {
  783. self.switching_teams = true;
  784. self suicide();
  785. }
  786.  
  787. teams[0] = "allies";
  788. teams[1] = "axis";
  789. self.pers["team"] = teams[randomInt(2)];
  790. self.pers["weapon"] = undefined;
  791. self.pers["savedmodel"] = undefined;
  792.  
  793. self setClientCvar("ui_allow_weaponchange", "1");
  794.  
  795. if(self.pers["team"] == "allies")
  796. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  797. else
  798. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  799.  
  800. self notify("joined_team");
  801. self notify("end_respawn");
  802. }
  803.  
  804. if(!isdefined(self.pers["weapon"]))
  805. {
  806. if(self.pers["team"] == "allies")
  807. self openMenu(game["menu_weapon_allies"]);
  808. else
  809. self openMenu(game["menu_weapon_axis"]);
  810. }
  811. }
  812.  
  813. menuAllies()
  814. {
  815. if(self.pers["team"] != "allies")
  816. {
  817. if(self.sessionstate == "playing")
  818. {
  819. self.switching_teams = true;
  820. self suicide();
  821. }
  822.  
  823. self.pers["team"] = "allies";
  824. self.pers["weapon"] = undefined;
  825. self.pers["savedmodel"] = undefined;
  826.  
  827. self setClientCvar("ui_allow_weaponchange", "1");
  828. self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
  829.  
  830. self notify("joined_team");
  831. self notify("end_respawn");
  832. }
  833.  
  834. if(!isdefined(self.pers["weapon"]))
  835. self openMenu(game["menu_weapon_allies"]);
  836. }
  837.  
  838. menuAxis()
  839. {
  840. if(self.pers["team"] != "axis")
  841. {
  842. if(self.sessionstate == "playing")
  843. {
  844. self.switching_teams = true;
  845. self suicide();
  846. }
  847.  
  848. self.pers["team"] = "axis";
  849. self.pers["weapon"] = undefined;
  850. self.pers["savedmodel"] = undefined;
  851.  
  852. self setClientCvar("ui_allow_weaponchange", "1");
  853. self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
  854.  
  855. self notify("joined_team");
  856. self notify("end_respawn");
  857. }
  858.  
  859. if(!isdefined(self.pers["weapon"]))
  860. self openMenu(game["menu_weapon_axis"]);
  861. }
  862.  
  863. menuSpectator()
  864. {
  865. if(self.pers["team"] != "spectator")
  866. {
  867. if(isAlive(self))
  868. {
  869. self.switching_teams = true;
  870. self suicide();
  871. }
  872.  
  873. self.pers["team"] = "spectator";
  874. self.pers["weapon"] = undefined;
  875. self.pers["savedmodel"] = undefined;
  876.  
  877. self.sessionteam = "spectator";
  878. self setClientCvar("ui_allow_weaponchange", "0");
  879. spawnSpectator();
  880.  
  881. if(level.splitscreen)
  882. self setClientCvar("g_scriptMainMenu", game["menu_ingame_spectator"]);
  883. else
  884. self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
  885.  
  886. self notify("joined_spectators");
  887. }
  888. }
  889.  
  890. menuWeapon(response)
  891. {
  892. if(!isdefined(self.pers["team"]) || (self.pers["team"] != "allies" && self.pers["team"] != "axis"))
  893. return;
  894.  
  895. weapon = self maps\mp\gametypes\_weapons::restrictWeaponByServerCvars(response);
  896.  
  897. if(weapon == "restricted")
  898. {
  899. if(self.pers["team"] == "allies")
  900. self openMenu(game["menu_weapon_allies"]);
  901. else if(self.pers["team"] == "axis")
  902. self openMenu(game["menu_weapon_axis"]);
  903.  
  904. return;
  905. }
  906.  
  907. if(level.splitscreen)
  908. self setClientCvar("g_scriptMainMenu", game["menu_ingame_onteam"]);
  909. else
  910. self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
  911.  
  912. if(isdefined(self.pers["weapon"]) && self.pers["weapon"] == weapon)
  913. return;
  914.  
  915. if(!isdefined(self.pers["weapon"]))
  916. {
  917. self.pers["weapon"] = weapon;
  918. spawnPlayer();
  919. }
  920. else
  921. {
  922. self.pers["weapon"] = weapon;
  923.  
  924. weaponname = maps\mp\gametypes\_weapons::getWeaponName(self.pers["weapon"]);
  925.  
  926. if(maps\mp\gametypes\_weapons::useAn(self.pers["weapon"]))
  927. self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_AN", weaponname);
  928. else
  929. self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_A", weaponname);
  930. }
  931. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement