feat(multiplayer): ENet networking + player/world sync + lobby menu + chat

Add dedicated server / host / client modes via NetworkManager autoload,
PlayerSyncComponent (20 Hz unreliable RPC), WorldSyncComponent (authoritative
block break/place), ChatManager (F2), LobbyMenu scene, updated MainMenu
with Solo/Heberger/Rejoindre/Quitter buttons. Port changed to 7777
(9999 occupied by sntlkeyssrvr on this machine). Mobs disabled in multi
(spawn solo only). Solo mode untouched.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Floppyrj45
2026-04-19 17:48:48 +02:00
parent 9546fcd96b
commit 5db858527e
15 changed files with 748 additions and 48 deletions

44
scripts/net/LobbyMenu.gd Normal file
View File

@@ -0,0 +1,44 @@
extends Control
@onready var _ip_input: LineEdit = $Panel/VBox/IPInput
@onready var _port_input: LineEdit = $Panel/VBox/PortInput
@onready var _status_label: Label = $Panel/VBox/StatusLabel
@onready var _connect_btn: Button = $Panel/VBox/ConnectBtn
@onready var _back_btn: Button = $Panel/VBox/BackBtn
func _ready() -> void:
_ip_input.text = "127.0.0.1"
_port_input.text = str(NetworkManager.DEFAULT_PORT)
_status_label.text = ""
NetworkManager.connection_succeeded.connect(_on_connected)
NetworkManager.connection_failed.connect(_on_failed)
_connect_btn.pressed.connect(_on_connect_pressed)
_back_btn.pressed.connect(_on_back_pressed)
func _on_connect_pressed() -> void:
var address: String = _ip_input.text.strip_edges()
var port: int = int(_port_input.text.strip_edges())
if address.length() == 0:
_status_label.text = "Adresse invalide"
return
_status_label.text = "Connexion en cours..."
_connect_btn.disabled = true
NetworkManager.join_server(address, port)
func _on_connected() -> void:
_status_label.text = "Connecte!"
get_tree().change_scene_to_file("res://scenes/Main.tscn")
func _on_failed() -> void:
_status_label.text = "Connexion echouee"
_connect_btn.disabled = false
func _on_back_pressed() -> void:
get_tree().change_scene_to_file("res://scenes/MainMenu.tscn")