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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Cool_boy, 15 июл 2018.

Метки:
  1. Автор темы
    Cool_boy

    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 = (Stairsblock.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 colorString 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().
    • Увеличили лимиты для префикса/суффикса. Не перестарайтесь. [​IMG]
     
    Последнее редактирование: 24 июл 2018
  2. Mr Hosting
  3. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    И сразу же задам вопрос. Как теперь работать с цветами блоков? Каждый цвет теперь отдельный блок. Хотя и появилась такая штука как Tag, не ясно как получить нужный цвет. Есть вариант написать метод который бы просто перед именем блока писал бы нужный цвет, и получал его через Material.getMaterial(), но вдруг существует нормальный способ уже в API.
     
  4. Zнамя Юности

    Zнамя Юности Активный участник Временно заблокирован Пользователь

    Баллы:
    76
    всмысле как. у них теперь свои айдишники.
     
  5. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ну вот например:
    Я хочу получить цветную стеклянную панель. Была бы это шерсть, можно бы было сделать new Wool(DyeColor.RED).toItemStack() и получить шерсть. Только вот, GlassPane не наследует Colorable...
     
  6. alexandrage

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

    Баллы:
    173
    Узнаем все как спигот выйдет.
     
  7. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
  8. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Написал такой вариант:
    PHP:
    public static Material getMaterialByColor(DyeColor colorString suffix) {
        return 
    Material.getMaterial((color.equals(DyeColor.SILVER) ? "LIGHT_GRAY" color.name()) + "_" suffix);
    }
    Можно использовать как getMaterialByColor(DyeColor.RED,"STAINED_GLASS_PANE");
    Только вот DyeColor.SILVER немного не в тему, пойду предложу переименовать его.

    UP. Переименовали, обновлённый метод в шапке.
     
    Последнее редактирование: 24 июл 2018
  9. alexandrage

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

    Баллы:
    173
    Вот так теперь getBlock().getBlockData()
     
  10. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ибо их не надо. Всё что нужно в материале прописано.
     
  11. alexandrage

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

    Баллы:
    173
    Лол. getDrops() там вообще сломан. Короче рано еще дрочить это апи. Потеря времени. Ничего еще не реализовано.
     
  12. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    md_5 не очень то хочет переименовать DyeColor.SILVER, говорит что много чего сломает и что у рыбок есть такой цвет. Плюсаните задачу что-ли.
    https://hub.spigotmc.org/jira/browse/SPIGOT-4007
     
  13. AbstractCoder

    AbstractCoder Активный участник Пользователь

    Баллы:
    46
    Имя в Minecraft:
    AbstractCoder
    Предложи лучше добавить статический метод по типу getByName(String) для DyeColor и чтобы как DyeColor.getByName("SILVER"), так и DyeColor.getByName("LIGHT_GRAY") возвращали DyeColor.SILVER. Ну и + сразу в аппер кейс переводить строку.
    Тогда это ничего не сломает.
     
  14. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Ну я уже предложил метод типа getBlockColor(), чтобы для SILVER он возвращал LIGHT_GRAY. Можешь добавить комментарий со своим предложением. Чем активней будет обсуждаться задача, тем больше шансов что что-то сделают.
     
  15. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Так я выше метод кидал. Как-то не очень, когда в ведре с названий 16 цветов, от игры отличается только один, вот и предложил на JIR'е.
     
  16. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    76
    Skype:
    DymethInfo
    Имя в Minecraft:
    Dymeth
    Цветная шерсть - это, конечно, хорошо, но меня больше интересует, как теперь физика жидкостей отключается?

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

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

    Сам вопрос пока не изучал, однако возможно позже тут появится решение.
    Ну, или сами подскажите, если уже в курсе...
     
    Последнее редактирование: 21 июл 2018
  17. alexandrage

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

    Баллы:
    173
    А другое и не проюзаешь. Ибо новое недопис. Реально быстрее будет перейти на sponge, чем жрать такое. Там то уже апи сформировался как должно быть.
     
  18. Cristalix

    Cristalix Активный участник Пользователь

    Баллы:
    66
    Имя в Minecraft:
    Test
    А что уже вышел новый релиз?
     
  19. alexandrage

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

    Баллы:
    173
    Нет.
     
  20. Автор темы
    Cool_boy

    Cool_boy Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    prettydude
    Посмотри, запускается ли BlockPhysicsEvent. И действительно не ясно, как управлять жидкостями, им ведь не завезли BlockData.
     
  21. l_Slime_l

    l_Slime_l Активный участник Пользователь

    Баллы:
    76
    А ещё не ясно как теперь работать со схематиками. Там ведь все блоки и data хранятся в byte array.. А в 1.13 убрали id и data.
     

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