package net.minecraft.server; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.koloboke.collect.map.hash.HashObjObjMaps; import com.koloboke.collect.set.hash.HashObjSets; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; import javax.annotation.Nullable; public class CommandSpreadPlayers extends CommandAbstract { public CommandSpreadPlayers() {} @Override public String getCommand() { return "spreadplayers"; } @Override public int a() { return 2; } @Override public String getUsage(ICommandListener icommandlistener) { return "commands.spreadplayers.usage"; } @Override public void execute(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring) throws CommandException { if (astring.length < 6) { throw new ExceptionUsage("commands.spreadplayers.usage", new Object[0]); } else { byte b0 = 0; BlockPosition blockposition = icommandlistener.getChunkCoordinates(); double d0 = blockposition.getX(); int i = b0 + 1; double d1 = b(d0, astring[b0], true); double d2 = b(blockposition.getZ(), astring[i++], true); double d3 = a(astring[i++], 0.0D); double d4 = a(astring[i++], d3 + 1.0D); boolean flag = d(astring[i++]); ArrayList arraylist = Lists.newArrayList(); while (i < astring.length) { String s = astring[i++]; if (PlayerSelector.isPattern(s)) { List list = PlayerSelector.getPlayers(icommandlistener, s, Entity.class); if (list.isEmpty()) { throw new ExceptionEntityNotFound("commands.generic.selector.notFound", new Object[] { s}); } arraylist.addAll(list); } else { EntityPlayer entityplayer = minecraftserver.getPlayerList().getPlayer(s); if (entityplayer == null) { throw new ExceptionPlayerNotFound("commands.generic.player.notFound", new Object[] { s}); } arraylist.add(entityplayer); } } icommandlistener.a(CommandObjectiveExecutor.EnumCommandResult.AFFECTED_ENTITIES, arraylist.size()); if (arraylist.isEmpty()) { throw new ExceptionEntityNotFound("commands.spreadplayers.noop"); } else { icommandlistener.sendMessage(new ChatMessage("commands.spreadplayers.spreading." + (flag ? "teams" : "players"), new Object[] { Integer.valueOf(arraylist.size()), Double.valueOf(d4), Double.valueOf(d1), Double.valueOf(d2), Double.valueOf(d3)})); this.a(icommandlistener, arraylist, new CommandSpreadPlayers.Location2D(d1, d2), d3, d4, ((Entity) arraylist.get(0)).world, flag); } } } private void a(ICommandListener icommandlistener, List<Entity> list, CommandSpreadPlayers.Location2D commandspreadplayers_location2d, double d0, double d1, World world, boolean flag) throws CommandException { Random random = new Random(); double d2 = commandspreadplayers_location2d.a - d1; double d3 = commandspreadplayers_location2d.b - d1; double d4 = commandspreadplayers_location2d.a + d1; double d5 = commandspreadplayers_location2d.b + d1; CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d = this.a(random, flag ? this.b(list) : list.size(), d2, d3, d4, d5); int i = this.a(commandspreadplayers_location2d, d0, world, random, d2, d3, d4, d5, acommandspreadplayers_location2d, flag); double d6 = this.a(list, world, acommandspreadplayers_location2d, flag); a(icommandlistener, (ICommand) this, "commands.spreadplayers.success." + (flag ? "teams" : "players"), new Object[] { Integer.valueOf(acommandspreadplayers_location2d.length), Double.valueOf(commandspreadplayers_location2d.a), Double.valueOf(commandspreadplayers_location2d.b)}); if (acommandspreadplayers_location2d.length > 1) { icommandlistener.sendMessage(new ChatMessage("commands.spreadplayers.info." + (flag ? "teams" : "players"), new Object[] { String.format("%.2f", new Object[] { Double.valueOf(d6)}), Integer.valueOf(i)})); } } private int b(List<Entity> list) { Set hashset = HashObjSets.newMutableSet(); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Entity entity = (Entity) iterator.next(); if (entity instanceof EntityHuman) { hashset.add(entity.aQ()); } else { hashset.add((Object) null); } } return hashset.size(); } private int a(CommandSpreadPlayers.Location2D commandspreadplayers_location2d, double d0, World world, Random random, double d1, double d2, double d3, double d4, CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d, boolean flag) throws CommandException { boolean flag1 = true; double d5 = 3.4028234663852886E38D; int i; for (i = 0; i < 10000 && flag1; ++i) { flag1 = false; d5 = 3.4028234663852886E38D; int j; CommandSpreadPlayers.Location2D commandspreadplayers_location2d1; for (int k = 0; k < acommandspreadplayers_location2d.length; ++k) { CommandSpreadPlayers.Location2D commandspreadplayers_location2d2 = acommandspreadplayers_location2d[k]; j = 0; commandspreadplayers_location2d1 = new CommandSpreadPlayers.Location2D(); for (int l = 0; l < acommandspreadplayers_location2d.length; ++l) { if (k != l) { CommandSpreadPlayers.Location2D commandspreadplayers_location2d3 = acommandspreadplayers_location2d[l]; double d6 = commandspreadplayers_location2d2.a(commandspreadplayers_location2d3); d5 = Math.min(d6, d5); if (d6 < d0) { ++j; commandspreadplayers_location2d1.a += commandspreadplayers_location2d3.a - commandspreadplayers_location2d2.a; commandspreadplayers_location2d1.b += commandspreadplayers_location2d3.b - commandspreadplayers_location2d2.b; } } } if (j > 0) { commandspreadplayers_location2d1.a /= j; commandspreadplayers_location2d1.b /= j; double d7 = commandspreadplayers_location2d1.b(); if (d7 > 0.0D) { commandspreadplayers_location2d1.a(); commandspreadplayers_location2d2.b(commandspreadplayers_location2d1); } else { commandspreadplayers_location2d2.a(random, d1, d2, d3, d4); } flag1 = true; } if (commandspreadplayers_location2d2.a(d1, d2, d3, d4)) { flag1 = true; } } if (!flag1) { CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d1 = acommandspreadplayers_location2d; int i1 = acommandspreadplayers_location2d.length; for (j = 0; j < i1; ++j) { commandspreadplayers_location2d1 = acommandspreadplayers_location2d1[j]; if (!commandspreadplayers_location2d1.b(world)) { commandspreadplayers_location2d1.a(random, d1, d2, d3, d4); flag1 = true; } } } } if (i >= 10000) { throw new CommandException("commands.spreadplayers.failure." + (flag ? "teams" : "players"), new Object[] { Integer.valueOf(acommandspreadplayers_location2d.length), Double.valueOf(commandspreadplayers_location2d.a), Double.valueOf(commandspreadplayers_location2d.b), String.format("%.2f", new Object[] { Double.valueOf(d5)})}); } else { return i; } } private double a(List<Entity> list, World world, CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d, boolean flag) { double d0 = 0.0D; int i = 0; Map hashmap = HashObjObjMaps.newMutableMap(); for (int j = 0; j < list.size(); ++j) { Entity entity = list.get(j); CommandSpreadPlayers.Location2D commandspreadplayers_location2d; if (flag) { ScoreboardTeamBase scoreboardteambase = entity instanceof EntityHuman ? entity.aQ() : null; if (!hashmap.containsKey(scoreboardteambase)) { hashmap.put(scoreboardteambase, acommandspreadplayers_location2d[i++]); } commandspreadplayers_location2d = (CommandSpreadPlayers.Location2D) hashmap.get(scoreboardteambase); } else { commandspreadplayers_location2d = acommandspreadplayers_location2d[i++]; } entity.enderTeleportTo(MathHelper.floor(commandspreadplayers_location2d.a) + 0.5F, commandspreadplayers_location2d.a(world), MathHelper.floor(commandspreadplayers_location2d.b) + 0.5D); double d1 = Double.MAX_VALUE; CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d1 = acommandspreadplayers_location2d; int k = acommandspreadplayers_location2d.length; for (int l = 0; l < k; ++l) { CommandSpreadPlayers.Location2D commandspreadplayers_location2d1 = acommandspreadplayers_location2d1[l]; if (commandspreadplayers_location2d != commandspreadplayers_location2d1) { double d2 = commandspreadplayers_location2d.a(commandspreadplayers_location2d1); d1 = Math.min(d2, d1); } } d0 += d1; } d0 /= list.size(); return d0; } private CommandSpreadPlayers.Location2D[] a(Random random, int i, double d0, double d1, double d2, double d3) { CommandSpreadPlayers.Location2D[] acommandspreadplayers_location2d = new CommandSpreadPlayers.Location2D[i]; for (int j = 0; j < acommandspreadplayers_location2d.length; ++j) { CommandSpreadPlayers.Location2D commandspreadplayers_location2d = new CommandSpreadPlayers.Location2D(); commandspreadplayers_location2d.a(random, d0, d1, d2, d3); acommandspreadplayers_location2d[j] = commandspreadplayers_location2d; } return acommandspreadplayers_location2d; } @Override public List<String> tabComplete(MinecraftServer minecraftserver, ICommandListener icommandlistener, String[] astring, @Nullable BlockPosition blockposition) { return astring.length >= 1 && astring.length <= 2 ? b(astring, 0, blockposition) : Collections.<String>emptyList(); // CraftBukkit - decompile error } // CraftBukkit start - fix decompile error @Override public int compareTo(ICommand o) { return a(o); } // CraftBukkit end static class Location2D { double a; double b; Location2D() {} Location2D(double d0, double d1) { this.a = d0; this.b = d1; } double a(CommandSpreadPlayers.Location2D commandspreadplayers_location2d) { double d0 = this.a - commandspreadplayers_location2d.a; double d1 = this.b - commandspreadplayers_location2d.b; return Math.sqrt(d0 * d0 + d1 * d1); } void a() { double d0 = this.b(); this.a /= d0; this.b /= d0; } float b() { return MathHelper.sqrt(this.a * this.a + this.b * this.b); } public void b(CommandSpreadPlayers.Location2D commandspreadplayers_location2d) { this.a -= commandspreadplayers_location2d.a; this.b -= commandspreadplayers_location2d.b; } public boolean a(double d0, double d1, double d2, double d3) { boolean flag = false; if (this.a < d0) { this.a = d0; flag = true; } else if (this.a > d2) { this.a = d2; flag = true; } if (this.b < d1) { this.b = d1; flag = true; } else if (this.b > d3) { this.b = d3; flag = true; } return flag; } public int a(World world) { BlockPosition blockposition = new BlockPosition(this.a, 256.0D, this.b); do { if (blockposition.getY() <= 0) { return 257; } blockposition = blockposition.down(); } while (getType(world, blockposition).getMaterial() == Material.AIR); // CraftBukkit return blockposition.getY() + 1; } public boolean b(World world) { BlockPosition blockposition = new BlockPosition(this.a, 256.0D, this.b); Material material; do { if (blockposition.getY() <= 0) { return false; } blockposition = blockposition.down(); material = getType(world, blockposition).getMaterial(); // CraftBukkit } while (material == Material.AIR); return !material.isLiquid() && material != Material.FIRE; } public void a(Random random, double d0, double d1, double d2, double d3) { this.a = MathHelper.a(random, d0, d2); this.b = MathHelper.a(random, d1, d3); } // CraftBukkit start - add a version of getType which force loads chunks private static IBlockData getType(World world, BlockPosition position) { ((ChunkProviderServer) world.chunkProvider).getChunkAt(position.getX() >> 4, position.getZ() >> 4); return world.getType(position); } // CraftBukkit end } }