diff --git a/src/deh_tables.c b/src/deh_tables.c index 899bffc2a..20a90bbb7 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -982,6 +982,12 @@ struct int_const_s const INT_CONST[] = { // {"JT_RACENT",JT_RACENT}, // {"JT_CONTSC",JT_CONTSC}, + // Overlay exception settings + {"OV_DONTSCREENOFFSET", OV_DONTSCREENOFFSET}, + {"OV_DONT3DOFFSET", OV_DONT3DOFFSET}, + {"OV_DONTXYSCALE", OV_DONTXYSCALE}, + {"OV_DONTROLL", OV_DONTROLL}, + // Player state (playerstate_t) {"PST_LIVE",PST_LIVE}, // Playing or camping. {"PST_DEAD",PST_DEAD}, // Dead on the ground, view follows killer. diff --git a/src/p_local.h b/src/p_local.h index d16051dc9..6f0dc8aec 100644 --- a/src/p_local.h +++ b/src/p_local.h @@ -303,7 +303,13 @@ boolean P_MobjWasRemoved(mobj_t *th); void P_RemoveSavegameMobj(mobj_t *th); boolean P_SetPlayerMobjState(mobj_t *mobj, statenum_t state); boolean P_SetMobjState(mobj_t *mobj, statenum_t state); + void P_RunOverlays(void); +#define OV_DONTSCREENOFFSET 1 +#define OV_DONT3DOFFSET 1<<1 +#define OV_DONTXYSCALE 1<<2 +#define OV_DONTROLL 1<<3 + void P_HandleMinecartSegments(mobj_t *mobj); void P_MobjThinker(mobj_t *mobj); boolean P_RailThinker(mobj_t *mobj); diff --git a/src/p_mobj.c b/src/p_mobj.c index 5b9aa3587..38a2abf69 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -4181,13 +4181,14 @@ static void P_RefreshItemCapsuleParts(mobj_t *mobj) while (count > 0) { - if (P_MobjWasRemoved(part->tracer)) + if (part->tracer == NULL || P_MobjWasRemoved(part->tracer)) { P_SetTarget(&part->tracer, P_SpawnMobjFromMobj(mobj, 0, 0, 0, MT_OVERLAY)); P_SetTarget(&part->tracer->target, part); P_SetMobjState(part->tracer, S_INVISIBLE); part->tracer->spriteyoffset = 10*FRACUNIT; part->tracer->spritexoffset = 13*numNumbers*FRACUNIT; + part->tracer->threshold = OV_DONTSCREENOFFSET; } part = part->tracer; part->sprite = SPR_ITMN; @@ -5073,9 +5074,32 @@ void P_RunOverlays(void) mo->eflags = (mo->eflags & ~MFE_VERTICALFLIP) | (mo->target->eflags & MFE_VERTICALFLIP); mo->scale = mo->destscale = FixedMul(mo->target->scale, mo->movefactor); mo->angle = (mo->target->player ? mo->target->player->drawangle : mo->target->angle) + mo->movedir; - mo->rollangle = mo->target->rollangle; - mo->pitch = mo->target->pitch; - mo->roll = mo->target->roll; + + if (!(mo->threshold & OV_DONTSCREENOFFSET)) + { + mo->spritexoffset = mo->target->spritexoffset; + mo->spriteyoffset = mo->target->spriteyoffset; + } + + if (!(mo->threshold & OV_DONT3DOFFSET)) + { + mo->sprxoff = mo->target->sprxoff; + mo->spryoff = mo->target->spryoff; + mo->sprzoff = mo->target->sprzoff; + } + + if (!(mo->threshold & OV_DONTXYSCALE)) + { + mo->spritexscale = mo->target->spritexscale; + mo->spriteyscale = mo->target->spriteyscale; + } + + if (!(mo->threshold & OV_DONTROLL)) + { + mo->rollangle = mo->target->rollangle; + mo->pitch = mo->target->pitch; + mo->roll = mo->target->roll; + } if ((mo->flags & MF_DONTENCOREMAP) != (mo->target->flags & MF_DONTENCOREMAP)) mo->flags ^= MF_DONTENCOREMAP;