Skip to content

Commit

Permalink
Fix dupe with daggers modifier extraction or tool recycling
Browse files Browse the repository at this point in the history
Since you get 2 at a time and can modify 2 at once, you now must use 2 when extracting or recycling
  • Loading branch information
KnightMiner committed Feb 21, 2023
1 parent 8511d14 commit be7b23a
Show file tree
Hide file tree
Showing 22 changed files with 269 additions and 23 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"type": "tconstruct:part_builder_tool_recycling",
"tools": {
"item": "tconstruct:dagger",
"amount_needed": 2
},
"pattern": {
"tag": "tconstruct:patterns"
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
{
"type": "tconstruct:part_builder_tool_recycling",
"tools": {
"type": "forge:difference",
"base": {
"tag": "tconstruct:modifiable/multipart"
},
"subtracted": {
"tag": "tconstruct:modifiable/unsalvageable"
}
},
"pattern": {
"tag": "tconstruct:patterns"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"type": "tconstruct:extract_modifier",
"inputs": [
{
"item": "tconstruct:ender_slime_crystal"
},
{
"item": "minecraft:dragon_breath",
"amount_needed": 5
}
],
"tools": {
"item": "tconstruct:dagger",
"amount_needed": 2
},
"modifier_predicate": {
"type": "tconstruct:inverted",
"predicate": {
"type": "tconstruct:tag",
"tag": "tconstruct:extract_blacklist/tools"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"type": "tconstruct:extract_modifier",
"inputs": [
{
"item": "tconstruct:ender_slime_crystal"
},
{
"item": "minecraft:wet_sponge"
}
],
"tools": {
"item": "tconstruct:dagger",
"amount_needed": 2
},
"leftovers": [
"minecraft:sponge"
],
"modifier_predicate": {
"type": "tconstruct:inverted",
"predicate": {
"type": "tconstruct:tag",
"tag": "tconstruct:extract_blacklist/tools"
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,15 @@
"amount_needed": 5
}
],
"tools": {
"type": "forge:difference",
"base": {
"tag": "tconstruct:modifiable"
},
"subtracted": {
"tag": "tconstruct:modifiable/unsalvageable"
}
},
"modifier_predicate": {
"type": "tconstruct:inverted",
"predicate": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,15 @@
"item": "minecraft:wet_sponge"
}
],
"tools": {
"type": "forge:difference",
"base": {
"tag": "tconstruct:modifiable"
},
"subtracted": {
"tag": "tconstruct:modifiable/unsalvageable"
}
},
"leftovers": [
"minecraft:sponge"
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
"item": "minecraft:wet_sponge"
}
],
"tools": {
"tag": "tconstruct:modifiable"
},
"leftovers": [
"minecraft:sponge"
],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,9 @@
]
}
],
"tools": {
"tag": "tconstruct:modifiable"
},
"modifier_predicate": {
"type": "tconstruct:always"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"replace": false,
"values": [
"tconstruct:dagger"
]
}
2 changes: 2 additions & 0 deletions src/main/java/slimeknights/tconstruct/common/TinkerTags.java
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,8 @@ private static void init() {}
public static final TagKey<Item> EMBELLISHMENT_SLIME = tag("modifiable/embellishment/slime");
/** Tools that can be dyed */
public static final TagKey<Item> DYEABLE = tag("modifiable/dyeable");
/** Tools to blacklist from default salvage recipes. May still be salvagable in other recipes */
public static final TagKey<Item> UNSALVAGABLE = tag("modifiable/unsalvageable");

