001package net.minecraft.command;
002
003import java.util.List;
004import net.minecraft.entity.player.EntityPlayerMP;
005import net.minecraft.server.MinecraftServer;
006
007public class CommandServerTp extends CommandBase
008{
009    public String getCommandName()
010    {
011        return "tp";
012    }
013
014    /**
015     * Return the required permission level for this command.
016     */
017    public int getRequiredPermissionLevel()
018    {
019        return 2;
020    }
021
022    public String getCommandUsage(ICommandSender par1ICommandSender)
023    {
024        return par1ICommandSender.translateString("commands.tp.usage", new Object[0]);
025    }
026
027    public void processCommand(ICommandSender par1ICommandSender, String[] par2ArrayOfStr)
028    {
029        if (par2ArrayOfStr.length < 1)
030        {
031            throw new WrongUsageException("commands.tp.usage", new Object[0]);
032        }
033        else
034        {
035            EntityPlayerMP var3;
036
037            if (par2ArrayOfStr.length != 2 && par2ArrayOfStr.length != 4)
038            {
039                var3 = getCommandSenderAsPlayer(par1ICommandSender);
040            }
041            else
042            {
043                var3 = func_82359_c(par1ICommandSender, par2ArrayOfStr[0]);
044
045                if (var3 == null)
046                {
047                    throw new PlayerNotFoundException();
048                }
049            }
050
051            if (par2ArrayOfStr.length != 3 && par2ArrayOfStr.length != 4)
052            {
053                if (par2ArrayOfStr.length == 1 || par2ArrayOfStr.length == 2)
054                {
055                    EntityPlayerMP var11 = func_82359_c(par1ICommandSender, par2ArrayOfStr[par2ArrayOfStr.length - 1]);
056
057                    if (var11 == null)
058                    {
059                        throw new PlayerNotFoundException();
060                    }
061
062                    if (var11.worldObj != var3.worldObj)
063                    {
064                        notifyAdmins(par1ICommandSender, "commands.tp.notSameDimension", new Object[0]);
065                        return;
066                    }
067
068                    var3.playerNetServerHandler.setPlayerLocation(var11.posX, var11.posY, var11.posZ, var11.rotationYaw, var11.rotationPitch);
069                    notifyAdmins(par1ICommandSender, "commands.tp.success", new Object[] {var3.getEntityName(), var11.getEntityName()});
070                }
071            }
072            else if (var3.worldObj != null)
073            {
074                int var4 = par2ArrayOfStr.length - 3;
075                double var5 = this.func_82368_a(par1ICommandSender, var3.posX, par2ArrayOfStr[var4++]);
076                double var7 = this.func_82367_a(par1ICommandSender, var3.posY, par2ArrayOfStr[var4++], 0, 0);
077                double var9 = this.func_82368_a(par1ICommandSender, var3.posZ, par2ArrayOfStr[var4++]);
078                var3.setPositionAndUpdate(var5, var7, var9);
079                notifyAdmins(par1ICommandSender, "commands.tp.success.coordinates", new Object[] {var3.getEntityName(), Double.valueOf(var5), Double.valueOf(var7), Double.valueOf(var9)});
080            }
081        }
082    }
083
084    private double func_82368_a(ICommandSender par1ICommandSender, double par2, String par4Str)
085    {
086        return this.func_82367_a(par1ICommandSender, par2, par4Str, -30000000, 30000000);
087    }
088
089    private double func_82367_a(ICommandSender par1ICommandSender, double par2, String par4Str, int par5, int par6)
090    {
091        boolean var7 = par4Str.startsWith("~");
092        double var8 = var7 ? par2 : 0.0D;
093
094        if (!var7 || par4Str.length() > 1)
095        {
096            boolean var10 = par4Str.contains(".");
097
098            if (var7)
099            {
100                par4Str = par4Str.substring(1);
101            }
102
103            var8 += func_82363_b(par1ICommandSender, par4Str);
104
105            if (!var10 && !var7)
106            {
107                var8 += 0.5D;
108            }
109        }
110
111        if (par5 != 0 || par6 != 0)
112        {
113            if (var8 < (double)par5)
114            {
115                throw new NumberInvalidException("commands.generic.double.tooSmall", new Object[] {Double.valueOf(var8), Integer.valueOf(par5)});
116            }
117
118            if (var8 > (double)par6)
119            {
120                throw new NumberInvalidException("commands.generic.double.tooBig", new Object[] {Double.valueOf(var8), Integer.valueOf(par6)});
121            }
122        }
123
124        return var8;
125    }
126
127    /**
128     * Adds the strings available in this command to the given list of tab completion options.
129     */
130    public List addTabCompletionOptions(ICommandSender par1ICommandSender, String[] par2ArrayOfStr)
131    {
132        return par2ArrayOfStr.length != 1 && par2ArrayOfStr.length != 2 ? null : getListOfStringsMatchingLastWord(par2ArrayOfStr, MinecraftServer.getServer().getAllUsernames());
133    }
134
135    /**
136     * Return whether the specified command parameter index is a username parameter.
137     */
138    public boolean isUsernameIndex(int par1)
139    {
140        return par1 == 0;
141    }
142}