diff --git a/Phase2/Networking/Client/Lobby/Lobby.gd b/Phase2/Networking/Client/Lobby/Lobby.gd index 14904b9..aa032a3 100644 --- a/Phase2/Networking/Client/Lobby/Lobby.gd +++ b/Phase2/Networking/Client/Lobby/Lobby.gd @@ -1,5 +1,33 @@ extends Control +onready var player_name = $CenterContainer/VBoxContainer/GridContainer/NameLineEdit -func _on_Button_pressed(): +onready var selected_IP = $CenterContainer/VBoxContainer/GridContainer/IPLineEdit + +onready var selected_port = $CenterContainer/VBoxContainer/GridContainer/PortLineEdit + +onready var waiting_room = $WaitingRoom + +onready var ready_btn = $WaitingRoom/CenterContainer/VBoxContainer/ReadyButton + +func _ready(): + player_name.text = Save.save_data["player_name"] + selected_IP.text = Server.DEFAULT_IP + selected_port.text = str(Server.DEFAULT_PORT) + +func show_waiting_room(): + waiting_room.popup_centered() + +func _on_ReadyBtn_pressed(): + ready_btn.disabled = true + +func _on_NameLineEdit_text_changed(_new_text): + Save.save_data["Player_name"] = player_name.text + Save.save_game() + +func _on_JoinButton_pressed(): + Server.selected_IP = selected_IP.text + Server.selected_port = int(selected_port.text) Server._connect_to_server() + show_waiting_room() + diff --git a/Phase2/Networking/Client/Lobby/Lobby.tscn b/Phase2/Networking/Client/Lobby/Lobby.tscn index 7033fbc..ab5c758 100644 --- a/Phase2/Networking/Client/Lobby/Lobby.tscn +++ b/Phase2/Networking/Client/Lobby/Lobby.tscn @@ -1,21 +1,89 @@ -[gd_scene load_steps=2 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://Lobby/Lobby.gd" type="Script" id=1] +[ext_resource path="res://Lobby/WatingRoom.tscn" type="PackedScene" id=2] -[node name="Control" type="Control"] +[node name="Lobby" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 script = ExtResource( 1 ) +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0.231373, 0.231373, 0.258824, 1 ) + [node name="CenterContainer" type="CenterContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 -[node name="Button" type="Button" parent="CenterContainer"] -margin_left = 468.0 -margin_top = 290.0 -margin_right = 556.0 -margin_bottom = 310.0 +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] +margin_left = 338.0 +margin_top = 207.0 +margin_right = 685.0 +margin_bottom = 393.0 +custom_constants/separation = 20 + +[node name="LobbyLabel" type="Label" parent="CenterContainer/VBoxContainer"] +margin_right = 347.0 +margin_bottom = 14.0 +text = "Lobby" +align = 1 + +[node name="GridContainer" type="GridContainer" parent="CenterContainer/VBoxContainer"] +margin_top = 34.0 +margin_right = 347.0 +margin_bottom = 146.0 +custom_constants/vseparation = 20 +custom_constants/hseparation = 20 +columns = 2 + +[node name="NameLabel" type="Label" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_top = 5.0 +margin_right = 77.0 +margin_bottom = 19.0 +text = "Name:" + +[node name="NameLineEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_left = 97.0 +margin_right = 347.0 +margin_bottom = 24.0 +rect_min_size = Vector2( 250, 0 ) + +[node name="IPLabel" type="Label" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_top = 49.0 +margin_right = 77.0 +margin_bottom = 63.0 +text = "IP Address:" + +[node name="IPLineEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_left = 97.0 +margin_top = 44.0 +margin_right = 347.0 +margin_bottom = 68.0 +rect_min_size = Vector2( 250, 0 ) + +[node name="PortLabel" type="Label" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_top = 93.0 +margin_right = 77.0 +margin_bottom = 107.0 +text = "Port:" + +[node name="PortLineEdit" type="LineEdit" parent="CenterContainer/VBoxContainer/GridContainer"] +margin_left = 97.0 +margin_top = 88.0 +margin_right = 347.0 +margin_bottom = 112.0 +rect_min_size = Vector2( 250, 0 ) + +[node name="JoinButton" type="Button" parent="CenterContainer/VBoxContainer"] +margin_top = 166.0 +margin_right = 347.0 +margin_bottom = 186.0 text = "Join Session" -[connection signal="pressed" from="CenterContainer/Button" to="." method="_on_Button_pressed"] +[node name="WaitingRoom" parent="." instance=ExtResource( 2 )] +visible = false + +[connection signal="text_changed" from="CenterContainer/VBoxContainer/GridContainer/NameLineEdit" to="." method="_on_NameLineEdit_text_changed"] +[connection signal="pressed" from="CenterContainer/VBoxContainer/JoinButton" to="." method="_on_JoinButton_pressed"] diff --git a/Phase2/Networking/Client/Lobby/WaitingRoom.gd b/Phase2/Networking/Client/Lobby/WaitingRoom.gd new file mode 100644 index 0000000..3e78ecf --- /dev/null +++ b/Phase2/Networking/Client/Lobby/WaitingRoom.gd @@ -0,0 +1,12 @@ +extends Popup + +onready var player_list = $CenterContainer/VBoxContainer/ItemList + +func _ready(): + player_list.clear() + +func refresh_players(players): + player_list.clear() + for player_id in players: + var player = players[player_id]["Player_name"] + player_list.add_item(player, null, false) diff --git a/Phase2/Networking/Client/Lobby/WatingRoom.tscn b/Phase2/Networking/Client/Lobby/WatingRoom.tscn new file mode 100644 index 0000000..cbac84f --- /dev/null +++ b/Phase2/Networking/Client/Lobby/WatingRoom.tscn @@ -0,0 +1,47 @@ +[gd_scene format=2] + +[node name="WatingRoom" type="Popup" groups=["WaitingRoom"]] +visible = true +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="ColorRect" type="ColorRect" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 +color = Color( 0.109804, 0.129412, 0.243137, 1 ) + +[node name="CenterContainer" type="CenterContainer" parent="."] +anchor_right = 1.0 +anchor_bottom = 1.0 + +[node name="VBoxContainer" type="VBoxContainer" parent="CenterContainer"] +margin_left = 412.0 +margin_top = 194.0 +margin_right = 612.0 +margin_bottom = 406.0 + +[node name="Label" type="Label" parent="CenterContainer/VBoxContainer"] +margin_right = 200.0 +margin_bottom = 31.0 +text = "Waiting Room +" +align = 1 +valign = 1 + +[node name="ItemList" type="ItemList" parent="CenterContainer/VBoxContainer"] +margin_top = 35.0 +margin_right = 200.0 +margin_bottom = 188.0 +rect_min_size = Vector2( 200, 0 ) +custom_constants/vseparation = 10 +items = [ "Player 1", null, false, "Player 2", null, false, "Player 3", null, false, "Player 4", null, false ] +auto_height = true +same_column_width = true +fixed_column_width = 200 +icon_mode = 0 + +[node name="ReadyButton" type="Button" parent="CenterContainer/VBoxContainer"] +margin_top = 192.0 +margin_right = 200.0 +margin_bottom = 212.0 +text = "Ready" diff --git a/Phase2/Networking/Client/Save/Save.gd b/Phase2/Networking/Client/Save/Save.gd new file mode 100644 index 0000000..399cb93 --- /dev/null +++ b/Phase2/Networking/Client/Save/Save.gd @@ -0,0 +1,29 @@ +extends Node + + +const save_file = "user://save_file.json" + +var save_data = {} + + +# Called when the node enters the scene tree for the first time. +func _ready(): + save_data = get_data() + +func get_data(): + var file = File.new() + + if not file.file_exists(save_file): + save_data = {"player_name": "Unnamed"} + save_game() + file.open(save_file, File.READ) + var content = file.get_as_text() + var data = parse_json(content) + save_data = data + file.close() + return(data) + +func save_game(): + var save_game = File.new() + save_game.open(save_file, File.WRITE) + save_game.store_line(to_json(save_data)) diff --git a/Phase2/Networking/Client/Server/Server.gd b/Phase2/Networking/Client/Server/Server.gd index a11e01e..2a98880 100644 --- a/Phase2/Networking/Client/Server/Server.gd +++ b/Phase2/Networking/Client/Server/Server.gd @@ -19,7 +19,7 @@ func _ready(): func _connect_to_server(): get_tree().connect("connected_to_server", self, "_connected_ok") - network.create_client(DEFAULT_IP, DEFAULT_PORT) + network.create_client(selected_IP, selected_port) get_tree().set_network_peer(network) func _player_connected(id): @@ -30,9 +30,22 @@ func _player_disconnected(id): func _connected_ok(): print("Successfully connected to server") + register_player() + rpc_id(1, "send_player_info", local_player_id, player_data) func _connected_fail(): print("Failed to connect") func _server_disconnected(): print("Server Disconnected") + + +func register_player(): + local_player_id = get_tree().get_network_unique_id() + player_data = Save.save_data + players[local_player_id] = player_data + + +sync func update_waiting_room(): + get_tree().call_group("WaitingRoom", "refresh_players", players) + diff --git a/Phase2/Networking/Client/project.godot b/Phase2/Networking/Client/project.godot index fa1373a..aedc444 100644 --- a/Phase2/Networking/Client/project.godot +++ b/Phase2/Networking/Client/project.godot @@ -17,6 +17,7 @@ config/icon="res://icon.png" [autoload] Server="*res://Server/Server.gd" +Save="*res://Save/Save.gd" [gui] diff --git a/Phase2/Networking/Server/Server/Server.gd b/Phase2/Networking/Server/Server/Server.gd index 3bb7296..8d01c78 100644 --- a/Phase2/Networking/Server/Server/Server.gd +++ b/Phase2/Networking/Server/Server/Server.gd @@ -4,6 +4,8 @@ var network = NetworkedMultiplayerENet.new() var port = 8080 var max_players = 4 +var players = {} + func _ready(): start_server() @@ -21,3 +23,7 @@ func _player_connected(player_id): func _player_disconnected(player_id): print("Player: " + str(player_id) + " Disconnected") +remote func send_player_info(id, player_data): + players[id] = player_data + rset("players", players) + rpc("update_waiting_room")