From baf87b348b2e09c320919688e5e5a2f0de1489b5 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Wed, 21 Dec 2011 15:59:10 +0100 Subject: [PATCH] implement effects in CSQC --- qcsrc/client/csqcmodel_hooks.qc | 100 ++++++++++++++++++++++++++++---- qcsrc/client/progs.src | 1 + qcsrc/client/projectile.qc | 1 - qcsrc/client/projectile.qh | 3 + qcsrc/dpdefs/csprogsdefs.qc | 4 +- 5 files changed, 96 insertions(+), 13 deletions(-) create mode 100644 qcsrc/client/projectile.qh diff --git a/qcsrc/client/csqcmodel_hooks.qc b/qcsrc/client/csqcmodel_hooks.qc index d5694a50f..2de97af4d 100644 --- a/qcsrc/client/csqcmodel_hooks.qc +++ b/qcsrc/client/csqcmodel_hooks.qc @@ -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(); } diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 1a303f4f4..9507161fe 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -41,6 +41,7 @@ vehicles/vehicles.qh ../csqcmodel/common.qh ../csqcmodel/cl_model.qh ../csqcmodel/cl_player.qh +projectile.qh sortlist.qc miscfunctions.qc diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc index 426ef7825..85d5aedcb 100644 --- a/qcsrc/client/projectile.qc +++ b/qcsrc/client/projectile.qc @@ -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 index 000000000..70c8ba0df --- /dev/null +++ b/qcsrc/client/projectile.qh @@ -0,0 +1,3 @@ +.float traileffect; +void Projectile_ResetTrail(vector to); +void Projectile_DrawTrail(vector to); diff --git a/qcsrc/dpdefs/csprogsdefs.qc b/qcsrc/dpdefs/csprogsdefs.qc index 3ebb09ad3..a53c612a7 100644 --- a/qcsrc/dpdefs/csprogsdefs.qc +++ b/qcsrc/dpdefs/csprogsdefs.qc @@ -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; -- 2.39.2