chexit a6a13003c2
build / mod (push) Failing after 5m36s
build / game-linux (push) Has been skipped
build / game-macos (push) Has been cancelled
build / game-windows (push) Has been cancelled
build / release (push) Has been cancelled
AirDef: drones and air defence for a Horizon fork
The mod (airdef-mod/), its generated models and sounds, the fork's patches
over upstream Horizon (horizon-patches/, HORIZON_COMMIT), a cross-platform
build/install/run script (tools/airdef.py), CI that builds and releases on
every push (.gitea/workflows/build.yml) and a setup guide (docs/INSTALL.md).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 19:16:52 +03:00

AirDef — дальнобойные дроны и ПВО для Horizon

Мод для Horizon (Minecraft 26.3 на Rust): Шахед-136, Герань-3, Patriot и Гепард с 3D-моделями, наведением ракет, слежением башен, падением сбитых дронов и эффектами взрывов.

Работает на своём форке Horizon (horizon/, ветка airdef): в нём добавлен API отрисовки 3D-моделей, которого нет в основном Horizon.

Перехваты

Запуск

Пошаговый гайд для Windows и macOS (готовая сборка из релиза или сборка из исходников): docs/INSTALL.md.

Коротко, из исходников:

python3 tools/airdef.py all     # скачать Horizon, наложить патчи форка, собрать игру и мод, установить мод
python3 tools/airdef.py play    # запустить (аргументы игры — после: --world "Имя мира")

Для разработки: ./install.sh перегенерирует модели (tools/gen_models.py, нужен Pillow) и звуки (tools/gen_sounds.py, нужны numpy и ffmpeg), собирает и ставит мод. Сгенерированные файлы лежат в репозитории, так что для обычной сборки нужен только Rust.

CI (.gitea/workflows/build.yml) на каждый пуш собирает мод и игру для Linux (и для Windows/macOS, если заданы переменные BUILD_WINDOWS / BUILD_MACOS и есть раннеры), а пуш в main публикует релиз build-N.

Как играть

/airdef give выдаёт пульты. Все срабатывают на ПКМ.

Предмет Что делает
Целеуказатель ставит или снимает цель на блоке под прицелом (до 512 блоков)
Пуск: Шахед-136 / Герань-3 / Ланцет-3 / Х-101 / Калибр / Х-22 / Циркон / Искандер-М / Кинжал запускает дрон или ракету в точку под прицелом
Развернуть Patriot / Гепард / Панцирь-С1 / С-400 / С-500 ставит комплекс на блок под прицелом, носом по взгляду
Свернуть ПВО убирает ближайший комплекс у точки под прицелом

Командный пункт: клавиша N или /airdef menu. В нём список комплексов: выбери комплекс и включай или выключай классы целей (дроны, реактивные дроны, крылатые, сверхзвуковые, баллистика), есть сброс по умолчанию. Там же переключатели огня ПВО, монитора, эффектов и разрушений.

Монитор комплекса: клавиша K листает комплексы по очереди, после последнего монитор скрывается. Слева вверху показано:

  • состояние комплекса (поиск, сопровождение, доворот, захват, пуск, огонь, перезарядка, огонь запрещён);
  • его РЛС: цели, по которым он работает, красным, остальные серым, текущая цель жёлтым;
  • тепловизионная камера с 3D-моделью цели и рамкой захвата, дальность, высота, скорость и пеленг.

Клавиши N и K можно переназначить в «Настройки → Моды».

Команды:

  • /airdef wave <тип> [кол-во] [дальность] — налёт на ближайшую цель. Типы: shahed, geran3, lancet, gerbera, kh101, kalibr, kh22, zircon, iskander, kinzhal и mix (комбинированный удар: «Герберы», шахеды, Герани-3, Х-101, «Калибры» и «Искандер»);
  • /airdef roles — показать, по каким классам целей работает каждый комплекс; /airdef roles <patriot|gepard|pantsir|s400|s500|all> <классы|default> — задать (классы через запятую: drone, jet, cruise, supersonic, ballistic или all), например /airdef roles s400 cruise,ballistic;
  • /airdef hold on|off — запретить или разрешить ПВО огонь, удобно для съёмки ударов;
  • /airdef damage on|off — разрушать ли ландшафт взрывами (через TNT, нужны читы);
  • /airdef shader on|off — шейдерные эффекты;
  • /airdef clear — убрать дроны и ракеты;
  • /airdef targets clear — снять все цели;
  • /airdef stats — сводка.

