package net.minecraft.command; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import net.minecraft.block.Block; import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.BlockPos; import net.minecraft.world.NextTickListEntry; import net.minecraft.world.World; import net.minecraft.world.gen.structure.StructureBoundingBox; public class CommandClone extends CommandBase { private static final String __OBFID = "CL_00002348"; public String getCommandName() { return "clone"; } /** * Return the required permission level for this command. */ public int getRequiredPermissionLevel() { return 2; } public String getCommandUsage(ICommandSender sender) { return "commands.clone.usage"; } public void processCommand(ICommandSender sender, String[] args) throws CommandException { if (args.length < 9) { throw new WrongUsageException("commands.clone.usage", new Object[0]); } else { sender.func_174794_a(CommandResultStats.Type.AFFECTED_BLOCKS, 0); BlockPos var3 = func_175757_a(sender, args, 0, false); BlockPos var4 = func_175757_a(sender, args, 3, false); BlockPos var5 = func_175757_a(sender, args, 6, false); StructureBoundingBox var6 = new StructureBoundingBox(var3, var4); StructureBoundingBox var7 = new StructureBoundingBox(var5, var5.add(var6.func_175896_b())); int var8 = var6.getXSize() * var6.getYSize() * var6.getZSize(); if (var8 > 32768) { throw new CommandException("commands.clone.tooManyBlocks", new Object[] {Integer.valueOf(var8), Integer.valueOf(32768)}); } else { boolean var9 = false; Block var10 = null; int var11 = -1; if ((args.length < 11 || !args[10].equals("force") && !args[10].equals("move")) && var6.intersectsWith(var7)) { throw new CommandException("commands.clone.noOverlap", new Object[0]); } else { if (args.length >= 11 && args[10].equals("move")) { var9 = true; } if (var6.minY >= 0 && var6.maxY < 256 && var7.minY >= 0 && var7.maxY < 256) { World var12 = sender.getEntityWorld(); if (var12.isAreaLoaded(var6) && var12.isAreaLoaded(var7)) { boolean var13 = false; if (args.length >= 10) { if (args[9].equals("masked")) { var13 = true; } else if (args[9].equals("filtered")) { if (args.length < 12) { throw new WrongUsageException("commands.clone.usage", new Object[0]); } var10 = getBlockByText(sender, args[11]); if (args.length >= 13) { var11 = parseInt(args[12], 0, 15); } } } ArrayList var14 = Lists.newArrayList(); ArrayList var15 = Lists.newArrayList(); ArrayList var16 = Lists.newArrayList(); LinkedList var17 = Lists.newLinkedList(); BlockPos var18 = new BlockPos(var7.minX - var6.minX, var7.minY - var6.minY, var7.minZ - var6.minZ); for (int var19 = var6.minZ; var19 <= var6.maxZ; ++var19) { for (int var20 = var6.minY; var20 <= var6.maxY; ++var20) { for (int var21 = var6.minX; var21 <= var6.maxX; ++var21) { BlockPos var22 = new BlockPos(var21, var20, var19); BlockPos var23 = var22.add(var18); IBlockState var24 = var12.getBlockState(var22); if ((!var13 || var24.getBlock() != Blocks.air) && (var10 == null || var24.getBlock() == var10 && (var11 < 0 || var24.getBlock().getMetaFromState(var24) == var11))) { TileEntity var25 = var12.getTileEntity(var22); if (var25 != null) { NBTTagCompound var26 = new NBTTagCompound(); var25.writeToNBT(var26); var15.add(new CommandClone.StaticCloneData(var23, var24, var26)); var17.addLast(var22); } else if (!var24.getBlock().isFullBlock() && !var24.getBlock().isFullCube()) { var16.add(new CommandClone.StaticCloneData(var23, var24, (NBTTagCompound)null)); var17.addFirst(var22); } else { var14.add(new CommandClone.StaticCloneData(var23, var24, (NBTTagCompound)null)); var17.addLast(var22); } } } } } if (var9) { Iterator var27; BlockPos var29; for (var27 = var17.iterator(); var27.hasNext(); var12.setBlockState(var29, Blocks.barrier.getDefaultState(), 2)) { var29 = (BlockPos)var27.next(); TileEntity var31 = var12.getTileEntity(var29); if (var31 instanceof IInventory) { ((IInventory)var31).clearInventory(); } } var27 = var17.iterator(); while (var27.hasNext()) { var29 = (BlockPos)var27.next(); var12.setBlockState(var29, Blocks.air.getDefaultState(), 3); } } ArrayList var28 = Lists.newArrayList(); var28.addAll(var14); var28.addAll(var15); var28.addAll(var16); List var30 = Lists.reverse(var28); Iterator var32; CommandClone.StaticCloneData var34; TileEntity var36; for (var32 = var30.iterator(); var32.hasNext(); var12.setBlockState(var34.field_179537_a, Blocks.barrier.getDefaultState(), 2)) { var34 = (CommandClone.StaticCloneData)var32.next(); var36 = var12.getTileEntity(var34.field_179537_a); if (var36 instanceof IInventory) { ((IInventory)var36).clearInventory(); } } var8 = 0; var32 = var28.iterator(); while (var32.hasNext()) { var34 = (CommandClone.StaticCloneData)var32.next(); if (var12.setBlockState(var34.field_179537_a, var34.field_179535_b, 2)) { ++var8; } } for (var32 = var15.iterator(); var32.hasNext(); var12.setBlockState(var34.field_179537_a, var34.field_179535_b, 2)) { var34 = (CommandClone.StaticCloneData)var32.next(); var36 = var12.getTileEntity(var34.field_179537_a); if (var34.field_179536_c != null && var36 != null) { var34.field_179536_c.setInteger("x", var34.field_179537_a.getX()); var34.field_179536_c.setInteger("y", var34.field_179537_a.getY()); var34.field_179536_c.setInteger("z", var34.field_179537_a.getZ()); var36.readFromNBT(var34.field_179536_c); var36.markDirty(); } } var32 = var30.iterator(); while (var32.hasNext()) { var34 = (CommandClone.StaticCloneData)var32.next(); var12.func_175722_b(var34.field_179537_a, var34.field_179535_b.getBlock()); } List var33 = var12.func_175712_a(var6, false); if (var33 != null) { Iterator var35 = var33.iterator(); while (var35.hasNext()) { NextTickListEntry var37 = (NextTickListEntry)var35.next(); if (var6.func_175898_b(var37.field_180282_a)) { BlockPos var38 = var37.field_180282_a.add(var18); var12.func_180497_b(var38, var37.func_151351_a(), (int)(var37.scheduledTime - var12.getWorldInfo().getWorldTotalTime()), var37.priority); } } } if (var8 <= 0) { throw new CommandException("commands.clone.failed", new Object[0]); } else { sender.func_174794_a(CommandResultStats.Type.AFFECTED_BLOCKS, var8); notifyOperators(sender, this, "commands.clone.success", new Object[] {Integer.valueOf(var8)}); } } else { throw new CommandException("commands.clone.outOfWorld", new Object[0]); } } else { throw new CommandException("commands.clone.outOfWorld", new Object[0]); } } } } } public List addTabCompletionOptions(ICommandSender sender, String[] args, BlockPos pos) { return args.length > 0 && args.length <= 3 ? func_175771_a(args, 0, pos) : (args.length > 3 && args.length <= 6 ? func_175771_a(args, 3, pos) : (args.length > 6 && args.length <= 9 ? func_175771_a(args, 6, pos) : (args.length == 10 ? getListOfStringsMatchingLastWord(args, new String[] {"replace", "masked", "filtered"}): (args.length == 11 ? getListOfStringsMatchingLastWord(args, new String[] {"normal", "force", "move"}): (args.length == 12 && "filtered".equals(args[9]) ? func_175762_a(args, Block.blockRegistry.getKeys()) : null))))); } static class StaticCloneData { public final BlockPos field_179537_a; public final IBlockState field_179535_b; public final NBTTagCompound field_179536_c; private static final String __OBFID = "CL_00002347"; public StaticCloneData(BlockPos p_i46037_1_, IBlockState p_i46037_2_, NBTTagCompound p_i46037_3_) { this.field_179537_a = p_i46037_1_; this.field_179535_b = p_i46037_2_; this.field_179536_c = p_i46037_3_; } } }