From: Rudolf Polzer Date: Mon, 25 Jul 2011 18:44:46 +0000 (+0200) Subject: multiple fixes of clientside movetypes (gravity unaffected by ticrate flag, initial... X-Git-Tag: xonotic-v0.5.0~148^2~40 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=0ad5cb1be1dd10185fcb5581b0645d34aa9b294d;p=xonotic%2Fxonotic-data.pk3dir.git multiple fixes of clientside movetypes (gravity unaffected by ticrate flag, initial state of didgravity flag) Fixes #540 --- diff --git a/qcsrc/client/movetypes.qc b/qcsrc/client/movetypes.qc index 9a17dea35..4dcdae90b 100644 --- a/qcsrc/client/movetypes.qc +++ b/qcsrc/client/movetypes.qc @@ -1,3 +1,7 @@ +float STAT_MOVEFLAGS = 225; +float MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE = 4; +#define GRAVITY_UNAFFECTED_BY_TICRATE (getstati(STAT_MOVEFLAGS) & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE) + .entity move_groundentity; .float move_suspendedinair; .float move_didgravity; @@ -232,11 +236,21 @@ void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss if(self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) { - self.move_didgravity = TRUE; - if(self.gravity) - self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + self.move_didgravity = 1; + if(GRAVITY_UNAFFECTED_BY_TICRATE) + { + if(self.gravity) + self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY); + } else - self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY); + { + if(self.gravity) + self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY); + } } self.move_angles = self.move_angles + self.move_avelocity * dt; @@ -318,12 +332,22 @@ void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss break; } + if(GRAVITY_UNAFFECTED_BY_TICRATE) + if(self.move_didgravity > 0) + if(!(self.move_flags & FL_ONGROUND)) + { + if(self.gravity) + self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY); + } + _Movetype_CheckWaterTransition(); } void _Movetype_Physics_Frame(float movedt) { - self.move_didgravity = FALSE; + self.move_didgravity = -1; switch(self.move_movetype) { case MOVETYPE_PUSH: @@ -364,9 +388,6 @@ void Movetype_Physics_NoMatchServer() // optimized movedt = time - self.move_time; self.move_time = time; - //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND)); - // we use the field as set by the last run of this - _Movetype_Physics_Frame(movedt); if(wasfreed(self)) return; @@ -399,8 +420,8 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity dt -= n * tr; self.move_time += n * tr; - //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND)); - // we use the field as set by the last run of this + if(!self.move_didgravity) + self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND)); for(i = 0; i < n; ++i) { @@ -415,12 +436,23 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity { // now continue the move from move_time to time self.velocity = self.move_velocity; - if(self.move_didgravity) + + if(self.move_didgravity > 0) { - if(self.gravity) - self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + if(GRAVITY_UNAFFECTED_BY_TICRATE) + { + if(self.gravity) + self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY); + } else - self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY); + { + if(self.gravity) + self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY); + } } self.angles = self.move_angles + dt * self.avelocity; @@ -435,6 +467,17 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity if(!trace_startsolid) setorigin(self, trace_endpos); } + + if(self.move_didgravity > 0) + { + if(GRAVITY_UNAFFECTED_BY_TICRATE) + { + if(self.gravity) + self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY); + else + self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY); + } + } } else {