随着玩家加入,Bukkit计时器加速

时间:2017-11-10 15:21:45

标签: minecraft bukkit

我创建了一个Bukkit可运行计时器,计算所有玩家在游戏开始时会在其记分牌上看到的计数器,但我注意到每个加入计时器的玩家都会上升2.我不知道如何解决这个,建议?我一直在四处寻找,却没有找到解决方法。

InGame课程:

memset(*mappedMemory, 3, 1024);

主类代码:

public class InGame extends BukkitRunnable implements Listener{

    private Main main;

    public InGame(Main main) {
        this.main = main;

    }

    public static int time;

    public void run() {
        if (time == 300) {
            if (GameState.getCurrentGamestate() == GameState.INGAME) {
                Bukkit.broadcastMessage(Main.prefix + "§b5 " + "§6minutes has passed!");
                for(Player all : main.players) {
                    all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);
                }

                return;
            }
        }

        if(time == 6000) {
            Bukkit.broadcastMessage(Main.prefix + "§b10 " + "§6minutes has passed!");
            for(Player all : main.players) {
                all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);

            }

        }
        if(time == 12000) {
            Bukkit.broadcastMessage(Main.prefix + "§b20 " + "§6minutes has passed!");
            for(Player all : main.players) {
                all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);

            }

        }
        if(time == 18000) {
            Bukkit.broadcastMessage(Main.prefix + "§b30 " + "§6minutes has passed!");
            for(Player all : main.players) {
                all.playSound(all.getLocation(), Sound.NOTE_PLING, 1, 1);

            }

        }

        time += 1;
    }
}

1 个答案:

答案 0 :(得分:1)

所以你为每个加入的玩家制作一个Runnable,然后在每个Runnable中为你的计时器添加+1。因此,如果有12个玩家加入,则每秒有12个Runnable,所以它每秒增加12次+1秒。

要解决此问题,请不要让游戏线程控制一个事件。在不使用任何事件的情况下以可靠的方式控制它。仅使用事件来控制带有播放器的ArrayLists并检查线程中的ArrayLists。

如果您使用多个线程访问其中一个线程中的某些内容,则应使用synchronized关键字。我建议你深入研究它。

我为此做了一个小例子,我希望这会更清楚。

主要课程:

public class Game extends BukkitRunnable {

   private Main main;

   private int time;

   public Game(Main main) {
      this.main = main;
   }

   public void run() {
      for(Player player : main.players) {
         final org.bukkit.scoreboard.Scoreboard s = Bukkit.getScoreboardManager().getNewScoreboard();
         player.setScoreboard(s);
         final Objective o = s.registerNewObjective("sidebar", "dummy");

         o.setDisplayName("Sidebar");
         o.setDisplaySlot(DisplaySlot.SIDEBAR);
         o.getScore("Time: " + this.time).setScore(12);
      }

      // Don't count if there are no players
      if (!main.players.isEmpty()) {
         this.time++;
      }
   }
}

我的Game()扩展了BukkitRunnable类:

synchronized

你可以创建更多的BukkitRunnables,比如Game()类,但一定要在需要时使用movie_info_idx,这样就可以保证线程安全。

hnefatl致敬,为我提供正确的方法。如果有更好的选择,我希望在评论中听到它们。