Как получить метод плагина в моде

Версия Minecraft
1.7.10
Смотрел форум, должного объяснения не нашел. Есть что-то вроде рефлексии, но чет не догоняю как это сделать, да и говорят, что она, мол, медленно работает и её лучше не юзать.
У меня задача в том, что я в моде хочу получить playtime игрока из соответствующего плагина.
В плагинах всегда получал его класс так:

Java:
public static long getPlayTime(EntityPlayer player)
{
    try
    {
        return ((Playtime)Bukkit.getPluginManager().getPlugin("Playtime")).getDataManager().getDataHandler().getValue("playtime", toBukkitEntity(player).getName()) * 60L;
    }
    catch(Exception var3)
    {
        return 0L;
    }
}

Но проблема в том, что сервер при попытки получить метод с наигранным временем выдает ошибку о том, что не может класс найти, либо его вообще нет:

java.lang.NoClassDefFoundError: com/rogue/playtime/Playtime at whoami.dailyrewards.common.utils.BukkitHook.getPlayTime(BukkitHook.java:43) ~[BukkitHook.class:?]


Как решить проблему?
 
Решение
медленно работает и её лучше не юзать
Зависит от случая. Если ты каждый тик будешь дёргать рефлексией поле/метод, то да, будет медленней(в качестве альтернативы access transformers)

Твой код подойдёт лишь в том случаи, если нужный тебе плагин имеет api c абстракциями. В качестве примера, ты можешь сделать так:
Kotlin:
val eco: Economy? = null// Economy - интерфейс

fun someMethodForRegistry() {
    if (Bukkit.getServer().pluginManager.isPluginEnabled("Vault")) {
        this.eco = Bukkit.getServer().servicesManager.getRegistration(Economy::class.java)?.provider
    }
}

@EventHandler
fun serverStarting(e: FMLServerStartingEvent) {
    someMethodForRegistry()
}
И тем самым сможешь взаимодействовать с нужным тебе плагином. Минус...
Ведро уже подключено как библиотека, я уже в данном моде много где работал с ним. Я не могу получить класс плагина с помощью ведра. Ну в смысле через:
Bukkit.getPluginManager().getPlugin("Playtime")

Сервер ошибку выдает, что не находит класса такого
 
А мне кажется можно как то получить метод плагина в моде, я даже видел где-то такое, что баланс денег(который работает на плагине) выводят в всяких GUI
Прошу все таки подсказать. Весь гугл обшарил ничего не могу найти конкретно по этому поводу
Дополнительные плагины-врапперы писать для такой задачи просто bruh...
И вписывать весь плагин в мод тоже)0
 

will0376

Токсичная личность
2,079
55
585
Дополнительные плагины-врапперы писать для такой задачи просто bruh...
И вписывать весь плагин в мод тоже)0
Ну а как ты хочешь? от нас тут ответа на эту тему не дождешься, ибо тебе уже всё сказали что могли.
 

Icosider

Kotliner
Администратор
3,603
99
664
медленно работает и её лучше не юзать
Зависит от случая. Если ты каждый тик будешь дёргать рефлексией поле/метод, то да, будет медленней(в качестве альтернативы access transformers)

Твой код подойдёт лишь в том случаи, если нужный тебе плагин имеет api c абстракциями. В качестве примера, ты можешь сделать так:
Kotlin:
val eco: Economy? = null// Economy - интерфейс

fun someMethodForRegistry() {
    if (Bukkit.getServer().pluginManager.isPluginEnabled("Vault")) {
        this.eco = Bukkit.getServer().servicesManager.getRegistration(Economy::class.java)?.provider
    }
}

@EventHandler
fun serverStarting(e: FMLServerStartingEvent) {
    someMethodForRegistry()
}
И тем самым сможешь взаимодействовать с нужным тебе плагином. Минус такого подхода в том, что тебе обязательно надо таскать в моде этот самый интерфейс Economy. А связано всё с тем, что в начале происходит загрузка модов и их классов, а затем только плагинов. Следовательно мод не будет знать про какой-то там Economy интерфейс во время загрузки.

Можно и вовсе подгрузить другим класслоадером нужный класс, как советует Агрованя или сделать как у @gamerForEa(либо использовать его библиотеку, где как раз это и реализовано в удобном и простом виде)
 
Сверху