1
Fork 0
mirror of https://github.com/Steffo99/nanogolf.git synced 2024-11-24 17:14:19 +00:00

Quit here for tonight

This commit is contained in:
Steffo 2024-03-10 05:51:36 +01:00
parent 2c51d84bbc
commit d77fb402a6
Signed by: steffo
GPG key ID: 5ADA3868646C3FC0
8 changed files with 219 additions and 38 deletions

View file

@ -1,6 +1,80 @@
extends Node extends Node
class_name Game class_name Game
## The name to be given to the player controlled by the local peer.
var local_player_name: String
func _on_peernode_identified(peernode: PeerNode, player_name: String) -> void: ## The color to be given to the player controlled by the local peer.
pass # Replace with function body. var local_player_color: Color
## The [PeerNodeDirectory] instance child of this node.
@onready var peer_dir: PeerNodeDirectory = $"PeerNodeDirectory"
## The [PlayerNodeDirectory] instance child of this node.
@onready var player_dir: PlayerNodeDirectory = $"PlayerNodeDirectory"
func init_signals() -> void:
multiplayer.connected_to_server.connect(_on_multiplayer_connected_to_server)
multiplayer.server_disconnected.connect(_on_multiplayer_disconnected_from_server)
multiplayer.connection_failed.connect(_on_multiplayer_connection_failed)
multiplayer.peer_connected.connect(_on_multiplayer_peer_connected)
multiplayer.peer_disconnected.connect(_on_multiplayer_peer_disconnected)
func _on_multiplayer_connected_to_server() -> void:
Log.peer(self, "Connected to server!")
func _on_multiplayer_disconnected_from_server() -> void:
Log.peer(self, "Disconnected from server.")
func _on_multiplayer_connection_failed() -> void:
Log.peer(self, "Connection failed...")
func _on_multiplayer_peer_connected(peer_id: int) -> void:
Log.peer(self, "Peer connected: %d" % peer_id)
if multiplayer.is_server():
for peernode in peer_dir.get_children():
peer_dir.rpc_create_peernode.rpc_id(peer_id, peernode.get_multiplayer_authority())
peer_dir.rpc_create_peernode.rpc(peer_id)
func _on_multiplayer_peer_disconnected(peer_id: int) -> void:
Log.peer(self, "Peer disconnected: %d" % peer_id)
if multiplayer.is_server():
peer_dir.rpc_destroy_peernode(peer_id)
func _on_peerdir_peernode_created(peernode: PeerNode) -> void:
Log.peer(self, "Peernode created: %d" % peernode.get_multiplayer_authority())
if peernode.is_multiplayer_authority():
peernode.rpc_identify.rpc(local_player_name)
func _on_peerdir_peernode_destroyed(peernode: PeerNode) -> void:
Log.peer(self, "Peernode destroyed: %d" % peernode.get_multiplayer_authority())
for playernode in player_dir.get_children():
if playernode.get_multiplayer_authority() == peernode.get_multiplayer_authority():
playernode.possess(1)
func _on_peerdir_peernode_identified(player_name: String, peernode: PeerNode) -> void:
Log.peer(self, "Peernode identified: %d%s" % [peernode.get_multiplayer_authority(), player_name])
player_dir.rpc_possess_playernode.rpc(player_name, peernode.get_multiplayer_authority())
func _on_playerdir_playernode_created(playernode: PlayerNode) -> void:
Log.peer(self, "Playernode `%s` created" % playernode.name)
func _on_playerdir_playernode_destroyed(playernode: PlayerNode) -> void:
Log.peer(self, "Playernode `%s` destroyed" % playernode.name)
# Technically, this shouldn't ever happen
func _on_playerdir_playernode_name_changed(old: String, new: String, playernode: PlayerNode) -> void:
Log.peer(self, "Playernode `%s` changed name: %s (was %s)" % [playernode.name, new, old])
func _on_playerdir_playernode_color_changed(old: Color, new: String, playernode: PlayerNode) -> void:
Log.peer(self, "Playernode `%s` changed color: %s (was %s)" % [playernode.name, new, old])
func _on_playerdir_playernode_possessed(old: int, new: int, playernode: PlayerNode) -> void:
Log.peer(self, "Playernode `%s` possessed: %d (was %d)" % [playernode.name, new, old])
if playernode.is_multiplayer_authority():
playernode.rpc_set_name.rpc(local_player_name)
playernode.rpc_set_color.rpc(local_player_color)

View file

