Skip to content

Latest commit

 

History

History
461 lines (335 loc) · 36.9 KB

File metadata and controls

461 lines (335 loc) · 36.9 KB

Crashy!

Склей постройку. Включи физику. Запусти её во что-нибудь.

Available on Modrinth Works with NeoForge Powered by Sable

English · Русский


Мод для Minecraft 1.21.1 / NeoForge, построенный поверх библиотеки Sable (физика подвижных блочных структур на движке Rapier).

Sable даёт физику, но не даёт способа пользоваться ей в выживании. Crashy! добавляет именно это: клей, активатор физики и запускатель.


Как играть

1. Клей (Строительный клей)

Склеивает блоки в одну жёсткую конструкцию.

Действие Что происходит
Держать во второй руке и строить каждый поставленный блок склеивается автоматически и объединяется с соседними склеенными
ПКМ по блоку поставить один угол области
ПКМ по второму блоку склеить всё внутри коробки между углами в одну группу
ЛКМ по склеенному блоку снять клей с этой группы
Shift + ПКМ отменить незаконченное выделение или расклеить группу под курсором

Клеем ничего не сломать. Склейка — это много кликов в упор, и промахнувшийся ЛКМ раньше выбивал кусок из той самой постройки, которую ты скрепляешь: инструмент для соединения не должен быть самым быстрым способом всё развалить. Вместо этого ЛКМ снимает клей — туда рука и тянется, когда надо отменить. Останавливается только та рука, в которой клей, так что клей во второй руке и кирка в основной копают ровно как раньше.

Выделение области — тот же жест, что у Super Glue в Create, и намеренно: это взаимодействие у игроков уже в пальцах. Пока выбираешь второй угол, за курсором тянется зелёная рамка; она краснеет ровно тогда, когда выделение перестаёт быть таким, какое сервер примет, — предел видно, а не узнаёшь о нём после второго клика. Прочность тратится одна на всю область, какого бы размера она ни была.

Блоки, стоящие врозь внутри одного выделения, всё равно становятся одной группой: выделение — это утверждение, что они одно целое, касаются они друг друга или нет. Два клика по одному и тому же блоку склеивают именно его.

Склейка запоминается в мире (сохраняется вместе с ним) и переживает перезаход.

2. Активатор физики (блок)

Ставится на готовую постройку. Включается ПКМ пустой рукой или сигналом редстоуна.

В момент включения вся склеенная группа, которой касается активатор, превращается в настоящее физическое тело Sable: оно падает, крутится, сталкивается с миром.

Если рядом нет склеенных блоков, активатор попробует собрать все физически связанные блоки (это можно выключить в конфиге).

Пока клей в руках, все склеенные блоки вокруг подсвечиваются контуром — сразу видно, что войдёт в объект.

Чтобы вернуть объект в обычные блоки, возьми предмет «Активатор физики» и нажми ПКМ по объекту: физика выключится, постройка впишется в сетку мира и останется склеенной.

3. Стол для схематик и схематика

Стол открывает один из двух экранов — смотря приклеена ли к нему постройка.

Где стоит Что делает
Приклеен к постройке показывает её, спрашивает название и записывает в schematics/ — и на пустую схематику из слота
Сам по себе показывает папку schematics; выбери файл колёсиком, поставь пустую схематику, нажми галочку

Файлы — обычные .nbt структуры, тот же формат, что у ванильного структурного блока. Значит, они взаимозаменяемы со структурными блоками, Create и конвертером Litematica. Папка — твоя: рядом с options.txt в твоей игре, хоть в одиночке, хоть на чужом сервере. Кидай туда свои файлы, и через пару секунд они окажутся в списке.

Отправка схематики обратно на стол — это и есть прогрессбар: переданные байты, по пакету за тик, так что большая схематика честно идёт дольше маленькой.

Записанная схематика в руке:

Действие Что происходит
ПКМ по грани блока закрепить голограмму на этом месте
ПКМ по воздуху открыть экран схематики — повернуть, открепить, посмотреть смету, а в креативе и построить
Shift + ПКМ открепить

Настройки живут в двух местах: F7 — правила разрушения мира, и Моды → Crashy! → Конфиг — сам конфиг-файл. Второй показывает значения только когда мир загружен: конфиг привязан к миру.

В выживании кнопки «Построить» нет: голограмма — это план, блоки кладёшь сам. Уже поставленные блоки исчезают из голограммы по ходу дела. В креативе кнопка есть и ставит всю постройку разом, сразу склеенной, пропуская занятые места.

