我试图写一个允许玩家飞行的插件。当它们飞行时,每一级都会下降,如果等级为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
答案 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());
}
}});