跳到主要内容

飞行网络

飞行网络是同一世界中的一组节点,由双向连线相连。有名称的节点就是目的地。玩家在飞行管理员 NPC 或飞行传送门处选择目的地,坐骑便会沿着最短的连线链路把他们送过去。网络保存在 plugins/EliteMobs/transport_networks/,使用与运输路线相同的坐骑和旅程规则。

每次飞行都在玩家请求时即时生成。EliteMobs 以节点之间的直线距离为依据,在连线上运行 A* 搜索,坐骑则沿着一条穿过结果中每个节点的平滑曲线飞行。你不必为每一对目的地分别编写路线:新增的节点或连线会被所有因此缩短的飞行用到。

玩家如何飞行​

  1. 玩家右键点击飞行管理员 NPC,或踏入飞行传送门。
  2. 一个名为 Flight paths 的菜单会列出从该 NPC 或传送门所在节点可到达的每一个目的地(最多 54 个),按沿连线的距离由近到远排序。玩家尚未解锁的目的地显示为灰色染料,并附带其锁定提示。
  3. 点击目的地会开始倒计时,默认 60 刻(3 秒),倒计时结束时坐骑在出发点接上玩家。
  4. 坐骑沿路径飞行,并把玩家放在目的地,朝向其 arrivalYaw。

飞行管理员或传送门也可以跳过菜单,直接飞往某个目的地。参见飞行管理员和飞行传送门。

玩家点击目的地时必须在 NPC 或传送门 8 格范围内,否则点击不会有任何效果。在 NPC 处,倒计时期间的任何移动都会取消出发。在传送门处,只有玩家离开传送门区域(距其中心 1.5 × sizeMultiplier + 2 格)时才会取消倒计时。

飞行途中潜行不会让乘客下来。死亡、传送、切换世界、离开副本实例或坐骑被移除时,飞行会提前结束。如果飞行连续 5 秒没有任何进展,会把乘客放在目的地。乘客在副本实例之外的飞行途中断线,会在下次登录时被放置在目的地;停止或重载服务器时,已登乘的乘客也会被放置在目的地。

在游戏内构建网络​

编辑命令仅供玩家使用,需要 elitemobs.transport.admin 权限。

  1. 站在网络所在的世界,执行 /em transport network edit harbor_flights。还没有文件的网络会从空草稿开始。
  2. 站在玩家应当登乘的位置,执行 /em transport node add harbor。
  3. 向上飞起并执行 /em transport node add harbor_sky。如果没有列出相邻节点,新节点会连到当前选中的节点,且新节点会成为选中节点,因此连续执行 add 命令就能搭出一条路径。
  4. 继续飞到下一个目的地,用同样的方式添加。用 /em transport node link <a> <b> 连接分支。
  5. 用 /em transport node destination harbor &6Harbor 为每个目的地命名。
  6. 站在目的地,面向玩家抵达时应朝向的方向,执行 /em transport node yaw harbor。
  7. 用 /em transport network preview harbor mine 检查路径,并用 /em transport network ride harbor mine 试飞。
  8. 执行 /em transport network save。

节点和网络的 ID 为 1 至 64 个小写字母、数字、下划线或连字符。草稿会把你当前所在的世界记录为网络所在的世界;在副本实例内则记录该副本的蓝图世界。已有的网络只能在它自己所在的世界中编辑。

编辑器命令​

命令操作
/em transport network edit <network>打开已有网络的草稿,或新建一个网络
/em transport network list列出已加载的网络
/em transport network status显示草稿的节点数量和当前选中的节点
/em transport network preview [from] [to]显示两个节点之间的路径;不带节点则清除预览
/em transport network ride <from> <to>不保存,直接在草稿的两个节点之间试飞
/em transport network generate <first> <second>用能越过地形的生成节点替换两个节点之间的连线
/em transport network undo撤销上一次节点或连线编辑,最多保留 32 次编辑
/em transport network save保存草稿
/em transport network cancel丢弃草稿
/em transport node add <id> [neighbors...]在你站立的位置添加节点,并连到列出的节点;若未列出,则连到选中的节点
/em transport node select [node]选中一个节点;不带节点则选中离你最近的节点
/em transport node link <first> <second>双向连接两个节点
/em transport node unlink <first> <second>移除两个节点之间的连线
/em transport node move <node>把节点移到你站立的位置
/em transport node remove <node>移除节点及其连线
/em transport node destination <node> [name]将该节点设为目的地,并指定菜单名称;不带名称则恢复为普通途经点
/em transport node permission <node> <permission>要求拥有某个权限才能从该节点出发或飞往该节点;none 表示清除
/em transport node hint <node> [text]设置该节点被锁定时显示的消息;不带文本或使用 none 表示清除
/em transport node yaw <node>将抵达朝向设为你当前面朝的方向

