Структура проекта: папки по назначению, карты самодостаточны, инструменты, README
- Перенос: Net→net, Player→player, World/*→maps/{hub,sandbox,backrooms}, core, objects,
models/*→chasers/{rock,verity} и maps/*/models. Имена внутри папок с .glb не менялись
(рядом лежат извлечённые текстуры). Все пути, пресеты экспорта и автолоады обновлены.
- Преследователи: rock-follow.gd → chasers/chaser.gd; камень в песочнице теперь инстанс
chasers/rock/rock.tscn (как Верити).
- Удалён мусор: неиспользуемое небо sunflowers, Tree_01.glb, rock-path.gd, старая
модель Верити, unwrap_cache (теперь в .gitignore).
- Основной пакет игры 70 КБ (камень и Верити уехали в пакеты карт).
- tools/: export_all.sh, serve_web.py (nginx-подобный dev-сервер), deploy_server.sh,
test/ (боты, временный проект и сервер). Net: флаг --client для headless-клиента.
- deploy/: боевые nginx.conf и my-world.service, project.godot выделенного сервера.
- README переписан: что есть и чего нет, структура, карты, преследователи, сеть, пакеты,
деплой, грабли, дорожная карта (телефон).
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
extends Node
|
||||
# Тестовый бот (автозагрузка во ВРЕМЕННОЙ копии проекта, см. tools/test/make_test_project.sh).
|
||||
# Пережидает смену сцен, по расписанию телепортирует игрока и раз в секунду печатает, что видит.
|
||||
# godot --headless --path <копия> res://maps/hub/hub.tscn -- --client --name=A --tp=2:-2.25,1,-7.5 --tp=9:0,1,5
|
||||
# --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)])
|
||||
@@ -0,0 +1 @@
|
||||
uid://do6iy031p0j3m
|
||||
Executable
+14
@@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
# Делает ВРЕМЕННУЮ копию проекта с ботом-автозагрузкой для тестов без окна.
|
||||
# tools/test/make_test_project.sh /tmp/test-world
|
||||
# Дальше: godot --headless --path /tmp/test-world res://maps/hub/hub.tscn -- --client --name=A
|
||||
# (сервер для сетевых тестов — отдельный headless-запуск папки из tools/test/make_test_server.sh)
|
||||
set -euo pipefail
|
||||
SRC="$(cd "$(dirname "$0")/../.." && pwd)"
|
||||
DST="${1:?укажи папку}"
|
||||
mkdir -p "$DST"
|
||||
rsync -a --exclude .git --exclude deploy "$SRC/" "$DST/"
|
||||
sed -i 's#^MapLoader="\*res://core/map_loader.gd"#MapLoader="*res://core/map_loader.gd"\nBot="*res://tools/test/bot.gd"#' "$DST/project.godot"
|
||||
# В боевом экспорте tools/* исключён; в тестовой копии бот должен попасть в пакет
|
||||
sed -i 's#exclude_filter="tools/\*, #exclude_filter="#' "$DST/export_presets.cfg"
|
||||
echo "готово: $DST"
|
||||
Executable
+11
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
# Локальный выделенный сервер для сетевых тестов (та же структура, что на боевом сервере).
|
||||
# tools/test/make_test_server.sh /tmp/test-server && godot --headless --path /tmp/test-server
|
||||
set -euo pipefail
|
||||
SRC="$(cd "$(dirname "$0")/../.." && pwd)"
|
||||
DST="${1:?укажи папку}"
|
||||
mkdir -p "$DST/net"
|
||||
cp "$SRC/deploy/server/project.godot" "$DST/project.godot"
|
||||
cp "$SRC/net/net.gd" "$SRC/net/net.gd.uid" "$SRC/net/ghost.gd" "$SRC/net/ghost.gd.uid" "$SRC/net/server.tscn" "$DST/net/"
|
||||
(cd "$DST" && godot --headless --import --path . >/dev/null 2>&1) # кэш классов (class_name Ghost)
|
||||
echo "готово: $DST"
|
||||
Reference in New Issue
Block a user