Кастомный ивент отправить в bukkit

Версия Minecraft
1.7.10
127
0
Добрый день,

Возможно ли отправить кастомный ивент из мода в bukkit, чтобы плагин его обработал?
 
127
0
Мне нужно связать как то серверный мод со своим же плагином.
Плагин через интерфейс идет
Java:
class HqmPrefixPlugin extends JavaPlugin implements Listener, IHqmPlugin
Плагин менеджер видите его
Код:
if(plManager.getPlugin("HqmPrefixPlugin") == null){
            FMLLog.info("Cannot find HqmPrefixPlugin!");
            return;
        }
        IHqmPlugin plugin = (IHqmPlugin)plManager.getPlugin("HqmPrefixPlugin");
В итоге краш

Код:
cpw.mods.fml.common.LoaderException: java.lang.NoClassDefFoundError: ru/travnik/hqmprefix/IHqmPlugin
    at cpw.mods.fml.common.LoadController.transition(LoadController.java:163)
    at cpw.mods.fml.common.Loader.serverStarted(Loader.java:803)
    at cpw.mods.fml.common.FMLCommonHandler.handleServerStarted(FMLCommonHandler.java:288)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:645)
    at java.lang.Thread.run(Thread.java:748)
 
1,111
47
420
Не праильно. Это будут разные классы. Вот тут я кое что про это рассказал ClassLoader. Может где нить еще рассказывал. Поищи примерно на 5-6 странице вопросов.
Суть вообщем такая: ты не можешь из мода обратиться к плагину, а к самому фреймворку Bukkit могешь. Ивенты ты можешь диспатчить как то так: Bukkit.getPluginManager.callEvent().
Какое либо взаимодействие с плагинами ты могешь осуществлять либо через рефлекшен(Reflection API) либо подгрузить свой класс через класс лодер плагина и общаться через рефлекшен уже с ним.
Код инжета примерно таков:
Scala:
object WGUtil {

    val wgPlugin: Plugin = Bukkit.getPluginManager.getPlugin("WorldGuard")
    val wgLoader: ClassLoader = wgPlugin.getClass.getClassLoader
    val defineMethod: Method = classOf[ClassLoader].getDeclaredMethod("defineClass", classOf[String], classOf[Array[Byte]], classOf[Int], classOf[Int])

    {
        defineMethod.setAccessible(true)
    }
    def inject(clazz: Class[_]): Class[_] = {
        val bytes = ByteStreams.toByteArray(clazz.getClassLoader.getResourceAsStream(clazz.getName.replaceAll("\\.", "/") + ".class"))
        defineMethod.invoke(wgLoader, null.asInstanceOf[AnyRef], bytes.asInstanceOf[AnyRef], 0.asInstanceOf[AnyRef], bytes.length.asInstanceOf[AnyRef]).asInstanceOf[Class[_]]
    }

}
Там я инжектю в класслодер взятый из WG, но так как у всех плагинов он одинаков, можешь безбоязненно брать любой другой плагин.

P.S. Есть примерно то же самое только на Java Тута
 
Последнее редактирование:
127
0
Так я и не понял как получить доступ к своему классу и методам. Тут я так понимаю с помощью рефлексии мы получаем сигнатуру какого то метода?
Или после такой загрузки я смогу к своему интерфейсу привести плагин?
 
Сверху