0

次のコードがあります

@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.
 }
}
4

4 に答える 4

2

あなたが書いたことがうまくいかない理由は、あなたの使い方です<=。誰かがログオフし、誰も残っていない場合、タスクはスケジュールされています。誰かが 5 分以内に再度ログオンし、オンラインのままである場合、スケジュールされたタスクがサーバーをシャットダウンする必要があるかどうかを確認するときに、サーバーが1 <= 1シャットダウンtrueされます。

を使用するだけで=は機能しないとおっしゃいましたが、これは、ブール ステートメントで==等価性をチェックするために使用する必要があるためです。

これを使用してみてください:

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

更新 (コメントで議論): Bukkit API についてはよくわかりませんが、これが起こっていると思います: オンライン プレイヤー リストonPlayerQuit()は の実行後に更新されます。これを試してください:onPlayerQuit()メソッド内でチェックplayerlist.length == 1を試し、タスク内でチェックしてくださいplayerlist.length == 0

于 2012-04-23T18:47:25.640 に答える
0

あなたがすでにこの問題を解決したかどうかはわかりませんが、問題の一部は、すでに初期化された最終変数を再初期化しようとしていることにあると思います...繰り返しますが、返信の他のいくつかのように、私はしません私はそれを学ぼうとしているのでBukkit APIを知っていますが、最終変数を再初期化することはできません...したがって、最終部分を取り除くことをお勧めします。または、それを残す必要がある場合は、実行用に新しい配列を作成します( ) メソッド...誰かがオンラインかどうかを確認するために 2 回目のチェックを行っているため...配列を変更しても問題はありません。おそらくとにかくオンラインのプレーヤーの数を変更しているためです...最終的なものであるため、プレーヤーリストの最終配列の長さを再実行すると、常に1になります...

于 2012-07-01T04:14:30.027 に答える
-1

誰かが再度ログオンしたときにタスクをキャンセルすることはありません。タスクをキャンセルすることは決してないので、誰かが5mの時間枠内に再度ログオンした場合でもタスクは実行されます。

于 2012-04-23T18:40:36.097 に答える