2025-09-04 15:01:53 -04:00
|
|
|
extends Node3D
|
|
|
|
|
2025-09-24 18:08:12 -04:00
|
|
|
# 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:
|
2025-09-24 18:08:12 -04:00
|
|
|
# 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)
|