Code:
/*
Team Deathmatch
Objective: Score points for your team by eliminating players on the opposing team
Map ends: When one team reaches the score limit, or time limit is reached
Respawning: No wait / Near teammates
Level requirements
------------------
Spawnpoints:
classname mp_tdm_spawn
All players spawn from these. The spawnpoint chosen is dependent on the current locations of teammates and enemies
at the time of spawn. Players generally spawn behind their teammates relative to the direction of enemies.
Spectator Spawnpoints:
classname mp_global_intermission
Spectators spawn from these and intermission is viewed from these positions.
Atleast one is required, any more and they are randomly chosen between.
Level script requirements
-------------------------
Team Definitions:
game["allies"] = "american";
game["axis"] = "german";
This sets the nationalities of the teams. Allies can be american, british, or russian. Axis can be german.
If using minefields or exploders:
maps\mp\_load::main();
Optional level script settings
------------------------------
Soldier Type and Variation:
game["american_soldiertype"] = "normandy";
game["german_soldiertype"] = "normandy";
This sets what character models are used for each nationality on a particular map.
Valid settings:
american_soldiertype normandy
british_soldiertype normandy, africa
russian_soldiertype coats, padded
german_soldiertype normandy, africa, winterlight, winterdark
*/
/*QUAKED mp_tdm_spawn (0.0 0.0 1.0) (-16 -16 0) (16 16 72)
Players spawn away from enemies and near their team at one of these positions.*/
main()
{
level.callbackStartGameType = ::Callback_StartGameType;
level.callbackPlayerConnect = ::Callback_PlayerConnect;
level.callbackPlayerDisconnect = ::Callback_PlayerDisconnect;
level.callbackPlayerDamage = ::Callback_PlayerDamage;
level.callbackPlayerKilled = ::Callback_PlayerKilled;
maps\mp\gametypes\_callbacksetup::SetupCallbacks();
level.autoassign = ::menuAutoAssign;
level.allies = ::menuAllies;
level.axis = ::menuAxis;
level.spectator = ::menuSpectator;
level.weapon = ::menuWeapon;
level.endgameconfirmed = ::endMap;
self thread maps\mp\gametypes\_messages::main();
}
Callback_StartGameType()
{
level.splitscreen = isSplitScreen();
// defaults if not defined in level script
if(!isDefined(game["allies"]))
game["allies"] = "american";
if(!isDefined(game["axis"]))
game["axis"] = "german";
// server cvar overrides
if(getCvar("scr_allies") != "")
game["allies"] = getCvar("scr_allies");
if(getCvar("scr_axis") != "")
game["axis"] = getCvar("scr_axis");
precacheStatusIcon("hud_status_dead");
precacheStatusIcon("hud_status_connecting");
precacheRumble("damage_heavy");
precacheString(&"PLATFORM_PRESS_TO_SPAWN");
thread maps\mp\gametypes\_menus::init();
thread maps\mp\gametypes\_serversettings::init();
thread maps\mp\gametypes\_clientids::init();
thread maps\mp\gametypes\_teams::init();
thread maps\mp\gametypes\_weapons::init();
thread maps\mp\gametypes\_scoreboard::init();
thread maps\mp\gametypes\_killcam::init();
thread maps\mp\gametypes\_shellshock::init();
thread maps\mp\gametypes\_hud_teamscore::init();
thread maps\mp\gametypes\_deathicons::init();
thread maps\mp\gametypes\_damagefeedback::init();
thread maps\mp\gametypes\_healthoverlay::init();
thread maps\mp\gametypes\_friendicons::init();
thread maps\mp\gametypes\_spectating::init();
thread maps\mp\gametypes\_grenadeindicators::init();
level.xenon = (getcvar("xenonGame") == "true");
if(level.xenon) // Xenon only
thread maps\mp\gametypes\_richpresence::init();
else // PC only
thread maps\mp\gametypes\_quickmessages::init();
setClientNameMode("auto_change");
spawnpointname = "mp_tdm_spawn";
spawnpoints = getentarray(spawnpointname, "classname");
if(!spawnpoints.size)
{
maps\mp\gametypes\_callbacksetup::AbortLevel();
return;
}
for(i = 0; i < spawnpoints.size; i++)
spawnpoints[i] placeSpawnpoint();
allowed[0] = "tdm";
maps\mp\gametypes\_gameobjects::main(allowed);
// Time limit per map
if(getCvar("scr_tdm_timelimit") == "")
setCvar("scr_tdm_timelimit", "30");
else if(getCvarFloat("scr_tdm_timelimit") > 1440)
setCvar("scr_tdm_timelimit", "1440");
level.timelimit = getCvarFloat("scr_tdm_timelimit");
setCvar("ui_tdm_timelimit", level.timelimit);
makeCvarServerInfo("ui_tdm_timelimit", "30");
// Score limit per map
if(getCvar("scr_tdm_scorelimit") == "")
setCvar("scr_tdm_scorelimit", "300");
level.scorelimit = getCvarInt("scr_tdm_scorelimit");
setCvar("ui_tdm_scorelimit", level.scorelimit);
makeCvarServerInfo("ui_tdm_scorelimit", "300");
// Force respawning
if(getCvar("scr_forcerespawn") == "")
setCvar("scr_forcerespawn", "0");
if(!isDefined(game["state"]))
game["state"] = "playing";
level.mapended = false;
level.team["allies"] = 0;
level.team["axis"] = 0;
thread startGame();
thread updateGametypeCvars();
//thread maps\mp\gametypes\_teams::addTestClients();
}
dummy()
{
waittillframeend;
if(isdefined(self))
level notify("connecting", self);
}
Callback_PlayerConnect()
{
thread dummy();
self.statusicon = "hud_status_connecting";
self waittill("begin");
self.statusicon = "";
level notify("connected", self);
if(!level.splitscreen)
iprintln(&"MP_CONNECTED", self);
lpselfnum = self getEntityNumber();
lpGuid = self getGuid();
logPrint("J;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");
if(game["state"] == "intermission")
{
spawnIntermission();
return;
}
level endon("intermission");
if(level.splitscreen)
scriptMainMenu = game["menu_ingame_spectator"];
else
scriptMainMenu = game["menu_ingame"];
if(isDefined(self.pers["team"]) && self.pers["team"] != "spectator")
{
self setClientCvar("ui_allow_weaponchange", "1");
if(self.pers["team"] == "allies")
self.sessionteam = "allies";
else
self.sessionteam = "axis";
if(isDefined(self.pers["weapon"]))
spawnPlayer();
else
{
spawnSpectator();
self thread maps\mp\gametypes\_messages::doMessages();
if(self.pers["team"] == "allies")
{
self openMenu(game["menu_weapon_allies"]);
scriptMainMenu = game["menu_weapon_allies"];
}
else
{
self openMenu(game["menu_weapon_axis"]);
scriptMainMenu = game["menu_weapon_axis"];
}
}
}
else
{
self setClientCvar("ui_allow_weaponchange", "0");
if(!isDefined(self.pers["skipserverinfo"]))
self openMenu(game["menu_team"]);
self.pers["team"] = "spectator";
self.sessionteam = "spectator";
spawnSpectator();
self thread maps\mp\gametypes\_messages::doMessages();
}
self setClientCvar("g_scriptMainMenu", scriptMainMenu);
}
Callback_PlayerDisconnect()
{
if(!level.splitscreen)
iprintln(&"MP_DISCONNECTED", self);
if(isdefined(self.pers["team"]))
{
if(self.pers["team"] == "allies")
setplayerteamrank(self, 0, 0);
else if(self.pers["team"] == "axis")
setplayerteamrank(self, 1, 0);
else if(self.pers["team"] == "spectator")
setplayerteamrank(self, 2, 0);
}
lpselfnum = self getEntityNumber();
lpGuid = self getGuid();
logPrint("Q;" + lpGuid + ";" + lpselfnum + ";" + self.name + "\n");
}
Callback_PlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime)
{
if(self.sessionteam == "spectator")
return;
// Don't do knockback if the damage direction was not specified
if(!isDefined(vDir))
iDFlags |= level.iDFLAGS_NO_KNOCKBACK;
friendly = undefined;
// check for completely getting out of the damage
if(!(iDFlags & level.iDFLAGS_NO_PROTECTION))
{
if(isPlayer(eAttacker) && (self != eAttacker) && (self.pers["team"] == eAttacker.pers["team"]))
{
if(level.friendlyfire == "0")
{
return;
}
else if(level.friendlyfire == "1")
{
// Make sure at least one point of damage is done
if(iDamage < 1)
iDamage = 1;
self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
// Shellshock/Rumble
self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
self playrumble("damage_heavy");
}
else if(level.friendlyfire == "2")
{
eAttacker.friendlydamage = true;
iDamage = int(iDamage * .5);
// Make sure at least one point of damage is done
if(iDamage < 1)
iDamage = 1;
eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
eAttacker.friendlydamage = undefined;
friendly = true;
}
else if(level.friendlyfire == "3")
{
eAttacker.friendlydamage = true;
iDamage = int(iDamage * .5);
// Make sure at least one point of damage is done
if(iDamage < 1)
iDamage = 1;
self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
eAttacker finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
eAttacker.friendlydamage = undefined;
// Shellshock/Rumble
self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
self playrumble("damage_heavy");
friendly = true;
}
}
else
{
// Make sure at least one point of damage is done
if(iDamage < 1)
iDamage = 1;
self finishPlayerDamage(eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime);
// Shellshock/Rumble
self thread maps\mp\gametypes\_shellshock::shellshockOnDamage(sMeansOfDeath, iDamage);
self playrumble("damage_heavy");
}
if(isdefined(eAttacker) && eAttacker != self)
eAttacker thread maps\mp\gametypes\_damagefeedback::updateDamageFeedback();
}
// Do debug print if it's enabled
if(getCvarInt("g_debugDamage"))
{
println("client:" + self getEntityNumber() + " health:" + self.health +
" damage:" + iDamage + " hitLoc:" + sHitLoc);
}
if(self.sessionstate != "dead")
{
lpselfnum = self getEntityNumber();
lpselfname = self.name;
lpselfteam = self.pers["team"];
lpselfGuid = self getGuid();
lpattackerteam = "";
if(isPlayer(eAttacker))
{
lpattacknum = eAttacker getEntityNumber();
lpattackGuid = eAttacker getGuid();
lpattackname = eAttacker.name;
lpattackerteam = eAttacker.pers["team"];
}
else
{
lpattacknum = -1;
lpattackGuid = "";
lpattackname = "";
lpattackerteam = "world";
}
if(isDefined(friendly))
{
lpattacknum = lpselfnum;
lpattackname = lpselfname;
lpattackGuid = lpselfGuid;
}
logPrint("D;" + lpselfGuid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackGuid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
}
}
Callback_PlayerKilled(eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration)
{
self endon("spawned");
self notify("killed_player");
if(self.sessionteam == "spectator")
return;
// If the player was killed by a head shot, let players know it was a head shot kill
if(sHitLoc == "head" && sMeansOfDeath != "MOD_MELEE")
sMeansOfDeath = "MOD_HEAD_SHOT";
// send out an obituary message to all clients about the kill
obituary(self, attacker, sWeapon, sMeansOfDeath);
self maps\mp\gametypes\_weapons::dropWeapon();
self maps\mp\gametypes\_weapons::dropOffhand();
self.sessionstate = "dead";
self.statusicon = "hud_status_dead";
if(!isdefined(self.switching_teams))
self.deaths++;
lpselfnum = self getEntityNumber();
lpselfname = self.name;
lpselfguid = self getGuid();
lpselfteam = self.pers["team"];
lpattackerteam = "";
attackerNum = -1;
if(isPlayer(attacker))
{
if(attacker == self) // killed himself
{
doKillcam = false;
// switching teams
if(isdefined(self.switching_teams))
{
if((self.leaving_team == "allies" && self.joining_team == "axis") || (self.leaving_team == "axis" && self.joining_team == "allies"))
{
players = maps\mp\gametypes\_teams::CountPlayers();
players[self.leaving_team]--;
players[self.joining_team]++;
if((players[self.joining_team] - players[self.leaving_team]) > 1)
attacker.score--;
}
}
if(isdefined(attacker.friendlydamage))
attacker iprintln(&"MP_FRIENDLY_FIRE_WILL_NOT");
}
else
{
attackerNum = attacker getEntityNumber();
doKillcam = true;
if(self.pers["team"] == attacker.pers["team"]) // killed by a friendly
attacker.score--;
else
{
attacker.score++;
teamscore = getTeamScore(attacker.pers["team"]);
teamscore++;
setTeamScore(attacker.pers["team"], teamscore);
checkScoreLimit();
}
}
lpattacknum = attacker getEntityNumber();
lpattackguid = attacker getGuid();
lpattackname = attacker.name;
lpattackerteam = attacker.pers["team"];
}
else // If you weren't killed by a player, you were in the wrong place at the wrong time
{
doKillcam = false;
self.score--;
lpattacknum = -1;
lpattackname = "";
lpattackguid = "";
lpattackerteam = "world";
}
level notify("update_teamscore_hud");
logPrint("K;" + lpselfguid + ";" + lpselfnum + ";" + lpselfteam + ";" + lpselfname + ";" + lpattackguid + ";" + lpattacknum + ";" + lpattackerteam + ";" + lpattackname + ";" + sWeapon + ";" + iDamage + ";" + sMeansOfDeath + ";" + sHitLoc + "\n");
// Stop thread if map ended on this death
if(level.mapended)
return;
self.switching_teams = undefined;
self.joining_team = undefined;
self.leaving_team = undefined;
body = self cloneplayer(deathAnimDuration);
thread maps\mp\gametypes\_deathicons::addDeathicon(body, self.clientid, self.pers["team"], 5);
delay = 2; // Delay the player becoming a spectator till after he's done dying
wait delay; // ?? Also required for Callback_PlayerKilled to complete before respawn/killcam can execute
if(doKillcam && level.killcam)
self maps\mp\gametypes\_killcam::killcam(attackerNum, delay, psOffsetTime, true);
self thread respawn();
}
spawnPlayer()
{
self endon("disconnect");
self notify("spawned");
self notify("end_respawn");
resettimeout();
// Stop shellshock and rumble
self stopShellshock();
self stoprumble("damage_heavy");
self.sessionteam = self.pers["team"];
self.sessionstate = "playing";
self.spectatorclient = -1;
self.archivetime = 0;
self.psoffsettime = 0;
self.statusicon = "";
self.maxhealth = 100;
self.health = self.maxhealth;
self.friendlydamage = undefined;
spawnpointname = "mp_tdm_spawn";
spawnpoints = getentarray(spawnpointname, "classname");
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_NearTeam(spawnpoints);
if(isDefined(spawnpoint))
self spawn(spawnpoint.origin, spawnpoint.angles);
else
maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
if(!isDefined(self.pers["savedmodel"]))
maps\mp\gametypes\_teams::model();
else
maps\mp\_utility::loadModel(self.pers["savedmodel"]);
maps\mp\gametypes\_weapons::givePistol();
maps\mp\gametypes\_weapons::giveGrenades();
maps\mp\gametypes\_weapons::giveBinoculars();
self giveWeapon(self.pers["weapon"]);
self giveMaxAmmo(self.pers["weapon"]);
self setSpawnWeapon(self.pers["weapon"]);
if(!level.splitscreen)
{
if(level.scorelimit > 0)
self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1", level.scorelimit);
else
self setClientCvar("cg_objectiveText", &"MP_GAIN_POINTS_BY_ELIMINATING1_NOSCORE");
}
else
self setClientCvar("cg_objectiveText", &"MP_ELIMINATE_THE_ENEMY");
waittillframeend;
self notify("spawned_player");
}
spawnSpectator(origin, angles)
{
self notify("spawned");
self notify("end_respawn");
resettimeout();
// Stop shellshock and rumble
self stopShellshock();
self stoprumble("damage_heavy");
self.sessionstate = "spectator";
self.spectatorclient = -1;
self.archivetime = 0;
self.psoffsettime = 0;
self.friendlydamage = undefined;
if(self.pers["team"] == "spectator")
self.statusicon = "";
maps\mp\gametypes\_spectating::setSpectatePermissions();
if(isDefined(origin) && isDefined(angles))
self spawn(origin, angles);
else
{
spawnpointname = "mp_global_intermission";
spawnpoints = getentarray(spawnpointname, "classname");
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
if(isDefined(spawnpoint))
self spawn(spawnpoint.origin, spawnpoint.angles);
else
maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
}
self setClientCvar("cg_objectiveText", "");
}
spawnIntermission()
{
self notify("spawned");
self notify("end_respawn");
resettimeout();
// Stop shellshock and rumble
self stopShellshock();
self stoprumble("damage_heavy");
self.sessionstate = "intermission";
self.spectatorclient = -1;
self.archivetime = 0;
self.psoffsettime = 0;
self.friendlydamage = undefined;
spawnpointname = "mp_global_intermission";
spawnpoints = getentarray(spawnpointname, "classname");
spawnpoint = maps\mp\gametypes\_spawnlogic::getSpawnpoint_Random(spawnpoints);
if(isDefined(spawnpoint))
self spawn(spawnpoint.origin, spawnpoint.angles);
else
maps\mp\_utility::error("NO " + spawnpointname + " SPAWNPOINTS IN MAP");
}
respawn()
{
if(!isDefined(self.pers["weapon"]))
return;
self endon("end_respawn");
if(getCvarInt("scr_forcerespawn") <= 0)
{
self thread waitRespawnButton();
self waittill("respawn");
}
self thread spawnPlayer();
}
waitRespawnButton()
{
self endon("disconnect");
self endon("end_respawn");
self endon("respawn");
wait 0; // Required or the "respawn" notify could happen before it's waittill has begun
self.respawntext = newClientHudElem(self);
self.respawntext.horzAlign = "center_safearea";
self.respawntext.vertAlign = "center_safearea";
self.respawntext.alignX = "center";
self.respawntext.alignY = "middle";
self.respawntext.x = 0;
self.respawntext.y = -50;
self.respawntext.archived = false;
self.respawntext.font = "default";
self.respawntext.fontscale = 2;
self.respawntext setText(&"PLATFORM_PRESS_TO_SPAWN");
thread removeRespawnText();
thread waitRemoveRespawnText("end_respawn");
thread waitRemoveRespawnText("respawn");
while(self useButtonPressed() != true)
wait .05;
self notify("remove_respawntext");
self notify("respawn");
}
removeRespawnText()
{
self waittill("remove_respawntext");
if(isDefined(self.respawntext))
self.respawntext destroy();
}
waitRemoveRespawnText(message)
{
self endon("remove_respawntext");
self waittill(message);
self notify("remove_respawntext");
}
startGame()
{
level.starttime = getTime();
if(level.timelimit > 0)
{
level.clock = newHudElem();
level.clock.horzAlign = "left";
level.clock.vertAlign = "top";
level.clock.x = 8;
level.clock.y = 2;
level.clock.font = "default";
level.clock.fontscale = 2;
level.clock setTimer(level.timelimit * 60);
}
for(;;)
{
checkTimeLimit();
wait 1;
}
}
endMap()
{
game["state"] = "intermission";
level notify("intermission");
alliedscore = getTeamScore("allies");
axisscore = getTeamScore("axis");
if(alliedscore == axisscore)
{
winningteam = "tie";
losingteam = "tie";
text = "MP_THE_GAME_IS_A_TIE";
}
else if(alliedscore > axisscore)
{
winningteam = "allies";
losingteam = "axis";
text = &"MP_ALLIES_WIN";
}
else
{
winningteam = "axis";
losingteam = "allies";
text = &"MP_AXIS_WIN";
}
winners = "";
losers = "";
if(winningteam == "allies")
level thread playSoundOnPlayers("MP_announcer_allies_win");
else if(winningteam == "axis")
level thread playSoundOnPlayers("MP_announcer_axis_win");
else
level thread playSoundOnPlayers("MP_announcer_round_draw");
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
player = players[i];
if((winningteam == "allies") || (winningteam == "axis"))
{
lpGuid = player getGuid();
if((isDefined(player.pers["team"])) && (player.pers["team"] == winningteam))
winners = (winners + ";" + lpGuid + ";" + player.name);
else if((isDefined(player.pers["team"])) && (player.pers["team"] == losingteam))
losers = (losers + ";" + lpGuid + ";" + player.name);
}
player closeMenu();
player closeInGameMenu();
player setClientCvar("cg_objectiveText", text);
player spawnIntermission();
}
if((winningteam == "allies") || (winningteam == "axis"))
{
logPrint("W;" + winningteam + winners + "\n");
logPrint("L;" + losingteam + losers + "\n");
}
// set everyone's rank on xenon
if(level.xenon)
{
players = getentarray("player", "classname");
highscore = undefined;
for(i = 0; i < players.size; i++)
{
player = players[i];
if(!isdefined(player.score))
continue;
if(!isdefined(highscore) || player.score > highscore)
highscore = player.score;
}
for(i = 0; i < players.size; i++)
{
player = players[i];
if(!isdefined(player.score))
continue;
if(highscore <= 0)
rank = 0;
else
{
rank = int(player.score * 10 / highscore);
if(rank < 0)
rank = 0;
}
if(player.pers["team"] == "allies")
setplayerteamrank(player, 0, rank);
else if(player.pers["team"] == "axis")
setplayerteamrank(player, 1, rank);
else if(player.pers["team"] == "spectator")
setplayerteamrank(player, 2, rank);
}
sendranks();
}
wait 10;
exitLevel(false);
}
checkTimeLimit()
{
if(level.timelimit <= 0)
return;
timepassed = (getTime() - level.starttime) / 1000;
timepassed = timepassed / 60.0;
if(timepassed < level.timelimit)
return;
if(level.mapended)
return;
level.mapended = true;
if(!level.splitscreen)
iprintln(&"MP_TIME_LIMIT_REACHED");
level thread endMap();
}
checkScoreLimit()
{
waittillframeend;
if(level.scorelimit <= 0)
return;
if(getTeamScore("allies") < level.scorelimit && getTeamScore("axis") < level.scorelimit)
return;
if(level.mapended)
return;
level.mapended = true;
if(!level.splitscreen)
iprintln(&"MP_SCORE_LIMIT_REACHED");
level thread endMap();
}
updateGametypeCvars()
{
for(;;)
{
timelimit = getCvarFloat("scr_tdm_timelimit");
if(level.timelimit != timelimit)
{
if(timelimit > 1440)
{
timelimit = 1440;
setCvar("scr_tdm_timelimit", "1440");
}
level.timelimit = timelimit;
setCvar("ui_tdm_timelimit", level.timelimit);
level.starttime = getTime();
if(level.timelimit > 0)
{
if(!isDefined(level.clock))
{
level.clock = newHudElem();
level.clock.horzAlign = "left";
level.clock.vertAlign = "top";
level.clock.x = 8;
level.clock.y = 2;
level.clock.font = "default";
level.clock.fontscale = 2;
}
level.clock setTimer(level.timelimit * 60);
}
else
{
if(isDefined(level.clock))
level.clock destroy();
}
checkTimeLimit();
}
scorelimit = getCvarInt("scr_tdm_scorelimit");
if(level.scorelimit != scorelimit)
{
level.scorelimit = scorelimit;
setCvar("ui_tdm_scorelimit", level.scorelimit);
}
checkScoreLimit();
wait 1;
}
}
printJoinedTeam(team)
{
if(!level.splitscreen)
{
if(team == "allies")
iprintln(&"MP_JOINED_ALLIES", self);
else if(team == "axis")
iprintln(&"MP_JOINED_AXIS", self);
}
}
menuAutoAssign()
{
numonteam["allies"] = 0;
numonteam["axis"] = 0;
players = getentarray("player", "classname");
for(i = 0; i < players.size; i++)
{
player = players[i];
if(!isDefined(player.pers["team"]) || player.pers["team"] == "spectator" || player == self)
continue;
numonteam[player.pers["team"]]++;
}
// if teams are equal return the team with the lowest score
if(numonteam["allies"] == numonteam["axis"])
{
if(getTeamScore("allies") == getTeamScore("axis"))
{
teams[0] = "allies";
teams[1] = "axis";
assignment = teams[randomInt(2)];
}
else if(getTeamScore("allies") < getTeamScore("axis"))
assignment = "allies";
else
assignment = "axis";
}
else if(numonteam["allies"] < numonteam["axis"])
assignment = "allies";
else
assignment = "axis";
if(assignment == self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead"))
{
if(!isdefined(self.pers["weapon"]))
{
if(self.pers["team"] == "allies")
self openMenu(game["menu_weapon_allies"]);
else
self openMenu(game["menu_weapon_axis"]);
}
return;
}
if(assignment != self.pers["team"] && (self.sessionstate == "playing" || self.sessionstate == "dead"))
{
self.switching_teams = true;
self.joining_team = assignment;
self.leaving_team = self.pers["team"];
self suicide();
}
self.pers["team"] = assignment;
self.pers["weapon"] = undefined;
self.pers["savedmodel"] = undefined;
self setClientCvar("ui_allow_weaponchange", "1");
if(self.pers["team"] == "allies")
{
self openMenu(game["menu_weapon_allies"]);
self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
}
else
{
self openMenu(game["menu_weapon_axis"]);
self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
}
self notify("joined_team");
self notify("end_respawn");
}
menuAllies()
{
if(self.pers["team"] != "allies")
{
if(self.sessionstate == "playing")
{
self.switching_teams = true;
self.joining_team = "allies";
self.leaving_team = self.pers["team"];
self suicide();
}
self.pers["team"] = "allies";
self.pers["weapon"] = undefined;
self.pers["savedmodel"] = undefined;
self setClientCvar("ui_allow_weaponchange", "1");
self setClientCvar("g_scriptMainMenu", game["menu_weapon_allies"]);
self notify("joined_team");
self notify("end_respawn");
}
if(!isdefined(self.pers["weapon"]))
self openMenu(game["menu_weapon_allies"]);
}
menuAxis()
{
if(self.pers["team"] != "axis")
{
if(self.sessionstate == "playing")
{
self.switching_teams = true;
self.joining_team = "axis";
self.leaving_team = self.pers["team"];
self suicide();
}
self.pers["team"] = "axis";
self.pers["weapon"] = undefined;
self.pers["savedmodel"] = undefined;
self setClientCvar("ui_allow_weaponchange", "1");
self setClientCvar("g_scriptMainMenu", game["menu_weapon_axis"]);
self notify("joined_team");
self notify("end_respawn");
}
if(!isdefined(self.pers["weapon"]))
self openMenu(game["menu_weapon_axis"]);
}
menuSpectator()
{
if(self.pers["team"] != "spectator")
{
if(isAlive(self))
{
self.switching_teams = true;
self.joining_team = "spectator";
self.leaving_team = self.pers["team"];
self suicide();
}
self.pers["team"] = "spectator";
self.pers["weapon"] = undefined;
self.pers["savedmodel"] = undefined;
self.sessionteam = "spectator";
self setClientCvar("ui_allow_weaponchange", "0");
spawnSpectator();
if(level.splitscreen)
self setClientCvar("g_scriptMainMenu", game["menu_ingame_spectator"]);
else
self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
self notify("joined_spectators");
}
}
menuWeapon(response)
{
if(!isDefined(self.pers["team"]) || (self.pers["team"] != "allies" && self.pers["team"] != "axis"))
return;
weapon = self maps\mp\gametypes\_weapons::restrictWeaponByServerCvars(response);
if(weapon == "restricted")
{
if(self.pers["team"] == "allies")
self openMenu(game["menu_weapon_allies"]);
else if(self.pers["team"] == "axis")
self openMenu(game["menu_weapon_axis"]);
return;
}
if(level.splitscreen)
self setClientCvar("g_scriptMainMenu", game["menu_ingame_onteam"]);
else
self setClientCvar("g_scriptMainMenu", game["menu_ingame"]);
if(isDefined(self.pers["weapon"]) && self.pers["weapon"] == weapon)
return;
if(!isDefined(self.pers["weapon"]))
{
self.pers["weapon"] = weapon;
spawnPlayer();
self thread printJoinedTeam(self.pers["team"]);
}
else
{
self.pers["weapon"] = weapon;
weaponname = maps\mp\gametypes\_weapons::getWeaponName(self.pers["weapon"]);
if(maps\mp\gametypes\_weapons::useAn(self.pers["weapon"]))
self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_AN", weaponname);
else
self iprintln(&"MP_YOU_WILL_RESPAWN_WITH_A", weaponname);
}
self thread maps\mp\gametypes\_spectating::setSpectatePermissions();
}
playSoundOnPlayers(sound, team)
{
players = getentarray("player", "classname");
if(level.splitscreen)
{
if(isdefined(players[0]))
players[0] playLocalSound(sound);
}
else
{
if(isdefined(team))
{
for(i = 0; i < players.size; i++)
{
if((isdefined(players[i].pers["team"])) && (players[i].pers["team"] == team))
players[i] playLocalSound(sound);
}
}
else
{
for(i = 0; i < players.size; i++)
players[i] playLocalSound(sound);
}
}
}