Tab 补全会为 edit 建议网络 ID,为节点参数建议草稿中的节点 ID。除 edit、list、save、cancel 和 status 外,所有命令都要求你位于草稿所在的世界。同一时间只能编辑一个网络。草稿会一直保存在内存中,直到你保存或取消、断开连接、其所在世界卸载,或 EliteMobs 重载。

/em transport network ride 会先把你移到第一个节点并从那里出发,即使你身在别处。它不检查节点权限,目的地可以是任意节点,无论有没有名称。

/em transport reload 会同时重载网络文件和路线文件。已在空中的飞行继续沿用原来的路径。

编辑器视图​

只有正在编辑的玩家能看到草稿。128 格范围内的每个节点上方都会显示其 ID,目的地名称显示在第二行。选中节点的标签为黄色。连线绘制为浅蓝色线条。使用 preview 之后,路径会绘制为绿色。否则会有一条黄色曲线穿过选中节点,延伸到你站立的位置,显示如果在那里添加一个节点,飞行路径会如何弯曲。

生成占位节点​

两个相距较远的节点之间的直线连线可能会穿过山丘。/em transport network generate <first> <second> 会改为沿着地形搭出一条节点链:

  • 它沿两个节点之间的直线每隔 4 格读取一次地面高度,读取范围为三列宽。它只读取已经生成的区块,且每刻最多加载其中两个,因此绝不会生成新地形。
  • 链上的每个点都在前后约 32 格范围内最高地面之上 12 格处飞行,且绝不低于两个节点之间的直线。各点也始终至少比建筑高度上限低 4 格。
  • 它大约每 48 格放置一个节点;当这条链的飞行高度比某一端高出超过 2 格时,还会在该端正上方额外放置一个节点。
  • 它会移除直接连线,并通过这条节点链把两个节点连起来。

两个节点的水平距离必须至少为 16 格。生成的节点命名为 <first>_<second>_1、<first>_<second>_2,依此类推,并以 placeholder: true 保存,方便你日后找到它们。一次 undo 会移除整条节点链。保存之前请先试飞结果:生成器只看地形,不看建筑或树木。

网络 YAML​

harbor_flights.yml 示例:

isEnabled: true
world: my_world
transportEntity: transport_cannon_seat.yml
speed: 24.0
acceleration: 16.0
countdownTicks: 60
nodes:
harbor:
location: 120.5,64.0,-340.5
name: '&6Harbor'
arrivalYaw: 90.0
neighbors:
- harbor_sky
harbor_sky:
location: 120.5,96.0,-340.5
neighbors:
- harbor
- ridge_pass
ridge_pass:
location: 310.0,110.0,-180.0
neighbors:
- harbor_sky
- mine_sky
- watchtower_sky
watchtower_sky:
location: 455.5,102.0,-60.5
neighbors:
- ridge_pass
- watchtower
watchtower:
location: 455.5,81.0,-60.5
name: '&6Watchtower'
arrivalYaw: -45.0
permission: elitequest.watchtower_supplies.yml
lockedHint: '&7Finish the quest "Watchtower Supplies" to unlock this flight point.'
neighbors:
- watchtower_sky
mine_sky:
location: 260.0,95.0,20.0
neighbors:
- mine
- ridge_pass
mine:
location: 262.5,70.0,24.5
name: '&6Old Mine'
arrivalYaw: 180.0
neighbors:
- mine_sky
键默认值说明
isEnabledtrue是否加载该网络
world无节点所在的世界。必填
transportEntitytransport_cannon_seat.ymlcustombosses/ 中用作坐骑的已启用文件。在那里配置它的实体类型、模型和能力
speed24最高速度,单位为格/秒。必须为正数
acceleration16每秒增加的速度(格/秒),直到达到最高速度。必须为正数
countdownTicks60选择目的地到登乘之间的刻数。零或更大
nodes无节点 ID 到节点配置段的映射

