- Removed the is_predicting() early-return in weapon_manager._rollback_tick
which blocked all weapon actions on the client (player owned by server)
- Added client-side weapon loadout initialization in player-spawner._spawn
so the player has weapons immediately, before server state sync arrives
- Server reconciles via rollback state sync
Movement was fixed in v0.2.2 (window focus grab). This addresses
the remaining 'can't switch or use weapons' issue.
- Move _clock.set_time(0.) inside the 'if not server' block in
NetworkTimeSynchronizer.start() so the server's SystemClock isn't
reset to zero — fixes -1.78 billion second offset panic on client
- Skip spawning peer 1's avatar on clients (the server replicates
all avatars; spawning peer 1 locally creates a duplicate that
the dedicated server doesn't have)
The dedicated server was spawning a host avatar (peer 1) via
player-spawner._handle_host() and _handle_new_peer(1) on startup,
which registered RollbackSynchronizer subjects with the netfox
rollback system. Since no client input exists for peer 1, the
rollback system tried to record state for freed/recycled objects,
flooding the log with property-pool.gd errors.
Fix:
- Add spawn_host_avatar @export flag to player-spawner.gd
- Set it false in headless_server.gd before starting the ENet server
- PlayerSpawner._handle_host() skips avatar spawn when flag is false
- PlayerSpawner._handle_new_peer(1) skips avatar spawn when flag is false
Server startup is now clean: no property-pool errors, no RPC path errors.