- Геймпад: раскладка под паркур и гонки, обзор правым стиком, навигация по меню (A/B/крестовина) - Меню паузы (Esc/Start): выход в хаб, настройки (мышь, стик, FOV, громкость, инверсия), справка по управлению - Хаб 48x32x10 м: колонны, окна с городом, голограмма, лавки; музыка «Local Forecast - Elevator» (Kevin MacLeod, CC-BY) - Тесты: pause_test, pad_menu_test, hub_tour; README обновлён Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
44 lines
2.1 KiB
GDScript
44 lines
2.1 KiB
GDScript
extends Node
|
|
# Тестовый бот (автозагрузка во ВРЕМЕННОЙ копии проекта, см. tools/test/make_test_project.sh).
|
|
# Пережидает смену сцен, по расписанию телепортирует игрока и раз в секунду печатает, что видит.
|
|
# godot --headless --path <копия> res://maps/hub/hub.tscn -- --client --name=A --tp=2:-12,1,-15 --tp=9:0,1,11
|
|
# --tp=<секунда>:<x>,<y>,<z> — телепорт игрока на этой секунде (например, прямо в портал).
|
|
# Остальные аргументы пользователя (--server-url=..., --pack-url=...) читают Net и MapLoader.
|
|
|
|
var t := 0.0
|
|
var label := "?"
|
|
var tps := []
|
|
var next_print := 1.0
|
|
|
|
func _ready() -> void:
|
|
for a in OS.get_cmdline_user_args():
|
|
if a.begins_with("--name="):
|
|
label = a.substr(7)
|
|
if a.begins_with("--tp="):
|
|
var p := a.substr(5).split(":")
|
|
var v := p[1].split(",")
|
|
tps.append({"t": float(p[0]), "pos": Vector3(float(v[0]), float(v[1]), float(v[2])), "done": false})
|
|
|
|
func _process(delta: float) -> void:
|
|
t += delta
|
|
var scene := get_tree().current_scene
|
|
var player := get_tree().get_first_node_in_group("local_player")
|
|
if scene == null or player == null:
|
|
return
|
|
if not get_tree().paused: # на паузе идёт загрузка карты
|
|
for tp in tps:
|
|
if not tp.done and t >= tp.t:
|
|
tp.done = true
|
|
player.global_position = tp.pos
|
|
player.velocity = Vector3.ZERO
|
|
print("[%s] t=%.1f ТЕЛЕПОРТ %s" % [label, t, tp.pos])
|
|
if t >= next_print:
|
|
next_print += 1.0
|
|
var chasers := []
|
|
for id in Net.chasers:
|
|
var c: Node3D = Net.chasers[id]
|
|
chasers.append("%s=(%.0f,%.0f)%s" % [id, c.global_position.x, c.global_position.z, "!" if c.get("_state") == 1 else ""])
|
|
print("[%s] t=%4.1f сцена=%s карта=%s владелец=%s свой=%s призраков=%d мёртв=%s %s" % [
|
|
label, t, scene.name, Net.current_map, Net.rock_owner, Net.rock_is_local(),
|
|
Net.ghosts.size(), player.is_dead, " ".join(chasers)])
|