没有 world、transportEntity 不是 .yml 文件名,或速度、加速度、倒计时无效的网络,会记录一条警告且不会加载。

节点键​

键说明
location网络所在世界中的 x,y,z。必填
name菜单名称。有名称的节点是目的地;没有名称的节点是飞行途中经过的途经点。支持颜色代码
arrivalYaw玩家抵达该目的地时面朝的方向。默认为 0
permission从该节点出发或飞往该节点所需的权限
lockedHint该节点被锁定时显示的文本。默认为 &7You have not unlocked this flight point.
neighbors该节点所连接的节点 ID
placeholder由生成器生成的节点为 true。飞行对待它们与其他节点没有区别

连线是双向的,因此只需在一侧列出相邻节点即可。EliteMobs 会对指向不存在的节点或同一位置节点的连线发出警告并丢弃,跳过无效节点,对没有相邻节点的节点发出警告;在拥有多个目的地的网络中,还会对无法到达任何其他目的地的目的地发出警告。

从编辑器保存时只会重写 nodes 部分,并在仍然存在的节点内保留注释和未知键。新文件还会写入上述网络设置及其默认值。编辑器拒绝覆盖已禁用或加载失败的网络文件;请先修复或移除该文件。

坐骑严格沿着曲线飞行,不会绕开障碍,因此请为坐骑和乘客留出节点之间畅通的空间。实体类型为鸡或鹦鹉的坐骑在飞行时会掉落羽毛并拍动翅膀。坐骑无法生成时会发生什么,参见路线净空与中断。

飞行管理员​

飞行管理员是 interactionType: TRANSPORT 并带有网络的 NPC:

interactionType: TRANSPORT
transportNetwork: harbor_flights
transportNode: harbor

将这些字段添加到有效的 NPC 定义中。transportNode 是该 NPC 的飞行出发节点。坐骑在该节点接上玩家,因此请把它放在 NPC 旁边。添加 transportDestination: mine 可跳过菜单,直接飞往该目的地。设置了 transportNetwork 时,NPC 会忽略 transportRoutes。

飞行传送门​

带有 flight 部分的虫洞会打开飞行菜单,而不是进行传送:

isEnabled: true
location1: my_world,120.5,66,-336.5,90,0
style: ICOSAHEDRON
particleColor: 0xf0c060
sizeMultiplier: 2.0
flight:
network: harbor_flights
node: harbor

flight.node 是出发节点,坐骑在那里接上玩家,因此请把该节点放在传送门处。flight.destination 会跳过菜单,直接飞往该目的地。飞行传送门只需要 location1;如果同时设置了 location2,两端会打开同一个菜单。它不会扣除 coinCost,也不会应用 blindPlayer,但它的 permission 仍然生效。要重新打开菜单,需走出传送门区域再走回来,且距上一次打开至少过去 5 秒。

虫洞不会对正在乘坐飞行坐骑的玩家触发。降落在传送门内的玩家必须先走出传送门,并等待 5 秒,它才会再次触发。

锁定的飞行点​

带有 permission 的节点对没有该权限的玩家处于锁定状态。飞行只检查出发节点和目的地节点,因此路径可以经过被锁定的途经点。要用任务来解锁某个目的地,请把该任务的 questLockoutPermission 标记(例如 elitequest.watchtower_supplies.yml)用作该节点的权限。玩家完成任务时就会获得它。

出发节点被锁定时,玩家会收到它的 lockedHint,而不是菜单。被锁定的目的地仍留在菜单中,显示为灰色,点击时会显示它的提示。

启用 /em quest bypass 的玩家会通过所有节点权限检查。

实例化副本内的飞行​

将 world 设为副本的蓝图世界。在副本实例内发起的飞行,会在该玩家自己的那份世界中飞行。请使用带有 flight 部分的实例化虫洞或实例化 NPC 作为飞行点。乘客在实例内的飞行途中断线,登录时不会被放置在目的地;此时适用副本自己的玩家返回规则。