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




