X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=sv_phys.c;h=37b1ae5ffaafbb877b2fe352b07855f3aed1cfc3;hp=c37fd21ef4ad1cdf440ce00b73ee92ebf10ba8b7;hb=8a12613ca05c0ceb6420751690abf2563b31f333;hpb=87c5170c35b3dbb66beacb1f16897def99e0ac50 diff --git a/sv_phys.c b/sv_phys.c index c37fd21e..37b1ae5f 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -521,7 +521,7 @@ trace_t SV_PushEntity (edict_t *ent, vec3_t push, vec3_t pushangles) ent->v->angles[1] += trace.fraction * pushangles[1]; SV_LinkEdict (ent, true); - if (trace.ent && (!((int)ent->v->flags & FL_ONGROUND) || ent->v->groundentity != EDICT_TO_PROG(trace.ent))) + if (trace.fraction < 1 && trace.ent && (!((int)ent->v->flags & FL_ONGROUND) || ent->v->groundentity != EDICT_TO_PROG(trace.ent))) SV_Impact (ent, trace.ent); return trace; } @@ -854,18 +854,18 @@ qboolean SV_CheckWater (edict_t *ent) ent->v->waterlevel = 0; ent->v->watertype = CONTENTS_EMPTY; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointQ1Contents(point); if (cont <= CONTENTS_WATER) { ent->v->watertype = cont; ent->v->waterlevel = 1; point[2] = ent->v->origin[2] + (ent->v->mins[2] + ent->v->maxs[2])*0.5; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointQ1Contents(point); if (cont <= CONTENTS_WATER) { ent->v->waterlevel = 2; point[2] = ent->v->origin[2] + ent->v->view_ofs[2]; - cont = Mod_PointContents(point, sv.worldmodel); + cont = SV_PointQ1Contents(point); if (cont <= CONTENTS_WATER) ent->v->waterlevel = 3; } @@ -966,6 +966,8 @@ void SV_WalkMove (edict_t *ent) vec3_t upmove, downmove, oldorg, oldvel, nosteporg, nostepvel, stepnormal; trace_t downtrace; + SV_CheckVelocity(ent); + // do a regular slide move unless it looks like you ran into a step oldonground = (int)ent->v->flags & FL_ONGROUND; ent->v->flags = (int)ent->v->flags & ~FL_ONGROUND; @@ -975,6 +977,8 @@ void SV_WalkMove (edict_t *ent) clip = SV_FlyMove (ent, sv.frametime, NULL); + SV_CheckVelocity(ent); + // if move didn't block on a step, return if ( !(clip & 2) ) return; @@ -990,10 +994,9 @@ void SV_WalkMove (edict_t *ent) return; } - if (sv_nostep.integer) - return; + SV_CheckVelocity(ent); - if ( (int)ent->v->flags & FL_WATERJUMP ) + if (sv_nostep.integer || (int)ent->v->flags & FL_WATERJUMP ) return; VectorCopy (ent->v->origin, nosteporg); @@ -1052,6 +1055,8 @@ void SV_WalkMove (edict_t *ent) VectorCopy (nosteporg, ent->v->origin); VectorCopy (nostepvel, ent->v->velocity); } + + SV_CheckVelocity(ent); } //============================================================================ @@ -1100,25 +1105,6 @@ void SV_Physics_Follow (edict_t *ent) SV_LinkEdict (ent, true); } -/* -============= -SV_Physics_Noclip - -A moving object that doesn't obey physics -============= -*/ -void SV_Physics_Noclip (edict_t *ent) -{ - // regular thinking - if (!SV_RunThink (ent)) - return; - - VectorMA (ent->v->angles, sv.frametime, ent->v->avelocity, ent->v->angles); - VectorMA (ent->v->origin, sv.frametime, ent->v->velocity, ent->v->origin); - - SV_LinkEdict (ent, false); -} - /* ============================================================================== @@ -1136,7 +1122,7 @@ SV_CheckWaterTransition void SV_CheckWaterTransition (edict_t *ent) { int cont; - cont = Mod_PointContents(ent->v->origin, sv.worldmodel); + cont = SV_PointQ1Contents(ent->v->origin); if (!ent->v->watertype) { // just spawned here @@ -1145,23 +1131,19 @@ void SV_CheckWaterTransition (edict_t *ent) return; } + // check if the entity crossed into or out of water + if ((ent->v->watertype == CONTENTS_WATER || ent->v->watertype == CONTENTS_SLIME) != (cont == CONTENTS_WATER || cont == CONTENTS_SLIME)) + SV_StartSound (ent, 0, "misc/h2ohit1.wav", 255, 1); + if (cont <= CONTENTS_WATER) { - if (ent->v->watertype == CONTENTS_EMPTY && cont != CONTENTS_LAVA) - // just crossed into water - SV_StartSound (ent, 0, "misc/h2ohit1.wav", 255, 1); - ent->v->watertype = cont; ent->v->waterlevel = 1; } else { - if (ent->v->watertype != CONTENTS_EMPTY && ent->v->watertype != CONTENTS_LAVA) - // just crossed into water - SV_StartSound (ent, 0, "misc/h2ohit1.wav", 255, 1); - ent->v->watertype = CONTENTS_EMPTY; - ent->v->waterlevel = cont; + ent->v->waterlevel = 0; } } @@ -1335,7 +1317,7 @@ void SV_Physics (void) if (i > 0 && i <= svs.maxclients) { - if (!svs.clients[i-1].active) + if (!svs.clients[i-1].spawned) continue; // connected slot // call standard client pre-think @@ -1361,17 +1343,15 @@ void SV_Physics (void) SV_Physics_Follow (ent); break; case MOVETYPE_NOCLIP: - if (i > 0 && i <= svs.maxclients) + if (SV_RunThink(ent)) { - if (SV_RunThink (ent)) - { - SV_CheckWater (ent); - VectorMA (ent->v->origin, sv.frametime, ent->v->velocity, ent->v->origin); - VectorMA (ent->v->angles, sv.frametime, ent->v->avelocity, ent->v->angles); - } + SV_CheckWater(ent); + VectorMA(ent->v->origin, sv.frametime, ent->v->velocity, ent->v->origin); + VectorMA(ent->v->angles, sv.frametime, ent->v->avelocity, ent->v->angles); } - else - SV_Physics_Noclip (ent); + // relink normal entities here, players always get relinked so don't relink twice + if (!(i > 0 && i <= svs.maxclients)) + SV_LinkEdict(ent, false); break; case MOVETYPE_STEP: SV_Physics_Step (ent);