From d338cde8df5ba27ff5eb303eb53b8684f663d5fe Mon Sep 17 00:00:00 2001 From: Mario Date: Fri, 14 Nov 2014 13:41:08 +1100 Subject: [PATCH] Move TDM to the mutator system, for peace of mind --- gamemodes.cfg | 2 + qcsrc/server/autocvars.qh | 2 + qcsrc/server/mutators/gamemode_tdm.qc | 79 +++++++++++++++++++++++ qcsrc/server/mutators/mutators.qh | 1 + qcsrc/server/mutators/mutators_include.qc | 1 + qcsrc/server/teamplay.qc | 6 +- 6 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 qcsrc/server/mutators/gamemode_tdm.qc diff --git a/gamemodes.cfg b/gamemodes.cfg index 4e14689e9e..ec140d30dd 100644 --- a/gamemodes.cfg +++ b/gamemodes.cfg @@ -322,6 +322,8 @@ set g_dm 1 "Deathmatch: killing any other player is one frag, player with most f set g_tdm_teams 2 "how many teams are in team deathmatch (set by mapinfo)" set g_tdm_team_spawns 0 "when 1, players spawn from the team spawnpoints of the map, if any" seta g_tdm_teams_override 0 "how many teams are in team deathmatch" +set g_tdm_point_limit -1 "TDM point limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" +set g_tdm_point_leadlimit -1 "TDM point lead limit overriding the mapinfo specified one (use 0 to play without limit, and -1 to use the mapinfo's limit)" // ============ diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index 0b5a17f682..11cf993df2 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -973,6 +973,8 @@ float autocvar_g_spawnpoints_auto_move_out_of_solid; #define autocvar_g_spawnshieldtime cvar("g_spawnshieldtime") #define autocvar_g_start_weapon_laser cvar("g_start_weapon_laser") float autocvar_g_tdm_team_spawns; +float autocvar_g_tdm_point_limit; +float autocvar_g_tdm_point_leadlimit; float autocvar_g_tdm_teams; float autocvar_g_tdm_teams_override; float autocvar_g_teamdamage_resetspeed; diff --git a/qcsrc/server/mutators/gamemode_tdm.qc b/qcsrc/server/mutators/gamemode_tdm.qc new file mode 100644 index 0000000000..59f0927e80 --- /dev/null +++ b/qcsrc/server/mutators/gamemode_tdm.qc @@ -0,0 +1,79 @@ +/*QUAKED spawnfunc_tdm_team (0 .5 .8) (-16 -16 -24) (16 16 32) +Team declaration for TDM gameplay, this allows you to decide what team names and control point models are used in your map. +Note: If you use spawnfunc_tdm_team entities you must define at least 2! However, unlike domination, you don't need to make a blank one too. +Keys: +"netname" Name of the team (for example Red, Blue, Green, Yellow, Life, Death, Offense, Defense, etc)... +"cnt" Scoreboard color of the team (for example 4 is red and 13 is blue)... */ +void spawnfunc_tdm_team() +{ + if(!g_tdm) { remove(self); return; } + + self.classname = "tdm_team"; + self.team = self.cnt + 1; +} + +// code from here on is just to support maps that don't have team entities +void tdm_SpawnTeam (string teamname, float teamcolor) +{ + entity oldself; + oldself = self; + self = spawn(); + self.classname = "tdm_team"; + self.netname = teamname; + self.cnt = teamcolor; + + spawnfunc_tdm_team(); + + self = oldself; +} + +void tdm_DelayedInit() +{ + // if no teams are found, spawn defaults + if(find(world, classname, "tdm_team") == world) + { + print("No ""tdm_team"" entities found on this map, creating them anyway.\n"); + + float numteams = min(4, autocvar_g_tdm_teams_override); + + if(numteams < 2) { numteams = autocvar_g_tdm_teams; } + numteams = bound(2, numteams, 4); + + float i; + for(i = 1; i <= numteams; ++i) + tdm_SpawnTeam(Team_ColorName(Team_NumberToTeam(i)), Team_NumberToTeam(i) - 1); + } +} + +MUTATOR_HOOKFUNCTION(tdm_GetTeamCount) +{ + ret_string = "tdm_team"; + return TRUE; +} + +MUTATOR_DEFINITION(gamemode_tdm) +{ + MUTATOR_HOOK(GetTeamCount, tdm_GetTeamCount, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + if(time > 1) // game loads at time 1 + error("This is a game type and it cannot be added at runtime."); + InitializeEntity(world, tdm_DelayedInit, INITPRIO_GAMETYPE); + } + + MUTATOR_ONROLLBACK_OR_REMOVE + { + // we actually cannot roll back tdm_Initialize here + // BUT: we don't need to! If this gets called, adding always + // succeeds. + } + + MUTATOR_ONREMOVE + { + print("This is a game type and it cannot be removed at runtime."); + return -1; + } + + return 0; +} diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index a28a45937c..eff44c2e32 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -11,6 +11,7 @@ MUTATOR_DECLARATION(gamemode_lms); MUTATOR_DECLARATION(gamemode_invasion); MUTATOR_DECLARATION(gamemode_cts); MUTATOR_DECLARATION(gamemode_race); +MUTATOR_DECLARATION(gamemode_tdm); MUTATOR_DECLARATION(mutator_dodging); MUTATOR_DECLARATION(mutator_invincibleprojectiles); diff --git a/qcsrc/server/mutators/mutators_include.qc b/qcsrc/server/mutators/mutators_include.qc index 92bef2d70c..c1932db9d6 100644 --- a/qcsrc/server/mutators/mutators_include.qc +++ b/qcsrc/server/mutators/mutators_include.qc @@ -12,6 +12,7 @@ #include "gamemode_invasion.qc" #include "gamemode_race.qc" #include "gamemode_cts.qc" +#include "gamemode_tdm.qc" #include "mutator_invincibleproj.qc" #include "mutator_new_toys.qc" diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 06286e8f55..a89c4b84b5 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -13,7 +13,6 @@ void TeamchangeFrags(entity e) PlayerScore_Clear(e); } -void tdm_init(); void entcs_init(); void LogTeamchange(float player_id, float team_number, float type) @@ -83,7 +82,10 @@ void InitGameplayMode() if(g_tdm) { ActivateTeamplay(); - tdm_init(); + fraglimit_override = autocvar_g_tdm_point_limit; + leadlimit_override = autocvar_g_tdm_point_leadlimit; + MUTATOR_ADD(gamemode_tdm); + if(autocvar_g_tdm_team_spawns) have_team_spawns = -1; // request team spawns } -- 2.39.2