diff --git a/src/doomdata.h b/src/doomdata.h index 32cc1e9db..5d78d9f17 100644 --- a/src/doomdata.h +++ b/src/doomdata.h @@ -278,6 +278,7 @@ struct mapthing_t char *script_stringargs[NUM_SCRIPT_STRINGARGS]; UINT8 layer; // FOF layer to spawn on, see P_GetMobjSpawnHeight mapUserProperties_t user; // UDMF user-defined custom properties. + fixed_t adjusted_z; // Z adjusted on map load, used for respawning mobj_t *mobj; }; diff --git a/src/p_mobj.c b/src/p_mobj.c index dc3dd037a..504077f99 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -13918,7 +13918,16 @@ mobj_t *P_SpawnMapThing(mapthing_t *mthing) x = mthing->x << FRACBITS; y = mthing->y << FRACBITS; - z = P_GetMapThingSpawnHeight(i, mthing, x, y); + + if (mthing->adjusted_z != INT32_MAX) + { + z = mthing->adjusted_z; + } + else + { + z = P_GetMapThingSpawnHeight(i, mthing, x, y); + } + return P_SpawnMobjFromMapThing(mthing, x, y, z, i); } diff --git a/src/p_setup.c b/src/p_setup.c index da3f780b7..0dc168034 100644 --- a/src/p_setup.c +++ b/src/p_setup.c @@ -1356,6 +1356,8 @@ static void P_LoadThings(UINT8 *data) else mt->z = mt->options >> ZSHIFT; + mt->adjusted_z = INT32_MAX; + mt->mobj = NULL; } } @@ -3239,6 +3241,7 @@ static void P_LoadTextmap(void) memset(mt->script_args, 0, NUM_SCRIPT_ARGS*sizeof(*mt->script_args)); memset(mt->script_stringargs, 0x00, NUM_SCRIPT_STRINGARGS*sizeof(*mt->script_stringargs)); mt->layer = 0; + mt->adjusted_z = INT32_MAX; mt->mobj = NULL; K_UserPropertiesClear(&mt->user); diff --git a/src/p_spec.c b/src/p_spec.c index a67fb4b6c..8a56c4709 100644 --- a/src/p_spec.c +++ b/src/p_spec.c @@ -6257,6 +6257,8 @@ P_RaiseTaggedThingsToFakeFloor ( offset = mo->z - mo->floorz; mo->z = P_GetZAt(control->c_slope, mo->x, mo->y, control->ceilingheight) + offset; } + + mthing->adjusted_z = mo->z; } } }