Вкладка Материалы на том же экране показывает, во что обойдётся постройка: каждый предмет, самые многочисленные сверху, и сколько такого у тебя с собой. Считаются предметы, а не блоки — дверь это два блока и один предмет, двойная плита — один блок и два предмета.

4. Схематическая пушка

Строит схематику за тебя, из настоящих материалов, в выживании.

  1. Закрепи схематику там, где должна встать постройка.
  2. Положи её в пушку вместе с порохом.
  3. Поставь сундуки, бочки или воронки в куб 3×3×3 вокруг пушки и набей их.
  4. Нажми кнопку.

Идёт снизу вверх, по десять блоков в секунду, склеивает всё, что ставит, и обходит занятые места, а не расчищает их. Кончился материал — останавливается, показывает нужный предмет и пишет об этом в actionbar; доложи в сундук, и она продолжит с того же места. Одного пороха хватает на 128 блоков. Закрепить схематику можно не дальше 128 блоков и в том же мире. Все четыре числа в конфиге.

5. Структурный блок

Леса, через которые проходит клей, но не проходит физика.

Склеивается с соседями как обычный блок, поэтому один активатор по-прежнему достаёт до всего, что на нём стоит. Чего он не делает — так это не улетает вместе с постройкой: при включении физики структурные блоки остаются ровно там, где были, а всё, что на них лежало, поднимается отдельным объектом.

Ради этого он и нужен. Платформа с четырьмя домами раньше становилась одним огромным телом — клей решает, что считать «постройкой», а платформа склеивала их всех вместе. Подложи под дома структурные блоки, нажми активатор один раз — и получишь четыре дома, которыми можно кидаться друг в друга над платформой, которая никуда не делась. И не денется: краши её не ломают.

Тот же приём разделяет что угодно: куб и шар рядом станут двумя объектами, а не одним, если единственное, что их соединяет, — структурный блок.

По умолчанию до 256 объектов за одно включение, каждый из них — физическое тело (maxObjectsPerActivation в конфиге).

Если постройки оживают уже наклонёнными — включи clearStructuralOnActivation. Пока структурный блок стоит, объект, который он только что отпустил, на нём лежит, и физика разруливает это выталкиванием. С этой опцией леса убираются в тот же момент, когда постройка поднялась, и выпадают предметами: опираться не на что. Платой будет то, что на следующий заход их придётся разложить заново.

6. Запускатель

Действие Что происходит
ПКМ по физ. объекту взять его — объект зависает перед игроком
Зажать ПКМ зарядка, сила растёт от 1 до 10 (полоска в actionbar)
Отпустить ПКМ запуск по направлению взгляда
Shift + ПКМ положить объект обратно

Сила 10 ≈ 80 м/с (настраивается).

7. Удар

Когда запущенный объект влетает в обычные блоки:

  • сам объект разлетается на отдельные блоки — каждый осколок становится самостоятельным физическим телом и уносит с собой импульс удара;
  • блоки, в которые он влетел, разлетаются точно так же — размер воронки зависит от скорости и силы запуска;
  • играет собственный звук обвала, летят обломки настоящих блоков, пыль кольцом и искры;
  • через некоторое время осколки успокаиваются и снова становятся обычными блоками мира (иначе сервер задохнулся бы от тысяч живых физ. тел).

Слишком большой объект не рассыпается целиком — откалывается только область удара. Это и производительнее, и выглядит правдоподобнее.


Нравится Crashy?

Поддержать на Ko-fi


8. Настройки на F7

Клавиша F7 (переназначается в управлении) открывает панель настроек мира:

Режим разрушения Что делает
Моментальное всё в радиусе разлетается, из чего бы оно ни было
Реалистичное сила удара сравнивается со взрывоустойчивостью блока: при силе 8 доски разлетаются по всей воронке, а булыжник крошится только в середине
Неразрушимое ничего не ломается, объекты просто летают и отскакивают

Плюс ползунки: прочность блоков, размер воронки, разлёт осколков, скорость запуска; и переключатели: ломать ли мир, взрывы ТНТ, оседание осколков, ранит ли краш существ.

Бедрок не разрушается ни в одном режиме, как и всё остальное, что нельзя добыть: барьеры, командные блоки, рамки портала Края. Обсидиан переживает Реалистичный режим, но не Моментальный — тот по определению ломает всё, что попало в радиус.

Настройки хранятся в мире и общие для всех. Менять их может оператор или хозяин одиночного мира — остальные видят панель, но она заблокирована.

