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

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

Discussion in 'Разработка плагинов для новичков' started by Sirse, Oct 19, 2013.

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

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

    Trophy Points:
    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 Старожил Пользователь

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

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

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

    Trophy Points:
    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 Старожил Пользователь

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

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

    Trophy Points:
    173
    Имя в Minecraft:
    Sirse
    Эх... Опять огород городить...
     
    Likeobot likes this.
  7. Shevchik

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

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

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

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

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

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

Share This Page