- made the z coordinate part of the CheckResults for the MultiBlock iterators and use these for all height checks in the iterator loops. This will later make it easier to support arbitrary portals with height displacements.

This commit is contained in:
Christoph Oelckers 2016-02-21 12:04:52 +01:00
parent 26967bd0ee
commit abcc6049b9
4 changed files with 20 additions and 6 deletions

View file

@ -112,6 +112,12 @@ struct fixedvec3
return *this; return *this;
} }
operator fixedvec2()
{
fixedvec2 ret = { x, y };
return ret;
}
}; };
inline fixedvec2 operator +(const fixedvec2 &v1, const fixedvec2 &v2) inline fixedvec2 operator +(const fixedvec2 &v1, const fixedvec2 &v2)

View file

@ -462,8 +462,8 @@ bool P_TeleportMove(AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefra
{ {
if (!(th->flags3 & thing->flags3 & MF3_DONTOVERLAP)) if (!(th->flags3 & thing->flags3 & MF3_DONTOVERLAP))
{ {
if (z > th->Top() || // overhead if (z > cres.position.z + th->height || // overhead
z + thing->height < th->Z()) // underneath z + thing->height < cres.position.z) // underneath
continue; continue;
} }
} }
@ -557,9 +557,9 @@ void P_PlayerStartStomp(AActor *actor, bool mononly)
if (th->player != NULL && mononly) if (th->player != NULL && mononly)
continue; continue;
if (actor->Z() > th->Top()) if (actor->Z() > cres.position.z + th->height)
continue; // overhead continue; // overhead
if (actor->Top() < th->Z()) if (actor->Top() < cres.position.z)
continue; // underneath continue; // underneath
P_DamageMobj(th, actor, actor, TELEFRAG_DAMAGE, NAME_Telefrag); P_DamageMobj(th, actor, actor, TELEFRAG_DAMAGE, NAME_Telefrag);

View file

@ -534,6 +534,12 @@ void AActor::SetOrigin (fixed_t ix, fixed_t iy, fixed_t iz, bool moving)
P_FindFloorCeiling(this, FFCF_ONLYSPAWNPOS); P_FindFloorCeiling(this, FFCF_ONLYSPAWNPOS);
} }
//===========================================================================
//
// FBlockNode - allows to link actors into multiple blocks in the blockmap
//
//===========================================================================
FBlockNode *FBlockNode::FreeBlocks = NULL; FBlockNode *FBlockNode::FreeBlocks = NULL;
FBlockNode *FBlockNode::Create (AActor *who, int x, int y, int group) FBlockNode *FBlockNode::Create (AActor *who, int x, int y, int group)
@ -789,7 +795,9 @@ bool FMultiBlockLinesIterator::Next(FMultiBlockLinesIterator::CheckResult *item)
if (line != NULL) if (line != NULL)
{ {
item->line = line; item->line = line;
item->position = offset; item->position.x = offset.x;
item->position.y = offset.y;
item->position.z = checkpoint.z;
item->portalflags = portalflags; item->portalflags = portalflags;
return true; return true;
} }

View file

@ -220,7 +220,7 @@ public:
struct CheckResult struct CheckResult
{ {
line_t *line; line_t *line;
fixedvec2 position; fixedvec3 position;
int portalflags; int portalflags;
}; };