后台执行命令
这时候我突然之间有一个需求,我希望在玩家完成传送后播报这件事,这很炫酷不是吗?
于是我盯上了服务端中的say
命令,我希望在玩家传送后会在后台执行/say XXX刚刚随机传送了!
。
我们可以这样写getServer().dispatchCommand(getServer().getConsoleSender(),"say XXX刚刚随机传送了!");
可如果你直接把这个语句加在刚刚代码的player.teleportAsync(target);
下面,你会发现后台抛出了错误信息:java.lang.IllegalStateException: Dispatching command async
! 这是说明你没有在正确的线程上调用这个API。在Folia中,如果你希望在调度中使用控制台执行命令,你需要使用GlobalRegionScheduler
。于是你需要写这样的代码:
Random random = new Random();
Location target = player.getLocation().set(random.nextInt(500),100,random.nextInt(500));
player.sendTitle("三秒后传送","...");
player.getScheduler().runDelayed(this, new Consumer<ScheduledTask>() {
@Override
public void accept(ScheduledTask scheduledTask) {
player.teleportAsync(target);
Bukkit.getGlobalRegionScheduler().run(instance, new Consumer<ScheduledTask>() {
@Override
public void accept(ScheduledTask scheduledTask) {
getServer().dispatchCommand(getServer().getConsoleSender(),"say "+player.getName()+"刚刚随机传送了!");
}
});
}
}, new Runnable() {
@Override
public void run() {
System.out.println("错误:玩家不存在!");
}
}, 60L);
还记得吗?你可以在调度任务中进行任务调度。
GlobalRegionScheduler
GlobalRegionScheduler,正如其命名,它用于执行一些全局任务,例如世界时间、天气、控制台执行命令等内容。这些任务明显的特点为不属于任何区域,而是一种全局的状态。