跳到正文

YuTeleport Bukkit 事件

YuTeleport 2.0.1.0 提供泛化传送生命周期事件。事件通过 TeleportType 区分随机传送、warp、home、tpa、坐标分享和 back,监听器应通过 getter 读取数据,不要修改插件内部状态。

事件总览

事件可取消触发时机
PlayerTeleportStartEvent策略预检通过后,进入等待或执行前。
PlayerTeleportDestinationEvent目的地已经确定,在实际传送之前。
PlayerTeleportCancelEvent因移动、受伤、交互、聊天、命令、离线、API、事件、插件关闭或经济扣费失败取消。
PlayerTeleportCompleteEvent请求生命周期结束时触发,成功和失败路径都会携带 TeleportResult

事件字段

事件关键 getter
PlayerTeleportStartEventgetPlayer()getInitiator()getType()getCost()
PlayerTeleportDestinationEventgetPlayer()getType()getDestination()
PlayerTeleportCancelEventgetPlayer()getType()getReason()
PlayerTeleportCompleteEventgetPlayer()getType()getResult()

getDestination()TeleportResult#getDestination() 返回克隆位置。修改克隆不会改变实际传送目标。

TeleportType

text
RANDOM, WARP, HOME, TPA, SHARE, BACK

TeleportCancelReason

text
MOVEMENT, DAMAGE, INTERACTION, CHAT, COMMAND, DISCONNECT,
API, EVENT, PLUGIN_DISABLE, ECONOMY

ECONOMY 表示找到目的地后扣费失败,例如玩家在等待期间花掉了余额。

监听示例

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 回调同样不保证位于传统主线程。