--- a/net/minecraft/advancements/criterion/ItemPredicate.java
+++ b/net/minecraft/advancements/criterion/ItemPredicate.java
@@ -26,6 +26,8 @@
 import net.minecraft.util.registry.Registry;
 
 public class ItemPredicate {
+   private static final Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> custom_predicates = new java.util.HashMap<>();
+   private static final Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> unmod_predicates = java.util.Collections.unmodifiableMap(custom_predicates);
    public static final ItemPredicate field_192495_a = new ItemPredicate();
    @Nullable
    private final ITag<Item> field_200018_b;
@@ -105,6 +107,11 @@
    public static ItemPredicate func_192492_a(@Nullable JsonElement p_192492_0_) {
       if (p_192492_0_ != null && !p_192492_0_.isJsonNull()) {
          JsonObject jsonobject = JSONUtils.func_151210_l(p_192492_0_, "item");
+         if (jsonobject.has("type")) {
+            final ResourceLocation rl = new ResourceLocation(JSONUtils.func_151200_h(jsonobject, "type"));
+            if (custom_predicates.containsKey(rl)) return custom_predicates.get(rl).apply(jsonobject);
+            else throw new JsonSyntaxException("There is no ItemPredicate of type "+rl);
+         }
          MinMaxBounds.IntBound minmaxbounds$intbound = MinMaxBounds.IntBound.func_211344_a(jsonobject.get("count"));
          MinMaxBounds.IntBound minmaxbounds$intbound1 = MinMaxBounds.IntBound.func_211344_a(jsonobject.get("durability"));
          if (jsonobject.has("data")) {
@@ -204,6 +211,14 @@
       }
    }
 
+   public static void register(ResourceLocation name, java.util.function.Function<JsonObject, ItemPredicate> deserializer) {
+      custom_predicates.put(name, deserializer);
+   }
+
+   public static Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> getPredicates() {
+      return unmod_predicates;
+   }
+
    public static class Builder {
       private final List<EnchantmentPredicate> field_200312_a = Lists.newArrayList();
       private final List<EnchantmentPredicate> field_226657_b_ = Lists.newArrayList();
