Fix property-pool rollback errors in headless server
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.
This commit is contained in:
@@ -2,6 +2,10 @@ extends Node
|
|||||||
|
|
||||||
@export var player_scene: PackedScene
|
@export var player_scene: PackedScene
|
||||||
|
|
||||||
|
## Whether to spawn an avatar for the host (peer 1) when on_server_start fires.
|
||||||
|
## Set to false for dedicated server operation.
|
||||||
|
@export var spawn_host_avatar: bool = true
|
||||||
|
|
||||||
var t_spawn_points: Array[Marker3D] = []
|
var t_spawn_points: Array[Marker3D] = []
|
||||||
var ct_spawn_points: Array[Marker3D] = []
|
var ct_spawn_points: Array[Marker3D] = []
|
||||||
var team_manager: TeamManager
|
var team_manager: TeamManager
|
||||||
@@ -43,12 +47,20 @@ func _handle_connected(id: int):
|
|||||||
_spawn(id)
|
_spawn(id)
|
||||||
|
|
||||||
func _handle_host():
|
func _handle_host():
|
||||||
|
if not spawn_host_avatar:
|
||||||
|
print("[PlayerSpawner] Dedicated server mode — skipping host avatar")
|
||||||
|
if round_manager:
|
||||||
|
round_manager.start_match()
|
||||||
|
return
|
||||||
_spawn(1)
|
_spawn(1)
|
||||||
# Auto-start match
|
# Auto-start match
|
||||||
if round_manager:
|
if round_manager:
|
||||||
round_manager.start_match()
|
round_manager.start_match()
|
||||||
|
|
||||||
func _handle_new_peer(id: int):
|
func _handle_new_peer(id: int):
|
||||||
|
if id == 1 and not spawn_host_avatar:
|
||||||
|
print("[PlayerSpawner] Skipping spawn for peer 1 (dedicated server)")
|
||||||
|
return
|
||||||
_spawn(id)
|
_spawn(id)
|
||||||
if multiplayer.is_server():
|
if multiplayer.is_server():
|
||||||
team_manager.sync_to_peer(id)
|
team_manager.sync_to_peer(id)
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
cd /home/oplabs/tactical-shooter
|
||||||
|
exec ~/.local/bin/godot --headless --scene res://scenes/headless_server.tscn -- --port 34201 --rcon-password test123 > /tmp/server_output.log 2>&1
|
||||||
@@ -55,6 +55,14 @@ func _ready() -> void:
|
|||||||
# Start RCON admin console
|
# Start RCON admin console
|
||||||
_start_rcon()
|
_start_rcon()
|
||||||
|
|
||||||
|
# Set dedicated server flag on the player spawner to prevent
|
||||||
|
# spawning a host avatar (peer 1) that would cause rollback errors.
|
||||||
|
# Must be set before the ENet server starts (before on_server_start fires).
|
||||||
|
var spawner = _game_scene.get_node_or_null("Network/Player Spawner")
|
||||||
|
if spawner:
|
||||||
|
spawner.spawn_host_avatar = false
|
||||||
|
print("[HeadlessServer] Set spawn_host_avatar=false on PlayerSpawner")
|
||||||
|
|
||||||
# Wait for game scene to enter the tree
|
# Wait for game scene to enter the tree
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
await get_tree().process_frame
|
await get_tree().process_frame
|
||||||
|
|||||||
Reference in New Issue
Block a user