]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/physics/movetypes/movetypes.qc
Merge branch 'bones_was_here/fc_auto_helpme' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / physics / movetypes / movetypes.qc
index 7e7945e1c920d0f0bc19b487c96f94805bec5891..48216f39297d7fd8178b41f3982f02f2d0cc291d 100644 (file)
@@ -6,6 +6,8 @@ void set_movetype(entity this, int mt)
        this.move_movetype = mt;
        if (mt == MOVETYPE_PHYSICS) {
                this.move_qcphysics = false;
+       } else if (autocvar_sv_qcphysics == 2) {
+               this.move_qcphysics = true;
        }
        if(!IL_CONTAINS(g_moveables, this))
                IL_PUSH(g_moveables, this); // add it to the moveable entities list (even if it doesn't move!) logic: if an object never sets its movetype, we assume it never does anything notable
@@ -25,7 +27,7 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV
        for(int bump = 0; bump < 6; bump++)
        {
                int coord = 2 - (bump >> 1);
-               bool dir = (bump & 1);
+               int dir = (bump & 1);
 
                for(int subbump = 0; ; ++subbump)
                {
@@ -54,7 +56,6 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV
                        tracebox(stuckorigin, goodmins, goodmaxs, testorigin, MOVE_NOMONSTERS, this);
                        if(trace_startsolid && trace_ent.solid == SOLID_BSP) // NOTE: this checks for bmodelstartsolid in the engine
                        {
-                               
                                // BAD BAD, can't fix that
                                return false;
                        }
@@ -70,7 +71,7 @@ bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV
 
                        // we hit something... let's move out of it
                        vector move = trace_endpos - testorigin;
-                       float nudge = (trace_plane_normal * move) + 0.03125f; // FIXME cvar this constant
+                       float nudge = (trace_plane_normal * move) + 0.03125; // FIXME cvar this constant
                        stuckorigin = stuckorigin + nudge * trace_plane_normal;
                }
 
@@ -425,7 +426,22 @@ void _Movetype_LinkEdict_TouchAreaGrid(entity this)  // SV_LinkEdict_TouchAreaGr
        if(this.solid == SOLID_NOT)
                return;
 
-    FOREACH_ENTITY_RADIUS(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin), true, {
+       // due to a lack of pointers in QC, we must save the trace values and restore them for other functions
+       bool save_trace_allsolid = trace_allsolid;
+       bool save_trace_startsolid = trace_startsolid;
+       float save_trace_fraction = trace_fraction;
+       bool save_trace_inwater = trace_inwater;
+       bool save_trace_inopen = trace_inopen;
+       vector save_trace_endpos = trace_endpos;
+       vector save_trace_plane_normal = trace_plane_normal;
+       float save_trace_plane_dist = trace_plane_dist;
+       entity save_trace_ent = trace_ent;
+       int save_trace_dpstartcontents = trace_dpstartcontents;
+       int save_trace_dphitcontents = trace_dphitcontents;
+       int save_trace_dphitq3surfaceflags = trace_dphitq3surfaceflags;
+       string save_trace_dphittexturename = trace_dphittexturename;
+
+    FOREACH_ENTITY_RADIUS_ORDERED(0.5 * (this.absmin + this.absmax), 0.5 * vlen(this.absmax - this.absmin), true, {
                if (it.solid == SOLID_TRIGGER && it != this)
                if (it.move_nomonsters != MOVE_NOMONSTERS && it.move_nomonsters != MOVE_WORLDONLY)
                if (gettouch(it) && boxesoverlap(it.absmin, it.absmax, this.absmin, this.absmax))
@@ -447,6 +463,20 @@ void _Movetype_LinkEdict_TouchAreaGrid(entity this)  // SV_LinkEdict_TouchAreaGr
                        gettouch(it)(it, this);
                }
     });
+
+       trace_allsolid = save_trace_allsolid;
+       trace_startsolid = save_trace_startsolid;
+       trace_fraction = save_trace_fraction;
+       trace_inwater = save_trace_inwater;
+       trace_inopen = save_trace_inopen;
+       trace_endpos = save_trace_endpos;
+       trace_plane_normal = save_trace_plane_normal;
+       trace_plane_dist = save_trace_plane_dist;
+       trace_ent = save_trace_ent;
+       trace_dpstartcontents = save_trace_dpstartcontents;
+       trace_dphitcontents = save_trace_dphitcontents;
+       trace_dphitq3surfaceflags = save_trace_dphitq3surfaceflags;
+       trace_dphittexturename = save_trace_dphittexturename;
 }
 
 bool autocvar__movetype_debug = false;
@@ -505,7 +535,7 @@ int _Movetype_ContentsMask(entity this)  // SV_GenericHitSuperContentsMask
                        return this.dphitcontentsmask;
                else if(this.solid == SOLID_SLIDEBOX)
                {
-                       if(this.flags & 32) // TODO: FL_MONSTER
+                       if(this.flags & FL_MONSTER)
                                return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_MONSTERCLIP;
                        else
                                return DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
@@ -724,17 +754,23 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt)
                        this.angles = this.angles + movedt * this.avelocity;
                        break;
                case MOVETYPE_STEP:
+                       if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+                               _Movetype_CheckStuck(this);
                        _Movetype_Physics_Step(this, movedt);
                        break;
                case MOVETYPE_WALK:
                case MOVETYPE_FLY:
                case MOVETYPE_FLY_WORLDONLY:
+                       if (movedt > 0 && GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+                               _Movetype_CheckStuck(this);
                        _Movetype_Physics_Walk(this, movedt);
                        break;
                case MOVETYPE_TOSS:
                case MOVETYPE_BOUNCE:
                case MOVETYPE_BOUNCEMISSILE:
                case MOVETYPE_FLYMISSILE:
+                       if (GAMEPLAYFIX_UNSTICKPLAYERS(this) == 2)
+                               _Movetype_CheckStuck(this);
                        _Movetype_Physics_Toss(this, movedt);
                        break;
                case MOVETYPE_PHYSICS:
@@ -750,12 +786,24 @@ void _Movetype_Physics_ClientFrame(entity this, float movedt)
 
 void Movetype_Physics_NoMatchTicrate(entity this, float movedt, bool isclient)  // to be run every move frame
 {
+       bool didmove = (this.move_time != 0);
        this.move_time = time;
 
        if(isclient)
                _Movetype_Physics_ClientFrame(this, movedt);
        else
+       {
+               // this doesn't apply to clients, and only applies to unmatched entities
+               // don't run think/move on newly spawned projectiles as it messes up
+               // movement interpolation and rocket trails, and is inconsistent with
+               // respect to entities spawned in the same frame
+               // (if an ent spawns a higher numbered ent, it moves in the same frame,
+               //  but if it spawns a lower numbered ent, it doesn't - this never moves
+               //  ents in the first frame regardless)
+               if(!didmove && GAMEPLAYFIX_DELAYPROJECTILES(this) > 0)
+                       return;
                _Movetype_Physics_Frame(this, movedt);
+       }
        if(wasfreed(this))
                return;