Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Использование craftbukkit в качестве библиотеки потребует перекомпиляции проекта после обновлений

Используете ли вы классы из пакетов: net.minecraft.server и org.bukkit.craftbukkit?


  • Опрос закрыт .
DPOH-VAR, нет, твой я более-менее понял. По логике должен работать и с r0.2 и с поздними. Я про spigot спрашивал.

Spigot конечно хорош, но ориентироваться только на него было бы не правильно.
 
Будем дружно смеяться на буккитом.
Прошу не распространять этот метод за пределы русского сообщества.
Чтобы не вызывать подозрений на dеv.bukkit.оrg (по сути это обход их механизма контроля версий)
 
DPOH-VAR, ну ты понимаешь, что до этого рано или поздно додумаются. Ну и кто первый "запостит" плагин на bukkit.org с таким кодом - сразу же засветит метод: их же все проверяют. Наверняка могут такой плагин и завернуть.
 
Ой туплю :D
Они сами же выпускают spigot без лычек версий в пакетах. Значит, ничего страшного в этом обходе нет.
И да, если вдруг внутри jar при проверке засветится класс с именем VersionFucker, это явно вызовет не добрые подозрения :)
 
DPOH-VAR, ну spigot, как я понимаю это детище md_5, который, как я понимаю, выпускает из-за того, что не может "протолкнуть" какие-то идеи в craftbukkit. Т.е. у них там видно своя кухня со своими тараканами.
EvilSeph являсь "гласом mojang" в какой-то степени несет их идеи. Уверен, что основная причина такого коммита не была озвучена - mojang хочет приучить разработчиков использовать только API: чтобы когда они сделают магазин плагинов (что-то мне подсказывает, что будет возможность покупать и продавать плагины ;)) не было плагинов, которые "часто ломаются" ;)
 
Так-с, если я правильно понял, то достаточно будет перейменировать class-файл?
 
Иха! Мой костыль применим, но сложно с ним работать.
исходники: https://github.com/DPOH-VAR/PowerNBT/
Точнее так: доступ к методам объектов осуществляется с помощью рефлексий, а класс VersionFix просто упрощают использование. Насколько сильно данный подход понижает быстродействие - не измерял, но по предположению - должно быть раза в 2.
 
По поводу скорости. Сейчас начал переделывать WeatherMan. Идея та же - использование "отражений". Но поскольку я с ними ещё не сталкивался, то в универсальность не лезу (да она и не нужна для вызова одного единственного метода), а делаю "в лоб". Заметил интересную вещь. После переписывания процедуры принудительного сохранения чанка (в майнкрафте он багнутый - если в чанке было только изменение биомов и больше ничего, он может и не сохраниться) увеличилась скорость.

К примеру, на моем компьютере-сервере смена биомов на 800 чанков происходила за 10-11 секунд, то после перехода на рефлексии на этом же объеме смена биомов (и сохранение соответственно) происходило за.... 6-7 секунд. Может конечно это совпадение (что-то там прокэшировалось и т.п.), но я тестировал и вчера и сегодня.
В общем, такое забавное наблюдение.
Единственный недостаток - всё-таки все это довольно-таки громоздко. Особенно когда добираешься к скрытым полям NMS.
 
Вообще жутко. Это не громоздко, это просто страшно.
Вот к примеру процедура, которая использовалась в WeatherMan для определения "оригинального" биома:
Java:
    public static Biome getOriginalBiome (int x, int z, World w){
        return CraftBlock.biomeBaseToBiome(((CraftWorld) w).getHandle().worldProvider.d.getBiome(x, z));
    }

А вот то, во что она превратилась:

