public void execute(final ICommandListener icommandlistener, String[] astring)
      throws CommandException {
    if (astring.length < 5) {
      throw new ExceptionUsage("commands.execute.usage", new Object[0]);
    } else {
      final Entity entity = a(icommandlistener, astring[0], Entity.class);
      final double d0 = b(entity.locX, astring[1], false);
      final double d1 = b(entity.locY, astring[2], false);
      final double d2 = b(entity.locZ, astring[3], false);
      final BlockPosition blockposition = new BlockPosition(d0, d1, d2);
      byte b0 = 4;

      if ("detect".equals(astring[4]) && astring.length > 10) {
        World world = entity.getWorld();
        double d3 = b(d0, astring[5], false);
        double d4 = b(d1, astring[6], false);
        double d5 = b(d2, astring[7], false);
        Block block = g(icommandlistener, astring[8]);
        int i = a(astring[9], -1, 15);
        BlockPosition blockposition1 = new BlockPosition(d3, d4, d5);
        IBlockData iblockdata = world.getType(blockposition1);

        if (iblockdata.getBlock() != block
            || i >= 0 && iblockdata.getBlock().toLegacyData(iblockdata) != i) {
          throw new CommandException(
              "commands.execute.failed", new Object[] {"detect", entity.getName()});
        }

        b0 = 10;
      }

      String s = a(astring, b0);
      ICommandListener icommandlistener1 =
          new ICommandListener() {
            public String getName() {
              return entity.getName();
            }

            public IChatBaseComponent getScoreboardDisplayName() {
              return entity.getScoreboardDisplayName();
            }

            public void sendMessage(IChatBaseComponent ichatbasecomponent) {
              icommandlistener.sendMessage(ichatbasecomponent);
            }

            public boolean a(int i, String s) {
              return icommandlistener.a(i, s);
            }

            public BlockPosition getChunkCoordinates() {
              return blockposition;
            }

            public Vec3D d() {
              return new Vec3D(d0, d1, d2);
            }

            public World getWorld() {
              return entity.world;
            }

            public Entity f() {
              return entity;
            }

            public boolean getSendCommandFeedback() {
              MinecraftServer minecraftserver = MinecraftServer.getServer();

              return minecraftserver == null
                  || minecraftserver.worldServer[0].getGameRules().getBoolean("commandBlockOutput");
            }

            public void a(
                CommandObjectiveExecutor.EnumCommandResult
                    commandobjectiveexecutor_enumcommandresult,
                int i) {
              entity.a(commandobjectiveexecutor_enumcommandresult, i);
            }
          };
      ICommandHandler icommandhandler = MinecraftServer.getServer().getCommandHandler();

      try {
        // CraftBukkit start
        org.bukkit.command.CommandSender sender = null;
        if (icommandlistener instanceof DedicatedServer) {
          sender = MinecraftServer.getServer().server.getConsoleSender();
        } else if (icommandlistener instanceof CommandBlockListenerAbstract) {
          sender = ((CommandBlockListenerAbstract) icommandlistener).sender;
        } else if (VanillaCommandWrapper.lastSender != null) {
          sender = VanillaCommandWrapper.lastSender;
        } else if (icommandlistener.f() != null) {
          sender = icommandlistener.f().getBukkitEntity();
        } else {
          throw new CommandException(
              "Unhandled executor " + icommandlistener.getClass().getSimpleName(), new Object[0]);
        }
        int j =
            CommandBlockListenerAbstract.executeCommand(
                icommandlistener1,
                new ProxiedNativeCommandSender(icommandlistener1, sender, entity.getBukkitEntity()),
                s);
        // CraftBukkit end

        if (j < 1) {
          throw new CommandException("commands.execute.allInvocationsFailed", new Object[] {s});
        }
      } catch (Throwable throwable) {
        // CraftBukkit start
        if (throwable instanceof CommandException) {
          throw (CommandException) throwable;
        }
        // CraftBukkit end
        throw new CommandException("commands.execute.failed", new Object[] {s, entity.getName()});
      }
    }
  }