From 52b12559c186e0d4710260a8409c509422d8a1e2 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Mon, 30 Apr 2012 17:24:59 +0200 Subject: [PATCH] allow forcing friend and enemy colors in teamplay It's done by the normal cvars. In teamplay, forcemyplayercolors defines friend color, and forceplayercolors forces enemy to own color from settings. This best matches DM. Enemy color cannot be forced if there are more than 2 teams, obviously. Friend color still can, as long as the color does not match one of the enemy colors. --- qcsrc/client/autocvars.qh | 1 + qcsrc/client/csqcmodel_hooks.qc | 53 ++++++++++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index 43dd0dd18..01718c942 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -394,6 +394,7 @@ float autocvar_cl_forceplayercolors; string autocvar_cl_forcemyplayermodel; float autocvar_cl_forcemyplayerskin; float autocvar_cl_forcemyplayercolors; +float autocvar__cl_color; float autocvar__cl_playerskin; string autocvar__cl_playermodel; float autocvar_cl_precacheplayermodels; diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index 152ecbe82..ac3a6952f 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -196,7 +196,58 @@ void CSQCPlayer_ForceModel_Apply(float islocalplayer) } // forceplayercolors too - if(!teamplay) + if(teamplay) + { + // own team's color is never forced + float forcecolor_friend = 0; + float forcecolor_enemy = 0; + float teams_count = 0; + float my_colors = 1024 + autocvar__cl_color; + entity tm; + + for(tm = teams.sort_next; tm; tm = tm.sort_next) + if(tm.team != COLOR_SPECTATOR) + ++teams_count; + + if(autocvar_cl_forcemyplayercolors) + forcecolor_friend = 1024 + autocvar_cl_forcemyplayercolors; + if(autocvar_cl_forceplayercolors && teams_count == 2) + forcecolor_enemy = 1024 + my_colors; + + if(forcecolor_enemy && !forcecolor_friend) + { + // only enemy color is forced? + // verify it is not equal to the friend color + if(forcecolor_enemy == 1024 + 17 * myteam) + forcecolor_enemy = 0; + } + + if(forcecolor_friend && !forcecolor_enemy) + { + // only friend color is forced? + // verify it is not equal to the enemy color + for(tm = teams.sort_next; tm; tm = tm.sort_next) + if(tm.team != myteam) + if(forcecolor_friend == 1024 + 17 * tm.team) + forcecolor_friend = 0; + } + + float cm; + cm = self.forceplayermodels_savecolormap; + cm = (cm >= 1024) ? cm : (stof(getplayerkeyvalue(self.colormap - 1, "colors")) + 1024); + + if(cm == 1024 + 17 * myteam) + { + if(forcecolor_friend) + self.colormap = forcecolor_friend; + } + else + { + if(forcecolor_enemy) + self.colormap = forcecolor_enemy; + } + } + else { if(autocvar_cl_forcemyplayercolors && islocalplayer) self.colormap = 1024 + autocvar_cl_forcemyplayercolors; -- 2.39.2