mirror of
https://github.com/thegatesbrowser/godot-multiplayer.git
synced 2025-10-16 02:03:43 -04:00
copy from thegates-jam repo
This commit is contained in:
parent
c1a7ad74e1
commit
1a335de566
523 changed files with 22408 additions and 0 deletions
84
main/connection.gd
Normal file
84
main/connection.gd
Normal file
|
@ -0,0 +1,84 @@
|
|||
extends Node
|
||||
class_name Connection
|
||||
|
||||
signal connected
|
||||
signal disconnected
|
||||
|
||||
static var is_peer_connected: bool
|
||||
|
||||
@export var port: int
|
||||
@export var max_clients: int
|
||||
@export var host: String
|
||||
@export var use_localhost_in_editor: bool
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if Connection.is_server(): start_server()
|
||||
connected.connect(func(): Connection.is_peer_connected = true)
|
||||
disconnected.connect(func(): Connection.is_peer_connected = false)
|
||||
disconnected.connect(disconnect_all)
|
||||
|
||||
|
||||
static func is_server() -> bool:
|
||||
return "--server" in OS.get_cmdline_args()
|
||||
|
||||
|
||||
func start_server() -> void:
|
||||
var peer = ENetMultiplayerPeer.new()
|
||||
var err = peer.create_server(port, max_clients)
|
||||
if err != OK:
|
||||
print("Cannot start server. Err: " + str(err))
|
||||
disconnected.emit()
|
||||
return
|
||||
else:
|
||||
print("Server started")
|
||||
connected.emit()
|
||||
|
||||
multiplayer.multiplayer_peer = peer
|
||||
multiplayer.peer_connected.connect(peer_connected)
|
||||
multiplayer.peer_disconnected.connect(peer_disconnected)
|
||||
|
||||
|
||||
func start_client() -> void:
|
||||
var address = host
|
||||
if OS.has_feature("editor") and use_localhost_in_editor:
|
||||
address = "localhost"
|
||||
|
||||
var peer = ENetMultiplayerPeer.new()
|
||||
var err = peer.create_client(address, port)
|
||||
if err != OK:
|
||||
print("Cannot start client. Err: " + str(err))
|
||||
disconnected.emit()
|
||||
return
|
||||
else: print("Connecting to server...")
|
||||
|
||||
multiplayer.multiplayer_peer = peer
|
||||
multiplayer.connected_to_server.connect(connected_to_server)
|
||||
multiplayer.server_disconnected.connect(server_connection_failure)
|
||||
multiplayer.connection_failed.connect(server_connection_failure)
|
||||
|
||||
|
||||
func connected_to_server() -> void:
|
||||
print("Connected to server")
|
||||
connected.emit()
|
||||
|
||||
|
||||
func server_connection_failure() -> void:
|
||||
print("Disconnected")
|
||||
disconnected.emit()
|
||||
|
||||
|
||||
func peer_connected(id: int) -> void:
|
||||
print("Peer connected: " + str(id))
|
||||
|
||||
|
||||
func peer_disconnected(id: int) -> void:
|
||||
print("Peer disconnected: " + str(id))
|
||||
|
||||
|
||||
func disconnect_all() -> void:
|
||||
multiplayer.peer_connected.disconnect(peer_connected)
|
||||
multiplayer.peer_disconnected.disconnect(peer_disconnected)
|
||||
multiplayer.connected_to_server.disconnect(connected_to_server)
|
||||
multiplayer.server_disconnected.disconnect(server_connection_failure)
|
||||
multiplayer.connection_failed.disconnect(server_connection_failure)
|
35
main/fall_checker.gd
Normal file
35
main/fall_checker.gd
Normal file
|
@ -0,0 +1,35 @@
|
|||
extends Node
|
||||
class_name FallChecker
|
||||
|
||||
@export var fall_height: float
|
||||
@export var player_spawner: PlayerSpawner
|
||||
|
||||
var timer : Timer
|
||||
var players = {} # {Peer ID: Player}
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if not Connection.is_server(): return
|
||||
|
||||
timer = Timer.new()
|
||||
add_child(timer)
|
||||
timer.start(1)
|
||||
timer.timeout.connect(check_fallen)
|
||||
|
||||
player_spawner.player_spawned.connect(player_spawned)
|
||||
player_spawner.player_despawned.connect(player_despawned)
|
||||
|
||||
|
||||
func player_spawned(id: int, player: Player) -> void:
|
||||
players[id] = player
|
||||
|
||||
|
||||
func player_despawned(id: int) -> void:
|
||||
players.erase(id)
|
||||
|
||||
|
||||
func check_fallen() -> void:
|
||||
for id in players.keys():
|
||||
var player = players[id] as Player
|
||||
if player.global_position.y < fall_height:
|
||||
player_spawner.respawn_player(id)
|
58
main/main.tscn
Normal file
58
main/main.tscn
Normal file
|
@ -0,0 +1,58 @@
|
|||
[gd_scene load_steps=12 format=3 uid="uid://mqnlrs6hn6g6"]
|
||||
|
||||
[ext_resource type="Script" path="res://main/connection.gd" id="1_hlrxf"]
|
||||
[ext_resource type="Script" path="res://voip/voip_manager.gd" id="2_u8axh"]
|
||||
[ext_resource type="PackedScene" uid="uid://enpjmjm7ayyu" path="res://levels/hub_level.tscn" id="3_0cpj8"]
|
||||
[ext_resource type="PackedScene" uid="uid://2ne27phhv0kl" path="res://user_data/user_data_manager.tscn" id="3_rwvlu"]
|
||||
[ext_resource type="PackedScene" uid="uid://bjywb13vy4hl4" path="res://voip/voip_user.tscn" id="3_tfkyd"]
|
||||
[ext_resource type="Script" path="res://main/player_spawner.gd" id="4_edyrb"]
|
||||
[ext_resource type="PackedScene" uid="uid://cvl4jsitsxp0u" path="res://ui/ui.tscn" id="4_fvou2"]
|
||||
[ext_resource type="PackedScene" uid="uid://ciqrpd5675boy" path="res://player/player.tscn" id="5_wb2xi"]
|
||||
[ext_resource type="Script" path="res://voip/microphone.gd" id="6_fgpqb"]
|
||||
[ext_resource type="Script" path="res://main/fall_checker.gd" id="9_vk48u"]
|
||||
|
||||
[sub_resource type="AudioStreamMicrophone" id="AudioStreamMicrophone_40kex"]
|
||||
|
||||
[node name="Main" type="Node"]
|
||||
|
||||
[node name="Connection" type="Node" parent="."]
|
||||
script = ExtResource("1_hlrxf")
|
||||
port = 5050
|
||||
use_localhost_in_editor = true
|
||||
|
||||
[node name="UserDataManager" parent="." instance=ExtResource("3_rwvlu")]
|
||||
|
||||
[node name="VoipManager" type="Node" parent="." node_paths=PackedStringArray("player_spawner")]
|
||||
script = ExtResource("2_u8axh")
|
||||
user_scn = ExtResource("3_tfkyd")
|
||||
player_spawner = NodePath("../PlayerSpawner")
|
||||
|
||||
[node name="Microphone" type="AudioStreamPlayer" parent="."]
|
||||
stream = SubResource("AudioStreamMicrophone_40kex")
|
||||
autoplay = true
|
||||
bus = &"Record"
|
||||
script = ExtResource("6_fgpqb")
|
||||
|
||||
[node name="UI" parent="." instance=ExtResource("4_fvou2")]
|
||||
|
||||
[node name="Players" type="Node3D" parent="."]
|
||||
|
||||
[node name="PlayerSpawner" type="MultiplayerSpawner" parent="." node_paths=PackedStringArray("spawn_points")]
|
||||
_spawnable_scenes = PackedStringArray("res://player/player.tscn")
|
||||
spawn_path = NodePath("../Players")
|
||||
script = ExtResource("4_edyrb")
|
||||
player_scene = ExtResource("5_wb2xi")
|
||||
spawn_points = NodePath("../HubLevel/SpawnPoints")
|
||||
|
||||
[node name="FallChecker" type="Node" parent="." node_paths=PackedStringArray("player_spawner")]
|
||||
script = ExtResource("9_vk48u")
|
||||
fall_height = -20.0
|
||||
player_spawner = NodePath("../PlayerSpawner")
|
||||
|
||||
[node name="HubLevel" parent="." instance=ExtResource("3_0cpj8")]
|
||||
|
||||
[connection signal="disconnected" from="Connection" to="UI" method="show_ui"]
|
||||
[connection signal="connect_client" from="UI" to="Connection" method="start_client"]
|
||||
[connection signal="start_server" from="UI" to="Connection" method="start_server"]
|
||||
|
||||
[editable path="HubLevel"]
|
63
main/player_spawner.gd
Normal file
63
main/player_spawner.gd
Normal file
|
@ -0,0 +1,63 @@
|
|||
extends MultiplayerSpawner
|
||||
class_name PlayerSpawner
|
||||
|
||||
signal player_spawned(id: int, player: Player)
|
||||
signal player_despawned(id: int)
|
||||
|
||||
@export var player_scene: PackedScene
|
||||
@export var spawn_points: SpawnPoints
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
spawn_function = custom_spawn
|
||||
multiplayer.peer_connected.connect(create_player)
|
||||
multiplayer.peer_disconnected.connect(destroy_player)
|
||||
spawned.connect(on_spawned)
|
||||
despawned.connect(on_despawned)
|
||||
|
||||
|
||||
func create_player(id: int):
|
||||
if not multiplayer.is_server(): return
|
||||
|
||||
var spawn_position = spawn_points.get_spawn_position()
|
||||
spawn([id, spawn_position])
|
||||
print("Player %d spawned at " % [id] + str(spawn_position))
|
||||
|
||||
|
||||
func destroy_player(id: int):
|
||||
if not multiplayer.is_server(): return
|
||||
get_node(spawn_path).get_node(str(id)).queue_free()
|
||||
|
||||
player_despawned.emit(id)
|
||||
|
||||
|
||||
func respawn_player(id: int) -> void:
|
||||
var player = get_node(spawn_path).get_node(str(id)) as Player
|
||||
var spawn_position = spawn_points.get_spawn_position()
|
||||
player.respawn.rpc_id(id, spawn_position)
|
||||
print("Respawn player %d at " % [id] + str(spawn_position))
|
||||
|
||||
|
||||
func custom_spawn(vars) -> Node:
|
||||
var id = vars[0]
|
||||
var pos = vars[1]
|
||||
|
||||
var p: Player = player_scene.instantiate()
|
||||
p.set_multiplayer_authority(id)
|
||||
p.name = str(id)
|
||||
p.position = pos
|
||||
|
||||
player_spawned.emit(id, p)
|
||||
return p
|
||||
|
||||
|
||||
func get_player_or_null(id: int) -> Player:
|
||||
return get_node(spawn_path).get_node_or_null(str(id))
|
||||
|
||||
|
||||
func on_spawned(node: Node) -> void:
|
||||
player_spawned.emit(node.get_multiplayer_authority(), node)
|
||||
|
||||
|
||||
func on_despawned(node: Node) -> void:
|
||||
player_despawned.emit(node.get_multiplayer_authority())
|
24
main/spawn_points.gd
Normal file
24
main/spawn_points.gd
Normal file
|
@ -0,0 +1,24 @@
|
|||
extends Node3D
|
||||
class_name SpawnPoints
|
||||
|
||||
var spawn_points: Array[Node]
|
||||
var used_ids: Array[int]
|
||||
var size: int
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
spawn_points = get_children() as Array[Node]
|
||||
size = spawn_points.size()
|
||||
|
||||
|
||||
func get_spawn_position() -> Vector3:
|
||||
var id = 0
|
||||
for x in range(1000):
|
||||
id = randi() % size
|
||||
if not id in used_ids:
|
||||
used_ids.push_back(id)
|
||||
break
|
||||
elif used_ids.size() == size:
|
||||
used_ids.pop_front()
|
||||
|
||||
return spawn_points[id].global_position
|
Loading…
Add table
Add a link
Reference in a new issue