When teleporting silently, also set g_player[].ps->bobposx/y to the new position

This fixes an integer overflow when a distance is calculated later.

git-svn-id: https://svn.eduke32.com/eduke32@2785 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
helixhorned 2012-06-26 19:49:56 +00:00
parent 3e4357c6a4
commit 7f409f08bb
2 changed files with 4 additions and 2 deletions

View file

@ -3247,8 +3247,8 @@ ACTOR_STATIC void G_MoveTransports(void)
if ((g_player[p].ps->jetpack_on == 0) || (g_player[p].ps->jetpack_on && TEST_SYNC_KEY(g_player[p].sync->bits, SK_JUMP)) || if ((g_player[p].ps->jetpack_on == 0) || (g_player[p].ps->jetpack_on && TEST_SYNC_KEY(g_player[p].sync->bits, SK_JUMP)) ||
(g_player[p].ps->jetpack_on && TEST_SYNC_KEY(g_player[p].sync->bits, SK_CROUCH))) (g_player[p].ps->jetpack_on && TEST_SYNC_KEY(g_player[p].sync->bits, SK_CROUCH)))
{ {
g_player[p].ps->opos.x = g_player[p].ps->pos.x += sprite[OW].x-SX; g_player[p].ps->bobposx = g_player[p].ps->opos.x = g_player[p].ps->pos.x += sprite[OW].x-SX;
g_player[p].ps->opos.y = g_player[p].ps->pos.y += sprite[OW].y-SY; g_player[p].ps->bobposy = g_player[p].ps->opos.y = g_player[p].ps->pos.y += sprite[OW].y-SY;
if (g_player[p].ps->jetpack_on && (TEST_SYNC_KEY(g_player[p].sync->bits, SK_JUMP) || g_player[p].ps->jetpack_on < 11)) if (g_player[p].ps->jetpack_on && (TEST_SYNC_KEY(g_player[p].sync->bits, SK_JUMP) || g_player[p].ps->jetpack_on < 11))
g_player[p].ps->pos.z = sprite[OW].z-6144; g_player[p].ps->pos.z = sprite[OW].z-6144;

View file

@ -4686,6 +4686,8 @@ void P_ProcessInput(int32_t snum)
} }
else p->weapon_sway = p->bobcounter; else p->weapon_sway = p->bobcounter;
// NOTE: This overflows if the difference is too great, e.g. used to do
// that when teleported by silent SE7s.
s->xvel = ksqrt((p->pos.x-p->bobposx)*(p->pos.x-p->bobposx)+(p->pos.y-p->bobposy)*(p->pos.y-p->bobposy)); s->xvel = ksqrt((p->pos.x-p->bobposx)*(p->pos.x-p->bobposx)+(p->pos.y-p->bobposy)*(p->pos.y-p->bobposy));
if (p->on_ground) if (p->on_ground)