Ph-苯
本帖最后由 七刀月复 于 2020-2-8 19:55 编辑


论坛内已有更好的做法:【LAY Studio|CAM开发随笔】如何用datapack更好的模拟原版工作台?https://www.mcbbs.net/thread-947897-1-1.html

前言
MC原版添加配方的方式无法涉及NBT,然而许多原版模组都需要涉及NBT的合成,于是每个模组都设定了自己的合成方式。但是每个模组一个工作台,不仅要耗费制作者大量精力写一遍别人重复过多次的命令,还要考虑如何不与别人的模组冲突,所以我在此发布一个前置模组,希望能统一各模组的工作台,减少时间浪费。
效果
NBT工作台由副手放置原版工作台获得,主手放置的仍然是原版工作台。破坏NBT工作台掉落的仍是原版工作台。

原版工作台和NBT工作台比较:

NBT工作台界面:



2021.12 数据,可能有更多内容


论坛内已有更好的做法:【LAY Studio|CAM开发随笔】如何用datapack更好的模拟原版工作台?https://www.mcbbs.net/thread-947897-1-1.html


前言
MC原版添加配方的方式无法涉及NBT,然而许多原版模组都需要涉及NBT的合成,于是每个模组都设定了自己的合成方式。但是每个模组一个工作台,不仅要耗费制作者大量精力写一遍别人重复过多次的命令,还要考虑如何不与别人的模组冲突,所以我在此发布一个前置模组,希望能统一各模组的工作台,减少时间浪费。
效果
NBT工作台由副手放置原版工作台获得,主手放置的仍然是原版工作台。破坏NBT工作台掉落的仍是原版工作台。

原版工作台和NBT工作台比较:

NBT工作台界面:




引用方法
请自己创建和命名新的函数,复制以下代码并替换关键字,放入自己的数据包中,并将第一个函数加入到nbtr:crafting标签中。
第一个函数:
有序合成:

