diff --git a/Assets/Scripts/Network/PlayerPaintSync.cs b/Assets/Scripts/Network/PlayerPaintSync.cs index 81c03bf..56dc4f3 100644 --- a/Assets/Scripts/Network/PlayerPaintSync.cs +++ b/Assets/Scripts/Network/PlayerPaintSync.cs @@ -263,6 +263,11 @@ public class PlayerPaintSync : NetworkBehaviour _snapReadyToApply = false; _painter.ApplyPaintSnapshot(_snapBuffer, _snapBaselineId); if (_snapCapturedSeq > _appliedCutoff) _appliedCutoff = _snapCapturedSeq; // receiver-side reveal gate + // The snapshot accounts for every event up to its cutoff, so raise this replica's horizon too. + // The SERVER replica serves late-join snapshots with _seqHorizon as the cutoff; without this a + // baseline that arrived AS a snapshot (owner publish, no live stamps since) would be served with + // a stale cutoff below the owner's published baseline, permanently reveal-gating the joiner. + if (_snapCapturedSeq > _seqHorizon) _seqHorizon = _snapCapturedSeq; if (logSync) LogSync($"applied snapshot baseline {_snapBaselineId}; replaying buffered events"); FlushBuffered(); _snapBuffer = null;