You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Bukkit插件实现从10开始的游戏启动倒计时功能

Bukkit插件倒计时功能实现方案

错误方案原因说明

  • Object.wait(long):一方面该方法要求调用前必须在synchronized代码块中持有对应对象的锁,否则就会抛出你遇到的IllegalMonitorStateException异常;另一方面直接在服务端主线程调用wait会阻塞整个MC服务端逻辑,导致玩家卡顿、无响应,本身就不适合在Bukkit插件中使用。
  • BukkitScheduler.setRepeatingDelayedTask():该方法是远古版本Bukkit API的方法,早在1.8之后的版本就已经被移除,自然会在编辑器中报错。

正确实现方案

推荐使用BukkitRunnable实现同步倒计时,完全跑在服务端主线程,不存在线程安全问题,逻辑实现也更简洁。你可以直接在start-game指令的执行逻辑中插入如下代码:

// 倒计时总秒数可按需调整
int countdownTotal = 10;
new BukkitRunnable() {
    int remaining = countdownTotal;
    @Override
    public void run() {
        if (remaining <= 0) {
            // 倒计时结束,执行你自己的游戏启动逻辑
            Bukkit.broadcastMessage("锦标赛正式开始!");
            startGame();
            cancel();
            return;
        }
        // 每秒向全服广播倒计时提示,可按需修改通知范围和内容
        Bukkit.broadcastMessage("锦标赛将在 " + remaining + " 秒后启动");
        remaining--;
    }
// 第一个参数为首次执行延迟(20服务器刻=1秒,填0表示立即执行第一次计数)
// 第二个参数为每次执行的间隔,填20L即间隔1秒
}.runTaskTimer(你的插件主类实例, 0L, 20L);

注意事项

  • 代码中的你的插件主类实例需要替换为你自己插件中继承JavaPlugin的主类对象,一般在指令执行器中可以通过预先传入的plugin变量获取。
  • 不要使用异步任务实现倒计时,所有和玩家、方块、实体交互的逻辑都必须在服务端主线程执行,否则会触发线程安全问题导致服务端崩溃。

内容的提问来源于stack exchange,提问作者littleBitsman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 18:06:07