Интерфейс:

  • сверху справа — сводка: тревога, цели по типам, ближайшая угроза (дальность, высота, скорость), перехватчики в воздухе, по каждому комплексу боезапас или перезарядка, его текущая цель и число сбитых, итоговый счёт;
  • снизу справа — радар на 500 м со сканирующим лучом. Отметки гаснут после прохода луча. Красное — цели (с хвостом по курсу), жёлтое — ракеты, синее — ПВО с кругами дальности, крест — цели удара.

Комплексы ПВО и цели сохраняются между сессиями.

Техника

Дрон / ракета Поведение
Шахед-136 43 км/ч в игре, 45 м над целью, 18 м над рельефом, крен в поворотах, пикирует, винт крутится
Герань-3 реактивный, 115 км/ч, факел из сопла
Ланцет-3 Х-образные крылья, низко (25 м), манёвренный, его труднее сбить
Гербера ложная цель из пенопласта, без боевой части: отвлекает ракеты ПВО
Х-101 крылатая ракета, 170 км/ч, огибает рельеф на 12 м, мощная боевая часть
Калибр крылатая ракета, 150 км/ч, огибает рельеф на 15 м
Х-22 сверхзвуковая, 290 км/ч, идёт на 140 м и круто пикирует издалека
Циркон гиперзвуковая, 400 км/ч, её трудно сбить
Искандер-М баллистическая: стартует за 1 км, дуга с апогеем ~250 м, на конечном участке доворачивает на цель
Кинжал аэробаллистическая, 540 км/ч, стартует за 1,5 км; реально сбивает только С-500
ПВО Вооружение Дальность
Patriot 4 × PAC-3, пусковая разворачивается на цель 10–300
Гепард 2 × 35 мм, башня и стволы со слежением и упреждением, 160 очередей 90 (слежение с 130)
Панцирь-С1 12 × 57Э6 и 2 × 30 мм; модуль поворачивается, пакеты и стволы поднимаются ракеты 25–150, пушки 60
С-400 4 × 48Н6, вертикальный холодный старт, РЛС обзора на прицепе 30–480
С-500 4 × 77Н6, холодный старт, самые быстрые ракеты 40–700

Согласование огня. Комплексы делят цели между собой: на обычную цель идёт одна ракета, на баллистическую две, пушки расходятся по разным целям. Первыми бьют по самым опасным (быстрым и тяжёлым) целям, при этом ложные «Герберы» выглядят для них как настоящие. Шанс поражения падает, если цель быстрее перехватчика.

Роли по умолчанию (в сводке в квадратных скобках: Д — дроны, Г — реактивные, К — крылатые, С — сверхзвуковые, Б — баллистика): Гепард ДГК, Панцирь ДГКС, Patriot ГКСБ, С-400 ГКСБ, С-500 СБ. Сбитый дрон падает с остатком скорости, и его боевая часть может сдетонировать на земле.

Звук

Все звуки синтезированы (tools/gen_sounds.py: шум, тоны, фильтры и эхо на numpy, кодирует ffmpeg), сэмплов нет. У каждого объекта свой звук и своя дальность слышимости (attenuation_distance в sounds.json):

  • двигатели: двухтактный мопед шахеда (220 м), турбина Герани-3, электромотор Ланцета, тяжёлый рёв крылатых ракет (320 м), ракетный рёв Х-22, Циркона и перехватчиков, нарастающий визг падающей баллистики и её ударная волна (700–900 м);
  • пуски: хлопок и рвущийся рёв Patriot, свистящий старт Панциря, глухой газовый выброс и затем огромный рёв С-400, у С-500 ещё ниже и дольше (до 1 км);
  • пушки: тяжёлые 35-мм очереди Гепарда и частые 30-мм Панциря;
  • взрывы: хлопок, суббас, рокот и треск обломков с длинным эхом, у разных калибров по-разному (до 900 м).

