Fix dedicated server: delay netfox tick loop until first client connects, keep full scene tree for identity sync

This commit is contained in:
2026-07-03 14:47:00 -04:00
parent ba2fc37502
commit fc2c0236cb
7 changed files with 85 additions and 89 deletions
@@ -6,6 +6,17 @@ extends Node
## Set to false for dedicated server operation.
@export var spawn_host_avatar: bool = true
## When true, this is a dedicated server. Peer 1 (the server itself) never
## gets a player avatar. Clients also skip spawning peer 1 locally.
var _dedicated_server: bool = false
## Mark this spawner as running on a dedicated server.
## The host avatar (peer 1) is skipped entirely — no avatar is spawned for the
## server process itself.
func set_dedicated_server() -> void:
_dedicated_server = true
print("[PlayerSpawner] Dedicated server mode enabled")
var t_spawn_points: Array[Marker3D] = []
var ct_spawn_points: Array[Marker3D] = []
var team_manager: TeamManager
@@ -47,8 +58,12 @@ func _handle_connected(id: int):
_spawn(id)
func _handle_host():
if _dedicated_server:
print("[PlayerSpawner] Dedicated server — skipping host avatar entirely")
# Match starts when the first client connects (handled by headless_server)
return
if not spawn_host_avatar:
print("[PlayerSpawner] Dedicated server mode — skipping host avatar")
print("[PlayerSpawner] spawn_host_avatar=false — skipping host avatar")
if round_manager:
round_manager.start_match()
return
@@ -58,8 +73,11 @@ func _handle_host():
round_manager.start_match()
func _handle_new_peer(id: int):
if _dedicated_server and id == 1:
# Peer 1 is the server itself — no avatar needed
return
if id == 1 and not spawn_host_avatar:
print("[PlayerSpawner] Skipping spawn for peer 1 (dedicated server)")
print("[PlayerSpawner] Skipping spawn for peer 1 (spawn_host_avatar=false)")
return
_spawn(id)
if multiplayer.is_server():