Java:
    public static Biome getOriginalBiome (int x, int z, World w){
        try {
            Class<?> CraftWorld = Class.forName(obcClassPrefix+"CraftWorld");
            Object craftWorld = CraftWorld.cast(w);
            Method craftWorld_getHandle = CraftWorld.getMethod("getHandle");
            Object nmsWorldServer = craftWorld_getHandle.invoke(craftWorld);
            Class<?> NmsWorld = Class.forName(nmsClassPrefix+"World");
            Field field_worldProvider = NmsWorld.getDeclaredField("worldProvider");
            Object worldProvider = field_worldProvider.get(nmsWorldServer);
            Class<?>WorldProvider = Class.forName(nmsClassPrefix+"WorldProvider");
            Field field_WorldProvider_d = WorldProvider.getDeclaredField("d");
            Object d = field_WorldProvider_d.get(worldProvider);
            Method getBiome = d.getClass().getDeclaredMethod("getBiome", int.class, int.class);
            Object biomeBase = getBiome.invoke(d, x,z);
            Class<?> CraftBlock = Class.forName(obcClassPrefix+"block.CraftBlock");
            Class<?> BiomeBase = Class.forName(nmsClassPrefix+"BiomeBase");
            Method biomeBaseToBiome = CraftBlock.getDeclaredMethod("biomeBaseToBiome", BiomeBase);
            Object biome = biomeBaseToBiome.invoke(null, biomeBase);
            Biome b = (Biome) biome;
            return b;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

Наверное, её можно будет как-то оптимизировать... но ;)
 
Ололо! А почему ещё никто не сказал, какая жопа светит портировщикам модов? Там в оригинальных подах повсюду обращения к net.minecraft.server.*

А вообще я вижу простой способ обойти эту проверку версий без лишних извращений - в том же notepad++ выполнить замену org.bukkit.craftbukkit.{oldVersion} на org.bukkit.craftbukkit.{newVersion} во всех файлах проекта. Как мне кажется, особых усилий прилагать не нужно.
 
akke, ну портировщики модов собственно ничего нового не получит. Эти извр... ээ... героические личности ;) и так каждый раз делают одну и ту же работу. Вот они как раз заменой подстроки и займутся.

А меня не устраивает необходимость перекомпилировать каждый раз плагин при выходе новой версии майнкрафта. К примеру версия WeatherMan 0.4.7 "продеражалась" всего один день. После выхода RB1.4.5-R1.0 уже через день вышел девбилд 1.4.5-R0.1 и меня стали осаждать сообщениями о том, что он не работает.
А судя по статистике WeatherMan используют под версиями: 1.4.5, 1.4.6 (эти люди меня клянут за то, что он не работает ;)), 1.4.4, 1.4.2 (1.3 и более ранние опустим). То есть получается мне выпуская плагин надо делать сразу 3-4 версии под разные версии craftbukkit.

Уж лучше сделать один раз, но универсально.
 
fromgate,
4: Object craftWorld = CraftWorld.cast(w);
Не нужно кастить объект к классу, если мы его берем потом все равно как обычный объект. Т.е. просто нужно оставить
6: Object nmsWorldServer = craftWorld_getHandle.invoke(w);
Все крафтбуккитовские классы лучше определить как статические поля (выискивать их внутри static{...}), а потом к ним обращаться. Тогда не нужно будет выискивать класс по имени => увеличение быстродействия и повышение читабельности кода.
 
4: Object craftWorld = CraftWorld.cast(w);
Не нужно кастить объект к классу, если мы его берем потом все равно как обычный объект. Т.е. просто нужно оставить

Спасибо за совет, попробую (Я просто последовательно "разбирал" изначальный код и приводил его к "зеркальному" ;)).

По поводу второго я так и думал: иницилизировать все при старте плагина, а в процедурах уже обрщаться к готовым статическим методам и полям.

Забавная вообще получается вещь. Сегодня залью WeatherMan посмотрю на реакцию буккитовцев. Одобрят плагин или откажут из-за обхода их "защиты" ;)
 
Забавная вообще получается вещь. Сегодня залью WeatherMan посмотрю на реакцию буккитовцев. Одобрят плагин или откажут из-за обхода их "защиты" ;)
Отлично! Жду результатов. Надеюсь, что одобрят. Вряд ли кто-то будет копаться во всех классах. Да и к тому же главный критерий - чтобы плагин нормально работал на последней версии CB.
 
Да, я там сделал проверку версий (банально в массиве содержатся версии на которых тестировал). Если версия незнакомая - пишу в лог предупреждение.
 
В принципе у рефлексий есть одно огромное преимущество (чем можно будет "мотивировать" их использование, если со стороны крафтбуккитовцев будут претензии). Никто не мешает, в случае необходимости написать аналоги одной и той же процедуры с учетом изменений в CB от версии к версии.
Тогда плагин будет поистине универсальным - т.е. если к примеру в 1.5.x что-то очень сильно поменяется, написать для них метода getOriginalBiome и вызывать когда надо. Тогда плагин будет нормально работать и на 1.5.х и на 1.4.6.
 
bukkit захотели убить все "частные плагины" ?
 
благославляю эту тему... ибо тут увидел что шпигот не изуродовали как буккит.
 

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

Назад
Верх