Итак, у меня есть этот плагин, над которым я работаю, я объясню эту функцию, чтобы вы поняли, что она должна делать:
-/showcps: сообщает отправителя, когда указанный игрок левой/правой кнопкой мышиBukkit - Использование статических переменных, вызывающих проблемы
Итак, предположим, что на сервере, на котором запущен этот плагин, есть два игрока: Боб и Билли; Боб делает команду /showcps Billy
и видит каждый раз, когда Билли нажимает. Затем Билли вводит команду /showcps Bob
, и теперь Билли видит, когда Боб нажимает. Проблема в том, что Боб больше не видит, когда Билли щелкает.
Это моя проблема. Кажется, я знаю, почему это происходит, но я не уверен, как это исправить. Я использовал глобальные переменные, чтобы использовать их взаимозаменяемо между классами прослушивателя кликов и команд-исполнителей.
Вот код для слушателей:
@
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.");
}
}
}
Вот код команды исполнителя:
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;
}
}
Как вы можете видеть, receivingPlayer
и targetPlayer
используются между двумя классами, но Я чувствую, что именно поэтому они оба не могут смотреть разные клики одновременно.
Как это исправить?
Спасибо, я полностью упустил сеттеров и геттеров. Я собираюсь развенчать пару вещей, чтобы заставить себя чувствовать себя лучше. Я изучил Java приличную сумму, я узнал Java прежде всего. Это был bukkit, к которому привыкли. Во-первых, почему я не должен использовать '.equal'? Можете ли вы направить меня к сообщению на эту тему? Кроме того, у меня было 2 обработчика событий в этом классе, потому что по какой-то причине bukkit не нравится 'RIGHT_CLICK_AIR', и я думал, что попытаюсь исправить его с помощью другого обработчика событий.: P – Kaelinator
Когда вы говорите ** Никогда не храните объекты полного игрока **, что вы имеете в виду? И 'args [0] .isEmpty()' давал мне ошибку, но я был сосредоточен на устранении проблемы, которую я заметил в первую очередь, поэтому я вернусь и изменю это. Я знаю, что мой код выглядит плохо, но то, что я обычно делаю, это код программы, убедитесь, что он работает, а затем вернитесь и оптимизируйте его для удобства чтения, стабильности и производительности. Но да, еще раз спасибо! – Kaelinator
@ Келеварные перечисления - это одноточие, вы можете использовать == на них быстрее. Однако это не то же самое для других объектов. У Bukkit есть проблемы с right_click_air. Ничего подобного, он быстро выходит из-под контроля, и вы не можете его оптимизировать позже. –