Ir para conteúdo

Registrar e Desregistrar qualquer comando automaticamente.


RUSHyoutuber

Posts Recomendados

Olá pessoal da Gamer'sBoard! 

Ontem dei uma pausa no desenvolvimento do meu aplicativo e decidi aprender a fazer uma coisa que eu queria ter aprendido a bastante tempo que é como desregistrar comandos.

Depois de dar uma procura não achei muita coisa util então resolvi ir aprendendo por conta mesmo. 

Registrar comandos automaticamente é realmente facil porem, desregistrar comandos não é tão facil assim, mas chega de enrolação e vamos para os códigos!

 

REGISTRAR COMANDOS AUTOMATICAMENTE

(Existe vários métodos diferentes para registrar comandos automaticamente, vou mostrar o que eu uso)

(Lembrando que você pode setar as aliase, setar a mensagem de erro, a label, a permissão etc normalmente, basta usar cmd.setAliases...)

    // Método para criar o PluginCommand
	private void createPluginCommand() {
        try 
        {
            Constructor<PluginCommand> c = PluginCommand.class.getDeclaredConstructor(String.class, Plugin.class);
            c.setAccessible(true);
            
            PluginCommand cmd = c.newInstance("sethome", Main.get()); // "comando", instancia da Main
            cmd.setExecutor(new SetHomeCommand()); // Instancia da classe do comando
            
            registerPluginCommand(cmd);
            
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }
    
	// Método para registrar o comando na commandMap
    private void registerPluginCommand(PluginCommand pluginCommand) {
        try 
        {
            Field commandMapField = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
            commandMapField.setAccessible(true);
            CommandMap commandMap = (CommandMap) commandMapField.get(Bukkit.getPluginManager());
            commandMap.register(Main.get().getName().toLowerCase(), pluginCommand);
        } catch (Throwable e) {
            e.printStackTrace();
        }
    }

 

 Agora para nós desregistrarmos um comando é talvez um pouco mais complexo.

Basicamente existe uma HashMap<String,Command> onde nós temos a String que é o comando /sethome ou /system:sethome e nós temos um objeto do tipo Command que contem todas as outras informações. Vale lembrar que essa String pode ser uma aliases do comando original, por exemplo, o comando /pl é uma aliases do comando /plugin.

Então basicamente a gente tem que acessar essa HashMap<String,Command) e remover os comandos dela.

 

Desta maneira estamos deletando o comando /sethome e /system:sethome

	public static void deleteCommand() {
		try {
			Field commandMapField = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
			Field commandsField = SimpleCommandMap.class.getDeclaredField("knownCommands");
			commandMapField.setAccessible(true);
			commandsField.setAccessible(true);

			CommandMap commandMap = (CommandMap) commandMapField.get(Bukkit.getPluginManager());
			Map<String, Command> commands = (Map<String, Command>) commandsField.get(commandMap);
			
			commands.remove("system:sethome");
			commands.remove("sethome");

		} catch (Throwable e) {
			e.printStackTrace();
		}

	}

 

Caso nos quisermos remover o comando completamente, remove também as suas aliases nós devemos fazer um loop pela lista de comandos e verificar o command.getName();

Desta maneira nós removeríamos todos os comandos e todas as aliases do comando /sethome

		try {
			Field commandMapField = Bukkit.getPluginManager().getClass().getDeclaredField("commandMap");
			Field commandsField = SimpleCommandMap.class.getDeclaredField("knownCommands");
			commandMapField.setAccessible(true);
			commandsField.setAccessible(true);

			CommandMap commandMap = (CommandMap) commandMapField.get(Bukkit.getPluginManager());
			Map<String, Command> commands = (Map<String, Command>) commandsField.get(commandMap);
			Set<Entry<String, Command>> removes = new HashSet<>();

			for (Entry<String, Command> entry : removes) {
				if (entry.getValue().getName().equals("sethome"))
					removes.add(entry);
			}

			for (Entry<String, Command> entry : removes) {
				commands.remove(entry.getKey(), entry.getValue());
			}

		} catch (Throwable e) {
			e.printStackTrace();
		}

 

 

Estes códigos funcionam em qualquer versão do bukkit ><

Abraços RUSH ❤️

Pra quem quiser ver esses códigos rodando só olhar a Source do System!

https://github.com/RUSHyoutuber/System

Link para o comentário
Compartilhar em outros sites

Em 07/01/2019 em 17:41,   ???   disse:

Rapaz, acho que nâo precisava de tudo isso ai nâo ein, da pra fazer de maneira muuuito mais simples, mas mesmo assim, bom tutorial irmâo, parabéns.

Se existe uma maneira mais simples eu exijo que você compartilhe esse conhecimento >< 

como eu citei no tópico eu pesquisei e não achei muito conteudo então resolvi desenvolver eu mesmo

a questão de registrar comandos existem algumas outras maneiras mais faceis e diferentes de se fazer mas essa é a que eu aprendi, a parada de desregistrar os comandos eu creio que não tem outra maneira de se fazer mas como eu falei, se você sabe formas melhores de se fazer comenta ai ><

Link para o comentário
Compartilhar em outros sites

17 horas atrás, Koreano disse:

Realmente você é uma pessoa diferenciada @RUSHyoutuber ?, além de você deixar os seus projetos open source, você ainda vem ensinar nos sobre mais coisas.

Parabéns ?, o tutorial e tópico estão ótimos.

Obrigado pelos elogios e pelo feedback! Grato!

Link para o comentário
Compartilhar em outros sites

Em 07/01/2019 em 17:41,   ???   disse:

Rapaz, acho que nâo precisava de tudo isso ai nâo ein, da pra fazer de maneira muuuito mais simples, mas mesmo assim, bom tutorial irmâo, parabéns.

To esperando. Lê minha resposta.

 

Em 09/01/2019 em 01:57, RUSHyoutuber disse:

Se existe uma maneira mais simples eu exijo que você compartilhe esse conhecimento >< 

como eu citei no tópico eu pesquisei e não achei muito conteudo então resolvi desenvolver eu mesmo

a questão de registrar comandos existem algumas outras maneiras mais faceis e diferentes de se fazer mas essa é a que eu aprendi, a parada de desregistrar os comandos eu creio que não tem outra maneira de se fazer mas como eu falei, se você sabe formas melhores de se fazer comenta ai ><

 

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, a class='ipsType_brandedLink' href='https://gamersboard.com.br/login/' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='Sign In Now'>acesse agora para postar com sua conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

Processando...
×
×
  • Criar Novo...