Anvilgui - это библиотека для захвата пользовательского ввода в Minecraft через инвентарь наковальни. Инвентаризации наковальни в сфере API Minecraft / Bukkit / Spigot / Paper чрезвычайно финьяны и в конечном итоге не поддерживают возможность полностью использовать их для задачи пользовательского ввода. В результате, единственный способ добиться ввода пользователя с помощью инвентаризации наковальней, требует взаимодействия с запутанным декомпилированным кодом. Anvilgui предоставляет простое, универсальное и простое в использовании решение без того, чтобы ваш проект зависит от конкретного кода.
Вы должны использовать сопоставления Spigot, чтобы Anvilgui работал, но как вы можете быть уверены, что вы есть? Приведенные ниже вопросы помогут вам прояснить.
Ваш плагин - плагин Bukkit? Ваш плагин представляет собой плагин Bukkit, если он содержит файл plugin.yml
и не содержит файла paper-plugin.yml
. В этом случае, по умолчанию, вы используете сопоставления Spigot.
Ваш плагин - бумажный плагин? Ваш плагин всегда представляет собой бумажный плагин, если он содержит файл paper-plugin.yml
, даже если он также содержит файл plugin.yml
. В этом случае, по умолчанию, вы не используете сопоставления Spigot, но можете включить их через манифестную запись в соответствии с этими инструкциями.
Вы используете инструмент инструментов PaperDev PaperDev? В этом случае, по умолчанию, вы не используете сопоставления Spigot, но можете позволить им, используя опцию ReobfartifactConfiguration.
Если вы являетесь разработчиком, отправьте запрос на привлечение, добавив модуль обертки для вашей версии. В противном случае, пожалуйста, создайте проблему на вкладке «Проблемы».
Anvilgui требует использования Maven или Maven, совместимой с системой сборки.
< dependency >
< groupId >net.wesjd</ groupId >
< artifactId >anvilgui</ artifactId >
< version >1.10.3-SNAPSHOT</ version >
</ dependency >
< repository >
< id >codemc-snapshots</ id >
< url >https://repo.codemc.io/repository/maven-snapshots/</ url >
</ repository >
Лучше всего быть хорошим гражданином и переместить зависимость в вашем пространстве имен, чтобы предотвратить конфликты с другими плагинами. Вот пример того, как переместить зависимость:
< build >
< plugins >
< plugin >
< groupId >org.apache.maven.plugins</ groupId >
< artifactId >maven-shade-plugin</ artifactId >
< version >${shade.version}</ version > <!-- The version must be at least 3.5.0 -->
< executions >
< execution >
< phase >package</ phase >
< goals >
< goal >shade</ goal >
</ goals >
< configuration >
< relocations >
< relocation >
< pattern >net.wesjd.anvilgui</ pattern >
< shadedPattern >[YOUR_PLUGIN_PACKAGE].anvilgui</ shadedPattern > <!-- Replace [YOUR_PLUGIN_PACKAGE] with your namespace -->
</ relocation >
</ relocations >
< filters >
< filter >
< artifact >*:*</ artifact >
< excludeDefaults >false</ excludeDefaults >
< includes >
< include >net/wesjd/anvilgui/**</ include >
</ includes >
</ filter >
</ filters >
</ configuration >
</ execution >
</ executions >
</ plugin >
</ plugins >
</ build >
ПРИМЕЧАНИЕ. Чтобы решить <minimizeJar>
удаление Anvilgui VerionWrapper
S из конечной банки и сделать библиотеку непригодной для использования, убедитесь, что ваш раздел <filters>
содержит пример <filter>
как видно выше.
Класс AnvilGUI.Builder
- это то, как вы строите Anvilgui. Следующие методы позволяют изменить различные части отображаемого графического интерфейса. Javadocs доступны здесь.
onClose(Consumer<StateSnapshot>)
Принимает Consumer<StateSnapshot>
аргумент, который называется, когда игрок закрывает графический интерфейс наковальни.
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
Берет BiFunction
с щелчком, который был нажат, и снимок текущего состояния графического интерфейса. Функция вызывается, когда игрок нажимает любые слоты в инвентаре. Вы должны вернуть List<AnvilGUI.ResponseAction>
, который может включать в себя:
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
)AnvilGUI.ResponseAction.openInventory(Inventory)
)AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)Список действий выполняется в порядке, в котором они предоставлены.
builder . onClick (( slot , stateSnapshot ) -> {
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
});
onClickAsync(ClickHandler)
Берет ClickHandler
, сокращение для BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
, который ведет себя точно так же, как onClick()
с той разницей, что он возвращает CompletableFuture
и, следовательно, позволяет асинхронно ResponseAction
.
builder . onClickAsync (( slot , stateSnapshot ) -> CompletedFuture . supplyAsync (() -> {
// this code is now running async
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( database . isMagical ( stateSnapshot . getText ())) {
// the `ResponseAction`s will run on the main server thread
return Arrays . asList (
AnvilGUI . ResponseAction . close (),
AnvilGUI . ResponseAction . run (() -> myCode ( stateSnapshot . getPlayer ()))
);
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
}));
allowConcurrentClickHandlerExecution()
Сообщает Anvilgui отключить механизм, который внедряется, чтобы предотвратить одновременное выполнение обработчика Click, установленного onClickAsync(ClickHandler)
.
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
Это позволяет или лишает пользователей принимать / вводить элементы в провале наковальницы, которые предоставляются. Эта функция полезна, когда вы пытаетесь сделать систему ввода, используя графический интерфейс наковальницы.
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Сообщает Anvilgui, чтобы предотвратить нажатие пользователя, чтобы закрыть инвентарь. Полезно для таких ситуаций, как ввод пароля для игры.
builder . preventClose ();
geyserCompat()
Это переключает совместимость с программным обеспечением Geyser, в частности, способность использовать Anvilgui с 0 -м уровнем опыта на коренной породе. Включено по умолчанию.
builder . geyserCompat ();
text(String)
Принимает String
, которая содержит то, на что должен быть установлен начальный текст в поле переименования. Если предоставлен itemLeft
, то отображаемое имя установлено на предоставленный текст. Если itemLeft
не установлен, то будет использоваться лист бумаги.
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
Понимает пользовательский ItemStack
, который будет размещен в левом слоте ввода.
ItemStack stack = new ItemStack ( Material . IRON_SWORD );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "Sharp iron sword" ));
stack . setItemMeta ( meta );
builder . itemLeft ( stack );
itemRight(ItemStack)
Принимает пользовательский ItemStack
, который будет размещен в правильном входном слоте.
ItemStack stack = new ItemStack ( Material . IRON_INGOT );
ItemMeta meta = stack . getItemMeta ();
meta . setLore ( Arrays . asList ( "A piece of metal" ));
stack . setItemMeta ( meta );
builder . itemRight ( stack );
title(String)
Принимает String
, которая будет использоваться буквально в качестве названия инвентаря. Отображается только в Minecraft 1.14 и выше.
builder . title ( "Enter your answer" );
jsonTitle(String)
Принимает String
, которая содержит богатые текстовые компоненты, сериализованные как JSON. Полезно для названий настройки с шестигранными цветными кодами или компонентом приключений. Отображается только в Minecraft 1.14 и выше.
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
Принимает объект Plugin
, который делает этот графический интерфейс наковальницы. Это необходимо для регистрации слушателей.
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
Берет Executor
, который должен выполнить в поток основного сервера. Если поток основного сервера недоступен через планировщик Bukkit, как на серверах Folia, его можно поменяться для исполнителя Folia, знакомного с Folia.
builder . mainThreadExecutor ( executor );
open(Player)
Принимает Player
, для которого должен открыть графический интерфейс. Этот метод можно назвать несколько раз без необходимости создавать новый объект AnvilGUI.Builder
.
builder . open ( player );
new AnvilGUI . Builder ()
. onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
})
. onClick (( slot , stateSnapshot ) -> { // Either use sync or async variant, not both
if ( slot != AnvilGUI . Slot . OUTPUT ) {
return Collections . emptyList ();
}
if ( stateSnapshot . getText (). equalsIgnoreCase ( "you" )) {
stateSnapshot . getPlayer (). sendMessage ( "You have magical powers!" );
return Arrays . asList ( AnvilGUI . ResponseAction . close ());
} else {
return Arrays . asList ( AnvilGUI . ResponseAction . replaceInputText ( "Try again" ));
}
})
. preventClose () //prevents the inventory from being closed
. text ( "What is the meaning of life?" ) //sets the text the GUI should start with
. title ( "Enter your answer." ) //set the title of the GUI (only works in 1.14+)
. plugin ( myPluginInstance ) //set the plugin instance
. open ( myPlayer ); //opens the GUI for the player provided
Мы используем Maven, чтобы справиться с нашими зависимостями. Запустите mvn clean install
используя Java 21 для создания проекта.
Проект использует безупречный плагин Maven для обеспечения соблюдения руководящих принципов стиля. Вы не сможете создать проект, если ваш код не соответствует рекомендациям. Чтобы исправить все проблемы форматирования кода, просто запустите mvn spotless:apply
.
Этот проект лицензирован по лицензии MIT.