1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
|
extends Control
signal joined
var current_map_idx := 0
var settings := {}
@onready var list: VBoxContainer = %PlayersList
func _ready() -> void:
if not multiplayer.is_server():
%StartButton.disabled = true
#%StartButton.queue_free()
%PlayersList.remove_child(%PlayersList.get_child(0))
%PlayersList.remove_child(%PlayersList.get_child(0))
if multiplayer.is_server():
set_map.rpc(current_map_idx)
joined.connect(func():
set_map.rpc(current_map_idx)
)
for idx in %Maps.get_child_count():
%Maps.get_child(idx).pressed.connect(func():
set_map.rpc(idx)
)
if not multiplayer.is_server():
set_map(0)
for node: Control in %Maps.get_children():
node.mouse_filter = Control.MOUSE_FILTER_IGNORE
Network.players_changed.connect(update_players)
update_players()
multiplayer.peer_disconnected.connect(remove_player)
multiplayer.peer_connected.connect(_on_peer_connected)
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
# reset map texture for clean load
%Thumbnail.texture = null
set_map(current_map_idx)
func update_players():
for id in Network.get_ordered_player_ids():
var player: Player = Network.get_player(id)
var control: Control = list.get_node_or_null(str(id))
if not control:
control = MarginContainer.new()
control.name = str(id)
var label = Label.new()
label.add_theme_color_override("font_color", player.get_color())
if id == multiplayer.get_unique_id():
label.add_theme_color_override("font_outline_color", Color(0.75, 0.75, 0.75, 0.75))
label.add_theme_constant_override("outline_size", 10)
control.add_child(label)
list.add_child(control)
joined.emit()
control.get_child(0).text = str(player.username)
control.get_child(0).tooltip_text = str(id)
list.move_child(control, Network.get_ordered_player_ids().find(id) + 1)
func remove_player(id):
list.remove_child(list.get_node(str(id)))
func _on_peer_connected(id):
Network._on_peer_connected(id)
func _on_peer_disconnected(id):
Network._on_peer_disconnected(id)
func _on_start_button_pressed() -> void:
start.rpc()
func _on_cancel_button_pressed() -> void:
multiplayer.multiplayer_peer.close()
get_tree().change_scene_to_file("res://UI/Start.tscn")
@rpc("authority", "call_local")
func start():
var packed_scene = %Maps.get_child(current_map_idx).get_meta("map_scene")
var scene = packed_scene.instantiate()
for setting in settings:
scene[setting] = settings[setting]
Client.change_scene_to_instance(scene)
@rpc("authority", "call_local")
func set_map(index: int):
current_map_idx = index
for node: Button in %Maps.get_children():
node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 0.5))
var node = %Maps.get_child(index)
var thumbnail = node.get_meta("thumbnail")
# settings
for child in %Settings.get_children():
child.queue_free()
if node.get_meta("settings"):
var scene = node.get_meta("map_scene").instantiate()
for setting in node.get_meta("settings", []):
settings[setting] = scene[setting]
var control = preload("res://UI/lobby_setting.tscn").instantiate()
control.label = setting
control.value = settings[setting]
control.disabled = !multiplayer.is_server()
if multiplayer.is_server():
control.value_changed.connect(func(value):
set_setting.rpc(setting, value)
)
%Settings.add_child(control)
node.add_theme_color_override("font_color", Color(1.0, 1.0, 1.0, 1.0))
%Thumbnail.texture = thumbnail
@rpc("authority", "call_local")
func set_setting(key: String, value: Variant):
settings[key] = value
if not multiplayer.is_server():
%Settings.get_node(key).value = value
|