Неверный метод вызывается, когда API имеет несколько экземпляров на сервере (Bukkit Plugin) - PullRequest
0 голосов
/ 05 апреля 2020

Я разработал API, который можно внедрить в плагин Bukkit / Spigot. Он работает довольно хорошо, даже с несколькими экземплярами API (в двух разных плагинах) на сервере.
Но в какой-то момент указанное сообщение c печатается в Слушателе. Если на сервере несколько API, он печатается несколько раз. С помощью Bukkit Service Manager я мог зарегистрировать один из экземпляров и установить значение c в значение true или false, в зависимости от экземпляра.

for (Class<?> service : Bukkit.getServicesManager().getKnownServices()) {
    try {
        service.getField("LOGGER");
        found = true;
        break;
    } catch (NoSuchFieldException ignored) {}
}
if (found) {
    APIMain.setThisPluginWarns(false);
} else {
    Bukkit.getServicesManager().register(APILogger.class, this, plugin, ServicePriority.Normal);
    APIMain.setThisPluginWarns(true);
    startSubmitting();
}

Проблема заключается в том, что Я не могу получить правильное логическое значение, в зависимости от плагина. Если я пытаюсь получить его с помощью моего метода (APIMain.getThisPluginWarns()), всегда возвращается false, и во время отладки я обнаружил, что фактически спрашиваю метод в плагине, который загружался последним, независимо от того, от какого плагина получен запрос.
Я попробовал несколько возможных обходных путей, например, наличие плагина в качестве переменной в классе слушателя и сравнение его с плагином, который вы получите с помощью метода getPlugin() в основном классе, но эта переменная указала то же имя плагина в оба плагина.
Кто-нибудь имеет представление о том, как на самом деле я могу отличить плагины, для которых переменная имеет значение false и правильный? Независимо от того, что я пробовал, то же самое происходило в разных плагинах.
Я не могу отключить весь класс слушателя или что-то в этом роде, хотя некоторые вещи должны происходить во всех активных экземплярах. Только некоторые строки кода, куда отправляется сообщение, должны появляться только на одном плагине, поэтому я хотел использовать этот логический параметр.
Спасибо за каждую помощь.

...