]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
implement effects in CSQC
authorRudolf Polzer <divverent@alientrap.org>
Wed, 21 Dec 2011 14:59:10 +0000 (15:59 +0100)
committerRudolf Polzer <divverent@alientrap.org>
Wed, 21 Dec 2011 14:59:10 +0000 (15:59 +0100)
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/progs.src
qcsrc/client/projectile.qc
qcsrc/client/projectile.qh [new file with mode: 0644]
qcsrc/dpdefs/csprogsdefs.qc

index d5694a50f1c0a9d3b3b08e4a1a0c0714109c4b9d..2de97af4dfecbfd010e7eda62c1eba4da389d3d4 100644 (file)
@@ -259,20 +259,98 @@ void CSQCModel_AutoTagIndex_Apply(void)
 }
 
 // FEATURE: EF_NODRAW workalike
-.float invisible_effects;
-void CSQCModel_Invisible_PreUpdate(void)
+float EF_BRIGHTFIELD   = 1;
+float EF_BRIGHTLIGHT   = 4;
+float EF_DIMLIGHT      = 8;
+float EF_DOUBLESIDED = 32768;
+float EF_NOSELFSHADOW = 65536;
+float MF_ROCKET  =   1; // leave a trail
+float MF_GRENADE =   2; // leave a trail
+float MF_GIB     =   4; // leave a trail
+float MF_ROTATE  =   8; // rotate (bonus items)
+float MF_TRACER  =  16; // green split trail
+float MF_ZOMGIB  =  32; // small blood trail
+float MF_TRACER2 =  64; // orange split trail
+float MF_TRACER3 = 128; // purple trail
+.float csqcmodel_effects;
+.float csqcmodel_modelflags;
+void CSQCModel_Effects_PreUpdate(void)
 {
-       self.effects = self.invisible_effects;
+       self.effects = self.csqcmodel_effects;
+       self.modelflags = self.csqcmodel_modelflags;
 }
-void CSQCModel_Invisible_PostUpdate(void)
+void CSQCModel_Effects_PostUpdate(void)
 {
-       self.invisible_effects = self.effects;
-       self.effects &~= CSQCMODEL_EF_INVISIBLE;
+       self.csqcmodel_effects = self.effects;
+       self.csqcmodel_modelflags = self.modelflags;
+       self.effects = 0;
+       self.modelflags = 0;
 }
