From 9ca702dce8187f40089524d0538a4c2cc3187d87 Mon Sep 17 00:00:00 2001 From: NepDisk Date: Sun, 8 Mar 2026 14:02:28 -0400 Subject: [PATCH] Make consistency more accurate --- src/d_clisrv.c | 19 ++++++++++------- src/p_saveg.c | 58 ++++++++++++++++++++++++++++---------------------- src/p_saveg.h | 2 ++ 3 files changed, 45 insertions(+), 34 deletions(-) diff --git a/src/d_clisrv.c b/src/d_clisrv.c index 327927239..245904258 100644 --- a/src/d_clisrv.c +++ b/src/d_clisrv.c @@ -5705,6 +5705,9 @@ static INT16 Consistancy(consistancy_t *c) mo = (mobj_t *)th; + if (!MobjIsNetSynced(mo)) + continue; + if (mo->flags & (MF_SPECIAL | MF_SOLID | MF_PUSHABLE | MF_BOSS | MF_MISSILE | MF_SPRING | MF_MONITOR | MF_FIRE | MF_ENEMY | MF_PAIN | MF_STICKY)) { c->mobjtype -= mo->type; @@ -5734,11 +5737,11 @@ static INT16 Consistancy(consistancy_t *c) c->mobjstate -= mo->target->state - states; c->mobjtics += mo->target->tics; c->mobjsprite -= mo->target->sprite; - c->mobjframe += mo->target->frame; + //c->mobjframe += mo->target->frame; } else ConsistancyXOR(c, 0x3333); - if (mo->tracer && mo->tracer->type != MT_OVERLAY) + if (mo->tracer && MobjIsNetSynced(mo->tracer)) { c->mobjtype += mo->tracer->type; c->position[0] -= mo->tracer->x; @@ -5754,12 +5757,12 @@ static INT16 Consistancy(consistancy_t *c) c->mobjstate -= mo->tracer->state - states; c->mobjtics += mo->tracer->tics; c->mobjsprite -= mo->tracer->sprite; - c->mobjframe += mo->tracer->frame; + //c->mobjframe += mo->tracer->frame; } else ConsistancyXOR(c, 0xAAAA); // SRB2Kart: We use hnext & hprev very extensively - if (mo->hnext && mo->hnext->type != MT_OVERLAY) + if (mo->hnext && MobjIsNetSynced(mo->hnext)) { c->mobjtype += mo->hnext->type; c->position[0] -= mo->hnext->x; @@ -5775,11 +5778,11 @@ static INT16 Consistancy(consistancy_t *c) c->mobjstate -= mo->hnext->state - states; c->mobjtics += mo->hnext->tics; c->mobjsprite -= mo->hnext->sprite; - c->mobjframe += mo->hnext->frame; + //c->mobjframe += mo->hnext->frame; } else ConsistancyXOR(c, 0x5555); - if (mo->hprev && mo->hprev->type != MT_OVERLAY) + if (mo->hprev && MobjIsNetSynced(mo->hprev)) { c->mobjtype += mo->hprev->type; c->position[0] -= mo->hprev->x; @@ -5795,14 +5798,14 @@ static INT16 Consistancy(consistancy_t *c) c->mobjstate -= mo->hprev->state - states; c->mobjtics += mo->hprev->tics; c->mobjsprite -= mo->hprev->sprite; - c->mobjframe += mo->hprev->frame; + //c->mobjframe += mo->hprev->frame; } else ConsistancyXOR(c, 0xCCCC); c->mobjstate -= mo->state - states; c->mobjtics += mo->tics; c->mobjsprite -= mo->sprite; - c->mobjframe += mo->frame; + //c->mobjframe += mo->frame; } } } diff --git a/src/p_saveg.c b/src/p_saveg.c index a6d8f6fa1..f67d299a3 100644 --- a/src/p_saveg.c +++ b/src/p_saveg.c @@ -2081,6 +2081,35 @@ static void DiffMobj(const mobj_t *mobj, UINT32 diff[]) DIFF(mobj->voice, MD3_VOICE); } +boolean MobjIsNetSynced(mobj_t *mobj) +{ + // Ignore stationary hoops - these will be respawned from mapthings. + if (mobj->type == MT_HOOP) + return false; + + // These are NEVER saved. + if (mobj->type == MT_HOOPCOLLIDE) + return false; + + // This hoop has already been collected. + if (mobj->type == MT_HOOPCENTER && mobj->threshold == 4242) + return false; + + // MT_SPARK: used for debug stuff + if (mobj->type == MT_SPARK) + return false; + + // MT_FOLLOWERHORN: So it turns out hornmod is fundamentally incompatible with netsync + if (mobj->type == MT_FOLLOWERHORN) + return false; + + // This is a non-synched visual effect mobj + if (mobj->flags2 & MF2_DONTSYNC) + return false; + + return true; +} + static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinker_t *th, UINT8 type) { mobj_t *mobj = (mobj_t *)th; @@ -2089,24 +2118,7 @@ static thinker_t *SyncMobjThinker(savebuffer_t *save, actionf_p1 thinker, thinke if (save->write) { - // Ignore stationary hoops - these will be respawned from mapthings. - if (mobj->type == MT_HOOP) - return th; - - // These are NEVER saved. - if (mobj->type == MT_HOOPCOLLIDE) - return th; - - // This hoop has already been collected. - if (mobj->type == MT_HOOPCENTER && mobj->threshold == 4242) - return th; - - // MT_SPARK: used for debug stuff - if (mobj->type == MT_SPARK) - return th; - - // This is a non-synched visual effect mobj - if (mobj->flags2 & MF2_DONTSYNC) + if (!MobjIsNetSynced(mobj)) return th; // Scrap all of that. If we're a hoop center, this is ALL we're saving. @@ -3822,9 +3834,7 @@ static void P_RelinkPointers(savebuffer_t *save) mobj = (mobj_t *)currentthinker; - if (UNLIKELY(mobj->type == MT_HOOP || mobj->type == MT_HOOPCOLLIDE || mobj->type == MT_HOOPCENTER - // MT_SPARK: used for debug stuff - || mobj->type == MT_SPARK)) + if (!MobjIsNetSynced(mobj)) continue; RELINK(&mobj->tracer); @@ -4538,11 +4548,7 @@ void P_SaveNetGame(savebuffer_t *save, boolean resending) continue; mobj = (mobj_t *)th; - if (UNLIKELY(mobj->type == MT_HOOP || mobj->type == MT_HOOPCOLLIDE || mobj->type == MT_HOOPCENTER - // MT_SPARK: used for debug stuff - || mobj->type == MT_SPARK - // MT_FOLLOWERHORN: So it turns out hornmod is fundamentally incompatible with netsync - || mobj->type == MT_FOLLOWERHORN || mobj->flags2 & MF2_DONTSYNC)) + if (!MobjIsNetSynced(mobj)) continue; mobj->mobjnum = i++; } diff --git a/src/p_saveg.h b/src/p_saveg.h index a57578bc2..de0527dbe 100644 --- a/src/p_saveg.h +++ b/src/p_saveg.h @@ -61,6 +61,8 @@ boolean P_SaveBufferFromLump(savebuffer_t *save, lumpnum_t lump); size_t P_SaveBufferFromFile(savebuffer_t *save, char const *name); void P_SaveBufferFree(savebuffer_t *save); +boolean MobjIsNetSynced(mobj_t *mobj); + #ifdef __cplusplus } // extern "C" #endif