From 8629e841a03b7be47746cec5af615214e30189e7 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 9 Jul 2006 07:19:55 +0000 Subject: [PATCH] when changing teams or leaving, your scores are now distributed to the other team members git-svn-id: svn://svn.icculus.org/nexuiz/trunk@1737 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/default.cfg | 2 +- data/qcsrc/server/cl_client.qc | 2 ++ data/qcsrc/server/defs.qh | 3 ++ data/qcsrc/server/miscfunctions.qc | 56 ++++++++++++++++++++++++++++++ data/qcsrc/server/teamplay.qc | 22 ++++++++---- 5 files changed, 78 insertions(+), 7 deletions(-) diff --git a/data/default.cfg b/data/default.cfg index 88d51e11f..4c4415eec 100644 --- a/data/default.cfg +++ b/data/default.cfg @@ -240,7 +240,7 @@ seta g_balance_teams_force 0 // automatically balance out teams when players mo seta g_balance_teams_prevent_imbalance 0 // prevent players from changing to larger teams seta g_tdm_teams 2 // how many teams are in team deathmatch set g_changeteam_banned 0 // not allowed to change team -set g_changeteam_fragtransfer 80 // % of frags you get to keep when you change teams (rounded down) +set g_changeteam_fragtransfer 0 // % of frags you get to keep when you change teams (rounded down) // ctf set g_ctf 0 diff --git a/data/qcsrc/server/cl_client.qc b/data/qcsrc/server/cl_client.qc index b570d9b1e..2a0844030 100644 --- a/data/qcsrc/server/cl_client.qc +++ b/data/qcsrc/server/cl_client.qc @@ -827,6 +827,8 @@ void ClientDisconnect (void) if(self.flagcarried) DropFlag(self.flagcarried); + DistributeFragsAmongTeam(self, self.team, 1); + save = self.flags; self.flags = self.flags - (self.flags & FL_CLIENT); bot_relinkplayerlist(); diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index 829e0df78..ce6a5d429 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -267,3 +267,6 @@ float default_player_alpha; #define NUM_JUMPPADSUSED 3 .float jumppadcount; .entity jumppadsused[NUM_JUMPPADSUSED]; + +string gamemode_name; +float teams_matter; diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index be029734d..df335d79c 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -422,3 +422,59 @@ void backtrace(string msg) dprint("\n--- CUT UNTIL HERE ---\n"); cvar_set("developer", ftos(dev)); } + +void DistributeFragsAmongTeam(entity p, float targetteam, float factor) +{ + float f; + float d; + float nTeam; + entity head; + + if(!teams_matter) + return; + + //if(p.frags < 0) + //{ + // p.frags = 0; // do not harm the new team! + // return; // won't distribute negative scores + //} + + if(p.frags == -666) + return; + + f = ceil(factor * p.frags); + p.frags = p.frags - f; + + nTeam = 0; + head = find(world, classname, "player"); + while(head) + { + if(head != p) + if(head.team == targetteam) + nTeam = nTeam + 1; + head = find(head, classname, "player"); + } + + if(nTeam == 0) + return; + + head = find(world, classname, "player"); + while(head) + { + if(head != p) + if(head.team == targetteam) + { + d = floor(f / nTeam); + head.frags = head.frags + d; + f = f - d; + nTeam = nTeam - 1; + } + head = find(head, classname, "player"); + } + + if(nTeam != 0) + error("nPlayers in team changed!"); + if(f != 0) + error(strcat("There were ", ftos(f), " frags left. BAD!")); +} + diff --git a/data/qcsrc/server/teamplay.qc b/data/qcsrc/server/teamplay.qc index 705291d76..0518cf360 100644 --- a/data/qcsrc/server/teamplay.qc +++ b/data/qcsrc/server/teamplay.qc @@ -22,6 +22,14 @@ float g_domination, g_ctf, g_tdm; float audit_teams_time; +void TeamchangeFrags(entity e) +{ + if(e.classname == "player") + { + // reduce frags during a team change + DistributeFragsAmongTeam(e, (e.clientcolors & 0x0F) + 1, 1 - cvar("g_changeteam_fragtransfer") / 100); + } +} string TeamName(float t) { @@ -105,9 +113,6 @@ void ActivateTeamplay() cvar_set("teamplay", "3"); } -string gamemode_name; -float teams_matter; - void InitGameplayMode() { float fraglimit_override, timelimit_override; @@ -734,6 +739,7 @@ float JoinBestTeam(entity pl, float only_return_best) if(!only_return_best) { + TeamchangeFrags(self); if(smallest == 1) { SetPlayerColors(pl, COLOR_TEAM1 - 1); @@ -896,18 +902,22 @@ void SV_ChangeTeam(float _color) // bprint(strcat("allow change teams from ", ftos(steam), " to ", ftos(dteam), "\n")); + if(cvar("teamplay") && self.classname == "player" && steam != dteam) + { + // reduce frags during a team change + TeamchangeFrags(self); + } + SetPlayerTeam(self, dteam, steam, FALSE); + if(cvar("teamplay") && self.classname == "player" && steam != dteam) { // kill player when changing teams if(self.deadflag == DEAD_NO) Damage(self, self, self, 100000, DEATH_TEAMCHANGE, self.origin, '0 0 0'); - // reduce frags during a team change - self.frags = floor(self.frags * (cvar("g_changeteam_fragtransfer") / 100)); } } - void ShufflePlayerOutOfTeam (float source_team) { float smallestteam, smallestteam_count, steam; -- 2.39.2