diff --git a/entities/components/match_participant_component.gd b/entities/components/match_participant_component.gd index 2a450ee..20ef898 100644 --- a/entities/components/match_participant_component.gd +++ b/entities/components/match_participant_component.gd @@ -1,22 +1,24 @@ class_name MatchParticipantComponent extends MultiplayerSynchronizer signal player_id_changed(new_player_id : int) -signal nickname_changed(new_nickname : String) +signal username_changed(new_username : String) -@export var nickname : String = "": +@export var username : String = "": set(value): - nickname = value - nickname_changed.emit(nickname) + username = value + username_changed.emit(username) + @export var player_id : int: set(value): player_id = value player_id_changed.emit(player_id) + @export var team_id : int = 1 -func _ready() -> void: +func _enter_tree() -> void: root_path = "." replication_config = SceneReplicationConfig.new() - for prop : String in ["player_id", "team_id", "nickname"]: + for prop : String in ["player_id", "team_id", "username"]: var prop_path : NodePath = NodePath(prop).get_as_property_path() replication_config.add_property(prop_path) replication_config.property_set_replication_mode( diff --git a/entities/player/player.gd b/entities/player/player.gd index 3617bbd..0146edb 100644 --- a/entities/player/player.gd +++ b/entities/player/player.gd @@ -64,7 +64,7 @@ static var pawn_player : Player func _ready() -> void: match_participant_component.player_id_changed.connect(_setup_pawn) - match_participant_component.nickname_changed.connect(iff._on_username_changed) + match_participant_component.username_changed.connect(iff._on_username_changed) match_participant_component.player_id_changed.connect(input.update_multiplayer_authority) health_component.health_changed.connect(hud._on_health_changed) diff --git a/interfaces/scoreboard/scoreboard.gd b/interfaces/scoreboard/scoreboard.gd index 83a9494..0684e8b 100644 --- a/interfaces/scoreboard/scoreboard.gd +++ b/interfaces/scoreboard/scoreboard.gd @@ -17,10 +17,10 @@ class_name Scoreboard extends Control @export var _entries : Dictionary = {} class ScoreboardEntry: - var nickname : String + var username : String var kills : int var score : int - var nickname_label : Label = Label.new() + var username_label : Label = Label.new() var kills_label : Label = Label.new() var score_label : Label = Label.new() @@ -31,7 +31,7 @@ func _unhandled_input(event : InputEvent) -> void: hide() func add_participant(participant : MatchParticipantComponent) -> void: - _add_scoreboard_entry.rpc(participant.player_id, participant.nickname) + _add_scoreboard_entry.rpc(participant.player_id, participant.username) func remove_participant(participant : MatchParticipantComponent) -> void: _remove_scoreboard_entry.rpc(participant.player_id) @@ -42,7 +42,7 @@ func increment_kill_count(participant : MatchParticipantComponent) -> void: func add_score_to_player(participant : MatchParticipantComponent, amount : int) -> void: var player_id : int = participant.player_id var entry : ScoreboardEntry = _entries[player_id] - _update_scoreboard_entry.rpc(player_id, entry.nickname, entry.kills, entry.score + amount) + _update_scoreboard_entry.rpc(player_id, entry.username, entry.kills, entry.score + amount) @rpc("any_peer", "call_remote", "reliable") func request_scoreboard_from_authority() -> void: @@ -50,21 +50,21 @@ func request_scoreboard_from_authority() -> void: 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) + _add_scoreboard_entry.rpc_id(recipient_id, entry_player_id, entry.username, 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: +func _add_scoreboard_entry(player_id : int, username : 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.username_label) %Scores.add_child(new_entry.kills_label) %Scores.add_child(new_entry.score_label) - _update_scoreboard_entry(player_id, nickname, kills, score) + _update_scoreboard_entry(player_id, username, kills, score) @rpc("authority", "call_local", "reliable") -func _update_scoreboard_entry(player_id : int, nickname : String, kills : int, score : int) -> void: +func _update_scoreboard_entry(player_id : int, username : String, kills : int, score : int) -> void: var entry : ScoreboardEntry = _entries[player_id] - entry.nickname = nickname + entry.username = username entry.kills = kills entry.score = score _update_scoreboard_entry_ui(player_id) @@ -72,13 +72,13 @@ func _update_scoreboard_entry(player_id : int, nickname : String, kills : int, s @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.username_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.username_label.text = entry.username entry.kills_label.text = str(entry.kills) entry.score_label.text = str(entry.score) diff --git a/modes/multiplayer/multiplayer.gd b/modes/multiplayer/multiplayer.gd index ef386fe..d659940 100644 --- a/modes/multiplayer/multiplayer.gd +++ b/modes/multiplayer/multiplayer.gd @@ -28,7 +28,7 @@ class_name Multiplayer extends Node signal connected_to_server signal connection_failed -func start_server(port : int, map_scene : PackedScene, nickname : String = "mercury") -> void: +func start_server(port : int, map_scene : PackedScene, username : String = "mercury") -> void: # setup enet server peer var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() peer.create_server(port, MAX_CLIENTS) @@ -38,19 +38,19 @@ func start_server(port : int, map_scene : PackedScene, nickname : String = "merc _load_map(map_scene) if DisplayServer.get_name() != "headless": - add_player(1, nickname) + add_player(1, username) -func join_server(host : String, port : int, nickname : String) -> void: +func join_server(host : String, port : int, username : String) -> void: var peer : ENetMultiplayerPeer = ENetMultiplayerPeer.new() peer.create_client(host, port) - multiplayer.connected_to_server.connect(_on_connected_to_server.bind(nickname)) + multiplayer.connected_to_server.connect(_on_connected_to_server.bind(username)) multiplayer.connection_failed.connect(_on_connection_failed) multiplayer.multiplayer_peer = peer -func _on_connected_to_server(nickname : String) -> void: +func _on_connected_to_server(username : String) -> void: connected_to_server.emit() scoreboard.request_scoreboard_from_authority.rpc() - _join_match.rpc(nickname) + _join_match.rpc(username) func _on_connection_failed() -> void: connection_failed.emit() @@ -63,14 +63,14 @@ func respawn_player(player : Player) -> void: var spawn_location : Vector3 = MapsManager.get_player_spawn().position player.respawn.rpc(spawn_location) -func add_player(peer_id : int, nickname : String) -> void: +func add_player(peer_id : int, username : String) -> void: var player : Player = PLAYER.instantiate() player.name = str(peer_id) player.died.connect(_on_player_died) players.add_child(player) player.match_participant_component.player_id = peer_id player.match_participant_component.team_id = ($RabbitScoringComponent as RabbitScoringComponent)._team_chasers.team_id - player.match_participant_component.nickname = nickname + player.match_participant_component.username = username player.global_position = MapsManager.get_player_spawn().position $DeathmatchScoringComponent.subscribe_player(player) scoreboard.add_participant(player.match_participant_component) @@ -100,10 +100,13 @@ func _add_flag() -> void: if flagstand: flag.global_position = flagstand.global_position +# This method notifies the server that a player wants to join the match. It +# takes a single [param username] parameter and is invoked remotely by clients. @rpc("any_peer", "reliable") -func _join_match(nickname : String) -> void: - if is_multiplayer_authority(): - add_player(multiplayer.get_remote_sender_id(), nickname) +func _join_match(username : String) -> void: + if multiplayer.is_server(): + # add player to server with unique id and username + add_player(multiplayer.get_remote_sender_id(), username) func _exit_tree() -> void: # @NOTE: The `is_multiplayer_authority` method in `_exit_tree` push an error diff --git a/tests/test_scoreboard.gd b/tests/test_scoreboard.gd index 8bd62ab..90bc77f 100644 --- a/tests/test_scoreboard.gd +++ b/tests/test_scoreboard.gd @@ -27,12 +27,12 @@ func test_that_new_scoreboard_is_empty() -> void: func test_that_added_entry_is_added_correctly() -> void: var participant : MatchParticipantComponent = MatchParticipantComponent.new() - participant.nickname = "test_nickname" + participant.username = "test_username" _subject.add_participant(participant) var entries : Array = _subject._entries.values() assert_eq(1, entries.size()) var tested_entry : Scoreboard.ScoreboardEntry = entries[0] - assert_eq("test_nickname", tested_entry.nickname) + assert_eq("test_username", tested_entry.username) assert_eq(0, tested_entry.kills) assert_eq(0, tested_entry.score) participant.free()