From eaaa3075d5a924aad8d364437470297a7059a77e Mon Sep 17 00:00:00 2001 From: Chris Bell Date: Tue, 12 Aug 2025 20:52:10 -0500 Subject: [PATCH 1/3] 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") From 88b399f453bf1f560edb3f2e1d66bad7cf9ac49f Mon Sep 17 00:00:00 2001 From: Chris Bell Date: Tue, 12 Aug 2025 20:57:26 -0500 Subject: [PATCH 2/3] Try again to remove player when disconnecting --- splunk/networking/steam-manager.gd | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/splunk/networking/steam-manager.gd b/splunk/networking/steam-manager.gd index 119c5cc..fa4d8f4 100644 --- a/splunk/networking/steam-manager.gd +++ b/splunk/networking/steam-manager.gd @@ -98,7 +98,7 @@ func _on_connected_to_server(): func _on_disconnected_from_server(): - GameManager.request_server_to_delete_player.rpc_id(1, multiplayer.get_unique_id()) + pass func _on_p2p_session_request(steam_id_remote: int) -> void: @@ -152,7 +152,9 @@ func _on_lobby_chat_update(_l_id, user_changed_id: int, _u_m_c_id, chat_state: i var state_string = "UNKNOWN" match chat_state: Steam.CHAT_MEMBER_STATE_CHANGE_ENTERED: state_string = "ENTERED" - Steam.CHAT_MEMBER_STATE_CHANGE_LEFT: state_string = "LEFT" + Steam.CHAT_MEMBER_STATE_CHANGE_LEFT: + state_string = "LEFT" + GameManager.request_server_to_delete_player.rpc_id(1, user_changed_id) Steam.CHAT_MEMBER_STATE_CHANGE_DISCONNECTED: state_string = "DISCONNECTED" print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string]) From 0db8edef2a6516f710a21759179385dd8ba9a45d Mon Sep 17 00:00:00 2001 From: Chris Bell Date: Tue, 12 Aug 2025 20:59:05 -0500 Subject: [PATCH 3/3] reeeeeeeeeeeeeee --- splunk/networking/steam-manager.gd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/splunk/networking/steam-manager.gd b/splunk/networking/steam-manager.gd index fa4d8f4..b6198b5 100644 --- a/splunk/networking/steam-manager.gd +++ b/splunk/networking/steam-manager.gd @@ -139,6 +139,7 @@ func _on_peer_connected(id: int): func _on_peer_disconnected(id: int): print("[INFO] Peer %s has disconnected." % id) + GameManager.request_server_to_delete_player.rpc_id(1, id) if players.has(id): players.erase(id) @@ -154,7 +155,7 @@ func _on_lobby_chat_update(_l_id, user_changed_id: int, _u_m_c_id, chat_state: i Steam.CHAT_MEMBER_STATE_CHANGE_ENTERED: state_string = "ENTERED" Steam.CHAT_MEMBER_STATE_CHANGE_LEFT: state_string = "LEFT" - GameManager.request_server_to_delete_player.rpc_id(1, user_changed_id) + Steam.CHAT_MEMBER_STATE_CHANGE_DISCONNECTED: state_string = "DISCONNECTED" print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string])