mirror of
https://git.do.srb2.org/STJr/SRB2.git
synced 2025-03-23 03:12:38 +00:00
Merge branch 'polyobj-netgame-crash-fix' into 'master'
PolyObj netgame crash fix See merge request STJr/SRB2Internal!217
This commit is contained in:
commit
9908c001f7
1 changed files with 33 additions and 22 deletions
|
@ -1154,7 +1154,7 @@ static INT32 Polyobj_clipThings(polyobj_t *po, line_t *line)
|
|||
//
|
||||
// Moves a polyobject on the x-y plane.
|
||||
//
|
||||
static boolean Polyobj_moveXY(polyobj_t *po, fixed_t x, fixed_t y)
|
||||
static boolean Polyobj_moveXY(polyobj_t *po, fixed_t x, fixed_t y, boolean checkmobjs)
|
||||
{
|
||||
size_t i;
|
||||
vertex_t vec;
|
||||
|
@ -1175,9 +1175,12 @@ static boolean Polyobj_moveXY(polyobj_t *po, fixed_t x, fixed_t y)
|
|||
for (i = 0; i < po->numLines; ++i)
|
||||
Polyobj_bboxAdd(po->lines[i]->bbox, &vec);
|
||||
|
||||
// check for blocking things (yes, it needs to be done separately)
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
hitflags |= Polyobj_clipThings(po, po->lines[i]);
|
||||
if (checkmobjs)
|
||||
{
|
||||
// check for blocking things (yes, it needs to be done separately)
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
hitflags |= Polyobj_clipThings(po, po->lines[i]);
|
||||
}
|
||||
|
||||
if (hitflags & 2)
|
||||
{
|
||||
|
@ -1195,7 +1198,8 @@ static boolean Polyobj_moveXY(polyobj_t *po, fixed_t x, fixed_t y)
|
|||
po->spawnSpot.x += vec.x;
|
||||
po->spawnSpot.y += vec.y;
|
||||
|
||||
Polyobj_carryThings(po, x, y);
|
||||
if (checkmobjs)
|
||||
Polyobj_carryThings(po, x, y);
|
||||
Polyobj_removeFromBlockmap(po); // unlink it from the blockmap
|
||||
Polyobj_removeFromSubsec(po); // unlink it from its subsector
|
||||
Polyobj_linkToBlockmap(po); // relink to blockmap
|
||||
|
@ -1362,7 +1366,7 @@ static void Polyobj_rotateThings(polyobj_t *po, vertex_t origin, angle_t delta,
|
|||
//
|
||||
// Rotates a polyobject around its start point.
|
||||
//
|
||||
static boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings)
|
||||
static boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings, boolean checkmobjs)
|
||||
{
|
||||
size_t i;
|
||||
angle_t angle;
|
||||
|
@ -1394,11 +1398,14 @@ static boolean Polyobj_rotate(polyobj_t *po, angle_t delta, UINT8 turnthings)
|
|||
for (i = 0; i < po->numLines; ++i)
|
||||
Polyobj_rotateLine(po->lines[i]);
|
||||
|
||||
// check for blocking things
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
hitflags |= Polyobj_clipThings(po, po->lines[i]);
|
||||
if (checkmobjs)
|
||||
{
|
||||
// check for blocking things
|
||||
for (i = 0; i < po->numLines; ++i)
|
||||
hitflags |= Polyobj_clipThings(po, po->lines[i]);
|
||||
|
||||
Polyobj_rotateThings(po, origin, delta, turnthings);
|
||||
Polyobj_rotateThings(po, origin, delta, turnthings);
|
||||
}
|
||||
|
||||
if (hitflags & 2)
|
||||
{
|
||||
|
@ -1614,19 +1621,23 @@ void Polyobj_InitLevel(void)
|
|||
// Called when a savegame is being loaded. Rotates and translates an
|
||||
// existing polyobject to its position when the game was saved.
|
||||
//
|
||||
// Monster Iestyn 05/04/19: Please do not interact with mobjs! You
|
||||
// can cause I_Error crashes that way, and all the important mobjs are
|
||||
// going to be deleted afterwards anyway.
|
||||
//
|
||||
void Polyobj_MoveOnLoad(polyobj_t *po, angle_t angle, fixed_t x, fixed_t y)
|
||||
{
|
||||
fixed_t dx, dy;
|
||||
|
||||
// first, rotate to the saved angle
|
||||
Polyobj_rotate(po, angle, false);
|
||||
Polyobj_rotate(po, angle, false, false);
|
||||
|
||||
// determine component distances to translate
|
||||
dx = x - po->spawnSpot.x;
|
||||
dy = y - po->spawnSpot.y;
|
||||
|
||||
// translate
|
||||
Polyobj_moveXY(po, dx, dy);
|
||||
Polyobj_moveXY(po, dx, dy, false);
|
||||
}
|
||||
|
||||
// Thinker Functions
|
||||
|
@ -1666,7 +1677,7 @@ void T_PolyObjRotate(polyrotate_t *th)
|
|||
|
||||
// rotate by 'speed' angle per frame
|
||||
// if distance == -1, this polyobject rotates perpetually
|
||||
if (Polyobj_rotate(po, th->speed, th->turnobjs) && th->distance != -1)
|
||||
if (Polyobj_rotate(po, th->speed, th->turnobjs, true) && th->distance != -1)
|
||||
{
|
||||
INT32 avel = abs(th->speed);
|
||||
|
||||
|
@ -1750,7 +1761,7 @@ void T_PolyObjMove(polymove_t *th)
|
|||
}
|
||||
|
||||
// move the polyobject one step along its movement angle
|
||||
if (Polyobj_moveXY(po, th->momx, th->momy))
|
||||
if (Polyobj_moveXY(po, th->momx, th->momy, true))
|
||||
{
|
||||
INT32 avel = abs(th->speed);
|
||||
|
||||
|
@ -1864,7 +1875,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
|
|||
fixed_t diffz;
|
||||
amtx = (target->x - th->diffx) - po->centerPt.x;
|
||||
amty = (target->y - th->diffy) - po->centerPt.y;
|
||||
Polyobj_moveXY(po, amtx, amty);
|
||||
Polyobj_moveXY(po, amtx, amty, true);
|
||||
// TODO: use T_MovePlane
|
||||
amtz = (po->lines[0]->backsector->ceilingheight - po->lines[0]->backsector->floorheight)/2;
|
||||
diffz = po->lines[0]->backsector->floorheight - (target->z - amtz);
|
||||
|
@ -1880,7 +1891,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
|
|||
if (po->isBad)
|
||||
continue;
|
||||
|
||||
Polyobj_moveXY(po, amtx, amty);
|
||||
Polyobj_moveXY(po, amtx, amty, true);
|
||||
// TODO: use T_MovePlane
|
||||
po->lines[0]->backsector->floorheight += diffz; // move up/down by same amount as the parent did
|
||||
po->lines[0]->backsector->ceilingheight += diffz;
|
||||
|
@ -2043,7 +2054,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
|
|||
}
|
||||
|
||||
// Move the polyobject
|
||||
Polyobj_moveXY(po, momx, momy);
|
||||
Polyobj_moveXY(po, momx, momy, true);
|
||||
// TODO: use T_MovePlane
|
||||
po->lines[0]->backsector->floorheight += momz;
|
||||
po->lines[0]->backsector->ceilingheight += momz;
|
||||
|
@ -2058,7 +2069,7 @@ void T_PolyObjWaypoint(polywaypoint_t *th)
|
|||
if (po->isBad)
|
||||
continue;
|
||||
|
||||
Polyobj_moveXY(po, momx, momy);
|
||||
Polyobj_moveXY(po, momx, momy, true);
|
||||
// TODO: use T_MovePlane
|
||||
po->lines[0]->backsector->floorheight += momz;
|
||||
po->lines[0]->backsector->ceilingheight += momz;
|
||||
|
@ -2107,7 +2118,7 @@ void T_PolyDoorSlide(polyslidedoor_t *th)
|
|||
}
|
||||
|
||||
// move the polyobject one step along its movement angle
|
||||
if (Polyobj_moveXY(po, th->momx, th->momy))
|
||||
if (Polyobj_moveXY(po, th->momx, th->momy, true))
|
||||
{
|
||||
INT32 avel = abs(th->speed);
|
||||
|
||||
|
@ -2213,7 +2224,7 @@ void T_PolyDoorSwing(polyswingdoor_t *th)
|
|||
|
||||
// rotate by 'speed' angle per frame
|
||||
// if distance == -1, this polyobject rotates perpetually
|
||||
if (Polyobj_rotate(po, th->speed, false) && th->distance != -1)
|
||||
if (Polyobj_rotate(po, th->speed, false, true) && th->distance != -1)
|
||||
{
|
||||
INT32 avel = abs(th->speed);
|
||||
|
||||
|
@ -2305,7 +2316,7 @@ void T_PolyObjDisplace(polydisplace_t *th)
|
|||
dx = FixedMul(th->dx, delta);
|
||||
dy = FixedMul(th->dy, delta);
|
||||
|
||||
if (Polyobj_moveXY(po, dx, dy))
|
||||
if (Polyobj_moveXY(po, dx, dy, true))
|
||||
th->oldHeights = newheights;
|
||||
}
|
||||
|
||||
|
@ -2344,7 +2355,7 @@ void T_PolyObjRotDisplace(polyrotdisplace_t *th)
|
|||
|
||||
rotangle = FixedMul(th->rotscale, delta);
|
||||
|
||||
if (Polyobj_rotate(po, FixedAngle(rotangle), th->turnobjs))
|
||||
if (Polyobj_rotate(po, FixedAngle(rotangle), th->turnobjs, true))
|
||||
th->oldHeights = newheights;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue