]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/csqcmodel_hooks.qc
Allow assigning each enemy unique colors in all game modes without teams except duel...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / csqcmodel_hooks.qc
index f08378b6a86b27546eed52fe92434375c9615b5b..0f5c919f9b02886feceb9774f9bd6f05a404d5a7 100644 (file)
@@ -1,15 +1,17 @@
 #include "csqcmodel_hooks.qh"
-#include "autocvars.qh"
-#include "miscfunctions.qh"
+
 #include <client/mutators/_mod.qh>
-#include "player_skeleton.qh"
-#include "weapons/projectile.qh"
+#include <client/player_skeleton.qh>
+#include <client/weapons/projectile.qh>
 #include <common/animdecide.qh>
+#include <common/effects/all.inc>
+#include <common/effects/all.qh>
 #include <common/ent_cs.qh>
+#include <common/gamemodes/_mod.qh>
+#include <common/mapinfo.qh>
 #include <common/physics/movetypes/movetypes.qh>
+#include <common/physics/player.qh>
 #include <common/viewloc.qh>
-#include <common/effects/all.qh>
-#include <common/effects/all.inc>
 #include <lib/csqcmodel/cl_model.qh>
 #include <lib/csqcmodel/cl_player.qh>
 #include <lib/csqcmodel/interpolate.qh>
@@ -242,7 +244,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
 
                if(autocvar_cl_forcemyplayercolors)
                        forcecolor_friend = 1024 + autocvar_cl_forcemyplayercolors;
-               if(autocvar_cl_forceplayercolors == 2 && team_count == 2)
+               if(autocvar_cl_forceplayercolors != 3 && autocvar_cl_forceplayercolors == 2 && team_count == 2)
                        forcecolor_enemy = 1024 + autocvar__cl_color;
 
                if(forcecolor_enemy && !forcecolor_friend)
@@ -277,11 +279,23 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
                                this.colormap = forcecolor_enemy;
                }
        }
-       else
+       else // if(!teamplay)
        {
                if(autocvar_cl_forcemyplayercolors && islocalplayer)
                        this.colormap = 1024 + autocvar_cl_forcemyplayercolors;
-               else if(autocvar_cl_forceplayercolors)
+               else if (autocvar_cl_forceuniqueplayercolors && !islocalplayer && !ISGAMETYPE(DUEL))
+               {
+                       // Assign each enemy unique colors
+                       // pick colors from 0 to 14 since 15 is the rainbow color
+                       // pl01 0 1, pl02 1 2, ..., pl14 13 14, pl15 14 0
+                       // pl16 0 2, pl17 1 3, ..., pl29 13  0, pl30 14 1
+                       int num = this.entnum - 1;
+                       int c1 = num % 15;
+                       int q = floor(num / 15);
+                       int c2 = (c1 + 1 + q) % 15;
+                       this.colormap = 1024 + (c1 << 4) + c2;
+               }
+               else if(autocvar_cl_forceplayercolors && (autocvar_cl_forceplayercolors != 3 || ISGAMETYPE(DUEL)))
                        this.colormap = player_localnum + 1;
        }
 
@@ -419,7 +433,7 @@ void CSQCModel_AutoTagIndex_Apply(entity this)
                }
 
                // recursive predraw call to fix issues with forcemodels and LOD if bone indexes mismatch
-               if(this.tag_entity.classname == "csqcmodel")
+               if(this.tag_entity.classname == "ENT_CLIENT_MODEL")
                {
                        CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.isplayermodel & ISPLAYER_CLIENT));
                }
@@ -525,9 +539,15 @@ void CSQCModel_Effects_Apply(entity this)
        if(eff & EF_FULLBRIGHT)
                this.renderflags |= RF_FULLBRIGHT;
        if(eff & EF_FLAME)
-               pointparticles(EFFECT_EF_FLAME, this.origin, '0 0 0', bound(0, frametime, 0.1));
+       {
+               boxparticles(particleeffectnum(EFFECT_EF_FLAME), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0);
+               //pointparticles(EFFECT_EF_FLAME, this.origin, '0 0 0', bound(0, frametime, 0.1));
+       }
        if(eff & EF_STARDUST)
-               pointparticles(EFFECT_EF_STARDUST, this.origin, '0 0 0', bound(0, frametime, 0.1));
+       {
+               boxparticles(particleeffectnum(EFFECT_EF_STARDUST), this, this.absmin, this.absmax, this.velocity, this.velocity, bound(0, frametime, 0.1), 0);
+               //pointparticles(EFFECT_EF_STARDUST, this.origin, '0 0 0', bound(0, frametime, 0.1));
+       }
        if(eff & EF_NOSHADOW)
                this.renderflags |= RF_NOSHADOW;
        if(eff & EF_NODEPTHTEST)
@@ -609,7 +629,7 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer)
                return;
        this.csqcmodel_predraw_run = framecount;
 
-       if(!this.modelindex || this.model == "null" || this.alpha < 0)
+       if(!this.modelindex || this.model == "null")
        {
                this.drawmask = 0;
                if(this.snd_looping > 0)
@@ -665,6 +685,8 @@ void CSQCModel_Hook_PreDraw(entity this, bool isplayer)
                                tracebox(this.origin + '0 0 1', this.mins, this.maxs, this.origin - '0 0 4', MOVE_NORMAL, this);
                                if(trace_startsolid || trace_fraction < 1)
                                        onground = 1;
+                               // predicted clients handle smoothing in the prediction code
+                               this.origin = CSQCModel_ApplyStairSmoothing(this, onground, this.origin);
                        }
                        animdecide_load_if_needed(this);
                        animdecide_setimplicitstate(this, onground);
@@ -727,6 +749,7 @@ void CSQCModel_Hook_PostUpdate(entity this, bool isnew, bool isplayer, bool islo
        bool is_playermodel = (substring(this.model, 0, 14) == "models/player/" || substring(this.model, 0, 17) == "models/ok_player/" || 
                                                        (substring(this.model, 0, 16) == "models/monsters/" && (this.isplayermodel & BIT(1))));
        this.isplayermodel = BITSET(this.isplayermodel, ISPLAYER_MODEL, is_playermodel);
+       this.csqcmodel_isdead = false; // workaround for dead players who become a spectator
 
        // save values set by server
        if((this.isplayermodel & ISPLAYER_MODEL))