Ники, общий рейтинг (топ-10 по картам), таблица Tab, сдача в гонке, таймер Parkour

- Ники: профиль user://profile.cfg (client_id + ник), панель при первом запуске и по N;
  Net.nick_of(id); ники над призраками, в HUD/итогах гонки и таблицах
- Рейтинг на сервере: лучшее время каждого игрока по картам race/parkour/metro, топ-10,
  user://leaderboard.json (атомарная запись, лимиты, проверка карты/комнаты/времени)
- Таблица лидеров по Tab, доски топ-3 над порталами в хабе, итоги гонки с общим рейтингом
- Гонка: сдача (G, удержание 1,5 с), RACE_GIVEUP; Parkour: таймер, финиш на вершине, R — перезапуск
- Новые RPC (submit_profile, recv_nick, submit_record, recv_record_result, request_leaderboard,
  recv_leaderboard): клиент и сервер выкладываются вместе
- Тесты: nicks_lb_test, race_giveup_test, parkour_run_test, nick_ui_test, ui_tour; README обновлён

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WxZo3ekR5m1af437Qzqwc1
This commit is contained in:
2026-10-29 12:09:33 +05:00
co-authored by Claude Sonnet 5.5
parent d38152ea97
commit 666bebfb60
31 changed files with 2014 additions and 44 deletions
+8 -2
View File
@@ -28,6 +28,7 @@ var pitch := 0.0
var flags := 0
var velocity := Vector3.ZERO # Сглаженная скорость по сетевым пакетам, м/с
var label: Label3D
var anim: AnimationPlayer
var skeleton: Skeleton3D
var head_bone := -1
@@ -56,8 +57,9 @@ func setup(peer_id: int, pos: Vector3) -> void:
anim.callback_mode_process = AnimationMixer.ANIMATION_CALLBACK_MODE_PROCESS_MANUAL # кадры двигаем сами (см. _process)
_paint_glow(model)
var label := Label3D.new()
label.text = "Игрок %d" % (id % 1000)
label = Label3D.new()
label.text = Net.nick_of(id) # обычный текст, не разметка: чужой ник не меняет оформление
Net.nick_changed.connect(_on_nick_changed)
label.modulate = color
label.billboard = BaseMaterial3D.BILLBOARD_ENABLED
label.no_depth_test = true
@@ -65,6 +67,10 @@ func setup(peer_id: int, pos: Vector3) -> void:
label.pixel_size = 0.005
add_child(label)
func _on_nick_changed(changed_id: int) -> void:
if changed_id == id and label != null:
label.text = Net.nick_of(id)
# Материал «Glow» модели заменяем своим — с цветом игрока (общий материал модели остался бы одним на всех)
func _paint_glow(model: Node) -> void:
var mat := StandardMaterial3D.new()