Получение ссылки объекта из мода

Версия Minecraft
1.6.4
355
2
17
Добро!

Такая вот тема, плагины и моды хоть и находятся в одном пространстве, но к друг другу напрямую обратиться не могут. Зато через рефлексию можно получить доступ к друг другу. Но может быть как-то можно решить эту проблему посредством Bukkit\Forge? Или хотя бы получить список подгруженных классов мода\плагина?

Цель: Настроить общение между серверным плагином и модом.


Основной инстанс мода можно получить так, но для общения необходимо использовать другой инстанс в этом моде.

Java:
if (Loader.isModLoaded("ModId"))
{
    ModContainer container = Loader.instance().getIndexedModList().get("ModId");
    modInstance = container.getMod();
}
 
Последнее редактирование:
1,111
47
420
Он просто сделал класс, который инкапсулирует всю рефлексию...
Вапще проблема в смысоле класс лодеров. Их текущая иерархия:
ApplicationLoader(тута обитают Forge и Bukkit)
+--ForgeModLoader(Тута обитают моды)
+--BukkitPluginsLoader(Тута обитают плагины)

Вырисовывается проблемка. BukkitPluginsLoader немного не в курсе про ForgeModLoader, и ForgeModLoader не в курсе о BukkitPluginsLoader.
Интересной идеей было б сделать так:
ApplicationLoader(тута обитают Forge и Bukkit)
+--ForgeModLoader(Тута обитают моды)
+--BukkitPluginsLoader(Тута обитают плагины)

Но это тоже не очень здорово. BukkitPluginsLoader теперь будет в курсе о ForgeModLoader, но ForgeModLoader все еще не в курсах. Плюс ко всему, это хреново в плане того, что баккит и форж юзают разные маппинги и разные деобфускации. В результате чего BukkitPluginsLoader при запросе класса сначала пойдет просить его у ForgeModLoader, который подсунет ему то, что не должно попасть в Bukkit. Эта проблема так же обходится путем изменения такого поведения у класс лодеров, но тогда мы будем иметь разные экземпляры классов, что хреново из-за рассинхронизации. Честно говоря, я не совсем понимаю как эта проблема решается сейчас.

Итого, чтобы сделать прямую коммуникацию между плагином и модом, нам нужно загружать их одним класс лодером. Для этого нам нужно лезть в ядро и менять маппинги модов/плагинов.
 
355
2
17
Итого, чтобы сделать прямую коммуникацию между плагином и модом, нам нужно загружать их одним класс лодером. Для этого нам нужно лезть в ядро и менять маппинги модов/плагинов.
Та не, это уж как-то слишком замудренно. Я реализовал по принципу DynmapBridge. Тобишь 2 абстрактный класса которые описывают нужные мне методы и о которых знает и плагин и мод, ну и реализовал их на обеих сторонах. И затем обычное общение:

Java:
API.PLUGIN.getData(String player);    - Получение какой-то информации с плагина.
API.MOD.getData(Stirng player);       - Получение какой-то информации с мода.

Работает более чем хорошо, чего достаточно по сути для реализации поставленных мною целей.
 
Сверху