2016-06-16 1 views
0

Donc, j'ai ce plugin sur lequel je travaille, je vais vous expliquer la fonction afin que vous ayez une idée de ce qu'il est censé faire:
-/showcps: indique le expéditeur chaque fois que le joueur spécifié clique gauche/droiteBukkit - Utilisation de variables statiques causant des problèmes

Ainsi, disons qu'il y a deux joueurs, Bob et Billy sur un serveur exécutant ce plugin; Bob fait la commande /showcps Billy et voit à chaque fois que Billy clique. Puis Billy tape la commande /showcps Bob, et maintenant Billy voit quand Bob clique. Le problème est que Bob ne peut plus voir quand Billy clique.

C'est mon problème. Je pense que je sais pourquoi cela arrive, mais je ne suis pas sûr de savoir comment y remédier. J'ai utilisé des variables globales pour pouvoir les utiliser de façon interchangeable entre les classes d'écouteur de clic et d'exécuteur de commandes.

Voici le code pour les auditeurs:

@ 
EventHandler 
public void leftClick(PlayerInteractEvent event) { 
    Player player = event.getPlayer(); 

    if (event.getAction().equals(Action.LEFT_CLICK_AIR) | event.getAction().equals(Action.LEFT_CLICK_BLOCK)) { 
    if (player.equals(ClickViewToggle.targetPlayer)) { 
     ClickViewToggle.recivingPlayer.sendMessage(
     ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + " left clicked."); 
    } 
    } 
} 

@ 
EventHandler 
public void rightClick(PlayerInteractEvent event) { 
    Player player = event.getPlayer(); 

    if (event.getAction().equals(Action.RIGHT_CLICK_AIR) | event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { 
    if (player.equals(ClickViewToggle.targetPlayer)) { 
     ClickViewToggle.recivingPlayer.sendMessage(
     ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + " right clicked."); 
    } 
    } 
} 

Voici le code pour l'exécuteur testamentaire de commande:

public static Player targetPlayer = null; 
public static Player recivingPlayer; 

public boolean onCommand(CommandSender sender, Command command, String cmd, String[] args) { 
    recivingPlayer = (Player) sender; 
    if (args[0].isEmpty()) { 
    if (sender instanceof Player) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You will now be able to see your clicks."); 
     targetPlayer = (Player) sender; 
     return false; 
    } else { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You must specify a player."); 
     return false; 
    } 
    } else { 
    boolean playerFound = false; 
    for (Player player: Bukkit.getServer().getOnlinePlayers()) { 
     if (player.getName().equalsIgnoreCase(args[0])) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "You are now seeing " + ChatColor.LIGHT_PURPLE + player.getName() + ChatColor.DARK_PURPLE + "\'s clicks."); 
     targetPlayer = player; 
     playerFound = true; 
     break; 
     } 
    } 
    if (!playerFound) { 
     sender.sendMessage(ChatColor.DARK_PURPLE + "Couldn't find " + ChatColor.LIGHT_PURPLE + args[0] + ChatColor.DARK_PURPLE + "."); 
     targetPlayer = null; 
    } 
    return false; 
    } 
} 

Comme vous pouvez le voir, receivingPlayer et targetPlayer sont utilisés entre les deux classes, mais Je pense que c'est la raison pour laquelle ils ne peuvent pas regarder les différents clics en même temps.

Comment puis-je résoudre ce problème?

Répondre

0

Je vous conseille d'apprendre java avant de plonger dans Bukkit, car ce code a de sérieux problèmes.

Votre problème se produit, car vous avez variable pour stocker le lecteur de réception et le lecteur expéditeur. De cette façon, si vous le changez, l'ancien joueur recevant ne recevra aucun nouveau message. Utilisez un hashmap avec l'UUID du joueur expéditeur comme clé et l'UUID du joueur comme valeur, puis quand un joueur est sur la carte, envoyez un message à son récepteur correspondant.

Les autres problèmes dans yoir Code:

Ne vous servez pas statique, il est une mauvaise pratique, l'utilisation des accesseurs.

Comparer énumérations avec == au lieu de .equal

Vous devriez avoir seulement 1 eventhandler pour un type d'événement dans votre plug-in.

Ne stockez jamais d'objets joueurs complets, ils causent une fuite de mémoire, si vous n'êtes pas assez prudent. Vérifie uniquement si args [0] est égal à une chaîne emoty, si le joueur ne spécifie pas d'argument, alors une erreur est générée.

Ce sont les mêmes types de problèmes que nous rencontrons sur les forums http://bukkit.org 90% du temps. Utilisez ce forum pour les questions basées sur Bukkit, les gens peuvent aider plus là-bas.

+0

Merci, j'ai complètement négligé les setters et getters. Je vais démonter quelques trucs juste pour me sentir mieux lol. J'ai appris java une quantité décente, j'ai appris java avant toute autre chose. Il a été bukkit qui a pris un certain temps pour s'y habituer. Premièrement, pourquoi ne devrais-je pas utiliser '.equal'? Pouvez-vous me diriger vers un poste sur ce sujet? En outre, j'avais 2 eventhandlers dans cette classe parce que pour une raison quelconque bukkit n'aime pas RIGHT_CLICK_AIR, et j'ai pensé que j'essaierais de le réparer avec un autre eventhandler.: P – Kaelinator

+0

Quand vous dites ** Ne stockez jamais d'objets joueurs complets ** que voulez-vous dire? Et 'args [0] .isEmpty()' me donnait une erreur, mais j'étais concentré sur la résolution du problème que j'ai remarqué en premier, alors je vais revenir en arrière et changer cela. Je sais que mon code est mauvais, mais ce que je fais habituellement, c'est coder le programme, m'assurer qu'il fonctionne, puis revenir en arrière et l'optimiser pour la lisibilité, la stabilité et les performances. Mais oui, merci encore! – Kaelinator

+0

Les enums @Kaelinator sont des singletons, vous pouvez utiliser == sur ceux qui sont plus rapides. Ce n'est cependant pas la même chose pour d'autres objets. Bukkit a des problèmes avec right_click_air. Jamais, comme ça, ça devient rapidement hors de contrôle, et vous ne pouvez pas l'optimiser correctement plus tard. –