Войти или зарегистрироваться

Вопросы совместимости на уровне BukkitAPI разных версий

  • Автор темы Автор темы fromgate
  • Дата начала Дата начала

fromgate

Старожил
Пользователь
Баллы
173
Имя в Minecraft
fromgate
Добрый день!

После последних обновлений Bukkit API прослеживается неприятная тенденция. Некоторые функции в BukkitAPI внезапно изменяют типы данных с которыми они работают, сохраняя при этом свое название.

Честно говоря, я не понимаю, почему разработчики craftbukkit так легко вносят изменения в API. Ведь одно из назначений API - это какая-то гарантия того, что плагин написанный без обращения к внутреннему коду сервера будет работать на множестве версий.

В общем сейчас ситуация такова, что плагин скомпилированный под 1.7.2 не будет работать под 1.5.2.
В первую очередь это связано с переходом к использованию double вместо int для представления едениц измерения здоровья, урона и т.п.
С этим я готов был мириться, но когда в пределах одной версии (1.7.х) пошли дальнейшие изменения API (и у меня плагин скомпилированный под 1.7.4 не заработал под 1.7.2 — причем все было на Bukkit API), то я решил, что нужно что-то делать.


В общем, у меня в результате получился небольшой класс, который я использовал в плагине ReActions для обхода таких нюансов:
https://github.com/fromgate/ReActio...te/reactions/util/BukkitCompatibilityFix.java

Работает он используя рефлексии и не претендует на полноту - писался конкретно под ReActions. Если у Вас вылезет вопрос несовместимости в другом месте, то думаю его тоже можно будет решить.

Если же у Вас есть идеи как решить вопрос несовместимости API более универсально и вообще как-то по другому, напишите - я буду благодарен :)

P.S. В приведенном классе есть вызова метода logOnce из ReActions — смело убирайте, это запись ошибки в лог.
 
fromgate, nice and sweet :)
 
BukkitAPI гарантирует тебе обратную совместимость, как и любой другой API, форвард совместиомсть тебе никто не обещал. И слава богу что форвард совместимостью никто не занимается, ограничивать возможности API новых версий только из-за того что кто-то может сидеть на старых версиях нельзя.
 
Думаю что, кроме рефлексии ничего не поможет.
 
BukkitAPI гарантирует тебе обратную совместимость, как и любой другой API, форвард совместиомсть тебе никто не обещал. И слава богу что форвард совместимостью никто не занимается, ограничивать возможности API новых версий только из-за того что кто-то может сидеть на старых версиях нельзя.

Так в том-то и дело, что как раз обратной совместимости нет. Плагинов, которые ждут ProjectileSource в качестве ответа на getShooter() под 1.5.2 или даже 1.7.2 нет. Т.е. все плагины, которые используют этот метод, перестанут нормально работать.

Что мешало, пометить этот getShooter() как устаревший и ввести новый getProjectileSource()? Раньше ведь так и делали. Или объявляли о грядущих изменениях заранее.
 
Форвард совместимость это когда плагины написанные на новой версии API гарантированно работают на старой. Такого в бакките нет и никогда не будет.

А обратная совместимость есть, плагины написанные на старой версии API аботают на новой. (getShooter() может возвращать и то и то.)
 
Что мешало, пометить этот getShooter() как устаревший и ввести новый getProjectileSource()? Раньше ведь так и делали. Или объявляли о грядущих изменениях заранее.

Сейчас перепроверил - старые методы всё же остались.

Код:
  @Deprecated
  public abstract LivingEntity getShooter();

  public abstract ProjectileSource getShooter();

Что ж, это хорошо.
А обратная совместимость есть, плагины написанные на старой версии API аботают на новой. (getShooter() может возвращать и то и то.)

Действительно. Это отлично. Значит не всё так плохо! :)
 
Назад
Верх