副本中的实体
副本中有两种生物,处理方式不同。
| 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)使用绝对位置。 实体活动(要走的路径、巡逻)不会被平移到运行所在的槽位或世界。除非你确定该活动只使用相对移动,否则请将
activity留空(NPC 站着不动)。 - MythicMobsNPC:请关闭
ticking,并使用较新的构建。 开启了ticking的 MythicMobsNPC 定义,会为每个观看者创建一个真实的怪物。在副本中,请在该定义上把ticking设为关闭。这样服务器会为每位成员保留一个载体怪物,每个都对除该成员之外的所有人隐藏,点击会为正确的玩家恰好产生一次交互。这需要 MythicMobsNPC 5.0 或更高版本(按运行可见性的修复);更旧的构建会让载体对所有人可见,或显示两次。 - 在副本中由 MythicMobsNPC 播放的过场动画尚未测试。
- NPC 在显示范围(
showRange,或实体的默认值)之外会被隐藏,当成员走近时会重新出现。这是正常现象。 - 箱子的 NPC 锚点:处于
NPC放置方式的 Dungeon Loot Chest,在右键点击其npcAnchor实体时打开。
战斗怪物
Dungeon Mob Spawn 会让真实的原版怪物出现。
何时。 每次运行一次,在某位成员第一次进入房间(固定型副本)或标记点所在房间(生成型副本)时。它们绝不会重生。波次由 Dungeon Spawn Mobs 动作产生。在固定型副本中,即使房间的 enterOnce 关闭,进入房间也会让它们出现,并且每次运行只出现一次。
何地。
- 生成型副本:在指向该条目的房间模板的每个
MOB标记点。room和positions会被忽略。 - 固定型副本:当成员进入
room时,位于positions。room为空时不会自动发生任何事:只有 Spawn Mobs 动作会让该条目出现。dungeonInstance将该条目限制在某一个副本的运行中。
什么。 entityType(任意怪物;ENDER_DRAGON 和 WITHER 会被拒绝,并在日志中给出警告)、count(每个放置点 1 到 50)、spread(0 到 32 格)、名称、带有每个槽位掉落概率的 equipment、attributes(生命值、伤害、速度等),以及 randomizeData。
默认安全。 blockDamage、dropVanillaLoot 和 dropExperience 全都关闭。怪物不会破坏或烧毁任何东西(爆炸仍会伤害玩家),只会掉落你给它们的装备(除非你调高,否则掉落概率为 0),并且不给经验。副本的战利品来自它的箱子。掉落的物品在运行结束后仍留在世界中,所以在 SHARED_WORLD_SLOTS 副本中请保持 dropVanillaLoot 关闭。
它们属于该次运行。 运行结束时它们会被移除。某次运行的怪物绝不会以另一次运行的玩家为目标或伤害他们,另一次运行的玩家也无法伤害它。怪物分裂或变成的东西(史莱姆、岩浆怪、溺尸、唤魔者召唤的恼鬼)也同样属于该次运行。
和平模式。 在设为和平(Peaceful)的世界中,游戏会立即移除敌对怪物,所以扩展不会在那里生成它们:只有敌对类别的怪物会被拒绝(僵尸,也包括史莱姆、恶魂、幻翼、潜影贝等)。中立和被动的怪物仍会出现。该地点保持“欠账”状态,拒绝每个地点只记录一次日志,当难度被调高后,怪物会在之后的某次进入时出现。请调高该世界的难度,或选择非敌对类型。此行为尚未在游戏中验证。
物品与传送门。 副本怪物从不拾取物品(玩家丢下的装备会留在地上),也无法通过传送门离开:它留在运行所在的世界中,并且仍计入上限。
其他运行的玩家。 某次运行的怪物绝不会以另一次运行的玩家为目标或伤害他们,另一次运行的玩家也不应伤害它。在共享世界(SHARED_WORLD_SLOTS)中,这依赖的是过滤器而不是独立的世界,所以在重要的场合请使用隔离模式。
上限
Dungeon Instance 上的 maxAliveMobs 是一次运行中同时存活的最大怪物数(默认 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 |
| 出现方式 | 每次运行每个地点一次,不重生 |
NPC 的 allowedDungeonIds 为空 | 所有副本的每一次运行 |
| MythicMobsNPC 定义 | ticking 关闭,MythicMobsNPC 5.0 或更高版本 |
| 存活怪物 = 0 | 不代表“房间已清空”:上限或重载可能隐藏了欠账的怪物 |
| 平台 | 仅 Paper,不支持 Folia |
| NPC 活动 | 绝对位置,不会被平移 |
| 和平模式的世界 | 敌对怪物会被拒绝 |