2012-04-23 85 views
0

我有以下代码为什么不是“<= 1”按预期工作?

@EventHandler 
public void onPlayerQuit(PlayerQuitEvent event){ 
    Player player = event.getPlayer(); 
    final Player[] playerlist = getServer().getOnlinePlayers(); 
    if (playerlist.length <=1) { // if no players are online 
     getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){ 
      // this is a scheduler. 
      public void run(){ 
       if(playerlist.length <=1){ 
        getServer().shutdown(); 
       } 
      } 
     }, 6000L); // runs every 6000 ticks, which is every 300 seconds, which is every 5 minutes. 
} 
} 

当一个玩家离开,它会检查哪些,看看他是最后一个,如果他的话,5分钟后,再次检查,如果仍然没有一个是它应该停止服务器。

在这条线的位置:

if (playerlist.length <=1) { // if no players are online 

我必须有它作为< = 1或它不工作在所有的,但它也将停止服务器,如果我离开,并加入背部和即时通讯的唯一一个。当我在= 0时,它只是< 1它没有工作。

任何想法?

这里是我的更新代码(仍然不工作):

@EventHandler 
public void onPlayerQuit(PlayerQuitEvent event){ 
    Player player = event.getPlayer(); 
    final Player[] playerlist = getServer().getOnlinePlayers(); 
    if (playerlist.length <=1) { // if no players are online 
     getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){ 
      // this is a scheduler. 
      public void run(){ 
       final Player[] playerlist = getServer().getOnlinePlayers(); 
       if(playerlist.length <=1){ 
        getServer().shutdown(); 
       } 
      } 
     }, 500L); // runs every 6000 ticks, which is every 300 seconds, which is every 5 minutes. 
} 
} 

回答

3

你写的东西不行的原因是你使用<=。如果某人注销并且没有人离开,那么该任务将被安排。如果某人在5分钟或更短的时间内重新登录并保持联机状态,当计划的任务检查服务器是否应该关闭时,1 <= 1true,这样服务器就会关闭。

您提到只使用=不起作用,这是因为在布尔语句中,==必须用于检查是否相等。

尝试使用这样的:

if (playerlist.length == 0) { // if no players are online 
    // Do stuff 
} 

更新(在评论中讨论): 我不知道Bukkit API非常好,但是这是我认为正在发生的事情,然后:在线播放器列表后更新执行onPlayerQuit()。试试这个:在你的onPlayerQuit()方法的内部,试着检查playerlist.length == 1和你的任务内部,检查playerlist.length == 0

-1

,当有人登录后你永远不取消任务。既然你永远不会取消任务,即使有人在5米的时间内重新登录,它也会执行。

0

我不知道你是否已经解决了这个问题,但我认为问题的一部分是你试图重新 - 初始化一个已经初始化的final变量...再次,就像回复中的其他人一样,我不知道Bukkit API,因为我正在试图学习它,但是你不能重新初始化最终变量......所以我会或者建议拿走最后一部分,或者如果它必须保留,我会为run()方法创建一个新数组......当你第二次检查是否有人在线时......它并不重要如果你改变阵列,因为你在线改变玩家的数量大概是反正......因为它是最终的,当你重新运行最终阵列的玩家列表的长度时,它总是为1 ......

0

当运行中的延迟任务时,您的代码不刷新playerlist变量,从未检测到某人在任务实际运行时是否加入。

更好执行的代码是:

@EventHandler 
public void onPlayerQuit(PlayerQuitEvent event) { 
    Player player = event.getPlayer(); 
    boolean playersOnServer = false; 
    for(Player p : getServer().getOnlinePlayers()) { 
     if(p==player) continue; 
     playersOnServer = true; 
     break; 
    } 
    if (!playersOnServer) { 
     getServer().getScheduler().scheduleSyncDelayedTask(this, new Runnable(){ 
      public void run(){ 
       //Redo players check 
       boolean playersOnServer = false; 
       for(Player p : getServer().getOnlinePlayers()) { 
        playersOnServer = true; 
        break; 
       } 
       if(!playersOnServer){ 
        getServer().shutdown(); 
       } 
      } 
     }, 6000L); 
    } 
} 

里面上面的代码中,我使用了一个for循环,而不是一个简单的检查,看看是否有任何在线玩家,使之与工作来自旧bukkit的旧玩家阵列,以及新bukkit的新收藏方法。

这种类型的检测仍存在缺陷,例如,如果最后一个人退出,然后直接加入,然后等待4分59秒再离开,它将在离开时直接关闭服务器。

相关问题