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..b6198b5 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(): + pass + + 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) @@ -134,9 +139,10 @@ 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[id].queue_free() players.erase(id) + func _on_connection_failed() -> void: @@ -147,7 +153,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" + Steam.CHAT_MEMBER_STATE_CHANGE_DISCONNECTED: state_string = "DISCONNECTED" print("[LOBBY INFO] User %s has %s the lobby." % [user_changed_id, state_string]) diff --git a/splunk/project.godot b/splunk/project.godot index 542b2e2..53a35ad 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")