package jas.spawner.modern.command;
import jas.common.global.BiomeBlacklist;
import jas.spawner.modern.command.mods.CommandModBiomeGroup;
import jas.spawner.modern.command.mods.CommandModBiomeSpawnList;
import jas.spawner.modern.command.mods.CommandModCreatureType;
import jas.spawner.modern.command.mods.CommandModLivingHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.minecraft.command.CommandBase;
import net.minecraft.command.ICommand;
import net.minecraft.command.ICommandSender;
import net.minecraft.command.WrongUsageException;
public final class CommandJAS extends CommandJasBase {
private HashMap<String, CommandWrapper> commands = new HashMap<String, CommandWrapper>();
public CommandJAS(BiomeBlacklist biomeBlacklist) {
addCommand(new CommandCountCap());
addCommand(new CommandListSpawns());
addCommand(new CommandCanSpawnHere());
addCommand(new CommandComposition());
addCommand(new CommandKillAll());
addCommand(new CommandLocate());
addCommand(new CommandPackageEntity());
addCommand(new CommandSaveConfig());
addCommand(new CommandLoadConfig());
addCommand(new CommandCanDespawnHere());
addCommand(new CommandModBiomeGroup());
addCommand(new CommandModCreatureType());
addCommand(new CommandModLivingHandler());
addCommand(new CommandModBiomeSpawnList());
addCommand(new CommandEffectiveSpawnList(biomeBlacklist));
addCommand(new CommandDimension());
addCommand(new CommandEntityStats());
}
public void addCommand(CommandBase base) {
if (base == null || base.getCommandName() == null || commands.containsKey(base.getCommandName())) {
throw new IllegalArgumentException("Commands cannot be null");
}
commands.put(base.getCommandName(), new CommandWrapper(base));
}
private static class CommandWrapper {
public final ICommand command;
public CommandWrapper(ICommand command) {
if (command == null || command.getCommandName() == null) {
throw new IllegalArgumentException("Commands cannot be null");
}
this.command = command;
}
@Override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != getClass()) {
return false;
}
CommandWrapper other = (CommandWrapper) obj;
return command.getCommandName().equals(other.command.getCommandName());
}
@Override
public int hashCode() {
final int prime = 31;
return prime * 1 + command.getCommandName().hashCode();
}
}
@Override
public String getCommandName() {
return "jas";
}
@Override
public String getCommandUsage(ICommandSender icommandsender) {
return "commands.jas.usage";
}
@Override
public void process(ICommandSender commandSender, String[] stringArgs) {
if (stringArgs.length == 0) {
throw new WrongUsageException("commands.jas.usage", new Object[0]);
}
CommandWrapper command = commands.get(stringArgs[0]);
if (command == null) {
throw new WrongUsageException("commands.jas.unknowncommand", new Object[0]);
}
command.command.processCommand(commandSender, truncateArgs(stringArgs));
}
@Override
@SuppressWarnings("unchecked")
public List<String> getTabCompletions(ICommandSender commandSender, String[] stringArgs) {
if (stringArgs.length == 1) {
return getStringsMatchingLastWord(stringArgs, new ArrayList<String>(commands.keySet()));
} else if (stringArgs.length > 1) {
CommandWrapper command = commands.get(stringArgs[0]);
if (command != null) {
return command.command.addTabCompletionOptions(commandSender, truncateArgs(stringArgs));
}
}
return null;
}
/*
* Used to remove the command name and give child commands only their respective arguments
*
* i.e. User types /jas killall MONSTER, CommandJAS gets {killall MONSTER}, CommandKillAll gets {MONSTER}
*/
private String[] truncateArgs(String[] stringArgs) {
String[] args = new String[stringArgs.length - 1];
for (int i = 0; i < args.length; i++) {
args[i] = stringArgs[i + 1];
}
return args;
}
}