You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Bukkit插件开发求助:如何让时间设置命令延迟5秒执行

解决Bukkit插件中延迟执行设置时间的问题

嘿,我完全懂你的困扰——现在的代码里设置时间和加药水效果是同步跑的,自然会立刻变白天,根本等不到药水效果结束对吧?

在Bukkit插件开发里,绝对不能用Thread.sleep()来做延迟,那样会直接卡死服务器主线程,整个服务器都会瘫痪。正确的做法是用Bukkit自带的**调度器(Scheduler)**来实现延迟任务,既能保证药水效果正常生效,又能精准在5秒后执行改时间的操作。

修改后的完整代码示例

// 先给玩家施加药水效果,这部分保留你原有代码即可
p.addPotionEffect(new PotionEffect(PotionEffectType.BLINDNESS, 100, 100, true));
// 这里可以继续添加你需要的其他药水效果,比如:
// p.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, 100, 2, true));

// 使用Bukkit调度器延迟5秒执行设置时间的操作
// 注意:把YourPlugin替换成你自己的插件主类名
Bukkit.getScheduler().runTaskLater(YourPlugin.getInstance(), () -> {
    // 5秒后执行的逻辑:将玩家所在世界的时间设置为白天(1000)
    p.getWorld().setTime(1000L);
}, 100L); // 100游戏刻 = 5秒(Bukkit中1秒=20游戏刻)

关键细节说明

  • 调度器的作用runTaskLater会把你的延迟任务加入Bukkit的任务队列,在指定游戏刻数后自动执行,完全不会阻塞当前主线程,所以药水效果能正常持续5秒。
  • 刻数计算:Bukkit的游戏运行速度是20刻/秒,所以5秒对应的就是100L(必须加L后缀,因为参数是long类型)。
  • 插件实例获取:第一个参数必须传入你的插件主类实例,如果你还没写获取方法,可以在主类里加这段代码:
    public class YourPlugin extends JavaPlugin {
        private static YourPlugin instance;
    
        @Override
        public void onEnable() {
            instance = this;
        }
    
        public static YourPlugin getInstance() {
            return instance;
        }
    }
    
  • 可选优化:如果担心玩家在5秒内下线导致不必要的操作,可以在延迟任务里加个判断:
    if (p.isOnline()) {
        p.getWorld().setTime(1000L);
    }
    

不过改世界时间是针对整个世界的,就算玩家下线也不影响,这个判断看你需求来加就行。

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

火山引擎 最新活动