@ -1,12 +1,19 @@
[gd_scene load_steps=3 format=3 uid="uid://b4w6ungwwjxsg"] [gd_scene load_steps=4 format=3 uid="uid://dyxwp5rnxiff7"]
[ext_resource type="Script" path="res://scenes/game.gd" id="1_cdtng"] [ext_resource type="Script" path="res://scenes/game.gd" id="1_cdtng"]
[ext_resource type="PackedScene" uid="uid://cwj0fyj6obj6r" path="res://scenes/multiple_players_tracker.tscn" id="2_f2gy2"] [ext_resource type="PackedScene" uid="uid://7ux0cl08c2ho" path="res://scenes/peernode_directory.tscn" id="1_p0gju"]
[ext_resource type="PackedScene" uid="uid://d3jo4swi2c7ae" path="res://scenes/playernode_directory.tscn" id="2_pvlqw"]
[node name="Game" type="Node"] [node name="Game" type="Node"]
script = ExtResource("1_cdtng") script = ExtResource("1_cdtng")
[node name="MultiplePlayersTracker" parent="." instance=ExtResource("2_f2gy2")] [node name="PeerNodeDirectory" parent="." instance=ExtResource("1_p0gju")]
[connection signal="created" from="MultiplePlayersTracker" to="." method="_on_single_player_tracker_created"] [node name="PlayerNodeDirectory" parent="." instance=ExtResource("2_pvlqw")]
[connection signal="trackers_changed" from="MultiplePlayersTracker" to="." method="_on_trackers_changed"]
[connection signal="child_entered_tree" from="PeerNodeDirectory" to="." method="_on_peerdir_peernode_created"]
[connection signal="child_exiting_tree" from="PeerNodeDirectory" to="." method="_on_peerdir_peernode_destroyed"]
[connection signal="peernode_identified" from="PeerNodeDirectory" to="." method="_on_peerdir_peernode_identified"]
[connection signal="playernode_color_changed" from="PlayerNodeDirectory" to="." method="_on_playerdir_playernode_color_changed"]
[connection signal="playernode_name_changed" from="PlayerNodeDirectory" to="." method="_on_playerdir_playernode_name_changed"]
[connection signal="playernode_possessed" from="PlayerNodeDirectory" to="." method="_on_playerdir_playernode_possessed"]

View file

