AnvilGui est une bibliothèque pour capturer la saisie des utilisateurs dans Minecraft via un inventaire Anvil. Les inventaires Anvil dans le domaine de l'API Minecraft / Bukkit / Spigot / Paper sont extrêmement finnics et ne prennent finalement pas en charge la possibilité de les utiliser entièrement pour la tâche de la saisie de l'utilisateur. En conséquence, le seul moyen d'obtenir une entrée utilisateur avec un inventaire d'enclume nécessite une interaction avec le code obscurci et décompilé. Anvilgui fournit une solution simple, polyvalente et facile à utiliser sans que votre projet dépend du code spécifique à la version.
Vous devez utiliser des mappages de robinets pour que Anvilgui fonctionne, mais comment pouvez-vous être sûr que vous êtes? Les questions ci-dessous vous aideront à éliminer les choses.
Votre plugin est-il un plugin bukkit? Votre plugin est un plugin bukkit s'il contient un fichier plugin.yml
et ne contient pas de fichier paper-plugin.yml
. Dans ce cas, par défaut, vous utilisez des mappages de robinets.
Votre plugin est-il un plugin papier? Votre plugin est toujours un plugin papier s'il contient un fichier paper-plugin.yml
, même s'il contient également un fichier plugin.yml
. Dans ce cas, par défaut, vous n'utilisez pas de mappages de robinets, mais vous pouvez les activer via une entrée manifeste selon ces instructions.
Utilisez-vous la chaîne d'outils UserDev du papier à papier? Dans ce cas, par défaut, vous n'utilisez pas de mappages de robinets, mais vous pouvez les activer à l'aide de l'option ReobfartifactConfiguration.
Si vous êtes un développeur, soumettez une demande de traction ajoutant un module de wrapper pour votre version. Sinon, veuillez créer un problème sur l'onglet Problèmes.
Anvilgui nécessite l'utilisation de Maven ou d'un système de construction compatible 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 >
Il est préférable d'être un bon citoyen et de déménager la dépendance dans votre espace de noms afin d'éviter les conflits avec d'autres plugins. Voici un exemple de la façon de déplacer la dépendance:
< 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 >
Note: In order to solve <minimizeJar>
removing AnvilGUI VerionWrapper
s from the final jar and making the library unusable, ensure that your <filters>
section contains the example <filter>
as seen above.
La classe AnvilGUI.Builder
est la façon dont vous construisez un anvilgui. Les méthodes suivantes vous permettent de modifier diverses parties de l'interface graphique affichée. Les Javadocs sont disponibles ici.
onClose(Consumer<StateSnapshot>)
Prend un argument Consumer<StateSnapshot>
qui est appelé lorsqu'un joueur ferme l'interface graphique Anvil.
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
Prend une BiFunction
avec la fente qui a été cliquée et un instantané de l'état de GUI actuel. La fonction est appelée lorsqu'un lecteur clique sur des emplacements dans l'inventaire. Vous devez retourner une List<AnvilGUI.ResponseAction>
, qui pourrait inclure:
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
)AnvilGUI.ResponseAction.openInventory(Inventory)
)AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)La liste des actions est exécutée dans l'ordre où elles sont fournies.
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)
Prend un ClickHandler
, un raccourci pour BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
, qui se comporte exactement comme onClick()
avec la différence qu'il renvoie un CompletableFuture
et permet donc de calculer Asynchronous de la 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()
Tells the AnvilGUI to disable the mechanism that is put into place to prevent concurrent execution of the click handler set by onClickAsync(ClickHandler)
.
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
Cela permet ou refuse aux utilisateurs de prendre / saisir des éléments dans les emplacements Anvil qui sont fournis. Cette fonctionnalité est utile lorsque vous essayez de créer un système d'entrée à l'aide d'une interface graphique d'enclume.
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Indique à l'Anvilgui d'empêcher l'utilisateur d'appuyer sur Escape pour fermer l'inventaire. Utile pour des situations comme la saisie de mot de passe à jouer.
builder . preventClose ();
geyserCompat()
Cela fait basculer la compatibilité avec le logiciel Geyser, en mesure d'utiliser Anvilgui avec un niveau d'expérience sur le substratum rocheux. Activé par défaut.
builder . geyserCompat ();
text(String)
Prend une String
qui contient ce que le texte initial du champ de changement de nom doit être défini. Si itemLeft
est fourni, le nom d'affichage est défini sur le texte fourni. Si aucun itemLeft
n'est défini, un morceau de papier sera utilisé.
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
Prend un ItemStack
personnalisé à placer dans la fente d'entrée de gauche.
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)
Prend un ItemStack
personnalisé à placer dans la fente d'entrée droite.
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)
Prend une String
qui sera utilisée littéralement comme titre d'inventaire. Affiché uniquement dans Minecraft 1.14 et plus.
builder . title ( "Enter your answer" );
jsonTitle(String)
Prend une String
qui contient des composants de texte riches sérialisés en JSON. Utile pour les titres de paramètres avec des codes couleur hexadécimaux ou des composants d'aventure interopérants. Affiché uniquement dans Minecraft 1.14 et plus.
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
Prend l'objet Plugin
qui fait cette interface graphique d'enclume. Il est nécessaire d'enregistrer les auditeurs.
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
Prend un Executor
qui doit s'exécuter sur le thread principal du serveur. Si le thread principal du serveur n'est pas accessible via le planificateur Bukkit, comme sur les serveurs Folia, il peut être échangé contre un exécuteur de Folia.
builder . mainThreadExecutor ( executor );
open(Player)
Prend un Player
pour lequel l'interface graphique d'enclume doit être ouverte. Cette méthode peut être appelée plusieurs fois sans avoir besoin de créer un nouvel objet 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
Nous utilisons Maven pour gérer nos dépendances. Exécutez mvn clean install
en utilisant Java 21 pour construire le projet.
Le projet utilise le plugin Maven impeccable pour appliquer les directives de style. Vous ne pourrez pas créer le projet si votre code ne répond pas aux directives. Pour résoudre tous les problèmes de formatage de code, exécutez simplement mvn spotless:apply
.
Ce projet est autorisé sous la licence du MIT.