2017-03-26 11 views
-3

私はチャットチャンネルを実行しようとしており、リストに問題があります。私はコマンドを実行するときにリストに1つの要素を追加し、後でその要素がリストに追加されているかどうかを確認しようとしていますが、常にそれがisntであることを示しています。ここでBukkit ArrayListにはcant findの要素が含まれています

は私のコードです:ゲームイムで

public class RpChat implements CommandExecutor, Listener { 

private ArrayList<Player> ooc = new ArrayList<Player>(); 
private ArrayList<Player> ic = new ArrayList<Player>(); 
private ArrayList<Player> shout = new ArrayList<Player>(); 
private ArrayList<Player> whisper = new ArrayList<Player>(); 

public boolean onCommand(CommandSender cs, org.bukkit.command.Command cmnd, String string, String[] strings) { 
    Player s = (Player) cs; 
    if (cmnd.getName().equalsIgnoreCase("ooc")) { 
     s.sendMessage("Debug: OOC"); 
     ooc.add(s); 

     if (ic.contains(s)) 
      ooc.remove(s); 
     if (shout.contains(s)) 
      ooc.remove(s); 
     if (whisper.contains(s)) 
      ooc.remove(s); 
    } 
    return false; 

} 

@EventHandler 
public void onPlayerChatEvent(AsyncPlayerChatEvent event) { 
    Player p = event.getPlayer(); 
    Bukkit.getScheduler().scheduleSyncRepeatingTask(Dungeon.getPlugin(), new Runnable() { 
     public void run() { 
      if (ooc.contains(p)) { 
       event.setFormat(ChatColor.RED + "[OOC] " + ChatColor.WHITE + "%s" + ": " + "%s"); 
       p.sendMessage("Debug Player = " + ooc.contains(p)); 
      } 
      else{ 
       p.sendMessage("Debug Player = " + ooc.contains(p)); 
      } 

    } 
    }, 0, 40); 

} 

デバッグ取得:OOCメッセージバック(S)そうooc.addは、[OK]をする必要がありますが、私のリスナーからの第2のDメッセージは常にfalseと決してを返していますif文に入ります。私は、SenderをPlayerにキャストして、なぜ私もStrings Arraysでそれをやろうとしたのですが、comandとlistenerからの両方のデバッグメッセージがまったく同じplayernameを返していましたが、containsは常にfalseでした。ここでは、文字列を使ったコードもあります。

public class RpChat implements CommandExecutor, Listener { 

private ArrayList<String> ooc = new ArrayList<String>(); 
private ArrayList<String> ic = new ArrayList<String>(); 
private ArrayList<String> shout = new ArrayList<String>(); 
private ArrayList<String> whisper = new ArrayList<String>(); 

public boolean onCommand(CommandSender cs, org.bukkit.command.Command cmnd, String string, String[] strings) { 
    Player p = (Player) cs; 
    String s = p.getName(); 
     if (cmnd.getName().equalsIgnoreCase("ooc")) { 
     p.sendMessage("Debug: OOC: Plaer Name: "+ s); 
     if (ic.contains(s)) 
      ic.remove(s); 
     if (shout.contains(s)) 
      shout.remove(s); 
     if (whisper.contains(s)) 
      whisper.remove(s); 
     ooc.add(s); 
    } 
    return true; 

} 

@EventHandler 
public void onPlayerChatEvent(AsyncPlayerChatEvent event) { 
    Player p = event.getPlayer(); 
    String s = p.getName(); 
    Bukkit.getScheduler().scheduleSyncRepeatingTask(Dungeon.getPlugin(), new Runnable() { 
     public void run() { 
      if (ooc.contains(s)) { 
       event.setFormat(ChatColor.RED + "[OOC] " + ChatColor.WHITE + "%s" + ": " + "%s"); 
       p.sendMessage("Debug Player = " + ooc.contains(s)+ " Plaer Name: "+ s); 
      } 
      else{ 
       p.sendMessage("Debug Player = " + ooc.contains(s)+ " Plaer Name: "+ s); 
      } 

    } 
    }, 0, 40); 

} 

それは私の心のうち、すでにイムを引き起こすと間違っているものを私に教えてくれて、私の下手な英語のため申し訳ありませんしてください;/

+0

おそらくリストを静的にするのでしょうか?イベントハンドラではアクセスが違うと思います。あなたのリストにあなたのイベントに何かが含まれていないか確認してください。 – Kerooker

+0

'Player'のコードはどこですか? 'equals'を正しく実装していますか? –

+0

ああ、静的な配列を静的にすることは助けになりました:) –

答えて

0

を、このためのソリューションは非常に簡単です:

電源を入れ、すべてのあなたのArrayList静的。 EventHandlerは、さまざまな方法でクラスを処理し、毎回新しいイベントハンドラを作成し、変数の宣言をイベントに使用できないようにします。

private static ArrayList<String> ooc = new ArrayList<String>(); 
private static ArrayList<String> ic = new ArrayList<String>(); 
private static ArrayList<String> shout = new ArrayList<String>(); 
private static ArrayList<String> whisper = new ArrayList<String>(); 

この方法では、あなたのリストは、それを独自のリストをレンダリングし、すべてのイベントハンドラで使用されています。

関連する問題