mirror of
https://gitlab.com/open-fpsz/open-fpsz.git
synced 2026-01-19 19:44:46 +00:00
78 lines
2.8 KiB
GDScript
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)
|