diff --git a/src/deh_tables.c b/src/deh_tables.c index 4fd9a3449..7fbf62af3 100644 --- a/src/deh_tables.c +++ b/src/deh_tables.c @@ -6658,6 +6658,7 @@ struct int_const_s const INT_CONST[] = { {"RF_SHADOWEFFECTS",RF_SHADOWEFFECTS}, {"RF_DROPSHADOW",RF_DROPSHADOW}, {"RF_ABSOLUTELIGHTLEVEL",RF_ABSOLUTELIGHTLEVEL}, + {"RF_REDUCEVFX",RF_REDUCEVFX}, {"RF_DONTDRAW",RF_DONTDRAW}, {"RF_DONTDRAWP1",RF_DONTDRAWP1}, {"RF_DONTDRAWP2",RF_DONTDRAWP2}, diff --git a/src/k_hitlag.c b/src/k_hitlag.c index 4bb0d37f3..3f1a3afad 100644 --- a/src/k_hitlag.c +++ b/src/k_hitlag.c @@ -126,7 +126,7 @@ static void K_SpawnSingleHitLagSpark( spark->colorized = true; } - K_ReduceVFX(spark, NULL); + K_ReduceVFXForEveryone(spark); } } diff --git a/src/k_kart.c b/src/k_kart.c index 83f16464b..8059285d7 100644 --- a/src/k_kart.c +++ b/src/k_kart.c @@ -320,7 +320,7 @@ UINT32 K_GetPlayerDontDrawFlag(player_t *player) return flag; } -void K_ReduceVFX(mobj_t *mo, player_t *owner) +void K_ReduceVFXForEveryone(mobj_t *mo) { if (cv_reducevfx.value == 0) { @@ -329,11 +329,6 @@ void K_ReduceVFX(mobj_t *mo, player_t *owner) } mo->renderflags |= RF_DONTDRAW; - - if (owner != NULL) - { - mo->renderflags &= ~K_GetPlayerDontDrawFlag(owner); - } } // Angle reflection used by springs & speed pads @@ -1741,7 +1736,8 @@ spawn_brake_dust P_SetScale(spark, (spark->destscale = FixedMul(scale, spark->scale))); - K_ReduceVFX(spark, master->player); + P_SetTarget(&spark->owner, master); + spark->renderflags |= RF_REDUCEVFX; } static void K_SpawnBrakeVisuals(player_t *player) @@ -1818,7 +1814,8 @@ void K_SpawnDriftBoostClip(player_t *player) P_RandomFlip(P_RandomRange(PR_DECORATION, FRACUNIT/2, FRACUNIT)), FixedMul(scale, player->speed)); - K_ReduceVFX(clip, player); + P_SetTarget(&clip->owner, player->mo); + clip->renderflags |= RF_REDUCEVFX; } void K_SpawnDriftBoostClipSpark(mobj_t *clip) @@ -1875,7 +1872,8 @@ static void K_SpawnGenericSpeedLines(player_t *player, boolean top) } K_MatchGenericExtraFlags(fast, player->mo); - K_ReduceVFX(fast, player); + P_SetTarget(&fast->owner, player->mo); + fast->renderflags |= RF_REDUCEVFX; if (top) { @@ -1954,7 +1952,8 @@ void K_SpawnInvincibilitySpeedLines(mobj_t *mo) fast->momz = 3*P_GetMobjZMovement(mo)/4; K_MatchGenericExtraFlags(fast, mo); - K_ReduceVFX(fast, mo->player); + P_SetTarget(&fast->owner, mo); + fast->renderflags |= RF_REDUCEVFX; fast->color = mo->color; fast->colorized = true; @@ -3068,7 +3067,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj) water->momz = mobj->momz; P_SetScale(water, trailScale); P_SetMobjState(water, curUnderlayFrame); - K_ReduceVFX(water, mobj->player); + P_SetTarget(&water->owner, mobj); + water->renderflags |= RF_REDUCEVFX; // overlay water = P_SpawnMobj(x1, y1, @@ -3080,7 +3080,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj) water->momz = mobj->momz; P_SetScale(water, trailScale); P_SetMobjState(water, curOverlayFrame); - K_ReduceVFX(water, mobj->player); + P_SetTarget(&water->owner, mobj); + water->renderflags |= RF_REDUCEVFX; // Right // Underlay @@ -3093,7 +3094,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj) water->momz = mobj->momz; P_SetScale(water, trailScale); P_SetMobjState(water, curUnderlayFrame); - K_ReduceVFX(water, mobj->player); + P_SetTarget(&water->owner, mobj); + water->renderflags |= RF_REDUCEVFX; // Overlay water = P_SpawnMobj(x2, y2, @@ -3105,7 +3107,8 @@ void K_SpawnWaterRunParticles(mobj_t *mobj) water->momz = mobj->momz; P_SetScale(water, trailScale); P_SetMobjState(water, curOverlayFrame); - K_ReduceVFX(water, mobj->player); + P_SetTarget(&water->owner, mobj); + water->renderflags |= RF_REDUCEVFX; if (!S_SoundPlaying(mobj, sfx_s3kdbs)) { @@ -5222,7 +5225,8 @@ static void K_SpawnDriftElectricity(player_t *player) spark->momz = mo->momz; spark->color = color; K_GenericExtraFlagsNoZAdjust(spark, mo); - K_ReduceVFX(spark, player); + P_SetTarget(&spark->owner, mo); + spark->renderflags |= RF_REDUCEVFX; spark->spritexscale += scalefactor/3; spark->spriteyscale += scalefactor/8; @@ -5293,7 +5297,8 @@ void K_SpawnDriftElectricSparks(player_t *player, int color, boolean shockwave) sparkangle += ANGLE_90; - K_ReduceVFX(spark, player); + P_SetTarget(&spark->owner, mo); + spark->renderflags |= RF_REDUCEVFX; } } } @@ -5444,7 +5449,8 @@ static void K_SpawnDriftSparks(player_t *player) spark->tics += trail; K_MatchGenericExtraFlags(spark, player->mo); - K_ReduceVFX(spark, player); + P_SetTarget(&spark->owner, player->mo); + spark->renderflags |= RF_REDUCEVFX; } if (player->driftcharge >= dsthree) @@ -10641,7 +10647,8 @@ void K_KartEbrakeVisuals(player_t *p) wave = P_SpawnMobj(p->mo->x, p->mo->y, p->mo->floorz, MT_SOFTLANDING); P_InstaScale(wave, p->mo->scale); P_SetTarget(&wave->target, p->mo); - K_ReduceVFX(wave, p); + P_SetTarget(&wave->owner, p->mo); + wave->renderflags |= RF_REDUCEVFX; } // sound @@ -10674,7 +10681,8 @@ void K_KartEbrakeVisuals(player_t *p) p->mo->hprev->angle = p->mo->angle; p->mo->hprev->fuse = TICRATE/2; // When we leave spindash for any reason, make sure this bubble goes away soon after. K_FlipFromObject(p->mo->hprev, p->mo); - K_ReduceVFX(p->mo->hprev, p); + P_SetTarget(&p->mo->hprev->owner, p->mo); + p->mo->hprev->renderflags |= RF_REDUCEVFX; p->mo->hprev->sprzoff = p->mo->sprzoff; p->mo->hprev->colorized = false; @@ -10692,7 +10700,8 @@ void K_KartEbrakeVisuals(player_t *p) spdl->colorized = true; spdl->color = SKINCOLOR_WHITE; K_MatchGenericExtraFlags(spdl, p->mo); - K_ReduceVFX(spdl, p); + P_SetTarget(&spdl->owner, p->mo); + spdl->renderflags |= RF_REDUCEVFX; P_SetScale(spdl, p->mo->scale); // squish the player a little bit. @@ -10811,8 +10820,6 @@ static void K_KartSpindashDust(mobj_t *parent) dust->momx = FixedMul(hmomentum, FINECOSINE(ang >> ANGLETOFINESHIFT)); dust->momy = FixedMul(hmomentum, FINESINE(ang >> ANGLETOFINESHIFT)); dust->momz = vmomentum * flip; - - //K_ReduceVFX(dust, parent->player); } } @@ -10840,7 +10847,8 @@ static void K_KartSpindashWind(mobj_t *parent) wind->momz = 3 * P_GetMobjZMovement(parent) / 4; K_MatchGenericExtraFlags(wind, parent); - K_ReduceVFX(wind, parent->player); + P_SetTarget(&wind->owner, parent); + wind->renderflags |= RF_REDUCEVFX; } // Time after which you get a thrust for releasing spindash @@ -13083,7 +13091,8 @@ void K_SetTireGrease(player_t *player, tic_t tics) P_SetTarget(&grease->target, player->mo); grease->angle = K_MomentumAngle(player->mo); grease->extravalue1 = i; - K_ReduceVFX(grease, player); + P_SetTarget(&grease->owner, player->mo); + grease->renderflags |= RF_REDUCEVFX; } } diff --git a/src/k_kart.h b/src/k_kart.h index 44b7283dc..cb5e52474 100644 --- a/src/k_kart.h +++ b/src/k_kart.h @@ -67,7 +67,7 @@ void K_TimerReset(void); void K_TimerInit(void); UINT32 K_GetPlayerDontDrawFlag(player_t *player); -void K_ReduceVFX(mobj_t *mo, player_t *owner); +void K_ReduceVFXForEveryone(mobj_t *mo); boolean K_IsPlayerLosing(player_t *player); fixed_t K_GetKartGameSpeedScalar(SINT8 value); diff --git a/src/k_terrain.c b/src/k_terrain.c index d2d9a3f8a..1b1e4bb72 100644 --- a/src/k_terrain.c +++ b/src/k_terrain.c @@ -628,7 +628,8 @@ void K_ProcessTerrainEffect(mobj_t *mo) spark->fuse = 9; spark->cusval = K_StairJankFlip(ANGLE_90); P_SetTarget(&spark->target, mo); - K_ReduceVFX(spark, player); + P_SetTarget(&spark->owner, mo); + spark->renderflags |= RF_REDUCEVFX; } player->stairjank = 17; diff --git a/src/lua_mobjlib.c b/src/lua_mobjlib.c index 51751f996..7ce40beb0 100644 --- a/src/lua_mobjlib.c +++ b/src/lua_mobjlib.c @@ -109,6 +109,7 @@ enum mobj_e { mobj_stringargs, mobj_reappear, mobj_punt_ref, + mobj_owner, }; static const char *const mobj_opt[] = { @@ -198,6 +199,7 @@ static const char *const mobj_opt[] = { "stringargs", "reappear", "punt_ref", + "owner", NULL}; #define UNIMPLEMENTED luaL_error(L, LUA_QL("mobj_t") " field " LUA_QS " is not implemented for Lua and cannot be accessed.", mobj_opt[field]) @@ -508,6 +510,14 @@ static int mobj_get(lua_State *L) } LUA_PushUserdata(L, mo->punt_ref, META_MOBJ); break; + case mobj_owner: + if (mo->owner && P_MobjWasRemoved(mo->owner)) + { // don't put invalid mobj back into Lua. + P_SetTarget(&mo->owner, NULL); + return 0; + } + LUA_PushUserdata(L, mo->owner, META_MOBJ); + break; default: // extra custom variables in Lua memory lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); @@ -910,6 +920,15 @@ static int mobj_set(lua_State *L) P_SetTarget(&mo->punt_ref, punt_ref); } break; + case mobj_owner: + if (lua_isnil(L, 3)) + P_SetTarget(&mo->owner, NULL); + else + { + mobj_t *owner = *((mobj_t **)luaL_checkudata(L, 3, META_MOBJ)); + P_SetTarget(&mo->owner, owner); + } + break; default: lua_getfield(L, LUA_REGISTRYINDEX, LREG_EXTVARS); I_Assert(lua_istable(L, -1)); diff --git a/src/objects/broly.c b/src/objects/broly.c index f67847ad1..2419fac10 100644 --- a/src/objects/broly.c +++ b/src/objects/broly.c @@ -51,7 +51,7 @@ Obj_SpawnBrolyKi x->tics = (duration + BUFFER_TICS); - K_ReduceVFX(x, NULL); + K_ReduceVFXForEveryone(x); S_StartSound(x, sfx_cdfm74); diff --git a/src/objects/ufo.c b/src/objects/ufo.c index 7ad363775..3ed9614f4 100644 --- a/src/objects/ufo.c +++ b/src/objects/ufo.c @@ -112,7 +112,8 @@ static void SpawnEmeraldSpeedLines(mobj_t *mo) fast->momz = 3*P_GetMobjZMovement(mo)/4; K_MatchGenericExtraFlags(fast, mo); - K_ReduceVFX(fast, mo->player); + P_SetTarget(&fast->owner, mo); + fast->renderflags |= RF_REDUCEVFX; fast->color = mo->color; fast->colorized = true; diff --git a/src/p_enemy.c b/src/p_enemy.c index 2f7700a30..f76bf88b7 100644 --- a/src/p_enemy.c +++ b/src/p_enemy.c @@ -3828,7 +3828,8 @@ void A_AttractChase(mobj_t *actor) P_SetTarget(&sparkle->target, actor->target); sparkle->angle = (actor->target->angle + (offset>>1)) + (offset * actor->target->player->sparkleanim); actor->target->player->sparkleanim = (actor->target->player->sparkleanim+1) % 20; - K_ReduceVFX(sparkle, actor->target->player); + P_SetTarget(&sparkle->owner, actor->target); + sparkle->renderflags |= RF_REDUCEVFX; P_KillMobj(actor, actor->target, actor->target, DMG_NORMAL); return; diff --git a/src/p_map.c b/src/p_map.c index f15c29226..5e68afc21 100644 --- a/src/p_map.c +++ b/src/p_map.c @@ -3148,7 +3148,8 @@ boolean P_TryMove(mobj_t *thing, fixed_t x, fixed_t y, boolean allowdropoff, Try spark->fuse = 9; spark->cusval = K_StairJankFlip(ANGLE_90); P_SetTarget(&spark->target, thing); - K_ReduceVFX(spark, thing->player); + P_SetTarget(&spark->owner, thing); + spark->renderflags |= RF_REDUCEVFX; } thing->player->stairjank = 17; diff --git a/src/p_mobj.c b/src/p_mobj.c index 4e43c7c93..ebb9353b5 100644 --- a/src/p_mobj.c +++ b/src/p_mobj.c @@ -8036,7 +8036,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) } } - K_ReduceVFX(mobj, mobj->target->player); + P_SetTarget(&mobj->owner, mobj->target); + mobj->renderflags |= RF_REDUCEVFX; break; } case MT_BOOSTFLAME: @@ -8125,7 +8126,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) S_StartSound(mobj, sfx_cdfm17); K_MatchGenericExtraFlags(mobj, mobj->target); - K_ReduceVFX(mobj, mobj->target->player); + P_SetTarget(&mobj->owner, mobj->target); + mobj->renderflags |= RF_REDUCEVFX; if (leveltime & 1) mobj->renderflags |= RF_DONTDRAW; } @@ -8330,7 +8332,8 @@ static boolean P_MobjRegularThink(mobj_t *mobj) mobj->renderflags = (mobj->renderflags & ~RF_TRANSMASK)|(trans << RF_TRANSSHIFT); } - K_ReduceVFX(mobj, mobj->target->player); + P_SetTarget(&mobj->owner, mobj->target); + mobj->renderflags |= RF_REDUCEVFX; break; case MT_MAGICIANBOX: { @@ -10447,6 +10450,8 @@ void P_MobjThinker(mobj_t *mobj) P_SetTarget(&mobj->itnext, NULL); if (mobj->punt_ref && P_MobjWasRemoved(mobj->punt_ref)) P_SetTarget(&mobj->punt_ref, NULL); + if (mobj->owner && P_MobjWasRemoved(mobj->owner)) + P_SetTarget(&mobj->owner, NULL); if (mobj->flags & MF_NOTHINK) return; @@ -12002,6 +12007,7 @@ void P_RemoveMobj(mobj_t *mobj) P_SetTarget(&mobj->itnext, NULL); P_SetTarget(&mobj->punt_ref, NULL); + P_SetTarget(&mobj->owner, NULL); P_RemoveThingTID(mobj); P_DeleteMobjStringArgs(mobj); diff --git a/src/p_mobj.h b/src/p_mobj.h index 1fbb676bf..2570acda9 100644 --- a/src/p_mobj.h +++ b/src/p_mobj.h @@ -445,6 +445,8 @@ struct mobj_t // If punt_ref, set punt_ref->reappear, treat as if this->reappear mobj_t *punt_ref; + mobj_t *owner; + // WARNING: New fields must be added separately to savegame and Lua. }; diff --git a/src/p_saveg.c b/src/p_saveg.c index 6f1450773..f837a73c4 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2708,6 +2708,7 @@ typedef enum MD3_LIGHTLEVEL = 1, MD3_REAPPEAR = 1<<1, MD3_PUNT_REF = 1<<2, + MD3_OWNER = 1<<3, } mobj_diff3_t; typedef enum @@ -3032,6 +3033,8 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 diff3 |= MD3_REAPPEAR; if (mobj->punt_ref) diff3 |= MD3_PUNT_REF; + if (mobj->owner) + diff3 |= MD3_OWNER; if (diff3 != 0) diff2 |= MD2_MORE; @@ -3320,6 +3323,10 @@ static void SaveMobjThinker(savebuffer_t *save, const thinker_t *th, const UINT8 { WRITEUINT32(save->p, mobj->punt_ref->mobjnum); } + if (diff3 & MD3_OWNER) + { + WRITEUINT32(save->p, mobj->owner->mobjnum); + } WRITEUINT32(save->p, mobj->mobjnum); } @@ -4574,6 +4581,10 @@ static thinker_t* LoadMobjThinker(savebuffer_t *save, actionf_p1 thinker) { mobj->punt_ref = (mobj_t *)(size_t)READUINT32(save->p); } + if (diff3 & MD3_OWNER) + { + mobj->owner = (mobj_t *)(size_t)READUINT32(save->p); + } // set sprev, snext, bprev, bnext, subsector P_SetThingPosition(mobj); @@ -5621,6 +5632,13 @@ static void P_RelinkPointers(void) if (!P_SetTarget(&mobj->punt_ref, P_FindNewPosition(temp))) CONS_Debug(DBG_GAMELOGIC, "punt_ref not found on %d\n", mobj->type); } + if (mobj->owner) + { + temp = (UINT32)(size_t)mobj->owner; + mobj->owner = NULL; + if (!P_SetTarget(&mobj->owner, P_FindNewPosition(temp))) + CONS_Debug(DBG_GAMELOGIC, "owner not found on %d\n", mobj->type); + } } for (i = 0; i < MAXPLAYERS; i++) diff --git a/src/p_user.c b/src/p_user.c index 24603b633..b2d3b1889 100644 --- a/src/p_user.c +++ b/src/p_user.c @@ -1168,7 +1168,8 @@ mobj_t *P_SpawnGhostMobj(mobj_t *mobj) ghost->old_roll = mobj->old_roll2; ghost->old_scale = mobj->old_scale2; - K_ReduceVFX(ghost, mobj->player); + P_SetTarget(&ghost->owner, mobj); + ghost->renderflags |= RF_REDUCEVFX; ghost->reappear = mobj->reappear; P_SetTarget(&ghost->punt_ref, mobj->punt_ref); diff --git a/src/r_defs.h b/src/r_defs.h index 8d84fbd6e..33933bed4 100644 --- a/src/r_defs.h +++ b/src/r_defs.h @@ -973,6 +973,7 @@ typedef enum RF_DROPSHADOW = (RF_SHADOWDRAW | RF_SHADOWEFFECTS | RF_FULLDARK), RF_ABSOLUTELIGHTLEVEL = 0x00010000, // mobj_t.lightlevel is absolute instead of relative + RF_REDUCEVFX = 0x00020000, // only mobj_t.owner can see this object RF_DONTDRAW = 0x00F00000, // --Don't generate a vissprite RF_DONTDRAWP1 = 0x00100000, // No P1 diff --git a/src/r_things.cpp b/src/r_things.cpp index 37dcc3bf4..a1187b803 100644 --- a/src/r_things.cpp +++ b/src/r_things.cpp @@ -3775,6 +3775,9 @@ boolean R_ThingVisible (mobj_t *thing) || (viewssnum == 3 && (thing->renderflags & RF_DONTDRAWP4))) return false; + if ((thing->renderflags & RF_REDUCEVFX) && cv_reducevfx.value && thing->owner != players[displayplayers[viewssnum]].mo) + return false; + return true; }