Newer
Older
ultramine_bukkit / src / main / java / org / ultramine / mods / bukkit / UMCommandMap.java
@vlad20012 vlad20012 on 24 Feb 2017 4 KB initial
package org.ultramine.mods.bukkit;

import net.minecraft.command.CommandHandler;
import net.minecraft.command.ICommandSender;
import net.minecraft.server.MinecraftServer;
import org.bukkit.Server;
import org.bukkit.command.Command;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandSender;
import org.bukkit.command.SimpleCommandMap;
import org.ultramine.commands.IExtendedCommand;
import org.ultramine.mods.bukkit.util.BukkitUtil;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class UMCommandMap extends SimpleCommandMap
{
	private final Set<Command> registeredBukkitCommands = new HashSet<Command>();

	public UMCommandMap(Server server)
	{
		super(server);
	}

	@Override
	public void registerAll(String fallbackPrefix, List<Command> commands)
	{
		if(commands != null)
		{
			for(Command c : commands)
			{
				register(fallbackPrefix, c);
			}
		}
	}

	@Override
	public boolean register(String fallbackPrefix, Command command)
	{
		return register(command.getName(), fallbackPrefix, command);
	}

	@Override
	public boolean register(String label, String fallbackPrefix, Command command)
	{
		label = label.toLowerCase().trim();
		fallbackPrefix = fallbackPrefix.toLowerCase().trim();
		registeredBukkitCommands.add(command);
		command.getAliases().remove(label);
		BukkitCommand cmd = new BukkitCommand(fallbackPrefix, label, command);
		((CommandHandler) MinecraftServer.getServer().getCommandManager()).getRegistry().registerCommand(cmd);
		return true;
	}

	@Override
	public boolean dispatch(CommandSender sender, String cmdLine) throws CommandException
	{
		return MinecraftServer.getServer().getCommandManager().executeCommand(BukkitUtil.toVanillaCommandSender(sender), cmdLine) != 0;
	}

	@Override
	public void clearCommands()
	{
		throw new UnsupportedOperationException();
	}

	@Override
	public Command getCommand(String name)
	{
		IExtendedCommand cmd = ((CommandHandler) MinecraftServer.getServer().getCommandManager()).getRegistry().get(name);
		return cmd == null || !(cmd instanceof BukkitCommand) ? null : ((BukkitCommand) cmd).getBukkitCommand();
	}

	@Override
	@SuppressWarnings("unchecked")
	public List<String> tabComplete(CommandSender sender, String cmdLine) throws IllegalArgumentException
	{
		return MinecraftServer.getServer().getPossibleCompletions(BukkitUtil.toVanillaCommandSender(sender), cmdLine);
	}

	@Override
	public void setFallbackCommands()
	{
		// TODO
	}

	protected void setDefaultCommands()
	{
		// TODO
	}

	@Override
	public Collection<Command> getCommands()
	{
		return registeredBukkitCommands;
	}

	@Override
	public void registerServerAliases()
	{
		// TODO
	}

	private static class BukkitCommand implements IExtendedCommand
	{
		private final String group;
		private final String name;
		private final Command bukkitCommand;

		private BukkitCommand(String group, String name, Command bukkitCommand)
		{
			this.group = group;
			this.name = name;
			this.bukkitCommand = bukkitCommand;
		}

		public Command getBukkitCommand()
		{
			return bukkitCommand;
		}

		@Override
		public String getCommandName()
		{
			return name;
		}

		@Override
		public String getCommandUsage(ICommandSender sender)
		{
			return bukkitCommand.getUsage() == null ? null : bukkitCommand.getUsage().replace("<command>", bukkitCommand.getLabel()).trim();
		}

		@Override
		public List getCommandAliases()
		{
			return bukkitCommand.getAliases();
		}

		@Override
		public void processCommand(ICommandSender sender, String[] args)
		{
			bukkitCommand.execute(BukkitUtil.toBukkitCommandSender(sender), bukkitCommand.getLabel(), args);
		}

		@Override
		public boolean canCommandSenderUseCommand(ICommandSender sender)
		{
			return bukkitCommand.testPermissionSilent(BukkitUtil.toBukkitCommandSender(sender));
		}

		@Override
		public List addTabCompletionOptions(ICommandSender sender, String[] args)
		{
			return bukkitCommand.tabComplete(BukkitUtil.toBukkitCommandSender(sender), bukkitCommand.getLabel(), args);
		}

		@Override
		public boolean isUsernameIndex(String[] p_82358_1_, int p_82358_2_)
		{
			return false;
		}

		@Override
		public int compareTo(Object o)
		{
			if (o instanceof IExtendedCommand)
			{
				int result = getGroup().compareTo(((IExtendedCommand) o).getGroup());
				if (result == 0)
					result = getCommandName().compareTo(((IExtendedCommand) o).getCommandName());

				return result;
			}
			return -1;
		}

		@Override
		public String getDescription()
		{
			return bukkitCommand.getDescription();
		}

		@Override
		public String getGroup()
		{
			return group;
		}
	}
}