sparkygd/demo/demo.gd

74 lines
2.4 KiB
GDScript3
Raw Normal View History

2025-09-04 15:01:53 -04:00
extends Node3D
# Script stolen/modified from https://godotengine.org/article/multiplayer-in-godot-4-0-scene-replication
2025-09-04 15:01:53 -04:00
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)