package net.minecraft.command; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChunkCoordinates; import net.minecraft.util.MathHelper; import net.minecraft.world.EnumGameType; public class PlayerSelector { /** * This matches the at-tokens introduced for command blocks, including their arguments, if any. */ private static final Pattern tokenPattern = Pattern.compile("^@([parf])(?:\\[([\\w=,-]*)\\])?$"); /** * This matches things like "-1,,4", and is used for getting x,y,z,range from the token's argument list. */ private static final Pattern intListPattern = Pattern.compile("\\G(-?\\w*)(?:$|,)"); /** * This matches things like "rm=4,c=2" and is used for handling named token arguments. */ private static final Pattern keyValueListPattern = Pattern.compile("\\G(\\w{1,2})=(-?\\w+)(?:$|,)"); /** * Returns the one player that matches the given at-token. Returns null if more than one player matches. */ public static EntityPlayerMP matchOnePlayer(ICommandSender par0ICommandSender, String par1Str) { EntityPlayerMP[] var2 = matchPlayers(par0ICommandSender, par1Str); return var2 != null && var2.length == 1 ? var2[0] : null; } /** * Returns a nicely-formatted string listing the matching players. */ public static String matchPlayersAsString(ICommandSender par0ICommandSender, String par1Str) { EntityPlayerMP[] var2 = matchPlayers(par0ICommandSender, par1Str); if (var2 != null && var2.length != 0) { String[] var3 = new String[var2.length]; for (int var4 = 0; var4 < var3.length; ++var4) { var3[var4] = var2[var4].getEntityName(); } return CommandBase.joinNiceString(var3); } else { return null; } } /** * Returns an array of all players matched by the given at-token. */ public static EntityPlayerMP[] matchPlayers(ICommandSender par0ICommandSender, String par1Str) { Matcher var2 = tokenPattern.matcher(par1Str); if (var2.matches()) { Map var3 = getArgumentMap(var2.group(2)); String var4 = var2.group(1); int var5 = getDefaultMinimumRange(var4); int var6 = getDefaultMaximumRange(var4); int var7 = getDefaultMinimumLevel(var4); int var8 = getDefaultMaximumLevel(var4); int var9 = getDefaultCount(var4); int var10 = EnumGameType.NOT_SET.getID(); ChunkCoordinates var11 = par0ICommandSender.getPlayerCoordinates(); if (var3.containsKey("rm")) { var5 = MathHelper.parseIntWithDefault((String)var3.get("rm"), var5); } if (var3.containsKey("r")) { var6 = MathHelper.parseIntWithDefault((String)var3.get("r"), var6); } if (var3.containsKey("lm")) { var7 = MathHelper.parseIntWithDefault((String)var3.get("lm"), var7); } if (var3.containsKey("l")) { var8 = MathHelper.parseIntWithDefault((String)var3.get("l"), var8); } if (var3.containsKey("x")) { var11.posX = MathHelper.parseIntWithDefault((String)var3.get("x"), var11.posX); } if (var3.containsKey("y")) { var11.posY = MathHelper.parseIntWithDefault((String)var3.get("y"), var11.posY); } if (var3.containsKey("z")) { var11.posZ = MathHelper.parseIntWithDefault((String)var3.get("z"), var11.posZ); } if (var3.containsKey("m")) { var10 = MathHelper.parseIntWithDefault((String)var3.get("m"), var10); } if (var3.containsKey("c")) { var9 = MathHelper.parseIntWithDefault((String)var3.get("c"), var9); } List var12; if (!var4.equals("p") && !var4.equals("a")) { if (!var4.equals("r")) { return null; } else { var12 = MinecraftServer.getServer().getConfigurationManager().findPlayers(var11, var5, var6, 0, var10, var7, var8); Collections.shuffle(var12); var12 = var12.subList(0, Math.min(var9, var12.size())); return var12 != null && !var12.isEmpty() ? (EntityPlayerMP[])var12.toArray(new EntityPlayerMP[0]) : new EntityPlayerMP[0]; } } else { var12 = MinecraftServer.getServer().getConfigurationManager().findPlayers(var11, var5, var6, var9, var10, var7, var8); return var12 != null && !var12.isEmpty() ? (EntityPlayerMP[])var12.toArray(new EntityPlayerMP[0]) : new EntityPlayerMP[0]; } } else { return null; } } /** * Returns whether the given pattern can match more than one player. */ public static boolean matchesMultiplePlayers(String par0Str) { Matcher var1 = tokenPattern.matcher(par0Str); if (var1.matches()) { Map var2 = getArgumentMap(var1.group(2)); String var3 = var1.group(1); int var4 = getDefaultCount(var3); if (var2.containsKey("c")) { var4 = MathHelper.parseIntWithDefault((String)var2.get("c"), var4); } return var4 != 1; } else { return false; } } /** * Returns whether the given token (parameter 1) has exactly the given arguments (parameter 2). */ public static boolean hasTheseArguments(String par0Str, String par1Str) { Matcher var2 = tokenPattern.matcher(par0Str); if (!var2.matches()) { return false; } else { String var3 = var2.group(1); return par1Str == null || par1Str.equals(var3); } } /** * Returns whether the given token has any arguments set. */ public static boolean hasArguments(String par0Str) { return hasTheseArguments(par0Str, (String)null); } /** * Gets the default minimum range (argument rm). */ private static final int getDefaultMinimumRange(String par0Str) { return 0; } /** * Gets the default maximum range (argument r). */ private static final int getDefaultMaximumRange(String par0Str) { return 0; } /** * Gets the default maximum experience level (argument l) */ private static final int getDefaultMaximumLevel(String par0Str) { return Integer.MAX_VALUE; } /** * Gets the default minimum experience level (argument lm) */ private static final int getDefaultMinimumLevel(String par0Str) { return 0; } /** * Gets the default number of players to return (argument c, 0 for infinite) */ private static final int getDefaultCount(String par0Str) { return par0Str.equals("a") ? 0 : 1; } /** * Parses the given argument string, turning it into a HashMap<String, String> of name->value. */ private static Map getArgumentMap(String par0Str) { HashMap var1 = new HashMap(); if (par0Str == null) { return var1; } else { Matcher var2 = intListPattern.matcher(par0Str); int var3 = 0; int var4; for (var4 = -1; var2.find(); var4 = var2.end()) { String var5 = null; switch (var3++) { case 0: var5 = "x"; break; case 1: var5 = "y"; break; case 2: var5 = "z"; break; case 3: var5 = "r"; } if (var5 != null && var2.group(1).length() > 0) { var1.put(var5, var2.group(1)); } } if (var4 < par0Str.length()) { var2 = keyValueListPattern.matcher(var4 == -1 ? par0Str : par0Str.substring(var4)); while (var2.find()) { var1.put(var2.group(1), var2.group(2)); } } return var1; } } }