Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Вызов методов плагина из мода

Тема в разделе "Разработка плагинов для новичков", создана пользователем Sirse, 19 окт 2013.

  1. Автор темы
    Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Добрый день.
    Упарываюсь и пытаюсь использовать GriefPrevention API (которого по идее нет) для проверки на наличие привата в моде BuildCraft. (Нет, BlockBreakEvent не православен в этом плане).
    Набросал примерно это говняцо

    public static boolean BlockBreakCheck(World world, int x, int y, int z,String username) {
    Player player = CraftFakePlayer.getPossiblyRealPlayerBukkitEntity(world, username, false);
    Block block = world.getWorld().getBlockAt(x, y, z);
    BlockBreakEvent event = new BlockBreakEvent(block, player);
    Plugin griefPrevention = world.getServer().getPluginManager().getPlugin("GriefPrevention");
    if((griefPrevention != null) && griefPrevention.isEnabled()) {
    WorldConfig wc = GriefPrevention.instance.getWorldCfg(block.getWorld());
    if (!wc.Enabled()) {
    return true;
    } else if (wc.getBreakBlockRules().Allowed(block.getLocation(), player).Denied()) {
    return false;
    } else {
    //ЛОГИ, БОЛЬШЕ ЛОГОВ СЮДА!
    return true;
    }
    } else { //Тут ещё будет поддержка WG.
    return false;
    }
    }


    Как я и ожидал, получил ошибку об отсутствии класса GriefPrevention. В общем, кто сталкивался, как использовать код из плагина в моде, не получив по голове? Чувствую, что я что-то делаю не так, но сказывается 3тий час ночи и отсутствие нужных знаний по яве.
     
  2. Хостинг MineCraft
    <
  3. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    world.getServer()
    Я предполагаю что где-то в этом вызове ошибка. Скорее всего getServer() возвращает не тот сервер.
    Попропуй Bukkit.

    И да, лог приложи, а то отсутствие класса странно в этом случае.
     
  4. Автор темы
    Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    @Shevchik, сама ошибка -

    java.lang.NoClassDefFoundError: me/ryanhamshire/GriefPrevention/GriefPrevention
    at buildcraft.core.utils.BukkitUtils.BlockBreakEvent(BukkitUtils.java:23)
    at buildcraft.factory.TileMiningWell.doWork(TileMiningWell.java:81)
    at buildcraft.api.power.PowerProvider.update(PowerProvider.java:94)
    at buildcraft.core.TileBuildCraft.func_70316_g(TileBuildCraft.java:62)
    at net.minecraft.world.World.func_72939_s(World.java:2362)
    at net.minecraft.world.WorldServer.func_72939_s(WorldServer.java:806)
    at net.minecraft.server.MinecraftServer.func_71190_q(MinecraftServer.java:832)
    at net.minecraft.server.dedicated.DedicatedServer.func_71190_q(DedicatedServer.java:320)
    at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:728)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:612)
    at net.minecraft.server.ThreadMinecraftServer.run(SourceFile:573)
    Caused by: java.lang.ClassNotFoundException: me.ryanhamshire.GriefPrevention.GriefPrevention
    at cpw.mods.fml.relauncher.RelaunchClassLoader.findClass(RelaunchClassLoader.java:174)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 11 more

    Весь метод -
    public static boolean BlockBreakEvent(World world, int x, int y, int z,String username) {
    Player player = CraftFakePlayer.getPossiblyRealPlayerBukkitEntity(world, username, false);
    Block block = world.getWorld().getBlockAt(x, y, z);
    BlockBreakEvent event = new BlockBreakEvent(block, player);
    Plugin griefPrevention = Bukkit.getPluginManager().getPlugin("GriefPrevention");
    if((griefPrevention != null) && griefPrevention.isEnabled()) {
    WorldConfig wc = GriefPrevention.instance.getWorldCfg(block.getWorld());
    if (!wc.Enabled()) {
    return true;
    } else if (wc.getBreakBlockRules().Allowed(block.getLocation(), player).Denied()) {
    return false;
    } else {
    return true;
    }
    } else {
    return false;
    }
    }

    На MCPC 1.4.7 аналогичный код работал.
     
  5. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Видимо поменяли класслоадер, и теперь плагины в отдельном класслоадере так что я хз что делать.
    Попробуй Бросать кастомный эвент и плагином его обрабатывать.
     
    ПриветОтМиднайта и DPOH-VAR нравится это.
  6. Автор темы
    Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Эх... Опять огород городить...
     
    Likeobot нравится это.
  7. Shevchik

    Shevchik Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Приходится, что поделать.
     
  8. smilesdc

    smilesdc Няша Модератор

    Баллы:
    153
    Имя в Minecraft:
    smilesdc
    Сделай потом проверку на наличие класса на всякий случай. И если есть, рефлексией меняй код.
     
  9. Автор темы
    Sirse

    Sirse Старожил Пользователь

    Баллы:
    173
    Имя в Minecraft:
    Sirse
    Пойду попробую. Идея с кастомным ивентом прокатила, но мля, плагин ради мода...
     
    Aeou нравится это.

Поделиться этой страницей