位置未在Bukkit-Plugin中更新

时间:2014-08-09 09:05:31

标签: java plugins while-loop location bukkit

我试图写一个允许玩家飞行的插件。当它们飞行时,每一级都会下降,如果等级为0,则飞行将关闭。但是在我的while循环中,位置没有更新,因此水平降低了,所以它们再次回到了地面。我读到这是因为我停止了Thread,但是我怎么能以其他方式编写它,以便它仍然是轻量级的? 这是我的代码:

public void onPlayerToggleFlight(final PlayerToggleFlightEvent e) {
        if(!e.getPlayer().isFlying()){
            final Player p = e.getPlayer();
            if(p.getGameMode() == GameMode.CREATIVE)
                return;
            getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
                public void run() {
                    while((p.getLevel() >= 0) && (p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.AIR)){
                        System.out.println(e.getPlayer().getLocation());
                        p.setLevel(p.getLevel() - 1);
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                    }
                    p.setAllowFlight(false);
                    System.out.println(p.getLocation());
                    }});
        }

    }

并且Levelindicator仅在其0时更新。例如我的等级为8并且我开始飞行,8秒后我跌倒并且我的等级改变。所以我不知道我还有多少时间飞... 谢谢你的回答,抱歉我的英语不好; D

1 个答案:

答案 0 :(得分:1)

while循环运行时,整个服务器被冻结(哎呀!)。

了解您如何安排任务?你需要继续这样做,而不是一次,然后使用Thread.sleep

getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){
    public void run() {
        if((p.getLevel() >= 0) && (p.getLocation().subtract(0, 1, 0).getBlock().getType() == Material.AIR)){
            System.out.println(e.getPlayer().getLocation());
            p.setLevel(p.getLevel() - 1);
            // Schedule this task to happen again in one second
            getServer().getScheduler().scheduleSyncDelayedTask(YourPluginClass.this, this, 1000);
        } else {
            p.setAllowFlight(false);
            System.out.println(p.getLocation());
        }
    }});