This commit is contained in:
modmuss50
2022-05-12 21:58:35 +01:00
parent 729842f055
commit 55e82473ab
28 changed files with 163 additions and 394 deletions

1
.gitattributes vendored
View File

@@ -1 +1,2 @@
*.java text eol=lf *.java text eol=lf
*.json text eol=lf

View File

@@ -19,12 +19,13 @@ package net.fabricmc.fabric.mixin.command.client;
import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.network.ClientCommandSource; import net.minecraft.client.network.ClientCommandSource;
import net.minecraft.client.network.ClientPlayerEntity; import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.network.ChatMessageSender; import net.minecraft.network.MessageSender;
import net.minecraft.network.MessageType; import net.minecraft.network.MessageType;
import net.minecraft.text.Text; import net.minecraft.text.Text;
import net.minecraft.util.Formatting; import net.minecraft.util.Formatting;
@@ -41,12 +42,18 @@ abstract class ClientCommandSourceMixin implements FabricClientCommandSource {
@Override @Override
public void sendFeedback(Text message) { public void sendFeedback(Text message) {
client.inGameHud.onChatMessage(Registry.field_39206.get(MessageType.SYSTEM), message, new ChatMessageSender(Util.NIL_UUID, message)); client.inGameHud.onChatMessage(getSystemMessageType(), message, new MessageSender(Util.NIL_UUID, message));
} }
@Override @Override
public void sendError(Text message) { public void sendError(Text message) {
client.inGameHud.onChatMessage(Registry.field_39206.get(MessageType.SYSTEM), Text.literal("").append(message).formatted(Formatting.RED), new ChatMessageSender(Util.NIL_UUID, message)); client.inGameHud.onChatMessage(getSystemMessageType(), Text.literal("").append(message).formatted(Formatting.RED), new MessageSender(Util.NIL_UUID, message));
}
@Unique
private MessageType getSystemMessageType() {
Registry<MessageType> registry = client.world.getRegistryManager().get(Registry.MESSAGE_TYPE_KEY);
return registry.get(MessageType.SYSTEM);
} }
@Override @Override

View File

@@ -27,7 +27,7 @@ import net.fabricmc.fabric.api.tag.convention.v1.ConventionalBiomeTags;
public class BiomeTagGenerator extends FabricTagProvider.DynamicRegistryTagProvider<Biome> { public class BiomeTagGenerator extends FabricTagProvider.DynamicRegistryTagProvider<Biome> {
public BiomeTagGenerator(FabricDataGenerator dataGenerator) { public BiomeTagGenerator(FabricDataGenerator dataGenerator) {
super(dataGenerator, Registry.BIOME_KEY, "worldgen/biome"); super(dataGenerator, Registry.BIOME_KEY);
} }
@Override @Override

View File

@@ -26,6 +26,7 @@ import com.google.common.collect.Sets;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import net.minecraft.advancement.Advancement; import net.minecraft.advancement.Advancement;
import net.minecraft.data.DataGenerator;
import net.minecraft.data.DataProvider; import net.minecraft.data.DataProvider;
import net.minecraft.data.DataWriter; import net.minecraft.data.DataWriter;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -41,9 +42,11 @@ import net.fabricmc.fabric.impl.datagen.FabricDataGenHelper;
*/ */
public abstract class FabricAdvancementProvider implements DataProvider { public abstract class FabricAdvancementProvider implements DataProvider {
protected final FabricDataGenerator dataGenerator; protected final FabricDataGenerator dataGenerator;
private final DataGenerator.class_7489 pathResolver;
protected FabricAdvancementProvider(FabricDataGenerator dataGenerator) { protected FabricAdvancementProvider(FabricDataGenerator dataGenerator) {
this.dataGenerator = dataGenerator; this.dataGenerator = dataGenerator;
this.pathResolver = dataGenerator.method_44106(DataGenerator.class_7490.DATA_PACK, "advancements");
} }
/** /**

View File

@@ -1,32 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.api.datagen.v1.provider;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
/**
* @deprecated use {@link FabricAdvancementProvider} instead.
*/
@Deprecated
public abstract class FabricAdvancementsProvider extends FabricAdvancementProvider {
protected final FabricDataGenerator dataGenerator;
protected FabricAdvancementsProvider(FabricDataGenerator dataGenerator) {
super(dataGenerator);
this.dataGenerator = dataGenerator;
}
}

View File

@@ -1,32 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.api.datagen.v1.provider;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
/**
* @deprecated use {@link FabricBlockLootTableProvider} instead.
*/
@Deprecated
public abstract class FabricBlockLootTablesProvider extends FabricBlockLootTableProvider {
protected final FabricDataGenerator dataGenerator;
protected FabricBlockLootTablesProvider(FabricDataGenerator dataGenerator) {
super(dataGenerator);
this.dataGenerator = dataGenerator;
}
}

View File

@@ -1,32 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.api.datagen.v1.provider;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
/**
* @deprecated use {@link FabricModelProvider} instead.
*/
@Deprecated
public abstract class FabricBlockStateDefinitionProvider extends FabricModelProvider {
protected final FabricDataGenerator dataGenerator;
public FabricBlockStateDefinitionProvider(FabricDataGenerator dataGenerator) {
super(dataGenerator);
this.dataGenerator = dataGenerator;
}
}

View File

@@ -16,7 +16,6 @@
package net.fabricmc.fabric.api.datagen.v1.provider; package net.fabricmc.fabric.api.datagen.v1.provider;
import java.nio.file.Path;
import java.util.Set; import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
@@ -66,7 +65,6 @@ public abstract class FabricRecipeProvider extends RecipeProvider {
@Override @Override
public void run(DataWriter writer) { public void run(DataWriter writer) {
Path path = this.root.getOutput();
Set<Identifier> generatedRecipes = Sets.newHashSet(); Set<Identifier> generatedRecipes = Sets.newHashSet();
generateRecipes(provider -> { generateRecipes(provider -> {
Identifier identifier = getRecipeIdentifier(provider.getRecipeId()); Identifier identifier = getRecipeIdentifier(provider.getRecipeId());
@@ -79,12 +77,12 @@ public abstract class FabricRecipeProvider extends RecipeProvider {
ConditionJsonProvider[] conditions = FabricDataGenHelper.consumeConditions(provider); ConditionJsonProvider[] conditions = FabricDataGenHelper.consumeConditions(provider);
ConditionJsonProvider.write(recipeJson, conditions); ConditionJsonProvider.write(recipeJson, conditions);
saveRecipe(writer, recipeJson, path.resolve("data/" + identifier.getNamespace() + "/recipes/" + identifier.getPath() + ".json")); saveRecipe(writer, recipeJson, this.field_39378.method_44107(identifier));
JsonObject advancementJson = provider.toAdvancementJson(); JsonObject advancementJson = provider.toAdvancementJson();
if (advancementJson != null) { if (advancementJson != null) {
ConditionJsonProvider.write(advancementJson, conditions); ConditionJsonProvider.write(advancementJson, conditions);
saveRecipeAdvancement(writer, advancementJson, path.resolve("data/" + identifier.getNamespace() + "/advancements/" + provider.getAdvancementId().getPath() + ".json")); saveRecipeAdvancement(writer, advancementJson, this.field_39379.method_44107(getRecipeIdentifier(provider.getAdvancementId())));
} }
}); });
} }

View File

@@ -1,32 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.api.datagen.v1.provider;
import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator;
/**
* @deprecated use {@link FabricRecipeProvider} instead.
*/
@Deprecated
public abstract class FabricRecipesProvider extends FabricRecipeProvider {
protected final FabricDataGenerator dataGenerator;
public FabricRecipesProvider(FabricDataGenerator dataGenerator) {
super(dataGenerator);
this.dataGenerator = dataGenerator;
}
}

View File

@@ -16,7 +16,6 @@
package net.fabricmc.fabric.api.datagen.v1.provider; package net.fabricmc.fabric.api.datagen.v1.provider;
import java.nio.file.Path;
import java.util.Objects; import java.util.Objects;
import java.util.function.Function; import java.util.function.Function;
@@ -24,19 +23,18 @@ import com.google.common.base.Preconditions;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.data.DataProvider;
import net.minecraft.data.server.AbstractTagProvider; import net.minecraft.data.server.AbstractTagProvider;
import net.minecraft.entity.EntityType; import net.minecraft.entity.EntityType;
import net.minecraft.fluid.Fluid; import net.minecraft.fluid.Fluid;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.tag.BlockTags; import net.minecraft.tag.BlockTags;
import net.minecraft.tag.Builder;
import net.minecraft.tag.EntityTypeTags; import net.minecraft.tag.EntityTypeTags;
import net.minecraft.tag.FluidTags; import net.minecraft.tag.FluidTags;
import net.minecraft.tag.GameEventTags; import net.minecraft.tag.GameEventTags;
import net.minecraft.tag.ItemTags; import net.minecraft.tag.ItemTags;
import net.minecraft.tag.Tag; import net.minecraft.tag.TagEntry;
import net.minecraft.tag.TagKey; import net.minecraft.tag.TagKey;
import net.minecraft.tag.TagManagerLoader;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
@@ -64,7 +62,6 @@ import net.fabricmc.fabric.mixin.datagen.DynamicRegistryManagerAccessor;
*/ */
public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> { public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
private final FabricDataGenerator fabricDataGenerator; private final FabricDataGenerator fabricDataGenerator;
private final String path;
/** /**
* Construct a new {@link FabricTagProvider} with the default computed path. * Construct a new {@link FabricTagProvider} with the default computed path.
@@ -73,26 +70,10 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
* *
* @param dataGenerator The data generator instance * @param dataGenerator The data generator instance
* @param registry The backing registry for the Tag type. * @param registry The backing registry for the Tag type.
* @param name The name used for {@link DataProvider#getName()}
*/ */
protected FabricTagProvider(FabricDataGenerator dataGenerator, Registry<T> registry) { public FabricTagProvider(FabricDataGenerator dataGenerator, Registry<T> registry) {
this(dataGenerator, registry, TagManagerLoader.getPath(registry.getKey()));
}
/**
* Construct a new {@link FabricTagProvider}.
*
* <p>Common implementations of this class are provided. For example @see BlockTagProvider
*
* @param dataGenerator The data generator instance
* @param registry The backing registry for the Tag type.
* @param path The directory name to write the tag file names. Example: "blocks" or "items"
*/
@SuppressWarnings({"unchecked", "rawtypes"})
protected FabricTagProvider(FabricDataGenerator dataGenerator, Registry<T> registry, String path) {
super(dataGenerator, registry); super(dataGenerator, registry);
this.fabricDataGenerator = dataGenerator; this.fabricDataGenerator = dataGenerator;
this.path = path.startsWith("tags/") ? path : "tags/" + path;
if (!(this instanceof DynamicRegistryTagProvider) && BuiltinRegistries.REGISTRIES.contains((RegistryKey) registry.getKey())) { if (!(this instanceof DynamicRegistryTagProvider) && BuiltinRegistries.REGISTRIES.contains((RegistryKey) registry.getKey())) {
throw new IllegalArgumentException("Using FabricTagProvider to generate dynamic registry tags is not supported, Use DynamicRegistryTagProvider instead."); throw new IllegalArgumentException("Using FabricTagProvider to generate dynamic registry tags is not supported, Use DynamicRegistryTagProvider instead.");
@@ -115,11 +96,6 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
return new FabricTagBuilder<>(super.getOrCreateTagBuilder(tag)); return new FabricTagBuilder<>(super.getOrCreateTagBuilder(tag));
} }
@Override
protected Path getOutput(Identifier id) {
return this.root.getOutput().resolve("data/%s/%s/%s.json".formatted(id.getNamespace(), path, id.getPath()));
}
@Override @Override
protected final void configure() { protected final void configure() {
generateTags(); generateTags();
@@ -139,7 +115,7 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
*/ */
public abstract static class ItemTagProvider extends FabricTagProvider<Item> { public abstract static class ItemTagProvider extends FabricTagProvider<Item> {
@Nullable @Nullable
private final Function<TagKey<Block>, Tag.Builder> blockTagBuilderProvider; private final Function<TagKey<Block>, Builder> blockTagBuilderProvider;
/** /**
* Construct an {@link ItemTagProvider} tag provider <b>with</b> an associated {@link BlockTagProvider} tag provider. * Construct an {@link ItemTagProvider} tag provider <b>with</b> an associated {@link BlockTagProvider} tag provider.
@@ -172,9 +148,9 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
* @param itemTag The item tag to copy to. * @param itemTag The item tag to copy to.
*/ */
public void copy(TagKey<Block> blockTag, TagKey<Item> itemTag) { public void copy(TagKey<Block> blockTag, TagKey<Item> itemTag) {
Tag.Builder blockTagBuilder = Objects.requireNonNull(this.blockTagBuilderProvider, "Pass Block tag provider via constructor to use copy").apply(blockTag); Builder blockTagBuilder = Objects.requireNonNull(this.blockTagBuilderProvider, "Pass Block tag provider via constructor to use copy").apply(blockTag);
Tag.Builder itemTagBuilder = this.getTagBuilder(itemTag); Builder itemTagBuilder = this.getTagBuilder(itemTag);
blockTagBuilder.streamEntries().filter((entry) -> entry.entry().canAdd(this.registry::containsId, (id) -> true)).forEach(itemTagBuilder::add); blockTagBuilder.build().stream().filter((entry) -> entry.canAdd(this.registry::containsId, (id) -> true)).forEach(itemTagBuilder::add);
} }
} }
@@ -214,11 +190,10 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
* *
* @param dataGenerator The data generator instance * @param dataGenerator The data generator instance
* @param registryKey The registry key of the dynamic registry * @param registryKey The registry key of the dynamic registry
* @param path The directory name to write the tag file names
* @throws IllegalArgumentException if the registry is static registry * @throws IllegalArgumentException if the registry is static registry
*/ */
protected DynamicRegistryTagProvider(FabricDataGenerator dataGenerator, RegistryKey<? extends Registry<T>> registryKey, String path) { protected DynamicRegistryTagProvider(FabricDataGenerator dataGenerator, RegistryKey<? extends Registry<T>> registryKey) {
super(dataGenerator, FabricDataGenHelper.getFakeDynamicRegistry(), path); super(dataGenerator, FabricDataGenHelper.getFakeDynamicRegistry(registryKey));
Preconditions.checkArgument(DynamicRegistryManagerAccessor.getInfos().containsKey(registryKey), "Only dynamic registries are supported in this tag provider."); Preconditions.checkArgument(DynamicRegistryManagerAccessor.getInfos().containsKey(registryKey), "Only dynamic registries are supported in this tag provider.");
} }
} }
@@ -230,7 +205,7 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
private final AbstractTagProvider.ObjectBuilder<T> parent; private final AbstractTagProvider.ObjectBuilder<T> parent;
private FabricTagBuilder(ObjectBuilder<T> parent) { private FabricTagBuilder(ObjectBuilder<T> parent) {
super(parent.builder, parent.registry, parent.source); super(parent.builder, parent.registry);
this.parent = parent; this.parent = parent;
} }
@@ -266,7 +241,7 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
* @return the {@link FabricTagBuilder} instance * @return the {@link FabricTagBuilder} instance
*/ */
public FabricTagBuilder<T> add(Identifier id) { public FabricTagBuilder<T> add(Identifier id) {
builder.add(id, source); builder.add(id);
return this; return this;
} }
@@ -316,7 +291,7 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
*/ */
@Override @Override
public FabricTagBuilder<T> addTag(TagKey<T> tag) { public FabricTagBuilder<T> addTag(TagKey<T> tag) {
builder.addTag(tag.id(), source); builder.addTag(tag.id());
return this; return this;
} }
@@ -349,7 +324,7 @@ public abstract class FabricTagProvider<T> extends AbstractTagProvider<T> {
* @return the {@link FabricTagBuilder} instance * @return the {@link FabricTagBuilder} instance
*/ */
public FabricTagBuilder<T> forceAddTag(TagKey<T> tag) { public FabricTagBuilder<T> forceAddTag(TagKey<T> tag) {
builder.add(new ForcedTagEntry(new Tag.TagEntry(tag.id())), source); builder.add(new ForcedTagEntry(TagEntry.method_43937(tag.id())));
return this; return this;
} }

View File

@@ -74,21 +74,6 @@ public final class FabricDataGenHelper {
*/ */
private static final String ENTRYPOINT_KEY = "fabric-datagen"; private static final String ENTRYPOINT_KEY = "fabric-datagen";
/**
* A fake registry instance to be used for {@link DynamicRegistryTagProvider}.
*
* <p>In {@link AbstractTagProvider#run}, it checks for whether the registry has all the elements added to the builder.
* This would be fine for static registry, but there won't be any instance dynamic registry available.
* Therefore, this simply return true for all {@link Registry#containsId} call.
*/
@SuppressWarnings("rawtypes")
private static final Registry FAKE_DYNAMIC_REGISTRY = new SimpleRegistry<>(RegistryKey.ofRegistry(new Identifier("fabric:fake_dynamic_registry")), Lifecycle.experimental(), null) {
@Override
public boolean containsId(Identifier id) {
return true;
}
};
private FabricDataGenHelper() { private FabricDataGenHelper() {
} }
@@ -135,9 +120,21 @@ public final class FabricDataGenHelper {
} }
} }
@SuppressWarnings("unchecked") /**
public static <T> Registry<T> getFakeDynamicRegistry() { * A fake registry instance to be used for {@link DynamicRegistryTagProvider}.
return FAKE_DYNAMIC_REGISTRY; *
* <p>In {@link AbstractTagProvider#run}, it checks for whether the registry has all the elements added to the builder.
* This would be fine for static registry, but there won't be any instance dynamic registry available.
* Therefore, this simply return true for all {@link Registry#containsId} call.
*/
@SuppressWarnings("rawtypes")
public static <T> Registry<T> getFakeDynamicRegistry(RegistryKey<? extends Registry<T>> registryKey) {
return new SimpleRegistry<>(registryKey, Lifecycle.experimental(), null) {
@Override
public boolean containsId(Identifier id) {
return true;
}
};
} }
/** /**

View File

@@ -21,4 +21,6 @@ import org.jetbrains.annotations.ApiStatus;
@ApiStatus.Internal @ApiStatus.Internal
public interface FabricTagBuilder { public interface FabricTagBuilder {
void fabric_setReplace(boolean replace); void fabric_setReplace(boolean replace);
boolean fabric_isReplaced();
} }

View File

@@ -17,23 +17,22 @@
package net.fabricmc.fabric.impl.datagen; package net.fabricmc.fabric.impl.datagen;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import com.google.gson.JsonArray; import net.minecraft.tag.TagEntry;
import net.minecraft.tag.Tag;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
public record ForcedTagEntry(Tag.Entry delegate) implements Tag.Entry { public class ForcedTagEntry extends TagEntry {
@Override private final TagEntry delegate;
public <T> boolean resolve(Function<Identifier, Tag<T>> tagGetter, Function<Identifier, T> objectGetter, Consumer<T> collector) {
return delegate.resolve(tagGetter, objectGetter, collector); public ForcedTagEntry(TagEntry delegate) {
super(delegate.id, delegate.field_39267, delegate.field_39268);
this.delegate = delegate;
} }
@Override @Override
public void addToJson(JsonArray json) { public <T> boolean resolve(TagEntry.class_7474<T> arg, Consumer<T> consumer) {
delegate.addToJson(json); return delegate.resolve(arg, consumer);
} }
@Override @Override

View File

@@ -16,23 +16,28 @@
package net.fabricmc.fabric.mixin.datagen; package net.fabricmc.fabric.mixin.datagen;
import java.util.List;
import com.google.gson.JsonElement;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
import net.minecraft.data.DataWriter;
import net.minecraft.data.server.AbstractTagProvider; import net.minecraft.data.server.AbstractTagProvider;
import net.minecraft.tag.Builder;
import net.minecraft.util.Identifier;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricTagProvider; import net.fabricmc.fabric.impl.datagen.FabricTagBuilder;
@Mixin(AbstractTagProvider.class) @Mixin(AbstractTagProvider.class)
public class AbstractTagProviderMixin { public class AbstractTagProviderMixin {
@ModifyArg(method = "getOrCreateTagBuilder", index = 2, at = @At(value = "INVOKE", target = "Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder;<init>(Lnet/minecraft/tag/Tag$Builder;Lnet/minecraft/util/registry/Registry;Ljava/lang/String;)V")) @Inject(method = "method_27046", at = @At(value = "INVOKE", target = "Lnet/minecraft/data/DataGenerator$class_7489;method_44107(Lnet/minecraft/util/Identifier;)Ljava/nio/file/Path;"), locals = LocalCapture.CAPTURE_FAILHARD)
private String injectModId(String str) { public void addReplaced(DataWriter dataWriter, Identifier id, Builder builder, CallbackInfo ci, List list, List list2, JsonElement jsonElement) {
//noinspection ConstantConditions if (builder instanceof FabricTagBuilder fabricTagBuilder) {
if ((Object) (this) instanceof FabricTagProvider fabricTagProvider) { jsonElement.getAsJsonObject().addProperty("replace", fabricTagBuilder.fabric_isReplaced());
return fabricTagProvider.getFabricDataGenerator().getModId();
} }
return str;
} }
} }

View File

@@ -21,9 +21,7 @@ import java.util.Set;
import java.util.function.Supplier; import java.util.function.Supplier;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import org.spongepowered.asm.mixin.Final;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
@@ -48,12 +46,16 @@ import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider;
@Mixin(ModelProvider.class) @Mixin(ModelProvider.class)
public class ModelProviderMixin { public class ModelProviderMixin {
@Shadow @Unique
@Final
private DataGenerator generator; private DataGenerator generator;
@Unique @Unique
private static ThreadLocal<DataGenerator> dataGeneratorThreadLocal = new ThreadLocal<>(); private static final ThreadLocal<DataGenerator> dataGeneratorThreadLocal = new ThreadLocal<>();
@Inject(method = "<init>", at = @At("RETURN"))
public void init(DataGenerator generator, CallbackInfo ci) {
this.generator = generator;
}
@Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/data/client/BlockStateModelGenerator;register()V")) @Redirect(method = "run", at = @At(value = "INVOKE", target = "Lnet/minecraft/data/client/BlockStateModelGenerator;register()V"))
private void registerBlockStateModels(BlockStateModelGenerator instance) { private void registerBlockStateModels(BlockStateModelGenerator instance) {

View File

@@ -18,17 +18,15 @@ package net.fabricmc.fabric.mixin.datagen;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.ModifyArg;
import net.minecraft.tag.Tag; import net.minecraft.tag.Builder;
import net.fabricmc.fabric.impl.datagen.FabricTagBuilder; import net.fabricmc.fabric.impl.datagen.FabricTagBuilder;
/** /**
* Extends Tag.Builder to support setting the replace field. * Extends Tag.Builder to support setting the replace field.
*/ */
@Mixin(Tag.Builder.class) @Mixin(Builder.class)
public class TagBuilderMixin implements FabricTagBuilder { public class TagBuilderMixin implements FabricTagBuilder {
@Unique @Unique
private boolean replace = false; private boolean replace = false;
@@ -38,8 +36,8 @@ public class TagBuilderMixin implements FabricTagBuilder {
this.replace = replace; this.replace = replace;
} }
@ModifyArg(method = "toJson", at = @At(value = "INVOKE", target = "Lcom/google/gson/JsonObject;addProperty(Ljava/lang/String;Ljava/lang/Boolean;)V"), index = 1) @Override
public Boolean modifyReplace(Boolean replace) { public boolean fabric_isReplaced() {
return this.replace; return replace;
} }
} }

View File

@@ -1,18 +1,25 @@
accessWidener v2 named accessWidener v2 named
accessible field net/minecraft/data/server/RecipeProvider root Lnet/minecraft/data/DataGenerator; accessible field net/minecraft/data/server/RecipeProvider field_39378 Lnet/minecraft/data/DataGenerator$class_7489;
accessible field net/minecraft/data/server/RecipeProvider field_39379 Lnet/minecraft/data/DataGenerator$class_7489;
extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder <init> (Lnet/minecraft/tag/Tag$Builder;Lnet/minecraft/util/registry/Registry;Ljava/lang/String;)V accessible method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder <init> (Lnet/minecraft/tag/Builder;Lnet/minecraft/util/registry/Registry;)V
extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Ljava/lang/Object;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder; extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Ljava/lang/Object;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder builder Lnet/minecraft/tag/Tag$Builder; accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder builder Lnet/minecraft/tag/Builder;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder registry Lnet/minecraft/util/registry/Registry; accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder registry Lnet/minecraft/util/registry/Registry;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder source Ljava/lang/String;
accessible field net/minecraft/data/server/AbstractTagProvider tagBuilders Ljava/util/Map; accessible field net/minecraft/data/server/AbstractTagProvider tagBuilders Ljava/util/Map;
accessible field net/minecraft/data/server/BlockLootTableGenerator lootTables Ljava/util/Map; accessible field net/minecraft/data/server/BlockLootTableGenerator lootTables Ljava/util/Map;
accessible class net/minecraft/tag/Tag$TagEntry extendable method net/minecraft/tag/TagEntry <init> (Lnet/minecraft/util/Identifier;ZZ)V
accessible field net/minecraft/tag/TagEntry id Lnet/minecraft/util/Identifier;
accessible field net/minecraft/tag/TagEntry field_39267 Z
accessible field net/minecraft/tag/TagEntry field_39268 Z
extendable method net/minecraft/data/DataGenerator$class_7489 <init> (Lnet/minecraft/data/DataGenerator;Lnet/minecraft/data/DataGenerator$class_7490;Ljava/lang/String;)V
accessible field net/minecraft/data/DataGenerator$class_7489 field_39365 Ljava/nio/file/Path;
accessible field net/minecraft/data/DataGenerator$class_7489 field_39366 Ljava/lang/String;
transitive-accessible method net/minecraft/data/family/BlockFamilies register (Lnet/minecraft/block/Block;)Lnet/minecraft/data/family/BlockFamily$Builder; transitive-accessible method net/minecraft/data/family/BlockFamilies register (Lnet/minecraft/block/Block;)Lnet/minecraft/data/family/BlockFamily$Builder;
@@ -26,7 +33,6 @@ transitive-accessible field net/minecraft/data/client/BlockStateModelGenerat
transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;)Lnet/minecraft/data/client/TextureKey; transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;)Lnet/minecraft/data/client/TextureKey;
transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;Lnet/minecraft/data/client/TextureKey;)Lnet/minecraft/data/client/TextureKey; transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;Lnet/minecraft/data/client/TextureKey;)Lnet/minecraft/data/client/TextureKey;
transitive-extendable method net/minecraft/data/server/AbstractTagProvider getOutput (Lnet/minecraft/util/Identifier;)Ljava/nio/file/Path;
transitive-extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Lnet/minecraft/util/registry/RegistryKey;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder; transitive-extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Lnet/minecraft/util/registry/RegistryKey;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder;
transitive-accessible method net/minecraft/data/server/RecipeProvider saveRecipe (Lnet/minecraft/data/DataWriter;Lcom/google/gson/JsonObject;Ljava/nio/file/Path;)V transitive-accessible method net/minecraft/data/server/RecipeProvider saveRecipe (Lnet/minecraft/data/DataWriter;Lcom/google/gson/JsonObject;Ljava/nio/file/Path;)V
@@ -47,7 +53,7 @@ transitive-accessible method net/minecraft/data/server/RecipeProvider createTran
transitive-accessible method net/minecraft/data/server/RecipeProvider createDoorRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder; transitive-accessible method net/minecraft/data/server/RecipeProvider createDoorRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder;
transitive-accessible method net/minecraft/data/server/RecipeProvider createFenceRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder; transitive-accessible method net/minecraft/data/server/RecipeProvider createFenceRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder;
transitive-accessible method net/minecraft/data/server/RecipeProvider createFenceGateRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder; transitive-accessible method net/minecraft/data/server/RecipeProvider createFenceGateRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder;
transitive-accessible method net/minecraft/data/server/RecipeProvider createPressurePlateRecipe (Ljava/util/function/Consumer;Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/item/ItemConvertible;)V transitive-accessible method net/minecraft/data/server/RecipeProvider offerPressurePlateRecipe (Ljava/util/function/Consumer;Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/item/ItemConvertible;)V
transitive-accessible method net/minecraft/data/server/RecipeProvider createPressurePlateRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder; transitive-accessible method net/minecraft/data/server/RecipeProvider createPressurePlateRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder;
transitive-accessible method net/minecraft/data/server/RecipeProvider offerSlabRecipe (Ljava/util/function/Consumer;Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/item/ItemConvertible;)V transitive-accessible method net/minecraft/data/server/RecipeProvider offerSlabRecipe (Ljava/util/function/Consumer;Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/item/ItemConvertible;)V
transitive-accessible method net/minecraft/data/server/RecipeProvider createSlabRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder; transitive-accessible method net/minecraft/data/server/RecipeProvider createSlabRecipe (Lnet/minecraft/item/ItemConvertible;Lnet/minecraft/recipe/Ingredient;)Lnet/minecraft/data/server/recipe/CraftingRecipeJsonBuilder;
@@ -183,7 +189,7 @@ transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerLantern (Lnet/minecraft/block/Block;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerLantern (Lnet/minecraft/block/Block;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerTopSoil (Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/data/client/BlockStateVariant;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerTopSoil (Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/data/client/BlockStateVariant;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerPressurePlate (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerPressurePlate (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerInfested (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerParented (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerNorthDefaultHorizontalRotation (Lnet/minecraft/block/Block;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerNorthDefaultHorizontalRotation (Lnet/minecraft/block/Block;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerPiston (Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/data/client/TextureMap;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerPiston (Lnet/minecraft/block/Block;Lnet/minecraft/util/Identifier;Lnet/minecraft/data/client/TextureMap;)V
transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerTorch (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V transitive-accessible method net/minecraft/data/client/BlockStateModelGenerator registerTorch (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;)V
@@ -225,7 +231,7 @@ transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator g
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator cropStemDrops (Lnet/minecraft/block/Block;Lnet/minecraft/item/Item;)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator cropStemDrops (Lnet/minecraft/block/Block;Lnet/minecraft/item/Item;)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator attachedCropStemDrops (Lnet/minecraft/block/Block;Lnet/minecraft/item/Item;)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator attachedCropStemDrops (Lnet/minecraft/block/Block;Lnet/minecraft/item/Item;)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator dropsWithShears (Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator dropsWithShears (Lnet/minecraft/item/ItemConvertible;)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator glowLichenDrops (Lnet/minecraft/block/Block;Lnet/minecraft/loot/condition/LootCondition$Builder;)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator multifaceGrowthDrops (Lnet/minecraft/block/Block;Lnet/minecraft/loot/condition/LootCondition$Builder;)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator leavesDrop (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;[F)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator leavesDrop (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;[F)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator oakLeavesDrop (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;[F)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator oakLeavesDrop (Lnet/minecraft/block/Block;Lnet/minecraft/block/Block;[F)Lnet/minecraft/loot/LootTable$Builder;
transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator mangroveLeavesDrop (Lnet/minecraft/block/Block;)Lnet/minecraft/loot/LootTable$Builder; transitive-accessible method net/minecraft/data/server/BlockLootTableGenerator mangroveLeavesDrop (Lnet/minecraft/block/Block;)Lnet/minecraft/loot/LootTable$Builder;

View File

@@ -76,7 +76,7 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
dataGenerator.addProvider(TestBiomeTagProvider::new); dataGenerator.addProvider(TestBiomeTagProvider::new);
try { try {
new FabricTagProvider<>(dataGenerator, BuiltinRegistries.BIOME, "Biome Tags") { new FabricTagProvider<>(dataGenerator, BuiltinRegistries.BIOME) {
@Override @Override
protected void generateTags() { protected void generateTags() {
} }
@@ -87,7 +87,7 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
} }
try { try {
new FabricTagProvider.DynamicRegistryTagProvider<>(dataGenerator, Registry.ITEM_KEY, "items") { new FabricTagProvider.DynamicRegistryTagProvider<>(dataGenerator, Registry.ITEM_KEY) {
@Override @Override
protected void generateTags() { protected void generateTags() {
} }
@@ -164,7 +164,7 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint {
private static class TestBiomeTagProvider extends FabricTagProvider.DynamicRegistryTagProvider<Biome> { private static class TestBiomeTagProvider extends FabricTagProvider.DynamicRegistryTagProvider<Biome> {
private TestBiomeTagProvider(FabricDataGenerator dataGenerator) { private TestBiomeTagProvider(FabricDataGenerator dataGenerator) {
super(dataGenerator, Registry.BIOME_KEY, "biomes"); super(dataGenerator, Registry.BIOME_KEY);
} }
@Override @Override

View File

@@ -1,18 +1,25 @@
accessWidener v2 named accessWidener v2 named
accessible field net/minecraft/data/server/RecipeProvider root Lnet/minecraft/data/DataGenerator; accessible field net/minecraft/data/server/RecipeProvider field_39378 Lnet/minecraft/data/DataGenerator$class_7489;
accessible field net/minecraft/data/server/RecipeProvider field_39379 Lnet/minecraft/data/DataGenerator$class_7489;
extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder <init> (Lnet/minecraft/tag/Tag$Builder;Lnet/minecraft/util/registry/Registry;Ljava/lang/String;)V accessible method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder <init> (Lnet/minecraft/tag/Builder;Lnet/minecraft/util/registry/Registry;)V
extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Ljava/lang/Object;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder; extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Ljava/lang/Object;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder builder Lnet/minecraft/tag/Tag$Builder; accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder builder Lnet/minecraft/tag/Builder;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder registry Lnet/minecraft/util/registry/Registry; accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder registry Lnet/minecraft/util/registry/Registry;
accessible field net/minecraft/data/server/AbstractTagProvider$ObjectBuilder source Ljava/lang/String;
accessible field net/minecraft/data/server/AbstractTagProvider tagBuilders Ljava/util/Map; accessible field net/minecraft/data/server/AbstractTagProvider tagBuilders Ljava/util/Map;
accessible field net/minecraft/data/server/BlockLootTableGenerator lootTables Ljava/util/Map; accessible field net/minecraft/data/server/BlockLootTableGenerator lootTables Ljava/util/Map;
accessible class net/minecraft/tag/Tag$TagEntry extendable method net/minecraft/tag/TagEntry <init> (Lnet/minecraft/util/Identifier;ZZ)V
accessible field net/minecraft/tag/TagEntry id Lnet/minecraft/util/Identifier;
accessible field net/minecraft/tag/TagEntry field_39267 Z
accessible field net/minecraft/tag/TagEntry field_39268 Z
extendable method net/minecraft/data/DataGenerator$class_7489 <init> (Lnet/minecraft/data/DataGenerator;Lnet/minecraft/data/DataGenerator$class_7490;Ljava/lang/String;)V
accessible field net/minecraft/data/DataGenerator$class_7489 field_39365 Ljava/nio/file/Path;
accessible field net/minecraft/data/DataGenerator$class_7489 field_39366 Ljava/lang/String;
transitive-accessible method net/minecraft/data/family/BlockFamilies register (Lnet/minecraft/block/Block;)Lnet/minecraft/data/family/BlockFamily$Builder; transitive-accessible method net/minecraft/data/family/BlockFamilies register (Lnet/minecraft/block/Block;)Lnet/minecraft/data/family/BlockFamily$Builder;
@@ -26,5 +33,4 @@ transitive-accessible field net/minecraft/data/client/BlockStateModelGenerat
transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;)Lnet/minecraft/data/client/TextureKey; transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;)Lnet/minecraft/data/client/TextureKey;
transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;Lnet/minecraft/data/client/TextureKey;)Lnet/minecraft/data/client/TextureKey; transitive-accessible method net/minecraft/data/client/TextureKey of (Ljava/lang/String;Lnet/minecraft/data/client/TextureKey;)Lnet/minecraft/data/client/TextureKey;
transitive-extendable method net/minecraft/data/server/AbstractTagProvider getOutput (Lnet/minecraft/util/Identifier;)Ljava/nio/file/Path;
transitive-extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Lnet/minecraft/util/registry/RegistryKey;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder; transitive-extendable method net/minecraft/data/server/AbstractTagProvider$ObjectBuilder add ([Lnet/minecraft/util/registry/RegistryKey;)Lnet/minecraft/data/server/AbstractTagProvider$ObjectBuilder;

View File

@@ -18,6 +18,8 @@ package net.fabricmc.fabric.api.object.builder.v1.villager;
import static com.google.common.base.Preconditions.checkState; import static com.google.common.base.Preconditions.checkState;
import java.util.function.Predicate;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -27,12 +29,12 @@ import net.minecraft.client.render.entity.feature.VillagerResourceMetadata;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.sound.SoundEvent; import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.RegistryEntry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.village.TradeOffers; import net.minecraft.village.TradeOffers;
import net.minecraft.village.VillagerProfession; import net.minecraft.village.VillagerProfession;
import net.minecraft.world.poi.PointOfInterestType; import net.minecraft.world.poi.PointOfInterestType;
import net.fabricmc.fabric.mixin.object.builder.VillagerProfessionAccessor;
/** /**
* Allows for the creation of new {@link VillagerProfession}s. * Allows for the creation of new {@link VillagerProfession}s.
* *
@@ -46,7 +48,8 @@ public final class VillagerProfessionBuilder {
private final ImmutableSet.Builder<Item> gatherableItemsBuilder = ImmutableSet.builder(); private final ImmutableSet.Builder<Item> gatherableItemsBuilder = ImmutableSet.builder();
private final ImmutableSet.Builder<Block> secondaryJobSiteBlockBuilder = ImmutableSet.builder(); private final ImmutableSet.Builder<Block> secondaryJobSiteBlockBuilder = ImmutableSet.builder();
private Identifier identifier; private Identifier identifier;
private PointOfInterestType pointOfInterestType; private Predicate<RegistryEntry<PointOfInterestType>> pointOfInterestType;
private Predicate<RegistryEntry<PointOfInterestType>> acquirableJobSite;
@Nullable @Nullable
private SoundEvent workSoundEvent; private SoundEvent workSoundEvent;
@@ -76,11 +79,27 @@ public final class VillagerProfessionBuilder {
/** /**
* The {@link PointOfInterestType} the Villager of this profession will search for when finding a workstation. * The {@link PointOfInterestType} the Villager of this profession will search for when finding a workstation.
* *
* @param type The {@link PointOfInterestType} the Villager will attempt to find. * @param key The {@link PointOfInterestType} the Villager will attempt to find.
* @return this builder. * @return this builder.
*/ */
public VillagerProfessionBuilder workstation(PointOfInterestType type) { public VillagerProfessionBuilder workstation(RegistryKey<PointOfInterestType> key) {
this.pointOfInterestType = type; jobSite(entry -> entry.matchesKey(key));
return workstation(entry -> entry.matchesKey(key));
}
/**
* The {@link PointOfInterestType} the Villager of this profession will search for when finding a workstation.
*
* @param predicate The {@link PointOfInterestType} the Villager will attempt to find.
* @return this builder.
*/
public VillagerProfessionBuilder workstation(Predicate<RegistryEntry<PointOfInterestType>> predicate) {
this.pointOfInterestType = predicate;
return this;
}
public VillagerProfessionBuilder jobSite(Predicate<RegistryEntry<PointOfInterestType>> predicate) {
this.acquirableJobSite = predicate;
return this; return this;
} }
@@ -156,6 +175,8 @@ public final class VillagerProfessionBuilder {
public VillagerProfession build() { public VillagerProfession build() {
checkState(this.identifier != null, "An Identifier is required to build a new VillagerProfession."); checkState(this.identifier != null, "An Identifier is required to build a new VillagerProfession.");
checkState(this.pointOfInterestType != null, "A PointOfInterestType is required to build a new VillagerProfession."); checkState(this.pointOfInterestType != null, "A PointOfInterestType is required to build a new VillagerProfession.");
return VillagerProfessionAccessor.create(this.identifier.toString(), this.pointOfInterestType, this.gatherableItemsBuilder.build(), this.secondaryJobSiteBlockBuilder.build(), this.workSoundEvent); checkState(this.acquirableJobSite != null, "A PointOfInterestType is required for the acquirableJobSite to build a new VillagerProfession.");
return new VillagerProfession(this.identifier.toString(), this.pointOfInterestType, this.acquirableJobSite, this.gatherableItemsBuilder.build(), this.secondaryJobSiteBlockBuilder.build(), this.workSoundEvent);
} }
} }

View File

@@ -17,19 +17,18 @@
package net.fabricmc.fabric.api.object.builder.v1.world.poi; package net.fabricmc.fabric.api.object.builder.v1.world.poi;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.class_7477;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.Registry;
import net.minecraft.util.registry.RegistryKey;
import net.minecraft.world.poi.PointOfInterest; import net.minecraft.world.poi.PointOfInterest;
import net.minecraft.world.poi.PointOfInterestType; import net.minecraft.world.poi.PointOfInterestType;
import net.fabricmc.fabric.mixin.object.builder.PointOfInterestTypeAccessor;
/** /**
* This class provides utilities to create a {@link PointOfInterestType}. * This class provides utilities to create a {@link PointOfInterestType}.
* *
@@ -59,26 +58,6 @@ public final class PointOfInterestHelper {
return register(id, ticketCount, searchDistance, builder.build()); return register(id, ticketCount, searchDistance, builder.build());
} }
/**
* Creates and registers a {@link PointOfInterestType}.
*
* @param id The id of this {@link PointOfInterestType}.
* @param ticketCount the amount of tickets.
* @param completionCondition a {@link Predicate} which determines if two {@link PointOfInterestType}s are the same.
* @param searchDistance the search distance.
* @param blocks all blocks where a {@link PointOfInterest} of this type will be present
* @return a new {@link PointOfInterestType}.
*/
public static PointOfInterestType register(Identifier id, int ticketCount, Predicate<PointOfInterestType> completionCondition, int searchDistance, Block... blocks) {
final ImmutableSet.Builder<BlockState> builder = ImmutableSet.builder();
for (Block block : blocks) {
builder.addAll(block.getStateManager().getStates());
}
return register(id, ticketCount, completionCondition, searchDistance, builder.build());
}
/** /**
* Creates and registers a {@link PointOfInterestType}. * Creates and registers a {@link PointOfInterestType}.
* *
@@ -94,31 +73,9 @@ public final class PointOfInterestHelper {
return register(id, ticketCount, searchDistance, builder.addAll(blocks).build()); return register(id, ticketCount, searchDistance, builder.addAll(blocks).build());
} }
/**
* Creates and registers a {@link PointOfInterestType}.
*
* @param id the id of this {@link PointOfInterestType}.
* @param ticketCount the amount of tickets.
* @param typePredicate a {@link Predicate} which determines if two {@link PointOfInterestType}s are the same.
* @param searchDistance the search distance.
* @param states all {@link BlockState block states} where a {@link PointOfInterest} of this type will be present
* @return a new {@link PointOfInterestType}.
*/
public static PointOfInterestType register(Identifier id, int ticketCount, Predicate<PointOfInterestType> typePredicate, int searchDistance, Iterable<BlockState> states) {
final ImmutableSet.Builder<BlockState> builder = ImmutableSet.builder();
return register(id, ticketCount, typePredicate, searchDistance, builder.addAll(states).build());
}
// INTERNAL METHODS // INTERNAL METHODS
private static PointOfInterestType register(Identifier id, int ticketCount, int searchDistance, Set<BlockState> states) { private static PointOfInterestType register(Identifier id, int ticketCount, int searchDistance, Set<BlockState> states) {
return Registry.register(Registry.POINT_OF_INTEREST_TYPE, id, PointOfInterestTypeAccessor.callSetup( return class_7477.method_43993(Registry.POINT_OF_INTEREST_TYPE, RegistryKey.of(Registry.POINT_OF_INTEREST_TYPE_KEY, id), states, ticketCount, searchDistance);
PointOfInterestTypeAccessor.callCreate(id.toString(), states, ticketCount, searchDistance)));
}
private static PointOfInterestType register(Identifier id, int ticketCount, Predicate<PointOfInterestType> typePredicate, int searchDistance, Set<BlockState> states) {
return Registry.register(Registry.POINT_OF_INTEREST_TYPE, id, PointOfInterestTypeAccessor.callSetup(
PointOfInterestTypeAccessor.callCreate(id.toString(), states, ticketCount, typePredicate, searchDistance)));
} }
} }

View File

@@ -1,44 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.mixin.object.builder;
import java.util.Set;
import java.util.function.Predicate;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import net.minecraft.block.BlockState;
import net.minecraft.world.poi.PointOfInterestType;
@Mixin(PointOfInterestType.class)
public interface PointOfInterestTypeAccessor {
@Invoker("<init>")
static PointOfInterestType callCreate(String id, Set<BlockState> blockStates, int ticketCount, Predicate<PointOfInterestType> typePredicate, int searchDistance) {
throw new AssertionError("Untransformed Accessor!");
}
@Invoker("<init>")
static PointOfInterestType callCreate(String id, Set<BlockState> blockStates, int ticketCount, int searchDistance) {
throw new AssertionError("Untransformed Accessor!");
}
@Invoker("setup")
static PointOfInterestType callSetup(PointOfInterestType pointOfInterestType) {
throw new AssertionError("Untransformed Accessor!");
}
}

View File

@@ -1,36 +0,0 @@
/*
* Copyright (c) 2016, 2017, 2018, 2019 FabricMC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.fabricmc.fabric.mixin.object.builder;
import org.jetbrains.annotations.Nullable;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.gen.Invoker;
import com.google.common.collect.ImmutableSet;
import net.minecraft.block.Block;
import net.minecraft.item.Item;
import net.minecraft.sound.SoundEvent;
import net.minecraft.village.VillagerProfession;
import net.minecraft.world.poi.PointOfInterestType;
@Mixin(VillagerProfession.class)
public interface VillagerProfessionAccessor {
@Invoker("<init>")
static VillagerProfession create(String id, PointOfInterestType type, ImmutableSet<Item> gatherableItems, ImmutableSet<Block> secondaryJobSites, @Nullable SoundEvent soundEvent) {
throw new AssertionError("Untransformed accessor!");
}
}

View File

@@ -2,4 +2,6 @@ accessWidener v1 named
extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Ljava/util/function/Function;)V extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Ljava/util/function/Function;)V
extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Lnet/minecraft/block/MapColor;)V extendable method net/minecraft/block/AbstractBlock$Settings <init> (Lnet/minecraft/block/Material;Lnet/minecraft/block/MapColor;)V
accessible method net/minecraft/class_7477 method_43993 (Lnet/minecraft/util/registry/Registry;Lnet/minecraft/util/registry/RegistryKey;Ljava/util/Set;II)Lnet/minecraft/world/poi/PointOfInterestType;
extendable class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory extendable class net/minecraft/block/entity/BlockEntityType$BlockEntityFactory

View File

@@ -10,10 +10,8 @@
"DefaultAttributeRegistryMixin", "DefaultAttributeRegistryMixin",
"DetectorRailBlockMixin", "DetectorRailBlockMixin",
"MaterialBuilderAccessor", "MaterialBuilderAccessor",
"PointOfInterestTypeAccessor",
"SpawnRestrictionAccessor", "SpawnRestrictionAccessor",
"TypeAwareTradeMixin", "TypeAwareTradeMixin",
"VillagerProfessionAccessor",
"VillagerTypeAccessor" "VillagerTypeAccessor"
], ],
"client": [ "client": [

View File

@@ -16,6 +16,7 @@
package net.fabricmc.fabric.impl.resource.conditions; package net.fabricmc.fabric.impl.resource.conditions;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -30,7 +31,6 @@ import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import net.minecraft.tag.Tag;
import net.minecraft.tag.TagKey; import net.minecraft.tag.TagKey;
import net.minecraft.tag.TagManagerLoader; import net.minecraft.tag.TagManagerLoader;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
@@ -140,11 +140,11 @@ public class ResourceConditionsImpl {
* - any call to {@link #tagsPopulatedMatch} will check the tags from the failed reload instead of failing directly. * - any call to {@link #tagsPopulatedMatch} will check the tags from the failed reload instead of failing directly.
* This is probably acceptable. * This is probably acceptable.
*/ */
public static final ThreadLocal<Map<RegistryKey<?>, Map<Identifier, Tag<RegistryEntry<?>>>>> LOADED_TAGS = new ThreadLocal<>(); public static final ThreadLocal<Map<RegistryKey<?>, Map<Identifier, Collection<RegistryEntry<?>>>>> LOADED_TAGS = new ThreadLocal<>();
@SuppressWarnings({"unchecked", "rawtypes"}) @SuppressWarnings({"unchecked", "rawtypes"})
public static void setTags(List<TagManagerLoader.RegistryTags<?>> tags) { public static void setTags(List<TagManagerLoader.RegistryTags<?>> tags) {
Map<RegistryKey<?>, Map<Identifier, Tag<RegistryEntry<?>>>> tagMap = new HashMap<>(); Map<RegistryKey<?>, Map<Identifier, Collection<RegistryEntry<?>>>> tagMap = new HashMap<>();
for (TagManagerLoader.RegistryTags<?> registryTags : tags) { for (TagManagerLoader.RegistryTags<?> registryTags : tags) {
tagMap.put(registryTags.key(), (Map) registryTags.tags()); tagMap.put(registryTags.key(), (Map) registryTags.tags());
@@ -160,14 +160,14 @@ public class ResourceConditionsImpl {
public static <T> boolean tagsPopulatedMatch(JsonObject object, RegistryKey<? extends Registry<T>> registryKey) { public static <T> boolean tagsPopulatedMatch(JsonObject object, RegistryKey<? extends Registry<T>> registryKey) {
JsonArray array = JsonHelper.getArray(object, "values"); JsonArray array = JsonHelper.getArray(object, "values");
@Nullable @Nullable
Map<RegistryKey<?>, Map<Identifier, Tag<RegistryEntry<?>>>> allTags = LOADED_TAGS.get(); Map<RegistryKey<?>, Map<Identifier, Collection<RegistryEntry<?>>>> allTags = LOADED_TAGS.get();
if (allTags == null) { if (allTags == null) {
LOGGER.warn("Can't retrieve deserialized tags. Failing tags_populated resource condition check."); LOGGER.warn("Can't retrieve deserialized tags. Failing tags_populated resource condition check.");
return false; return false;
} }
Map<Identifier, Tag<RegistryEntry<?>>> registryTags = allTags.get(registryKey); Map<Identifier, Collection<RegistryEntry<?>>> registryTags = allTags.get(registryKey);
if (registryTags == null) { if (registryTags == null) {
// No tag for this registry // No tag for this registry
@@ -177,9 +177,9 @@ public class ResourceConditionsImpl {
for (JsonElement element : array) { for (JsonElement element : array) {
if (element.isJsonPrimitive()) { if (element.isJsonPrimitive()) {
Identifier id = new Identifier(element.getAsString()); Identifier id = new Identifier(element.getAsString());
Tag<RegistryEntry<?>> tag = registryTags.get(id); Collection<RegistryEntry<?>> tags = registryTags.get(id);
if (tag == null || tag.values().isEmpty()) { if (tags == null || tags.isEmpty()) {
return false; return false;
} }
} else { } else {

View File

@@ -1,9 +1,9 @@
org.gradle.jvmargs=-Xmx2560M org.gradle.jvmargs=-Xmx2560M
version=0.52.1 version=0.52.2
minecraft_version=22w18a minecraft_version=22w19a
yarn_version=+build.3 yarn_version=+build.1
loader_version=0.14.4 loader_version=0.14.5
prerelease=true prerelease=true
@@ -12,12 +12,12 @@ fabric-api-base-version=0.4.6
fabric-api-lookup-api-v1-version=1.6.2 fabric-api-lookup-api-v1-version=1.6.2
fabric-biome-api-v1-version=9.0.6 fabric-biome-api-v1-version=9.0.6
fabric-blockrenderlayer-v1-version=1.1.14 fabric-blockrenderlayer-v1-version=1.1.14
fabric-command-api-v1-version=1.1.15 fabric-command-api-v1-version=1.1.16
fabric-commands-v0-version=0.2.14 fabric-commands-v0-version=0.2.15
fabric-containers-v0-version=0.1.23 fabric-containers-v0-version=0.1.23
fabric-content-registries-v0-version=3.0.10 fabric-content-registries-v0-version=3.0.10
fabric-crash-report-info-v1-version=0.1.12 fabric-crash-report-info-v1-version=0.1.12
fabric-data-generation-api-v1-version=3.0.5 fabric-data-generation-api-v1-version=4.0.0
fabric-dimensions-v1-version=2.1.21 fabric-dimensions-v1-version=2.1.21
fabric-entity-events-v1-version=1.4.13 fabric-entity-events-v1-version=1.4.13
fabric-events-interaction-v0-version=0.4.23 fabric-events-interaction-v0-version=0.4.23
@@ -34,7 +34,7 @@ fabric-mining-level-api-v1-version=2.1.2
fabric-models-v0-version=0.3.10 fabric-models-v0-version=0.3.10
fabric-networking-api-v1-version=1.0.23 fabric-networking-api-v1-version=1.0.23
fabric-networking-v0-version=0.3.10 fabric-networking-v0-version=0.3.10
fabric-object-builder-api-v1-version=3.1.3 fabric-object-builder-api-v1-version=4.0.0
fabric-particles-v1-version=1.0.3 fabric-particles-v1-version=1.0.3
fabric-registry-sync-v0-version=0.9.11 fabric-registry-sync-v0-version=0.9.11
fabric-renderer-api-v1-version=1.0.3 fabric-renderer-api-v1-version=1.0.3
@@ -44,11 +44,11 @@ fabric-rendering-data-attachment-v1-version=0.3.9
fabric-rendering-fluids-v1-version=3.0.1 fabric-rendering-fluids-v1-version=3.0.1
fabric-rendering-v0-version=1.1.16 fabric-rendering-v0-version=1.1.16
fabric-rendering-v1-version=1.10.10 fabric-rendering-v1-version=1.10.10
fabric-resource-conditions-api-v1-version=2.0.4 fabric-resource-conditions-api-v1-version=2.0.5
fabric-resource-loader-v0-version=0.4.25 fabric-resource-loader-v0-version=0.4.25
fabric-screen-api-v1-version=1.0.18 fabric-screen-api-v1-version=1.0.18
fabric-screen-handler-api-v1-version=1.2.2 fabric-screen-handler-api-v1-version=1.2.2
fabric-textures-v0-version=1.0.14 fabric-textures-v0-version=1.0.14
fabric-transfer-api-v1-version=2.0.1 fabric-transfer-api-v1-version=2.0.1
fabric-transitive-access-wideners-v1-version=1.0.3 fabric-transitive-access-wideners-v1-version=1.0.3
fabric-convention-tags-v1-version=1.0.3 fabric-convention-tags-v1-version=1.0.4

View File

@@ -16,7 +16,7 @@
"FabricMC" "FabricMC"
], ],
"depends": { "depends": {
"fabricloader": ">=0.14.3", "fabricloader": ">=0.14.5",
"java": ">=17", "java": ">=17",
"minecraft": "~1.19-alpha.22.18.a" "minecraft": "~1.19-alpha.22.18.a"
}, },