2012-04-23 64 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秒再離開,它將在離開時直接關閉服務器。

相關問題