]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_phys.c
nothing to see here, move along...
[xonotic/darkplaces.git] / sv_phys.c
index 4ea6348410597f5594eb7867fa5470ba7cd31e72..555aa44b2df3d1c9d1a324f20836a809405658fb 100644 (file)
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -49,6 +49,7 @@ cvar_t sv_jumpstep = {CVAR_NOTIFY, "sv_jumpstep", "1"};
 cvar_t sv_wallfriction = {CVAR_NOTIFY, "sv_wallfriction", "1"};
 cvar_t sv_newflymove = {CVAR_NOTIFY, "sv_newflymove", "0"};
 cvar_t sv_freezenonclients = {CVAR_NOTIFY, "sv_freezenonclients", "0"};
+cvar_t sv_playerphysicsqc = {CVAR_NOTIFY, "sv_playerphysicsqc", "1"};
 
 #define        MOVE_EPSILON    0.01
 
@@ -61,6 +62,8 @@ void SV_Phys_Init (void)
        Cvar_RegisterVariable(&sv_wallfriction);
        Cvar_RegisterVariable(&sv_newflymove);
        Cvar_RegisterVariable(&sv_freezenonclients);
+
+       Cvar_RegisterVariable(&sv_playerphysicsqc);
 }
 
 /*
@@ -453,23 +456,6 @@ int SV_FlyMove (prvm_edict_t *ent, float time, float *stepnormal)
        return blocked;
 }
 
-int SV_SetOnGround (prvm_edict_t *ent)
-{
-       vec3_t end;
-       trace_t trace;
-       if ((int)ent->fields.server->flags & FL_ONGROUND)
-               return 1;
-       VectorSet(end, ent->fields.server->origin[0], ent->fields.server->origin[1], ent->fields.server->origin[2] - 1);
-       trace = SV_Move(ent->fields.server->origin, ent->fields.server->mins, ent->fields.server->maxs, end, MOVE_NORMAL, ent);
-       if (trace.fraction < 1 && trace.plane.normal[2] >= 0.7)
-       {
-               ent->fields.server->flags = (int)ent->fields.server->flags | FL_ONGROUND;
-               ent->fields.server->groundentity = PRVM_EDICT_TO_PROG(trace.ent);
-               return 1;
-       }
-       return 0;
-}
-
 /*
 ============
 SV_AddGravity
@@ -671,8 +657,11 @@ void SV_PushMove (prvm_edict_t *pusher, float movetime)
 
                // if the entity is standing on the pusher, it will definitely be moved
                if (!(((int)check->fields.server->flags & FL_ONGROUND) && PRVM_PROG_TO_EDICT(check->fields.server->groundentity) == pusher))
+               {
+                       // if the entity is not inside the pusher's final position, leave it alone
                        if (!SV_ClipMoveToEntity(pusher, check->fields.server->origin, check->fields.server->mins, check->fields.server->maxs, check->fields.server->origin).startsolid)
                                continue;
+               }
 
                if (forward[0] != 1 || left[1] != 1) // quick way to check if any rotation is used
                {
@@ -988,7 +977,6 @@ void SV_WalkMove (prvm_edict_t *ent)
 
        clip = SV_FlyMove (ent, sv.frametime, NULL);
 
-       SV_SetOnGround (ent);
        SV_CheckVelocity(ent);
 
        VectorCopy(ent->fields.server->origin, originalmove_origin);
@@ -1097,7 +1085,6 @@ void SV_WalkMove (prvm_edict_t *ent)
                ent->fields.server->groundentity = originalmove_groundentity;
        }
 
-       SV_SetOnGround (ent);
        SV_CheckVelocity(ent);
 }
 
@@ -1351,7 +1338,7 @@ void SV_Physics_Entity (prvm_edict_t *ent, qboolean runmove)
                // make sure the velocity is sane (not a NaN)
                SV_CheckVelocity(ent);
                // LordHavoc: QuakeC replacement for SV_ClientThink (player movement)
-               if (SV_PlayerPhysicsQC)
+               if (SV_PlayerPhysicsQC && sv_playerphysicsqc.integer)
                {
                        prog->globals.server->time = sv.time;
                        prog->globals.server->self = PRVM_EDICT_TO_PROG(ent);