Стартап Работа с API 1.13

Cool_boy

Активный участник
Пользователь
Баллы
96
Имя в Minecraft
prettydude
Создал тему чтобы люди, которые имеют вопросы по поводу обновления плагинов под 1.13, могли задавать их здесь. Думаю, через некоторое время, вынесу самые важные изменения с примерами в шапку.

Как скомпилировать плагин под 1.13?
Чтобы Bukkit/Spigot увидел ваш плагин как уже обновлённый под 1.13, в файле plugin.yml надо дописать
Код:
api-version: 1.13

Почему нужно указывать версию API, раньше же и без этого работало?
В 1.13 изменилось большое количество материалов (они теперь называются так же, как и в игре), и чтобы плагины со старых версий хотя бы имели шанс запуститься на новой версии, Bukkit/Spigot при загрузке попытается обновить их в нужный формат.

Что такое Tag?
В 1.13 вместе с наборами данных появились тэги (метки). С их помощью можно группировать предметы или блоки вместе. В Bukkit добавили только ванильные тэги, которые представляют из себя простой список материалов.
Чтобы проверить входит ли материал в список, есть метод isTagged(). Не ясно, добавят ли возможность добавлять или изменять их, но уже лучше чем проверять цветную шерсть через .contains("WOOL").

Что такое BlockData?
BlockData - замена для MaterialData. На все существующие классы MaterialData есть аналогичный вариант BlockData (поэтому следите, что вы импортируете). MaterialData нормально могут использовать только плагины которые не написаны под 1.12 и ниже, поэтому она была помечена устаревшей.
Работа с BlockData идентична работе с MaterialData.
PHP:
if (Tag.STAIRS.isTagged(block.getType())) { //проверяем ступени ли это
    Stairs stairs = (Stairs) block.getBlockData(); //получаем BlockData
    stairs.setWaterlogged(true); //"затопливаем" ступеньки
    stairs.setShape(Stairs.Shape.OUTER_LEFT); //устанавливаем форму
    stairs.setHalf(Bisected.Half.TOP); //меняем половину
    stairs.setFacing(BlockFace.EAST); //меняем направление
    block.setBlockData(stairs); //задаём BlockData
}

Можно ли сериализовать её?
Да, и даже удобнее чем это было раньше. Теперь можно использовать строки как в самой игре. Например, немного съеденный торт можно записать как minecraft:cake[bites=3], и получить его BlockData можно через Server.createBlockData(String). Чтобы конвертировать BlockData в строку добавлен метод getAsString().

Как теперь получить цветной блок?
Так как каждый цвет теперь отдельный материал, то достаточно прописать нужный. Если вам нужно получить материал нужного цвета, можно использовать этот метод.
(md_5 переименовал DyeColor.SILVER, теперь всё ок)
PHP:
public static Material getMaterialByColor(DyeColor color, String suffix) {
    return Material.getMaterial(color + "_" + suffix);
}

Небольшие изменения
  • Переименовали картины BURNING_SKULL и DONKEY_KONG, но это и так никого не волнует.
  • Опять удалили/добавили целую кучу звуков в классе Sounds, впрочем, как всегда.
  • Статистика PLAY_ONE_TICK теперь PLAY_ONE_MINUTE, небольшая потеря точности.
  • Переименованы биомы в классе Biome, теперь всё как и в игре.
  • Много BlockState теперь deprecated, так как всё теперь хранится в материале.
  • Ранее deprecated класс Fish (ранее отвечавший за поплавок) теперь отвечает за новых мобов.
  • NotePlayEvent теперь не реагирует на setInstrument / setNote, редактируйте блок в мире чтобы изменить звук.
  • Удалили метод BukkitScheduler.cancelAllTasks().
  • Material.isTransparent() теперь deprecated, потому что никто точно не знает, что считать прозрачным блоком.
  • Для стрел добавили метод getAttachedBlock().
  • Увеличили лимиты для префикса/суффикса. Не перестарайтесь.
    8ad9ceb981690acea3a58975c10357a4ffd74734
 
Последнее редактирование:
И сразу же задам вопрос. Как теперь работать с цветами блоков? Каждый цвет теперь отдельный блок. Хотя и появилась такая штука как Tag, не ясно как получить нужный цвет. Есть вариант написать метод который бы просто перед именем блока писал бы нужный цвет, и получал его через Material.getMaterial(), но вдруг существует нормальный способ уже в API.
 
И сразу же задам вопрос. Как теперь работать с цветами блоков? Каждый цвет теперь отдельный блок. Хотя и появилась такая штука как Tag, не ясно как получить нужный цвет. Есть вариант написать метод который бы просто перед именем блока писал бы нужный цвет, и получал его через Material.getMaterial(), но вдруг существует нормальный способ уже в API.
всмысле как. у них теперь свои айдишники.
 