/** Tag so mods like thermal know our scyhtes can harvest */
public static final TagKey<Item> SCYTHES = forgeTag("tools/scythe");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
import static slimeknights.tconstruct.common.TinkerTags.Items.SWORD;
import static slimeknights.tconstruct.common.TinkerTags.Items.TWO_HANDED;
import static slimeknights.tconstruct.common.TinkerTags.Items.UNARMED;
import static slimeknights.tconstruct.common.TinkerTags.Items.UNSALVAGABLE;
import static slimeknights.tconstruct.common.TinkerTags.Items.WORN_ARMOR;

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -235,7 +236,7 @@ private void addTools() {
addToolTags(TinkerTools.kama, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, MELEE, ONE_HANDED, AOE);
addToolTags(TinkerTools.scythe, MULTIPART_TOOL, DURABILITY, HARVEST_PRIMARY, MELEE_PRIMARY, ONE_HANDED, AOE);
// sword
addToolTags(TinkerTools.dagger, MULTIPART_TOOL, DURABILITY, HARVEST, MELEE_PRIMARY, ONE_HANDED, PARRY);
addToolTags(TinkerTools.dagger, MULTIPART_TOOL, DURABILITY, HARVEST, MELEE_PRIMARY, ONE_HANDED, PARRY, UNSALVAGABLE);
addToolTags(TinkerTools.sword, MULTIPART_TOOL, DURABILITY, HARVEST, MELEE_PRIMARY, ONE_HANDED, SWORD, AOE);
addToolTags(TinkerTools.cleaver, MULTIPART_TOOL, DURABILITY, HARVEST, MELEE_PRIMARY, ONE_HANDED, SWORD, AOE);
// bow
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
import java.util.Collections;
import java.util.List;

/** Default implementation of modifier worktable recipes, taking a list of inputs */
/**
* Default implementation of modifier worktable recipes, taking a list of inputs
* TODO 1.19: switch to sized ingredient
*/
@RequiredArgsConstructor
public abstract class AbstractWorktableRecipe implements IModifierWorktableRecipe {
@Getter
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@
import net.minecraftforge.common.crafting.DifferenceIngredient;
import net.minecraftforge.common.crafting.NBTIngredient;
import slimeknights.mantle.recipe.crafting.ShapedRetexturedRecipeBuilder;
import slimeknights.mantle.recipe.ingredient.SizedIngredient;
import slimeknights.tconstruct.common.TinkerTags;
import slimeknights.tconstruct.common.data.BaseRecipeProvider;
import slimeknights.tconstruct.smeltery.TinkerSmeltery;
import slimeknights.tconstruct.tables.TinkerTables;
import slimeknights.tconstruct.tables.recipe.PartBuilderToolRecycle;
import slimeknights.tconstruct.tables.recipe.TinkerStationDamagingRecipe;
import slimeknights.tconstruct.tools.TinkerTools;

import java.util.function.Consumer;

Expand Down Expand Up @@ -200,7 +202,16 @@ protected void buildCraftingRecipes(Consumer<FinishedRecipe> consumer) {
.build(consumer, modResource(folder + "scorched_forge"));

// recycling singleton
consumer.accept(new PartBuilderToolRecycle.Finished(modResource(folder + "tool_recycling"), Ingredient.of(TinkerTags.Items.PATTERNS)));
consumer.accept(new PartBuilderToolRecycle.Finished(
modResource(folder + "tool_recycling"),
SizedIngredient.of(DifferenceIngredient.of(Ingredient.of(TinkerTags.Items.MULTIPART_TOOL), Ingredient.of(TinkerTags.Items.UNSALVAGABLE))),
Ingredient.of(TinkerTags.Items.PATTERNS)
));
consumer.accept(new PartBuilderToolRecycle.Finished(
modResource(folder + "dagger_recycling"),
SizedIngredient.fromItems(2, TinkerTools.dagger),
Ingredient.of(TinkerTags.Items.PATTERNS)
));

// tool repair recipe
SpecialRecipeBuilder.special(TinkerTables.tinkerStationRepairSerializer.get())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.GsonHelper;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.RecipeSerializer;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.Nullable;
import slimeknights.mantle.recipe.helper.LoggingRecipeSerializer;
import slimeknights.mantle.recipe.ingredient.SizedIngredient;
import slimeknights.mantle.util.JsonHelper;
import slimeknights.tconstruct.TConstruct;
import slimeknights.tconstruct.common.TinkerTags;
Expand Down Expand Up @@ -50,8 +52,15 @@ public class PartBuilderToolRecycle implements IPartBuilderRecipe {
private static final Pattern ERROR = new Pattern(TConstruct.MOD_ID, "missingno");
@Getter
private final ResourceLocation id;
private final SizedIngredient toolRequirement;
private final Ingredient pattern;

/** @deprecated use {@link #PartBuilderToolRecycle(ResourceLocation, SizedIngredient, Ingredient)} */
@Deprecated
public PartBuilderToolRecycle(ResourceLocation id, Ingredient pattern) {
this(id, SizedIngredient.fromTag(TinkerTags.Items.MULTIPART_TOOL), pattern);
}

@Override
public Pattern getPattern() {
return ERROR;
Expand All @@ -75,12 +84,12 @@ public int getCost() {

@Override
public int getItemsUsed(IPartBuilderContainer inv) {
return 1;
return toolRequirement.getAmountNeeded();
}

@Override
public boolean partialMatch(IPartBuilderContainer inv) {
return pattern.test(inv.getPatternStack()) && inv.getStack().is(TinkerTags.Items.MULTIPART_TOOL);
return pattern.test(inv.getPatternStack()) && toolRequirement.test(inv.getStack());
}

@Override
Expand Down Expand Up @@ -173,29 +182,44 @@ public List<Component> getText(IPartBuilderContainer inv) {
public static class Serializer extends LoggingRecipeSerializer<PartBuilderToolRecycle> {
@Override
public PartBuilderToolRecycle fromJson(ResourceLocation id, JsonObject json) {
return new PartBuilderToolRecycle(id, Ingredient.fromJson(JsonHelper.getElement(json, "pattern")));
SizedIngredient tools;
if (json.has("tools")) {
tools = SizedIngredient.deserialize(GsonHelper.getAsJsonObject(json, "tools"));
} else {
tools = SizedIngredient.fromTag(TinkerTags.Items.MULTIPART_TOOL);
}
return new PartBuilderToolRecycle(id, tools, Ingredient.fromJson(JsonHelper.getElement(json, "pattern")));
}

@Override
protected void toNetworkSafe(FriendlyByteBuf buffer, PartBuilderToolRecycle recipe) {
recipe.toolRequirement.write(buffer);
recipe.pattern.toNetwork(buffer);
}

@Nullable
@Override
protected PartBuilderToolRecycle fromNetworkSafe(ResourceLocation id, FriendlyByteBuf buffer) {
return new PartBuilderToolRecycle(id, Ingredient.fromNetwork(buffer));
return new PartBuilderToolRecycle(id, SizedIngredient.read(buffer), Ingredient.fromNetwork(buffer));
}
}

@RequiredArgsConstructor
public static class Finished implements FinishedRecipe {
@Getter
private final ResourceLocation id;
private final SizedIngredient tools;
private final Ingredient pattern;

/** @deprecated use {@link #Finished(ResourceLocation, SizedIngredient, Ingredient)} */
@Deprecated
public Finished(ResourceLocation id, Ingredient pattern) {
this(id, SizedIngredient.fromTag(TinkerTags.Items.MULTIPART_TOOL), pattern);
}

@Override
public void serializeRecipeData(JsonObject json) {
json.add("tools", tools.serialize());
json.add("pattern", pattern.toJson());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1424,17 +1424,34 @@ private void addModifierRecipes(Consumer<FinishedRecipe> consumer) {
FluidContainerIngredient.fromIngredient(FluidIngredient.of(TinkerFluids.venom.getLocalTag(), FluidValues.BOTTLE),
Ingredient.of(TinkerFluids.venomBottle))))
.save(consumer, modResource(worktableFolder + "remove_modifier_venom"));
// non-dagger extracting
ModifierRemovalRecipe.Builder.removal(TinkerModifiers.extractModifierSerializer.get())
.setTools(DifferenceIngredient.of(Ingredient.of(TinkerTags.Items.MODIFIABLE), Ingredient.of(TinkerTags.Items.UNSALVAGABLE)))
.addInput(TinkerWorld.enderGeode)
.addInput(Items.DRAGON_BREATH, 5)
.modifierPredicate(new TagModifierPredicate(TinkerTags.Modifiers.EXTRACT_MODIFIER_BLACKLIST).inverted())
.save(consumer, modResource(worktableFolder + "extract_modifier_breath"));
ModifierRemovalRecipe.Builder.removal(TinkerModifiers.extractModifierSerializer.get())
.setTools(DifferenceIngredient.of(Ingredient.of(TinkerTags.Items.MODIFIABLE), Ingredient.of(TinkerTags.Items.UNSALVAGABLE)))
.addInput(TinkerWorld.enderGeode)
.addInput(Items.WET_SPONGE)
.addLeftover(Items.SPONGE)
.modifierPredicate(new TagModifierPredicate(TinkerTags.Modifiers.EXTRACT_MODIFIER_BLACKLIST).inverted())
.save(consumer, modResource(worktableFolder + "extract_modifier_sponge"));
// dagger extracting
ModifierRemovalRecipe.Builder.removal(TinkerModifiers.extractModifierSerializer.get())
.setTools(SizedIngredient.fromItems(2, TinkerTools.dagger))
.addInput(TinkerWorld.enderGeode)
.addInput(Items.DRAGON_BREATH, 5)
.modifierPredicate(new TagModifierPredicate(TinkerTags.Modifiers.EXTRACT_MODIFIER_BLACKLIST).inverted())
.save(consumer, modResource(worktableFolder + "extract_dagger_modifier_breath"));
ModifierRemovalRecipe.Builder.removal(TinkerModifiers.extractModifierSerializer.get())
.setTools(SizedIngredient.fromItems(2, TinkerTools.dagger))
.addInput(TinkerWorld.enderGeode)
.addInput(Items.WET_SPONGE)
.addLeftover(Items.SPONGE)
.modifierPredicate(new TagModifierPredicate(TinkerTags.Modifiers.EXTRACT_MODIFIER_BLACKLIST).inverted())
.save(consumer, modResource(worktableFolder + "extract_dagger_modifier_sponge"));
ModifierSortingRecipe.Builder.sorting()
.addInput(Items.COMPASS)
.save(consumer, modResource(worktableFolder + "modifier_sorting"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,16 @@ public class ExtractModifierRecipe extends ModifierRemovalRecipe {
private static final Component DESCRIPTION = TConstruct.makeTranslation("recipe", "extract_modifier.description");
private static final Component NO_MODIFIERS = TConstruct.makeTranslation("recipe", "extract_modifier.no_modifiers");

/** @deprecated use {#link #ExtractModifierRecipe(ResourceLocation, SizedIngredient, List, List, IJsonPredicate} */
@Deprecated
public ExtractModifierRecipe(ResourceLocation id, List<SizedIngredient> inputs, List<ItemStack> leftovers, IJsonPredicate<ModifierId> modifierPredicate) {
super(id, inputs, leftovers, modifierPredicate);
}

public ExtractModifierRecipe(ResourceLocation id, SizedIngredient toolRequirements, List<SizedIngredient> inputs, List<ItemStack> leftovers, IJsonPredicate<ModifierId> modifierPredicate) {
super(id,toolRequirements, inputs, leftovers, modifierPredicate);
}

@Override
public Component getTitle() {
return TITLE;
Expand Down

0 comments on commit be7b23a

Please sign in to comment.