docs: public static void dumpItemProperties(String filename) throws IOException
      {
          FileOutputStream fos = new FileOutputStream("..//..//build//install//Python_Examples//item_database.json");
          OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
          BufferedWriter writer = new BufferedWriter(osw);
          JsonArray itemTypes = new JsonArray();
          for (ResourceLocation i : Item.REGISTRY.getKeys())
          {
              Item item = Item.REGISTRY.getObject(i);
              if (item != null)
              {
                  JsonObject json = new JsonObject();
                  json.addProperty("type", Item.REGISTRY.getNameForObject(item).toString().replace("minecraft:",""));
                  json.addProperty("damageable", item.isDamageable());
                  json.addProperty("rendersIn3D", item.isFull3D());
                  json.addProperty("repairable", item.isRepairable());
                  CreativeTabs tab = item.getCreativeTab();
                  json.addProperty("tab", ((tab != null) ? item.getCreativeTab().getTabLabel() : "none"));
                  ItemStack is = item.getDefaultInstance();
                  json.addProperty("stackable", is.isStackable());
                  json.addProperty("enchantable", is.isItemEnchantable());
                  json.addProperty("rare", (is.getRarity() == EnumRarity.RARE));    // Enum has four types, but only two (COMMON and RARE) appear to be used.
                  json.addProperty("action", is.getItemUseAction().toString());
                  json.addProperty("hasSubtypes", item.getHasSubtypes());
                  json.addProperty("maxDamage", is.getMaxDamage());
                  json.addProperty("maxUseDuration", is.getMaxItemUseDuration());
                  json.addProperty("block", item instanceof ItemBlock);
                  json.addProperty("hasContainerItem", item.hasContainerItem());
                  if (item instanceof ItemBlock)
                  {
                      ItemBlock ib = (ItemBlock)item;
                      Block b = ib.getBlock();
                      IBlockState bs = b.getDefaultState();
                      json.addProperty("slipperiness", b.slipperiness);
                      json.addProperty("hardness", bs.getBlockHardness(null, null));
                      json.addProperty("causesSuffocation", bs.causesSuffocation());
                      json.addProperty("canProvidePower", bs.canProvidePower());
                      json.addProperty("translucent", bs.isTranslucent());
                      Material mat = bs.getMaterial();
                      if (mat != null)
                      {
                          json.addProperty("canBurn", mat.getCanBurn());
                          json.addProperty("isLiquid", mat.isLiquid());
                          json.addProperty("blocksMovement", mat.blocksMovement());
                          json.addProperty("needsNoTool", mat.isToolNotRequired());
                          json.addProperty("isReplaceable", mat.isReplaceable());
                          json.addProperty("pistonPushable", mat.getMobilityFlag() == EnumPushReaction.NORMAL);
                          json.addProperty("woodenMaterial", mat == Material.WOOD);
                          json.addProperty("ironMaterial", mat == Material.IRON);
                          json.addProperty("glassyMaterial",  mat == Material.GLASS);
                          json.addProperty("clothMaterial",  mat == Material.CLOTH);
                      }
  
                      boolean hasDirection = false;
                      boolean hasColour = false;
                      boolean hasVariant = false;
                      for (IProperty prop : bs.getProperties().keySet())
                      {
                          System.out.println(Item.REGISTRY.getNameForObject(item).toString() + " -- " + prop);
                          if (prop instanceof PropertyDirection)
                              hasDirection = true;
                          if (prop instanceof PropertyEnum && prop.getName().equals("color"))
                              hasColour = true;
                          if (prop instanceof PropertyEnum && prop.getName().equals("variant"))
                          {
                              hasVariant = true;
                              json.addProperty("variant", bs.getValue(prop).toString());
                          }
                      }
                      json.addProperty("hasDirection", hasDirection);
                      json.addProperty("hasColour", hasColour);
                      json.addProperty("hasVariant",  hasVariant);
                  }
                  itemTypes.add(json);
              }
          }
          writer.write(itemTypes.toString());
          writer.close();
      }