X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=sv_phys.c;h=1505372e0ba6d8e31f8b20681f3022b8728c1212;hb=81d669d017e7e58c358335859c1ec357255a62af;hp=c03cdb26a36ceba9099e45af558718e6fd041e9f;hpb=48978ee14d2f77912ad239c5797fc23f12a2fc94;p=xonotic%2Fdarkplaces.git diff --git a/sv_phys.c b/sv_phys.c index c03cdb26..1505372e 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -563,6 +563,8 @@ void SV_PushMove (edict_t *pusher, float movetime) float savesolid, movetime2, pushltime; vec3_t mins, maxs, move, move1, moveangle, pushorig, pushang, a, forward, left, up, org, org2; int num_moved; + int numcheckentities; + static edict_t *checkentities[MAX_EDICTS]; model_t *pushermodel; trace_t trace; @@ -592,13 +594,13 @@ void SV_PushMove (edict_t *pusher, float movetime) SV_LinkEdict (pusher, false); return; default: - Con_DPrintf("SV_PushMove: unrecognized solid type %f\n", pusher->v->solid); + Con_Printf("SV_PushMove: unrecognized solid type %f\n", pusher->v->solid); return; } index = (int) pusher->v->modelindex; if (index < 1 || index >= MAX_MODELS) { - Con_DPrintf("SV_PushMove: invalid modelindex %f\n", pusher->v->modelindex); + Con_Printf("SV_PushMove: invalid modelindex %f\n", pusher->v->modelindex); return; } pushermodel = sv.models[index]; @@ -673,11 +675,11 @@ void SV_PushMove (edict_t *pusher, float movetime) // see if any solid entities are inside the final position num_moved = 0; - check = NEXT_EDICT(sv.edicts); - for (e = 1;e < sv.num_edicts;e++, check = NEXT_EDICT(check)) + + numcheckentities = SV_EntitiesInBox(mins, maxs, MAX_EDICTS, checkentities); + for (e = 1;e < numcheckentities;e++) { - if (check->e->free) - continue; + check = checkentities[e]; if (check->v->movetype == MOVETYPE_PUSH || check->v->movetype == MOVETYPE_NONE || check->v->movetype == MOVETYPE_FOLLOW @@ -687,18 +689,8 @@ void SV_PushMove (edict_t *pusher, float movetime) // if the entity is standing on the pusher, it will definitely be moved if (!(((int)check->v->flags & FL_ONGROUND) && PROG_TO_EDICT(check->v->groundentity) == pusher)) - { - if (check->v->absmin[0] >= maxs[0] - || check->v->absmax[0] <= mins[0] - || check->v->absmin[1] >= maxs[1] - || check->v->absmax[1] <= mins[1] - || check->v->absmin[2] >= maxs[2] - || check->v->absmax[2] <= mins[2]) - continue; - if (!SV_ClipMoveToEntity(pusher, check->v->origin, check->v->mins, check->v->maxs, check->v->origin).startsolid) continue; - } if (forward[0] != 1) // quick way to check if any rotation is used { @@ -1230,10 +1222,6 @@ void SV_Physics_Toss (edict_t *ent) vec3_t move; edict_t *groundentity; - // regular thinking - if (!SV_RunThink (ent)) - return; - // don't stick to ground if onground and moving upward if (ent->v->velocity[2] >= (1.0 / 32.0) && ((int)ent->v->flags & FL_ONGROUND)) ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND; @@ -1391,8 +1379,9 @@ SV_Physics */ void SV_Physics (void) { - int i; + int i, newnum_edicts; edict_t *ent; + qbyte runmove[MAX_EDICTS]; // let the progs know that a new frame has started pr_global_struct->self = EDICT_TO_PROG(sv.edicts); @@ -1400,11 +1389,17 @@ void SV_Physics (void) pr_global_struct->time = sv.time; PR_ExecuteProgram (pr_global_struct->StartFrame, "QC function StartFrame is missing"); + newnum_edicts = 0; + for (i = 0, ent = sv.edicts;i < sv.num_edicts;i++, ent = NEXT_EDICT(ent)) + if ((runmove[i] = !ent->e->free)) + newnum_edicts = i + 1; + sv.num_edicts = max(svs.maxclients + 1, newnum_edicts); + // // treat each object in turn // - ent = sv.edicts; - for (i=0 ; ie->free) continue; @@ -1412,18 +1407,15 @@ void SV_Physics (void) if (pr_global_struct->force_retouch) SV_LinkEdict (ent, true); // force retouch even for stationary - if (i <= svs.maxclients) + if (i >= 1 && i <= svs.maxclients && svs.clients[i-1].spawned) { - if (i > 0) - { - // connected slot - // call standard client pre-think - SV_CheckVelocity (ent); - pr_global_struct->time = sv.time; - pr_global_struct->self = EDICT_TO_PROG(ent); - PR_ExecuteProgram (pr_global_struct->PlayerPreThink, "QC function PlayerPreThink is missing"); - SV_CheckVelocity (ent); - } + // connected slot + // call standard client pre-think + SV_CheckVelocity (ent); + pr_global_struct->time = sv.time; + pr_global_struct->self = EDICT_TO_PROG(ent); + PR_ExecuteProgram (pr_global_struct->PlayerPreThink, "QC function PlayerPreThink is missing"); + SV_CheckVelocity (ent); } else if (sv_freezenonclients.integer) continue; @@ -1473,26 +1465,28 @@ void SV_Physics (void) case MOVETYPE_BOUNCE: case MOVETYPE_BOUNCEMISSILE: case MOVETYPE_FLYMISSILE: - SV_Physics_Toss (ent); + // regular thinking + if (SV_RunThink (ent) && runmove[i]) + SV_Physics_Toss (ent); break; case MOVETYPE_FLY: - if (i > 0 && i <= svs.maxclients) + if (SV_RunThink (ent) && runmove[i]) { - if (SV_RunThink (ent)) + if (i > 0 && i <= svs.maxclients) { SV_CheckWater (ent); SV_WalkMove (ent); } + else + SV_Physics_Toss (ent); } - else - SV_Physics_Toss (ent); break; default: Host_Error ("SV_Physics: bad movetype %i", (int)ent->v->movetype); break; } - if (i <= svs.maxclients && i > 0 && !ent->e->free) + if (i >= 1 && i <= svs.maxclients && svs.clients[i-1].spawned) { SV_CheckVelocity (ent); @@ -1507,8 +1501,8 @@ void SV_Physics (void) } } - if (pr_global_struct->force_retouch) - pr_global_struct->force_retouch--; + if (pr_global_struct->force_retouch > 0) + pr_global_struct->force_retouch = max(0, pr_global_struct->force_retouch - 1); // LordHavoc: endframe support if (EndFrameQC)