ruhuasiyu
本帖最后由 ruhuasiyu 于 2020-1-3 18:16 编辑

在科技类或其它类原版模组中,往往需要制作类似能源条、流体条之类的东西。但是1.15+版本我们使用自定义方块模型的话,在物品栏内会非常暗,所以我们只能使用原版物品模型 item/generated 修改display.gui 直接放缩来制作。

我们使用三层模型,最底层为能源条,中间为可变的背景色的物品条来覆盖下面的能源条,顶层再覆盖能源标尺框。

首先确定整个条的大小,例如为 a×b (18×52),能源条大小 c×d (16×50),一共有0~N种状态 (例如N=100)。如果我们将条限定在3格大小左右,这样正好3个模型都可以放下不用在额外占据容器的其它栏位。

能源条通常为动态材质,假设每一帧实际为 c×d (其余 (d-c)×d 为空白) 的倍数,模型为
  1. {
  2.     "parent": "item/generated",
  3.     "textures": {
  4.         "layer0": "cpp:machine/xp/xp"
  5.     },
  6.     "display": {
  7.         "gui": {
  8.             "scale": [ 3.125, 3.125, 1 ],
  9.             "translation": [0, -17, -65]
  10.         },
  11.         "ground": {
  12.             "scale": [ 0, 0, 0]
  13.         }
  14.     }
  15. }
复制代码
scale 为 [d/16,d/16,1], 我们将其放在z=-65层。translation请自行计算。

别忘了撰写动态材质的动画文件
xp.png.mcmeta
  1. {
  2.         "animation": {
  3.                 "frametime": 2,
  4.                 "frames": [
  5.                 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
  6.                 ]
  7.         }
  8. }
复制代码



标尺框材质大小为 a×b 的倍数,模型为
  1. {
  2.     "parent": "item/generated",
  3.     "display": {
  4.         "gui": {
  5.             "scale": [ 1.125, 3.25, -55 ],
  6.             "translation": [ 0, 19, 0]
  7.         },
  8.         "ground": {
  9.             "scale": [ 0, 0, 0]
  10.         }
  11.     },
  12.     "textures": {
  13.         "layer0": "cpp:machine/xp/frame"
  14.     }
  15. }
复制代码
scale 为 [a/16,b/16,1], 我们将其放在z=-55层。translation请自行计算。


中间的遮盖模型为
  1. {"parent":"cpp:machine/xp/temp","display":{"gui":{"scale":[1,3.09375,1],"translation":[0,1.25,-60]}}}
复制代码
scale 为 [c/16, d/16×(N-k)/N,1], k=1~N。我们将其放在z=-60层。translation请自行计算。cpp:machine/xp/temp 中指定了所用的材质,这里我们使用1×1像素的原版GUI背景色。以我们的数值为例,translation[1]=1.25+k/4。

然后我们可以用Excel生成每一个遮盖模型文件,并用echo命令写入文件。例如文件 test.bat (双击运行)


做好这些模型后,想要添加新能源条材质就只需要再新建一个底层模型文件就可以。

最后将这些模型写到原版物品(不可为方块,否则透明部分会变黑或白)的物品模型的 overrides 中,使用命令将保存在记分板的数值转存到物品的CustomModelData上,并使用告示牌转存到物品的 display 中。注意这里不能直接将
@s cppStoredxp 存储至告示牌,因为告示牌没有@s。例如
  1. setblock ~ 255 ~ oak_sign
  2. scoreboard players operation #t cppValue = @s cppStoredxp
  3. data modify block ~ 255 ~ Text1 set value '[{"score":{"name":"#t","objective":"cppValue"},"color":"green","italic":"false"},{"text":"/100"}]'
  4. execute store result block ~ ~ ~ Items[{Slot:17b}].tag.CustomModelData int 1 run scoreboard players add #t cppValue 12972000
  5. data modify block ~ ~ ~ Items[{Slot:8b}].tag.display.Lore[0] set from block ~ 255 ~ Text1
  6. data modify block ~ ~ ~ Items[{Slot:17b}].tag.display.Lore[0] set from block ~ 255 ~ Text1
  7. data modify block ~ ~ ~ Items[{Slot:26b}].tag.display.Lore[0] set from block ~ 255 ~ Text1
  8. setblock ~ 255 ~ air
复制代码

欢迎各位提出更好的实现方式!




来自群组: The Command's Power

l472624663

硕大的大萨达

Jokey_钥匙
之前倍率要都小于1或有一项大于3的bug修了吗?

ruhuasiyu
Jokey_钥匙 发表于 2020-1-3 19:04
之前倍率要都小于1或有一项大于3的bug修了吗?

正文中说了要用物品的物品模型不能用方块的物品模型

shenpc
膜拜大佬这个东西做出来挺好看的

Xiao2
在上述bug修复后有更好的办法吗

ruhuasiyu
Xiao2 发表于 2020-2-15 07:48
在上述bug修复后有更好的办法吗

即便是修复后,该方法仍然很适合。因为该方法容易更换能源条的材质……

1511829221
666