Я делаю плагин для Майнкрафта.
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");
Вы создали проблему с 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 Я имею в виду, что возникла проблема с созданием элемента. Можете ли вы отредактировать свое сообщение, чтобы добавить обновленный код?
Я обновил свой пост. Как вы думаете, добавление настройки (кроме API-версии) решит эту ситуацию? : >
@autext, можешь показать, как определяется переменная IS_LEGACY
? Кроме того, в приведенном вами коде, похоже, есть опечатка (добавлен )
после двух строк, которых здесь не должно быть)
Я обновил свой вопрос, чтобы показать определение IS_LEGACY
. И, пожалуйста, скажите мне о моей опечатке, спасибо.
@autext Я обнаружил проблему в вашем устаревшем методе, можете ли вы ее проверить?
О да, ты прав. Это моя ошибка. Но с вашей IS_LEGACY
логикой все еще существует исключение AuthorNagException, упомянутое в моем вопросе.
@autext Я вижу еще одну ошибку, я просто добавил ее в свой пост
Я всегда думал, что пока добавлена версия API: 1.13, версии ниже 1.13 не будут работать. Судя по тому, что вы говорите, может ли он по-прежнему работать ниже 1,13? Если все в порядке, то эта проблема будет решена.
@autext, у тебя есть эта ошибка в версии 1.13+? Вы уверены, что использовать настоящую белую стеклянную панель хорошо, как хорошо используется is_legacy?