add player formatting and checking for active multiplayer instance

This commit is contained in:
Teatov 2025-02-13 17:15:46 +10:00
parent fff9a3eb11
commit 07cfb07cc6
7 changed files with 46 additions and 29 deletions

View File

@ -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"

View File

@ -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)

View File

@ -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():

View File

@ -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")

View File

@ -1,4 +1,5 @@
extends Node
var main_camera: Camera3D
var camera: Camera3D
var player: Player
var main: Main

View File

@ -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"):

View File

@ -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,