+bool _Movetype_NudgeOutOfSolid_PivotIsKnownGood(entity this, vector pivot) // SV_NudgeOutOfSolid_PivotIsKnownGood
+{
+ vector stuckorigin = this.origin;
+ vector goodmins = pivot, goodmaxs = pivot;
+ for(int bump = 0; bump < 6; bump++)
+ {
+ int coord = 2 - (bump >> 1);
+ int dir = (bump & 1);
+
+ for(int subbump = 0; ; ++subbump)
+ {
+ vector testorigin = stuckorigin;
+ if(dir)
+ {
+ // pushing maxs
+ switch(coord)
+ {
+ case 0: testorigin.x += this.maxs_x - goodmaxs.x; break;
+ case 1: testorigin.y += this.maxs_y - goodmaxs.y; break;
+ case 2: testorigin.z += this.maxs_z - goodmaxs.z; break;
+ }
+ }
+ else
+ {
+ // pushing mins
+ switch(coord)
+ {
+ case 0: testorigin.x += this.mins_x - goodmins.x; break;
+ case 1: testorigin.y += this.mins_y - goodmins.y; break;
+ case 2: testorigin.z += this.mins_z - goodmins.z; break;
+ }
+ }
+
+ tracebox(stuckorigin, goodmins, goodmaxs, testorigin, MOVE_NOMONSTERS, this);
+ if(trace_startsolid && trace_ent.solid == SOLID_BSP) // NOTE: this checks for bmodelstartsolid in the engine
+ {
+ // BAD BAD, can't fix that
+ return false;
+ }
+
+ if(trace_fraction >= 1)
+ break; // it WORKS!
+
+ if(subbump >= 10)
+ {
+ // BAD BAD, can't fix that
+ return false;
+ }
+
+ // we hit something... let's move out of it
+ vector move = trace_endpos - testorigin;
+ float nudge = (trace_plane_normal * move) + 0.03125; // FIXME cvar this constant
+ stuckorigin = stuckorigin + nudge * trace_plane_normal;
+ }
+
+ if(dir)
+ {
+ // pushing maxs
+ switch(coord)
+ {
+ case 0: goodmaxs.x = this.maxs_x; break;
+ case 1: goodmaxs.y = this.maxs_y; break;
+ case 2: goodmaxs.z = this.maxs_z; break;
+ }
+ }
+ else
+ {
+ // pushing mins
+ switch(coord)
+ {
+ case 0: goodmins.x = this.mins_x; break;
+ case 1: goodmins.y = this.mins_y; break;
+ case 2: goodmins.z = this.mins_z; break;
+ }
+ }
+ }
+
+ // WE WIN
+ this.origin = stuckorigin;
+
+ return true;
+}
+