Стартап Работа с 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
 
Последнее редактирование:
Я конечно понимаю,что долбик не сделавший ничего не может давать советы,но почему бы просто не переходить на данную версию,или вам интересно тут сидеть и возмущаться?
 
В майнкрафте есть только один формат схематиков - тот, что даёт ванилла. В губке используется этот самый вариант.
Ну хз, в обсуждении обновы WE всплывала такая тема. Мне то все-равно, что даст WE, то и буду использовать 😆
https://github.com/sk89q/WorldEdit/pull/418#issuecomment-398254882
 
>> 5 - still yet to fix, will be migrating to the Sponge format as the default, and removing write support from the old ones.
Губка победила еще несколько лет назад.
Да все уже. Ведроапи свое отжил. Там теперь годами будет чинить все.
 
Походу опять половина серверов останется на 1.12 как в свое время было с 1.5.2. Интересно, делать рефакторинг на sponge правда выгоднее? И сколько это займет сил и времени, не придется ли все заново переписывать.
 
Последнее редактирование:
Ещё бы не помешала таблица соответствия старых материалов с новыми...
6WnRFeq.png
 
Идеи? Предложения?
Код:
   private static ItemStack getSpawnEgg_One(EntityType entityType, int amount, short damage) {
        ItemStack stack = new ItemStack(Material.BAT_SPAWN_EGG, amount, damage);
        stack.setData(new SpawnEgg(entityType));
        return stack;
    }

    private static ItemStack getSpawnEgg_Two(EntityType entityType, int amount, short damage) {
        ItemStack stack = new ItemStack(Material.BAT_SPAWN_EGG, amount, damage);
        SpawnEggMeta meta = ((SpawnEggMeta) stack);
        meta.setSpawnedType(entityType);
        stack.setItemMeta(meta);
        return stack;
    }

    private static ItemStack getSpawnEgg_Three(EntityType entityType, int amount, short damage) {
        Material material = Material.getMaterial(entityType.name().concat("_SPAWN_EGG"), false); //isLegacy
        return new ItemStack(material, amount, damage);
    }
 
private static ItemStack getSpawnEgg_Three(EntityType entityType, int amount, short damage) { Material material = Material.getMaterial(entityType.name().concat("_SPAWN_EGG"), false); //isLegacy return new ItemStack(material, amount, damage); }
Кажись Bukkit теперь хочет чтобы мы делали такие костыли. Только вот зачем тебе damage?
 
Кажись Bukkit теперь хочет чтобы мы делали такие костыли. Только вот зачем тебе damage?
Ну, может кому-то надо durability задать при создании предмета. Благо есть возможность передать это в конструктор. Уже мелочи...
 
Теперь имена каналов для обмена сообщениями должны указываться в нижнем регистре, а так же содержать минимум одно двоеточие.
В связи с этим, например, поломалось это:
Код:
Bukkit.getServer().getMessenger().registerIncomingPluginChannel(Plugin, "WDL|INIT", PluginMessageListener);
ROc7h18.png


Подозреваю, что в данном конкретном случае будет достаточно сменить "WDL|INIT" на "wdl:init", но это не точно. Исключения-то 100% не возникнет, но вот мод может и не заблокироваться. Нужно будет проверять...
 
Теперь имена каналов для обмена сообщениями должны указываться в нижнем регистре, а так же содержать минимум одно двоеточие.
В связи с этим, например, поломалось это:
Код:
Bukkit.getServer().getMessenger().registerIncomingPluginChannel(Plugin, "WDL|INIT", PluginMessageListener);
ROc7h18.png


Подозреваю, что в данном конкретном случае будет достаточно сменить "WDL|INIT" на "wdl:init", но это не точно. Исключения-то 100% не возникнет, но вот мод может и не заблокироваться. Нужно будет проверять...
Всем насрать же. Всегда вырезали этот чанел с мода.
 
Приветствую всех. Хотел перевести сервер на 1.13, в итоге столкнулся с миллионом проблем, но главный раздражающий фактор для меня полный коллапс со всеми плагинами. Как думаете, стоит дальше сидеть на 1.12 или в ближайшее время все-таки выкатят адаптированные версии плагинов? Плясать с бубном вокруг каждого плагина времени нет.
Спасибо за ответ.
 
выкатят адаптированные версии плагинов
Активные разрабы уже выкатили. Можно попытаться запустить плагин в надежде что будет работать, но скорее всего нет.
 
Назад
Верх Низ