static MobRuleList$MobRuleEntry load(Properties properties, int index, int limit) {
    String skinList = properties.getProperty("skins." + index, "").trim().toLowerCase();
    int[] skins;
    int chooser;

    if (!skinList.equals("*") && !skinList.equals("all") && !skinList.equals("any")) {
      skins = MCPatcherUtils.parseIntegerList(skinList, 1, limit);

      if (skins.length <= 0) {
        return null;
      }

      for (chooser = 0; chooser < skins.length; ++chooser) {
        --skins[chooser];
      }
    } else {
      skins = new int[limit];

      for (chooser = 0; chooser < skins.length; skins[chooser] = chooser++) {;
      }
    }

    WeightedIndex var11 =
        WeightedIndex.create(skins.length, properties.getProperty("weights." + index, ""));

    if (var11 == null) {
      return null;
    } else {
      String biomeList = MCPatcherUtils.getStringProperty(properties, "biomes." + index, "");
      BitSet biomes;

      if (biomeList.isEmpty()) {
        biomes = null;
      } else {
        biomes = new BitSet();

        if (MobRuleList.access$000() != null) {
          try {
            MobRuleList.access$000().invoke((Object) null, new Object[] {biomeList, biomes});
          } catch (Throwable var10) {
            var10.printStackTrace();
            MobRuleList.access$002((Method) null);
          }
        }
      }

      int minHeight = MCPatcherUtils.getIntProperty(properties, "minHeight." + index, -1);
      int maxHeight =
          MCPatcherUtils.getIntProperty(properties, "maxHeight." + index, Integer.MAX_VALUE);

      if (minHeight < 0 || minHeight > maxHeight) {
        minHeight = -1;
        maxHeight = Integer.MAX_VALUE;
      }

      return new MobRuleList$MobRuleEntry(skins, var11, biomes, minHeight, maxHeight);
    }
  }
  private void writeCustomImage() {
    try {
      BufferedImage image =
          new BufferedImage(width, outputFrames * height, BufferedImage.TYPE_INT_ARGB);
      IntBuffer intBuffer = scratchBuffer.asIntBuffer();
      int[] argb = new int[width * height];
      File path = MCPatcherUtils.getGamePath("custom_" + name + ".png");
      logger.info("generating %d %s frames", outputFrames, name);
      for (int i = 0; i < outputFrames; i++) {
        renderToItems(i * (360.0 / outputFrames));
        itemsFBO.read(scratchBuffer);
        intBuffer.position(0);
        for (int j = 0; j < argb.length; j++) {
          switch (MipmapHelper.TEX_FORMAT) {
            case GL12.GL_BGRA:
              int bgra = intBuffer.get(j);
              argb[j] =
                  (bgra << 24) | ((bgra & 0xff00) << 8) | ((bgra & 0xff0000) >> 8) | (bgra >>> 24);
              break;

            default:
              if (i == 0 && j == 0) {
                logger.warning(
                    "unhandled texture format %d, color channels may be incorrect",
                    MipmapHelper.TEX_FORMAT);
              }
              // fall through

            case GL11.GL_RGBA:
              argb[j] = Integer.rotateRight(intBuffer.get(j), 8);
              break;
          }
        }
        image.setRGB(0, i * height, width, height, argb, 0, width);
      }
      ImageIO.write(image, "png", path);
      logger.info("wrote %dx%d %s", image.getWidth(), image.getHeight(), path.getPath());
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }