本篇教程的视频:

本篇教程源代码

GitHub地址:TutorialMod-SmithingTransf-1.21

介绍

本篇教程也是由群友提供的代码,我们将通过Mixin的方式,让锻造台也支持耐久合成

从现实角度来讲,类似于工业锤的这种东西,可能更适合在锻造台上进行加工,但是原版的锻造台并不支持耐久合成,所以我们需要通过Mixin的方式来实现这个功能

锻造台耐久合成

创建SmithingRemainderHandler类

在写Mixin类之前,我们先创建一个SmithingRemainderHandler类,这个类是用来传值的

1
2
3
public class SmithingRemainderHandler {
public static final ThreadLocal<ItemStack> REMAINDER_STACK = new ThreadLocal<>();
}

这里就是设置一个ThreadLocalItemStack,用来存储合成后剩余的物品,当然这个只是临时储存

创建SmithingScreenHandlerMixin类

接下来我们创建一个Mixin类,目标类为SmithingScreenHandler,这个是锻造台的屏幕处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Mixin(SmithingScreenHandler.class)
public class SmithingScreenHandlerMixin {
@Inject(method = "decrementStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/item/ItemStack;isEmpty()Z"),
locals = LocalCapture.CAPTURE_FAILEXCEPTION)
private void captureItemStack(int slot, CallbackInfo ci, ItemStack itemStack) {
SmithingRemainderHandler.REMAINDER_STACK.set(itemStack.getRecipeRemainder());
}

@ModifyArg(method = "decrementStack", at = @At(value = "INVOKE", target = "Lnet/minecraft/inventory/Inventory;setStack(ILnet/minecraft/item/ItemStack;)V"),
index = 1)
private ItemStack replaceRemainder(ItemStack itemStack) {
ItemStack remainder = SmithingRemainderHandler.REMAINDER_STACK.get();
SmithingRemainderHandler.REMAINDER_STACK.remove();
return itemStack.isOf(Items.AIR) ? remainder : itemStack;
}
}

先看上面一个注入的方法,在decrementStack方法中,我们通过@Inject注解,将itemStack的值传给SmithingRemainderHandler.REMAINDER_STACK,也就是获取物品栏中的物品及其返还物,并通过上面的SmithingRemainderHandler类临时储存

然后再是下面一个方法

同样的目标方法,但位置不同,这里我们通过@ModifyArg注解,将itemStack替换为SmithingRemainderHandler.REMAINDER_STACK中的物品,也就是通过上面的方法临时储存的物品

如果itemStack为空,那么就返回SmithingRemainderHandler.REMAINDER_STACK中的物品,否则返回itemStack

当然,我们还得写对应的锻造台配方,不然它也不会生效

编写锻造台配方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"type": "minecraft:smithing_transform",
"addition": {
"item": "tutorialmod:fire_ether"
},
"base": {
"item": "minecraft:oak_log"
},
"result": {
"count": 1,
"id": "minecraft:coal"
},
"template": {
"item": "minecraft:netherite_upgrade_smithing_template"
}
}

这里我没有用数据生成来写,直接手写的

锻造台的配方其实和之前写的类似,只是这里的typeminecraft:smithing_transform

addition为锻造台的第二个物品,这里就是我们前面写的具有耐久合成的物品

base为锻造台的第一个物品,也就是被加工的物品

result为合成后的物品

template为锻造台的模板,模板这里我拿了原版的netherite_upgrade_smithing_template,也就是下界合金的升级模板,你也可以自己写一个

那么现在,我们就可以启动我们的游戏进行合成了

原作者的代码及其注释

expl3