From 955e8a7ca8840421b8f9a0446091c8acf7af7079 Mon Sep 17 00:00:00 2001 From: div0 Date: Fri, 16 Jan 2009 21:11:07 +0000 Subject: [PATCH] make porto and seeker use csqc projectiles completely git-svn-id: svn://svn.icculus.org/nexuiz/trunk@5581 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/csqc_constants.qc | 2 ++ data/qcsrc/client/interpolate.qh | 1 + data/qcsrc/client/projectile.qc | 49 +++++++++++++++++++++++------ data/qcsrc/common/constants.qh | 4 +++ data/qcsrc/server/csqcprojectile.qc | 1 + data/qcsrc/server/w_porto.qc | 4 ++- data/qcsrc/server/w_seeker.qc | 6 ++++ 7 files changed, 57 insertions(+), 10 deletions(-) diff --git a/data/qcsrc/client/csqc_constants.qc b/data/qcsrc/client/csqc_constants.qc index feada5971..f97767947 100644 --- a/data/qcsrc/client/csqc_constants.qc +++ b/data/qcsrc/client/csqc_constants.qc @@ -187,3 +187,5 @@ float MOVE_WORLDONLY = 3; float CAMERA_FREE = 1; float CAMERA_CHASE = 2; + +float EF_NOMODELFLAGS = 8388608; diff --git a/data/qcsrc/client/interpolate.qh b/data/qcsrc/client/interpolate.qh index 59c6c77e5..7a3a87f7f 100644 --- a/data/qcsrc/client/interpolate.qh +++ b/data/qcsrc/client/interpolate.qh @@ -4,6 +4,7 @@ #define IFLAG_AUTOANGLES 4 #define IFLAG_VALID 8 #define IFLAG_PREVALID 16 +#define IFLAG_INTERNALMASK (IFLAG_VALID | IFLAG_PREVALID) // call this BEFORE reading an entity update void InterpolateOrigin_Undo(); diff --git a/data/qcsrc/client/projectile.qc b/data/qcsrc/client/projectile.qc index cb48e0f54..fa9a5c5af 100644 --- a/data/qcsrc/client/projectile.qc +++ b/data/qcsrc/client/projectile.qc @@ -40,13 +40,27 @@ void Projectile_Draw() if(!(self.move_flags & FL_ONGROUND)) self.angles += '100 150 100' * time; break; + case PROJECTILE_PORTO_RED: + // TODO add red dynamic light + trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin); + break; + case PROJECTILE_PORTO_BLUE: + // TODO add blue dynamic light + trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin); + break; + case PROJECTILE_FLAC: + trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin); + break; + case PROJECTILE_SEEKER: + trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin); + break; default: break; } self.renderflags = 0; - if(self.count & 0x80 || self.iflags & IFLAG_VALID) + if((self.count & 0x80) || (self.iflags & IFLAG_VALID)) R_AddEntity(self); } @@ -84,9 +98,10 @@ void Ent_Projectile() f = ReadByte(); self.count = (f & 0x80); - self.iflags = IFLAG_AUTOANGLES | IFLAG_ANGLES; + self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES; self.move_flags &~= FL_ONGROUND; self.solid = SOLID_TRIGGER; + //self.effects = EF_NOMODELFLAGS; // sv_gameplayfix_delayprojectiles if(!self.move_time) @@ -94,7 +109,7 @@ void Ent_Projectile() else self.move_time = max(self.move_time, time); - if(self.count & 0x80) + if(!(self.count & 0x80)) InterpolateOrigin_Undo(); if(f & 1) @@ -118,6 +133,7 @@ void Ent_Projectile() { self.cnt = ReadByte(); + self.scale = 1; switch(self.cnt) { case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl"); break; @@ -130,14 +146,18 @@ void Ent_Projectile() case PROJECTILE_GRENADE_BOUNCING: setmodel(self, "models/grenademodel.md3"); break; case PROJECTILE_LASER: setmodel(self, "models/laser.mdl"); break; case PROJECTILE_HLAC: setmodel(self, "models/hlac_bullet.md3"); break; + case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.scale = 2; break; + case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break; + case PROJECTILE_PORTO_RED: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break; + case PROJECTILE_PORTO_BLUE: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break; default: error("Received invalid CSQC projectile, can't work with this!"); break; } - self.scale = 1; self.mins = '0 0 0'; self.maxs = '0 0 0'; + self.colormod = '0 0 0'; self.move_movetype = MOVETYPE_TOSS; self.move_moveflags = MOVEFLAG_STOPONIMPACT; @@ -161,22 +181,28 @@ void Ent_Projectile() self.mins = '-2 -2 -2'; self.maxs = '2 2 2'; break; - case PROJECTILE_GRENADE: - self.mins = '0 0 0'; - self.maxs = '0 0 0'; - break; case PROJECTILE_GRENADE_BOUNCING: self.mins = '0 0 -3'; self.maxs = '0 0 -3'; self.move_movetype = MOVETYPE_BOUNCE; self.move_moveflags = 0; break; + case PROJECTILE_SEEKER: + self.mins = '-2 -2 -2'; + self.maxs = '2 2 2'; + break; + case PROJECTILE_PORTO_RED: + self.colormod = '2 1 1'; + break; + case PROJECTILE_PORTO_BLUE: + self.colormod = '1 1 2'; + break; default: break; } } - if(self.count) + if(!(self.count & 0x80)) InterpolateOrigin_Note(); self.draw = Projectile_Draw; @@ -194,4 +220,9 @@ void Projectile_Precache() precache_model("models/grenademodel.md3"); precache_model("models/laser.mdl"); precache_model("models/hlac_bullet.md3"); + precache_model("models/hlac_bullet.md3"); + precache_model("models/tagrocket.md3"); + precache_model("models/hagarmissile.mdl"); + precache_model("models/grenademodel.md3"); + precache_model("models/grenademodel.md3"); } diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index c17be735d..12c282d70 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -364,3 +364,7 @@ float PROJECTILE_GRENADE = 7; float PROJECTILE_GRENADE_BOUNCING = 8; float PROJECTILE_LASER = 9; float PROJECTILE_HLAC = 10; +float PROJECTILE_SEEKER = 11; +float PROJECTILE_FLAC = 12; +float PROJECTILE_PORTO_RED = 13; +float PROJECTILE_PORTO_BLUE = 14; diff --git a/data/qcsrc/server/csqcprojectile.qc b/data/qcsrc/server/csqcprojectile.qc index 545a5e5f3..3564a4803 100644 --- a/data/qcsrc/server/csqcprojectile.qc +++ b/data/qcsrc/server/csqcprojectile.qc @@ -46,6 +46,7 @@ void CSQCProjectile(entity e, float clientanimate, float type) e.gravity = 0; e.csqcprojectile_type = type; + e.SendFlags = 0xFFFFFF; } void UpdateCSQCProjectile(entity e) diff --git a/data/qcsrc/server/w_porto.qc b/data/qcsrc/server/w_porto.qc index 973e28a33..9953f942e 100644 --- a/data/qcsrc/server/w_porto.qc +++ b/data/qcsrc/server/w_porto.qc @@ -123,6 +123,7 @@ void W_Porto_Touch (void) trace_plane_normal = norm; W_Porto_Fail(0); } + CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE); // change type } else { @@ -147,7 +148,6 @@ void W_Porto_Touch (void) W_Porto_Fail(0); } } - } void W_Porto_Attack (void) @@ -193,6 +193,8 @@ void W_Porto_Attack (void) gren.right_vector = v_right; gren.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP; + + CSQCProjectile(gren, TRUE, PROJECTILE_PORTO_RED); } void spawnfunc_weapon_porto (void) diff --git a/data/qcsrc/server/w_seeker.qc b/data/qcsrc/server/w_seeker.qc index f6b8c28c6..62178befe 100644 --- a/data/qcsrc/server/w_seeker.qc +++ b/data/qcsrc/server/w_seeker.qc @@ -123,6 +123,7 @@ void Seeker_Missile_Think() self.angles = vectoangles(self.velocity); // turn model in the new flight direction self.nextthink = time + 0.05; + UpdateCSQCProjectile(self); } @@ -162,6 +163,8 @@ void Seeker_Missile_Animate() else self.movetype = MOVETYPE_FLYMISSILE; } + + UpdateCSQCProjectile(self); } void Seeker_Fire_Missile(vector f_org) @@ -216,6 +219,7 @@ void Seeker_Fire_Missile(vector f_org) missile.switchweapon = vlen(missile.velocity); missile.angles = vectoangles (missile.velocity); + CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER); } void Seeker_Vollycontroler_Think() @@ -460,6 +464,8 @@ void Seeker_Fire_Flac() missile.angles = vectoangles (missile.velocity); missile.flags = FL_PROJECTILE; + + CSQCProjectile(missile, TRUE, PROJECTILE_FLAC); } void spawnfunc_weapon_seeker (void) -- 2.39.2