Сущности в подземельях
В подземелье есть два вида живых существ, и обрабатываются они по-разному.
| NPC | Боевой моб | |
|---|---|---|
| Запись | Dungeon NPC Instance | Dungeon Mob Spawn |
| Что это | Любое определение сущности Typewriter (собственные сущности Typewriter, MythicMobsNPC, BetterModel и так далее) | Настоящий ванильный моб |
| Кто видит | Только участники забега | Все в мире, но он принадлежит забегу |
| Когда появляется | Пока существует забег | Один раз за забег, при первом входе участника в его комнату |
| Размещение | spawnLocation (фиксированное) или маркер NPC (генерируемое) | room + positions (фиксированное) или маркеры MOB (генерируемое) |
NPC забега
Dungeon NPC Instance показывает NPC для каждого забега, в мире этого забега, только участникам этого забега. Игрок, не являющийся участником (другой забег в том же общем мире или игрок, который вышел), ничего не видит. Участник, покинувший забег, сразу теряет NPC.
- Создайте определение сущности как обычно (сущность Typewriter, MythicMobsNPC, BetterModel...). Всегда выбирайте его по ссылке, а не вводя id.
- Добавьте Dungeon NPC Instance и задайте
definition. - В фиксированном подземелье задайте
spawnLocation: позицию в шаблонном мире. Слот забега сдвигает её. В генерируемом подземелье поставьте маркерNPCв шаблоне комнаты и направьте его полеnpcна экземпляр.spawnLocationигнорируется.
allowedDungeonIds перечисляет экземпляры подземелий, забеги которых показывают NPC. Пусто означает все забеги всех подземелий. В фиксированном подземелье один и тот же spawnLocation применяется ко всем затронутым подземельям, поэтому ограничивайте список, если подземелья различаются. В генерируемом подземелье NPC показывается только в забеге, в планировке которого есть маркер NPC, указывающий на него. Если несколько маркеров (или несколько комнат) называют один и тот же экземпляр, учитывается только первый в порядке планировки.
group по умолчанию пуст: аудитория — участники забега, один NPC на забег. Выбирайте запись группы, только чтобы разделить одного NPC между участниками этой группы внутри одного забега.
Ограничения NPC
- Активности используют абсолютные позиции. Активность сущности (путь для ходьбы, патруль) не сдвигается в слот или мир забега. Оставляйте
activityпустым (NPC стоит на месте), если только не знаете, что активность использует лишь относительное движение. - MythicMobsNPC: выключайте
tickingи используйте свежую сборку. Определение MythicMobsNPC с включённымtickingсоздаёт настоящего моба для каждого зрителя. В подземельях выключайтеtickingв определении. Тогда сервер держит по одному мобу-носителю на участника, скрытому от всех, кроме этого участника, а клик даёт ровно одно взаимодействие для нужного игрока. Для этого нужен MythicMobsNPC 5.0 или новее (исправление видимости для каждого забега); более старые сборки показывают носителя всем или дважды. - Кинематографическая сцена, воспроизводимая MythicMobsNPC в подземелье, не проверялась.
- NPC скрыт за пределами дальности показа (
showRangeили значение по умолчанию для сущностей) и возвращается, когда участник подходит ближе. Это нормально. - Привязки сундуков к NPC: Dungeon Loot Chest с размещением
NPCоткрывается правым кликом по его сущностиnpcAnchor.
Боевые мобы
Dungeon Mob Spawn вызывает настоящих ванильных мобов.
Когда. Один раз за забег, при первом входе участника в комнату (фиксированное подземелье) или в комнату маркера (генерируемое подземелье). Они никогда не возрождаются. Волны создаются действием Dungeon Spawn Mobs. В фиксированном подземелье вход в комнату вызывает их, даже если enterOnce комнаты выключен, и только один раз за забег.
Где.
- Генерируемое подземелье: у каждого маркера
MOBшаблона комнаты, указывающего на запись.roomиpositionsигнорируются. - Фиксированное подземелье: в
positions, когда участник входит вroom. При пустомroomавтоматически ничего не происходит: запись появляется только по действию Spawn Mobs.dungeonInstanceограничивает запись забегами одного подземелья.
Что. entityType (любой моб; ENDER_DRAGON и WITHER отклоняются с предупреждением в логе), count (от 1 до 50 на размещение), spread (от 0 до 32 блоков), имя, equipment с шансом выпадения для каждого слота, attributes (здоровье, урон, скорость...) и randomizeData.
Безопасно по умолчанию. blockDamage, dropVanillaLoot и dropExperience все выключены. Мобы ничего не ломают и не жгут (взрыв по-прежнему ранит игроков), роняют только выданное вами снаряжение (с шансом выпадения 0, пока вы его не повысите) и не дают опыта. Добыча подземелья берётся из его сундуков. Выброшенные предметы остаются в мире после забега, поэтому держите dropVanillaLoot выключенным в подземелье SHARED_WORLD_SLOTS.
Они принадлежат забегу. Они удаляются, когда забег заканчивается. Моб одного забега никогда не нацеливается на игроков другого забега и не ранит их, а игроки другого забега не могут ранить его. То, на что моб делится или во что превращается (слаймы, магмовые кубы, утонувший зомби, вексы, вызванные заклинателем), тоже принадлежит забегу.
Мирная сложность. Игра сразу удаляет враждебных мобов в мире с мирной сложностью, поэтому расширение не вызывает их там: отклоняются только мобы враждебного класса (зомби, но также слаймы, гасты, фантомы, шалкеры...). Нейтральные и пассивные мобы по-прежнему появляются. Место остаётся «в долгу», отказ записывается в лог один раз на место, а мобы появятся при последующем входе после повышения сложности. Повысьте сложность мира или выберите невраждебный тип. Это поведение ещё не проверено в игре.
Предметы и порталы. Моб подземелья никогда не подбирает предметы (снаряжение, выброшенное игроком, остаётся на земле) и не может уйти через портал: он остаётся в мире забега и по-прежнему учитывается в лимите.
Игроки других забегов. Моб забега никогда не нацеливается на игроков другого забега и не ранит их, а игроки другого забега не должны ранить его. В общем мире (SHARED_WORLD_SLOTS) это держится на фильтрах, а не на отдельных мирах, поэтому используйте изолированный режим, когда это важно.
Лимит
maxAliveMobs у Dungeon Instance — наибольшее число одновременно живых мобов в одном забеге (по умолчанию 150, не более 500; 0 означает, что мобы не появляются). Размещение, которое превысило бы лимит, вызывает только поместившихся мобов и сообщает об этом в логе сервера. Остаток остаётся в долгу (хранится вместе с забегом, в том числе после перезагрузок) и появляется, насколько позволит лимит, при следующем входе участника в комнату, но суммарно никогда не больше count записи.
Смерть
onDeathу записи: триггеры выполняются каждый раз, когда умирает один из её мобов, для игроков, выбранныхdeathRecipients(по умолчаниюKILLER_OR_MEMBERS).- Когда умирает моб подземелья (
on_dungeon_mob_death): событие, на которое можно подписаться откуда угодно, с фильтром по подземелью и по записи моба. - Учитываются только мобы, созданные записью. Слайм, который делится, даёт одну награду и одно событие, а не по одному на каждый кусок. То, что выходит из моба (куски, вексы, детёныши, подкрепление), относится к забегу, но ничего не запускает.
Как понять, что комната зачищена
Dungeon Mobs Alive (dungeon_mobs_alive) считает живых мобов забега или одной записи. 0 не означает, что комната зачищена: лимит мог удержать часть мобов, а после перезагрузки мобы считаются заново. Используйте событие смерти, затем действие Dungeon Clear Room, чтобы сообщить, что комната зачищена.
Волны и масштабирование по числу игроков
По умолчанию появляется одна волна сразу, а число мобов не зависит от игроков. Это меняют три группы полей.
- Игроки.
perExtraPlayerдобавляет мобов в каждой точке за каждого игрока сверх первого:count+perExtraPlayer× (игроки − 1).maxCount— потолок (0= без собственного потолка; по-прежнему действуют 50 на точку иmaxAliveMobsподземелья).playerCountSourceопределяет, кто считается:PRESENT_IN_ROOM(по умолчанию) — участники забега, находящиеся в комнате в момент запуска,RUN_MEMBERS— участники забега в сети. - Темп.
maxSimultaneous— наибольшее число живых мобов одного места одновременно (0= все сразу). Следующие появляются по мере гибели первых. Относится ко всему месту, а не к каждой точке. - Волны.
waves— упорядоченный список. У каждой волны своиcountиperExtraPlayer, необязательныйentityType(иначе берётся тип записи; снаряжение, атрибуты и имя всегда берутся из записи),startиdelayTicks.AFTER_PREVIOUS_CLEAREDзапускает волну черезdelayTicksпосле уничтожения предыдущих;AFTER_DELAY— черезdelayTicksпосле начала предыдущей, уничтожена она или нет. При наличии волнcountзаписи не используется. Волна с отклонённым типом пропускается с предупреждением, следующая продолжается. Действие Dungeon Spawn Mobs сразу запускает следующую волну записи с волнами.
Триггеры: onWaveStart и onWaveCleared у волны, onWaveCleared у записи (после каждой волны) и onCleared у записи, когда всё место зачищено. Они выполняются для каждого участника забега в сети, один раз на место и на событие. Сначала выполняются триггеры смерти. Место считается зачищенным, когда все волны начались и ни один моб не жив и не ждёт места под потолком.
Волны не переживают перезагрузку. Место, которое ещё должно было выпустить мобов, выпускает их одной партией (count записи) при следующем входе участника в комнату, без события. Не начавшиеся волны теряются.
Сундук появляется, когда все мобы побеждены
- Создайте Dungeon Loot Chest там, где должен стоять сундук, и включите
manualMode, чтобы он не ставился при старте забега. - Создайте действие Loot Chest Trigger, у которого
chestEntry— этот сундук. ОставьтеtriggerModeвONCE(раз за забег, даже если триггеры выполняются для каждого участника). При желании добавьте звук иparticleEffect. - В Dungeon Mob Spawn добавьте действие в
onCleared. Чтобы реагировать в другом месте, создайте событие On Dungeon Mobs Cleared, отфильтруйте его поmobи поместите действие в егоtriggers.
Сундук появляется в мире забега, когда побеждён последний моб места. Для сундука после каждой волны используйте onWaveCleared волны.
Ограничения вкратце
| Ограничение | Значение |
|---|---|
Мобов на размещение (count) | от 1 до 50 |
Радиус разброса (spread) | от 0 до 32 блоков |
Живых мобов за забег (maxAliveMobs) | по умолчанию 150, не более 500 |
| Отклоняемые типы мобов | ENDER_DRAGON, WITHER |
| Появление | Один раз за забег на место, без возрождения |
Пустой allowedDungeonIds у NPC | Все забеги всех подземелий |
| Определение MythicMobsNPC | ticking выключен, MythicMobsNPC 5.0 или новее |
| Живых мобов = 0 | Не «комната зачищена»: лимит или перезагрузка могут скрывать мобов «в долгу» |
| Платформа | Только Paper, без Folia |
| Активность NPC | Абсолютные позиции, не сдвигаются |
| Мирный мир | Враждебные мобы отклоняются |