Anvilgui ist eine Bibliothek, in der die Benutzereingaben in Minecraft über ein Ambosseninventar erfasst werden. Anvil -Inventare im Bereich der Minecraft / Bukkit / Spigot / Paper -API sind extrem finnisch und unterstützen letztendlich nicht die Möglichkeit, sie vollständig für die Aufgabe der Benutzereingabe zu verwenden. Infolgedessen erfordert die einzige Möglichkeit, Benutzereingaben mit einem Ambosseninventar zu erreichen, eine Interaktion mit verschleierten, dekompilierten Code. Anvilgui bietet eine unkomplizierte, vielseitige und benutzerfreundliche Lösung, ohne dass Ihr Projekt vom Versionspflicht abhängt.
Sie müssen Spigot -Mappings verwenden, damit Anvilgui funktioniert, aber wie können Sie sicher sein, dass Sie es sind? Die folgenden Fragen helfen Ihnen dabei, die Dinge zu klären.
Ist Ihr Plugin ein Bukkit -Plugin? Ihr Plugin ist ein Bukkit-Plugin, wenn es eine plugin.yml
Datei enthält und keine paper-plugin.yml
Datei enthält. In diesem Fall verwenden Sie standardmäßig Spigot -Zuordnungen.
Ist Ihr Plugin ein Papier -Plugin? Ihr Plugin ist immer ein Papier-Plugin, wenn es eine paper-plugin.yml
Datei enthält, auch wenn es auch eine plugin.yml
Datei enthält. In diesem Fall verwenden Sie standardmäßig keine Spigot -Zuordnungen, sondern können sie über einen offensichtlichen Eintrag gemäß diesen Anweisungen aktivieren.
Verwenden Sie die Paperweight UserDev Toolchain? In diesem Fall verwenden Sie standardmäßig keine Spigot -Zuordnungen, sondern können sie mithilfe der Option ReobFartifactConfiguration aktivieren.
Wenn Sie Entwickler sind, senden Sie eine Pull -Anfrage, um ein Wrapper -Modul für Ihre Version hinzuzufügen. Andernfalls erstellen Sie bitte ein Problem auf der Registerkarte "Problemen".
Anvilgui erfordert die Verwendung von Maven oder einem Maven -kompatiblen Build -System.
< 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 >
Es ist am besten, ein guter Bürger zu sein und die Abhängigkeit in Ihren Namespace zu verlegen, um Konflikte mit anderen Plugins zu verhindern. Hier ist ein Beispiel dafür, wie die Abhängigkeit verlegt wird:
< 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 >
HINWEIS: Um VerionWrapper
<minimizeJar>
aus dem endgültigen Glas zu entfernen und die Bibliothek unbrauchbar zu machen, stellen Sie sicher, dass Ihr Abschnitt <filters>
das Beispiel <filter>
enthält, wie oben angezeigt.
In der AnvilGUI.Builder
-Klasse bauen Sie einen Anvilgui. Mit den folgenden Methoden können Sie verschiedene Teile der angezeigten GUI ändern. Javadocs sind hier erhältlich.
onClose(Consumer<StateSnapshot>)
Nimmt ein Consumer<StateSnapshot>
-Argument, das aufgerufen wird, wenn ein Spieler die GUI anvilen.
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
Nimmt eine BiFunction
mit dem Klick und einer Momentaufnahme des aktuellen GUI -Zustands ein. Die Funktion wird aufgerufen, wenn ein Spieler auf alle Slots im Inventar klickt. Sie müssen eine List<AnvilGUI.ResponseAction>
zurückgeben, die daraus enthalten ist:
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
des InventarAnvilGUI.ResponseAction.openInventory(Inventory)
)AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)Die Liste der Aktionen wird in der Reihenfolge ausgeführt, die sie geliefert werden.
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)
Nimmt einen ClickHandler
, eine Kurzform für BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
, das sich genau wie onClick()
mit der Differenz, dass es eine CompletableFuture
zurückgibt und daher eine asynchrone Berechnung der Reaktion der Reaktion der Reaktion der Reaktion der Reaktion der Reaktion der Reaktion ResponseAction
ermöglicht.
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()
Teilt dem Anvilgui an, den Mechanismus zu deaktivieren, der eingerichtet wird, um die gleichzeitige Ausführung des von onClickAsync(ClickHandler)
festgelegten Klickhandlers zu verhindern.
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
Dadurch können Benutzer Elemente in die bereitgestellten Ambemediteln aufnehmen / eingeben. Diese Funktion ist nützlich, wenn Sie versuchen, ein Eingabesystem mit einer Anvil -GUI zu erstellen.
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Teilt dem Anvilgui an, den Benutzer daran zu hindern, die Flucht zu drücken, um das Inventar zu schließen. Nützlich für Situationen wie die Kennworteingabe zum Spielen.
builder . preventClose ();
geyserCompat()
Diese Kompatibilität mit Geyser -Software umschaltet die Kompatibilität und kann speziell in der Lage sein, Anvilgui mit 0 Erfahrung im Grundgestein zu verwenden. Standardmäßig aktiviert.
builder . geyserCompat ();
text(String)
Nimmt eine String
, die enthält, auf was der Anfangstext im Feld Renaming -Feld eingestellt werden soll. Wenn itemLeft
bereitgestellt wird, wird der Anzeigename auf den angegebenen Text festgelegt. Wenn kein itemLeft
festgelegt ist, wird ein Stück Papier verwendet.
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
Nimmt einen benutzerdefinierten ItemStack
in den linken Eingangssteck.
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)
Nimmt einen benutzerdefinierten ItemStack
in den richtigen Eingangssteck.
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)
Nimmt eine String
, die buchstäblich als Inventartitel verwendet wird. Nur in Minecraft 1.14 und höher angezeigt.
builder . title ( "Enter your answer" );
jsonTitle(String)
Nimmt eine String
, die reichhaltige Textkomponenten enthält, die als JSON serialisiert wurden. Nützlich für Einstellungs Titel mit Hex -Farbcodes oder Abenteuerkomponenteninterop. Nur in Minecraft 1.14 und höher angezeigt.
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
Nimmt das Plugin
-Objekt, das diese Ambossen -GUI macht. Es ist erforderlich, um Zuhörer zu registrieren.
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
Nimmt einen Executor
, der im Hauptserver -Thread ausgeführt wird. Wenn der Hauptserver -Thread nicht über den Bukkit -Scheduler zugänglich ist, wie auf Folia -Servern, kann er gegen einen Folien -Executor ausgetauscht werden.
builder . mainThreadExecutor ( executor );
open(Player)
Nimmt einen Player
, für den die GUI der Anvil geöffnet werden sollte. Diese Methode kann mehrmals aufgerufen werden, ohne ein neues AnvilGUI.Builder
-Objekt zu erstellen.
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
Wir verwenden Maven, um unsere Abhängigkeiten zu bewältigen. Führen Sie mvn clean install
mit Java 21 aus, um das Projekt zu erstellen.
Das Projekt nutzt das makellose Maven -Plugin, um Stilrichtlinien durchzusetzen. Sie können das Projekt nicht erstellen, wenn Ihr Code nicht den Richtlinien entspricht. Um alle Probleme mit der Codeformatierung zu beheben, führen Sie einfach mvn spotless:apply
.
Dieses Projekt ist unter der MIT -Lizenz lizenziert.