From bef8e923987d06ead0408e06f2c6be7379daffe2 Mon Sep 17 00:00:00 2001 From: unfa Date: Sat, 11 Sep 2021 16:32:38 +0200 Subject: [PATCH] Implemented score, rank and lead/gap HUD display --- Game/Assets/HUD/HUD.gd | 3 +++ Game/Assets/HUD/HUD.tscn | 18 ++++++++++++++++++ Game/Assets/Weapons/Weapon.gd | 7 ++++++- Game/Main.gd | 34 ++++++++++++++++++++++++++++++++++ Game/Main.tscn | 6 ++++++ 5 files changed, 67 insertions(+), 1 deletion(-) diff --git a/Game/Assets/HUD/HUD.gd b/Game/Assets/HUD/HUD.gd index f087a16..11c8243 100644 --- a/Game/Assets/HUD/HUD.gd +++ b/Game/Assets/HUD/HUD.gd @@ -15,6 +15,9 @@ func _ready(): func _process(delta): # if main.local_player == null: # player is dead ATM # print("local_player is null; PID is ", get_tree().multiplayer.get_network_unique_id(),"; respawn queue: ", main.respawn_queue) + if not get_tree().multiplayer.has_network_peer(): # don't do anything if we're offline + return + if main.spawn_queue.has(get_tree().multiplayer.get_network_unique_id()): var countdown = main.spawn_queue[get_tree().multiplayer.get_network_unique_id()] - main.uptime # countdown = round(countdown * 10) / 10 diff --git a/Game/Assets/HUD/HUD.tscn b/Game/Assets/HUD/HUD.tscn index a1a9106..5a63206 100644 --- a/Game/Assets/HUD/HUD.tscn +++ b/Game/Assets/HUD/HUD.tscn @@ -238,4 +238,22 @@ __meta__ = { "_edit_use_anchors_": false } +[node name="ScoreRank" type="Label" parent="."] +anchor_left = 1.0 +anchor_top = 0.5 +anchor_right = 1.0 +anchor_bottom = 0.5 +offset_left = -116.0 +offset_top = -27.0 +offset_bottom = 27.0 +text = "SCORE: X +RANK: Y" +align = 2 +valign = 1 +structured_text_bidi_override_options = [] +script = null +__meta__ = { +"_edit_use_anchors_": false +} + [connection signal="text_submitted" from="Chat/VBoxContainer/Typing/Editor" to="Chat" method="_on_Editor_text_submitted"] diff --git a/Game/Assets/Weapons/Weapon.gd b/Game/Assets/Weapons/Weapon.gd index 58a26bb..788d65b 100644 --- a/Game/Assets/Weapons/Weapon.gd +++ b/Game/Assets/Weapons/Weapon.gd @@ -1,6 +1,8 @@ extends Node3D #Hand Camera Head Player @onready var main = get_tree().root.get_node("Main") +@onready var hud = main.get_node("HUD") +@onready var score_rank = hud.get_node("ScoreRank") @onready var player = get_parent().get_parent().get_parent().get_parent() @onready var camera = get_parent().get_parent() @onready var ejector = find_node("Ejector") @@ -39,9 +41,12 @@ var impact_player = preload("res://Assets/Effects/ImpactBlood.tscn") main.player_list.players[player.get_network_authority()].score += 1 # give the killer a point main.rpc(&'player_list_update', main.player_list.get(player.get_network_authority()).serialize(), player.get_network_authority()) + + # update local HUD + # boardcast the new health value to all peers main.rpc(&'player_list_update', main.player_list.get(ray['collider'].get_network_authority()).serialize(), ray['collider'].get_network_authority()) - + main.update_hud() impact_vfx = impact_player.instantiate() else: diff --git a/Game/Main.gd b/Game/Main.gd index 7159edf..b88fd45 100644 --- a/Game/Main.gd +++ b/Game/Main.gd @@ -171,6 +171,34 @@ func _input(_event) -> void: #@remote func update_player_list(player_list): # self.player_list = player_list +func update_hud(): + hud.get_node("ScoreRank").text = "SCORE: " + str(player_list.get( get_tree().multiplayer.get_network_unique_id() ).score) + + var score = player_list.get( get_tree().multiplayer.get_network_unique_id() ).score + var scores = [] + + for i in player_list.players.values(): + scores.append(i.score) + + scores.sort() + scores.reverse() + var rank = scores.find(score) + 1 + + scores.remove(scores.find(score)) + scores.sort() + scores.reverse() + + var lead = score - scores[0] + + #var rank = + + hud.get_node("ScoreRank").text = "SCORE: " + str(score) + "\nRANK: " + + if lead > 0: + hud.get_node("ScoreRank").text += str(rank) + "\nLEAD: " + str(lead) + else: + hud.get_node("ScoreRank").text += str(rank) + "\nGAP: " + str(-lead) + @rpc func player_list_update(info, pid = get_tree().get_rpc_sender_id()): var new_info = PlayerInfo.new() new_info.deserialize(info) @@ -195,8 +223,13 @@ func _input(_event) -> void: pid = get_tree().get_rpc_sender_id() #disallow clients setting player_info for other players than themselves player_list.set(pid, new_info) rpc(&'player_list_update', info, pid) # broadcast the new entry to clients + else: #we are client, so we're getting data relayed from the server player_list.set(pid, new_info) # server relays other PID's data + + # update locla HUD + update_hud() + #if pid == get_tree().multiplayer.get_network_unique_id(): func push_local_player_info(): # var id = get_tree().multiplayer.get_network_unique_id() @@ -234,6 +267,7 @@ func create_player(pid: int, is_local:= false, respawn:= false) -> void: else: # respawn new_info = player_list.players[pid] # reuse previous name, color etc new_info.health = 100 # give the respawned player full health + focus = GameFocus.GAME # make sure the player has no menu displayed when they respawn player_list.set(pid, new_info) diff --git a/Game/Main.tscn b/Game/Main.tscn index de022f7..0cd4e64 100644 --- a/Game/Main.tscn +++ b/Game/Main.tscn @@ -23,6 +23,12 @@ structured_text_bidi_override_options = [] [node name="Editor" parent="HUD/Chat/VBoxContainer/Typing" index="1"] structured_text_bidi_override_options = [] +[node name="RespawnCountdown" parent="HUD" index="3"] +structured_text_bidi_override_options = [] + +[node name="ScoreRank" parent="HUD" index="4"] +structured_text_bidi_override_options = [] + [node name="GUI" parent="." instance=ExtResource( "2" )] [node name="Players" type="Node3D" parent="."]