1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

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

?

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

Голосование закрыто 21 дек 2012.
  1. Да, всегда

    16,7%
  2. Да, но редко

    26,7%
  3. Нет, только Bukkit API

    23,3%
  4. Нет, а что это?

    33,3%
  1. Автор темы
    fromgate

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

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

    Spigot конечно хорош, но ориентироваться только на него было бы не правильно.
     
    ITrAnEI нравится это.
  2. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Прошу не распространять этот метод за пределы русского сообщества.
    Чтобы не вызывать подозрений на dеv.bukkit.оrg (по сути это обход их механизма контроля версий)
     
    ITrAnEI нравится это.
  3. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    DPOH-VAR, ну ты понимаешь, что до этого рано или поздно додумаются. Ну и кто первый "запостит" плагин на bukkit.org с таким кодом - сразу же засветит метод: их же все проверяют. Наверняка могут такой плагин и завернуть.
     
    ITrAnEI нравится это.
  4. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Ой туплю :D
    Они сами же выпускают spigot без лычек версий в пакетах. Значит, ничего страшного в этом обходе нет.
    И да, если вдруг внутри jar при проверке засветится класс с именем VersionFucker, это явно вызовет не добрые подозрения :)
     
    ITrAnEI и Alastar нравится это.
  5. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    DPOH-VAR, ну spigot, как я понимаю это детище md_5, который, как я понимаю, выпускает из-за того, что не может "протолкнуть" какие-то идеи в craftbukkit. Т.е. у них там видно своя кухня со своими тараканами.
    EvilSeph являсь "гласом mojang" в какой-то степени несет их идеи. Уверен, что основная причина такого коммита не была озвучена - mojang хочет приучить разработчиков использовать только API: чтобы когда они сделают магазин плагинов (что-то мне подсказывает, что будет возможность покупать и продавать плагины ;)) не было плагинов, которые "часто ломаются" ;)
     
    ITrAnEI и DPOH-VAR нравится это.
  6. MySt1k

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

    Баллы:
    173
    Вроде работают, нужно все до конца проверить.
     
  7. Тарас1987

    Тарас1987 Старожил Пользователь

    Баллы:
    173
    Skype:
    tarikyuzkiv1
    Имя в Minecraft:
    Tarik
    Так-с, если я правильно понял, то достаточно будет перейменировать class-файл?
     
  8. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Достаточно будет юзать спигот.
    А переименование класс-файлов не решит проблему.
     
    slavik123123123 и ITrAnEI нравится это.
  9. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Иха! Мой костыль применим, но сложно с ним работать.
    исходники: https://github.com/DPOH-VAR/PowerNBT/
    Точнее так: доступ к методам объектов осуществляется с помощью рефлексий, а класс VersionFix просто упрощают использование. Насколько сильно данный подход понижает быстродействие - не измерял, но по предположению - должно быть раза в 2.
     
    ITrAnEI нравится это.
  10. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    По поводу скорости. Сейчас начал переделывать WeatherMan. Идея та же - использование "отражений". Но поскольку я с ними ещё не сталкивался, то в универсальность не лезу (да она и не нужна для вызова одного единственного метода), а делаю "в лоб". Заметил интересную вещь. После переписывания процедуры принудительного сохранения чанка (в майнкрафте он багнутый - если в чанке было только изменение биомов и больше ничего, он может и не сохраниться) увеличилась скорость.

    К примеру, на моем компьютере-сервере смена биомов на 800 чанков происходила за 10-11 секунд, то после перехода на рефлексии на этом же объеме смена биомов (и сохранение соответственно) происходило за.... 6-7 секунд. Может конечно это совпадение (что-то там прокэшировалось и т.п.), но я тестировал и вчера и сегодня.
    В общем, такое забавное наблюдение.
    Единственный недостаток - всё-таки все это довольно-таки громоздко. Особенно когда добираешься к скрытым полям NMS.
     
    ITrAnEI нравится это.
  11. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Вообще жутко. Это не громоздко, это просто страшно.
    Вот к примеру процедура, которая использовалась в WeatherMan для определения "оригинального" биома:
    Код:
        public static Biome getOriginalBiome (int x, int z, World w){
            return CraftBlock.biomeBaseToBiome(((CraftWorld) w).getHandle().worldProvider.d.getBiome(x, z));
        }
    
    А вот то, во что она превратилась:

    Код:
        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;
            }
        }
    Наверное, её можно будет как-то оптимизировать... но ;)
     
    ITrAnEI нравится это.
  12. akke

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

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

    А вообще я вижу простой способ обойти эту проверку версий без лишних извращений - в том же notepad++ выполнить замену org.bukkit.craftbukkit.{oldVersion} на org.bukkit.craftbukkit.{newVersion} во всех файлах проекта. Как мне кажется, особых усилий прилагать не нужно.
     
    RVXman и Тарас1987 нравится это.
  13. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    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.

    Уж лучше сделать один раз, но универсально.
     
    ITrAnEI нравится это.
  14. DPOH-VAR

    DPOH-VAR Старожил Пользователь

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

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    4: Object craftWorld = CraftWorld.cast(w);
    Не нужно кастить объект к классу, если мы его берем потом все равно как обычный объект. Т.е. просто нужно оставить

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

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

    Забавная вообще получается вещь. Сегодня залью WeatherMan посмотрю на реакцию буккитовцев. Одобрят плагин или откажут из-за обхода их "защиты" ;)
     
    ITrAnEI и DPOH-VAR нравится это.
  16. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Отлично! Жду результатов. Надеюсь, что одобрят. Вряд ли кто-то будет копаться во всех классах. Да и к тому же главный критерий - чтобы плагин нормально работал на последней версии CB.
     
    zuma2 и ITrAnEI нравится это.
  17. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Да, я там сделал проверку версий (банально в массиве содержатся версии на которых тестировал). Если версия незнакомая - пишу в лог предупреждение.
     
    ITrAnEI нравится это.
  18. Автор темы
    fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    В принципе у рефлексий есть одно огромное преимущество (чем можно будет "мотивировать" их использование, если со стороны крафтбуккитовцев будут претензии). Никто не мешает, в случае необходимости написать аналоги одной и той же процедуры с учетом изменений в CB от версии к версии.
    Тогда плагин будет поистине универсальным - т.е. если к примеру в 1.5.x что-то очень сильно поменяется, написать для них метода getOriginalBiome и вызывать когда надо. Тогда плагин будет нормально работать и на 1.5.х и на 1.4.6.
     
    ITrAnEI нравится это.
  19. Alex_

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

    Баллы:
    123
    bukkit захотели убить все "частные плагины" ?
     
  20. Alex_

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

    Баллы:
    123
    благославляю эту тему... ибо тут увидел что шпигот не изуродовали как буккит.
     
    fromgate нравится это.

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