Keep the local controller intact when it is not synced

With the controller off, a god or ghost player was still turned into a spectator while downloading, which threw away the local state the sync is meant to leave alone. Only spectate a player without a character when the controller is synced, and skip the ghost round trip when the ghost is the local state.

A ghost on an instance that syncs inventories but not the controller never received the stored character, so after respawning it uploaded an empty one over it. Respawn such a ghost straight away when there is a stored character to give it.

Clear the saved local controller when the player picks a temporary inventory after a failed download, otherwise a later download restores the stale controller over the temporary character. An empty download only gives a character when the controller is synced or the player was spectated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
bbassieandClaude Opus 5.5 committed 2026-10-17 15:25:06 +00:00
1 parent 0e559cf000
commit c798b2a33f
5 files changed
+12 -3

No files matched your search

+2 -1
View File
@@ -487,7 +487,8 @@ function player_sync.initiate_inventory_download(player, player_record, generati
-- If this is a synced player turn them into a spectator while the
-- player data is downloading
if player_record.sync and syncs("inventories") then
-- Without the controller synced a player without a character has nothing synced to protect
if player_record.sync and syncs("inventories") and (syncs("controller") or player.character) then
-- Store original position to teleport back to
if v2_remote_controller then
record.surface = player.physical_surface