Preliminary multiplayer capability (origin stuff disabled for now)
This commit is contained in:
parent
73baafbd6c
commit
f0c4263675
18 changed files with 704 additions and 99 deletions
71
demo/demo.gd
71
demo/demo.gd
|
@ -1,4 +1,73 @@
|
|||
extends Node3D
|
||||
|
||||
# Script stolen/modified from https://godotengine.org/article/multiplayer-in-godot-4-0-scene-replication
|
||||
|
||||
func _ready() -> void:
|
||||
RegionOrigin.anchor = $FixedWingAircraft/RegionTransform
|
||||
# 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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue