YuTeleport Bukkit 事件
YuTeleport 2.0.1.0 提供泛化传送生命周期事件。事件通过 TeleportType 区分随机传送、warp、home、tpa、坐标分享和 back,监听器应通过 getter 读取数据,不要修改插件内部状态。
事件总览
| 事件 | 可取消 | 触发时机 |
|---|---|---|
PlayerTeleportStartEvent | 是 | 策略预检通过后,进入等待或执行前。 |
PlayerTeleportDestinationEvent | 是 | 目的地已经确定,在实际传送之前。 |
PlayerTeleportCancelEvent | 否 | 因移动、受伤、交互、聊天、命令、离线、API、事件、插件关闭或经济扣费失败取消。 |
PlayerTeleportCompleteEvent | 否 | 请求生命周期结束时触发,成功和失败路径都会携带 TeleportResult。 |
事件字段
| 事件 | 关键 getter |
|---|---|
PlayerTeleportStartEvent | getPlayer()、getInitiator()、getType()、getCost() |
PlayerTeleportDestinationEvent | getPlayer()、getType()、getDestination() |
PlayerTeleportCancelEvent | getPlayer()、getType()、getReason() |
PlayerTeleportCompleteEvent | getPlayer()、getType()、getResult() |
getDestination() 与 TeleportResult#getDestination() 返回克隆位置。修改克隆不会改变实际传送目标。
TeleportType
text
RANDOM, WARP, HOME, TPA, SHARE, BACKTeleportCancelReason
text
MOVEMENT, DAMAGE, INTERACTION, CHAT, COMMAND, DISCONNECT,
API, EVENT, PLUGIN_DISABLE, ECONOMYECONOMY 表示找到目的地后扣费失败,例如玩家在等待期间花掉了余额。
监听示例
java
@EventHandler
public void onStart(PlayerTeleportStartEvent event) {
Player player = event.getPlayer();
if (event.getType() == TeleportType.RANDOM && isBlockedByCombat(player)) {
event.setCancelled(true);
}
}
@EventHandler
public void onComplete(PlayerTeleportCompleteEvent event) {
if (event.getResult().isSuccess()) {
getLogger().info(event.getPlayer().getName() + " completed " + event.getType());
}
}Folia 注意事项
不要在事件中同步加载区块或访问无关实体。事件所属玩家可以安全读取当前玩家状态;目标世界、其他实体或跨区域操作仍应交给对应 Region/Entity Scheduler。Future 回调同样不保证位于传统主线程。