O ANVILGUI é uma biblioteca para capturar a entrada do usuário no Minecraft através de um inventário de bigornas. Os inventários de AnVIL dentro do reino da API Minecraft / Bukkit / Spigot / Paper são extremamente finnicky e, finalmente, não suportam a capacidade de usá -los totalmente para a tarefa de entrada do usuário. Como resultado, a única maneira de alcançar a entrada do usuário com um inventário de bigornas requer interação com o código ofuscado e descompilado. O ANVILGUI fornece uma solução direta, versátil e fácil de usar sem que seu projeto dependa do código específico da versão.
Você precisa estar usando mapeamentos de Spigot para que o Anvilgui funcione, mas como você pode ter certeza de que está? As perguntas abaixo ajudarão você a limpar as coisas.
O seu plugin é um plug -in Bukkit? Seu plug-in é um plug-in Bukkit se ele contiver um arquivo plugin.yml
e não contém um arquivo paper-plugin.yml
. Nesse caso, por padrão, você está usando mapeamentos de Spigot.
O seu plug -in é um plugin de papel? Seu plug-in é sempre um plug-in de papel se contiver um arquivo paper-plugin.yml
, mesmo que também contenha um arquivo plugin.yml
. Nesse caso, por padrão, você não está usando mapeamentos de Spigot, mas pode ativá -los por meio de uma entrada de manifesto de acordo com estas instruções.
Você está usando a cadeia de ferramentas do usuário do usuário? Nesse caso, por padrão, você não está usando mapeamentos de Spigot, mas pode ativá -los usando a opção ReobFartifactConfiguration.
Se você é um desenvolvedor, envie uma solicitação de tração adicionando um módulo de wrapper para sua versão. Caso contrário, crie um problema na guia Problemas.
O ANVILGUI requer o uso do Maven ou um sistema de construção compatível com o 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 >
É melhor ser um bom cidadão e realocar a dependência do seu espaço para nome para evitar conflitos com outros plugins. Aqui está um exemplo de como realocar a dependência:
< 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 >
NOTA: Para resolver <minimizeJar>
remover o Anvilgui VerionWrapper
S do frasco final e tornar a biblioteca inutilizável, verifique se a seção <filters>
contém o exemplo <filter>
como visto acima.
A classe AnvilGUI.Builder
é como você constrói um Anvilgui. Os métodos a seguir permitem modificar várias partes da GUI exibida. Javadocs estão disponíveis aqui.
onClose(Consumer<StateSnapshot>)
Leva um argumento Consumer<StateSnapshot>
que é chamado quando um jogador fecha a GUI da bigorna.
builder . onClose ( stateSnapshot -> {
stateSnapshot . getPlayer (). sendMessage ( "You closed the inventory." );
});
onClick(BiFunction<Integer, AnvilGUI.StateSnapshot, AnvilGUI.ResponseAction>)
Tome uma BiFunction
com o slot que foi clicado e um instantâneo do estado atual da GUI. A função é chamada quando um jogador clica em qualquer slots no inventário. Você deve devolver uma List<AnvilGUI.ResponseAction>
, que pode incluir:
AnvilGUI.ResponseAction.close()
)AnvilGUI.ResponseAction.replaceInputText(String)
)AnvilGUI.ResponseAction.updateTitle(String, boolean)
)AnvilGUI.ResponseAction.openInventory(Inventory)
)AnvilGUI.ResponseAction.run(Runnable)
)Collections.emptyList()
)A lista de ações são executadas na ordem em que são fornecidas.
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)
Pega um ClickHandler
, uma abreviação de BiFunction<Integer, AnvilGui.StateSnapshot, CompletableFuture<AnvilGUI.ResponseAction>>
, que se comporta exatamente como onClick()
com a diferença de que retorna um CompletableFuture
e permite o cálculo assíncrono da 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()
Diz ao Anvilgui para desativar o mecanismo que é implementado para evitar a execução simultânea do manipulador de cliques definido por onClickAsync(ClickHandler)
.
builder . allowConcurrentClickHandlerExecution ();
interactableSlots(int... slots)
Isso permite ou nega que os usuários recebam itens de entrada / entrada nos slots de bigorna fornecidos. Esse recurso é útil quando você tenta criar um sistema de entrada usando uma GUI de bigorna.
builder . interactableSlots ( Slot . INPUT_LEFT , Slot . INPUT_RIGHT );
preventClose()
Diz ao Anvilgui para impedir que o usuário pressione Escape para fechar o inventário. Útil para situações como a entrada de senha para reproduzir.
builder . preventClose ();
geyserCompat()
Isso alterna a compatibilidade com o software GEYSER, especificamente capaz de usar o ANVILGUI com 0 nível de experiência no Bedrock. Ativado por padrão.
builder . geyserCompat ();
text(String)
Pega uma String
que contém o que o texto inicial no campo de renomeação deve ser definido como. Se itemLeft
for fornecido, o nome da exibição será definido como o texto fornecido. Se nenhum itemLeft
estiver definido, será usado um pedaço de papel.
builder . text ( "What is the meaning of life?" );
itemLeft(ItemStack)
Leva um ItemStack
personalizado para ser colocado no slot de entrada esquerda.
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)
Pega um ItemStack
personalizado para ser colocado no slot de entrada direita.
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)
Pega uma String
que será usada literalmente como o título de inventário. Exibido apenas no Minecraft 1.14 e acima.
builder . title ( "Enter your answer" );
jsonTitle(String)
Pega uma String
que contém ricos componentes de texto serializados como json. Útil para configurações de títulos com códigos de cores hexadecimal ou interope de componentes de aventura. Exibido apenas no Minecraft 1.14 e acima.
builder . jsonTitle ( "{ " text " : " Enter your answer " , " color " : " green " }" )
plugin(Plugin)
Leva o objeto Plugin
que está fazendo esta GUI bigorna. É necessário registrar ouvintes.
builder . plugin ( pluginInstance );
mainThreadExecutor(Executor)
Leva um Executor
que deve ser executado no thread do servidor principal. Se o thread do servidor principal não estiver acessível através do Bukkit Scheduler, como nos servidores Folia, ele poderá ser trocado por um executor da Folia, consciente.
builder . mainThreadExecutor ( executor );
open(Player)
Leva um Player
para o qual a GUI da Anvil deve ser aberta. Este método pode ser chamado várias vezes sem a necessidade de criar um novo objeto 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
Usamos o MAVEN para lidar com nossas dependências. Execute mvn clean install
usando o Java 21 para construir o projeto.
O projeto utiliza o plug -in maven spotless para aplicar as diretrizes de estilo. Você não poderá construir o projeto se o seu código não atender às diretrizes. Para corrigir todos os problemas de formatação de código, basta executar mvn spotless:apply
.
Este projeto está licenciado sob a licença do MIT.