всмысле как. у них теперь свои айдишники.
Ну вот например:
Я хочу получить цветную стеклянную панель. Была бы это шерсть, можно бы было сделать new Wool(DyeColor.RED).toItemStack() и получить шерсть. Только вот, GlassPane не наследует Colorable...
 
Написал такой вариант:
PHP:
public static Material getMaterialByColor(DyeColor color, String suffix) {
    return Material.getMaterial((color.equals(DyeColor.SILVER) ? "LIGHT_GRAY" : color.name()) + "_" + suffix);
}
Можно использовать как getMaterialByColor(DyeColor.RED,"STAINED_GLASS_PANE");
Только вот DyeColor.SILVER немного не в тему, пойду предложу переименовать его.

UP. Переименовали, обновлённый метод в шапке.
 
Последнее редактирование:
Лол. getDrops() там вообще сломан. Короче рано еще дрочить это апи. Потеря времени. Ничего еще не реализовано.
 
md_5 не очень то хочет переименовать DyeColor.SILVER, говорит что много чего сломает и что у рыбок есть такой цвет. Плюсаните задачу что-ли.
https://hub.spigotmc.org/jira/browse/SPIGOT-4007
Предложи лучше добавить статический метод по типу getByName(String) для DyeColor и чтобы как DyeColor.getByName("SILVER"), так и DyeColor.getByName("LIGHT_GRAY") возвращали DyeColor.SILVER. Ну и + сразу в аппер кейс переводить строку.
Тогда это ничего не сломает.
 
Предложи лучше добавить статический метод по типу getByName(String) для DyeColor и чтобы как DyeColor.getByName("SILVER"), так и DyeColor.getByName("LIGHT_GRAY") возвращали DyeColor.SILVER. Ну и + сразу в аппер кейс переводить строку.
Тогда это ничего не сломает.
Ну я уже предложил метод типа getBlockColor(), чтобы для SILVER он возвращал LIGHT_GRAY. Можешь добавить комментарий со своим предложением. Чем активней будет обсуждаться задача, тем больше шансов что что-то сделают.
 
написал свой класс с обработкой цветов.
Так я выше метод кидал. Как-то не очень, когда в ведре с названий 16 цветов, от игры отличается только один, вот и предложил на JIR'е.
 
Цветная шерсть - это, конечно, хорошо, но меня больше интересует, как теперь физика жидкостей отключается?

Материал стоячей воды/лавы удалили вовсе, теперь вместо этого у каждого блока нбт-тег с типом и уровнем жидкости.

Собственно, раньше это отлавливалось и отменялрюось в BlockFromToEvent, правильно?
Сейчас, очевидно, этот эвенты уже срабатывать не будет при течении воды (по крайней мере это логично).
Вместо него какой-нибудь BlockChangeEvent или что-то в таком духе?
Вручную теги из блока вытаскивать при помощи нмс? Или для тегов есть апи? Или прям для получения уровня и типа жидкости есть геттеры/сеттеры?

Сам вопрос пока не изучал, однако возможно позже тут появится решение.
Ну, или сами подскажите, если уже в курсе...
 
Последнее редактирование:
Особенно прикольный тот факт, что они мол сказали что айдишки окончательно прекратили поддерживать, а сами оставили @Deprecated метод в Material опять. Да еще и закоментили мол "Ни в коем случае это не юзайте". Типа что, смотреть на этот метод и ностальгировать теперь?
А другое и не проюзаешь. Ибо новое недопис. Реально быстрее будет перейти на sponge, чем жрать такое. Там то уже апи сформировался как должно быть.
 
Цветная шерсть - это, конечно, хорошо, но меня больше интересует, как теперь физика жидкостей отключается?

Материал текущей воды/лавы удалили вовсе, теперь вместо этого у каждого блока нбт-тег с типом и уровнем жидкости.

Плюс к этому материал статической воды переименовали просто в воду, с лавой так же. Но это уже мелочи...

Собственно, раньше это отлавливалось и отменялрюось в BlockFromToEvent, правильно?
Сейчас, очевидно, этот эвенты уже срабатывать не будет при течении воды (по крайней мере это логично).
Вместо него какой-нибудь BlockChangeEvent или что-то в таком духе?
Вручную теги из блока вытаскивать при помощи нмс? Или для тегов есть апи? Или прям для получения уровня и типа жидкости есть геттеры/сеттеры?

Сам вопрос пока не изучал, однако возможно позже тут появится решение.
Ну, или сами подскажите, если уже в курсе...
Посмотри, запускается ли BlockPhysicsEvent. И действительно не ясно, как управлять жидкостями, им ведь не завезли BlockData.
 
Посмотри, запускается ли BlockPhysicsEvent. И действительно не ясно, как управлять жидкостями, им ведь не завезли BlockData.
А ещё не ясно как теперь работать со схематиками. Там ведь все блоки и data хранятся в byte array.. А в 1.13 убрали id и data.
 
Назад
Верх Низ