9. ТНТ и прочая взрывчатка

Если объект влетает в ТНТ, заряд срабатывает вместо ванильного взрыва: блок убирается вручную, а на его месте появляется мощный центр разлёта. Поэтому окружающие блоки не пропадают — они разлетаются намного дальше и потом оседают. Соседний ТНТ детонирует следом (до 24 зарядов за удар).

После срабатывания заряд оставляет землю гореть: места вокруг, которые могут держать огонь, загораются — по умолчанию треть, с общим лимитом на весь краш. Никогда рядом с уцелевшим зарядом: огонь поджёг бы его, а это уже ванильный взрыв. blastFireChance, 0 — выключить.

Заряду нужен настоящий удар, а не любой: медленнее 24 м/с (примерно сила 3) не сработает ничего, как близко бы ни было. Задеть штабель ТНТ, паркуя дирижабль, должно поцарапать его, а не снести район. Порог — minDetonationSpeed в конфиге.

Кровать за пределами Обычного мира и якорь возрождения за пределами Ада — уже взрывчатка, и краш их поджигает так же. Что ещё считается взрывчаткой, задаёт тег #crashy:explosive.

Обычный взрыв. ТНТ, которое поджёг ты сам, ни в какой краш не попадает, поэтому раньше вело себя ровно как в ванили: блоки вокруг просто переставали существовать. Теперь любой взрыв — подожжённое ТНТ, крипер, кристалл Энда — расшвыривает то, что ломает. Эти блоки снимаются со списка на снос до того, как ванила до него доберётся, разлетаются обломками и оседают в мир там, где упали: взрыв перекладывает местность, а не удаляет её. Предметы при этом не выпадают — сам блок ведь уцелел.

Часть намеренно оставлена ванили: всё с блок-энтити, чтобы сундук нормально высыпал содержимое; факелы, трава и прочая мелочь, которой идёт ломаться по-старому; и вся взрывчатка — её взрыв должен поджечь, иначе цепочка ТНТ перестанет быть цепочкой. Сверх explosionDebrisMax (64) блоков остаток большого взрыва тоже ломается обычным способом, а разлетается в первую очередь то, что ближе к центру, — воронка улетает всегда.

explosionDebris выключает это целиком. explosionDebrisSpeed — насколько сильно швыряет взрыв размером с ТНТ; взрывы крупнее швыряют сильнее, мельче — слабее, пропорционально радиусу. Оно же не работает, когда правила мира говорят, что землю трогать нельзя: режим Неразрушимое, выключенное разрушение мира, выключенные взрывы ТНТ или crashyDestruction в этом измерении. Во всех этих случаях взрыв всё равно происходит — просто блоки достаются ваниле.

10. Урон существам

Краш наносит урон мобам и игрокам, попавшим под него. Урон берётся из той же силы удара, которой измеряются блоки, — то есть уже учитывает, насколько объект тяжёлый и как быстро летел. На полной скорости запуска, в эпицентре, до брони:

Объект Урон
1 блок ~10
20 блоков ~27
400 блоков ~49
заряд ТНТ в лицо ~32

Урон падает с расстоянием и отбрасывает. Летящие обломки тоже бьют по пути. Всё идёт через обычный источник урона, поэтому броня, сопротивление и неуязвимость работают как обычно.

Это намеренно не зависит от режима разрушения: Неразрушимое — это обещание про блоки мира, а не про тебя. Выключается на F7, параметром hurtEntities в конфиге или геймрулом crashyEntityDamage по измерениям. Для строительного сервера hurtPlayers = false оставляет мобов уязвимыми, а игроков — нет.

11. Что вообще можно ломать

Ванильная взрывоустойчивость сама по себе плохой ориентир — у стекла и камня она одинаковая, 6, — поэтому остальное решают четыре тега блоков. То, что идёт в комплекте, — только отправная точка: модпак дополняет их сам, ради этого они и теги.

Тег Что делает В комплекте
#crashy:indestructible не ломается ни в одном режиме спавнеры, хранилища, маяки, укреплённый глубосланец
#crashy:fragile разлетается при четверти своей взрывоустойчивости стекло, листва, горшки, знамёна, ковры
#crashy:reinforced держится втрое лучше обсидиан, незерит, наковальни, стол зачарования
#crashy:explosive срабатывает от краша, как ТНТ ТНТ

#crashy:indestructible проверяется до режима, поэтому спавнер переживает и Моментальное.

Защита спавна сервера соблюдается, а protectedSpawnRadius добавляет вокруг точки появления зону без разрушений, которая работает и в одиночной игре.

