Skip to content

Commit

Permalink
Move modifier set worktable recipes to using modifier predicates
Browse files Browse the repository at this point in the history
Will make slimestaff stuff easier in the future
  • Loading branch information
KnightMiner committed Jan 4, 2023
1 parent 888fb99 commit 98a9e08
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@
"nbt": "{Potion:\"minecraft:invisibility\"}"
}
],
"blacklist": "tconstruct:invisible_ink_blacklist",
"modifier_predicate": {
"type": "tconstruct:inverted",
"predicate": {
"type": "tconstruct:tag",
"tag": "tconstruct:invisible_ink_blacklist"
}
},
"add_to_set": true
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
}
}
],
"blacklist": "tconstruct:invisible_ink_blacklist",
"modifier_predicate": {
"type": "tconstruct:inverted",
"predicate": {
"type": "tconstruct:tag",
"tag": "tconstruct:invisible_ink_blacklist"
}
},
"add_to_set": false
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@
import net.minecraft.tags.TagKey;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.item.crafting.RecipeSerializer;
import slimeknights.mantle.data.predicate.IJsonPredicate;
import slimeknights.mantle.recipe.helper.LoggingRecipeSerializer;
import slimeknights.mantle.recipe.ingredient.SizedIngredient;
import slimeknights.mantle.util.JsonHelper;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.library.json.predicate.modifier.ModifierPredicate;
import slimeknights.tconstruct.library.json.predicate.modifier.TagModifierPredicate;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierEntry;
import slimeknights.tconstruct.library.modifiers.ModifierId;
Expand Down Expand Up @@ -54,23 +57,29 @@ public class ModifierSetWorktableRecipe extends AbstractWorktableRecipe {
private final Component description;
/** Key of the set to fill with modifier names */
private final ResourceLocation dataKey;
/** Tag matching entries that should not be added or removed */
private final TagKey<Modifier> blacklist;
/** Predicate of modifiers to support in this recipe */
private final IJsonPredicate<ModifierId> modifierPredicate;
/** Filter of modifiers to display */
private final Predicate<ModifierEntry> entryFilter;
/** If true, adds the matched modifier to the set, if false removes it */
private final boolean addToSet;
/** Cached list of modifiers shown in JEI */
private List<ModifierEntry> filteredModifiers = null;
public ModifierSetWorktableRecipe(ResourceLocation id, ResourceLocation dataKey, List<SizedIngredient> inputs, TagKey<Modifier> blacklist, boolean addToSet) {
public ModifierSetWorktableRecipe(ResourceLocation id, ResourceLocation dataKey, List<SizedIngredient> inputs, IJsonPredicate<ModifierId> modifierPredicate, boolean addToSet) {
super(id, inputs);
this.dataKey = dataKey;
this.addToSet = addToSet;
String rootKey = Util.makeTranslationKey("recipe", dataKey) + (addToSet ? ".adding" : ".removing");
this.title = new TranslatableComponent(rootKey + ".title");
this.description = new TranslatableComponent(rootKey + ".description");
this.blacklist = blacklist;
this.entryFilter = entry -> !entry.matches(blacklist);
this.modifierPredicate = modifierPredicate;
this.entryFilter = entry -> modifierPredicate.matches(entry.getId());
}

/** @deprecated use {@link #ModifierSetWorktableRecipe(ResourceLocation, ResourceLocation, List, IJsonPredicate, boolean)} */
@Deprecated
public ModifierSetWorktableRecipe(ResourceLocation id, ResourceLocation dataKey, List<SizedIngredient> inputs, TagKey<Modifier> blacklist, boolean addToSet) {
this(id, dataKey, inputs, new TagModifierPredicate(blacklist).inverted(), addToSet);
}

@Override
Expand Down Expand Up @@ -138,9 +147,16 @@ public static class Serializer extends LoggingRecipeSerializer<ModifierSetWorkta
public ModifierSetWorktableRecipe fromJson(ResourceLocation id, JsonObject json) {
ResourceLocation dataKey = JsonHelper.getResourceLocation(json, "data_key");
List<SizedIngredient> ingredients = JsonHelper.parseList(json, "inputs", SizedIngredient::deserialize);
TagKey<Modifier> blacklist = ModifierManager.getTag(JsonHelper.getResourceLocation(json, "blacklist"));
IJsonPredicate<ModifierId> modifierPredicate = ModifierPredicate.ALWAYS;
if (json.has("modifier_predicate")) {
modifierPredicate = ModifierPredicate.LOADER.getAndDeserialize(json, "modifier_predicate");
} else if (json.has("blacklist")) {
// TODO: drop backwards compat in 1.19
modifierPredicate = new TagModifierPredicate(ModifierManager.getTag(JsonHelper.getResourceLocation(json, "blacklist"))).inverted();
TConstruct.LOG.info("Recipe " + id + " is using deprecated blacklist key, this will be removed in 1.19");
}
boolean addToSet = GsonHelper.getAsBoolean(json, "add_to_set");
return new ModifierSetWorktableRecipe(id, dataKey, ingredients, blacklist, addToSet);
return new ModifierSetWorktableRecipe(id, dataKey, ingredients, modifierPredicate, addToSet);
}

@Nullable
Expand All @@ -152,9 +168,9 @@ protected ModifierSetWorktableRecipe fromNetworkSafe(ResourceLocation id, Friend
for (int i = 0; i < size; i++) {
ingredients.add(SizedIngredient.read(buffer));
}
TagKey<Modifier> blacklist = ModifierManager.getTag(buffer.readResourceLocation());
IJsonPredicate<ModifierId> modifierPredicate = ModifierPredicate.LOADER.fromNetwork(buffer);
boolean addToSet = buffer.readBoolean();
return new ModifierSetWorktableRecipe(id, dataKey, ingredients.build(), blacklist, addToSet);
return new ModifierSetWorktableRecipe(id, dataKey, ingredients.build(), modifierPredicate, addToSet);
}

@Override
Expand All @@ -164,7 +180,7 @@ protected void toNetworkSafe(FriendlyByteBuf buffer, ModifierSetWorktableRecipe
for (SizedIngredient ingredient : recipe.inputs) {
ingredient.write(buffer);
}
buffer.writeResourceLocation(recipe.blacklist.location());
ModifierPredicate.LOADER.toNetwork(recipe.modifierPredicate, buffer);
buffer.writeBoolean(recipe.addToSet);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,53 @@

import com.google.gson.JsonObject;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.experimental.Accessors;
import net.minecraft.data.recipes.FinishedRecipe;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
import net.minecraft.world.item.crafting.RecipeSerializer;
import slimeknights.mantle.data.predicate.IJsonPredicate;
import slimeknights.tconstruct.library.json.predicate.modifier.ModifierPredicate;
import slimeknights.tconstruct.library.json.predicate.modifier.TagModifierPredicate;
import slimeknights.tconstruct.library.modifiers.Modifier;
import slimeknights.tconstruct.library.modifiers.ModifierId;
import slimeknights.tconstruct.tools.TinkerModifiers;

import javax.annotation.Nullable;
import java.util.function.Consumer;

/** Builder for recipes to add or remove a modifier from a set in persistent data */
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ModifierSetWorktableRecipeBuilder extends AbstractSizedIngredientRecipeBuilder<ModifierSetWorktableRecipeBuilder> {
private final ResourceLocation dataKey;
private final TagKey<Modifier> blacklist;
@Setter @Accessors(fluent = true)
private IJsonPredicate<ModifierId> modifierPredicate = ModifierPredicate.ALWAYS;
private final boolean addToSet;

/** Creates a new recipe for adding to a set */
/** @deprecated use {@link #setAdding(ResourceLocation)} and {@link #modifierPredicate(IJsonPredicate)} */
@Deprecated
public static ModifierSetWorktableRecipeBuilder setAdding(ResourceLocation dataKey, TagKey<Modifier> blacklist) {
return new ModifierSetWorktableRecipeBuilder(dataKey, blacklist, true);
return new ModifierSetWorktableRecipeBuilder(dataKey, new TagModifierPredicate(blacklist).inverted(), true);
}

/** Creates a new recipe for removing from a set */
/** @deprecated use {@link #setRemoving(ResourceLocation)} and {@link #modifierPredicate(IJsonPredicate)} */
@Deprecated
public static ModifierSetWorktableRecipeBuilder setRemoving(ResourceLocation dataKey, TagKey<Modifier> blacklist) {
return new ModifierSetWorktableRecipeBuilder(dataKey, blacklist, false);
return new ModifierSetWorktableRecipeBuilder(dataKey, new TagModifierPredicate(blacklist).inverted(), false);
}

/** Creates a new recipe for adding to a set */
public static ModifierSetWorktableRecipeBuilder setAdding(ResourceLocation dataKey) {
return new ModifierSetWorktableRecipeBuilder(dataKey, true);
}

/** Creates a new recipe for removing from a set */
public static ModifierSetWorktableRecipeBuilder setRemoving(ResourceLocation dataKey) {
return new ModifierSetWorktableRecipeBuilder(dataKey, false);
}

@Override
Expand All @@ -54,7 +75,7 @@ public Finished(ResourceLocation id, @Nullable ResourceLocation advancementId) {
public void serializeRecipeData(JsonObject json) {
json.addProperty("data_key", dataKey.toString());
super.serializeRecipeData(json);
json.addProperty("blacklist", blacklist.location().toString());
json.add("modifier_predicate", ModifierPredicate.LOADER.serialize(modifierPredicate));
json.addProperty("add_to_set", addToSet);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import net.minecraftforge.common.crafting.IntersectionIngredient;
import net.minecraftforge.common.crafting.PartialNBTIngredient;
import net.minecraftforge.fluids.FluidAttributes;
import slimeknights.mantle.data.predicate.IJsonPredicate;
import slimeknights.mantle.recipe.data.ItemNameIngredient;
import slimeknights.mantle.recipe.helper.ItemOutput;
import slimeknights.mantle.recipe.ingredient.EntityIngredient;
Expand Down Expand Up @@ -1304,11 +1305,13 @@ private void addModifierRecipes(Consumer<FinishedRecipe> consumer) {
.addInput(Items.COMPASS)
.save(consumer, modResource(worktableFolder + "modifier_sorting"));
ResourceLocation hiddenModifiers = TConstruct.getResource("invisible_modifiers");
TagKey<Modifier> blacklist = TinkerTags.Modifiers.INVISIBLE_INK_BLACKLIST;
ModifierSetWorktableRecipeBuilder.setAdding(hiddenModifiers, blacklist)
IJsonPredicate<ModifierId> blacklist = new TagModifierPredicate(TinkerTags.Modifiers.INVISIBLE_INK_BLACKLIST).inverted();
ModifierSetWorktableRecipeBuilder.setAdding(hiddenModifiers)
.modifierPredicate(blacklist)
.addInput(PartialNBTIngredient.of(Items.POTION, PotionUtils.setPotion(new ItemStack(Items.POTION), Potions.INVISIBILITY).getOrCreateTag()))
.save(consumer, modResource(worktableFolder + "invisible_ink_adding"));
ModifierSetWorktableRecipeBuilder.setRemoving(hiddenModifiers, blacklist)
ModifierSetWorktableRecipeBuilder.setRemoving(hiddenModifiers)
.modifierPredicate(blacklist)
.addInput(FluidContainerIngredient.fromIngredient(FluidIngredient.of(Fluids.MILK, FluidAttributes.BUCKET_VOLUME), Ingredient.of(Items.MILK_BUCKET)))
.save(consumer, modResource(worktableFolder + "invisible_ink_removing"));

Expand Down

0 comments on commit 98a9e08

Please sign in to comment.