gpt4 book ai didi

java - Bukkit-Plugin 中的位置未更新

转载 作者:行者123 更新时间:2023-12-01 12:39:51 26 4
gpt4 key购买 nike

我正在尝试编写一个插件,让玩家能够飞行。当它们飞行时,液位每秒都会下降,如果液位为 0,飞行就会关闭。但在我的 while 循环中,位置没有更新,因此水平下降了,尽管它们又回到了地面。我读到这是因为我停止了线程,但是我怎样才能以其他方式编写它,以便它仍然是轻量级的?这是我的代码:

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());
}});
}

}

等级指示器仅在其为 0 时更新。例如,我的等级为 8,我开始飞行,8 秒后我跌倒,我的等级发生变化。所以我看不到我还剩多少时间飞行......感谢您的回答,并对我的英语不好表示歉意;D

最佳答案

当您的 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());
}
}});

关于java - Bukkit-Plugin 中的位置未更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25216955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com