利用纯命令的方式,实现了在原版添加自定义的液体!

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

用于更新液体。

补充

数据包到现在还很粗糙,比如模型的细节什么的,以及不同液体之间的交互。没有添加非命令放置液体的方式,是为了对接其他数据包,让这个数据包能成为一个前置的数据包。更多的细节还是交给其他数据包的开发者啦(逃

下载