@ -61,7 +61,8 @@ func init_client_game(player_name: String, player_color: Color, server_address:
scene_tree.set_multiplayer(smp, ^"/root/Main/Client") scene_tree.set_multiplayer(smp, ^"/root/Main/Client")
client_game_instance.init_signals() client_game_instance.init_signals()
client_game_instance.init_identity(player_name, player_color) client_game_instance.local_player_name = player_name
client_game_instance.local_player_color = player_color
smp.set_multiplayer_peer(peer) smp.set_multiplayer_peer(peer)
func deinit_client_game(): func deinit_client_game():
@ -74,8 +75,18 @@ func init_lobby_menu():
lobby_menu_instance.leave_confirmed.connect(_on_leave_confirmed) lobby_menu_instance.leave_confirmed.connect(_on_leave_confirmed)
lobby_menu_instance.start_confirmed.connect(_on_start_confirmed) lobby_menu_instance.start_confirmed.connect(_on_start_confirmed)
interface_instance.add_child(lobby_menu_instance) interface_instance.add_child(lobby_menu_instance)
client_game_instance.player_dir.child_entered_tree.connect(lobby_menu_instance.players_list._on_playernode_created)
client_game_instance.player_dir.child_exiting_tree.connect(lobby_menu_instance.players_list._on_playernode_destroyed)
client_game_instance.player_dir.playernode_name_changed.connect(lobby_menu_instance.players_list._on_playernode_name_changed)
client_game_instance.player_dir.playernode_color_changed.connect(lobby_menu_instance.players_list._on_playernode_color_changed)
client_game_instance.player_dir.playernode_possessed.connect(lobby_menu_instance.players_list._on_playernode_possessed)
func deinit_lobby_menu(): func deinit_lobby_menu():
client_game_instance.player_dir.child_entered_tree.disconnect(lobby_menu_instance.players_list._on_playernode_created)
client_game_instance.player_dir.child_exiting_tree.disconnect(lobby_menu_instance.players_list._on_playernode_destroyed)
client_game_instance.player_dir.playernode_name_changed.disconnect(lobby_menu_instance.players_list._on_playernode_name_changed)
client_game_instance.player_dir.playernode_color_changed.disconnect(lobby_menu_instance.players_list._on_playernode_color_changed)
client_game_instance.player_dir.playernode_possessed.disconnect(lobby_menu_instance.players_list._on_playernode_possessed)
lobby_menu_instance.queue_free() lobby_menu_instance.queue_free()
func _ready(): func _ready():
@ -86,13 +97,11 @@ func _on_hosting_confirmed(player_name: String, player_color: Color, server_port
init_server_game(server_port) init_server_game(server_port)
init_client_game(player_name, player_color, "127.0.0.1", server_port) init_client_game(player_name, player_color, "127.0.0.1", server_port)
init_lobby_menu() init_lobby_menu()
client_game_instance.trackers_changed.connect(lobby_menu_instance._on_trackers_changed)
func _on_connecting_confirmed(player_name: String, player_color: Color, server_address: String, server_port: int): func _on_connecting_confirmed(player_name: String, player_color: Color, server_address: String, server_port: int):
deinit_main_menu() deinit_main_menu()
init_client_game(player_name, player_color, server_address, server_port) init_client_game(player_name, player_color, server_address, server_port)
init_lobby_menu() init_lobby_menu()
client_game_instance.trackers_changed.connect(lobby_menu_instance._on_trackers_changed)
func _on_leave_confirmed(): func _on_leave_confirmed():
deinit_lobby_menu() deinit_lobby_menu()

View file

@ -29,7 +29,7 @@ func rpc_create_peernode(peer_id: int):
peernodes_by_id[peer_id] = peernode peernodes_by_id[peer_id] = peernode
peernode.set_multiplayer_authority(peer_id) peernode.set_multiplayer_authority(peer_id)
peernode.identified.connect(_on_peernode_identified.bind(peernode)) peernode.identified.connect(_on_peernode_identified.bind(peernode))
add_child(peernode) add_child(peernode, true)
## Destroy the [PeerNode] for the given peer_id, or do nothing if it does not exist. ## Destroy the [PeerNode] for the given peer_id, or do nothing if it does not exist.
@ -44,8 +44,8 @@ func rpc_destroy_peernode(peer_id: int):
## Called on the server when a [PeerNode] calls [method rpc_identify] for itself. ## Called on the server when a [PeerNode] calls [method rpc_identify] for itself.
func _on_peernode_identified(peernode: PeerNode, player_name: String): func _on_peernode_identified(player_name: String, peernode: PeerNode):
peernode_identified.emit(peernode, player_name) peernode_identified.emit(player_name, peernode)
## Emitted on the server when a [PeerNode] calls [method rpc_identify] for itself. ## Emitted on the server when a [PeerNode] calls [method rpc_identify] for itself.
signal peernode_identified(peernode: PeerNode, player_name: String) signal peernode_identified(player_name: String, peernode: PeerNode)

View file

@ -2,7 +2,14 @@ extends Label
class_name PlayerLabel class_name PlayerLabel
func update_from_tracker(tracker: SinglePlayerTracker): func set_player_name(value: String):
text = tracker.player_name text = value
add_theme_color_override("font_color", tracker.player_color)
modulate.a = 1.0 if tracker.get_multiplayer_authority() != 1 else 0.3 func set_player_color(value: Color):
add_theme_color_override("font_color", value)
func set_possessed(value: int):
if value == 1:
modulate.a = 0.3
else:
modulate.a = 1.0

View file

@ -2,4 +2,60 @@ extends Node
class_name PlayerNode class_name PlayerNode
# TODO ## The name of the player represented by this node.
var player_name: String
## The color of the player represented by this node.
var player_color: Color
## Change the [field player_name] everywhere.
@rpc("authority", "call_local", "reliable")
func rpc_set_name(value: String):
if player_name != value:
var old_value: String = player_name
player_name = value
name_changed.emit(old_value, value)
## Change the [field player_color] everywhere.
@rpc("authority", "call_local", "reliable")
func rpc_set_color(value: Color):
if player_color != value:
var old_value: Color = player_color
player_color = value
color_changed.emit(old_value, value)
## Change the multiplayer authority on the local client.
##
## Used by [PlayerNodeDirectory], provided here for the purpose of signal emission.
func possess(value: int) -> void:
var old_value: int = get_multiplayer_authority()
if old_value != value:
set_multiplayer_authority(value)
possessed.emit(old_value, value)
## Prompt the multiplayer authority for this node to call [method rpc_set_name] again with the current value.
##
## Used to repeat [field player_name] to new peers.
@rpc("any_peer", "call_local", "reliable")
func rpc_query_name():
if is_multiplayer_authority():
rpc_set_name.rpc(player_name)
## Prompt the multiplayer authority for this node to call [method rpc_set_color] again with the current value.
##
## Used to repeat [field player_color] to new peers.
@rpc("any_peer", "call_local", "reliable")
func rpc_query_color():
if is_multiplayer_authority():
rpc_set_color.rpc(player_color)
## Emitted when the name changes on the local scene because of [method rpc_set_name].
signal name_changed(old: String, new: String)
## Emitted when the color changes on the local scene because of [method rpc_set_color].
signal color_changed(old: Color, new: Color)
## Emitted when the multiplayer authority of this [Node] is changed via [method possess].
signal possessed(old: int, new: int)

View file

@ -16,12 +16,6 @@ var playernodes_by_name: Dictionary = {}
func get_playernode(player_name: String) -> PlayerNode: func get_playernode(player_name: String) -> PlayerNode:
return playernodes_by_name.get(player_name) return playernodes_by_name.get(player_name)
## Called everywhere when a [PlayerNode] is renamed.
func _on_playernode_renamed(old_name: String, new_name: String) -> void:
var playernode = playernodes_by_name.get(old_name)
playernodes_by_name.erase(old_name)
playernodes_by_name[new_name] = playernode
## Create a new [PlayerNode] for the given [param player_name], giving control of it to [param peer_id]. ## Create a new [PlayerNode] for the given [param player_name], giving control of it to [param peer_id].
## ##
@ -34,11 +28,32 @@ func rpc_possess_playernode(player_name: String, peer_id: int):
# If the playernode does not exist, create it # If the playernode does not exist, create it
if playernode == null: if playernode == null:
playernode = playernode_scene.instantiate() playernode = playernode_scene.instantiate()
add_child(playernode) playernode.name_changed.connect(_on_playernode_name_changed.bind(playernode))
playernode.color_changed.connect(_on_playernode_color_changed.bind(playernode))
playernode.possessed.connect(_on_playernode_possessed.bind(playernode))
add_child(playernode, true)
# If the multiplayer authority does not match the requested one, make it match # If the multiplayer authority does not match the requested one, make it match
if playernode.get_multiplayer_authority() != peer_id: playernode.possess(peer_id)
playernode.set_multiplayer_authority(peer_id)
child_repossessed.emit(playernode)
func _on_playernode_name_changed(old: String, new: String, playernode: PlayerNode):
playernodes_by_name.erase(old)
playernodes_by_name[new] = playernode
playernode_name_changed.emit(old, new, playernode)
func _on_playernode_color_changed(old: Color, new: Color, playernode: PlayerNode):
playernode_color_changed.emit(old, new, playernode)
func _on_playernode_possessed(old: int, new: int, playernode: PlayerNode):
playernode_possessed.emit(old, new, playernode)
## Emitted when the name of one of the children [PlayerNode]s changes on the local scene.
signal playernode_name_changed(old: String, new: String, playernode: PlayerNode)
## Emitted when the name of one of the children [PlayerNode]s changes on the local scene.
signal playernode_color_changed(old: Color, new: Color, playernode: PlayerNode)
## Emitted everywhere when one of the children [PlayerNode]s has changed multiplayer authority. ## Emitted everywhere when one of the children [PlayerNode]s has changed multiplayer authority.
signal child_repossessed(playernode: PlayerNode) signal playernode_possessed(old: int, new: int, playernode: PlayerNode)

View file

@ -4,13 +4,26 @@ class_name PlayersList
@onready var layout = $"Scrollable/Layout" @onready var layout = $"Scrollable/Layout"
const player_label_scene = preload("res://scenes/player_label.tscn") const label_scene: PackedScene = preload("res://scenes/player_label.tscn")
var labels_by_playernode: Dictionary = {}
func _on_trackers_changed(trackers: Dictionary): func _on_playernode_created(playernode: PlayerNode) -> void:
for child in layout.get_children(): var label_instance = label_scene.instantiate()
child.queue_free() labels_by_playernode[playernode] = label_instance
for tracker in trackers.values(): layout.add_child(label_instance)
var player_label_instance = player_label_scene.instantiate()
player_label_instance.update_from_tracker(tracker) func _on_playernode_destroyed(playernode: PlayerNode) -> void:
layout.add_child(player_label_instance) labels_by_playernode[playernode].queue_free()
labels_by_playernode.erase(playernode)
func _on_playernode_name_changed(_old: String, new: String, playernode: PlayerNode) -> void:
labels_by_playernode[playernode].set_player_name(new)
func _on_playernode_color_changed(_old: Color, new: Color, playernode: PlayerNode) -> void:
labels_by_playernode[playernode].set_player_color(new)
func _on_playernode_possessed(_old: int, new: int, playernode: PlayerNode) -> void:
labels_by_playernode[playernode].set_possessed(new)