本篇教程由作者设定未经允许禁止转载。

代码萌新写的教程,有问题欢迎指正,不要无脑喷

适用于整合包作者,个人玩家没必要用,不如直接修改config之后在模具加工台合成所有部件

原初修真和匠魂同时安装时,会出现匠魂部件不能正常浇铸的问题。但锭、宝石、粒等基础材料可以浇铸;凝血、空白铸模等不需要铸模的产物可以浇铸。

原初修真(前置)会自动给物品和方块加上nbt标签——InitialImmortal:{},是问题的起因。下面逐渐讲来:

浇铸台需要使用铸模才能浇铸,各种部件的铸模其实是同一个物品tconstruct:cast,空白铸模也是这个物品,它们唯一的区别是nbt标签不同:比如镐头铸模的标签是PartType: "pick_head",碎片铸模的标签是PartType: "shard",以此类推,不同铸模的parttype标签后的值不同,是对应的部件名。浇铸出的部件根据不同部件名划分为不同物品,比如所有镐头物品名是tconstruct:pick_head,所有碎片是tconstruct:shard,每一类部件再按材料分配nbt标签,比如铁镐头物品名是tconstruct:pick_head,标签是Material: "iron",钴碎片物品名是tconstruct:shard,标签是Material: "cobalt"。所以浇铸时采用的配方检测铸模时,必须精准检测铸模的物品名和nbt标签,才能对应到准确的产物。在原初修真自动给物品和方块加上InitialImmortal:{}的标签后,精准检测标签就不匹配了,没有任何适应于该铸模的配方,所以无法浇铸。

那么为什么锭、宝石、粒等基础材料可以浇铸;凝血、空白铸模等不需要铸模的产物可以浇铸呢?

锭、粒、宝石、板、齿轮,五件铸模的物品名虽然也相同,但是特殊值不同。这个特殊值是什么?举个例子,在java pre1.13里给玩家一组橡木原木的指令是/give @p minecraft:log 64 0,给玩家一组云杉木原木的指令是/give @p minecraft:log 64 1,区别的那个数字是物品的特殊值,特殊值不同就是两个完全不同的物品。指令里这一位特殊值可以省略,默认为0.

说回铸模,方才提及的五件铸模的物品名是tconstruct:cast_custom,依次对应0~4的特殊值,所以给玩家一个宝石铸模的指令是/give @p tconstruct:cast_custom 1 2。浇铸时采用的配方检测铸模时,检测铸模的物品名和特殊值,才能对应到准确的产物。配方不在乎那条被添加的nbt标签InitialImmortal: {},所以可以正常浇铸。

无需铸模时,不涉及nbt标签冲突,可以正常浇铸。

反向浇铸时,用熔融金或铝黄铜浇在已有的部件上,消耗部件获得产物铸模,同样冲突。由前所述,部件带有material的标签,配方精准检测物品名和nbt标签时也会因额外的InitialImmortal: {}标签而出错,无法浇铸。


说了这么多,解决方法如下:

我没法也不可能改原初修真或匠魂的源文件,只能从配方动手。众所周知modtweaker可以修改配方,教程可以参见https://docs.blamejared.com/1.12/zh/index;安装crafttweaker和modtweaker模组后,在.minecraft/scripts文件夹中新建.zs后缀的文件,用你熟悉的编辑器编辑文本即可。看一条代码示例:mods.tconstruct.Casting.addTableRecipe(<tconstruct:pick_head>.withTag({Material: "iron"}), <tconstruct:cast>.withTag({PartType: "tconstruct:pick_head", InitialImmortal: {}}), <liquid:iron>, 72);

以通俗易懂的语言翻译一下:

模组-匠魂-浇铸-给浇铸台添加配方:产物——铁镐头,铸模——镐头铸模,原料——熔融铁,消耗72mL材料。(注:1锭 = 144mL)

尖括号里是物品名,.withTag()及其中内容是物品的nbt标签,新配方里铸模的nbt标签添上了InitialImmortal: {}的标签,配方与游戏中实物匹配,就可以正常浇铸了!

注:可以在游戏中手持物品使用/ct nbt/mt hand指令查看物品的物品名和所有标签,格式可以复制直接用进zs(zenscript)代码。

分析一大堆缺陷:

以上办法只能手动编辑单一配方代码,给整合包套用时可能有几千条配方,总数=材料数*部件类型数,我找不到一次性解决所有配方问题的办法,最后委曲求全,打算把所有配方写出来。先在游戏里输入/ct liquids,这样会在crafttweaker.log文件里生成一个list,是所有液体列表。从中挑选出匠魂常用的可以浇铸成部件的液体,重列并储存成可读文件(如cast.txt),效果如下:(其中好多联动过来的材料)

<liquid:advancedalloy>

<liquid:aluminum>

<liquid:ardite>

<liquid:brass>

<liquid:bronze>

<liquid:cobalt>

<liquid:conductive_iron>

<liquid:constantan>

......等,打开我这种小白最喜欢用的Dev C++:(我只会C++)

#include <bits/stdc++.h>
using namespace std;
vector<string>typ={"shard","tough_tool_rod","kama_head","cross_guard","arrow_head","broad_axe_head","hand_guard","axe_head","excavator_head","scythe_head","large_plate","sword_blade","sign_head","pan_head","wide_guard","sharpening_kit","shovel_head","binding","tool_rod","tough_binding","knife_blade","hammer_head","large_sword_blade","bow_limb","pick_head"};
vector<int>amount={72,432,288,144,288,1152,144,288,1152,1152,1152,288,432,432,144,288,288,144,144,432,144,1152,1152,432,288};
int main(){
freopen("cast.txt","r",stdin);
string s;
while(getline(cin,s)){
s=s.substr(8,s.size()-9);
for(int i=0;i<typ.size();i++){
cout<<"mods.tconstruct.Casting.addTableRecipe(<tconstruct:"<<typ[i]<<">.withTag({Material: "<<'"'<<s<<'"'<<"}), <tconstruct:cast>.withTag({PartType: "<<'"'<<"tconstruct:"<<typ[i]<<'"'<<", InitialImmortal: {}}), <liquid:"<<s<<">, "<<amount[i]<<");"<<endl;
}
}
return 0;
}

我把弓臂、弓弦什么的没放进去,因为没有同样多材料的部件没有人真的用匠魂弓吧,编译输出。typ[]储存了部件名,amount[]储存该部件消耗的量,用代码写代码也是没谁了hhh

于是输出了1350行代码。。。

分段写进多个zs代码,不然过大没法读啦

结束,收工,可以浇铸原有的所有材料任何部件啦!