]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/physics/movetypes/movetypes.qc
Apply some tweaks to the QC movetypes to somewhat match what the engine is doing...
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / physics / movetypes / movetypes.qc
index e31b4076beca1072f2e1870f61fa0b73ec6800da..ef9fbdf0f16b4e66388a9d6bf8312b106c065a70 100644 (file)
@@ -36,11 +36,15 @@ void _Movetype_WallFriction(entity this, vector stepnormal)  // SV_WallFriction
 vector planes[MAX_CLIP_PLANES];
 int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnormal, float stepheight) // SV_FlyMove
 {
+       if(dt <= 0)
+               return 0;
+
        int blocked = 0;
        int i, j, numplanes = 0;
        float time_left = dt, grav = 0;
        vector push;
-       vector primal_velocity, original_velocity, restore_velocity;
+       vector primal_velocity, original_velocity;
+       vector restore_velocity = this.velocity;
 
        for(i = 0; i < MAX_CLIP_PLANES; ++i)
                planes[i] = '0 0 0';
@@ -59,7 +63,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma
                }
        }
 
-       original_velocity = primal_velocity = restore_velocity = this.velocity;
+       original_velocity = primal_velocity = this.velocity;
 
        for(int bumpcount = 0;bumpcount < MAX_CLIP_PLANES;bumpcount++)
        {
@@ -67,8 +71,7 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma
                        break;
 
                push = this.velocity * time_left;
-               _Movetype_PushEntity(this, push, true);
-               if(trace_startsolid)
+               if(!_Movetype_PushEntity(this, push, true, false))
                {
                        // we got teleported by a touch function
                        // let's abort the move
@@ -113,22 +116,19 @@ int _Movetype_FlyMove(entity this, float dt, bool applygravity, vector stepnorma
                        vector org = this.origin;
                        vector steppush = '0 0 1' * stepheight;
 
-                       _Movetype_PushEntity(this, steppush, true);
-                       if(trace_startsolid)
+                       if(!_Movetype_PushEntity(this, steppush, true, false))
                        {
                                blocked |= 8;
                                break;
                        }
-                       _Movetype_PushEntity(this, push, true);
-                       if(trace_startsolid)
+                       if(!_Movetype_PushEntity(this, push, true, false))
                        {
                                blocked |= 8;
                                break;
                        }
                        float trace2_fraction = trace_fraction;
-                       steppush = '0 0 1' * (org.z - this.origin_z);
-                       _Movetype_PushEntity(this, steppush, true);
-                       if(trace_startsolid)
+                       steppush = vec3(0, 0, org.z - this.origin_z);
+                       if(!_Movetype_PushEntity(this, steppush, true, false))
                        {
                                blocked |= 8;
                                break;
@@ -501,20 +501,32 @@ void _Movetype_PushEntityTrace(entity this, vector push)
        tracebox(this.origin, this.mins, this.maxs, end, type, this);
 }
 
-float _Movetype_PushEntity(entity this, vector push, bool failonstartsolid)  // SV_PushEntity
+bool _Movetype_PushEntity(entity this, vector push, bool failonstartsolid, bool dolink)  // SV_PushEntity
 {
        _Movetype_PushEntityTrace(this, push);
 
        if(trace_startsolid && failonstartsolid)
-               return trace_fraction;
+       {
+               int oldtype = this.move_nomonsters;
+               this.move_nomonsters = MOVE_NOMONSTERS;
+               _Movetype_PushEntityTrace(this, push);
+               this.move_nomonsters = oldtype;
+               if(trace_startsolid)
+                       return true;
+       }
 
        this.origin = trace_endpos;
 
+       vector last_origin = this.origin;
+
+       if(dolink)
+               _Movetype_LinkEdict(this, true);
+
        if(trace_fraction < 1)
                if(this.solid >= SOLID_TRIGGER && (!IS_ONGROUND(this) || (this.groundentity != trace_ent)))
                        _Movetype_Impact(this, trace_ent);
 
-       return trace_fraction;
+       return (this.origin == last_origin); // false if teleported by touch
 }