From ad4c8140e2bdb0a6f0bb5f91168455101502cf29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ensar=20Saraj=C4=8Di=C4=87?= Date: Thu, 20 Jan 2022 19:11:54 +0100 Subject: [PATCH] Add leaderboards to multiplayer games --- network/multiplayer_controller.gd | 5 +-- scenes/base_track_level.gd | 1 - scenes/trackgui.gd | 35 +++++++++++++++++++- scenes/trackgui.tscn | 53 ++++++++++++++++++++++--------- scenes/tracks/track.gd | 6 ++++ 5 files changed, 79 insertions(+), 21 deletions(-) diff --git a/network/multiplayer_controller.gd b/network/multiplayer_controller.gd index 89e6f80..c9987c7 100644 --- a/network/multiplayer_controller.gd +++ b/network/multiplayer_controller.gd @@ -45,7 +45,6 @@ func create_client(address, port, vehicle): func _peer_connected(peer_id): - print("_peer_connected(%s)" % peer_id) peers[peer_id] = false rpc_id(peer_id, "add_player", get_tree().get_network_unique_id(), current_vehicle) if get_tree().get_network_unique_id() == 1: @@ -53,14 +52,12 @@ func _peer_connected(peer_id): func _peer_disconnected(peer_id): - print("_peer_disconnected(%s)" % peer_id) peers.erase(peer_id) destroy_player(peer_id) - print("new peers state: %s" % peers) func _connected_to_server(): - print("_connected_to_server") + pass func _connection_failed(): diff --git a/scenes/base_track_level.gd b/scenes/base_track_level.gd index bf2caa2..1dbc37a 100644 --- a/scenes/base_track_level.gd +++ b/scenes/base_track_level.gd @@ -46,7 +46,6 @@ func reset_player_to(node_to_reset_to: Node, player_node: BuggedVehicle) -> void func _spawn_in_player(): - print("SPAWNING IN PLAYER") reset_player_to(track.get_furthest_checkpoint(), player_node) add_child(player_node) add_child(gui) diff --git a/scenes/trackgui.gd b/scenes/trackgui.gd index 243cba0..594c18f 100644 --- a/scenes/trackgui.gd +++ b/scenes/trackgui.gd @@ -1,15 +1,22 @@ extends MarginContainer var best_time = -1 +var leaderboards_data = {} onready var time_value = $VBoxContainer/HBoxContainer/TimeValue onready var best_time_value = $VBoxContainer/HBoxContainer/BestTimeValue -onready var wrong_way_label = $VBoxContainer/WrongWayLabel +onready var wrong_way_label = $CenterContainer/WrongWayLabel +onready var leaderboards = $VBoxContainer/LeaderboardsLine +onready var leaderboards_list = $VBoxContainer/LeaderboardsLine/VBoxContainer/Leaderboards func _ready() -> void: time_value.text = "NaN" best_time_value.text = "NaN" + if MultiplayerController.is_online(): + leaderboards.visible = true + else: + leaderboards.visible = false func _on_time_updated(new_time: float) -> void: @@ -20,6 +27,9 @@ func _on_lap_complete(lap_time: float) -> void: if lap_time < best_time or best_time < 0: best_time = lap_time best_time_value.text = _format_time(best_time) + if MultiplayerController.is_online(): + update_leaderboard_time(String(get_tree().get_network_unique_id()), lap_time) + rpc("update_leaderboard_time", String(get_tree().get_network_unique_id()), lap_time) func _on_wrong_way_detected() -> void: @@ -33,3 +43,26 @@ func _format_time(time: float) -> String: var second = floor((time / 1000.0) - minute * 60) var millisecond = time - minute * 60 * 1000 - second * 1000 return "%02d:%02d.%03d" % [minute, second, millisecond] + + +remote func update_leaderboard_time(peer_id: String, lap_time: float): + leaderboards_data[peer_id] = lap_time + + var leaderboards_sorted = [] + for peer in leaderboards_data: + leaderboards_sorted.append([peer, leaderboards_data[peer]]) + + leaderboards_sorted.sort_custom(self, "_leaderbords_comparison") + + for child in leaderboards_list.get_children(): + child.queue_free() + + for entry in leaderboards_sorted: + var label = Label.new() + label.text = "%s - %s" % [entry[0], _format_time(entry[1])] + + leaderboards_list.add_child(label) + + +func _leaderbords_comparison(left: Array, right: Array) -> bool: + return left[1] < right[1] diff --git a/scenes/trackgui.tscn b/scenes/trackgui.tscn index e5d56d4..18f7c5e 100644 --- a/scenes/trackgui.tscn +++ b/scenes/trackgui.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=4 format=2] +[gd_scene load_steps=5 format=2] [ext_resource path="res://assets/fonts/kenney-future-narrow.ttf" type="DynamicFontData" id=1] [ext_resource path="res://scenes/trackgui.gd" type="Script" id=2] @@ -9,6 +9,10 @@ outline_size = 2 outline_color = Color( 1, 1, 1, 0.317647 ) font_data = ExtResource( 1 ) +[sub_resource type="Theme" id=2] +default_font = SubResource( 1 ) +Label/colors/font_color = Color( 0.482353, 0, 0, 1 ) + [node name="TrackGUI" type="MarginContainer"] anchor_right = 1.0 anchor_bottom = 1.0 @@ -16,6 +20,7 @@ margin_left = 20.0 margin_top = 20.0 margin_right = -20.0 margin_bottom = -20.0 +theme = SubResource( 2 ) script = ExtResource( 2 ) __meta__ = { "_edit_use_anchors_": false @@ -34,8 +39,6 @@ margin_right = 289.0 margin_bottom = 41.0 size_flags_horizontal = 3 size_flags_vertical = 0 -custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) text = "Current lap -" align = 1 valign = 1 @@ -46,8 +49,6 @@ margin_right = 489.0 margin_bottom = 41.0 size_flags_horizontal = 3 size_flags_vertical = 0 -custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) text = "12:23.245" __meta__ = { "_edit_use_anchors_": false @@ -59,8 +60,6 @@ margin_right = 562.0 margin_bottom = 41.0 size_flags_horizontal = 3 size_flags_vertical = 0 -custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) __meta__ = { "_edit_use_anchors_": false } @@ -71,8 +70,6 @@ margin_right = 784.0 margin_bottom = 41.0 size_flags_horizontal = 3 size_flags_vertical = 0 -custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) text = "Best Lap -" [node name="BestTimeValue" type="Label" parent="VBoxContainer/HBoxContainer"] @@ -81,22 +78,48 @@ margin_right = 984.0 margin_bottom = 41.0 size_flags_horizontal = 3 size_flags_vertical = 0 -custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) text = "01:23.256" __meta__ = { "_edit_use_anchors_": false } -[node name="WrongWayLabel" type="Label" parent="VBoxContainer"] -visible = false +[node name="LeaderboardsLine" type="HBoxContainer" parent="VBoxContainer"] margin_top = 49.0 margin_right = 984.0 -margin_bottom = 90.0 +margin_bottom = 98.0 +alignment = 2 + +[node name="VBoxContainer" type="VBoxContainer" parent="VBoxContainer/LeaderboardsLine"] +margin_left = 684.0 +margin_right = 984.0 +margin_bottom = 49.0 + +[node name="LeaderboardsLabel" type="Label" parent="VBoxContainer/LeaderboardsLine/VBoxContainer"] +margin_right = 300.0 +margin_bottom = 41.0 +text = "Leaderboards" + +[node name="Leaderboards" type="VBoxContainer" parent="VBoxContainer/LeaderboardsLine/VBoxContainer"] +margin_top = 49.0 +margin_right = 300.0 +margin_bottom = 49.0 +__meta__ = { +"_edit_use_anchors_": false +} + +[node name="CenterContainer" type="CenterContainer" parent="."] +margin_right = 984.0 +margin_bottom = 560.0 + +[node name="WrongWayLabel" type="Label" parent="CenterContainer"] +visible = false +margin_left = 238.0 +margin_top = 259.0 +margin_right = 745.0 +margin_bottom = 300.0 size_flags_horizontal = 3 size_flags_vertical = 0 custom_colors/font_color = Color( 0.482353, 0, 0, 1 ) -custom_fonts/font = SubResource( 1 ) text = "Wrong Way! Turn Around!" align = 1 __meta__ = { diff --git a/scenes/tracks/track.gd b/scenes/tracks/track.gd index eb87eed..512db2e 100644 --- a/scenes/tracks/track.gd +++ b/scenes/tracks/track.gd @@ -52,6 +52,12 @@ func _process(_delta: float) -> void: func _on_body_entered_area(body: Node, area: Area) -> void: + if ( + MultiplayerController.is_online() + and body.get_network_master() != get_tree().get_network_unique_id() + ): + return + if body.get_groups().has("car"): if area.get_index() < last_checkpoint || abs(area.get_index() - last_checkpoint) > 1: emit_signal("wrong_way")