001    package net.minecraft.command;
002    
003    import java.util.List;
004    import net.minecraft.entity.player.EntityPlayerMP;
005    import net.minecraft.server.MinecraftServer;
006    
007    public 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    }