[gd_scene load_steps=5 format=3 uid="uid://bvwxfgygm2xb8"] [ext_resource type="PackedScene" uid="uid://chbno00ugl6te" path="res://maps/genesis/genesis.tscn" id="1_nulvv"] [ext_resource type="PackedScene" uid="uid://cbhx1xme0sb7k" path="res://entities/player/player.tscn" id="2_og1vb"] [ext_resource type="PackedScene" uid="uid://c88l3h0ph00c7" path="res://entities/flag/flag.tscn" id="3_h0rie"] [sub_resource type="GDScript" id="GDScript_1qrbp"] script/source = "class_name Multiplayer extends Node @export_category(\"Parameters\") @export var MAP : PackedScene @export var PLAYER : PackedScene @export var FLAG : PackedScene @export var MAX_CLIENTS : int = 24 @onready var map : Node = $Map @onready var players : Node = $Players @onready var objectives : Node = $Objectives signal connected_to_server signal connection_failed func load_map(scene : PackedScene) -> void: map.add_child(scene.instantiate()) func start_server(port : int, nickname : String) -> void: var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() peer.create_server(port, MAX_CLIENTS) multiplayer.multiplayer_peer = peer load_map.call_deferred(MAP) multiplayer.peer_disconnected.connect(remove_player) if DisplayServer.get_name() != \"headless\": add_player(1, nickname) add_flag() func join_server(host : String, port : int, nickname : String) -> void: var peer : ENetMultiplayerPeer= ENetMultiplayerPeer.new() peer.create_client(host, port) multiplayer.connected_to_server.connect(_on_connected_to_server.bind(nickname)) multiplayer.connection_failed.connect(_on_connection_failed) multiplayer.multiplayer_peer = peer func _on_connected_to_server(nickname : String) -> void: connected_to_server.emit() _join_match.rpc(nickname) func _on_connection_failed() -> void: connection_failed.emit() func respawn_player(player : Player) -> void: player.respawn(Vector3(0.0, 150.0, 0.0)) func add_player(peer_id : int, nickname : String) -> void: var player : Player = PLAYER.instantiate() player.name = str(peer_id) player.player_id = peer_id player.nickname = nickname player.position = Vector3(0.0, 150.0, 0.0) players.add_child(player) player.died.connect(respawn_player) print(\"Peer `%s` connected\" % player.name) func remove_player(peer_id : int) -> void: var node_name : String = str(peer_id) if players.has_node(node_name): var player : Player = players.get_node(node_name) player.die() player.queue_free() print(\"Peer `%s` disconnected\" % node_name) @rpc(\"any_peer\") func _join_match(nickname : String) -> void: if multiplayer.is_server(): add_player(multiplayer.get_remote_sender_id(), nickname) func add_flag() -> void: var flag : Flag = FLAG.instantiate() flag.position = Vector3(5.0, 100.0, 0.0) objectives.add_child(flag) func _exit_tree() -> void: if multiplayer.is_server(): multiplayer.peer_connected.disconnect(add_player) multiplayer.peer_disconnected.disconnect(remove_player) " [node name="Multiplayer" type="Node"] script = SubResource("GDScript_1qrbp") MAP = ExtResource("1_nulvv") PLAYER = ExtResource("2_og1vb") FLAG = ExtResource("3_h0rie") [node name="Map" type="Node" parent="."] [node name="MapSpawner" type="MultiplayerSpawner" parent="."] _spawnable_scenes = PackedStringArray("res://maps/genesis/genesis.tscn") spawn_path = NodePath("../Map") spawn_limit = 1 [node name="Players" type="Node" parent="."] [node name="PlayersSpawner" type="MultiplayerSpawner" parent="."] _spawnable_scenes = PackedStringArray("res://entities/player/player.tscn") spawn_path = NodePath("../Players") [node name="Objectives" type="Node" parent="."] [node name="ObjectivesSpawner" type="MultiplayerSpawner" parent="."] _spawnable_scenes = PackedStringArray("res://entities/flag/flag.tscn") spawn_path = NodePath("../Objectives")