1
0
Fork 0
forked from fte/fteqw

Try harder to avoid players getting pushed into walls. This was visible with ktx.

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5965 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2021-07-17 15:09:54 +00:00
parent d4c8d1a17b
commit 0fd629f2d2

View file

@ -1219,11 +1219,13 @@ allow for the cut precision of the net coordinates
*/ */
static void PM_NudgePosition (void) static void PM_NudgePosition (void)
{ {
vec3_t base; vec3_t base, nudged;
int x, y, z; int x, y, z;
int i; int i;
static float sign[] = {0, -1/8.0, 1/8.0}; static float sign[] = {0, -1/8.0, 1/8.0};
VectorCopy (pmove.origin, base);
//really we want to just use this here //really we want to just use this here
//base[i] = MSG_FromCoord(MSG_ToCoord(pmove.origin[i], movevars.coordsize), movevars.coordsize); //base[i] = MSG_FromCoord(MSG_ToCoord(pmove.origin[i], movevars.coordsize), movevars.coordsize);
//but it has overflow issues, so do things the painful way instead. //but it has overflow issues, so do things the painful way instead.
@ -1234,7 +1236,7 @@ static void PM_NudgePosition (void)
#endif #endif
movevars.coordtype == COORDTYPE_FLOAT_32) //float precision on the network. no need to truncate. movevars.coordtype == COORDTYPE_FLOAT_32) //float precision on the network. no need to truncate.
{ {
VectorCopy (pmove.origin, base); VectorCopy (base, nudged);
} }
else if (movevars.coordtype == COORDTYPE_FIXED_13_3) //1/8th precision, but don't truncate because that screws everything up. else if (movevars.coordtype == COORDTYPE_FIXED_13_3) //1/8th precision, but don't truncate because that screws everything up.
{ {
@ -1243,21 +1245,21 @@ static void PM_NudgePosition (void)
if (pmove.velocity[i]) if (pmove.velocity[i])
{ //round in the direction of velocity, which means we're less likely to get stuck. { //round in the direction of velocity, which means we're less likely to get stuck.
if (pmove.velocity[i] >= 0) if (pmove.velocity[i] >= 0)
base[i] = (qintptr_t)(pmove.origin[i]*8+0.5f) / 8.0; nudged[i] = (qintptr_t)(base[i]*8+0.5f) / 8.0;
else else
base[i] = (qintptr_t)(pmove.origin[i]*8-0.5f) / 8.0; nudged[i] = (qintptr_t)(base[i]*8-0.5f) / 8.0;
} }
else else
{ {
if (pmove.origin[i] >= 0) if (base[i] >= 0)
base[i] = (qintptr_t)(pmove.origin[i]*8+0.5f) / 8.0; nudged[i] = (qintptr_t)(base[i]*8+0.5f) / 8.0;
else else
base[i] = (qintptr_t)(pmove.origin[i]*8-0.5f) / 8.0; nudged[i] = (qintptr_t)(base[i]*8-0.5f) / 8.0;
} }
} }
} }
else for (i=0 ; i<3 ; i++) else for (i=0 ; i<3 ; i++)
base[i] = ((qintptr_t) (pmove.origin[i] * 8)) * 0.125; //legacy compat, which biases towards the origin. nudged[i] = ((qintptr_t) (pmove.origin[i] * 8)) * 0.125; //legacy compat, which biases towards the origin.
// VectorCopy (base, pmove.origin); // VectorCopy (base, pmove.origin);
@ -1274,9 +1276,9 @@ static void PM_NudgePosition (void)
{ {
for (y=0 ; y<countof(sign) ; y++) for (y=0 ; y<countof(sign) ; y++)
{ {
pmove.origin[0] = base[0] + sign[x]; pmove.origin[0] = nudged[0] + sign[x];
pmove.origin[1] = base[1] + sign[y]; pmove.origin[1] = nudged[1] + sign[y];
pmove.origin[2] = base[2] + sign[z]; pmove.origin[2] = nudged[2] + sign[z];
if (PM_TestPlayerPosition (pmove.origin, false)) if (PM_TestPlayerPosition (pmove.origin, false))
return; return;
} }
@ -1287,12 +1289,12 @@ static void PM_NudgePosition (void)
for (z=0 ; z<3; z++) for (z=0 ; z<3; z++)
{ {
VectorCopy(base, pmove.origin); VectorCopy(base, pmove.origin);
pmove.origin[z] = base[z] + (2/8.0); pmove.origin[z] = nudged[z] + (2/8.0);
if (PM_TestPlayerPosition (pmove.origin, false)) if (PM_TestPlayerPosition (pmove.origin, false))
return; return;
VectorCopy(base, pmove.origin); VectorCopy(base, pmove.origin);
pmove.origin[z] = base[z] - (2/8.0); pmove.origin[z] = nudged[z] - (2/8.0);
if (PM_TestPlayerPosition (pmove.origin, false)) if (PM_TestPlayerPosition (pmove.origin, false))
return; return;
} }
@ -1304,9 +1306,9 @@ static void PM_NudgePosition (void)
{ {
for (y=0 ; y<3 ; y++) for (y=0 ; y<3 ; y++)
{ {
pmove.origin[0] = base[0] + sign[x]; pmove.origin[0] = nudged[0] + sign[x];
pmove.origin[1] = base[1] + sign[y]; pmove.origin[1] = nudged[1] + sign[y];
pmove.origin[2] = base[2] + z; pmove.origin[2] = nudged[2] + z;
if (PM_TestPlayerPosition (pmove.origin, false)) if (PM_TestPlayerPosition (pmove.origin, false))
return; return;
} }