Visibility Management
By default, netfox synchronizes all properties to all peers, broadcasting data. This may not always be the best approach. An example is competitive games. These games often features mechanics like fog of war, invisibility, or line of sight checks. If any of these obscures a player, other players should not receive information about them, to avoid the possibility of wallhacks and other similar cheats.
This is supported by the use of visibility filters. They provide three mechanisms to determine who should receive data and who shouldn't.
Accessing the visibility filter
Both RollbackSynchronizer and StateSynchronizer supports visibility
filtering. They expose a visibility_filter property that can be used to
configure filtering.
Warning
When using visibility filtering with RollbackSynchronizer nodes, make sure to disable input broadcast. Otherwise, peers might receive input data from the player, but no state data from the server, leading to nodes being simulated without up-to-date state data.
Default visibility
If there's no settings configured, the visibility filter falls back to the
default_visibility. By default it is true, meaning it will broadcast data
to all peers.
Per-peer override
Visibility can also be set individually for each peer. This overrides the default visibility for the given peer.
An override may be true, false, or not set. An override to true means
that the peer will be visible regardless of the default visibility. An override
to false means that the peer will not be visible regardless of the default
visibility. An unset override means it will fall back to the
default_visibility.
Filter callbacks
Callbacks can also be registered, to filter peers dynamically. These filters run before the per-peer overrides. If any of the filters reject the peer, it will not receive data.
These callbacks receive the peer ID, and return a boolean:
filter.add_visibility_filter(func(peer: int):
# Forbidden trick to halve your bandwidth :P
return (peer % 2) == 0
)
Update modes
Visibility filters keep an internal list of visible peers. To save on compute,
this list is only updated on certain configurable events. This is exposed as
its update_mode property, which can take on the following values:
- Never
- Only update visibility when manually triggered using
update_visibility() - On peer
- Only update when a peer joins or leaves
- Per tick loop
- Update visibility before each tick loop
- Per tick
- Update visibility before each network tick
- Per rollback tick
- Update visibility after each rollback tick