2017-03-26 2 views
-3

J'essaie de faire des canaux de causerie et ai des problèmes avec des listes. Im en ajoutant un élément à la liste lors de l'exécution de la commande et plus tard, j'essaie de vérifier si l'élément est ajouté sur la liste, mais il montre toujours que ce n'est pas.Bukkit ArrayList contient ne peux pas trouver l'élément

Voici mon code:

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); 

} 

Dans le jeu im obtenir Debug: OOC message Retour si ooc.add (s) devrait être ok, mais le deuxième message d de mon auditeur retourne toujours faux et jamais obtient dans si déclaration. Je pensais que cela pouvait être dû au fait de lancer Sender to Player, c'est pourquoi j'ai aussi essayé de le faire sur Strings Arrays, et les deux messages de débogage de comand et listener renvoyaient exactement le même nom de fichier mais le contenu était toujours faux. Voici également du code avec une tentative de chaîne.

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); 

} 

S'il vous plaît me dire ce qui ne va pas avec elle provoque im déjà hors de mon esprit, et désolé pour mon pauvre anglais/

+0

Peut-être rendre les listes statiques? Je pense que l'accès est différent dans les gestionnaires d'événements. Vérifiez si votre liste contient quelque chose sur votre événement, AKA les imprimer – Kerooker

+0

Où est le code pour 'Player'? Implémente-t-il 'equals' correctement? –

+0

Oh faire des tableaux statiques a aidé beaucoup merci :), –

Répondre

0

La solution pour cela est assez simple:

FERMEZ tous vos ArrayLists statique. EventHandler gère les classes de différentes manières, en en créant une nouvelle à chaque fois, rendant inutile la déclaration des variables aux événements. De cette façon, vos listes sont utilisées par tous les gestionnaires d'événements, ce qui en fait une liste unique.