update holiday

This commit is contained in:
2026-01-01 05:21:25 +08:00
parent c5e9d073fa
commit 7423e29443
12 changed files with 273 additions and 37 deletions
+31 -8
View File
@@ -74,9 +74,24 @@ func _ready():
# Get player slot references
_setup_player_slots()
# Set player name from profile
# Set player name from profile and configure input visibility
if player_name_input:
player_name_input.text = UserProfileManager.get_display_name()
# Get the parent container for the input to hide/show properly
var input_section = player_name_input.get_parent()
if AuthManager.is_guest:
# Guest user - show name input and let them enter a name
if input_section:
input_section.visible = true
player_name_input.text = "Guest"
player_name_input.editable = true
else:
# Logged-in user - hide name input and use profile name automatically
if input_section:
input_section.visible = false
player_name_input.text = UserProfileManager.get_display_name()
# Also set the LobbyManager name immediately
LobbyManager.local_player_name = UserProfileManager.get_display_name()
# Connect button signals - Main Menu
create_room_btn.pressed.connect(_on_create_room_pressed)
@@ -168,9 +183,13 @@ func _show_panel(panel_name: String) -> void:
# =============================================================================
func _on_create_room_pressed() -> void:
LobbyManager.local_player_name = player_name_input.text.strip_edges()
if LobbyManager.local_player_name.is_empty():
LobbyManager.local_player_name = "Host"
# Use profile name for logged-in users, or input name for guests
if AuthManager.is_guest:
LobbyManager.local_player_name = player_name_input.text.strip_edges()
if LobbyManager.local_player_name.is_empty():
LobbyManager.local_player_name = "Guest"
else:
LobbyManager.local_player_name = UserProfileManager.get_display_name()
connection_status.text = "Creating room..."
LobbyManager.create_room("Room %d" % randi_range(1000, 9999))
@@ -206,9 +225,13 @@ func _on_join_pressed() -> void:
connection_status.text = "No room selected"
return
LobbyManager.local_player_name = player_name_input.text.strip_edges()
if LobbyManager.local_player_name.is_empty():
LobbyManager.local_player_name = "Player"
# Use profile name for logged-in users, or input name for guests
if AuthManager.is_guest:
LobbyManager.local_player_name = player_name_input.text.strip_edges()
if LobbyManager.local_player_name.is_empty():
LobbyManager.local_player_name = "Guest"
else:
LobbyManager.local_player_name = UserProfileManager.get_display_name()
connection_status.text = "Joining room..."
LobbyManager.join_room(match_id)
+6 -6
View File
@@ -957,7 +957,7 @@ func _on_leaderboard_updated(sorted_scores: Array):
for p in get_tree().get_nodes_in_group("Players"):
player_data.append({
"peer_id": p.get_multiplayer_authority(),
"name": p.name,
"name": p.display_name if not p.display_name.is_empty() else str(p.name),
"score": goals_cycle_manager.get_player_score(p.get_multiplayer_authority()) if goals_cycle_manager else 0
})
rpc("sync_leaderboard_data", player_data)
@@ -1049,7 +1049,7 @@ func _show_game_over_panel():
var player_scores = []
for p in get_tree().get_nodes_in_group("Players"):
player_scores.append({
"name": p.name,
"name": p.display_name if not p.display_name.is_empty() else str(p.name),
"score": goals_cycle_manager.get_player_score(p.get_multiplayer_authority()) if goals_cycle_manager else 0
})
player_scores.sort_custom(func(a, b): return a.score > b.score)
@@ -1068,7 +1068,7 @@ func _show_game_over_panel():
entry.add_child(rank_label)
var name_label = Label.new()
name_label.text = "Player %s" % player_scores[i].name
name_label.text = player_scores[i].name
name_label.add_theme_font_size_override("font_size", 28)
name_label.add_theme_color_override("font_color", rank_colors[i])
name_label.size_flags_horizontal = Control.SIZE_EXPAND_FILL
@@ -1149,7 +1149,7 @@ func request_leaderboard_sync():
for p in get_tree().get_nodes_in_group("Players"):
player_data.append({
"peer_id": p.get_multiplayer_authority(),
"name": p.name,
"name": p.display_name if not p.display_name.is_empty() else str(p.name),
"score": goals_cycle_manager.get_player_score(p.get_multiplayer_authority()) if goals_cycle_manager else 0
})
rpc_id(sender_id, "sync_leaderboard_data", player_data)
@@ -1183,7 +1183,7 @@ func sync_leaderboard_data(player_data: Array):
if rank_label:
rank_label.text = _get_ordinal(i + 1)
if name_label:
name_label.text = "Player " + str(data.name)
name_label.text = str(data.name)
if score_label:
score_label.text = str(data.score)
@@ -1211,7 +1211,7 @@ func _update_leaderboard_display():
for p in all_players:
var peer_id = p.get_multiplayer_authority()
var score = goals_cycle_manager.get_player_score(peer_id) if goals_cycle_manager else 0
player_data.append({"peer_id": peer_id, "name": p.name, "score": score})
player_data.append({"peer_id": peer_id, "name": p.display_name if not p.display_name.is_empty() else str(p.name), "score": score})
# Sort by score descending
player_data.sort_custom(func(a, b): return a.score > b.score)
+54 -6
View File
@@ -12,6 +12,9 @@ var powerup_manager
# Score tracking
var score: int = 0
# Display name (synced across network)
var display_name: String = ""
# Special effect states
var is_frozen: bool = false
var is_invisible: bool = false
@@ -115,9 +118,22 @@ const AVAILABLE_CHARACTERS: Array[String] = ["Bob", "Masbro", "Gatot", "Oldpop"]
# Delegated to RaceManager
func _ready():
# Ensure name is set first
# Ensure name is set first (node name = authority ID for multiplayer identification)
name = str(get_multiplayer_authority())
$Name.text = str(name)
# Look up player's display name from LobbyManager
var my_id = get_multiplayer_authority()
for player_data in LobbyManager.get_players():
if player_data.get("id") == my_id:
display_name = player_data.get("name", "Player")
break
if display_name.is_empty():
display_name = "Player %d" % my_id
$Name.text = display_name
# Sync name to other peers if this is our local player
if is_multiplayer_authority():
rpc("sync_display_name", display_name)
# Wait briefly to ensure proper scene setup
await get_tree().create_timer(0.1).timeout
@@ -354,6 +370,30 @@ func play_idle_animation() -> void:
if anim_player and anim_player.has_animation("animation-pack/idle"):
anim_player.play("animation-pack/idle")
# =============================================================================
# Network-Synced Animation Functions
# =============================================================================
@rpc("any_peer", "call_local", "reliable")
func sync_walk_animation() -> void:
"""Sync walk animation across network."""
play_walk_animation()
@rpc("any_peer", "call_local", "reliable")
func sync_pickup_animation() -> void:
"""Sync pickup/grab animation across network."""
play_pickup_animation()
@rpc("any_peer", "call_local", "reliable")
func sync_put_animation() -> void:
"""Sync put/drop animation across network."""
play_put_animation()
@rpc("any_peer", "call_local", "reliable")
func sync_special_animation() -> void:
"""Sync special ability animation across network."""
play_special_animation()
# =============================================================================
# Screen Shake
# =============================================================================
@@ -486,10 +526,16 @@ func sync_bot_status(is_bot_status: bool):
behavior_tree.set_physics_process(false)
behavior_tree.set_process(false)
@rpc("any_peer", "call_local", "reliable")
func sync_display_name(new_name: String) -> void:
"""Sync display name across network."""
display_name = new_name
$Name.text = display_name
func _process(delta):
if is_multiplayer_authority():
# Visual debugging - show connection status in name label
$Name.text = str(name) + "\n(Auth: " + str(get_multiplayer_authority()) + ")"
# Visual debugging - show display name with connection status
$Name.text = display_name if not display_name.is_empty() else str(name)
# Periodically verify our existence to others
_verify_timer += delta
@@ -819,8 +865,8 @@ func display_message(message, type: int = 0):
# Send message to the main scene's message bar instead of player bubble
var main = get_tree().get_root().get_node_or_null("Main")
if main and main.has_method("add_message_to_bar"):
var player_name = $Name.text.split("\n")[0] if $Name else str(name)
main.add_message_to_bar(player_name, message, type)
var player_name_str = display_name if not display_name.is_empty() else str(name)
main.add_message_to_bar(player_name_str, message, type)
func initialize_random_goals(_size: int, min_value: int, max_value: int, null_count: float) -> Array[int]:
goals.clear()
@@ -1171,6 +1217,8 @@ func _highlight_adjacent_playerboard_slots():
func sync_rotation(new_rotation: float):
if not is_multiplayer_authority():
rotation.y = new_rotation
if movement_manager:
movement_manager.target_rotation = new_rotation
@rpc("any_peer", "call_local", "reliable")
func sync_grid_item(x: int, y: int, z: int, item: int):