Два геймрула стоят над настройками F7 и всегда важнее — правило может отличаться по измерениям и переключаться датапаком без открытия экрана:

  • crashyDestruction — можно ли здесь ломать блоки крашем
  • crashyEntityDamage — можно ли здесь ранить существ

12. Вода и лава

Паутина тормозит физический объект так же, как тебя: четверть горизонтальной скорости и двадцатая вертикальной за каждый тик внутри, вращение туда же. Объекты крупнее коробки в 4096 блоков не проверяются — паутина всё равно не остановит собор.

Краш в воду даёт огромный всплеск вместо воронки и звучит соответственно: вода держит удар намного лучше воздуха. Краш в лаву поджигает то, на что расплескался. Обе настройки — в [fluids]; waterDamping = 1.0 выключает первую.

13. Команды

Для операторов — почти всё, что идёт не так с большим крашем, это вопрос чисел.

Команда Что делает
/crashy stats живые обломки, очередь дробления, проверки опоры, объекты под наблюдением, физические тела по измерениям
/crashy debris settle превратить все обломки обратно в блоки прямо сейчас
/crashy queue clear сбросить очередь дробления

14. Что осталось без опоры — падает

Раньше краш ломал ровно то, что попало в радиус, поэтому выстрел по колоннам оставлял здание висеть над дырой. Теперь, когда пыль осела, блоки по краю воронки спрашивают, с чем они ещё связаны. То, что стоит на земле, дотягивается до ландшафта и остаётся на месте; кусок, у которого соседи кончились раньше, ни за что не держится — и падает.

Падает он как обломок, а не как вечный объект: бьёт то, на что приземлился, и оседает обратно в блоки там, где остановился, но сам блоков не ломает — именно это не даёт одному обрушению запустить следующее.

Дёшево это именно из-за обхода, а maxCollapseBlocks (256) — одновременно и сколько может рухнуть одним куском, и как далеко обход смотрит, прежде чем решить, что кусок — просто часть мира. Один обход запоминает, что он уже признал держащимся, до конца тика, и за тик собирается максимум один кусок, сколько бы обходов ни разрешал collapseChecksPerTick. Незагруженные чанки, защищённая территория, неразрушимые блоки и всё, что уже симулируется, считаются опорой.

15. Обломки летят пластами

Каждый сломанный блок становится физическим телом, а тело — это плот Sable, чанк и запись в пайплайне физики; поэтому потолок живых обломков считается в телах. Блоки, сломанные рядом друг с другом, свариваются в один кусок до debrisClusterSize (4) блоков: тот же потолок даёт вчетверо больше разрушений, а стена отваливается пластами, а не одинаковыми кубиками. Поставь 1 — вернётся одно тело на блок.

16. Трясёт

Краш, приземлившийся рядом, качает камеру — тем сильнее, чем он больше и чем ты ближе. Только камеру: прицел, попадания и всё, что видит сервер, не трогаются. Сервер может вообще не слать это (screenShake), игрок выбирает силу через screenShakeScale в config/crashy-client.toml, 0 — выключить.

17. Общий сервер

maxObjectsPerPlayer (12) и maxBlocksPerPlayer (4096) — сколько один человек может держать в воздухе одновременно, считается и так и так, потому что двенадцать хижин — это не двенадцать дирижаблей. Все остальные бюджеты мода принадлежат миру и общие: без этих лимитов один игрок, поднимающий дирижабли весь вечер, тратит их за всех. 0 снимает лимит. У активации по редстоуну виноватого нет — она живёт по общим лимитам мира. В одиночке (и в мире, открытом по локальной сети) лимиты не применяются вовсе: делить бюджет не с кем.

Чужую территорию мод не трогает. Прежде чем сломать блок мира, он проверяет собственную защиту спавна, потом кидает CrashyBreakEvent для аддонов, потом — если краш прослеживается до игрока, который сейчас в игре, — ванильный ивент слома блока NeoForge, тот самый, который claim-моды уже слушают. Территория, защищённая от кирки, оказывается защищена и от падающего дирижабля, без зависимостей между модами в обе стороны. respectClaims выключает последний шаг.

Клей чинится слизью, запускатель — железным слитком, на наковальне.


Установка

  1. Minecraft 1.21.1 + NeoForge 21.1.x
  2. Sable 2.0.0+https://modrinth.com/mod/sable (вместе с его зависимостями: Veil, Forge Config API Port)
  3. 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

Поддержать на Ko-fi