]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - sv_phys.c
fix several bugs with viewport code (r_shadows works again, r_water
[xonotic/darkplaces.git] / sv_phys.c
index abd6005532fa9c6255b0d4b9a6f00627582e1950..24b17ef7bd77dfe0423eec84a8967acbb3f0fbc8 100644 (file)
--- a/sv_phys.c
+++ b/sv_phys.c
@@ -2035,7 +2035,8 @@ void SV_Physics_Toss (prvm_edict_t *ent)
                        // and groundentity is now freed, set groundentity to 0 (world)
                        // which leaves it suspended in the air
                        ent->fields.server->groundentity = 0;
-                       return;
+                       if (sv_gameplayfix_noairborncorpse_allowsuspendeditems.integer)
+                               return;
                }
        }
        ent->priv.server->suspendedinairflag = false;
@@ -2251,7 +2252,7 @@ static void SV_Physics_Entity (prvm_edict_t *ent)
        //  ents in the first frame regardless)
        qboolean runmove = ent->priv.server->move;
        ent->priv.server->move = true;
-       if (!runmove && sv_gameplayfix_delayprojectiles.integer)
+       if (!runmove && sv_gameplayfix_delayprojectiles.integer > 0)
                return;
        switch ((int) ent->fields.server->movetype)
        {
@@ -2487,9 +2488,17 @@ void SV_Physics (void)
 
        // run physics on all the non-client entities
        if (!sv_freezenonclients.integer)
+       {
                for (;i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
                        if (!ent->priv.server->free)
                                SV_Physics_Entity(ent);
+               // make a second pass to see if any ents spawned this frame and make
+               // sure they run their move/think
+               if (sv_gameplayfix_delayprojectiles.integer < 0)
+                       for (i = svs.maxclients + 1, ent = PRVM_EDICT_NUM(i);i < prog->num_edicts;i++, ent = PRVM_NEXT_EDICT(ent))
+                               if (!ent->priv.server->move && !ent->priv.server->free)
+                                       SV_Physics_Entity(ent);
+       }
 
        if (prog->globals.server->force_retouch > 0)
                prog->globals.server->force_retouch = max(0, prog->globals.server->force_retouch - 1);