feat : update backend
This commit is contained in:
@@ -86,6 +86,11 @@ func load_profile() -> Dictionary:
|
||||
is_profile_loaded = true
|
||||
emit_signal("profile_loaded", profile)
|
||||
print("[UserProfileManager] Profile loaded: ", profile.display_name)
|
||||
|
||||
# Auto-sync existing score to native Nakama leaderboard in background
|
||||
if stats.get("high_score", 0) > 0 and NakamaManager.session and not AuthManager.is_guest:
|
||||
_submit_to_leaderboard.call_deferred()
|
||||
|
||||
return profile
|
||||
|
||||
func load_stats() -> Dictionary:
|
||||
@@ -135,15 +140,16 @@ func update_display_name(new_name: String) -> bool:
|
||||
emit_signal("profile_update_failed", "Name can only contain letters, numbers, and spaces")
|
||||
return false
|
||||
|
||||
# Allow guest name updates locally
|
||||
if not NakamaManager.session or AuthManager.is_guest:
|
||||
# Offline fallback (no session)
|
||||
if not NakamaManager.session:
|
||||
profile["display_name"] = new_name
|
||||
emit_signal("profile_updated")
|
||||
return true
|
||||
|
||||
var formatted_username = new_name.replace(" ", "_").to_lower()
|
||||
var result: NakamaAsyncResult = await NakamaManager.client.update_account_async(
|
||||
NakamaManager.session,
|
||||
null, # username (don't change)
|
||||
formatted_username, # username (sync to display name)
|
||||
new_name # display_name
|
||||
)
|
||||
|
||||
@@ -168,10 +174,24 @@ func update_avatar(avatar_index: int) -> bool:
|
||||
profile["avatar_index"] = avatar_index
|
||||
profile["avatar_url"] = AVATARS[avatar_index]
|
||||
|
||||
|
||||
# Update native avatar URL for the leaderboard
|
||||
var avatar_url = AVATARS[avatar_index]
|
||||
var result = await NakamaManager.client.update_account_async(
|
||||
NakamaManager.session, null, null, avatar_url
|
||||
)
|
||||
if result.is_exception():
|
||||
emit_signal("profile_update_failed", "Failed to update native avatar")
|
||||
return false
|
||||
|
||||
var success := await _save_profile_data()
|
||||
if success:
|
||||
emit_signal("avatar_changed", AVATARS[avatar_index])
|
||||
emit_signal("avatar_changed", avatar_url)
|
||||
emit_signal("profile_updated")
|
||||
|
||||
# Immediately update leaderboard with new avatar
|
||||
if stats.get("high_score", 0) > 0:
|
||||
_submit_to_leaderboard.call_deferred()
|
||||
|
||||
return success
|
||||
|
||||
@@ -255,6 +275,34 @@ func record_game_result(won: bool, score: int) -> void:
|
||||
stats["high_score"] = score
|
||||
|
||||
await update_stats(stats)
|
||||
|
||||
# Also submit to Nakama native leaderboard so global_high_score is populated
|
||||
await _submit_to_leaderboard()
|
||||
|
||||
func _submit_to_leaderboard() -> void:
|
||||
"""Submits the current high_score via server RPC (required for authoritative leaderboards)."""
|
||||
if not NakamaManager.session:
|
||||
return
|
||||
if stats.get("high_score", 0) <= 0:
|
||||
return
|
||||
|
||||
var payload = JSON.stringify({
|
||||
"score": int(stats.get("high_score", 0)),
|
||||
"games_played": int(stats.get("games_played", 0)),
|
||||
"games_won": int(stats.get("games_won", 0)),
|
||||
"avatar_url": profile.get("avatar_url", "")
|
||||
})
|
||||
|
||||
var result = await NakamaManager.client.rpc_async(
|
||||
NakamaManager.session,
|
||||
"submit_score",
|
||||
payload
|
||||
)
|
||||
|
||||
if result.is_exception():
|
||||
push_warning("[UserProfileManager] Leaderboard RPC failed: ", result.get_exception().message)
|
||||
else:
|
||||
print("[UserProfileManager] Leaderboard score submitted: ", stats.get("high_score", 0))
|
||||
|
||||
# =============================================================================
|
||||
# Getters
|
||||
|
||||
Reference in New Issue
Block a user