From 7bb69ce0bde759fe1610ea8e3b56195f0833eb9d Mon Sep 17 00:00:00 2001 From: Jibbajabbafic Date: Mon, 11 Mar 2024 22:58:21 +0000 Subject: [PATCH] feat(server): add game version check --- client/client_network.gd | 10 ++++++++-- server/server_network.gd | 19 ++++++++++++++----- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/client/client_network.gd b/client/client_network.gd index a34867a3..2208f879 100644 --- a/client/client_network.gd +++ b/client/client_network.gd @@ -118,6 +118,7 @@ func _on_connection_failed() -> void: func _on_connected_to_server() -> void: Logger.print(self, "Successfully connected to server!") is_connected = true + send_version_info() send_clock_sync_request() # Start calculating latency regularly $LatencyUpdater.start() @@ -158,6 +159,11 @@ func is_rpc_from_server() -> bool: return true +func send_version_info() -> void: + var version: String = ProjectSettings.get_setting("application/config/version") + rpc_id(SERVER_ID, "receive_version_info", version) + + func send_clock_sync_request() -> void: rpc_id(SERVER_ID, "receive_clock_sync_request", OS.get_system_time_msecs()) @@ -246,10 +252,10 @@ func send_kick_request(player_id: int) -> void: rpc_id(SERVER_ID, "receive_kick_request", player_id) -remote func receive_player_kicked() -> void: +remote func receive_player_kicked(reason: String) -> void: if is_rpc_from_server() == false: return - lost_connection("You have been kicked from the server") + lost_connection("Kicked from server: %s" % [reason]) remote func receive_host_change(new_host_id: int) -> void: diff --git a/server/server_network.gd b/server/server_network.gd index 60ba11ea..976ccf26 100644 --- a/server/server_network.gd +++ b/server/server_network.gd @@ -29,6 +29,7 @@ var _host_player_id := 0 setget set_host var player_state_collection := {} var player_list := {} var game_options := {} +var server_version := "" func _ready() -> void: @@ -90,6 +91,7 @@ func start_server( use_tls = false max_players = server_max_players game_options = DEFAULT_GAME_OPTIONS.duplicate() + server_version = ProjectSettings.get_setting("application/config/version") if forward_port: var upnp_handler = UpnpHandler.new() upnp_handler.set_name("UpnpHandler") @@ -241,13 +243,13 @@ remote func receive_kick_request(kick_player_id: int) -> void: ) return Logger.print(self, "Player %s kicked player %s" % [player_id, kick_player_id]) - kick_player(kick_player_id) + kick_player(kick_player_id, "Kicked by host") -func kick_player(player_id: int) -> void: - Logger.print(self, "Kicked player %s" % player_id) - rpc_id(player_id, "receive_player_kicked") - yield(get_tree().create_timer(1), "timeout") +func kick_player(player_id: int, reason: String) -> void: + Logger.print(self, "Kicked player %s for reason: %s" % [player_id, reason]) + rpc_id(player_id, "receive_player_kicked", reason) + yield(get_tree().create_timer(3), "timeout") # Just in case the player doesn't get the kicked message if player_id in multiplayer.get_network_connected_peers(): multiplayer.network_peer.disconnect_peer(player_id) @@ -420,6 +422,13 @@ func send_despawn_player(player_id: int) -> void: rpc("receive_despawn_player", player_id) +remote func receive_version_info(client_version: String) -> void: + var player_id = multiplayer.get_rpc_sender_id() + Logger.print(self, "Received client %s on version: %s" % [player_id, client_version]) + if client_version != server_version: + kick_player(player_id, "Version mismatch! Server is on: %s You have: %s" % [server_version, client_version]) + + remote func receive_clock_sync_request(client_time: int) -> void: var player_id = multiplayer.get_rpc_sender_id() rpc_id(player_id, "receive_clock_sync_response", OS.get_system_time_msecs(), client_time)