mirror of
https://github.com/ZDoom/gzdoom.git
synced 2025-01-31 05:40:44 +00:00
- Changed: P_TeleportMove now always sets BlockingLine to NULL and
P_FindFloorCeiling doesn't set it at all. The way it was set in PIT_FindFloorCeiling didn't look correct. - Changed P_FindFloorCeiling so that it doesn't need global variables anymore. I also moved the code to set the calling actor's information into this function because that's all it is used for. This also fixes another bug: - AInventory::BecomePickup called P_FindFloorCeiling to get proper position values for the item but never set the item's information to the return value of this call. SVN r891 (trunk)
This commit is contained in:
parent
4dc1b9579e
commit
17816dcadd
4 changed files with 88 additions and 82 deletions
|
@ -1,4 +1,11 @@
|
|||
April 8, 2008 (Changes by Graf Zahl)
|
||||
- Changed P_FindFloorCeiling so that it doesn't need global variables
|
||||
anymore. I also moved the code to set the calling actor's information
|
||||
into this function because that's all it is used for. This also fixes
|
||||
another bug:
|
||||
- AInventory::BecomePickup called P_FindFloorCeiling to get
|
||||
proper position values for the item but never set the item's information
|
||||
to the return value of this call.
|
||||
- Removed the check for Heretic when playing *evillaugh when using the
|
||||
Chaos Device. This sound is not defined by the other games so it won't
|
||||
play by default.
|
||||
|
|
|
@ -314,6 +314,28 @@ AActor *P_RoughMonsterSearch (AActor *mo, int distance);
|
|||
// P_MAP
|
||||
//
|
||||
|
||||
struct FCheckPosition
|
||||
{
|
||||
// in
|
||||
AActor *thing;
|
||||
fixed_t x;
|
||||
fixed_t y;
|
||||
fixed_t z;
|
||||
|
||||
// out
|
||||
sector_t *sector;
|
||||
fixed_t floorz;
|
||||
fixed_t ceilingz;
|
||||
fixed_t dropoffz;
|
||||
fixed_t floorpic;
|
||||
sector_t *floorsector;
|
||||
fixed_t ceilingpic;
|
||||
sector_t *ceilingsector;
|
||||
bool touchmidtex;
|
||||
};
|
||||
|
||||
|
||||
|
||||
// If "floatok" true, move would be ok
|
||||
// if within "tmfloorz - tmceilingz".
|
||||
extern bool floatok;
|
||||
|
@ -324,15 +346,6 @@ extern AActor *BlockingMobj;
|
|||
extern line_t *BlockingLine; // Used only by P_Move
|
||||
// This is not necessarily a *blocking* line
|
||||
|
||||
// For P_FindFloorCeiling
|
||||
extern fixed_t tmffloorz, tmfceilingz;
|
||||
extern fixed_t tmfdropoffz;
|
||||
extern fixed_t tmffloorpic;
|
||||
extern sector_t *tmffloorsector;
|
||||
extern fixed_t tmfceilingpic;
|
||||
extern sector_t *tmfceilingsector;
|
||||
|
||||
|
||||
//Added by MC: tmsectortype
|
||||
extern fixed_t tmdropoffz; //Needed in b_move.c
|
||||
extern sector_t *tmsector;
|
||||
|
@ -360,7 +373,6 @@ bool P_CheckSight (const AActor* t1, const AActor* t2, int flags=0);
|
|||
void P_ResetSightCounters (bool full);
|
||||
void P_UseLines (player_t* player);
|
||||
bool P_UsePuzzleItem (AActor *actor, int itemType);
|
||||
void PIT_ThrustSpike (AActor *actor);
|
||||
void P_FindFloorCeiling (AActor *actor);
|
||||
|
||||
bool P_ChangeSector (sector_t* sector, int crunch, int amt, int floorOrCeil, bool isreset);
|
||||
|
|
124
src/p_map.cpp
124
src/p_map.cpp
|
@ -95,14 +95,6 @@ int tmceilingpic;
|
|||
sector_t *tmceilingsector;
|
||||
bool tmtouchmidtex;
|
||||
|
||||
fixed_t tmffloorz;
|
||||
fixed_t tmfceilingz;
|
||||
fixed_t tmfdropoffz;
|
||||
fixed_t tmffloorpic;
|
||||
sector_t *tmffloorsector;
|
||||
fixed_t tmfceilingpic;
|
||||
sector_t *tmfceilingsector;
|
||||
bool tmftouchmidtex;
|
||||
|
||||
//Added by MC: So bot will know what kind of sector it's entering.
|
||||
sector_t* tmsector;
|
||||
|
@ -123,9 +115,6 @@ AActor *BlockingMobj;
|
|||
// Temporary holder for thing_sectorlist threads
|
||||
msecnode_t* sector_list = NULL; // phares 3/16/98
|
||||
|
||||
extern sector_t *openbottomsec;
|
||||
extern sector_t *opentopsec;
|
||||
|
||||
bool DoRipping;
|
||||
AActor *LastRipped;
|
||||
|
||||
|
@ -135,7 +124,7 @@ AActor *LastRipped;
|
|||
//
|
||||
//==========================================================================
|
||||
|
||||
static bool PIT_FindFloorCeiling (line_t *ld, AActor *tmfthing, const FBoundingBox &box, fixed_t x, fixed_t y)
|
||||
static bool PIT_FindFloorCeiling (line_t *ld, const FBoundingBox &box, FCheckPosition &tmf)
|
||||
{
|
||||
if (box.Right() <= ld->bbox[BOXLEFT]
|
||||
|| box.Left() >= ld->bbox[BOXRIGHT]
|
||||
|
@ -162,48 +151,46 @@ static bool PIT_FindFloorCeiling (line_t *ld, AActor *tmfthing, const FBoundingB
|
|||
(ld->frontsector->ceilingplane.a | ld->frontsector->ceilingplane.b) |
|
||||
(ld->backsector->ceilingplane.a | ld->backsector->ceilingplane.b)) == 0)
|
||||
{
|
||||
P_LineOpening (open, tmfthing, ld, sx=x, sy=y, x, y);
|
||||
P_LineOpening (open, tmf.thing, ld, sx=tmf.x, sy=tmf.y, tmf.x, tmf.y);
|
||||
}
|
||||
else
|
||||
{ // Find the point on the line closest to the actor's center, and use
|
||||
// that to calculate openings
|
||||
float dx = (float)ld->dx;
|
||||
float dy = (float)ld->dy;
|
||||
fixed_t r = (fixed_t)(((float)(x - ld->v1->x) * dx +
|
||||
(float)(y - ld->v1->y) * dy) /
|
||||
fixed_t r = (fixed_t)(((float)(tmf.x - ld->v1->x) * dx +
|
||||
(float)(tmf.y - ld->v1->y) * dy) /
|
||||
(dx*dx + dy*dy) * 16777216.f);
|
||||
if (r <= 0)
|
||||
{
|
||||
P_LineOpening (open, tmfthing, ld, sx=ld->v1->x, sy=ld->v1->y, x, y);
|
||||
P_LineOpening (open, tmf.thing, ld, sx=ld->v1->x, sy=ld->v1->y, tmf.x, tmf.y);
|
||||
}
|
||||
else if (r >= (1<<24))
|
||||
{
|
||||
P_LineOpening (open, tmfthing, ld, sx=ld->v2->x, sy=ld->v2->y, tmfthing->x, tmfthing->y);
|
||||
P_LineOpening (open, tmf.thing, ld, sx=ld->v2->x, sy=ld->v2->y, tmf.thing->x, tmf.thing->y);
|
||||
}
|
||||
else
|
||||
{
|
||||
P_LineOpening (open, tmfthing, ld, sx=ld->v1->x + MulScale24 (r, ld->dx),
|
||||
sy=ld->v1->y + MulScale24 (r, ld->dy), x, y);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
// adjust floor / ceiling heights
|
||||
if (open.top < tmfceilingz)
|
||||
if (open.top < tmf.ceilingz)
|
||||
{
|
||||
tmfceilingz = open.top;
|
||||
BlockingLine = ld;
|
||||
tmf.ceilingz = open.top;
|
||||
}
|
||||
|
||||
if (open.bottom > tmffloorz)
|
||||
if (open.bottom > tmf.floorz)
|
||||
{
|
||||
tmffloorz = open.bottom;
|
||||
tmffloorsector = open.bottomsec;
|
||||
tmftouchmidtex = open.touchmidtex;
|
||||
BlockingLine = ld;
|
||||
tmf.floorz = open.bottom;
|
||||
tmf.floorsector = open.bottomsec;
|
||||
tmf.touchmidtex = open.touchmidtex;
|
||||
}
|
||||
|
||||
if (open.lowfloor < tmfdropoffz)
|
||||
tmfdropoffz = open.lowfloor;
|
||||
if (open.lowfloor < tmf.dropoffz)
|
||||
tmf.dropoffz = open.lowfloor;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -216,21 +203,22 @@ static bool PIT_FindFloorCeiling (line_t *ld, AActor *tmfthing, const FBoundingB
|
|||
|
||||
void P_FindFloorCeiling (AActor *actor)
|
||||
{
|
||||
fixed_t x, y;
|
||||
sector_t *sec;
|
||||
FCheckPosition tmf;
|
||||
|
||||
x = actor->x;
|
||||
y = actor->y;
|
||||
tmf.x = actor->x;
|
||||
tmf.y = actor->y;
|
||||
|
||||
FBoundingBox box(x, y, actor->radius);
|
||||
FBoundingBox box(tmf.x, tmf.y, actor->radius);
|
||||
|
||||
sec = P_PointInSector (x, y);
|
||||
tmffloorz = tmfdropoffz = sec->floorplane.ZatPoint (x, y);
|
||||
tmfceilingz = sec->ceilingplane.ZatPoint (x, y);
|
||||
tmffloorpic = sec->floorpic;
|
||||
tmffloorsector = sec;
|
||||
tmfceilingpic = sec->ceilingpic;
|
||||
tmfceilingsector = sec;
|
||||
sec = P_PointInSector (tmf.x, tmf.y);
|
||||
tmf.thing = actor;
|
||||
tmf.floorz = tmf.dropoffz = sec->floorplane.ZatPoint (tmf.x, tmf.y);
|
||||
tmf.ceilingz = sec->ceilingplane.ZatPoint (tmf.x, tmf.y);
|
||||
tmf.floorpic = sec->floorpic;
|
||||
tmf.floorsector = sec;
|
||||
tmf.ceilingpic = sec->ceilingpic;
|
||||
tmf.ceilingsector = sec;
|
||||
validcount++;
|
||||
|
||||
FBlockLinesIterator it(box);
|
||||
|
@ -238,10 +226,18 @@ void P_FindFloorCeiling (AActor *actor)
|
|||
|
||||
while ((ld = it.Next()))
|
||||
{
|
||||
PIT_FindFloorCeiling(ld, actor, box, x, y);
|
||||
PIT_FindFloorCeiling(ld, box, tmf);
|
||||
}
|
||||
|
||||
if (tmftouchmidtex) tmfdropoffz = tmffloorz;
|
||||
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
|
||||
|
||||
actor->floorz = tmf.floorz;
|
||||
actor->dropoffz = tmf.dropoffz;
|
||||
actor->ceilingz = tmf.ceilingz;
|
||||
actor->floorpic = tmf.floorpic;
|
||||
actor->floorsector = tmf.floorsector;
|
||||
actor->ceilingpic = tmf.ceilingpic;
|
||||
actor->ceilingsector = tmf.ceilingsector;
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -259,6 +255,7 @@ void P_FindFloorCeiling (AActor *actor)
|
|||
// was being teleported between two non-overlapping height ranges.
|
||||
bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefrag)
|
||||
{
|
||||
FCheckPosition tmf;
|
||||
sector_t* newsec;
|
||||
|
||||
// kill anything occupying the position
|
||||
|
@ -268,12 +265,16 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr
|
|||
|
||||
// The base floor/ceiling is from the subsector that contains the point.
|
||||
// Any contacted lines the step closer together will adjust them.
|
||||
tmffloorz = tmfdropoffz = newsec->floorplane.ZatPoint (x, y);
|
||||
tmfceilingz = newsec->ceilingplane.ZatPoint (x, y);
|
||||
tmffloorpic = newsec->floorpic;
|
||||
tmffloorsector = newsec;
|
||||
tmfceilingpic = newsec->ceilingpic;
|
||||
tmfceilingsector = newsec;
|
||||
tmf.thing = thing;
|
||||
tmf.x = x;
|
||||
tmf.y = y;
|
||||
tmf.z = z;
|
||||
tmf.floorz = tmf.dropoffz = newsec->floorplane.ZatPoint (x, y);
|
||||
tmf.ceilingz = newsec->ceilingplane.ZatPoint (x, y);
|
||||
tmf.floorpic = newsec->floorpic;
|
||||
tmf.floorsector = newsec;
|
||||
tmf.ceilingpic = newsec->ceilingpic;
|
||||
tmf.ceilingsector = newsec;
|
||||
|
||||
spechit.Clear ();
|
||||
|
||||
|
@ -285,18 +286,10 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr
|
|||
|
||||
while ((ld = it.Next()))
|
||||
{
|
||||
PIT_FindFloorCeiling(ld, thing, box, x, y);
|
||||
PIT_FindFloorCeiling(ld, box, tmf);
|
||||
}
|
||||
|
||||
if (tmftouchmidtex) tmfdropoffz = tmffloorz;
|
||||
|
||||
fixed_t savefloorz = tmffloorz;
|
||||
fixed_t saveceilingz = tmfceilingz;
|
||||
sector_t *savesector = tmffloorsector;
|
||||
int savepic = tmffloorpic;
|
||||
sector_t *savecsector = tmffloorsector;
|
||||
int savecpic = tmffloorpic;
|
||||
fixed_t savedropoff = tmfdropoffz;
|
||||
if (tmf.touchmidtex) tmf.dropoffz = tmf.floorz;
|
||||
|
||||
FRadiusThingsIterator it2(x, y, thing->radius);
|
||||
AActor *th;
|
||||
|
@ -335,13 +328,14 @@ bool P_TeleportMove (AActor *thing, fixed_t x, fixed_t y, fixed_t z, bool telefr
|
|||
|
||||
// the move is ok, so link the thing into its new position
|
||||
thing->SetOrigin (x, y, z);
|
||||
thing->floorz = savefloorz;
|
||||
thing->ceilingz = saveceilingz;
|
||||
thing->floorsector = savesector;
|
||||
thing->floorpic = savepic;
|
||||
thing->ceilingsector = savecsector;
|
||||
thing->ceilingpic = savecpic;
|
||||
thing->dropoffz = savedropoff; // killough 11/98
|
||||
thing->floorz = tmf.floorz;
|
||||
thing->ceilingz = tmf.ceilingz;
|
||||
thing->floorsector = tmf.floorsector;
|
||||
thing->floorpic = tmf.floorpic;
|
||||
thing->ceilingsector = tmf.ceilingsector;
|
||||
thing->ceilingpic = tmf.ceilingpic;
|
||||
thing->dropoffz = tmf.dropoffz; // killough 11/98
|
||||
BlockingLine = NULL;
|
||||
|
||||
if (thing->flags2 & MF2_FLOORCLIP)
|
||||
{
|
||||
|
|
|
@ -3252,13 +3252,6 @@ AActor *AActor::StaticSpawn (const PClass *type, fixed_t ix, fixed_t iy, fixed_t
|
|||
else if (!(actor->flags5 & MF5_NOINTERACTION))
|
||||
{
|
||||
P_FindFloorCeiling (actor);
|
||||
actor->floorz = tmffloorz;
|
||||
actor->dropoffz = tmfdropoffz;
|
||||
actor->ceilingz = tmfceilingz;
|
||||
actor->floorpic = tmffloorpic;
|
||||
actor->floorsector = tmffloorsector;
|
||||
actor->ceilingpic = tmfceilingpic;
|
||||
actor->ceilingsector = tmfceilingsector;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue