跳到主要内容

CannonRTP API

CannonRTP 向其他插件公开了三个 Bukkit 事件以供接入。所有事件位于 com.magmaguy.cannonrtp.api 包中,并在服务器主线程上触发。

要进行监听,只需注册一个普通的 Bukkit @EventHandler —— 无需额外的注册步骤。

CannonRTPLaunchEvent

在玩家即将开始炮台发射序列的瞬间触发,应用任何视觉效果或特效之前。可取消。

属性类型描述
playerPlayer触发炮台的玩家
cannonIdString炮台的配置 id(去掉 .yml 的文件名)
cannonDisplayNameString炮台的 displayName 字段
cannonLocationLocation被触发的具体放置点位置
destinationLocation为本次发射选定的、已通过预验证的安全落点

取消事件会完全中止此次发射:玩家停留在原地,不应用任何效果,且目的地会被退还到炮台队列的头部,供下次发射重新使用。适用于基于区域的黑名单、冷却插件、经济门控或 PvP 区域检查。

@EventHandler
public void onLaunch(CannonRTPLaunchEvent event) {
if (event.getPlayer().getWorld().getName().equals("event_world")) {
event.setCancelled(true);
}
}

CannonRTPLocationValidationEvent

在 CannonRTP 进行预加载搜索时,对每个候选落点进行验证时触发。仅在所有内置检查(世界边界、表面、不安全材料、保护插件集成)通过之后才触发。

属性类型描述
cannonIdString正在执行搜索的炮台的配置 id
cannonDisplayNameString炮台的 displayName 字段
candidateLocation正在考量的候选落点

该事件在 Bukkit 意义上不可取消。如需否决某个候选点,请调用:

event.setRejected("inside arena spawn protection");

CannonRTP 之后会像该候选点未通过内部检查一样将其丢弃并继续搜索。监听器可以实现超出内置保护适配器之外的自定义区域规则。

注意:该事件在主线程的预加载尝试期间触发(全局每 tick 一次,在活跃炮台之间轮询)。请保持处理器轻量。

CannonRTPLandingEvent

在玩家被传送到目的地且发射序列完全结束之后触发(LANDING 阶段已运行、缓降已移除、落地爆发已播放)。不可取消 —— 如需在发射前否决,请使用 CannonRTPLaunchEvent

属性类型描述
playerPlayer刚刚着陆的玩家
cannonIdString发射该玩家的炮台的配置 id
cannonDisplayNameString炮台的 displayName 字段
destinationLocation玩家被送往的目的地的副本

适用于在首次到达时发放奖励、触发后续特效、授予区域权限、广播到达消息或用于数据分析。

线程与生命周期

  • 这三个事件均在主线程上分派。
  • CannonRTPLocationValidationEvent 在全局预加载 tick 中分派(每服务器 tick 一次尝试,在活跃炮台之间轮询),因此监听器中的繁重工作会明显拖慢炮台填充其队列的速度。
  • CannonRTPLaunchEventLaunchSequence 构造之前立即分派,因此你修改的任何状态(药水效果、物品栏、游戏模式)会在 searching 阶段开始之前生效。
  • CannonRTPLandingEvent 每次发射只分派一次,在 LANDING 阶段的 tick 中、落地爆发之后分派。

使用 cannonId

cannonId 与所有管理员命令(/wc place/wc target 等)所使用的 id 相同,并与去掉 .yml 的炮台配置文件名一致。请注意,一份炮台配置可能驱动多个世界中的放置点;它们都共享相同的 cannonIdcannonDisplayName。如果你需要具体的放置点,请使用 CannonRTPLaunchEvent 中的 cannonLocation