Эффекты

Мод передаёт движку шейдер пост-обработки (airdef-mod/shaders/effects.wgsl):

  • объёмный огненный шар: шум, «прошитый» лучом камеры, с переходом раскалённое ядро → пламя → чёрный дым, который поднимается и рассеивается;
  • вспышка с ореолом и засветкой всего кадра;
  • ударная волна, искажающая картинку за собой;
  • тепловое марево над огнём;
  • свечение факелов ракет, дульных вспышек, красных трассеров и маркеров цели;
  • освещение от огня: взрывы, факелы и трассеры подсвечивают землю и технику, ночью намного сильнее.

У Гепарда и Панциря каждый снаряд — летящий красный трассер.

Всё размещено в мире и скрывается за тем, что стоит перед ним (по глубине сцены). Выключить: /airdef shader off.

Удар Холодный старт С-400

Устройство

HORIZON_COMMIT      коммит апстрима Horizon, на который накладываются патчи
horizon-patches/    изменения форка (git format-patch); tools/airdef.py fork собирает из них horizon/
horizon/            форк (не в репозитории; ветка airdef). Что в нём меняется:
  crates/horizon-mod-sdk/wit/horizon.wit   render.set-models, spawn-particles, play-sound,
                                           query-ground / ground
  crates/horizon-mods/src/runtime.rs       хост этих функций
  crates/horizon-client/src/game/mod_models.rs   интерполяция и отрисовка моделей, частицы
  crates/horizon-client/src/gfx/mod_post.rs      пост-проход мода: render.set-post / set-params
airdef-mod/         сам мод: Rust → WebAssembly
  src/sim.rs          симуляция: дроны, ракеты, ПВО, эффекты (20 тиков/с)
  src/lib.rs          предметы, команды, сохранение, передача в движок
  src/panel.rs        сводка, src/radar.rs — радар, src/monitor.rs — монитор комплекса
  assets/airdef/sounds  звуки (генерирует tools/gen_sounds.py)
  shaders/effects.wgsl  шейдер взрывов и свечения
  assets/, data/      модели, текстуры, предметы (генерирует tools/gen_models.py)
tools/gen_models.py генератор моделей и текстур
legacy/             первая версия: датапак на командах и контент-мод
run-home/           тестовая игровая папка (для проверок через horizon-ctl)

Как рисуются модели. Мод раз в тик отдаёт список объектов: блок-модель, позиция, кватернион и масштаб. Движок держит для каждого id две последние позы и в каждом кадре рисует объект между ними:

  • позиция интерполируется линейно, поворот — через slerp;
  • освещение учитывает поворот модели;
  • glow даёт полную яркость (пламя, вспышки).

Модели — обычные блочные JSON-модели, по одной на часть: корпус, винт, башня, стволы. Их генерирует tools/gen_models.py. Координаты элементов должны быть в пределах −16..32, иначе Horizon отбросит модель.

Рельеф мод узнаёт через render.query-ground: присылает колонки, а движок отвечает высотой по карте высот на следующем тике.

Известные ограничения

  • Мод клиентский: дроны и ПВО видит только тот, у кого он стоит. Мультиплеер не поддерживается.
  • Окно Horizon на macOS не рисует кадры, пока оно перекрыто другими окнами (это поведение движка).
  • Шейдер работает, только если не включён шейдер-пак Horizon (они взаимоисключающие).
S
Description
No description provided
Readme 139 MiB
v0.3.0 Latest
2026-11-06 15:40:14 +00:00
Languages
Rust 81.7%
Python 15.2%
mcfunction 1.6%
Limbo 0.8%
WGSL 0.7%