extends Node3D # Script stolen/modified from https://godotengine.org/article/multiplayer-in-godot-4-0-scene-replication func _ready() -> void: # We only need to spawn players on the server. if not multiplayer.is_server(): return multiplayer.peer_connected.connect(add_player) multiplayer.peer_disconnected.connect(del_player) # Spawn already connected players. for id in multiplayer.get_peers(): add_player(id) #set_up_remote_character(node: Node) # Spawn the local player unless this is a dedicated server export. if not OS.has_feature("dedicated_server"): add_player(1) #set_up_local_character(1) func _exit_tree() -> void: if not multiplayer.is_server(): return multiplayer.peer_connected.disconnect(add_player) multiplayer.peer_disconnected.disconnect(del_player) func add_player(id: int) -> void: var character := preload("res://demo/aircraft/fixed_wing_aircraft.tscn").instantiate() as FixedWingAircraft # Set player id. character.multiplayer_authority = id #character.set_multiplayer_authority(id) # Randomize character position. #var pos := Vector2.from_angle(randf() * 2 * PI) character.position = Vector3(randf() * 10.0 - 5.0, 100.0, randf() * 10.0 - 5.0) character.name = str(id) $Players.add_child(character, true) if id == multiplayer.get_unique_id(): set_up_local_character(id) else: set_up_remote_character(character) func del_player(id: int) -> void: if not $Players.has_node(str(id)): return $Players.get_node(str(id)).queue_free() func set_up_local_character(id: int) -> void: if not $Players.has_node(str(id)): return var local_player := $Players.get_node(str(id)) as FixedWingAircraft # Tie the camera to it var remote := RemoteTransform3D.new() local_player.add_child(remote) remote.remote_path = remote.get_path_to($Camera3D) # Set up the HUD ($CanvasLayer/HUD as HUD).source = local_player func set_up_remote_character(node: Node3D) -> void: # Add the roc model var roc := preload("res://demo/models/roc.dae").instantiate() as Node3D roc.rotate(Vector3.UP, PI) node.add_child(roc) func _on_multiplayer_spawner_spawned(node: Node) -> void: if node.name == str(multiplayer.get_unique_id()): set_up_local_character(multiplayer.get_unique_id()) elif node is FixedWingAircraft: set_up_remote_character(node as Node3D)