diff --git a/scenes/maps/el_test.gd b/scenes/maps/el_test.gd index 3662561..448dc64 100644 --- a/scenes/maps/el_test.gd +++ b/scenes/maps/el_test.gd @@ -11,18 +11,32 @@ var player_side: String func _ready() -> void: var char : Node3D = null var red_spawn: Node3D = $Spawns/Blue/SpawnArea + var position := red_spawn.global_position if multiplayer.is_server(): for i in GameServerManager.players: + print(i) char = ResourceLoader.load("res://scenes/utils/character.tscn").instantiate() char.name = str(GameServerManager.players[i].name) char.global_position = position var my_random_number = RandomNumberGenerator.new().randf_range(-2.0, 2.0) char.global_position = position char.global_position.x += my_random_number + $MultiplayerSpawner.spawn(char) + players.add_child(char) pass +func spawn_player(id: int): + var red_spawn: Node3D = $Spawns/Blue/SpawnArea + var position := red_spawn.global_position + var char = ResourceLoader.load("res://scenes/utils/character.tscn").instantiate() + char.name = str(GameServerManager.players[id].name) + char.global_position = position + var my_random_number = RandomNumberGenerator.new().randf_range(-2.0, 2.0) + char.global_position = position + char.global_position.x += my_random_number + # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: diff --git a/scenes/utils/menu.gd b/scenes/utils/menu.gd index bff08d1..2172566 100644 --- a/scenes/utils/menu.gd +++ b/scenes/utils/menu.gd @@ -1,22 +1,8 @@ extends Control +# Autoload named Lobby -# Called when the node enters the scene tree for the first time. -func _ready() -> void: - multiplayer.peer_connected.connect(_on_player_connected) - multiplayer.peer_disconnected.connect(_on_player_disconnected) - multiplayer.connected_to_server.connect(_on_connected_ok) - multiplayer.connection_failed.connect(_on_connected_fail) - multiplayer.server_disconnected.connect(_on_server_disconnected) - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -func _process(delta: float) -> void: - pass - -var peer = ENetMultiplayerPeer.new() - +# These signals can be connected to by a UI lobby scene or the game scene. signal player_connected(peer_id, player_info) signal player_disconnected(peer_id) signal server_disconnected @@ -25,28 +11,46 @@ const PORT = 7000 const DEFAULT_SERVER_IP = "127.0.0.1" # IPv4 localhost const MAX_CONNECTIONS = 20 +var players = {} +var my_random_number = RandomNumberGenerator.new().randf_range(-2.0, 2.0) +var player_info = {"name": str(my_random_number)} var players_loaded = 0 -var player_info = {"name": "Name"} -var players = {} +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + multiplayer.peer_connected.connect(_on_player_connected) + multiplayer.peer_disconnected.connect(_on_player_disconnected) + multiplayer.connected_to_server.connect(_on_connected_ok) + multiplayer.connection_failed.connect(_on_connected_fail) + multiplayer.server_disconnected.connect(_on_server_disconnected) -func _on_host_pressed() -> void: +func join_game(address = ""): + if address.is_empty(): + address = DEFAULT_SERVER_IP + var peer = ENetMultiplayerPeer.new() + var error = peer.create_client(address, PORT) + if error: + return error + multiplayer.multiplayer_peer = peer + +func create_game(): var peer = ENetMultiplayerPeer.new() var error = peer.create_server(PORT, MAX_CONNECTIONS) if error: - print(error) + return error multiplayer.multiplayer_peer = peer - players[1] = player_info - player_connected.emit(1, player_info) - GameServerManager.players[1] = {"id": "1", "name": "host"} + player_connected.emit(peer.get_unique_id(), player_info) + + func remove_multiplayer_peer(): multiplayer.multiplayer_peer = null # When the server decides to start the game from a UI scene, # do Lobby.load_game.rpc(filepath) @rpc("call_local", "reliable") -func load_game(game_scene_path): +func load_game(): + print("loading") get_tree().change_scene_to_file("res://scenes/maps/el_test.tscn") # Every peer will call this when they have loaded the game scene. @@ -54,40 +58,34 @@ func load_game(game_scene_path): func player_loaded(): if multiplayer.is_server(): players_loaded += 1 + players_loaded = players.size() if players_loaded == players.size(): - + #$/root/Game.start_game() players_loaded = 0 - -func _on_join_pressed() -> void: - var address = '127.0.0.1' - var peer = ENetMultiplayerPeer.new() - var error = peer.create_client(address, PORT) - if error: - print(error) - multiplayer.multiplayer_peer = peer - add_player.rpc_id(1, multiplayer.get_unique_id(), "guest") - -@rpc("call_remote") -func add_player(id: int, name: String): - if not GameServerManager.players.has(id): - GameServerManager.players[1] = {"id": str(id), "name": name} - -func _on_player_connected(id: Variant, player_info: Variant) -> void: - print(player_info) - _register_player.rpc_id(id, player_info) + +# When a peer connects, send them my player info. +# This allows transfer of all desired data for each player, not only the unique ID. +func _on_player_connected(id): + _register_player.rpc_id(1, player_info) @rpc("any_peer", "reliable") func _register_player(new_player_info): var new_player_id = multiplayer.get_remote_sender_id() players[new_player_id] = new_player_info + if multiplayer.is_server(): + print("registering a player") + print(player_info) + print(new_player_id) + GameServerManager.players[new_player_id] = new_player_info + player_connected.emit(new_player_id, new_player_info) - -func _on_player_disconnected(id: Variant) -> void: - pass + +func _on_player_disconnected(id): players.erase(id) player_disconnected.emit(id) + func _on_connected_ok(): var peer_id = multiplayer.get_unique_id() players[peer_id] = player_info @@ -96,17 +94,26 @@ func _on_connected_ok(): func _on_connected_fail(): multiplayer.multiplayer_peer = null - -func _on_server_disconnected() -> void: + + +func _on_server_disconnected(): multiplayer.multiplayer_peer = null players.clear() server_disconnected.emit() +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _on_host_pressed() -> void: + player_info = {"name": "host"} + _register_player(player_info) + create_game() - -@rpc("call_local", "reliable", "any_peer") -func start_game(): - get_tree().change_scene_to_file("res://scenes/maps/el_test.tscn") +func _on_join_pressed() -> void: + player_info = {"name": "guest"} + join_game() func _on_start_pressed() -> void: - start_game.rpc() + print("starting") + load_game.rpc() +func _process(delta: float) -> void: + if multiplayer.is_server(): + print(GameServerManager.players) diff --git a/scripts/character_controller.gd b/scripts/character_controller.gd index e6780c4..97fa862 100644 --- a/scripts/character_controller.gd +++ b/scripts/character_controller.gd @@ -32,6 +32,7 @@ var is_crouch: bool = false @onready var character: Node3D = $"." func _ready() -> void: + set_process(get_multiplayer_authority() == multiplayer.get_unique_id()) capture_mouse() func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseMotion: