Адаптация плагина Minecraft WHITE_STAINED_GLASS_PANE для версий после 1.13 и до 1.12

Я делаю плагин для Майнкрафта.

public final static ItemStack WHITE_STAINED_GLASS_PANE = (IS_LEGACY ? new ItemStack(Material.valueOf("STAINED_GLASS_PANE"), 1, (short) 0) : new ItemStack(Material.WHITE_STAINED_GLASS_PANE));

Я адаптировал версию. Но когда я запускаю плагин, возникает ошибка:

Fatal error trying to convert ***.class
org.bukkit.plugin.AuthorNagException: No legacy enum constant for WHITE_STAINED_GLASS_PANE. Did you forget to define a modern (1.13+) api-version in your plugin.yml?

Мой код может работать без сбоев, но я хочу удалить это сообщение об ошибке. Какой код мне следует вставить?


@Elikill58
Обновлен код.
Я использую maven для компиляции.
Вот фрагменты кода, которые, по моему мнению, имеют отношение к этой проблеме:

// the main class snippet
public static ItemStack createItem(String name, String legacy, short color) {
   return IS_LEGACY ? new ItemStack(Material.valueOf(legacy), 1, color) : new ItemStack(Material.valueOf(name));
}
public final static ItemStack WHITE_STAINED_GLASS_PANE = createItem("WHITE_STAINED_GLASS_PANE", "STAINED_GLASS_PANE"), (short) 0);
# src/main/resources/plugin.yml
name: name
author: autext
description: A plugin of Minecraft
main: me.autext.abcde.ABCDE
version: ${project.version}

определение IS_LEGACY:

class VersionString {

    private final int major;
    private final int minor;
    private final int patch;

    public VersionString(String version) {
        String[] parts = version.split("\\.");
        this.major = Integer.parseInt(parts[0]);
        this.minor = Integer.parseInt(parts[1]);
        this.patch = parts.length > 2 ? Integer.parseInt(parts[2]) : 0;
    }

    public boolean isLowerThan(String otherVersion) {
        VersionString other = new VersionString(otherVersion);
        if (this.major < other.major) {
            return true;
        }
        if (this.major > other.major) {
            return false;
        }
        if (this.minor < other.minor) {
            return true;
        }
        if (this.minor > other.minor) {
            return false;
        }
        return this.patch < other.patch;
    }
}
private final static Boolean IS_LEGACY = new VersionString(Bukkit.getVersion().replaceAll("[^0-9.]", "")).isLowerThan("1.13");
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы создали проблему с Java. При использовании констант в качестве X.A, даже если они не используются, они интерпретируются кодом. Это означает, что Java попытается получить переменную (в вашем случае — константу перечисления WHITE_STAINED_GLASS_PANE.

Чтобы это исправить, вы можете просто использовать Material.valueOf("WHITE_STAINED_GLASS_PANE"), как вы это делали для наследия.


Другой способ — создать метод utils, который будет его выбирать, например:

public static ItemStack createItem(String name, String legacy, short color) {
   return IS_LEGACY ? new ItemStack(Material.valueOf(legacy), 1, color) : new ItemStack(Material.valueOf(name));
}

Затем используйте его как:

public final static ItemStack WHITE_STAINED_GLASS_PANE = createItem("WHITE_STAINED_GLASS_PANE", "STAINED_GLASS_PANE"), (short) 0);

Это облегчит вам задачу, если вы хотите иметь многоцветное стекло.


Об обновленной переменной IS_LEGACY

Я проверил ваш код и в некоторых версиях Bukkit.getVersion() вернул что-то вроде этого: git-paper-123456 (MC: 1.12). Я думаю, вам следует проверить значение «*MC: *». Поскольку я лично получаю версию «16181.12.2», я получил «git-Paper-1618 (MC: 1.12.2)».

Вы можете использовать это регулярное выражение: MC: (\\d+\\.\\d+(\\.\\d+)?).

С этим кодом у меня все работает нормально:

private final static Boolean IS_LEGACY;
public static final String REGEX = "MC: (\\d+\\.\\d+(\\.\\d+)?)", VERSION;
static {
    Pattern pattern = java.util.regex.Pattern.compile(REGEX);
    Matcher matcher = pattern.matcher(Bukkit.getVersion());

    if (matcher.find()) {
        VERSION = matcher.group(1);
        IS_LEGACY = new VersionString(matcher.group(1)).isLowerThan("1.13");
    } else {
        VERSION = "Unknown";
        IS_LEGACY = true;
    }
}

Вы можете узнать больше о ключевом слове static {}здесь.

Вам также следует изменить свой plugin.yml. Вам нужно установить api-version: 1.13, чтобы это исправить. Это не нарушает версию 1.12 и ниже.

Вот окончательный файл:

name: name
author: autext
description: A plugin of Minecraft
main: me.autext.abcde.ABCDE
version: ${project.version}
api-version: 1.13

@autext, у тебя есть эта ошибка в версии 1.13+? Вы уверены, что использовать настоящую белую стеклянную панель хорошо, как хорошо используется is_legacy?

Elikill58 24.08.2024 14:09

Могу я спросить, что вы имеете в виду (・へ・)? Я создаю графический интерфейс, используя инвентарь, белая панель — это граница графического интерфейса. Поскольку мы не можем устранить ошибку, что еще вы порекомендуете для улучшения моего графического интерфейса? чтобы заменить белую панель: > Спасибо

autext 24.08.2024 16:30

@autext Я имею в виду, что возникла проблема с созданием элемента. Можете ли вы отредактировать свое сообщение, чтобы добавить обновленный код?

Elikill58 24.08.2024 16:36

Я обновил свой пост. Как вы думаете, добавление настройки (кроме API-версии) решит эту ситуацию? : >

autext 24.08.2024 16:59

@autext, можешь показать, как определяется переменная IS_LEGACY? Кроме того, в приведенном вами коде, похоже, есть опечатка (добавлен ) после двух строк, которых здесь не должно быть)

Elikill58 24.08.2024 18:55

Я обновил свой вопрос, чтобы показать определение IS_LEGACY. И, пожалуйста, скажите мне о моей опечатке, спасибо.

autext 25.08.2024 05:50

@autext Я обнаружил проблему в вашем устаревшем методе, можете ли вы ее проверить?

Elikill58 25.08.2024 15:12

О да, ты прав. Это моя ошибка. Но с вашей IS_LEGACY логикой все еще существует исключение AuthorNagException, упомянутое в моем вопросе.

autext 25.08.2024 15:37

@autext Я вижу еще одну ошибку, я просто добавил ее в свой пост

Elikill58 25.08.2024 22:10

Я всегда думал, что пока добавлена ​​версия API: 1.13, версии ниже 1.13 не будут работать. Судя по тому, что вы говорите, может ли он по-прежнему работать ниже 1,13? Если все в порядке, то эта проблема будет решена.

autext 26.08.2024 04:08

Другие вопросы по теме