Bukkit 自定义死亡系统

Bukkit Custom death system

我正在为我的世界服务器制作一个 bedwars 插件,我实际上在自定义死亡系统中,我有一个有效的代码:

    @EventHandler
    public void onPlayerDeath(PlayerDeathEvent e) {
        e.getEntity().spigot().respawn();
        String[] pos = Main.death_coords.split("\*");
        World w = e.getEntity().getWorld();
        Location loc = new Location(w, Double.parseDouble(pos[0]), Double.parseDouble(pos[1]), Double.parseDouble(pos[2]));
        e.getEntity().teleport(loc);
        e.getEntity().setGameMode(GameMode.SPECTATOR);

        task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, () -> {
            int count = 5;
            if(count == 0) {
                task.cancel();
                sendtitle("SusyBaka", e.getEntity());
                e.getEntity().setGameMode(GameMode.SURVIVAL);
            } else {
                count--;
                sendtitle(Integer.toString(count), e.getEntity());
            }
        }, 20, 20);
    }

但是当我被杀时,我卡住了,因为 count 每秒都是一个新变量,它卡住了一个 5,我试图让 count 成为一个 public int 变量,但它只适用于 1 次死亡,否则是即时重生。 如何实现?

count 变量放在方法之外(即 public)是个好主意。实际上,你是这样做的:

  1. 计数 = 5。计数 -1 -> 4。
  2. 计数 = 5。计数 -1 -> 4。
  3. 计数 = 5。计数 -1 -> 4。
  4. 等...

您必须将计数器设置为 public,但也 link 给用户。你可以用地图来做。

还有一个更好的解决方案:在这种情况下不要使用 lambda,而是使用它:

@EventHandler
public void onPlayerDeath(PlayerDeathEvent e) {
   // here your code

   task = Bukkit.getServer().getScheduler().runTaskTimer(Main.plugin, new Runnable() {
        // complete runnable instance instead of implicit one
        private int count = 5; // counter define only for this runnable instance

        @Override
        public void run() {
            if(count == 0) {
                task.cancel();
                // finished
            } else {
                count--; // here it will remove 1 but keep it for next iteration
                sendtitle(Integer.toString(count), e.getEntity());
            }
        }
    }, 20, 20);
}