Хорошо, я столкнулся с этой странной ошибкой, так как я изменил свой дизайн меню на Bukkit API.Java Bukkit События, зарегистрированные более одного раза
Прежде чем подчеркнуть проблему, вот что должна была делать программа.
- Когда игрок присоединяется, выполните следующее.
- Добавьте игрока в HashMap с помощью меню, которое он будет использовать.
- Прокрутите меню, связанные с этим проигрывателем, и вызовите необходимые функции.
- Когда игрок уходит, удалите его из HashMap и уничтожьте экземпляры меню.
Это нормально, до этапа 2, однако события на шаге 3, похоже, регистрируются равными количеству ключей внутри HashMap. Например, если 3 игрока находятся в режиме онлайн, события 4-го будут зарегистрированы x4 раз, что является серьезной утечкой памяти.
Теперь вот мой код, это целый класс.
package src.ares.core.menu;
import java.util.ArrayList;
import java.util.HashMap;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import src.ares.core.Main;
import src.ares.core.common.Module;
public class MenuListener extends Module
{
private static MenuListener instance = new MenuListener();
public static MenuListener getInstance()
{
return instance;
}
private HashMap<Player, ArrayList<Menu>> activeMenus;
public MenuListener()
{
super("Menu Listener");
this.activeMenus = new HashMap<>();
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event)
{
Player player = event.getPlayer();
ArrayList<Menu> defaultMenus = new ArrayList<>();
defaultMenus.add(MenuFactory.getFactory().createMenu(MenuType.KIT_MENU));
defaultMenus.add(MenuFactory.getFactory().createMenu(MenuType.WORLD_MENU));
defaultMenus.add(MenuFactory.getFactory().createMenu(MenuType.STATS_MENU));
if (!activeMenus.containsKey(player))
activeMenus.put(player, defaultMenus);
else return;
Main.debug("Before For-Loop.");
for (Player registered : activeMenus.keySet())
{
if (registered.equals(player))
{
Main.debug("Player Validation Passed -> " + registered.getName());
ArrayList<Menu> playerMenus = activeMenus.get(registered);
for (Menu specificMenu : playerMenus)
{
specificMenu.setSpecificTo(registered);
specificMenu.addItems();
specificMenu.defineItems();
specificMenu.registerEvents();
Main.debug("Messing with -> " + specificMenu.getName());
}
Main.debug("End of Menus.");
}
}
}
public HashMap<Player, ArrayList<Menu>> getMenus()
{
return activeMenus;
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event)
{
for (Player registered : activeMenus.keySet())
{
if (registered.equals(event.getPlayer()))
{
for (Menu playerMenu : activeMenus.get(registered))
{
playerMenu.destroy();
}
activeMenus.remove(registered);
Main.debug("Unregistering Menu Listeners.");
}
}
}
}
Так что мой вопрос здесь. Что может быть возможным решением этой проблемы с событиями? Кроме этого, все остальное работает отлично.
Heads up, я отлаживал его со вчерашнего дня и не добился прогресса.