User Tools

Site Tools


drafts:resourceconditions

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
drafts:resourceconditions [2026/03/03 23:27] – code examples infinitychancesdrafts:resourceconditions [2026/03/20 17:27] (current) – changed example again to not require build script changes infinitychances
Line 212: Line 212:
 </code> </code>
  
 +===== Usage in Datagen =====
 +This section will assume you have already set up a basic datagen setup. It will use recipes as an example.
 +
 +We will create a recipe that creates a minecart with copper if the minecart improvements experiment is enabled.
 +
 +Next, we can go into our recipe provider and begin.
 +<code java [enable_line_numbers="true"]>
 +public class ModRecipeProvider extends FabricRecipeProvider {
 +   ...
 +
 + @Override
 + protected RecipeProvider createRecipeProvider(HolderLookup.Provider provider, RecipeOutput output) {
 + return new RecipeProvider(provider, output) {
 + @Override
 + public void buildRecipes() {
 + shaped(RecipeCategory.MISC, Items.MINECART)
 + .pattern("c c")
 + .pattern("ccc")
 + .define('c', Items.COPPER_INGOT)
 + .unlockedBy(getHasName(Items.COPPER_INGOT), has(Items.COPPER_INGOT))
 + .save(withConditions(output, new FeaturesEnabledResourceCondition(Identifier.withDefaultNamespace("minecart_improvements");
 + };
 + }
 +}
 +</code>
 +The important part of this is when we call the save function. We can wrap our RecipeOutput with the withConditions method provided by FabricRecipeProvider, which allows us to place as many conditions as we want.
 +The result will be this:
 +<code >
 +{
 +  "fabric:load_conditions": [
 +    {
 +      "condition": "fabric:features_enabled",
 +      "features": [
 +        "minecraft:minecart_improvements"
 +      ] 
 +    }
 +  ],
 +  "type": "minecraft:crafting_shaped",
 +  "category": "misc",
 +  "key": {
 +    "c": "minecraft:copper_ingot",
 +  },
 +  "pattern": [
 +    "c c",
 +    "ccc"
 +  ],
 +  "result": {
 +    "count": 1,
 +    "id": "minecraft:minecart"
 +  }
 +}
 +</code>
 +===== Making A Custom Condition =====
 +There are two things you need to do to make a custom condition: 1. Create the class and logic for it. 2. Register it.
 +
 +We are going to make a FalseResourceCondition.
 +To begin, we must have our class implement ResourceCondition.
 +We can make a codec through MapCodec.unit, and we will return to the getType method.
 +The test method is where all the logic happens. It passes in a RegistryInfoLookup, which can get you a RegistryInfo from a ResourceKey.
 +For our use, we do not need it. We can just return false.
 +Your class should currently look something like this:
 +<code java [enable_line_numbers="true"]>
 +public class FalseResourceCondition implements ResourceCondition {
 +    public static final MapCodec<FalseResourceCondition> CODEC = MapCodec.unit(FalseResourceCondition::new);
 +
 +    public ResourceConditionType<?> getType() {
 +        return TYPE_HERE;
 +    }
 +
 +    public boolean test(RegistryOps.@Nullable RegistryInfoLookup registryInfo) {
 +        return false;
 +    }
 +}
 +</code>
 +
 +Now, we must register the condition. You can refer to DefaultResourceConditionTypes to see how they are done.
 +A register method will look something like this: 
 +<code java>
 +protected static <T extends ResourceCondition> ResourceConditionType<T> createResourceConditionType(String name, MapCodec<T> codec) {
 + return ResourceConditionType.create(Identifier.fromNamespaceAndPath("tutorial", name), codec);
 +}
 +</code>
 +For name, we can pass in "false", and codec is our ''FalseResourceCondition.CODEC''.
 +In your ''ModInitializer'', do something like this: 
 +<code java>
 +public static ResourceConditionType<FalseResourceCondition> FALSE;
 + 
 +@Override
 +public void onInitialize() {
 + FALSE = createResourceConditionType("false", FalseResourceCondition.CODEC)
 + // ...
 +}
 +
 +protected static <T extends ResourceCondition> ResourceConditionType<T> createResourceConditionType(String name, MapCodec<T> codec) {
 + return ResourceConditionType.create(Identifier.fromNamespaceAndPath("tutorial", name), codec);
 +}
 + 
 +// ...
 +</code>
 +Now, replace TYPE_HERE with the new condition type.
drafts/resourceconditions.1772580458.txt.gz · Last modified: 2026/03/03 23:27 by infinitychances