p_saveg.c: initialize "special" fields of mobj, if spawned from mapthing, in default state

This commit is contained in:
James R 2023-12-03 09:56:07 -08:00
parent ca1bbfd53f
commit 39486a56d6
3 changed files with 26 additions and 15 deletions

View file

@ -14538,24 +14538,10 @@ static boolean P_SetupSpawnedMapThing(mapthing_t *mthing, mobj_t *mobj)
return true; return true;
} }
static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, mobjtype_t type) void P_CopyMapThingSpecialFieldsToMobj(const mapthing_t *mthing, mobj_t *mobj)
{ {
mobj_t *mobj = NULL;
size_t arg = SIZE_MAX; size_t arg = SIZE_MAX;
mobj = P_SpawnMobj(x, y, z, type);
mobj->spawnpoint = mthing;
mobj->angle = FixedAngle(mthing->angle << FRACBITS);
mobj->pitch = FixedAngle(mthing->pitch << FRACBITS);
mobj->roll = FixedAngle(mthing->roll << FRACBITS);
P_SetScale(mobj, FixedMul(mobj->scale, mthing->scale));
mobj->destscale = FixedMul(mobj->destscale, mthing->scale);
mobj->spritexscale = mthing->spritexscale;
mobj->spriteyscale = mthing->spriteyscale;
P_SetThingTID(mobj, mthing->tid); P_SetThingTID(mobj, mthing->tid);
mobj->special = mthing->special; mobj->special = mthing->special;
@ -14609,6 +14595,26 @@ static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y,
mobj->script_stringargs[arg] = Z_Realloc(mobj->script_stringargs[arg], len + 1, PU_LEVEL, NULL); mobj->script_stringargs[arg] = Z_Realloc(mobj->script_stringargs[arg], len + 1, PU_LEVEL, NULL);
M_Memcpy(mobj->script_stringargs[arg], mthing->script_stringargs[arg], len + 1); M_Memcpy(mobj->script_stringargs[arg], mthing->script_stringargs[arg], len + 1);
} }
}
static mobj_t *P_SpawnMobjFromMapThing(mapthing_t *mthing, fixed_t x, fixed_t y, fixed_t z, mobjtype_t type)
{
mobj_t *mobj = NULL;
mobj = P_SpawnMobj(x, y, z, type);
mobj->spawnpoint = mthing;
mobj->angle = FixedAngle(mthing->angle << FRACBITS);
mobj->pitch = FixedAngle(mthing->pitch << FRACBITS);
mobj->roll = FixedAngle(mthing->roll << FRACBITS);
P_SetScale(mobj, FixedMul(mobj->scale, mthing->scale));
mobj->destscale = FixedMul(mobj->destscale, mthing->scale);
mobj->spritexscale = mthing->spritexscale;
mobj->spriteyscale = mthing->spriteyscale;
P_CopyMapThingSpecialFieldsToMobj(mthing, mobj);
if (!P_SetupSpawnedMapThing(mthing, mobj)) if (!P_SetupSpawnedMapThing(mthing, mobj))
{ {

View file

@ -557,6 +557,7 @@ fixed_t P_GetMobjSpawnHeight(const mobjtype_t mobjtype, const fixed_t x, const f
fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mthing, const fixed_t x, const fixed_t y); fixed_t P_GetMapThingSpawnHeight(const mobjtype_t mobjtype, const mapthing_t* mthing, const fixed_t x, const fixed_t y);
mobj_t *P_SpawnMapThing(mapthing_t *mthing); mobj_t *P_SpawnMapThing(mapthing_t *mthing);
void P_CopyMapThingSpecialFieldsToMobj(const mapthing_t *mthing, mobj_t *mobj);
void P_SpawnHoop(mapthing_t *mthing); void P_SpawnHoop(mapthing_t *mthing);
void P_SpawnItemPattern(mapthing_t *mthing); void P_SpawnItemPattern(mapthing_t *mthing);
void P_SpawnItemLine(mapthing_t *mt1, mapthing_t *mt2); void P_SpawnItemLine(mapthing_t *mt1, mapthing_t *mt2);

View file

@ -4538,6 +4538,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker)
mobj->script_stringargs[j][len] = '\0'; mobj->script_stringargs[j][len] = '\0';
} }
} }
else if (mobj->spawnpoint)
{
P_CopyMapThingSpecialFieldsToMobj(mobj->spawnpoint, mobj);
}
if (diff2 & MD2_FLOORSPRITESLOPE) if (diff2 & MD2_FLOORSPRITESLOPE)
{ {
pslope_t *slope = (pslope_t *)P_CreateFloorSpriteSlope(mobj); pslope_t *slope = (pslope_t *)P_CreateFloorSpriteSlope(mobj);