]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/client/csqcmodel_hooks.qc
Properly support team field on trigger_multiple
[xonotic/xonotic-data.pk3dir.git] / qcsrc / client / csqcmodel_hooks.qc
index 4a04eb5e0fe2342de9d9e9d1ed337db1a4b12d4a..6499a683e8f4c2cf198be39cb0bee2c9eb9e9a3f 100644 (file)
@@ -1,9 +1,16 @@
+#include "csqcmodel_hooks.qh"
+#include "autocvars.qh"
+#include "csqcmodel_hooks.qh"
+#include "miscfunctions.qh"
 #include "mutators/events.qh"
 #include "player_skeleton.qh"
 #include "weapons/projectile.qh"
 #include <common/animdecide.qh>
+#include <common/ent_cs.qh>
 #include <common/physics/movetypes/movetypes.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>
@@ -127,11 +134,14 @@ void CSQCPlayer_ModelAppearance_PostUpdate(entity this)
                this.forceplayermodels_isgoodmodel = fexists(this.forceplayermodels_savemodel);
                this.forceplayermodels_isgoodmodel_mdl = this.forceplayermodels_savemodel;
                if(!this.forceplayermodels_isgoodmodel)
-                       LOG_INFOF("Warning: missing model %s has been used\n", this.forceplayermodels_savemodel);
+                       LOG_INFOF("Warning: missing model %s has been used", this.forceplayermodels_savemodel);
        }
 }
 void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
 {
+       if(MUTATOR_CALLHOOK(ForcePlayermodels_Skip, this, islocalplayer))
+               goto skipforcemodels;
+
        // FORCEMODEL
        // which one is ALWAYS good?
        if (!forceplayermodels_goodmodel)
@@ -141,7 +151,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
                _setmodel(e, cvar_defstring("_cl_playermodel"));
                forceplayermodels_goodmodel = e.model;
                forceplayermodels_goodmodelindex = e.modelindex;
-               remove(e);
+               delete(e);
        }
 
        // first, try finding it from the server
@@ -174,7 +184,7 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
                forceplayermodels_model = e.model;
                forceplayermodels_modelindex = e.modelindex;
                forceplayermodels_skin = autocvar__cl_playerskin;
-               remove(e);
+               delete(e);
        }
 
        if(autocvar_cl_forcemyplayermodel != "" && autocvar_cl_forcemyplayermodel != forceplayermodels_mymodel)
@@ -184,14 +194,14 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
                forceplayermodels_myisgoodmodel = fexists(e.model);
                forceplayermodels_mymodel = e.model;
                forceplayermodels_mymodelindex = e.modelindex;
-               remove(e);
+               delete(e);
        }
 
        // apply it
        bool isfriend;
        int cm;
        cm = this.forceplayermodels_savecolormap;
-       cm = (cm >= 1024) ? cm : (stof(getplayerkeyvalue(cm - 1, "colors")) + 1024);
+       cm = (cm >= 1024) ? cm : (entcs_GetClientColors(cm - 1) + 1024);
 
        if(teamplay)
                isfriend = (cm == 1024 + 17 * myteam);
@@ -276,9 +286,11 @@ void CSQCPlayer_ModelAppearance_Apply(entity this, bool islocalplayer)
                        this.colormap = player_localnum + 1;
        }
 
+       LABEL(skipforcemodels)
+
        // GLOWMOD AND DEATH FADING
        if(this.colormap > 0)
-               this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : stof(getplayerkeyvalue(this.colormap - 1, "colors"))) & 0x0F, true) * 2;
+               this.glowmod = colormapPaletteColor(((this.colormap >= 1024) ? this.colormap : entcs_GetClientColors(this.colormap - 1)) & 0x0F, true) * 2;
        else
                this.glowmod = '1 1 1';
 
@@ -352,6 +364,7 @@ void CSQCPlayer_AnimDecide_PostUpdate(entity this, bool isnew)
 }
 int CSQCPlayer_FallbackFrame(entity this, int f)
 {
+    TC(int, f);
        if(frameduration(this.modelindex, f) > 0)
                return f; // goooooood
        if(frameduration(this.modelindex, 1) <= 0)
@@ -367,7 +380,7 @@ int CSQCPlayer_FallbackFrame(entity this, int f)
                case 29: return 4; // anim_duckwalkbackright -> anim_duckwalk
                case 30: return 4; // anim_duckwalkbackleft -> anim_duckwalk
        }
