2016-06-16 2 views
0

Итак, у меня есть этот плагин, над которым я работаю, я объясню эту функцию, чтобы вы поняли, что она должна делать:
-/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 используются между двумя классами, но Я чувствую, что именно поэтому они оба не могут смотреть разные клики одновременно.

Как это исправить?

ответ

0

Я бы посоветовал вам изучить Java до погружения в Буккит, потому что этот код имеет серьезные проблемы.

Ваша проблема возникает, потому что у вас есть Переменная для хранения получателя и отправителя. Таким образом, если вы измените его, тогда старый получатель не получит никаких новых сообщений. Используйте хэш-карту с UUID передающего игрока в качестве ключа и UUID получающего игрока в качестве значения, а затем, когда игрок находится на карте, отправьте сообщение своему соответствующему получателю.

Другие проблемы yoir код:

Не злоупотребляют статичны, это плохая практика, использовать методы получения и установки.

Сравнить перечисления с == вместо .equal

Вы должны иметь только 1 EventHandler для типа события в плагине.

Никогда не храните цели полного игрока, они вызывают утечку памяти, если вы недостаточно осторожны.

args[0].isEmpty() только проверки, если args [0] соответствует эмоциональной строке, если игрок не указывает аргумент, тогда это вызовет ошибку.

Это те же проблемы, с которыми мы сталкиваемся на форумах http://bukkit.org в 90% случаев. Используйте этот форум для вопросов, основанных на Bukkit, люди могут помочь там.

+0

Спасибо, я полностью упустил сеттеров и геттеров. Я собираюсь развенчать пару вещей, чтобы заставить себя чувствовать себя лучше. Я изучил Java приличную сумму, я узнал Java прежде всего. Это был bukkit, к которому привыкли. Во-первых, почему я не должен использовать '.equal'? Можете ли вы направить меня к сообщению на эту тему? Кроме того, у меня было 2 обработчика событий в этом классе, потому что по какой-то причине bukkit не нравится 'RIGHT_CLICK_AIR', и я думал, что попытаюсь исправить его с помощью другого обработчика событий.: P – Kaelinator

+0

Когда вы говорите ** Никогда не храните объекты полного игрока **, что вы имеете в виду? И 'args [0] .isEmpty()' давал мне ошибку, но я был сосредоточен на устранении проблемы, которую я заметил в первую очередь, поэтому я вернусь и изменю это. Я знаю, что мой код выглядит плохо, но то, что я обычно делаю, это код программы, убедитесь, что он работает, а затем вернитесь и оптимизируйте его для удобства чтения, стабильности и производительности. Но да, еще раз спасибо! – Kaelinator

+0

@ Келеварные перечисления - это одноточие, вы можете использовать == на них быстрее. Однако это не то же самое для других объектов. У Bukkit есть проблемы с right_click_air. Ничего подобного, он быстро выходит из-под контроля, и вы не можете его оптимизировать позже. –

Смежные вопросы