Мод для Minecraft 1.21.1 / NeoForge, построенный поверх библиотеки Sable (физика подвижных блочных структур на движке Rapier).
Sable даёт физику, но не даёт способа пользоваться ей в выживании. Crashy! добавляет именно это: клей, активатор физики и запускатель.
Склеивает блоки в одну жёсткую конструкцию.
| Действие | Что происходит |
|---|---|
| Держать во второй руке и строить | каждый поставленный блок склеивается автоматически и объединяется с соседними склеенными |
| ПКМ по блоку | поставить один угол области |
| ПКМ по второму блоку | склеить всё внутри коробки между углами в одну группу |
| ЛКМ по склеенному блоку | снять клей с этой группы |
| Shift + ПКМ | отменить незаконченное выделение или расклеить группу под курсором |
Клеем ничего не сломать. Склейка — это много кликов в упор, и промахнувшийся ЛКМ раньше выбивал кусок из той самой постройки, которую ты скрепляешь: инструмент для соединения не должен быть самым быстрым способом всё развалить. Вместо этого ЛКМ снимает клей — туда рука и тянется, когда надо отменить. Останавливается только та рука, в которой клей, так что клей во второй руке и кирка в основной копают ровно как раньше.
Выделение области — тот же жест, что у Super Glue в Create, и намеренно: это взаимодействие у игроков уже в пальцах. Пока выбираешь второй угол, за курсором тянется зелёная рамка; она краснеет ровно тогда, когда выделение перестаёт быть таким, какое сервер примет, — предел видно, а не узнаёшь о нём после второго клика. Прочность тратится одна на всю область, какого бы размера она ни была.
Блоки, стоящие врозь внутри одного выделения, всё равно становятся одной группой: выделение — это утверждение, что они одно целое, касаются они друг друга или нет. Два клика по одному и тому же блоку склеивают именно его.
Склейка запоминается в мире (сохраняется вместе с ним) и переживает перезаход.
Ставится на готовую постройку. Включается ПКМ пустой рукой или сигналом редстоуна.
В момент включения вся склеенная группа, которой касается активатор, превращается в настоящее физическое тело Sable: оно падает, крутится, сталкивается с миром.
Если рядом нет склеенных блоков, активатор попробует собрать все физически связанные блоки (это можно выключить в конфиге).
Пока клей в руках, все склеенные блоки вокруг подсвечиваются контуром — сразу видно, что войдёт в объект.
Чтобы вернуть объект в обычные блоки, возьми предмет «Активатор физики» и нажми ПКМ по объекту: физика выключится, постройка впишется в сетку мира и останется склеенной.
Стол открывает один из двух экранов — смотря приклеена ли к нему постройка.
| Где стоит | Что делает |
|---|---|
| Приклеен к постройке | показывает её, спрашивает название и записывает в schematics/ — и на пустую схематику из слота |
| Сам по себе | показывает папку schematics; выбери файл колёсиком, поставь пустую схематику, нажми галочку |
Файлы — обычные .nbt структуры, тот же формат, что у ванильного структурного блока. Значит, они
взаимозаменяемы со структурными блоками, Create и конвертером Litematica. Папка — твоя: рядом с
options.txt в твоей игре, хоть в одиночке, хоть на чужом сервере. Кидай туда свои файлы, и через
пару секунд они окажутся в списке.
Отправка схематики обратно на стол — это и есть прогрессбар: переданные байты, по пакету за тик, так что большая схематика честно идёт дольше маленькой.
Записанная схематика в руке:
| Действие | Что происходит |
|---|---|
| ПКМ по грани блока | закрепить голограмму на этом месте |
| ПКМ по воздуху | открыть экран схематики — повернуть, открепить, посмотреть смету, а в креативе и построить |
| Shift + ПКМ | открепить |
Настройки живут в двух местах: F7 — правила разрушения мира, и Моды → Crashy! → Конфиг — сам конфиг-файл. Второй показывает значения только когда мир загружен: конфиг привязан к миру.
В выживании кнопки «Построить» нет: голограмма — это план, блоки кладёшь сам. Уже поставленные блоки исчезают из голограммы по ходу дела. В креативе кнопка есть и ставит всю постройку разом, сразу склеенной, пропуская занятые места.
Вкладка Материалы на том же экране показывает, во что обойдётся постройка: каждый предмет, самые многочисленные сверху, и сколько такого у тебя с собой. Считаются предметы, а не блоки — дверь это два блока и один предмет, двойная плита — один блок и два предмета.
Строит схематику за тебя, из настоящих материалов, в выживании.
- Закрепи схематику там, где должна встать постройка.
- Положи её в пушку вместе с порохом.
- Поставь сундуки, бочки или воронки в куб 3×3×3 вокруг пушки и набей их.
- Нажми кнопку.
Идёт снизу вверх, по десять блоков в секунду, склеивает всё, что ставит, и обходит занятые места, а не расчищает их. Кончился материал — останавливается, показывает нужный предмет и пишет об этом в actionbar; доложи в сундук, и она продолжит с того же места. Одного пороха хватает на 128 блоков. Закрепить схематику можно не дальше 128 блоков и в том же мире. Все четыре числа в конфиге.
Леса, через которые проходит клей, но не проходит физика.
Склеивается с соседями как обычный блок, поэтому один активатор по-прежнему достаёт до всего, что на нём стоит. Чего он не делает — так это не улетает вместе с постройкой: при включении физики структурные блоки остаются ровно там, где были, а всё, что на них лежало, поднимается отдельным объектом.
Ради этого он и нужен. Платформа с четырьмя домами раньше становилась одним огромным телом — клей решает, что считать «постройкой», а платформа склеивала их всех вместе. Подложи под дома структурные блоки, нажми активатор один раз — и получишь четыре дома, которыми можно кидаться друг в друга над платформой, которая никуда не делась. И не денется: краши её не ломают.
Тот же приём разделяет что угодно: куб и шар рядом станут двумя объектами, а не одним, если единственное, что их соединяет, — структурный блок.
По умолчанию до 256 объектов за одно включение, каждый из них — физическое тело
(maxObjectsPerActivation в конфиге).
Если постройки оживают уже наклонёнными — включи clearStructuralOnActivation. Пока структурный
блок стоит, объект, который он только что отпустил, на нём лежит, и физика разруливает это
выталкиванием. С этой опцией леса убираются в тот же момент, когда постройка поднялась, и выпадают
предметами: опираться не на что. Платой будет то, что на следующий заход их придётся разложить заново.
| Действие | Что происходит |
|---|---|
| ПКМ по физ. объекту | взять его — объект зависает перед игроком |
| Зажать ПКМ | зарядка, сила растёт от 1 до 10 (полоска в actionbar) |
| Отпустить ПКМ | запуск по направлению взгляда |
| Shift + ПКМ | положить объект обратно |
Сила 10 ≈ 80 м/с (настраивается).
Когда запущенный объект влетает в обычные блоки:
- сам объект разлетается на отдельные блоки — каждый осколок становится самостоятельным физическим телом и уносит с собой импульс удара;
- блоки, в которые он влетел, разлетаются точно так же — размер воронки зависит от скорости и силы запуска;
- играет собственный звук обвала, летят обломки настоящих блоков, пыль кольцом и искры;
- через некоторое время осколки успокаиваются и снова становятся обычными блоками мира (иначе сервер задохнулся бы от тысяч живых физ. тел).
Слишком большой объект не рассыпается целиком — откалывается только область удара. Это и производительнее, и выглядит правдоподобнее.
Клавиша F7 (переназначается в управлении) открывает панель настроек мира:
| Режим разрушения | Что делает |
|---|---|
| Моментальное | всё в радиусе разлетается, из чего бы оно ни было |
| Реалистичное | сила удара сравнивается со взрывоустойчивостью блока: при силе 8 доски разлетаются по всей воронке, а булыжник крошится только в середине |
| Неразрушимое | ничего не ломается, объекты просто летают и отскакивают |
Плюс ползунки: прочность блоков, размер воронки, разлёт осколков, скорость запуска; и переключатели: ломать ли мир, взрывы ТНТ, оседание осколков, ранит ли краш существ.
Бедрок не разрушается ни в одном режиме, как и всё остальное, что нельзя добыть: барьеры, командные блоки, рамки портала Края. Обсидиан переживает Реалистичный режим, но не Моментальный — тот по определению ломает всё, что попало в радиус.
Настройки хранятся в мире и общие для всех. Менять их может оператор или хозяин одиночного мира — остальные видят панель, но она заблокирована.
Если объект влетает в ТНТ, заряд срабатывает вместо ванильного взрыва: блок убирается вручную, а на его месте появляется мощный центр разлёта. Поэтому окружающие блоки не пропадают — они разлетаются намного дальше и потом оседают. Соседний ТНТ детонирует следом (до 24 зарядов за удар).
После срабатывания заряд оставляет землю гореть: места вокруг, которые могут держать огонь,
загораются — по умолчанию треть, с общим лимитом на весь краш. Никогда рядом с уцелевшим зарядом:
огонь поджёг бы его, а это уже ванильный взрыв. blastFireChance, 0 — выключить.
Заряду нужен настоящий удар, а не любой: медленнее 24 м/с (примерно сила 3) не сработает ничего, как близко бы ни было. Задеть штабель ТНТ, паркуя дирижабль, должно поцарапать его, а не снести район. Порог — minDetonationSpeed в конфиге.
Кровать за пределами Обычного мира и якорь возрождения за пределами Ада — уже взрывчатка,
и краш их поджигает так же. Что ещё считается взрывчаткой, задаёт тег #crashy:explosive.
Обычный взрыв. ТНТ, которое поджёг ты сам, ни в какой краш не попадает, поэтому раньше вело себя ровно как в ванили: блоки вокруг просто переставали существовать. Теперь любой взрыв — подожжённое ТНТ, крипер, кристалл Энда — расшвыривает то, что ломает. Эти блоки снимаются со списка на снос до того, как ванила до него доберётся, разлетаются обломками и оседают в мир там, где упали: взрыв перекладывает местность, а не удаляет её. Предметы при этом не выпадают — сам блок ведь уцелел.
Часть намеренно оставлена ванили: всё с блок-энтити, чтобы сундук нормально высыпал содержимое;
факелы, трава и прочая мелочь, которой идёт ломаться по-старому; и вся взрывчатка — её взрыв
должен поджечь, иначе цепочка ТНТ перестанет быть цепочкой. Сверх explosionDebrisMax (64)
блоков остаток большого взрыва тоже ломается обычным способом, а разлетается в первую очередь то,
что ближе к центру, — воронка улетает всегда.
explosionDebris выключает это целиком. explosionDebrisSpeed — насколько сильно швыряет взрыв
размером с ТНТ; взрывы крупнее швыряют сильнее, мельче — слабее, пропорционально радиусу. Оно же
не работает, когда правила мира говорят, что землю трогать нельзя: режим Неразрушимое,
выключенное разрушение мира, выключенные взрывы ТНТ или crashyDestruction в этом измерении. Во
всех этих случаях взрыв всё равно происходит — просто блоки достаются ваниле.
Краш наносит урон мобам и игрокам, попавшим под него. Урон берётся из той же силы удара, которой измеряются блоки, — то есть уже учитывает, насколько объект тяжёлый и как быстро летел. На полной скорости запуска, в эпицентре, до брони:
| Объект | Урон |
|---|---|
| 1 блок | ~10 |
| 20 блоков | ~27 |
| 400 блоков | ~49 |
| заряд ТНТ в лицо | ~32 |
Урон падает с расстоянием и отбрасывает. Летящие обломки тоже бьют по пути. Всё идёт через обычный источник урона, поэтому броня, сопротивление и неуязвимость работают как обычно.
Это намеренно не зависит от режима разрушения: Неразрушимое — это обещание про блоки мира,
а не про тебя. Выключается на F7, параметром hurtEntities в конфиге или геймрулом
crashyEntityDamage по измерениям. Для строительного сервера hurtPlayers = false оставляет
мобов уязвимыми, а игроков — нет.
Ванильная взрывоустойчивость сама по себе плохой ориентир — у стекла и камня она одинаковая, 6, — поэтому остальное решают четыре тега блоков. То, что идёт в комплекте, — только отправная точка: модпак дополняет их сам, ради этого они и теги.
| Тег | Что делает | В комплекте |
|---|---|---|
#crashy:indestructible |
не ломается ни в одном режиме | спавнеры, хранилища, маяки, укреплённый глубосланец |
#crashy:fragile |
разлетается при четверти своей взрывоустойчивости | стекло, листва, горшки, знамёна, ковры |
#crashy:reinforced |
держится втрое лучше | обсидиан, незерит, наковальни, стол зачарования |
#crashy:explosive |
срабатывает от краша, как ТНТ | ТНТ |
#crashy:indestructible проверяется до режима, поэтому спавнер переживает и Моментальное.
Защита спавна сервера соблюдается, а protectedSpawnRadius добавляет вокруг точки появления
зону без разрушений, которая работает и в одиночной игре.
Два геймрула стоят над настройками F7 и всегда важнее — правило может отличаться по измерениям и переключаться датапаком без открытия экрана:
crashyDestruction— можно ли здесь ломать блоки крашемcrashyEntityDamage— можно ли здесь ранить существ
Паутина тормозит физический объект так же, как тебя: четверть горизонтальной скорости и двадцатая вертикальной за каждый тик внутри, вращение туда же. Объекты крупнее коробки в 4096 блоков не проверяются — паутина всё равно не остановит собор.
Краш в воду даёт огромный всплеск вместо воронки и звучит соответственно: вода держит удар
намного лучше воздуха. Краш в лаву поджигает то, на что расплескался. Обе настройки — в [fluids];
waterDamping = 1.0 выключает первую.
Для операторов — почти всё, что идёт не так с большим крашем, это вопрос чисел.
| Команда | Что делает |
|---|---|
/crashy stats |
живые обломки, очередь дробления, проверки опоры, объекты под наблюдением, физические тела по измерениям |
/crashy debris settle |
превратить все обломки обратно в блоки прямо сейчас |
/crashy queue clear |
сбросить очередь дробления |
Раньше краш ломал ровно то, что попало в радиус, поэтому выстрел по колоннам оставлял здание висеть над дырой. Теперь, когда пыль осела, блоки по краю воронки спрашивают, с чем они ещё связаны. То, что стоит на земле, дотягивается до ландшафта и остаётся на месте; кусок, у которого соседи кончились раньше, ни за что не держится — и падает.
Падает он как обломок, а не как вечный объект: бьёт то, на что приземлился, и оседает обратно в блоки там, где остановился, но сам блоков не ломает — именно это не даёт одному обрушению запустить следующее.
Дёшево это именно из-за обхода, а maxCollapseBlocks (256) — одновременно и сколько может рухнуть
одним куском, и как далеко обход смотрит, прежде чем решить, что кусок — просто часть мира. Один
обход запоминает, что он уже признал держащимся, до конца тика, и за тик собирается максимум один
кусок, сколько бы обходов ни разрешал collapseChecksPerTick. Незагруженные чанки, защищённая
территория, неразрушимые блоки и всё, что уже симулируется, считаются опорой.
Каждый сломанный блок становится физическим телом, а тело — это плот Sable, чанк и запись в
пайплайне физики; поэтому потолок живых обломков считается в телах. Блоки, сломанные рядом друг с
другом, свариваются в один кусок до debrisClusterSize (4) блоков: тот же потолок даёт вчетверо
больше разрушений, а стена отваливается пластами, а не одинаковыми кубиками. Поставь 1 — вернётся
одно тело на блок.
Краш, приземлившийся рядом, качает камеру — тем сильнее, чем он больше и чем ты ближе. Только
камеру: прицел, попадания и всё, что видит сервер, не трогаются. Сервер может вообще не слать это
(screenShake), игрок выбирает силу через screenShakeScale в config/crashy-client.toml, 0 —
выключить.
maxObjectsPerPlayer (12) и maxBlocksPerPlayer (4096) — сколько один человек может держать в
воздухе одновременно, считается и так и так, потому что двенадцать хижин — это не двенадцать
дирижаблей. Все остальные бюджеты мода принадлежат миру и общие: без этих лимитов один игрок,
поднимающий дирижабли весь вечер, тратит их за всех. 0 снимает лимит. У активации по редстоуну
виноватого нет — она живёт по общим лимитам мира. В одиночке (и в мире, открытом по локальной сети)
лимиты не применяются вовсе: делить бюджет не с кем.
Чужую территорию мод не трогает. Прежде чем сломать блок мира, он проверяет собственную защиту
спавна, потом кидает CrashyBreakEvent для аддонов, потом — если краш прослеживается до игрока,
который сейчас в игре, — ванильный ивент слома блока NeoForge, тот самый, который claim-моды уже
слушают. Территория, защищённая от кирки, оказывается защищена и от падающего дирижабля, без
зависимостей между модами в обе стороны. respectClaims выключает последний шаг.
Клей чинится слизью, запускатель — железным слитком, на наковальне.
- Minecraft 1.21.1 + NeoForge 21.1.x
- Sable 2.0.0+ — https://modrinth.com/mod/sable (вместе с его зависимостями: Veil, Forge Config API Port)
crashy-1.21.1-1.3+neoforge.jarв папкуmods
./gradlew buildГотовый jar — в build/libs/.
Требуется JDK 21 (Gradle скачает его сам, если в системе нет) и ~5 ГБ свободного места под кэш Minecraft/NeoForge.
Большая часть настроек живёт на F7 — там же, где выбирается режим разрушения.
Файл config/crashy-server.toml задаёт лимиты и стартовые значения для новых миров, а
config/crashy-client.toml — единственное, что не касается никого, кроме самого игрока: насколько
сильно близкий краш трясёт ему экран.
| Секция | Что настраивает |
|---|---|
glue |
максимальный размер склеенной группы, дальность и объём одного выделения области |
damage |
ранит ли краш существ и игроков, множитель урона, урон от обломков |
materials |
множители для #crashy:fragile и #crashy:reinforced |
protection |
защита спавна и дополнительный радиус без разрушений вокруг точки появления |
fluids |
насколько вода гасит удар и поджигает ли лава воронку |
activator |
лимит блоков в одном объекте, откат к «связанным блокам» |
blueprint |
лимит блоков на схематике |
launcher |
дистанция удержания, скорость за единицу силы, темп зарядки |
destruction |
порог скорости удара, максимальный радиус воронки, лимиты осколков |
tnt |
радиус, сила разлёта и пробивная сила взрыва ТНТ; разбрасывает ли обычный взрыв блоки |
performance |
бюджет дробления на тик, потолок живых обломков и размер одного обломка в блоках |
collapse |
падает ли лишённое опоры, сколько может рухнуть разом, проверок за тик |
players |
сколько объектов и блоков может держать один игрок |
feel |
шлёт ли сервер тряску камеры вообще |
debris |
превращать ли осколки обратно в блоки и сколько они лежат перед этим |
Если осколки «возвращаются на место» через секунду после удара — подними debrisScatter:
неподвижный осколок засчитывается осевшим и вписывается обратно ровно туда, откуда откололся.
Лимиты (maxWorldBlocksDestroyed, maxDebrisPerImpact) стоят не просто так: каждый
осколок — это отдельное физическое тело в пайплайне Sable.
dev.pycodder.crashy
├── Crashy точка входа, регистрация
├── CrashyConfig серверный конфиг
├── CrashyClientConfig настройки, которые касаются только самого игрока
├── CrashyGameRules crashyDestruction, crashyEntityDamage
├── glue/ клей: GlueItem, GlueEvents, GlueSelection, GlueSavedData
├── block/ PhysicsActivatorBlock, PhysicsActivatorItem (вкл/выкл физики)
├── launcher/ LauncherItem, GrabManager (удержание и запуск)
├── schematic/ схематика, смета материалов, меню машин, передача по кускам
├── structure/ стол для схематик, схематическая пушка, StructureData, StructureScanner
├── settings/ режимы разрушения, настройки мира (SavedData)
├── network/ пакеты: подсветка клея, выделение области, синхронизация настроек
├── command/ /crashy stats и уборка обломков
├── api/ CrashyBreakEvent — хук, который отменяют другие моды
├── advancement/ триггер краша, на который смотрят продвижения
├── client/ контуры, предпросмотры, голограммы, экран F7, клавиши, папка schematics
├── physics/
│ ├── SableBridge единственное место, где мод общается с API Sable
│ ├── PhysicsActivation сборка постройки в физ. объект и обратно
│ ├── ImpactTracker отслеживание запущенных объектов и детект удара
│ ├── Destruction раскалывание объекта и мира, детонация зарядов
│ ├── CrashDamage что краш делает с тем, кто под него попал
│ ├── Blast один центр, от которого всё разлетается
│ ├── CrashyEffects все частицы и тряска камеры
│ ├── ShatterQueue дробление блоков на куски, по чуть-чуть за тик
│ ├── ExplosionDebris обычные взрывы, расшвыривающие блоки
│ ├── StructuralCollapse обрушение того, что осталось без опоры
│ ├── Protection единственный вопрос перед сломом блока мира
│ ├── PlayerObjects что держит в воздухе каждый игрок
│ └── DebrisManager возврат осколков в мир
└── registry/ предметы, блоки, block entity, звуки, компоненты, теги, типы урона, вкладкаMIT — см. LICENSE.
Автор — pycodder · Физика — Sable от RyanHCode