-       LOG_INFOF("Frame %d missing in model %s, and we have no fallback - FAIL!\n", f, this.model);
+       LOG_DEBUGF("Frame %d missing in model %s, and we have no fallback - FAIL!", f, this.model);
        return f;
 }
 void CSQCPlayer_FallbackFrame_Apply(entity this)
@@ -387,9 +400,7 @@ void CSQCPlayer_FallbackFrame_Apply(entity this)
 void CSQCModel_AutoTagIndex_Apply(entity this)
 {
        if(this.tag_entity && wasfreed(this.tag_entity))
-               this.tag_entity = world;
-
-       viewloc_SetTags(this);
+               this.tag_entity = NULL;
 
        MUTATOR_CALLHOOK(TagIndex_Update, this);
 
@@ -399,14 +410,14 @@ void CSQCModel_AutoTagIndex_Apply(entity this)
                bool changed = 0;
                if(this.tag_entity.entnum != this.tag_networkentity)
                {
-                       this.tag_entity = findfloat(world, entnum, this.tag_networkentity);
+                       this.tag_entity = findfloat(NULL, entnum, this.tag_networkentity);
                        changed = 1;
                }
 
                // recursive predraw call to fix issues with forcemodels and LOD if bone indexes mismatch
                if(this.tag_entity.classname == "csqcmodel")
                {
-                       CSQCModel_Hook_PreDraw(this.tag_entity, (this.entnum >= 1 && this.entnum <= maxclients));
+                       CSQCModel_Hook_PreDraw(this.tag_entity, (this.tag_entity.entnum >= 1 && this.tag_entity.entnum <= maxclients));
                }
 
                if(this.tag_entity.modelindex != this.tag_entity_lastmodelindex)
@@ -429,9 +440,9 @@ void CSQCModel_AutoTagIndex_Apply(entity this)
                                                if(!this.tag_index)
                                                {
                                                        // we need to prevent this from 'appening
-                                                       this.tag_entity = world;
+                                                       this.tag_entity = NULL;
                                                        this.drawmask = 0;
-                                                       LOG_TRACE("h_ model lacks weapon attachment, but v_ model is attached to it\n");
+                                                       LOG_TRACE("h_ model lacks weapon attachment, but v_ model is attached to it");
                                                }
                                        }
                                        else if(this.tag_entity.isplayermodel)
@@ -459,26 +470,6 @@ void CSQCModel_AutoTagIndex_Apply(entity this)
        }
 }
 
-// FEATURE: EF_NODRAW workalike
-const int EF_BRIGHTFIELD       = BIT(0);
-const int EF_BRIGHTLIGHT       = BIT(2);
-const int EF_DIMLIGHT          = BIT(3);
-const int EF_DOUBLESIDED       = BIT(15);
-const int EF_NOSELFSHADOW      = BIT(16);
-const int EF_DYNAMICMODELLIGHT = BIT(17);
-const int EF_RESTARTANIM_BIT = BIT(20);
-const int EF_TELEPORT_BIT = BIT(21);
-const int MF_ROCKET  =  BIT(0); // leave a trail
-const int MF_GRENADE =  BIT(1); // leave a trail
-const int MF_GIB     =  BIT(2); // leave a trail
-const int MF_ROTATE  =  BIT(3); // rotate (bonus items)
-const int MF_TRACER  =  BIT(4); // green split trail
-const int MF_ZOMGIB  =  BIT(5); // small blood trail
-const int MF_TRACER2 =  BIT(6); // orange split trail
-const int MF_TRACER3 = BIT(7); // purple trail
-.int csqcmodel_effects;
-.int csqcmodel_modelflags;
-.int csqcmodel_traileffect;
 void CSQCModel_Effects_PreUpdate(entity this)
 {
        this.effects = this.csqcmodel_effects;
@@ -580,7 +571,7 @@ void CSQCModel_Effects_Apply(entity this)
        {
                if(!this.snd_looping)
                {
-                       sound(this, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_g_jetpack_attenuation);
+                       sound(this, CH_TRIGGER_SINGLE, SND_JETPACK_FLY, VOL_BASE, autocvar_cl_jetpack_attenuation);
                        this.snd_looping = CH_TRIGGER_SINGLE;
                }
        }
@@ -588,7 +579,7 @@ void CSQCModel_Effects_Apply(entity this)
        {
                if(this.snd_looping)
                {
-                       sound(this, this.snd_looping, SND_Null, VOL_BASE, autocvar_g_jetpack_attenuation);
+                       sound(this, this.snd_looping, SND_Null, VOL_BASE, autocvar_cl_jetpack_attenuation);
                        this.snd_looping = 0;
                }
        }