What the plugin puts on the wire by itself - sea state and swimmer state - and what your game still has to synchronise.
Oceanology's water is deterministic given a position and a time, so most of it needs no network traffic at all: every machine evaluates the same Gerstner, spectral or FFT spectrum locally and arrives at the same surface. What does need replicating is the state that a designer or a gameplay event changes at runtime. That is exactly two things, and the plugin replicates both: the sea state, and the swimmer.
AOceanologyWater replicates and is net-load-on-client, and it overrides ReplicateSubobjects to push its two wave sources down with it: the primary water waves and the breaking waves. Each source keeps a transient Effective Waves property replicated with push-model dirtying, so only a source whose parameters actually changed costs bandwidth. Set Effective Waves is the write path, and it takes the requesting actor and returns early unless that actor has authority, so a client cannot rewrite the ocean. On both server and client the OnRep invalidates every physics snapshot resolved from that source and asks the wave subsystem to rebuild GPU data, which keeps the rendered surface and the CPU physics answer on the same numbers.
The swimming component replicates four properties and nothing else, all push-model: two gameplay tag containers plus the breath and drown counters. State Tags carries the authority-simulated situation, exactly one of Dry, Wading or Swimming plus any of Submerged, Drowning and Drowned. Control Tags carries the player's intent - Sprinting, Surface Locked, Ragdoll - and is deliberately a separate container so that a state update landing in the same frame cannot briefly revert a toggle the player just made. One before-and-after diff of the containers derives every side effect, and it runs identically on the authority and inside the OnRep, so clients take the same transitions the server did rather than a parallel approximation of them.
A dedicated server has no renderer, so the GPU shallow water solver cannot run there. The simulation component detects that case - no rendering, dedicated-server net mode, or a feature level below SM6 - and falls back to the baked query state for the same region, so server-side gameplay queries still return the surface, depth and flow the clients are looking at. Primary wave evaluation is unaffected: the Gerstner, spectral Gerstner and FFT sources all publish CPU evaluators that run headless. Buoyancy pushes the water subsystem's water time to the physics thread every tick rather than the world clock, so server physics and client rendering sit at the same wave phase instead of drifting apart from world load.
| Before | Oceanology Pro | |
|---|---|---|
| Swimmer state on the wire | A replicated bool per condition plus an enum, each with its own OnRep | One tag container with one OnRep, and a single diff that derives every transition |
| Ordering | Several OnReps could land in the same frame in any order | One property, so the transition order is the diff order |
| Reading swimmer state elsewhere | Link the module and know which bool means what | Query the Oceanology.Swimming tags from GAS, an AnimBP, UI or another plugin |
| Replicated properties on the swimming component | 4 - State Tags, Control Tags, Breath Seconds, Drown Accumulator |
| Replication mode | Push-model on every one of them |
| Server RPCs on the swimming component | 3 - sprint, surface lock, ragdoll |
| Multicast RPCs | 1 - revive |
| Wave sources that replicate Effective Waves | 4 - Gerstner, spectral Gerstner, FFT, breaking |
| Native swimming gameplay tags | 11, registered natively with no ini entry |
| Default breath | 20 seconds |
| Default drown time to death | 10 seconds |
| Server-side shallow water | Baked query state fallback when live simulation is impossible |
This is one entry on the Galidar roadmap. For what already shipped in each release, see the Changelog.