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?
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
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
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. –