Карта Race: гонка на ногах по киберпанк-антиутопии, 8 игроков
- maps/race: трасса 633 м из Blender (три развилки: срез по контейнерам, каньон со стенами против нижней дороги, труба с лазерами против коридора), запечённый свет, небо, дождь, гул; фоновая песня (Ogg Vorbis, ~0,6 МБ) включается на «СТАРТ!» - Правила (race_rules.gd): R — готов; когда готовы все — отсчёт 6 с, заморозка в слотах, ворота строго по порядку, сплиты, место, итоги, личный рекорд (user://race_best.cfg) - Сеть: Net.submit_race / recv_race / race_event (RACE_READY, START, CP, FINISH, STATE). ВНИМАНИЕ: набор RPC изменён — клиент и сервер выкладываются вместе, старый клиент с новым сервером не работает (rpc node checksum failed) - player.gd: input_frozen и place() для режимов карт; project.godot: действие ready (R) - Портал RACE в хабе, пресет экспорта Race (include_filter для ресурсов, грузимых строкой) - tools/test: двухклиентный тест гонки на локальном сервере, бот, облёт, проверка пакета - README: правила гонки, события, проверки, заметки Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01WxZo3ekR5m1af437Qzqwc1
This commit is contained in:
@@ -182,6 +182,9 @@ var spawn_transform: Transform3D
|
||||
var death_overlay: ColorRect = null
|
||||
var death_label: Label = null
|
||||
|
||||
# Заморозка ввода (режим «Гонка»: отсчёт до старта). Обзор мышью работает, движение и способности — нет.
|
||||
var input_frozen: bool = false
|
||||
|
||||
# Коллайдер (опционально, ищется по имени CollisionShape3D)
|
||||
var collision_shape: CollisionShape3D = null
|
||||
var capsule: CapsuleShape3D = null
|
||||
@@ -247,6 +250,9 @@ func _unhandled_input(event: InputEvent) -> void:
|
||||
head.rotate_x(-event.relative.y * MOUSE_SENSITIVITY * zoom_factor)
|
||||
head.rotation.x = clamp(head.rotation.x, deg_to_rad(-80), deg_to_rad(80))
|
||||
|
||||
if input_frozen:
|
||||
return
|
||||
|
||||
if event.is_action_pressed("crouch"):
|
||||
_try_start_slide() # Подкат: бег (sprint) + crouch
|
||||
elif event.is_action_pressed("dash"):
|
||||
@@ -273,6 +279,17 @@ func _physics_process(delta: float) -> void:
|
||||
_process_death(delta)
|
||||
return
|
||||
|
||||
if input_frozen:
|
||||
# Стоим на месте (только падаем, если под ногами пусто)
|
||||
velocity.x = 0.0
|
||||
velocity.z = 0.0
|
||||
if not is_on_floor():
|
||||
velocity += get_gravity() * delta
|
||||
else:
|
||||
velocity.y = 0.0
|
||||
move_and_slide()
|
||||
return
|
||||
|
||||
slide_cooldown_timer = maxf(slide_cooldown_timer - delta, 0.0)
|
||||
dash_cooldown_timer = maxf(dash_cooldown_timer - delta, 0.0)
|
||||
wallrun_cooldown_timer = maxf(wallrun_cooldown_timer - delta, 0.0)
|
||||
@@ -940,6 +957,23 @@ func _process_death(delta: float) -> void:
|
||||
if death_timer <= 0.0:
|
||||
_respawn()
|
||||
|
||||
# Поставить игрока в точку t (лицом по её повороту), сбросив скорость и способности. Для карт-режимов (Гонка).
|
||||
func place(t: Transform3D, pitch := 0.0) -> void:
|
||||
spawn_transform = t
|
||||
if is_dead:
|
||||
_respawn()
|
||||
else:
|
||||
if is_sliding:
|
||||
_end_slide()
|
||||
if is_crouching:
|
||||
_end_crouch()
|
||||
is_dashing = false
|
||||
is_wallrunning = false
|
||||
is_mantling = false
|
||||
global_transform = t
|
||||
velocity = Vector3.ZERO
|
||||
head.rotation.x = pitch
|
||||
|
||||
func _respawn() -> void:
|
||||
global_transform = spawn_transform
|
||||
velocity = Vector3.ZERO
|
||||
|
||||
Reference in New Issue
Block a user