--- a/net/minecraft/data/TagsProvider.java +++ b/net/minecraft/data/TagsProvider.java @@ -28,10 +28,18 @@ protected final DataGenerator field_200433_a; protected final Registry field_200435_c; protected final Map field_200434_b = Maps.newLinkedHashMap(); + protected final String modId; + protected final net.minecraftforge.common.data.ExistingFileHelper existingFileHelper; + @Deprecated//Forge, Use ModID version. protected TagsProvider(DataGenerator p_i49827_1_, Registry p_i49827_2_) { + this(p_i49827_1_, p_i49827_2_, "vanilla", null); + } + protected TagsProvider(DataGenerator p_i49827_1_, Registry p_i49827_2_, String modId, @javax.annotation.Nullable net.minecraftforge.common.data.ExistingFileHelper existingFileHelper) { this.field_200433_a = p_i49827_1_; this.field_200435_c = p_i49827_2_; + this.modId = modId; + this.existingFileHelper = existingFileHelper; } protected abstract void func_200432_c(); @@ -47,12 +55,14 @@ return this.field_200435_c.func_241873_b(p_240527_1_).orElse((T)null); }; this.field_200434_b.forEach((p_240524_4_, p_240524_5_) -> { - List list = p_240524_5_.func_232963_b_(function, function1).collect(Collectors.toList()); + // FORGE: Add validation via existing resources + List list = p_240524_5_.func_232963_b_(function, function1).filter(this::missing).collect(Collectors.toList()); if (!list.isEmpty()) { throw new IllegalArgumentException(String.format("Couldn't define tag %s as it is missing following references: %s", p_240524_4_, list.stream().map(Objects::toString).collect(Collectors.joining(",")))); } else { JsonObject jsonobject = p_240524_5_.func_232965_c_(); Path path = this.func_200431_a(p_240524_4_); + if (path == null) return; //Forge: Allow running this data provider without writing it. Recipe provider needs valid tags. try { String s = field_200437_e.toJson((JsonElement)jsonobject); @@ -74,11 +84,26 @@ }); } + private boolean missing(ITag.Proxy reference) { + ITag.ITagEntry entry = reference.func_232968_a_(); + // We only care about non-optional tag entries, this is the only type that can reference a resource and needs validation + // Optional tags should not be validated + if (entry instanceof ITag.TagEntry) { + return existingFileHelper == null || !existingFileHelper.exists(((ITag.TagEntry)entry).getId(), net.minecraft.resources.ResourcePackType.SERVER_DATA, ".json", "tags/" + getTagFolder()); + } + return false; + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + protected String getTagFolder() { + return ((Registry)Registry.field_212617_f).func_177774_c(field_200435_c).func_110623_a() + "s"; + } + protected abstract Path func_200431_a(ResourceLocation p_200431_1_); protected TagsProvider.Builder func_240522_a_(ITag.INamedTag p_240522_1_) { ITag.Builder itag$builder = this.func_240525_b_(p_240522_1_); - return new TagsProvider.Builder<>(itag$builder, this.field_200435_c, "vanilla"); + return new TagsProvider.Builder<>(itag$builder, this.field_200435_c, modId); } protected ITag.Builder func_240525_b_(ITag.INamedTag p_240525_1_) { @@ -87,7 +112,7 @@ }); } - public static class Builder { + public static class Builder implements net.minecraftforge.common.extensions.IForgeTagBuilder { private final ITag.Builder field_240528_a_; private final Registry field_240529_b_; private final String field_240530_c_; @@ -115,5 +140,18 @@ }); return this; } + + public TagsProvider.Builder add(ITag.ITagEntry tag) { + field_240528_a_.func_232955_a_(tag, field_240530_c_); + return this; + } + + public ITag.Builder getInternalBuilder() { + return field_240528_a_; + } + + public String getModID() { + return field_240530_c_; + } } }