Skip to content

Commit a380ea3

Browse files
authored
Add recipes for netherite tools (#4368)
1 parent 83ecd01 commit a380ea3

4 files changed

Lines changed: 111 additions & 1 deletion

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.gregtechceu.gtceu.core.mixins;
2+
3+
import com.gregtechceu.gtceu.api.item.IGTTool;
4+
import com.gregtechceu.gtceu.api.item.tool.ToolHelper;
5+
6+
import net.minecraft.core.RegistryAccess;
7+
import net.minecraft.nbt.CompoundTag;
8+
import net.minecraft.nbt.Tag;
9+
import net.minecraft.world.Container;
10+
import net.minecraft.world.item.ItemStack;
11+
import net.minecraft.world.item.crafting.SmithingTransformRecipe;
12+
13+
import com.llamalad7.mixinextras.sugar.Share;
14+
import com.llamalad7.mixinextras.sugar.ref.LocalRef;
15+
import org.spongepowered.asm.mixin.Final;
16+
import org.spongepowered.asm.mixin.Mixin;
17+
import org.spongepowered.asm.mixin.Shadow;
18+
import org.spongepowered.asm.mixin.injection.At;
19+
import org.spongepowered.asm.mixin.injection.Inject;
20+
import org.spongepowered.asm.mixin.injection.Redirect;
21+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
22+
23+
@Mixin(SmithingTransformRecipe.class)
24+
public class SmithingTransformRecipeMixin {
25+
26+
@Shadow
27+
@Final
28+
ItemStack result;
29+
30+
@Inject(method = "assemble",
31+
at = @At(value = "INVOKE",
32+
target = "Lnet/minecraft/world/item/ItemStack;setTag(Lnet/minecraft/nbt/CompoundTag;)V"))
33+
private void gtceu$gtToolSmithingTransform1(Container container, RegistryAccess registryAccess,
34+
CallbackInfoReturnable<ItemStack> cir,
35+
@Share("newTag") LocalRef<CompoundTag> sharedTag) {
36+
ItemStack output = this.result.copy();
37+
38+
if (!(output.getItem() instanceof IGTTool igtTool)) return;
39+
40+
CompoundTag originalTag = container.getItem(1).getTag();
41+
CompoundTag newTag = originalTag != null ? originalTag.copy() : null;
42+
if (newTag == null) return;
43+
44+
// Remove old tool stats
45+
newTag.remove("GT.Tool");
46+
47+
// Copy stats from the upgraded tool
48+
ItemStack newStack = ToolHelper.get(igtTool.getToolType(), igtTool.getMaterial());
49+
Tag newStats = newStack.getTag() != null ? newStack.getTag().get("GT.Tool") : null;
50+
if (newStats != null) {
51+
newTag.put("GT.Tool", newStats);
52+
sharedTag.set(newTag);
53+
}
54+
}
55+
56+
@Redirect(method = "assemble",
57+
at = @At(value = "INVOKE",
58+
target = "Lnet/minecraft/world/item/ItemStack;setTag(Lnet/minecraft/nbt/CompoundTag;)V"))
59+
private void gtceu$gtToolSmithingTransform2(ItemStack itemStack, CompoundTag tag,
60+
@Share("newTag") LocalRef<CompoundTag> sharedTag) {
61+
itemStack.setTag(sharedTag.get());
62+
}
63+
}

src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,13 @@
1010
import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialEntry;
1111
import com.gregtechceu.gtceu.api.data.chemical.material.stack.MaterialStack;
1212
import com.gregtechceu.gtceu.api.data.tag.TagPrefix;
13+
import com.gregtechceu.gtceu.api.item.tool.GTToolType;
1314
import com.gregtechceu.gtceu.api.item.tool.ToolHelper;
1415
import com.gregtechceu.gtceu.data.recipe.builder.*;
1516

1617
import net.minecraft.data.recipes.FinishedRecipe;
18+
import net.minecraft.data.recipes.RecipeCategory;
19+
import net.minecraft.data.recipes.SmithingTransformRecipeBuilder;
1720
import net.minecraft.resources.ResourceLocation;
1821
import net.minecraft.tags.TagKey;
1922
import net.minecraft.world.item.Item;
@@ -22,12 +25,16 @@
2225
import net.minecraft.world.level.ItemLike;
2326

2427
import com.tterrag.registrate.util.entry.ItemProviderEntry;
25-
import it.unimi.dsi.fastutil.chars.*;
28+
import it.unimi.dsi.fastutil.chars.Char2IntOpenHashMap;
29+
import it.unimi.dsi.fastutil.chars.CharArraySet;
30+
import it.unimi.dsi.fastutil.chars.CharSet;
2631
import it.unimi.dsi.fastutil.objects.Reference2LongOpenHashMap;
2732
import org.jetbrains.annotations.NotNull;
2833

2934
import java.util.function.Consumer;
3035

36+
import static com.tterrag.registrate.providers.RegistrateRecipeProvider.has;
37+
3138
public class VanillaRecipeHelper {
3239

3340
public static void addSmeltingRecipe(Consumer<FinishedRecipe> provider, @NotNull String regName, TagKey<Item> input,
@@ -618,6 +625,38 @@ public static void addShapelessRecipe(Consumer<FinishedRecipe> provider, @NotNul
618625
builder.save(provider);
619626
}
620627

628+
public static void addSmithingTransformRecipe(Consumer<FinishedRecipe> provider, @NotNull ResourceLocation regName,
629+
@NotNull Item result, @NotNull ItemLike baseInput,
630+
@NotNull ItemLike template, @NotNull ItemLike addition,
631+
@NotNull RecipeCategory category) {
632+
SmithingTransformRecipeBuilder
633+
.smithing(Ingredient.of(template), Ingredient.of(baseInput), Ingredient.of(addition), category, result)
634+
.unlocks(String.format("has_%s", baseInput), has(baseInput))
635+
.save(provider, regName);
636+
}
637+
638+
public static void addSmithingTransformRecipe(Consumer<FinishedRecipe> provider, @NotNull String regName,
639+
@NotNull Item result, @NotNull ItemLike baseInput,
640+
@NotNull ItemLike template, @NotNull ItemLike addition) {
641+
addSmithingTransformRecipe(provider, GTCEu.id(regName), result, baseInput, template, addition,
642+
RecipeCategory.MISC);
643+
}
644+
645+
public static void addToolUpgradingRecipe(@NotNull Consumer<FinishedRecipe> provider, @NotNull GTToolType tool,
646+
@NotNull Material upgradeMaterial, @NotNull Material baseMaterial,
647+
@NotNull ItemLike template, @NotNull ItemLike addition) {
648+
ItemStack upgradeToolStack = ToolHelper.get(tool, upgradeMaterial);
649+
ItemStack baseToolStack = ToolHelper.get(tool, baseMaterial);
650+
651+
if (upgradeToolStack.isEmpty() || baseToolStack.isEmpty()) return;
652+
653+
VanillaRecipeHelper.addSmithingTransformRecipe(provider,
654+
String.format("%s_%s_smithing_transform_from_%s", upgradeMaterial.getName(), tool.name,
655+
baseMaterial.getName()),
656+
upgradeToolStack.getItem(), baseToolStack.getItem(),
657+
template, addition);
658+
}
659+
621660
/**
622661
* @param material the material to check
623662
* @return if the material is a wood

src/main/java/com/gregtechceu/gtceu/data/recipe/generated/ToolRecipeHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,8 @@ private static void processTool(@NotNull Consumer<FinishedRecipe> provider, @Not
201201
GTCEu.LOGGER.warn("Did not find rod for " + material.getName() +
202202
", skipping wirecutter, butchery knife, screwdriver, crowbar recipes");
203203
}
204+
205+
GTToolType.getTypes().forEach((s, gtToolType) -> addNetheriteToolRecipe(provider, gtToolType));
204206
}
205207

206208
private static void processElectricTool(@NotNull Consumer<FinishedRecipe> provider, @NotNull ToolProperty property,
@@ -356,6 +358,11 @@ public static void addToolRecipe(@NotNull Consumer<FinishedRecipe> provider, @No
356358
}
357359
}
358360

361+
public static void addNetheriteToolRecipe(@NotNull Consumer<FinishedRecipe> provider, @NotNull GTToolType tool) {
362+
VanillaRecipeHelper.addToolUpgradingRecipe(provider, tool, GTMaterials.Netherite, GTMaterials.Diamond,
363+
Items.NETHERITE_UPGRADE_SMITHING_TEMPLATE, ChemicalHelper.get(ingot, GTMaterials.Netherite).getItem());
364+
}
365+
359366
public static void addArmorRecipe(Consumer<FinishedRecipe> provider, @NotNull Material material,
360367
@NotNull ArmorItem.Type armor, Object... recipe) {
361368
ItemStack armorStack = ToolHelper.getArmor(armor, material);

src/main/resources/gtceu.mixins.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
"ServerGamePacketListenerImplAccessor",
5858
"ShapedRecipeAccessor",
5959
"SidedRedstoneConnectivityMixin",
60+
"SmithingTransformRecipeMixin",
6061
"TagLoaderMixin",
6162
"TagManagerMixin",
6263
"TagValueAccessor",

0 commit comments

Comments
 (0)