diff --git a/src/p_3dmidtex.cpp b/src/p_3dmidtex.cpp index e52926b2e..ccb6f0359 100644 --- a/src/p_3dmidtex.cpp +++ b/src/p_3dmidtex.cpp @@ -256,7 +256,7 @@ bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, f // //============================================================================ -bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, FLineOpening &open) +bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, FLineOpening &open, bool restrict) { fixed_t tt, tb; @@ -273,7 +273,7 @@ bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, FLineOpening & } else { - if (tt > open.bottom) + if (tt > open.bottom && (!restrict || thing->z >= tt)) { open.bottom = tt; open.abovemidtex = true; diff --git a/src/p_3dmidtex.h b/src/p_3dmidtex.h index 79abc137b..d3da3edab 100644 --- a/src/p_3dmidtex.h +++ b/src/p_3dmidtex.h @@ -14,7 +14,7 @@ void P_Start3dMidtexInterpolations(TArray &list, sector_t *sec void P_Attach3dMidtexLinesToSector(sector_t *dest, int lineid, int tag, bool ceiling); bool P_GetMidTexturePosition(const line_t *line, int sideno, fixed_t *ptextop, fixed_t *ptexbot); bool P_Check3dMidSwitch(AActor *actor, line_t *line, int side); -bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, struct FLineOpening &open); +bool P_LineOpening_3dMidtex(AActor *thing, const line_t *linedef, struct FLineOpening &open, bool restrict=false); bool P_MoveLinkedSectors(sector_t *sector, int crush, fixed_t move, bool ceiling); void P_StartLinkedSectorInterpolations(TArray &list, sector_t *sector, bool ceiling); diff --git a/src/p_local.h b/src/p_local.h index c0d7179f2..c64f66acd 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -259,7 +259,7 @@ struct FLineOpening bool abovemidtex; }; -void P_LineOpening (FLineOpening &open, AActor *thing, const line_t *linedef, fixed_t x, fixed_t y, fixed_t refx=FIXED_MIN, fixed_t refy=0, bool only3d=false); +void P_LineOpening (FLineOpening &open, AActor *thing, const line_t *linedef, fixed_t x, fixed_t y, fixed_t refx=FIXED_MIN, fixed_t refy=0, int flags=0); class FBoundingBox; struct polyblock_t; @@ -438,6 +438,7 @@ enum FFCF_ONLYSPAWNPOS = 1, FFCF_SAMESECTOR = 2, FFCF_ONLY3DFLOORS = 4, // includes 3D midtexes + FFCF_3DMIDTEXRESTRICT = 8, // ignore 3D midtex's whose floorz are above thing's z }; void P_FindFloorCeiling (AActor *actor, int flags=0); diff --git a/src/p_map.cpp b/src/p_map.cpp index 92b2cb035..a7602b80f 100644 --- a/src/p_map.cpp +++ b/src/p_map.cpp @@ -87,7 +87,7 @@ msecnode_t* sector_list = NULL; // phares 3/16/98 // //========================================================================== -static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPosition &tmf, bool only3d) +static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPosition &tmf, int flags) { if (box.Right() <= ld->bbox[BOXLEFT] || box.Left() >= ld->bbox[BOXRIGHT] @@ -115,7 +115,7 @@ static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPos (ld->backsector->ceilingplane.a | ld->backsector->ceilingplane.b)) == 0) && ld->backsector->e->XFloor.ffloors.Size()==0 && ld->frontsector->e->XFloor.ffloors.Size()==0) { - P_LineOpening (open, tmf.thing, ld, sx=tmf.x, sy=tmf.y, tmf.x, tmf.y, only3d); + P_LineOpening (open, tmf.thing, ld, sx=tmf.x, sy=tmf.y, tmf.x, tmf.y, flags); } else { // Find the point on the line closest to the actor's center, and use @@ -127,16 +127,16 @@ static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPos (dx*dx + dy*dy) * 16777216.f); if (r <= 0) { - P_LineOpening (open, tmf.thing, ld, sx=ld->v1->x, sy=ld->v1->y, tmf.x, tmf.y, only3d); + P_LineOpening (open, tmf.thing, ld, sx=ld->v1->x, sy=ld->v1->y, tmf.x, tmf.y, flags); } else if (r >= (1<<24)) { - P_LineOpening (open, tmf.thing, ld, sx=ld->v2->x, sy=ld->v2->y, tmf.thing->x, tmf.thing->y, only3d); + P_LineOpening (open, tmf.thing, ld, sx=ld->v2->x, sy=ld->v2->y, tmf.thing->x, tmf.thing->y, flags); } else { P_LineOpening (open, tmf.thing, ld, sx=ld->v1->x + MulScale24 (r, ld->dx), - sy=ld->v1->y + MulScale24 (r, ld->dy), tmf.x, tmf.y, only3d); + sy=ld->v1->y + MulScale24 (r, ld->dy), tmf.x, tmf.y, flags); } } @@ -233,6 +233,10 @@ void P_FindFloorCeiling (AActor *actor, int flags) tmf.y = actor->y; tmf.z = actor->z; + if (flags & FFCF_ONLYSPAWNPOS) + { + flags |= FFCF_3DMIDTEXRESTRICT; + } if (!(flags & FFCF_ONLYSPAWNPOS)) { P_GetFloorCeilingZ(tmf, flags); @@ -266,7 +270,7 @@ void P_FindFloorCeiling (AActor *actor, int flags) while ((ld = it.Next())) { - PIT_FindFloorCeiling(ld, box, tmf, !!(flags & FFCF_ONLY3DFLOORS)); + PIT_FindFloorCeiling(ld, box, tmf, flags); } if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz; @@ -342,7 +346,7 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr thing->z = z; while ((ld = it.Next())) { - PIT_FindFloorCeiling(ld, box, tmf, false); + PIT_FindFloorCeiling(ld, box, tmf, 0); } thing->z = savedz; diff --git a/src/p_maputl.cpp b/src/p_maputl.cpp index 61adff876..32825ee31 100644 --- a/src/p_maputl.cpp +++ b/src/p_maputl.cpp @@ -139,9 +139,9 @@ fixed_t P_InterceptVector (const divline_t *v2, const divline_t *v1) //========================================================================== void P_LineOpening (FLineOpening &open, AActor *actor, const line_t *linedef, - fixed_t x, fixed_t y, fixed_t refx, fixed_t refy, bool only3d) + fixed_t x, fixed_t y, fixed_t refx, fixed_t refy, int flags) { - if (!only3d) + if (!(flags & FFCF_ONLY3DFLOORS)) { sector_t *front, *back; fixed_t fc, ff, bc, bf; @@ -224,7 +224,7 @@ void P_LineOpening (FLineOpening &open, AActor *actor, const line_t *linedef, if (actor != NULL && linedef->frontsector != NULL && linedef->backsector != NULL && linedef->flags & ML_3DMIDTEX) { - open.touchmidtex = P_LineOpening_3dMidtex(actor, linedef, open); + open.touchmidtex = P_LineOpening_3dMidtex(actor, linedef, open, !!(flags & FFCF_3DMIDTEXRESTRICT)); } else {