利用纯命令的方式,实现了在原版添加自定义的液体!
b站演示视频(附带原理讲解):
如何添加新的液体
为了规范格式,以及提高兼容性,液体的添加被限制了一定的格式:
在函数的liquids文件夹下,以<液体名>的文件夹分别保存了不同液体的处理。主要有两个函数决定了液体的性质。下面的例子都是数据包中自带的测试液体。
test/set.mcfunction
#生成一个液体方块,并赋予这个方块初成员值 execute align xyz positioned ~0.5 ~ ~0.5 run setblock ~ ~ ~ air execute align xyz positioned ~0.5 ~ ~0.5 run summon armor_stand ~ ~ ~ {Tags:["Cliquid_node_test","Cliquid_other_just","Cliquid_node","Cliquid_class_cliquid_infinite"],NoGravity:true,Invisible:true,Invulnerable:true,Marker:true,Silent:true,ArmorItems:[{},{},{},{id:"glass",Count:1b,tag:{CustomModelData:1140016}}],Small:true} scoreboard players set @e[tag=Cliquid_other_just] cliquid_class_liquid_updatetime 10 scoreboard players set @e[tag=Cliquid_other_just] cliquid_class_liquid_level 16 scoreboard players set @e[tag=Cliquid_other_just] cliquid_class_liquid_decayspeed 4 scoreboard players set @e[tag=Cliquid_other_just] cliquid_class_liquid_issource 1 scoreboard players set @e[tag=Cliquid_other_just] cliquid_class_liquid_type 0 scoreboard players set @e[tag=Cliquid_other_just] cliquid_tick_time 0 tag @e remove Cliquid_other_just
先生成代表液体的盔甲架,再赋予属性。液体的属性如下:
class Liquid{ int level; //液体的水位 int decayspeed; //衰减速度 bool issource; //是否为源头 int type; //液体种类 int updatetime; //液体更新间隔 bool infinite; //允许无限液体 }
与计分板的对应关系如下:cliquid_class_liquid_属性。注意infinite属性是借助tag而非计分板实现的。在添加一个液体的时候只需要改变这些属性即可。
test/tick.mcfunction
execute if score @s cliquid_tick_time >= @s cliquid_class_liquid_updatetime run function cliquid:liquids/update scoreboard players add @s cliquid_tick_time 1
用于更新液体。
补充
数据包到现在还很粗糙,比如模型的细节什么的,以及不同液体之间的交互。没有添加非命令放置液体的方式,是为了对接其他数据包,让这个数据包能成为一个前置的数据包。更多的细节还是交给其他数据包的开发者啦(逃