后台执行命令
这时候我突然之间有一个需求,我希望在玩家完成传送后播报这件事,这很炫酷不是吗?
于是我盯上了服务端中的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,正如其命名,它用于执行一些全局任务,例如世界时间、天气、控制台执行命令等内容。这些任务明显的特点为不属于任何区域,而是一种全局的状态。