Great memory haha!
I feel like you would get a lot more errors if the scene tree didn’t match before spawning, but that’s all I can really think of. Like if $world doesn’t exist yet for the clients the RPC wouldn’t go through, then none of the other enemies would either.
Using a MultiplayerSpawner shouldn’t be required but absolutely will help in a multitude of ways. Since your dungeons are scenes it can use the auto spawn list and reduce your rpcs to $world/dungeons.add_child(new_dungeon, true). Only the server should be adding children to the spawn path.
I made it to my computer and copy-pasted the code. I’m working on your suggestions now. Thank you so much!
I figured, I was commenting on how close your other post was to this real code sample, good job. And don’t worry about taking time to respond on forums, it’s instant messaging, not instant replying!
Is there something that I need to change with the settings below? It still produce the exact same errors.
Each of the elements of the auto spawn list are valid node paths.
That looks like it, I’d use add_child(dungeon, true) to be extra safe, the second argument is for “force readable name” which is useful for most multiplayer things.
Really tough to say, maybe worth running print_tree_pretty() on each client’s main node
(UID 1691990227)
┖╴main
┠╴LevelSpawner
┠╴world
┠╴spawnLocs
┃ ┠╴0
┃ ┠╴1
┃ ┠╴2
┃ ┠╴3
┃ ┠╴4
┃ ┖╴5
┠╴Debug1691990227
┠╴1
┃ ┠╴anim
┃ ┠╴playerCollision
┃ ┠╴winSound
┃ ┠╴playerCam
┃ ┃ ┖╴GUI
┃ ┃ ┠╴LSeqCContainer
┃ ┃ ┃ ┖╴LevelSeqContainer
┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┖╴4
┃ ┃ ┃ ┠╴4
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴spaceBar
┃ ┃ ┠╴PauseScreen
┃ ┃ ┃ ┠╴back
┃ ┃ ┃ ┖╴centerH
┃ ┃ ┃ ┖╴centerV
┃ ┃ ┃ ┠╴resume
┃ ┃ ┃ ┠╴leave
┃ ┃ ┃ ┖╴quit
┃ ┃ ┠╴OtherPlayerPointer
┃ ┃ ┃ ┖╴arrow
┃ ┃ ┖╴ExitPointer
┃ ┃ ┖╴arrow
┃ ┠╴queueFreeTimer
┃ ┠╴meleeDetector
┃ ┠╴atkUpArea
┃ ┃ ┖╴atkUpShape
┃ ┠╴atkLeftArea
┃ ┃ ┖╴atkLeftShape
┃ ┠╴atkDownArea
┃ ┃ ┖╴atkDownShape
┃ ┠╴atkRightArea
┃ ┃ ┖╴atkRightShape
┃ ┠╴MultiplayerSynchronizer
┃ ┠╴health
┃ ┠╴shields
┃ ┠╴energy
┃ ┠╴@AudioStreamPlayer2D@47
┃ ┖╴@AudioStreamPlayer2D@48
┖╴1691990227
┠╴anim
┠╴playerCollision
┠╴winSound
┠╴playerCam
┃ ┖╴GUI
┃ ┠╴LSeqCContainer
┃ ┃ ┖╴LevelSeqContainer
┃ ┃ ┠╴0
┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴1
┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴2
┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴3
┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┖╴4
┃ ┃ ┠╴4
┃ ┃ ┖╴overlay
┃ ┠╴spaceBar
┃ ┠╴PauseScreen
┃ ┃ ┠╴back
┃ ┃ ┖╴centerH
┃ ┃ ┖╴centerV
┃ ┃ ┠╴resume
┃ ┃ ┠╴leave
┃ ┃ ┖╴quit
┃ ┠╴OtherPlayerPointer
┃ ┃ ┖╴arrow
┃ ┖╴ExitPointer
┃ ┖╴arrow
┠╴queueFreeTimer
┠╴meleeDetector
┠╴atkUpArea
┃ ┖╴atkUpShape
┠╴atkLeftArea
┃ ┖╴atkLeftShape
┠╴atkDownArea
┃ ┖╴atkDownShape
┠╴atkRightArea
┃ ┖╴atkRightShape
┠╴MultiplayerSynchronizer
┠╴health
┠╴shields
┠╴energy
┠╴@AudioStreamPlayer2D@49
┖╴@AudioStreamPlayer2D@50
(UID 1) 1's name is now 1
(UID 1) 1691990227's name is now 1691990227
(UID 1)
┖╴main
┠╴LevelSpawner
┠╴world
┃ ┖╴dungeon2
┃ ┠╴rooms
┃ ┠╴ExitBuilding
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┖╴enemies
┃ ┠╴ZerglingEntity
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity2
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity3
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity4
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity5
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity6
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity7
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity8
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity9
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity10
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity11
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴ZerglingEntity12
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity2
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity3
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity4
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity5
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┠╴HydraliskEntity6
┃ ┃ ┠╴syncronizer
┃ ┃ ┠╴anim
┃ ┃ ┠╴dSoundPlayer
┃ ┃ ┠╴aSoundPlayer
┃ ┃ ┠╴navAgent
┃ ┃ ┠╴navResetTimer
┃ ┃ ┠╴queueFreeTimer
┃ ┃ ┠╴biomassLabelFloating
┃ ┃ ┠╴healthBar
┃ ┃ ┠╴collision
┃ ┃ ┠╴detectionArea
┃ ┃ ┃ ┖╴shape
┃ ┃ ┖╴attackArea
┃ ┃ ┖╴shape
┃ ┖╴UltraliskEntity
┃ ┠╴syncronizer
┃ ┠╴anim
┃ ┠╴dSoundPlayer
┃ ┠╴aSoundPlayer
┃ ┠╴navAgent
┃ ┠╴navResetTimer
┃ ┠╴queueFreeTimer
┃ ┠╴biomassLabelFloating
┃ ┠╴healthBar
┃ ┠╴collision
┃ ┠╴detectionArea
┃ ┃ ┖╴shape
┃ ┖╴attackArea
┃ ┖╴shape
┠╴spawnLocs
┃ ┠╴0
┃ ┠╴1
┃ ┠╴2
┃ ┠╴3
┃ ┠╴4
┃ ┖╴5
┠╴Debug1
┠╴1
┃ ┠╴anim
┃ ┠╴playerCollision
┃ ┠╴winSound
┃ ┠╴playerCam
┃ ┃ ┖╴GUI
┃ ┃ ┠╴LSeqCContainer
┃ ┃ ┃ ┖╴LevelSeqContainer
┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┃ ┖╴overlay
┃ ┃ ┃ ┖╴4
┃ ┃ ┃ ┠╴4
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴spaceBar
┃ ┃ ┠╴PauseScreen
┃ ┃ ┃ ┠╴back
┃ ┃ ┃ ┖╴centerH
┃ ┃ ┃ ┖╴centerV
┃ ┃ ┃ ┠╴resume
┃ ┃ ┃ ┠╴leave
┃ ┃ ┃ ┖╴quit
┃ ┃ ┠╴OtherPlayerPointer
┃ ┃ ┃ ┖╴arrow
┃ ┃ ┖╴ExitPointer
┃ ┃ ┖╴arrow
┃ ┠╴queueFreeTimer
┃ ┠╴meleeDetector
┃ ┠╴atkUpArea
┃ ┃ ┖╴atkUpShape
┃ ┠╴atkLeftArea
┃ ┃ ┖╴atkLeftShape
┃ ┠╴atkDownArea
┃ ┃ ┖╴atkDownShape
┃ ┠╴atkRightArea
┃ ┃ ┖╴atkRightShape
┃ ┠╴MultiplayerSynchronizer
┃ ┠╴health
┃ ┠╴shields
┃ ┠╴energy
┃ ┠╴@AudioStreamPlayer2D@47
┃ ┖╴@AudioStreamPlayer2D@48
┖╴1691990227
┠╴anim
┠╴playerCollision
┠╴winSound
┠╴playerCam
┃ ┖╴GUI
┃ ┠╴LSeqCContainer
┃ ┃ ┖╴LevelSeqContainer
┃ ┃ ┠╴0
┃ ┃ ┃ ┠╴0
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴1
┃ ┃ ┃ ┠╴1
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴2
┃ ┃ ┃ ┠╴2
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┠╴3
┃ ┃ ┃ ┠╴3
┃ ┃ ┃ ┖╴overlay
┃ ┃ ┖╴4
┃ ┃ ┠╴4
┃ ┃ ┖╴overlay
┃ ┠╴spaceBar
┃ ┠╴PauseScreen
┃ ┃ ┠╴back
┃ ┃ ┖╴centerH
┃ ┃ ┖╴centerV
┃ ┃ ┠╴resume
┃ ┃ ┠╴leave
┃ ┃ ┖╴quit
┃ ┠╴OtherPlayerPointer
┃ ┃ ┖╴arrow
┃ ┖╴ExitPointer
┃ ┖╴arrow
┠╴queueFreeTimer
┠╴meleeDetector
┠╴atkUpArea
┃ ┖╴atkUpShape
┠╴atkLeftArea
┃ ┖╴atkLeftShape
┠╴atkDownArea
┃ ┖╴atkDownShape
┠╴atkRightArea
┃ ┖╴atkRightShape
┠╴MultiplayerSynchronizer
┠╴health
┠╴shields
┠╴energy
┠╴@AudioStreamPlayer2D@49
┖╴@AudioStreamPlayer2D@50
Jeez that’s long! I have no clue why those default-named AuidoStreamPlayer2Ds exist, but I can fix that. The trees are exactly the same, except for the node whose name starts with “Debug”. That is intentional, as the node tells me which instance I’m on.
The tress are not the same! Your first block is much shorter because it is missing everything under world. Which means for some reason it’s not spawning the dungeon. Do you get any errors very early on in the project? Before the enemies start spewing errors?
Those Debug# nodes sure do help with reading this tree, and if they don’t have any scripts or important children they should be fine to exist.
Wow! I have no clue how that slipped past me. Sorry.
Is is maybe an issue with the print_tree() statement??
The logs and the tree provided by Godot are wildly different. Also, the world is present in both instances.
The remote tree may be a best-estimate, I’ve never trusted it for multiple sessions sadly.
I notice the error is in “process_simplify_path”, but the error only appears once for each node. Could it be that the error only persists for one process tick? The world could just not be spawned in for one tick, causing the error. I’ll find a way to test that.
Ok, I tested running the print_tree_pretty() function after a short delay, and it seems like the same issue persists: the game’s tree thinks that the dungeon has not been spawned in yet, but it has.
are you changing scenes based on something other than an RPC? It very much could be a few frames of a incorrect scene tree if peers decide on their own accord to change to this scene rather than by network request
Nope, here’s my code for changing scenes:
@rpc("any_peer", "call_local")
func start_game():
$"../btn_down".play()
await get_tree().create_timer(0.34).timeout
print_rich("[color=blue](UID {0}) STARTING GAME [/color]-------------------------------------".format([multiplayer.get_unique_id()]))
get_tree().change_scene_to_file("res://scenes/main.tscn")
I most definitely always use the .rpc function call. Could the problem be the timer?
the timer probably hurts, the peers will end up calculating a different 0.34 seconds for either machine, very possible to be a frame off.
But it’s not just about being a frame off it’s also that if you RPC to change the scene, nothing else is processed until that scene is loaded, and while RPCs are allowed to get backed-up there is zero chance for a stray RPC or synchronizer to process until the scene is changed and the peers will match.
If you want a fade out you may have to RPC the fade out, then RPC the scene change.
Really, I shouldn’t be playing the button_down sound and waiting there at all! I just want to play the button_down sound on the host machine. So what I should do is move the sound playing and the waiting to when the start game button is pressed, then rpc the scene change?
and add “reliable” to your rpc annotation for the function, just in case
It still has the ~100 errors… I have no idea what to do next. The “reliable” option is the default.
Let me see if I got this correctly: you are on the menu scene on both the host and the peer, and once both are “ready” you start the game from the host side and load a new scene (main) on both instances, is that correct?
I haven’t implemented a “ready” system, this is just going to be a project for Father’s Day. We’ll be in a video call, so I’ll know when my dad is ready. I start the game from the host side, and rpc the scene change to both the server and client. Yes, the I’m using the change_scene_to_file() method (function? idk) and the scene is called “main”. But yes, you are correct.
I understand where the problem is then.
This is due to a known issue caused by the nature of the change_scene itself. Since the scene is changed in a deferred way it’s very unlikely that all the peers will ever sync to the host.
You can read more about it on this issue on github - more precisely what Faless mentions.
The solution is rather easy, use a MultiplayerSpawner to sync the level. For instance:
This is how my “run” scene looks like. All the clients will always start from this scene. Then once I connect all the peers to the host (in my case it’s done through command since I don’t have a UI yet, but else it would be done through Control nodes), I can start the game (again another command) and spawn the level (in your case the dungeon) under the “Level” node. This will automatically be replicated over the network to all the connected peers.
While this might not be the best solution, if I remember correctly it’s the same one mentioned in this post here linked by Faless. I have encountered this very same issue a long time ago, and stuck to this kind of approach since. Given that the issue is still open on github I will assume it’s still the way to go for now 
I hope this helps!