From 0e645ad173e21d2a7dbe109af66d98dfd2ca20ff Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 16 Jan 2016 16:30:53 +0100 Subject: [PATCH] - added a 'non-modify' mode to P_TeleportMove and let A_Respawn use that, rather than letting P_TeleportMove muck around with the actor properties and then have A_Respawn only partially and haphazardly restoring them afterward. --- src/p_local.h | 2 +- src/p_map.cpp | 59 ++++++++++++++++--------------- src/thingdef/thingdef_codeptr.cpp | 13 +------ 3 files changed, 33 insertions(+), 41 deletions(-) diff --git a/src/p_local.h b/src/p_local.h index 859722912..7e00276bd 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -464,7 +464,7 @@ bool P_TryMove (AActor* thing, fixed_t x, fixed_t y, int dropoff, const secplane bool P_TryMove (AActor* thing, fixed_t x, fixed_t y, int dropoff, const secplane_t * onfloor = NULL); bool P_CheckMove(AActor *thing, fixed_t x, fixed_t y); void P_ApplyTorque(AActor *mo); -bool P_TeleportMove (AActor* thing, fixed_t x, fixed_t y, fixed_t z, bool telefrag); // [RH] Added z and telefrag parameters +bool P_TeleportMove (AActor* thing, fixed_t x, fixed_t y, fixed_t z, bool telefrag, bool modifyactor = true); // [RH] Added z and telefrag parameters void P_PlayerStartStomp (AActor *actor); // [RH] Stomp on things for a newly spawned player void P_SlideMove (AActor* mo, fixed_t tryx, fixed_t tryy, int numsteps); bool P_BounceWall (AActor *mo); diff --git a/src/p_map.cpp b/src/p_map.cpp index 4132e90b5..ce20c8430 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -376,7 +376,7 @@ void P_FindFloorCeiling(AActor *actor, int flags) // //========================================================================== -bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefrag) +bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefrag, bool modifyactor) { FCheckPosition tmf; sector_t *oldsec = thing->Sector; @@ -455,37 +455,40 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra return false; } - // the move is ok, so link the thing into its new position - thing->SetOrigin(x, y, z); - thing->floorz = tmf.floorz; - thing->ceilingz = tmf.ceilingz; - thing->floorsector = tmf.floorsector; - thing->floorpic = tmf.floorpic; - thing->floorterrain = tmf.floorterrain; - thing->ceilingsector = tmf.ceilingsector; - thing->ceilingpic = tmf.ceilingpic; - thing->dropoffz = tmf.dropoffz; // killough 11/98 - thing->BlockingLine = NULL; - - if (thing->flags2 & MF2_FLOORCLIP) + if (modifyactor) { - thing->AdjustFloorClip(); - } + // the move is ok, so link the thing into its new position + thing->SetOrigin(x, y, z); + thing->floorz = tmf.floorz; + thing->ceilingz = tmf.ceilingz; + thing->floorsector = tmf.floorsector; + thing->floorpic = tmf.floorpic; + thing->floorterrain = tmf.floorterrain; + thing->ceilingsector = tmf.ceilingsector; + thing->ceilingpic = tmf.ceilingpic; + thing->dropoffz = tmf.dropoffz; // killough 11/98 + thing->BlockingLine = NULL; - if (thing == players[consoleplayer].camera) - { - R_ResetViewInterpolation(); - } + if (thing->flags2 & MF2_FLOORCLIP) + { + thing->AdjustFloorClip(); + } - thing->PrevX = x; - thing->PrevY = y; - thing->PrevZ = z; + if (thing == players[consoleplayer].camera) + { + R_ResetViewInterpolation(); + } - // If this teleport was caused by a move, P_TryMove() will handle the - // sector transition messages better than we can here. - if (!(thing->flags6 & MF6_INTRYMOVE)) - { - thing->CheckSectorTransition(oldsec); + thing->PrevX = x; + thing->PrevY = y; + thing->PrevZ = z; + + // If this teleport was caused by a move, P_TryMove() will handle the + // sector transition messages better than we can here. + if (!(thing->flags6 & MF6_INTRYMOVE)) + { + thing->CheckSectorTransition(oldsec); + } } return true; diff --git a/src/thingdef/thingdef_codeptr.cpp b/src/thingdef/thingdef_codeptr.cpp index 8343b79b8..5fcc69f4b 100644 --- a/src/thingdef/thingdef_codeptr.cpp +++ b/src/thingdef/thingdef_codeptr.cpp @@ -3023,18 +3023,7 @@ DEFINE_ACTION_FUNCTION_PARAMS(AActor, A_Respawn) if (flags & RSF_TELEFRAG) { // [KS] DIE DIE DIE DIE erm *ahem* =) - oktorespawn = P_TeleportMove(self, self->x, self->y, self->z, true); - if (oktorespawn) - { // Need to do this over again, since P_TeleportMove() will redo - // it with the proper point-on-side calculation. - self->UnlinkFromWorld(); - self->LinkToWorld(true); - sector_t *sec = self->Sector; - self->dropoffz = - self->floorz = sec->floorplane.ZatPoint(self->x, self->y); - self->ceilingz = sec->ceilingplane.ZatPoint(self->x, self->y); - P_FindFloorCeiling(self, FFCF_ONLYSPAWNPOS); - } + oktorespawn = P_TeleportMove(self, self->x, self->y, self->z, true, false); } else {