- if (!ent->v->velocity[0] && !ent->v->velocity[1] && !ent->v->velocity[2])
- break;
-
- 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 (trace.allsolid)
- {
- // 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 1
+ vec3_t start;
+ trace_t testtrace;
+ VectorCopy(ent->v->origin, start);
+ start[2] += 3;//0.03125;
+ VectorMA(ent->v->origin, time_left, ent->v->velocity, end);
+ end[2] += 3;//0.03125;
+ testtrace = SV_Move(start, ent->v->mins, ent->v->maxs, end, MOVE_NORMAL, ent);
+ if (trace.fraction < testtrace.fraction && !testtrace.startsolid && (testtrace.fraction == 1 || DotProduct(trace.plane.normal, ent->v->velocity) < DotProduct(testtrace.plane.normal, ent->v->velocity)))