diff --git a/project.godot b/project.godot index 78e342f..30fb31c 100644 --- a/project.godot +++ b/project.godot @@ -40,7 +40,6 @@ gdscript/warnings/integer_division=0 window/size/viewport_width=1920 window/size/viewport_height=1080 -window/size/always_on_top=true window/size/window_width_override=1280 window/size/window_height_override=720 window/stretch/mode="canvas_items" diff --git a/scenes/player.tscn b/scenes/player.tscn index 35b49c9..bb66317 100644 --- a/scenes/player.tscn +++ b/scenes/player.tscn @@ -23,6 +23,7 @@ properties/2/replication_mode = 1 [node name="Player" type="CharacterBody3D"] collision_layer = 2 script = ExtResource("1_82m0t") +_respawn_height = null [node name="CollisionShape3D" type="CollisionShape3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) diff --git a/scripts/debug/debugger.gd b/scripts/debug/debugger.gd index 484bef9..7b056d9 100644 --- a/scripts/debug/debugger.gd +++ b/scripts/debug/debugger.gd @@ -112,7 +112,7 @@ func _update_visibility() -> void: func _unproject(pos: Vector3) -> Vector2: - return Referencer.main_camera.unproject_position(pos) + return Referencer.camera.unproject_position(pos) func _update_controls_label() -> void: @@ -196,8 +196,8 @@ func _append_event(key: String, frame: int, args: Array[Variant]) -> void: func _draw_vector(from: Vector3, to: Vector3, color: Color) -> void: if ( - not Referencer.main_camera.is_position_in_frustum(from) - and not Referencer.main_camera.is_position_in_frustum(to) + not Referencer.camera.is_position_in_frustum(from) + and not Referencer.camera.is_position_in_frustum(to) ): return @@ -223,7 +223,7 @@ func _draw_triangle( func _draw_marker(pos: Vector3, radius: float, color: Color) -> void: - if not Referencer.main_camera.is_position_in_frustum(pos): + if not Referencer.camera.is_position_in_frustum(pos): return var x_start := _unproject(pos + (Vector3.LEFT * radius)) @@ -240,7 +240,7 @@ func _draw_marker(pos: Vector3, radius: float, color: Color) -> void: func _draw_circle(pos: Vector3, color: Color) -> void: - if not Referencer.main_camera.is_position_in_frustum(pos): + if not Referencer.camera.is_position_in_frustum(pos): return var point := _unproject(pos) @@ -284,7 +284,7 @@ func _on_control_draw() -> void: _set_label_texts() - if !Referencer.main_camera: + if !Referencer.camera: return for v: Dictionary in _vectors_to_draw.values(): diff --git a/scripts/globals/networker.gd b/scripts/globals/networker.gd index 3d45239..99cb854 100644 --- a/scripts/globals/networker.gd +++ b/scripts/globals/networker.gd @@ -7,10 +7,10 @@ signal network_error(message: String) const DEFAULT_PORT: int = 10567 const MAX_PEERS: int = 20 -var _peer: ENetMultiplayerPeer +var players := {} +var _peer: ENetMultiplayerPeer var _local_player_info := {"name": ""} -var _players := {} var _title_scene := preload("res://scenes/title.tscn") var _main_scene := preload("res://scenes/main.tscn") @@ -27,7 +27,7 @@ func _ready() -> void: func _process(_delta: float) -> void: Debugger.text("_local_player_info", _local_player_info) - Debugger.text("_players", _players) + Debugger.text("players", players) func set_local_player_info(username: String) -> void: @@ -52,7 +52,7 @@ func host_game(dedicated: bool = false) -> void: _load_main() if not dedicated: - _players[1] = _local_player_info + players[1] = _local_player_info player_connected.emit(1, _local_player_info) _add_player(multiplayer.get_unique_id()) @@ -75,6 +75,17 @@ func join_game(address: String) -> void: _load_main() +func is_active() -> bool: + return ( + multiplayer.multiplayer_peer.get_connection_status() + == MultiplayerPeer.CONNECTION_CONNECTED + ) + + +func format_player(peer_id: int) -> String: + return "[" + str(peer_id) + ": " + players[peer_id]["name"] + "]" + + func _switch_scene(from: Node, to: PackedScene) -> void: if from: from.queue_free() @@ -106,7 +117,7 @@ func _remove_player(peer_id: int) -> void: if not multiplayer.is_server(): return - print("Removing player ", peer_id) + print("Removing player ", format_player(peer_id)) var player_holder: Node = $/root/Main/Players var player := player_holder.get_node_or_null(str(peer_id)) if player: @@ -115,31 +126,31 @@ func _remove_player(peer_id: int) -> void: @rpc("any_peer", "reliable") func _register_player(player_info: Dictionary) -> void: - print("Registering player ", player_info) var peer_id := multiplayer.get_remote_sender_id() + print("Registering player ", peer_id, " ", player_info) if peer_id == 1 and !player_info["name"]: - print("Registered player's id is ",peer_id, " and name is empty, so skipping") + print("Registered player's id is ", peer_id, " and name is empty, so skipping") return - _players[peer_id] = player_info + players[peer_id] = player_info player_connected.emit(peer_id, player_info) func _on_multiplayer_peer_connected(peer_id: int) -> void: print("Peer connected ", peer_id) - _add_player(peer_id) _register_player.rpc_id(peer_id, _local_player_info) + _add_player(peer_id) func _on_multiplayer_peer_disconnected(peer_id: int) -> void: - print("Peer disconnected ", peer_id) - _players.erase(peer_id) + print("Peer disconnected ", format_player(peer_id)) _remove_player(peer_id) + players.erase(peer_id) func _on_multiplayer_connected_to_server() -> void: print("Connected to server") var peer_id := multiplayer.get_unique_id() - _players[peer_id] = _local_player_info + players[peer_id] = _local_player_info player_connected.emit(peer_id, _local_player_info) @@ -151,6 +162,6 @@ func _on_multiplayer_connection_failed() -> void: func _on_multiplayer_server_disconnected() -> void: printerr("Server disconnected") - _players.clear() + players.clear() _switch_scene($/root/Main, _title_scene) network_error.emit("Server disconnected") diff --git a/scripts/globals/referencer.gd b/scripts/globals/referencer.gd index 4468191..fd12cdf 100644 --- a/scripts/globals/referencer.gd +++ b/scripts/globals/referencer.gd @@ -1,4 +1,5 @@ extends Node -var main_camera: Camera3D +var camera: Camera3D var player: Player +var main: Main diff --git a/scripts/main.gd b/scripts/main.gd index 09f5e6c..ed41f9e 100644 --- a/scripts/main.gd +++ b/scripts/main.gd @@ -1,5 +1,9 @@ +class_name Main extends Node +func _exit_tree() -> void: + Referencer.main = null + func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("menu"): diff --git a/scripts/player.gd b/scripts/player.gd index e8ebeec..bb0b407 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -11,6 +11,7 @@ const FALL_ACCELERATION: float = 25 @export var _respawn_height: float = -100 +var _peer_id: int = 1 var _respawn_point: Vector3 @onready var _camera: Camera3D = $Camera3D @@ -18,32 +19,32 @@ var _respawn_point: Vector3 func _enter_tree() -> void: - set_multiplayer_authority(str(name).to_int()) + _peer_id = str(name).to_int() + set_multiplayer_authority(_peer_id) func _ready() -> void: - _name_label.text = str(name) if not is_multiplayer_authority(): return _respawn_point = global_position _camera.make_current() Referencer.player = self - Referencer.main_camera = _camera - print("Player ", name, " ready") + Referencer.camera = _camera + print("Player ", Networker.format_player(_peer_id), " ready") func _exit_tree() -> void: - if not is_multiplayer_authority(): + if Networker.is_active() and not is_multiplayer_authority(): return Referencer.player = null - Referencer.main_camera = null - print("Player ", name, " exiting tree") + Referencer.camera = null + print("Player ", Networker.format_player(_peer_id), " exiting tree") func _process(delta: float) -> void: - if not is_multiplayer_authority(): + if Networker.is_active() and not is_multiplayer_authority(): Debugger.vector( "look" + str(name), _camera.global_position,