From eaaa3075d5a924aad8d364437470297a7059a77e Mon Sep 17 00:00:00 2001 From: Chris Bell Date: Tue, 12 Aug 2025 20:52:10 -0500 Subject: [PATCH] Attempt removing player upon disconnect --- splunk/game-logic/game_manager.gd | 9 +++++++-- splunk/networking/player_spawner.gd | 11 ++++++++++- splunk/networking/steam-manager.gd | 7 ++++++- splunk/project.godot | 4 ++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/splunk/game-logic/game_manager.gd b/splunk/game-logic/game_manager.gd index d0c41ba..79d96c3 100644 --- a/splunk/game-logic/game_manager.gd +++ b/splunk/game-logic/game_manager.gd @@ -1,8 +1,8 @@ extends Node -var players: Array[int] = [] +var players: Dictionary[int, Player] = {} -var player_spawner: MultiplayerSpawner +var player_spawner: LobbyPlayerSpawner @onready var debug_ui: PackedScene = preload("res://ui/multiplayer-debug-ui/multiplayer-debug-ui.tscn") var debug_ui_instance @@ -29,3 +29,8 @@ func request_server_to_spawn_player(peer_id: int, player_name: String) -> void: data["player_name"] = player_name player_spawner.spawn(data) + + +@rpc("any_peer", "call_local", "reliable") +func request_server_to_delete_player(peer_id: int) -> void: + player_spawner.delete_player(peer_id) diff --git a/splunk/networking/player_spawner.gd b/splunk/networking/player_spawner.gd index 4b0f456..19deda1 100644 --- a/splunk/networking/player_spawner.gd +++ b/splunk/networking/player_spawner.gd @@ -1,7 +1,10 @@ +class_name LobbyPlayerSpawner extends MultiplayerSpawner @onready var player_scene: PackedScene = load("res://player/Player.tscn") +var players_dict: Dictionary[int, Player] = {} + func _ready() -> void: spawn_function = spawn_player @@ -17,6 +20,12 @@ func spawn_player(data: Dictionary) -> Player: new_player.set_player_name(peer_id, player_name) new_player.position = Vector3.UP - GameManager.players.append(int(peer_id)) + GameManager.players[int(peer_id)] = new_player return new_player + + +func delete_player(id: int) -> void: + var player_to_delete = GameManager.players[id] + GameManager.players.erase(id) + player_to_delete.queue_free() diff --git a/splunk/networking/steam-manager.gd b/splunk/networking/steam-manager.gd index 4275c93..119c5cc 100644 --- a/splunk/networking/steam-manager.gd +++ b/splunk/networking/steam-manager.gd @@ -31,6 +31,7 @@ func _ready() -> void: multiplayer.peer_connected.connect(_on_peer_connected) multiplayer.peer_disconnected.connect(_on_peer_disconnected) multiplayer.connected_to_server.connect(_on_connected_to_server) + multiplayer.server_disconnected.connect(_on_disconnected_from_server) multiplayer.connection_failed.connect(_on_connection_failed) check_command_line() @@ -96,6 +97,10 @@ func _on_connected_to_server(): GameManager.request_server_to_spawn_player.rpc_id(1, multiplayer.get_unique_id(), steam_username) +func _on_disconnected_from_server(): + GameManager.request_server_to_delete_player.rpc_id(1, multiplayer.get_unique_id()) + + func _on_p2p_session_request(steam_id_remote: int) -> void: print("[P2P] ==> Session request from: %s. Accepting." % steam_id_remote) Steam.acceptP2PSessionWithUser(steam_id_remote) @@ -135,8 +140,8 @@ func _on_peer_connected(id: int): func _on_peer_disconnected(id: int): print("[INFO] Peer %s has disconnected." % id) if players.has(id): - #players[id].queue_free() players.erase(id) + func _on_connection_failed() -> void: diff --git a/splunk/project.godot b/splunk/project.godot index 6fa4985..b2a70f7 100644 --- a/splunk/project.godot +++ b/splunk/project.godot @@ -20,6 +20,10 @@ config/icon="res://icon.svg" SteamManager="*res://networking/steam-manager.gd" GameManager="*res://game-logic/game_manager.gd" +[display] + +window/vsync/vsync_mode=0 + [editor_plugins] enabled=PackedStringArray("res://addons/freecam_3D/plugin.cfg")