open-fpsz/modes/multiplayer.tscn
2024-04-14 23:25:41 +02:00

94 lines
2.7 KiB
Plaintext

[gd_scene load_steps=4 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"]
[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 MAX_CLIENTS : int = 24
@onready var map = $Map
@onready var players = $Players
signal connected_to_server
signal connection_failed
func load_map(scene : PackedScene):
map.add_child(scene.instantiate())
func start_server(port):
var peer = ENetMultiplayerPeer.new()
peer.create_server(port, MAX_CLIENTS)
multiplayer.multiplayer_peer = peer
load_map.call_deferred(MAP)
multiplayer.peer_connected.connect(add_player)
multiplayer.peer_disconnected.connect(remove_player)
for id in multiplayer.get_peers():
add_player(id)
if DisplayServer.get_name() != \"headless\":
add_player(1)
func join_server(host, port):
var peer = ENetMultiplayerPeer.new()
peer.create_client(host, port)
multiplayer.connected_to_server.connect(_on_connected_to_server)
multiplayer.connection_failed.connect(_on_connection_failed)
multiplayer.multiplayer_peer = peer
func _on_connected_to_server():
connected_to_server.emit()
func _on_connection_failed():
connection_failed.emit()
func respawn_player(player):
player.respawn(Vector3(0.0, 150.0, 0.0))
func add_player(peer_id : int):
var player : Player = PLAYER.instantiate()
player.name = str(peer_id)
player.player_id = peer_id
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):
var node_name = str(peer_id)
if players.has_node(node_name):
players.get_node(node_name).queue_free()
print(\"Peer `%s` disconnected\" % node_name)
func _exit_tree():
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")
[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")