X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=sv_phys.c;h=a69f278321db9405436d3d41f3af1a2974812875;hb=c9a3ad45ef5f5c6958d9410c7caae4e3b2ad27fc;hp=f592b08e40f53010a205140b5f0df78b95aaded5;hpb=1375477193afe06d03e0605ffc796db6cb509800;p=xonotic%2Fdarkplaces.git diff --git a/sv_phys.c b/sv_phys.c index f592b08e..a69f2783 100644 --- a/sv_phys.c +++ b/sv_phys.c @@ -247,16 +247,35 @@ int SV_FlyMove (edict_t *ent, float time, float *stepnormal) VectorMA(ent->v->origin, time, ent->v->velocity, end); trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent); //Con_Printf("trace %f %f %f : %f : %f %f %f\n", trace.endpos[0], trace.endpos[1], trace.endpos[2], trace.fraction, trace.plane.normal[0], trace.plane.normal[1], trace.plane.normal[2]); +#if COLLISIONPARANOID >= 1 + { + int endstuck; + vec3_t temp; + VectorCopy(trace.endpos, temp); + endstuck = SV_Move(temp, ent->v->mins, ent->v->maxs, temp, MOVE_WORLDONLY, ent).startsolid; +#if COLLISIONPARANOID < 2 + if (trace.startsolid || endstuck) +#endif + { + Con_Printf("%s{e%i:%i:%f %f %f:%f %f %f:%f:%f %f %f%s%s}\n", (trace.startsolid || endstuck) ? "\002" : "", ent - sv.edicts, bumpcount, ent->v->origin[0], ent->v->origin[1], ent->v->origin[2], end[0] - ent->v->origin[0], end[1] - ent->v->origin[1], end[2] - ent->v->origin[2], trace.fraction, trace.endpos[0] - ent->v->origin[0], trace.endpos[1] - ent->v->origin[1], trace.endpos[2] - ent->v->origin[2], trace.startsolid ? " startstuck" : "", endstuck ? " endstuck" : ""); + //Con_Printf("trace %f %f %f : %f : %f %f %f\n", trace.endpos[0], trace.endpos[1], trace.endpos[2], trace.fraction, trace.plane.normal[0], trace.plane.normal[1], trace.plane.normal[2]); + if (endstuck) + Cbuf_AddText("disconnect\n"); + } + } +#endif - if (trace.allsolid) + /* + if (trace.startsolid) { // LordHavoc: note: this code is what makes entities stick in place if embedded in another object (which can be the world) // entity is trapped in another solid VectorClear(ent->v->velocity); return 3; } + */ - if (trace.fraction > 0) + if (trace.fraction >= 0.001) { // actually covered some distance VectorCopy (trace.endpos, ent->v->origin); @@ -341,13 +360,15 @@ int SV_FlyMove (edict_t *ent, float time, float *stepnormal) trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent); - if (trace.allsolid) + /* + if (trace.startsolid) { // LordHavoc: note: this code is what makes entities stick in place if embedded in another object (which can be the world) // entity is trapped in another solid VectorClear(ent->v->velocity); return 3; } + */ if (trace.fraction > 0) { @@ -515,6 +536,23 @@ trace_t SV_PushEntity (edict_t *ent, vec3_t push, vec3_t pushangles) trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NOMONSTERS, ent); else trace = SV_Move (ent->v->origin, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent); +#if COLLISIONPARANOID >= 1 + { + int endstuck; + vec3_t temp; + VectorCopy(trace.endpos, temp); + endstuck = SV_Move(temp, ent->v->mins, ent->v->maxs, temp, MOVE_WORLDONLY, ent).startsolid; +#if COLLISIONPARANOID < 2 + if (trace.startsolid || endstuck) +#endif + { + Con_Printf("%s{e%i:%f %f %f:%f %f %f:%f:%f %f %f%s%s}\n", (trace.startsolid || endstuck) ? "\002" : "", ent - sv.edicts, ent->v->origin[0], ent->v->origin[1], ent->v->origin[2], end[0] - ent->v->origin[0], end[1] - ent->v->origin[1], end[2] - ent->v->origin[2], trace.fraction, trace.endpos[0] - ent->v->origin[0], trace.endpos[1] - ent->v->origin[1], trace.endpos[2] - ent->v->origin[2], trace.startsolid ? " startstuck" : "", endstuck ? " endstuck" : ""); + //Con_Printf("trace %f %f %f : %f : %f %f %f\n", trace.endpos[0], trace.endpos[1], trace.endpos[2], trace.fraction, trace.plane.normal[0], trace.plane.normal[1], trace.plane.normal[2]); + if (endstuck) + Cbuf_AddText("disconnect\n"); + } + } +#endif VectorCopy (trace.endpos, ent->v->origin); // FIXME: turn players specially @@ -542,7 +580,6 @@ void SV_PushMove (edict_t *pusher, float movetime) vec3_t mins, maxs, move, move1, moveangle, pushorig, pushang, a, forward, left, up, org, org2; int num_moved; model_t *pushermodel; - trace_t trace; switch ((int) pusher->v->solid) { @@ -665,12 +702,11 @@ void SV_PushMove (edict_t *pusher, float movetime) || check->v->absmax[2] <= mins[2]) continue; - trace = SV_ClipMoveToEntity (pusher, check->v->origin, check->v->mins, check->v->maxs, check->v->origin); - if (!trace.startsolid) + if (!SV_ClipMoveToEntity(pusher, check->v->origin, check->v->mins, check->v->maxs, check->v->origin).startsolid) continue; } - if (forward[0] < 0.999f) // quick way to check if any rotation is used + if (forward[0] != 1) // quick way to check if any rotation is used { VectorSubtract (check->v->origin, pusher->v->origin, org); org2[0] = DotProduct (org, forward); @@ -692,18 +728,18 @@ void SV_PushMove (edict_t *pusher, float movetime) // try moving the contacted entity pusher->v->solid = SOLID_NOT; - trace = SV_PushEntity (check, move, moveangle); + SV_PushEntity (check, move, moveangle); pusher->v->solid = savesolid; // was SOLID_BSP // if it is still inside the pusher, block - if (SV_TestEntityPosition (check)) + if (SV_ClipMoveToEntity(pusher, check->v->origin, check->v->mins, check->v->maxs, check->v->origin).startsolid) { // try moving the contacted entity a tiny bit further to account for precision errors pusher->v->solid = SOLID_NOT; VectorScale(move, 0.1, move); - trace = SV_PushEntity (check, move, vec3_origin); + SV_PushEntity (check, move, vec3_origin); pusher->v->solid = savesolid; - if (SV_TestEntityPosition (check)) + if (SV_ClipMoveToEntity(pusher, check->v->origin, check->v->mins, check->v->maxs, check->v->origin).startsolid) { // still inside pusher, so it's really blocked @@ -942,7 +978,10 @@ int SV_TryUnstick (edict_t *ent, vec3_t oldvel) if (fabs(oldorg[1] - ent->v->origin[1]) > 4 || fabs(oldorg[0] - ent->v->origin[0]) > 4) + { + Con_DPrintf("TryUnstick - success.\n"); return clip; + } // go back to the original pos and try again VectorCopy (oldorg, ent->v->origin); @@ -950,6 +989,7 @@ int SV_TryUnstick (edict_t *ent, vec3_t oldvel) // still not moving VectorClear (ent->v->velocity); + Con_Printf("TryUnstick - failure.\n"); return 7; } @@ -1131,21 +1171,17 @@ 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 = 0; }