open-fpsz/interfaces/scoreboard/scoreboard.gd
2024-04-25 07:33:26 +00:00

84 lines
3.2 KiB
GDScript

# This file is part of open-fpsz.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
class_name Scoreboard extends Control
@export var _entries : Dictionary = {}
class ScoreboardEntry:
var nickname : String
var kills : int
var score : int
var nickname_label : Label = Label.new()
var kills_label : Label = Label.new()
var score_label : Label = Label.new()
func _unhandled_input(event : InputEvent) -> void:
if event.is_action_pressed("scoreboard"):
show()
elif event.is_action_released("scoreboard"):
hide()
func add_player(player : Player) -> void:
_add_scoreboard_entry.rpc(player.player_id, player.nickname)
func remove_player(player : Player) -> void:
_remove_scoreboard_entry.rpc(player.player_id)
func increment_kill_count(player : Player) -> void:
_entries[player.player_id].kills += 1
func add_score_to_player(player : Player, amount : int) -> void:
var player_id : int = player.player_id
var entry : ScoreboardEntry = _entries[player_id]
_update_scoreboard_entry.rpc(player_id, entry.nickname, entry.kills, entry.score + amount)
@rpc("any_peer", "call_remote", "reliable")
func request_scoreboard_from_authority() -> void:
if is_multiplayer_authority():
var recipient_id : int = multiplayer.get_remote_sender_id()
for entry_player_id : int in _entries:
var entry : ScoreboardEntry = _entries[entry_player_id]
_add_scoreboard_entry.rpc_id(recipient_id, entry_player_id, entry.nickname, entry.kills, entry.score)
@rpc("authority", "call_local", "reliable")
func _add_scoreboard_entry(player_id : int, nickname : String, kills : int = 0, score : int = 0) -> void:
var new_entry : ScoreboardEntry = ScoreboardEntry.new()
_entries[player_id] = new_entry
%Scores.add_child(new_entry.nickname_label)
%Scores.add_child(new_entry.kills_label)
%Scores.add_child(new_entry.score_label)
_update_scoreboard_entry(player_id, nickname, kills, score)
@rpc("authority", "call_local", "reliable")
func _update_scoreboard_entry(player_id : int, nickname : String, kills : int, score : int) -> void:
var entry : ScoreboardEntry = _entries[player_id]
entry.nickname = nickname
entry.kills = kills
entry.score = score
_update_scoreboard_entry_ui(player_id)
@rpc("authority", "call_local", "reliable")
func _remove_scoreboard_entry(player_id : int) -> void:
var entry : ScoreboardEntry = _entries[player_id]
entry.nickname_label.queue_free()
entry.kills_label.queue_free()
entry.score_label.queue_free()
_entries.erase(player_id)
func _update_scoreboard_entry_ui(player_id : int) -> void:
var entry : ScoreboardEntry = _entries[player_id]
entry.nickname_label.text = entry.nickname
entry.kills_label.text = str(entry.kills)
entry.score_label.text = str(entry.score)