代码:

  1. execute if block ~ ~ ~ barrel{Items:[所有需要的材料物品,含Slot,不含Count]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run function 第二个函数
3x3的合成栏,从左到右、从上到下的Slot分别是
1b,2b,3b,
10b,11b,12b,
19b,20b,21b。
无序合成:

代码:

  1. execute if block ~ ~ ~ barrel{Items:[所有需要的材料物品,不含Count和Slot]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run function 第二个函数
第二个函数:

代码:

  1. scoreboard objectives add nbtr_sl dummy
  2. execute store result score cnt nbtr_sl run data get block ~ ~ ~ Items
  3. execute if score cnt nbtr_sl matches 所需的材料物品总数+17 run function 第三个函数
  4. scoreboard objectives remove nbtr_sl
第三个函数:
replaceitem版:

代码:

  1. tag @s add nbtr_c
  2. replaceitem block ~ ~ ~ container.16 成品
loot版:

代码:

  1. tag @s add nbtr_c
  2. loot replace block ~ ~ ~ container.16 loot 成品战利品表
如果有多个合成表,无论是有序还是无序,第一个函数都可以合并。
使用NBT工作台时必须同时启用该模组的数据包和资源包。


下载
数据包
资源包

示例
有序合成:
绿宝石镐=绿宝石x3+木棍x2
第一个函数(nbtr:crafting_table/recipes)(#nbtr:crafting):

代码:

  1. execute if block ~ ~ ~ barrel{Items:[{id:"minecraft:emerald",Slot:1b},{id:"minecraft:emerald",Slot:2b},{id:"minecraft:emerald",Slot:3b},{id:"minecraft:stick",Slot:11b},{id:"minecraft:stick",Slot:20b}]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run function nbtr:crafting_table/recipes_1
第二个函数(nbtr:crafting_table/recipes_1):

代码:

  1. scoreboard objectives add nbtr_sl dummy
  2. execute store result score cnt nbtr_sl run data get block ~ ~ ~ Items
  3. execute if score cnt nbtr_sl matches 22 run function nbtr:crafting_table/recipes_4
  4. scoreboard objectives remove nbtr_sl
第三个函数(nbtr:crafting_table/recipes_4):

代码:

  1. tag @s add nbtr_c
  2. replaceitem block ~ ~ ~ container.16 diamond_pickaxe{display:{Name:'"§r绿宝石镐"'}}



无序合成:
合珍钻=钻石x1+绿宝石x1+铁锭x1+金锭x1
第一个函数(nbtr:crafting_table/recipes)(#nbtr:crafting)(你可以像我一样把两个合成表的第一个函数合并到同一个函数中,也可以另创新的函数,不过别忘了加标签):

代码:

  1. execute if block ~ ~ ~ barrel{Items:[{id:"minecraft:emerald"},{id:"minecraft:diamond"},{id:"minecraft:iron_ingot"},{id:"minecraft:gold_ingot"}]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run function nbtr:crafting_table/recipes_2
第二个函数(nbtr:crafting_table/recipes_2):

代码:

  1. scoreboard objectives add nbtr_sl dummy
  2. execute store result score cnt nbtr_sl run data get block ~ ~ ~ Items
  3. execute if score cnt nbtr_sl matches 21 run function nbtr:crafting_table/recipes_3
  4. scoreboard objectives remove nbtr_sl
第三个函数(nbtr:crafting_table/recipes_3):

代码:

  1. tag @s add nbtr_c
  2. replaceitem block ~ ~ ~ container.16 diamond{display:{Name:'"§r合珍钻"'}}




鹿小语
想知道 你是如何将函数工作台的材质更改成其他材质的

Ph-苯
mango2017 发表于 2019-3-16 21:14
想知道 你是如何将函数工作台的材质更改成其他材质的

资源包。

鹿小语
但是你另一个工作台是原版的材质呀


Ph-苯
mango2017 发表于 2019-3-16 21:16
但是你另一个工作台是原版的材质呀

1.14新增的CustomModelData标签可以让同一个物品在不同的情况下呈现不同的材质,而且我并没有替换工作台的材质,替换的是去皮金合欢树根。

鹿小语
七刀月复 发表于 2019-3-16 21:18
1.14新增的CustomModelData标签可以让同一个物品在不同的情况下呈现不同的材质,而且我并没有替换工作台 ...

我去研究研究,谢了

ruhuasiyu
为啥不检测Items大小,免得unless一堆。然后其实不需要用tag add,直接可以做到一条命令一条配方的,最后统一检测清理

Ph-苯
本帖最后由 七刀月复 于 2019-3-16 21:45 编辑
ruhuasiyu 发表于 2019-3-16 21:36
为啥不检测Items大小,免得unless一堆。然后其实不需要用tag add,直接可以做到一条命令一条配方的,最后统 ...

你可以下载来试一试,我这个和你那个有略微的不同,所以多了一些命令。

Ruainbow_
合成界面你不如直接用原版工作台的材质了事
最多在左上角加个NBT之类的awa
不是我说啊,Cpp的材质不是不好看,但是兼容性不是很高啊awa

楚zzz
资源包要分别放进文件夹吗?还是直接放mod里?

Ph-苯
楚zzz 发表于 2019-3-17 10:37
资源包要分别放进文件夹吗?还是直接放mod里?

资源包就像普通资源包一样加载,数据包放进存档文件夹里的datapacks文件夹。

Ph-苯
Ruainbow_ 发表于 2019-3-17 05:45
合成界面你不如直接用原版工作台的材质了事
最多在左上角加个NBT之类的awa
不是我说啊,Cpp的材质不是不好 ...

我只是使用了工作台的材质,并且替换的是去皮金合欢树根,应该不会与其它模组资源包冲突,兼容性应该很高吧?

Ruainbow_
七刀月复 发表于 2019-3-17 12:31
我只是使用了工作台的材质,并且替换的是去皮金合欢树根,应该不会与其它模组资源包冲突,兼容性应该很高 ...

awa...也许我应该用相性这个词?
这种背景比较适合以经验为基础的魔法向模组吧,如果是一个科技模组的话用这个就不太恰当

RF_Tar_Railt
Ruainbow_ 发表于 2019-3-17 05:45
合成界面你不如直接用原版工作台的材质了事
最多在左上角加个NBT之类的awa
不是我说啊,Cpp的材质不是不好 ...

原版工作台没法检测你放进去的物品的

ruhuasiyu
Ruainbow_ 发表于 2019-3-17 05:45
合成界面你不如直接用原版工作台的材质了事
最多在左上角加个NBT之类的awa
不是我说啊,Cpp的材质不是不好 ...

是这样……cpp的合成器还是有点魔法的味道……

Ph-苯
Ruainbow_ 发表于 2019-3-17 14:24
awa...也许我应该用相性这个词?
这种背景比较适合以经验为基础的魔法向模组吧,如果是一个科技模组的话 ...

有道理,那我有时间修改一下。

☆娜娜★
感谢分享

18168559302
666666666666666

CR_019
理论上有一个bug:将一个有效配方放入nbt合成台,退出界面,破坏方块,输出的物品和输入的物品会一起掉出来
我目前的解决方案是给输出加个tag,但这样就不能方便的堆叠,降低游戏体验。请问有更好的方案吗

Ph-苯
chaoren019 发表于 2020-2-2 23:52
理论上有一个bug:将一个有效配方放入nbt合成台,退出界面,破坏方块,输出的物品和输入的物品会一起掉出来 ...

可以先把材料栏里的物品储存起来,在破坏的那一刻清除所有掉落物,再自行生成材料栏里的物品。

Ruainbow_
PH的老黑历史了
最近搞一个新坑,懒得写合成表前置了,就用用你的。
虽然本体懒得搞,但是你这个模板太复杂了...顺手改了一下,一个函数就可以,那么麻烦...
  1. #
  2. execute store result score @s temp1 run data get block ~ ~ ~ Items
  3. #以上,temp1可以改为任何不引起冲突的其他记分板
  4. #以下,如此书写配方,每个配方两条,条件判定完全相同,matches后面的n=17+所占格数
  5. execute if score @s temp1 matches n if block ~ ~ ~ barrel{Items:[所有需要的材料物品,含Slot,不含Count]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run tag @s add nbtr_c
  6. execute if score @s temp1 matches n if block ~ ~ ~ barrel{Items:[所有需要的材料物品,含Slot,不含Count]} unless block ~ ~ ~ barrel{Items:[{Slot:16b}]} run replaceitem block ~ ~ ~ container.16 成品
复制代码


雪-ices
膜拜大佬awa

第一页 上一页 下一页 最后一页