Zone effects are dropped for a viewer whose scene rebuilds on the same tick #59

Closed
opened 2026-07-30 21:02:23 +00:00 by sickday · 0 comments
Owner

A viewer whose scene rebuilds on a given tick is sent no zone effects for that
tick
. World.Player.Encode deliberately skips them on the rebuild branch,
on the reasoning that there is nothing to replay in an effect that has already
happened — which is right for the replay case and wrong for effects that
happened on the same tick as the rebuild.

Today it costs nothing, because the only things that emit zone effects are
::proj and the bench harness. Combat makes it per-attack-per-tick, and the
symptom is a projectile or a hit graphic silently missing for exactly the player
who crossed a scene boundary while it was in flight.

The distinction the code needs and does not have: a loc change is durable and
is correctly re-sent wholesale on a rebuild; a zone effect is a moment. An
effect from an earlier tick should not be replayed, and an effect from this
tick should be sent, rebuild or not. World.ZoneEffects already keys by tick,
so the information needed to tell them apart is present.

Not blocking until combat, and it should be closed with combat rather than
after it — it is exactly the kind of gap that reads as a netcode problem.

A viewer whose scene rebuilds on a given tick is sent **no zone effects for that tick**. `World.Player.Encode` deliberately skips them on the rebuild branch, on the reasoning that there is nothing to replay in an effect that has already happened — which is right for the *replay* case and wrong for effects that happened on the same tick as the rebuild. Today it costs nothing, because the only things that emit zone effects are `::proj` and the bench harness. Combat makes it per-attack-per-tick, and the symptom is a projectile or a hit graphic silently missing for exactly the player who crossed a scene boundary while it was in flight. The distinction the code needs and does not have: a *loc change* is durable and is correctly re-sent wholesale on a rebuild; a *zone effect* is a moment. An effect from an earlier tick should not be replayed, and an effect from **this** tick should be sent, rebuild or not. `World.ZoneEffects` already keys by tick, so the information needed to tell them apart is present. Not blocking until combat, and it should be closed with combat rather than after it — it is exactly the kind of gap that reads as a netcode problem.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Revenant/Server#59
No description provided.