-void CSQCModel_Invisible_Apply(void)
+void CSQCModel_Effects_Apply(void)
 {
-       if(self.invisible_effects & CSQCMODEL_EF_INVISIBLE)
+       float eff = self.effects;
+       eff &~= CSQCMODEL_EF_INVISIBLE;
+
+       self.renderflags &~= (RF_DEPTHHACK | RF_ADDITIVE | RF_FULLBRIGHT | EF_NOSHADOW | RF_USEAXIS);
+       self.effects = 0;
+       self.traileffect = 0;
+                       
+       if(eff & EF_BRIGHTFIELD)
+               self.traileffect = particleeffectnum("TR_NEXUIZPLASMA");
+       // ignoring EF_MUZZLEFLASH
+       if(eff & EF_BRIGHTLIGHT)
+               adddynamiclight(self.origin, 400, '3 3 3');
+       if(eff & EF_DIMLIGHT)
+               adddynamiclight(self.origin, 200, '1.5 1.5 1.5');
+       if((eff & EF_NODRAW) || (self.csqcmodel_effects & CSQCMODEL_EF_INVISIBLE))
                self.drawmask = 0;
+       if(eff & EF_ADDITIVE)
+               self.renderflags |= RF_ADDITIVE;
+       if(eff & EF_BLUE)
+               adddynamiclight(self.origin, 200, '0.15 0.15 1.5');
+       if(eff & EF_RED)
+               adddynamiclight(self.origin, 200, '1.5 0.15 0.15');
+       // ignoring EF_NOGUNBOB
+       if(eff & EF_FULLBRIGHT)
+               self.renderflags |= RF_FULLBRIGHT;
+       if(eff & EF_FLAME)
+               pointparticles(particleeffectnum("EF_FLAME"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       if(eff & EF_STARDUST)
+               pointparticles(particleeffectnum("EF_STARDUST"), self.origin, '0 0 0', bound(0, frametime, 0.1));
+       if(eff & EF_NOSHADOW)
+               self.renderflags |= RF_NOSHADOW;
+       if(eff & EF_NODEPTHTEST)
+               self.renderflags |= RF_DEPTHHACK;
+       // ignoring EF_SELECTABLE
+       if(eff & EF_DOUBLESIDED)
+               self.effects |= EF_DOUBLESIDED;
+       if(eff & EF_NOSELFSHADOW)
+               self.effects |= EF_NOSELFSHADOW;
+       // ignoring EF_UNUSED17, EF_UNUSED18, EF_UNUSED19, EF_RESTARTANIM_BIT, EF_TELEPORT_BIT, EF_LOWPRECISION
+       if(self.csqcmodel_modelflags & MF_ROCKET)
+               self.traileffect = particleeffectnum("TR_ROCKET");
+       if(self.csqcmodel_modelflags & MF_GRENADE)
+               self.traileffect = particleeffectnum("TR_GRENADE");
+       if(self.csqcmodel_modelflags & MF_GIB)
+               self.traileffect = particleeffectnum("TR_BLOOD");
+       if(self.csqcmodel_modelflags & MF_ROTATE)
+       {
+               self.renderflags |= RF_USEAXIS;
+               makevectors(self.angles + '0 0 100' * fmod(time, 3.6));
+       }
+       if(self.csqcmodel_modelflags & MF_TRACER)
+               self.traileffect = particleeffectnum("TR_WIZSPIKE");
+       if(self.csqcmodel_modelflags & MF_ZOMGIB)
+               self.traileffect = particleeffectnum("TR_SLIGHTBLOOD");
+       if(self.csqcmodel_modelflags & MF_TRACER2)
+               self.traileffect = particleeffectnum("TR_KNIGHTSPIKE");
+       if(self.csqcmodel_modelflags & MF_TRACER3)
+               self.traileffect = particleeffectnum("TR_VORESPIKE");
+
+       if(self.drawmask)
+               Projectile_DrawTrail(self.origin);
+       else
+               Projectile_ResetTrail(self.origin);
 }
 
 // general functions
@@ -297,12 +375,12 @@ void CSQCModel_Hook_PreDraw(float isplayer, float islocalplayer)
        if(!isplayer)
                CSQCModel_AutoTagIndex_Apply();
 
-       CSQCModel_Invisible_Apply();
+       CSQCModel_Effects_Apply();
 }
 
 void CSQCModel_Hook_PreUpdate(float isplayer, float islocalplayer)
 {
-       CSQCModel_Invisible_PreUpdate();
+       CSQCModel_Effects_PreUpdate();
        if(isplayer)
        {
                // revert to values from server
@@ -319,5 +397,5 @@ void CSQCModel_Hook_PostUpdate(float isplayer, float islocalplayer)
                CSQCPlayer_ForceModel_PostUpdate();
                CSQCPlayer_FallbackFrame_PostUpdate();
        }
-       CSQCModel_Invisible_PostUpdate();
+       CSQCModel_Effects_PostUpdate();
 }
index 1a303f4f42d57916214aa3db15c804fce89f4294..9507161feda819a65793ba5b95fcbdd990439517 100644 (file)
@@ -41,6 +41,7 @@ vehicles/vehicles.qh
 ../csqcmodel/common.qh
 ../csqcmodel/cl_model.qh
 ../csqcmodel/cl_player.qh
+projectile.qh
 
 sortlist.qc
 miscfunctions.qc
index 426ef78250a6d49909e36dafb3a71a5096e6483f..85d5aedcb5f0bd7f638ff4517342c4bfa6bf30a6 100644 (file)
@@ -20,7 +20,6 @@ void SUB_Stop()
 .float gravity;
 .float snd_looping;
 .float silent;
-.float traileffect;
 
 void Projectile_ResetTrail(vector to)
 {
diff --git a/qcsrc/client/projectile.qh b/qcsrc/client/projectile.qh
new file mode 100644 (file)
index 0000000..70c8ba0
--- /dev/null
@@ -0,0 +1,3 @@
+.float traileffect;
+void Projectile_ResetTrail(vector to);
+void Projectile_DrawTrail(vector to);
index 3ebb09ad3954c8307a787c45673ebcf2a674f563..a53c612a7428261e2e3cd391653d2e61b24c6b69 100644 (file)
@@ -166,7 +166,7 @@ const float MASK_NORMAL                     = 4;
 const float RF_VIEWMODEL       = 1;
 const float RF_EXTERNALMODEL   = 2;
 const float RF_DEPTHHACK       = 4;
-const float RF_ADDATIVE                = 8;
+const float RF_ADDITIVE                = 8;
 const float RF_USEAXIS         = 16;
 
 const float VF_MIN             = 1;    //(vector)
@@ -1402,3 +1402,5 @@ float PARTICLES_USECOLOR = 2;
 vector particles_colormin, particles_colormax;
 void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, float flags) boxparticles = #502;
 float trace_networkentity;
+const float RF_FULLBRIGHT      = 256;
+const float RF_NOSHADOW        = 512;