package net.minecraft.command;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.minecraft.entity.Entity;
import net.minecraft.entity.EntityList;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.scoreboard.Score;
import net.minecraft.scoreboard.ScoreObjective;
import net.minecraft.scoreboard.Scoreboard;
import net.minecraft.scoreboard.Team;
import net.minecraft.server.MinecraftServer;
import net.minecraft.util.AxisAlignedBB;
import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.WorldSettings;
public class PlayerSelector
{
/**
* This matches the at-tokens introduced for command blocks, including their arguments, if any.
*/
private static final Pattern tokenPattern = Pattern.compile("^@([pare])(?:\\[([\\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+)=([-!]?[\\w-]*)(?:$|,)");
private static final Set field_179666_d = Sets.newHashSet(new String[] {"x", "y", "z", "dx", "dy", "dz", "rm", "r"});
private static final String __OBFID = "CL_00000086";
/**
* Returns the one player that matches the given at-token. Returns null if more than one player matches.
*/
public static EntityPlayerMP matchOnePlayer(ICommandSender p_82386_0_, String p_82386_1_)
{
return (EntityPlayerMP)func_179652_a(p_82386_0_, p_82386_1_, EntityPlayerMP.class);
}
public static Entity func_179652_a(ICommandSender p_179652_0_, String p_179652_1_, Class p_179652_2_)
{
List var3 = func_179656_b(p_179652_0_, p_179652_1_, p_179652_2_);
return var3.size() == 1 ? (Entity)var3.get(0) : null;
}
public static IChatComponent func_150869_b(ICommandSender p_150869_0_, String p_150869_1_)
{
List var2 = func_179656_b(p_150869_0_, p_150869_1_, Entity.class);
if (var2.isEmpty())
{
return null;
}
else
{
ArrayList var3 = Lists.newArrayList();
Iterator var4 = var2.iterator();
while (var4.hasNext())
{
Entity var5 = (Entity)var4.next();
var3.add(var5.getDisplayName());
}
return CommandBase.join(var3);
}
}
public static List func_179656_b(ICommandSender p_179656_0_, String p_179656_1_, Class p_179656_2_)
{
Matcher var3 = tokenPattern.matcher(p_179656_1_);
if (var3.matches() && p_179656_0_.canCommandSenderUseCommand(1, "@"))
{
Map var4 = getArgumentMap(var3.group(2));
if (!func_179655_b(p_179656_0_, var4))
{
return Collections.emptyList();
}
else
{
String var5 = var3.group(1);
BlockPos var6 = func_179664_b(var4, p_179656_0_.getPosition());
List var7 = func_179654_a(p_179656_0_, var4);
ArrayList var8 = Lists.newArrayList();
Iterator var9 = var7.iterator();
while (var9.hasNext())
{
World var10 = (World)var9.next();
if (var10 != null)
{
ArrayList var11 = Lists.newArrayList();
var11.addAll(func_179663_a(var4, var5));
var11.addAll(func_179648_b(var4));
var11.addAll(func_179649_c(var4));
var11.addAll(func_179659_d(var4));
var11.addAll(func_179657_e(var4));
var11.addAll(func_179647_f(var4));
var11.addAll(func_180698_a(var4, var6));
var11.addAll(func_179662_g(var4));
var8.addAll(func_179660_a(var4, p_179656_2_, var11, var5, var10, var6));
}
}
return func_179658_a(var8, var4, p_179656_0_, p_179656_2_, var5, var6);
}
}
else
{
return Collections.emptyList();
}
}
private static List func_179654_a(ICommandSender p_179654_0_, Map p_179654_1_)
{
ArrayList var2 = Lists.newArrayList();
if (func_179665_h(p_179654_1_))
{
var2.add(p_179654_0_.getEntityWorld());
}
else
{
Collections.addAll(var2, MinecraftServer.getServer().worldServers);
}
return var2;
}
private static boolean func_179655_b(ICommandSender p_179655_0_, Map p_179655_1_)
{
String var2 = func_179651_b(p_179655_1_, "type");
var2 = var2 != null && var2.startsWith("!") ? var2.substring(1) : var2;
if (var2 != null && !EntityList.func_180125_b(var2))
{
ChatComponentTranslation var3 = new ChatComponentTranslation("commands.generic.entity.invalidType", new Object[] {var2});
var3.getChatStyle().setColor(EnumChatFormatting.RED);
p_179655_0_.addChatMessage(var3);
return false;
}
else
{
return true;
}
}
private static List func_179663_a(Map p_179663_0_, String p_179663_1_)
{
ArrayList var2 = Lists.newArrayList();
String var3 = func_179651_b(p_179663_0_, "type");
final boolean var4 = var3 != null && var3.startsWith("!");
if (var4)
{
var3 = var3.substring(1);
}
boolean var6 = !p_179663_1_.equals("e");
boolean var7 = p_179663_1_.equals("r") && var3 != null;
if ((var3 == null || !p_179663_1_.equals("e")) && !var7)
{
if (var6)
{
var2.add(new Predicate()
{
private static final String __OBFID = "CL_00002358";
public boolean func_179624_a(Entity p_179624_1_)
{
return p_179624_1_ instanceof EntityPlayer;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179624_a((Entity)p_apply_1_);
}
});
}
}
else
{
final String var3_f = var3;
var2.add(new Predicate()
{
private static final String __OBFID = "CL_00002362";
public boolean func_179613_a(Entity p_179613_1_)
{
return EntityList.func_180123_a(p_179613_1_, var3_f) != var4;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179613_a((Entity)p_apply_1_);
}
});
}
return var2;
}
private static List func_179648_b(Map p_179648_0_)
{
ArrayList var1 = Lists.newArrayList();
final int var2 = func_179653_a(p_179648_0_, "lm", -1);
final int var3 = func_179653_a(p_179648_0_, "l", -1);
if (var2 > -1 || var3 > -1)
{
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002357";
public boolean func_179625_a(Entity p_179625_1_)
{
if (!(p_179625_1_ instanceof EntityPlayerMP))
{
return false;
}
else
{
EntityPlayerMP var2x = (EntityPlayerMP)p_179625_1_;
return (var2 <= -1 || var2x.experienceLevel >= var2) && (var3 <= -1 || var2x.experienceLevel <= var3);
}
}
public boolean apply(Object p_apply_1_)
{
return this.func_179625_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_179649_c(Map p_179649_0_)
{
ArrayList var1 = Lists.newArrayList();
final int var2 = func_179653_a(p_179649_0_, "m", WorldSettings.GameType.NOT_SET.getID());
if (var2 != WorldSettings.GameType.NOT_SET.getID())
{
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002356";
public boolean func_179619_a(Entity p_179619_1_)
{
if (!(p_179619_1_ instanceof EntityPlayerMP))
{
return false;
}
else
{
EntityPlayerMP var2x = (EntityPlayerMP)p_179619_1_;
return var2x.theItemInWorldManager.getGameType().getID() == var2;
}
}
public boolean apply(Object p_apply_1_)
{
return this.func_179619_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_179659_d(Map p_179659_0_)
{
ArrayList var1 = Lists.newArrayList();
String var2 = func_179651_b(p_179659_0_, "team");
final boolean var3 = var2 != null && var2.startsWith("!");
if (var3)
{
var2 = var2.substring(1);
}
if (var2 != null)
{
final String var2_f = var2;
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002355";
public boolean func_179621_a(Entity p_179621_1_)
{
if (!(p_179621_1_ instanceof EntityLivingBase))
{
return false;
}
else
{
EntityLivingBase var2x = (EntityLivingBase)p_179621_1_;
Team var3x = var2x.getTeam();
String var4 = var3x == null ? "" : var3x.getRegisteredName();
return var4.equals(var2_f) != var3;
}
}
public boolean apply(Object p_apply_1_)
{
return this.func_179621_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_179657_e(Map p_179657_0_)
{
ArrayList var1 = Lists.newArrayList();
final Map var2 = func_96560_a(p_179657_0_);
if (var2 != null && var2.size() > 0)
{
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002354";
public boolean func_179603_a(Entity p_179603_1_)
{
Scoreboard var2x = MinecraftServer.getServer().worldServerForDimension(0).getScoreboard();
Iterator var3 = var2.entrySet().iterator();
Entry var4;
boolean var6;
int var10;
do
{
if (!var3.hasNext())
{
return true;
}
var4 = (Entry)var3.next();
String var5 = (String)var4.getKey();
var6 = false;
if (var5.endsWith("_min") && var5.length() > 4)
{
var6 = true;
var5 = var5.substring(0, var5.length() - 4);
}
ScoreObjective var7 = var2x.getObjective(var5);
if (var7 == null)
{
return false;
}
String var8 = p_179603_1_ instanceof EntityPlayerMP ? p_179603_1_.getName() : p_179603_1_.getUniqueID().toString();
if (!var2x.func_178819_b(var8, var7))
{
return false;
}
Score var9 = var2x.getValueFromObjective(var8, var7);
var10 = var9.getScorePoints();
if (var10 < ((Integer)var4.getValue()).intValue() && var6)
{
return false;
}
}
while (var10 <= ((Integer)var4.getValue()).intValue() || var6);
return false;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179603_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_179647_f(Map p_179647_0_)
{
ArrayList var1 = Lists.newArrayList();
String var2 = func_179651_b(p_179647_0_, "name");
final boolean var3 = var2 != null && var2.startsWith("!");
if (var3)
{
var2 = var2.substring(1);
}
if (var2 != null)
{
final String var2_f = var2;
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002353";
public boolean func_179600_a(Entity p_179600_1_)
{
return p_179600_1_.getName().equals(var2_f) != var3;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179600_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_180698_a(Map p_180698_0_, final BlockPos p_180698_1_)
{
ArrayList var2 = Lists.newArrayList();
final int var3 = func_179653_a(p_180698_0_, "rm", -1);
final int var4 = func_179653_a(p_180698_0_, "r", -1);
if (p_180698_1_ != null && (var3 >= 0 || var4 >= 0))
{
final int var5 = var3 * var3;
final int var6 = var4 * var4;
var2.add(new Predicate()
{
private static final String __OBFID = "CL_00002352";
public boolean func_179594_a(Entity p_179594_1_)
{
int var2 = (int)p_179594_1_.func_174831_c(p_180698_1_);
return (var3 < 0 || var2 >= var5) && (var4 < 0 || var2 <= var6);
}
public boolean apply(Object p_apply_1_)
{
return this.func_179594_a((Entity)p_apply_1_);
}
});
}
return var2;
}
private static List func_179662_g(Map p_179662_0_)
{
ArrayList var1 = Lists.newArrayList();
if (p_179662_0_.containsKey("rym") || p_179662_0_.containsKey("ry"))
{
final int var2 = func_179650_a(func_179653_a(p_179662_0_, "rym", 0));
final int var3 = func_179650_a(func_179653_a(p_179662_0_, "ry", 359));
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002351";
public boolean func_179591_a(Entity p_179591_1_)
{
int var2x = PlayerSelector.func_179650_a((int)Math.floor((double)p_179591_1_.rotationYaw));
return var2 > var3 ? var2x >= var2 || var2x <= var3 : var2x >= var2 && var2x <= var3;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179591_a((Entity)p_apply_1_);
}
});
}
if (p_179662_0_.containsKey("rxm") || p_179662_0_.containsKey("rx"))
{
final int var2 = func_179650_a(func_179653_a(p_179662_0_, "rxm", 0));
final int var3 = func_179650_a(func_179653_a(p_179662_0_, "rx", 359));
var1.add(new Predicate()
{
private static final String __OBFID = "CL_00002361";
public boolean func_179616_a(Entity p_179616_1_)
{
int var2x = PlayerSelector.func_179650_a((int)Math.floor((double)p_179616_1_.rotationPitch));
return var2 > var3 ? var2x >= var2 || var2x <= var3 : var2x >= var2 && var2x <= var3;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179616_a((Entity)p_apply_1_);
}
});
}
return var1;
}
private static List func_179660_a(Map p_179660_0_, Class p_179660_1_, List p_179660_2_, String p_179660_3_, World worldIn, BlockPos p_179660_5_)
{
ArrayList var6 = Lists.newArrayList();
String var7 = func_179651_b(p_179660_0_, "type");
var7 = var7 != null && var7.startsWith("!") ? var7.substring(1) : var7;
boolean var8 = !p_179660_3_.equals("e");
boolean var9 = p_179660_3_.equals("r") && var7 != null;
int var10 = func_179653_a(p_179660_0_, "dx", 0);
int var11 = func_179653_a(p_179660_0_, "dy", 0);
int var12 = func_179653_a(p_179660_0_, "dz", 0);
int var13 = func_179653_a(p_179660_0_, "r", -1);
Predicate var14 = Predicates.and(p_179660_2_);
Predicate var15 = Predicates.and(IEntitySelector.selectAnything, var14);
if (p_179660_5_ != null)
{
int var16 = worldIn.playerEntities.size();
int var17 = worldIn.loadedEntityList.size();
boolean var18 = var16 < var17 / 16;
final AxisAlignedBB var19;
if (!p_179660_0_.containsKey("dx") && !p_179660_0_.containsKey("dy") && !p_179660_0_.containsKey("dz"))
{
if (var13 >= 0)
{
var19 = new AxisAlignedBB((double)(p_179660_5_.getX() - var13), (double)(p_179660_5_.getY() - var13), (double)(p_179660_5_.getZ() - var13), (double)(p_179660_5_.getX() + var13 + 1), (double)(p_179660_5_.getY() + var13 + 1), (double)(p_179660_5_.getZ() + var13 + 1));
if (var8 && var18 && !var9)
{
var6.addAll(worldIn.func_175661_b(p_179660_1_, var15));
}
else
{
var6.addAll(worldIn.func_175647_a(p_179660_1_, var19, var15));
}
}
else if (p_179660_3_.equals("a"))
{
var6.addAll(worldIn.func_175661_b(p_179660_1_, var14));
}
else if (!p_179660_3_.equals("p") && (!p_179660_3_.equals("r") || var9))
{
var6.addAll(worldIn.func_175644_a(p_179660_1_, var15));
}
else
{
var6.addAll(worldIn.func_175661_b(p_179660_1_, var15));
}
}
else
{
var19 = func_179661_a(p_179660_5_, var10, var11, var12);
if (var8 && var18 && !var9)
{
Predicate var20 = new Predicate()
{
private static final String __OBFID = "CL_00002360";
public boolean func_179609_a(Entity p_179609_1_)
{
return p_179609_1_.posX >= var19.minX && p_179609_1_.posY >= var19.minY && p_179609_1_.posZ >= var19.minZ ? p_179609_1_.posX < var19.maxX && p_179609_1_.posY < var19.maxY && p_179609_1_.posZ < var19.maxZ : false;
}
public boolean apply(Object p_apply_1_)
{
return this.func_179609_a((Entity)p_apply_1_);
}
};
var6.addAll(worldIn.func_175661_b(p_179660_1_, Predicates.and(var15, var20)));
}
else
{
var6.addAll(worldIn.func_175647_a(p_179660_1_, var19, var15));
}
}
}
else if (p_179660_3_.equals("a"))
{
var6.addAll(worldIn.func_175661_b(p_179660_1_, var14));
}
else if (!p_179660_3_.equals("p") && (!p_179660_3_.equals("r") || var9))
{
var6.addAll(worldIn.func_175644_a(p_179660_1_, var15));
}
else
{
var6.addAll(worldIn.func_175661_b(p_179660_1_, var15));
}
return var6;
}
private static List func_179658_a(List p_179658_0_, Map p_179658_1_, ICommandSender p_179658_2_, Class p_179658_3_, String p_179658_4_, final BlockPos p_179658_5_)
{
int var6 = func_179653_a(p_179658_1_, "c", !p_179658_4_.equals("a") && !p_179658_4_.equals("e") ? 1 : 0);
if (!p_179658_4_.equals("p") && !p_179658_4_.equals("a") && !p_179658_4_.equals("e"))
{
if (p_179658_4_.equals("r"))
{
Collections.shuffle((List)p_179658_0_);
}
}
else if (p_179658_5_ != null)
{
Collections.sort((List)p_179658_0_, new Comparator()
{
private static final String __OBFID = "CL_00002359";
public int func_179611_a(Entity p_179611_1_, Entity p_179611_2_)
{
return ComparisonChain.start().compare(p_179611_1_.getDistanceSq(p_179658_5_), p_179611_2_.getDistanceSq(p_179658_5_)).result();
}
public int compare(Object p_compare_1_, Object p_compare_2_)
{
return this.func_179611_a((Entity)p_compare_1_, (Entity)p_compare_2_);
}
});
}
Entity var7 = p_179658_2_.getCommandSenderEntity();
if (var7 != null && p_179658_3_.isAssignableFrom(var7.getClass()) && var6 == 1 && ((List)p_179658_0_).contains(var7) && !"r".equals(p_179658_4_))
{
p_179658_0_ = Lists.newArrayList(new Entity[] {var7});
}
if (var6 != 0)
{
if (var6 < 0)
{
Collections.reverse((List)p_179658_0_);
}
p_179658_0_ = ((List)p_179658_0_).subList(0, Math.min(Math.abs(var6), ((List)p_179658_0_).size()));
}
return (List)p_179658_0_;
}
private static AxisAlignedBB func_179661_a(BlockPos p_179661_0_, int p_179661_1_, int p_179661_2_, int p_179661_3_)
{
boolean var4 = p_179661_1_ < 0;
boolean var5 = p_179661_2_ < 0;
boolean var6 = p_179661_3_ < 0;
int var7 = p_179661_0_.getX() + (var4 ? p_179661_1_ : 0);
int var8 = p_179661_0_.getY() + (var5 ? p_179661_2_ : 0);
int var9 = p_179661_0_.getZ() + (var6 ? p_179661_3_ : 0);
int var10 = p_179661_0_.getX() + (var4 ? 0 : p_179661_1_) + 1;
int var11 = p_179661_0_.getY() + (var5 ? 0 : p_179661_2_) + 1;
int var12 = p_179661_0_.getZ() + (var6 ? 0 : p_179661_3_) + 1;
return new AxisAlignedBB((double)var7, (double)var8, (double)var9, (double)var10, (double)var11, (double)var12);
}
public static int func_179650_a(int p_179650_0_)
{
p_179650_0_ %= 360;
if (p_179650_0_ >= 160)
{
p_179650_0_ -= 360;
}
if (p_179650_0_ < 0)
{
p_179650_0_ += 360;
}
return p_179650_0_;
}
private static BlockPos func_179664_b(Map p_179664_0_, BlockPos p_179664_1_)
{
return new BlockPos(func_179653_a(p_179664_0_, "x", p_179664_1_.getX()), func_179653_a(p_179664_0_, "y", p_179664_1_.getY()), func_179653_a(p_179664_0_, "z", p_179664_1_.getZ()));
}
private static boolean func_179665_h(Map p_179665_0_)
{
Iterator var1 = field_179666_d.iterator();
String var2;
do
{
if (!var1.hasNext())
{
return false;
}
var2 = (String)var1.next();
}
while (!p_179665_0_.containsKey(var2));
return true;
}
private static int func_179653_a(Map p_179653_0_, String p_179653_1_, int p_179653_2_)
{
return p_179653_0_.containsKey(p_179653_1_) ? MathHelper.parseIntWithDefault((String)p_179653_0_.get(p_179653_1_), p_179653_2_) : p_179653_2_;
}
private static String func_179651_b(Map p_179651_0_, String p_179651_1_)
{
return (String)p_179651_0_.get(p_179651_1_);
}
public static Map func_96560_a(Map p_96560_0_)
{
HashMap var1 = Maps.newHashMap();
Iterator var2 = p_96560_0_.keySet().iterator();
while (var2.hasNext())
{
String var3 = (String)var2.next();
if (var3.startsWith("score_") && var3.length() > "score_".length())
{
var1.put(var3.substring("score_".length()), Integer.valueOf(MathHelper.parseIntWithDefault((String)p_96560_0_.get(var3), 1)));
}
}
return var1;
}
/**
* Returns whether the given pattern can match more than one player.
*/
public static boolean matchesMultiplePlayers(String p_82377_0_)
{
Matcher var1 = tokenPattern.matcher(p_82377_0_);
if (!var1.matches())
{
return false;
}
else
{
Map var2 = getArgumentMap(var1.group(2));
String var3 = var1.group(1);
int var4 = !"a".equals(var3) && !"e".equals(var3) ? 1 : 0;
return func_179653_a(var2, "c", var4) != 1;
}
}
/**
* Returns whether the given token has any arguments set.
*/
public static boolean hasArguments(String p_82378_0_)
{
return tokenPattern.matcher(p_82378_0_).matches();
}
/**
* Parses the given argument string, turning it into a HashMap<String, String> of name->value.
*/
private static Map getArgumentMap(String p_82381_0_)
{
HashMap var1 = Maps.newHashMap();
if (p_82381_0_ == null)
{
return var1;
}
else
{
int var2 = 0;
int var3 = -1;
for (Matcher var4 = intListPattern.matcher(p_82381_0_); var4.find(); var3 = var4.end())
{
String var5 = null;
switch (var2++)
{
case 0:
var5 = "x";
break;
case 1:
var5 = "y";
break;
case 2:
var5 = "z";
break;
case 3:
var5 = "r";
}
if (var5 != null && var4.group(1).length() > 0)
{
var1.put(var5, var4.group(1));
}
}
if (var3 < p_82381_0_.length())
{
Matcher var6 = keyValueListPattern.matcher(var3 == -1 ? p_82381_0_ : p_82381_0_.substring(var3));
while (var6.find())
{
var1.put(var6.group(1), var6.group(2));
}
}
return var1;
}
}
}