package jas.spawner.modern.command; import jas.spawner.modern.MVELProfile; import jas.spawner.modern.spawner.creature.type.CreatureType; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.command.CommandBase; import net.minecraft.command.ICommandSender; import net.minecraft.server.MinecraftServer; public abstract class CommandJasBase extends CommandBase { @Override public final void processCommand(ICommandSender commandSender, String[] stringArgs) { process(commandSender, correctedParseArgs(stringArgs, true)); } public abstract void process(ICommandSender commandSender, String[] stringArgs); @Override @SuppressWarnings("rawtypes") public final List addTabCompletionOptions(ICommandSender commandSender, String[] stringArgs) { return getTabCompletions(commandSender, correctedParseArgs(stringArgs, false)); } public abstract List<String> getTabCompletions(ICommandSender commandSender, String[] stringArgs); protected String[] correctedParseArgs(String[] stringArgs, boolean removeQuotations) { ArrayList<String> endArgs = new ArrayList<String>(); String intermediate = ""; for (int i = 0; i < stringArgs.length; i++) { String arg = stringArgs[i]; if (arg.startsWith("\"")) { intermediate = intermediate.concat(arg.substring(removeQuotations ? 1 : 0)); } else if (arg.endsWith("\"")) { intermediate = intermediate.concat(" ").concat( arg.substring(0, removeQuotations ? arg.length() - 1 : arg.length())); endArgs.add(intermediate); intermediate = ""; } else if (!intermediate.equals("")) { intermediate = intermediate.concat(" ").concat(arg); } else { endArgs.add(arg); } } if (!intermediate.equals("")) { endArgs.add(intermediate); } return endArgs.toArray(new String[endArgs.size()]); } protected List<String> getStringsMatchingLastWord(String[] stringArgs, List<String> tabCompletions) { String lastArg = stringArgs[stringArgs.length - 1]; ArrayList<String> arraylist = new ArrayList<String>(); for (int j = 0; j < tabCompletions.size(); ++j) { String tabComplete = tabCompletions.get(j); if (doesStartWith(lastArg, tabComplete)) { tabComplete = tabComplete.replaceFirst(determineRemovalString(stringArgs), ""); arraylist.add(tabComplete); } } return arraylist; } /** * String that must be removed from tabCompletion. Used to remove first characters from words that span multiple * arguments such as "TwilightForest.Hedge Spider" is actually []{"TwilightForest.Hedge,Spider"} */ protected String determineRemovalString(String[] stringArgs) { String lastArg = stringArgs[stringArgs.length - 1]; String[] spaceDelArgs; if (lastArg.endsWith(" ")) { String[] segments = lastArg.split(" "); spaceDelArgs = new String[segments.length + 1]; for (int i = 0; i < spaceDelArgs.length - 1; i++) { spaceDelArgs[i] = segments[i]; } spaceDelArgs[spaceDelArgs.length - 1] = ""; } else { spaceDelArgs = lastArg.split(" "); } String removalString = ""; for (int i = 0; i < spaceDelArgs.length - 1; i++) { removalString = removalString.concat(spaceDelArgs[i]).concat(" "); } return removalString; } /** * Returns true if the given substring is exactly equal to the start of the given string (case insensitive). */ protected boolean doesStartWith(String wordFragment, String completeWord) { int fragmentOffset = wordFragment.startsWith("\"") ? 1 : 0; int completeOffset = completeWord.startsWith("\"") ? 1 : 0; return completeWord.regionMatches(true, completeOffset, wordFragment, fragmentOffset, wordFragment.length() - fragmentOffset); } /** * Helper used to add Entity names to tabCompletetion list. Names with spaces are surrounded with quotation marks. */ public static void addEntityNames(List<String> tabCompletions) { for (String entityName : MVELProfile.worldSettings().livingGroupRegistry().JASNametoEntityClass.keySet()) { if (entityName.contains(" ")) { entityName = "\"".concat(entityName).concat("\""); } tabCompletions.add(entityName); } } /** * Helper used to add Entity category names to tabCompletetion list. */ public static void addEntityTypes(List<String> tabCompletions) { Iterator<CreatureType> iterator = MVELProfile.worldSettings().creatureTypeRegistry().getCreatureTypes(); while (iterator.hasNext()) { CreatureType entityType = iterator.next(); tabCompletions.add(entityType.typeID); } } /** * Helper used to add logged in player usernames to tabCompletetion list. */ public static void addPlayerUsernames(List<String> tabCompletions) { for (String username : MinecraftServer.getServer().getAllUsernames()) { tabCompletions.add(username); } } }