feat: add dust2 level builder, player movement controller, and UI menu components
This commit is contained in:
+31
-19
@@ -10,6 +10,10 @@ var _host_lobby_players_list: ItemList
|
||||
func _ready() -> void:
|
||||
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
||||
|
||||
var nm = get_node_or_null("/root/NetworkManager")
|
||||
if nm:
|
||||
nm.connection_succeeded.connect(_on_connection_succeeded)
|
||||
|
||||
# ==========================================
|
||||
# BACKGROUND: 3D DIORAMA (Sliding Player)
|
||||
# ==========================================
|
||||
@@ -231,6 +235,7 @@ func _ready() -> void:
|
||||
var _gamemode_opt = OptionButton.new()
|
||||
_gamemode_opt.add_theme_font_size_override("font_size", 24)
|
||||
_gamemode_opt.add_item("Deathmatch", 0)
|
||||
_gamemode_opt.add_to_group("host_only_ui")
|
||||
_gamemode_opt.item_selected.connect(func(index: int):
|
||||
if get_node_or_null("/root/NetworkManager"):
|
||||
get_node("/root/NetworkManager").current_gamemode = _gamemode_opt.get_item_text(index)
|
||||
@@ -313,6 +318,7 @@ func _build_level_card(parent: Container, title: String, scene_path: String, gra
|
||||
overlay.add_child(lbl)
|
||||
|
||||
if is_multiplayer:
|
||||
btn.add_to_group("host_only_ui")
|
||||
btn.pressed.connect(func(): get_node("/root/NetworkManager").rpc_load_level.rpc(scene_path))
|
||||
else:
|
||||
btn.pressed.connect(func():
|
||||
@@ -350,16 +356,9 @@ func _on_multiplayer_back_pressed() -> void:
|
||||
_ui_vbox.show()
|
||||
|
||||
func _on_host_pressed() -> void:
|
||||
_multiplayer_panel.hide()
|
||||
_host_lobby_panel.show()
|
||||
var nm = get_node("/root/NetworkManager")
|
||||
nm.host_game()
|
||||
_update_lobby_players()
|
||||
if not nm.player_connected.is_connected(_on_network_player_connected):
|
||||
nm.player_connected.connect(_on_network_player_connected)
|
||||
nm.player_disconnected.connect(_on_network_player_disconnected)
|
||||
if not nm.stats_updated.is_connected(_update_lobby_players):
|
||||
nm.stats_updated.connect(_update_lobby_players)
|
||||
if nm.host_game() == OK:
|
||||
_on_connection_succeeded()
|
||||
|
||||
func _on_direct_connect_pressed() -> void:
|
||||
_multiplayer_panel.hide()
|
||||
@@ -373,7 +372,25 @@ func _on_connect_confirm_pressed() -> void:
|
||||
var ip = _direct_connect_panel.get_node("IPInput").text
|
||||
var port = _direct_connect_panel.get_node("PortInput").text.to_int()
|
||||
get_node("/root/NetworkManager").join_game(ip, port)
|
||||
# For simplicity, we can show a connecting label or just wait for the game to start via RPC
|
||||
|
||||
func _on_connection_succeeded() -> void:
|
||||
_direct_connect_panel.hide()
|
||||
_multiplayer_panel.hide()
|
||||
_host_lobby_panel.show()
|
||||
|
||||
var nm = get_node("/root/NetworkManager")
|
||||
var is_host = nm.multiplayer.is_server()
|
||||
for node in get_tree().get_nodes_in_group("host_only_ui"):
|
||||
if node is BaseButton:
|
||||
node.disabled = not is_host
|
||||
|
||||
if not nm.player_connected.is_connected(_on_network_player_connected):
|
||||
nm.player_connected.connect(_on_network_player_connected)
|
||||
nm.player_disconnected.connect(_on_network_player_disconnected)
|
||||
if not nm.stats_updated.is_connected(_update_lobby_players):
|
||||
nm.stats_updated.connect(_update_lobby_players)
|
||||
|
||||
_update_lobby_players()
|
||||
|
||||
func _on_lobby_back_pressed() -> void:
|
||||
_host_lobby_panel.hide()
|
||||
@@ -396,19 +413,14 @@ func _update_lobby_players() -> void:
|
||||
if not _host_lobby_players_list: return
|
||||
_host_lobby_players_list.clear()
|
||||
var nm = get_node("/root/NetworkManager")
|
||||
var host_name = SettingsManager.username
|
||||
var host_ping = 0
|
||||
if nm.player_stats.has(1): host_ping = nm.player_stats[1].get("ping", 0)
|
||||
|
||||
for pid in nm.connected_players:
|
||||
var p_ping = 0
|
||||
if nm.player_stats.has(pid): p_ping = nm.player_stats[pid].get("ping", 0)
|
||||
for pid in nm.player_stats.keys():
|
||||
var p_name = nm.player_stats[pid].get("username", "Unknown")
|
||||
var p_ping = nm.player_stats[pid].get("ping", 0)
|
||||
|
||||
if pid == 1:
|
||||
_host_lobby_players_list.add_item("%s (Host) - %sms" % [host_name, host_ping])
|
||||
_host_lobby_players_list.add_item("%s (Host) - %sms" % [p_name, p_ping])
|
||||
else:
|
||||
var p_name = "Player " + str(pid)
|
||||
if nm.player_stats.has(pid): p_name = nm.player_stats[pid].get("username", p_name)
|
||||
_host_lobby_players_list.add_item("%s - %sms" % [p_name, p_ping])
|
||||
|
||||
func _on_loadouts_pressed() -> void:
|
||||
|
||||
+17
-14
@@ -93,17 +93,16 @@ func _resume() -> void:
|
||||
func _respawn() -> void:
|
||||
_resume() # Unpause
|
||||
|
||||
# Find local player
|
||||
# Find local player using their unique multiplayer ID
|
||||
var local_player: Node3D = null
|
||||
var pid = multiplayer.get_unique_id()
|
||||
|
||||
if get_tree().current_scene.has_node("Players"):
|
||||
for p in get_tree().current_scene.get_node("Players").get_children():
|
||||
if p.has_method("is_multiplayer_authority") and p.is_multiplayer_authority():
|
||||
local_player = p
|
||||
break
|
||||
|
||||
if not local_player:
|
||||
local_player = get_tree().current_scene.get_node_or_null("Player")
|
||||
if get_tree().current_scene:
|
||||
local_player = get_tree().current_scene.get_node_or_null(str(pid))
|
||||
if not local_player:
|
||||
var spawner = get_tree().current_scene.get_node_or_null("PlayerSpawner")
|
||||
if spawner:
|
||||
local_player = spawner.get_node_or_null(str(pid))
|
||||
|
||||
if local_player and local_player.has_method("take_damage"):
|
||||
local_player.take_damage(9999, Vector3.ZERO)
|
||||
@@ -271,10 +270,12 @@ func _build_ui() -> void:
|
||||
user_save.pressed.connect(func():
|
||||
SettingsManager.username = user_input.text
|
||||
SettingsManager._save_settings()
|
||||
if NetworkManager.multiplayer.has_multiplayer_peer() and not NetworkManager.multiplayer.multiplayer_peer is OfflineMultiplayerPeer:
|
||||
NetworkManager.update_username.rpc_id(1, user_input.text)
|
||||
else:
|
||||
NetworkManager.update_username(user_input.text)
|
||||
var nm = get_node_or_null("/root/NetworkManager")
|
||||
if nm:
|
||||
if nm.multiplayer.has_multiplayer_peer() and not nm.multiplayer.multiplayer_peer is OfflineMultiplayerPeer:
|
||||
nm.update_username.rpc_id(1, user_input.text)
|
||||
else:
|
||||
nm.update_username(user_input.text)
|
||||
)
|
||||
user_hbox.add_child(user_save)
|
||||
|
||||
@@ -684,7 +685,9 @@ func _show_return_dialog() -> void:
|
||||
|
||||
func _return_to_main_menu() -> void:
|
||||
_resume() # Reset pause state and cursor mode
|
||||
NetworkManager.disconnect_game()
|
||||
var nm = get_node_or_null("/root/NetworkManager")
|
||||
if nm:
|
||||
nm.disconnect_game()
|
||||
get_tree().change_scene_to_file("res://ui/main_menu/main_menu.tscn")
|
||||
|
||||
func _show_main_menu() -> void:
|
||||
|
||||
Reference in New Issue
Block a user