From 8f255e28c386deb063ce5e59e4d500028571e629 Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Tue, 28 Jan 2025 23:54:14 +0100 Subject: [PATCH] WIP: Add a proper server logic --- scenes/maps/base/map_loader.gd | 6 +- .../base/player_spawner/player_spawner.gd | 6 +- scenes/utils/menus/main/main_menu.gd | 46 +++++++ scenes/utils/menus/main/main_menu.tscn | 128 ++++++++++++++++++ scripts/game_server_manager.gd | 66 ++++++++- scripts/player_manager.gd | 12 ++ 6 files changed, 257 insertions(+), 7 deletions(-) create mode 100644 scenes/utils/menus/main/main_menu.gd create mode 100644 scenes/utils/menus/main/main_menu.tscn create mode 100644 scripts/player_manager.gd diff --git a/scenes/maps/base/map_loader.gd b/scenes/maps/base/map_loader.gd index 3438193..9af9d7d 100644 --- a/scenes/maps/base/map_loader.gd +++ b/scenes/maps/base/map_loader.gd @@ -8,9 +8,14 @@ var player_spawner: PlayerSpawnerController var object_spawner: Node3D @onready var spawn_locations: SpawnController = $SpawnLocations +func _on_player_connected(id): + if multiplayer.is_server(): + GameServerManager.load_map.rpc_id(id, GameServerManager.current_map) + # add the player to the # Called when the node enters the scene tree for the first time. func _ready() -> void: + # add player spawner var err: Error = OK @@ -26,7 +31,6 @@ func _ready() -> void: _spawn_player() pass # Replace with function body. - # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass diff --git a/scenes/maps/base/player_spawner/player_spawner.gd b/scenes/maps/base/player_spawner/player_spawner.gd index ea66f65..31d4dd9 100644 --- a/scenes/maps/base/player_spawner/player_spawner.gd +++ b/scenes/maps/base/player_spawner/player_spawner.gd @@ -18,13 +18,11 @@ func _get_root() -> Node3D: # -- Spawn a player node and sync it across all peers func spawn_players(spawn_location: SpawnController) -> Error: - print("spawning players") var char : Node3D = null - print(GameServerManager.players) for i in GameServerManager.players: - var player_data = GameServerManager.players[i] + var player_data: PlayerState = GameServerManager.players[i] char = ResourceLoader.load("res://scenes/characters/placeholder.tscn").instantiate() - char.name = "PlayerPlaceholder_" + str(player_data.name) + char.name = "PlayerPlaceholder_" + str(player_data.id) var position = spawn_location.get_spawner(SpawnController.Sides.BLUE) char.global_position = position char.global_position = position diff --git a/scenes/utils/menus/main/main_menu.gd b/scenes/utils/menus/main/main_menu.gd new file mode 100644 index 0000000..31186f4 --- /dev/null +++ b/scenes/utils/menus/main/main_menu.gd @@ -0,0 +1,46 @@ +extends Node + +var player_manager: PlayerManager = PlayerManager.new() + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + var map_dir := DirAccess.open("res://scenes/maps/maps/") + + if map_dir: + map_dir.list_dir_begin() + var file_name = map_dir.get_next() + while file_name != "": + $CreateServer/Maps.add_item(file_name) + file_name = map_dir.get_next() + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass + + +func _on_create_server_pressed() -> void: + $CreateServer.visible = true + +func _on_join_server_pressed() -> void: + $JoinServer.visible = true + + + +func _on_create_button_pressed() -> void: + var chosen_map_index = $CreateServer/Maps.get_selected_items()[0] + var chosen_map = $CreateServer/Maps.get_item_text(chosen_map_index) + var path_tmpl := "res://scenes/maps/maps/%s" + var path := path_tmpl % chosen_map + GameServerManager.current_map = path + var err := GameServerManager.create_server(player_manager) + if err != OK: + print("couldn't create a server") + + +func _on_text_edit_text_changed() -> void: + player_manager.name = $TextEdit.text + + +func _on_join_button_pressed() -> void: + GameServerManager.join_server(player_manager, $JoinServer/IP.text, $JoinServer/Port.text.to_int()) diff --git a/scenes/utils/menus/main/main_menu.tscn b/scenes/utils/menus/main/main_menu.tscn new file mode 100644 index 0000000..a2d5597 --- /dev/null +++ b/scenes/utils/menus/main/main_menu.tscn @@ -0,0 +1,128 @@ +[gd_scene load_steps=2 format=3 uid="uid://s48rpcadnn47"] + +[ext_resource type="Script" path="res://scenes/utils/menus/main/main_menu.gd" id="1_yi7ba"] + +[node name="MainMenu" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_yi7ba") + +[node name="MainButtons" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 10 +anchor_right = 1.0 +grow_horizontal = 2 + +[node name="CreateServer" type="Button" parent="MainButtons"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -4.0 +offset_right = 4.0 +offset_bottom = 8.0 +grow_horizontal = 2 +text = "Create Server" + +[node name="JoinServer" type="Button" parent="MainButtons"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = 90.0 +offset_top = 3.0 +offset_right = 203.0 +offset_bottom = 34.0 +grow_horizontal = 2 +text = "Join Server" + +[node name="CreateServer" type="Control" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -532.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="Maps" type="ItemList" parent="CreateServer"] +layout_mode = 1 +anchors_preset = 8 +anchor_left = 0.5 +anchor_top = 0.5 +anchor_right = 0.5 +anchor_bottom = 0.5 +offset_left = -214.0 +offset_top = -905.0 +offset_right = 234.0 +offset_bottom = -386.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="CreateButton" type="Button" parent="CreateServer"] +layout_mode = 0 +offset_left = 236.0 +offset_top = 643.0 +offset_right = 282.0 +offset_bottom = 674.0 +text = "Start" + +[node name="JoinServer" type="Control" parent="."] +visible = false +layout_mode = 1 +anchors_preset = 11 +anchor_left = 1.0 +anchor_right = 1.0 +anchor_bottom = 1.0 +offset_left = -532.0 +grow_horizontal = 0 +grow_vertical = 2 + +[node name="JoinButton" type="Button" parent="JoinServer"] +layout_mode = 0 +offset_left = 205.0 +offset_top = 187.0 +offset_right = 251.0 +offset_bottom = 218.0 +text = "Start" + +[node name="IP" type="TextEdit" parent="JoinServer"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -240.5 +offset_right = 240.5 +offset_bottom = 58.0 +grow_horizontal = 2 +text = "127.0.0.1" + +[node name="Port" type="TextEdit" parent="JoinServer"] +layout_mode = 1 +anchors_preset = 5 +anchor_left = 0.5 +anchor_right = 0.5 +offset_left = -230.0 +offset_top = 69.0 +offset_right = 228.0 +offset_bottom = 129.0 +grow_horizontal = 2 +text = "27015" + +[node name="TextEdit" type="TextEdit" parent="."] +layout_mode = 1 +offset_right = 481.0 +offset_bottom = 58.0 +text = "Player Name" + +[connection signal="pressed" from="MainButtons/CreateServer" to="." method="_on_create_server_pressed"] +[connection signal="pressed" from="MainButtons/JoinServer" to="." method="_on_join_server_pressed"] +[connection signal="pressed" from="CreateServer/CreateButton" to="." method="_on_create_button_pressed"] +[connection signal="pressed" from="JoinServer/JoinButton" to="." method="_on_join_button_pressed"] +[connection signal="text_changed" from="TextEdit" to="." method="_on_text_edit_text_changed"] diff --git a/scripts/game_server_manager.gd b/scripts/game_server_manager.gd index 0a7a895..8879420 100644 --- a/scripts/game_server_manager.gd +++ b/scripts/game_server_manager.gd @@ -1,17 +1,79 @@ extends Node var players = {} - +var current_map: String = "" var local_player_health = 0 - +var player_state_global: PlayerState = PlayerState.new() # Called when the node enters the scene tree for the first time. @rpc("reliable", "call_local") func get_player_health(id: int) -> int: return players.get(id)["health"] +func _on_connected_ok(): + var player_state := PlayerState.new() + register_player.rpc_id(1, multiplayer.get_unique_id(), player_state_global.name) + + +@rpc("any_peer", "reliable", "call_remote") +func register_player(id: int, name: String): + print(name) + print(id) + var player_state := PlayerState.new() + player_state.id = id + player_state.name = name + players[multiplayer.get_remote_sender_id()] = player_state + print(players) + +func _on_player_connected(id): + if multiplayer.is_server(): + print(str(id) + " is connected to " + str(multiplayer.get_unique_id())) + GameServerManager.load_map.rpc_id(id, GameServerManager.current_map) + func _ready() -> void: + multiplayer.peer_connected.connect(_on_player_connected) + multiplayer.connected_to_server.connect(_on_connected_ok) pass # Replace with function body. # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: pass + +func set_map(name: String): + current_map = name + +func create_server(player_data: PlayerManager) -> Error: + var peer = ENetMultiplayerPeer.new() + var err = peer.create_server(27015, 30) + if err: + return err + multiplayer.multiplayer_peer = peer + if DisplayServer.get_name() != "headless": + var player_state := PlayerState.new() + player_state.id = 1 + player_state.name = player_data.name + players[1] = player_state + get_tree().change_scene_to_file(current_map) + return OK + +func join_server(player_data: PlayerManager, ip: String, port: int) -> Error: + var peer = ENetMultiplayerPeer.new() + var err = peer.create_client("127.0.0.1", 27015) + if err != OK: + return err + player_state_global.id = multiplayer.get_remote_sender_id() + player_state_global.name = player_data.name + multiplayer.multiplayer_peer = peer + register_player.rpc_id(1, player_state_global) + return OK + +@rpc("authority", "call_remote") +func load_map(map: String): + get_tree().change_scene_to_file(map) + + +func request_data_from_client(id: int): + send_data_to_server.rpc_id(id) + +@rpc("any_peer", "call_remote") +func send_data_to_server(): + pass diff --git a/scripts/player_manager.gd b/scripts/player_manager.gd new file mode 100644 index 0000000..0175cfa --- /dev/null +++ b/scripts/player_manager.gd @@ -0,0 +1,12 @@ +class_name PlayerManager extends Object + +var name: String + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + pass