From 16053e976ba68666a7b8d96ed89963ff977fb471 Mon Sep 17 00:00:00 2001 From: div0 Date: Tue, 17 Mar 2009 08:04:33 +0000 Subject: [PATCH] fix some serious csqcprojectile bugs (regarding collisions with bmodels). Now there is some visible jitter that wasn't there before wehn they're lying on a bmodel, but they no longer do the wrong thing. git-svn-id: svn://svn.icculus.org/nexuiz/trunk@6197 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/projectile.qc | 9 ++++++++- data/qcsrc/server/csqcprojectile.qc | 27 +++++++++++++++++++++++++- data/qcsrc/server/csqcprojectile.qh | 2 ++ data/qcsrc/server/defs.qh | 2 ++ data/qcsrc/server/miscfunctions.qc | 3 +-- data/qcsrc/server/sv_main.qc | 9 +++++++++ data/qcsrc/server/w_crylink.qc | 4 ---- data/qcsrc/server/w_electro.qc | 3 --- data/qcsrc/server/w_grenadelauncher.qc | 3 --- data/qcsrc/server/w_hagar.qc | 3 --- 10 files changed, 48 insertions(+), 17 deletions(-) diff --git a/data/qcsrc/client/projectile.qc b/data/qcsrc/client/projectile.qc index 2d9c9db62..d8ac11dd5 100644 --- a/data/qcsrc/client/projectile.qc +++ b/data/qcsrc/client/projectile.qc @@ -200,10 +200,17 @@ void Ent_Projectile() f = ReadByte(); self.count = (f & 0x80); self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES; - self.move_flags &~= FL_ONGROUND; self.solid = SOLID_TRIGGER; //self.effects = EF_NOMODELFLAGS; + // this should make collisions with bmodels more exact, but it leads to + // projectiles no longer being able to lie on a bmodel + self.move_nomonsters = MOVE_WORLDONLY; + if(f & 0x40) + self.move_flags |= FL_ONGROUND; + else + self.move_flags &~= FL_ONGROUND; + if(!self.move_time) { // for some unknown reason, we don't need to care for diff --git a/data/qcsrc/server/csqcprojectile.qc b/data/qcsrc/server/csqcprojectile.qc index fb6835a9e..581699662 100644 --- a/data/qcsrc/server/csqcprojectile.qc +++ b/data/qcsrc/server/csqcprojectile.qc @@ -7,6 +7,9 @@ float CSQCProjectile_SendEntity(entity to, float sf) if(self.csqcprojectile_clientanimate) sf |= 0x80; // client animated, not interpolated + if(self.flags & FL_ONGROUND) + sf |= 0x40; + WriteByte(MSG_ENTITY, ENT_CLIENT_PROJECTILE); WriteByte(MSG_ENTITY, sf); @@ -31,6 +34,16 @@ float CSQCProjectile_SendEntity(entity to, float sf) return 1; } +.vector csqcprojectile_oldorigin; +void CSQCProjectile_Check(entity e) +{ + if(e.csqcprojectile_clientanimate) + if(e.flags & FL_ONGROUND) + if(e.origin != e.csqcprojectile_oldorigin) + UpdateCSQCProjectile(e); + e.csqcprojectile_oldorigin = e.origin; +} + void CSQCProjectile(entity e, float clientanimate, float type, float docull) { Net_LinkEntity(e, docull, 0, CSQCProjectile_SendEntity); @@ -51,5 +64,17 @@ void CSQCProjectile(entity e, float clientanimate, float type, float docull) void UpdateCSQCProjectile(entity e) { if(e.SendEntity == CSQCProjectile_SendEntity) - e.SendFlags |= 1; // send new origin data + { + // send new origin data + e.SendFlags |= 1; + } +} + +void UpdateCSQCProjectileNextFrame(entity e) +{ + if(e.SendEntity == CSQCProjectile_SendEntity) + { + // send new origin data + e.NextFrameSendFlags |= 1; + } } diff --git a/data/qcsrc/server/csqcprojectile.qh b/data/qcsrc/server/csqcprojectile.qh index e3a2a222c..eda883bed 100644 --- a/data/qcsrc/server/csqcprojectile.qh +++ b/data/qcsrc/server/csqcprojectile.qh @@ -2,3 +2,5 @@ void CSQCProjectile(entity e, float clientanimate, float type, float docull); void UpdateCSQCProjectile(entity e); +void UpdateCSQCProjectileNextFrame(entity e); +void CSQCProjectile_Check(entity e); diff --git a/data/qcsrc/server/defs.qh b/data/qcsrc/server/defs.qh index f6d086062..53470ba77 100644 --- a/data/qcsrc/server/defs.qh +++ b/data/qcsrc/server/defs.qh @@ -551,3 +551,5 @@ vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons .float wasplayer; float servertime, serverprevtime, serverframetime; + +.float NextFrameSendFlags; diff --git a/data/qcsrc/server/miscfunctions.qc b/data/qcsrc/server/miscfunctions.qc index a122f4757..2cbf43576 100644 --- a/data/qcsrc/server/miscfunctions.qc +++ b/data/qcsrc/server/miscfunctions.qc @@ -1797,8 +1797,7 @@ float SUB_NoImpactCheck() #define SUB_OwnerCheck() (other && (other == self.owner)) -#define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } } while(0) -#define PROJECTILE_TOUCH_NOSOUND do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { stopsound(self, CHAN_PAIN); remove(self); return; } } while(0) +#define PROJECTILE_TOUCH do { if(SUB_OwnerCheck()) return; if(SUB_NoImpactCheck()) { remove(self); return; } if(trace_ent && trace_ent.solid > SOLID_TRIGGER) UpdateCSQCProjectileNextFrame(self); } while(0) float MAX_IPBAN_URIS = 16; diff --git a/data/qcsrc/server/sv_main.qc b/data/qcsrc/server/sv_main.qc index 67fc87158..5c855b278 100644 --- a/data/qcsrc/server/sv_main.qc +++ b/data/qcsrc/server/sv_main.qc @@ -140,6 +140,15 @@ void StartFrame (void) dprint_load(); // load dprint status from cvar + entity e; + for(e = world; (e = findflags(e, NextFrameSendFlags, 0xFFFFFF)); ) + { + e.SendFlags |= e.NextFrameSendFlags; + e.NextFrameSendFlags = 0; + } + for(e = world; (e = findfloat(e, csqcprojectile_clientanimate, 1)); ) + CSQCProjectile_Check(e); + if(RedirectionThink()) return; diff --git a/data/qcsrc/server/w_crylink.qc b/data/qcsrc/server/w_crylink.qc index 313cf896b..91dcc2fb1 100644 --- a/data/qcsrc/server/w_crylink.qc +++ b/data/qcsrc/server/w_crylink.qc @@ -25,8 +25,6 @@ void W_Crylink_Touch (void) self.owner = world; self.projectiledeathtype |= HITTYPE_BOUNCE; //self.scale = 1 + self.cnt; - - UpdateCSQCProjectile(self); } void W_Crylink_Touch2 (void) @@ -52,8 +50,6 @@ void W_Crylink_Touch2 (void) self.owner = world; self.projectiledeathtype |= HITTYPE_BOUNCE; // self.scale = 1 + 1 * self.cnt; - - UpdateCSQCProjectile(self); } void W_Crylink_Attack (void) diff --git a/data/qcsrc/server/w_electro.qc b/data/qcsrc/server/w_electro.qc index ff891d9c6..ecfe2e188 100644 --- a/data/qcsrc/server/w_electro.qc +++ b/data/qcsrc/server/w_electro.qc @@ -35,9 +35,6 @@ void W_Plasma_Touch (void) sound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM); self.projectiledeathtype |= HITTYPE_BOUNCE; } - - if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough - UpdateCSQCProjectile(self); } void W_Plasma_TouchExplode (void) diff --git a/data/qcsrc/server/w_grenadelauncher.qc b/data/qcsrc/server/w_grenadelauncher.qc index da647fc15..157aafd46 100644 --- a/data/qcsrc/server/w_grenadelauncher.qc +++ b/data/qcsrc/server/w_grenadelauncher.qc @@ -57,9 +57,6 @@ void W_Grenade_Touch2 (void) sound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM); self.projectiledeathtype |= HITTYPE_BOUNCE; } - - if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough - UpdateCSQCProjectile(self); } void W_Grenade_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) diff --git a/data/qcsrc/server/w_hagar.qc b/data/qcsrc/server/w_hagar.qc index 4823bc631..ebf728282 100644 --- a/data/qcsrc/server/w_hagar.qc +++ b/data/qcsrc/server/w_hagar.qc @@ -33,9 +33,6 @@ void W_Hagar_Touch2 (void) self.owner = world; self.projectiledeathtype |= HITTYPE_BOUNCE; } - - if(trace_ent && trace_ent.solid > SOLID_TRIGGER) // CSQC doesn't know about these entities well enough - UpdateCSQCProjectile(self); } void W_Hagar_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) -- 2.39.2