open-fpsz/modes/scoreboard.gd
2024-04-22 20:05:05 +00:00

78 lines
2.8 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 Node
@export var _entries : Dictionary = {}
class ScoreboardEntry:
var nickname : String
var kills : int
var score : int
func add_entry(player : Player) -> void:
var new_entry : ScoreboardEntry = ScoreboardEntry.new()
new_entry.nickname = player.nickname
new_entry.kills = 0
new_entry.score = 0
_entries[player.player_id] = new_entry
_send_scoreboard_entry.rpc(player.player_id, new_entry.nickname, new_entry.kills, new_entry.score)
func remove_entry(player : Player) -> void:
_entries.erase(player.player_id)
_broadcast_player_removed(player)
func add_score_to_player(player : Player, amount : int) -> void:
_entries[player.player_id].score += amount
func increment_kill_count(player : Player) -> void:
_entries[player.player_id].kills += 1
func get_entries() -> Array:
return _entries.values()
@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()
_clear_scoreboard.rpc_id(recipient_id)
for entry_key : int in _entries:
var entry : ScoreboardEntry = _entries[entry_key]
_send_scoreboard_entry.rpc_id(recipient_id, entry_key, entry.nickname, entry.kills, entry.score)
@rpc("authority", "reliable")
func _clear_scoreboard() -> void:
_entries.clear()
@rpc("authority", "reliable")
func _send_scoreboard_entry(player_id : int, nickname : String, kills : int, score : int) -> void:
var new_entry : ScoreboardEntry = ScoreboardEntry.new()
new_entry.nickname = nickname
new_entry.kills = kills
new_entry.score = score
_entries[player_id] = new_entry
@rpc("authority", "reliable")
func _remove_scoreboard_entry(player_id : int) -> void:
_entries.erase(player_id)
func broadcast_player_score_update(player : Player) -> void:
var player_id : int = player.player_id
var player_score_entry : ScoreboardEntry = _entries[player_id]
_send_scoreboard_entry.rpc(player_id, player_score_entry.nickname, player_score_entry.kills, player_score_entry.score)
func _broadcast_player_removed(player : Player) -> void:
var player_id : int = player.player_id
_remove_scoreboard_entry.rpc(player_id)