主包 v3
下载
本包已经搭建了一套较为完善的计时函数命令系统,以便您基于此底层系统编写命令。
目前为止,基岩版的函数系统相比于命令方块系统仍旧有两大硬伤。第一是条件性命令,这个缺陷随着/execute
的更新已经缓解许多。而计时问题,则是函数系统的第二大硬伤。为了解决这个问题,我们专门基于记分板搭建了一个自带计时功能的命令系统。
本包为行为包。本包是其他众多函数系统包的基础包。
- 变量表示:本文,我们把
objective
记分板上名为name
的追踪目标的分数score
记为objective.name
=score
。- 例如,检测
objective.name
的分数是否为1
,为/execute if score name objective matches 1
。
- 例如,检测
使用方法
文件架构
我们必须介绍一下我们的函数包都由什么样的文件结构组成——这是至关重要的,您需要简单了解一下我们各个文件、文件夹都有什么用。
打开BP/functions/
文件夹,您可以看到 2 个文件夹system/
、lib/
和一个tick.json
。如果看到了您不熟悉的名词(例如时间线),可以在后文看到它们的原理和用法。
system/
:系统函数,运行最底层的内容。main.mcfunction
:主函数,通过tick.json
循环执行的函数。timer.mcfunction
:计时器,进行时间计时,每刻执行,包括常规计时器和时间线计时器。controller/
:控制器,用于控制底层函数的执行,在特定条件下执行的系统级函数。timeline.mcfunction
:时间线控制器,当时间线启用后执行的函数。
lib/
:库函数,被高频调用的函数。在编写函数的过程中,常常发现一些可能需要不断使用的重复的命令,这时就可以将它们打包为一个库函数。get_data/
:获取数据的函数,通常进行一些对世界影响不大或者几乎认为无影响的操作,然后将获取到的数据输出到一个记分板变量或标签中。- 虽然没有任何预设文件,但我们在常用方法合集:获取数据中整合了一些可能有用的方法供你使用。您可以视需求选择性粘贴。
modify_data/
:修改数据的函数,通常进行一些对世界影响较大的操作,或者对玩家执行某些命令,或者强制地修改记分板或标签的值。init/
:初始化函数,常在地图或模组初始化时执行,但何时执行由您自行指定。data.mcfunction
:数据初始化函数,用于初始化全局(记分板、标签)变量。gamerule.mcfunction
:游戏规则初始化函数,用于初始化游戏规则。
states/
:修改状态,用于修改时间线、或者可能涉及状态的内容。timeline/
:修改时间线状态,例如启用或禁用时间线,启用或禁用时间流逝。enable.mcfunction
:启用时间线。disable.mcfunction
:禁用时间线。enable_time_lapse.mcfunction
:启用时间线的时间流逝。disable_time_lapse.mcfunction
:禁用时间线的时间流逝。keep_value.mcfunction
:保留时间值。声明在调用修改时间线状态的库函数时,保留时间线的时间值。disable_time_lapse.mcfunction
:不保留时间值。声明在调用修改时间线状态的库函数时,不保留时间线的时间值。
主函数
主函数为system/main.mcfunction
。您可以在这里指定需要全局强制循环执行的功能。
实例:使用主函数提供全局饱和效果
高亮部分为新增内容。
# ===== 主函数 =====
# --- 时间控制器 ---
function system/timer
# --- 时间线 ---
execute if score timeline active matches 1.. run function system/controller/timeline
# --- 提供饱和效果 ---
effect @a saturation 5 0 true
实例:使用主函数进行全局附魔效率 V 效果
高亮部分为新增内容。
# ===== 主函数 =====
# --- 时间控制器 ---
function system/timer
# --- 时间线 ---
execute if score timeline active matches 1.. run function system/controller/timeline
# --- 提供效率 V ---
enchant @a efficiency 5
初始化
在使用下面的功能之前,请先使用下面的命令进行变量和游戏规则初始化。
/function lib/modify_data/init/data
/function lib/modify_data/init/gamerule
计时器
计时器也是本系统的核心函数之一。它可以进行计时。
在我们给出的预设中,它主要更改两个值:time.tick
和time.timeline
。
time.tick
每游戏刻自加 1 分,并在达到 20 时复原到 0。因此,这个值将在 0~19 之间循环,循环周期为 1 秒。您可以利用这个特性写一个每秒执行的函数。格式大体为:
execute if score tick time matches (0~19的任意整数) run (命令)
实例:使用主函数每秒提供全局饱和效果
高亮部分为新增内容。
# ===== 主函数 =====
# --- 时间控制器 ---
function system/timer
# --- 时间线 ---
execute if score timeline active matches 1.. run function system/controller/timeline
# --- 提供饱和效果 ---
execute if score tick time matches 0 run effect @a saturation 5 0 true
如果有其他的计时项目,您也可以写在此文件中。
时间线:条件性循环执行命令
和主函数全局的、强制的循环执行不同,时间线是我们提供的用于局部的、条件性的循环执行工具,也是实际上更常用的循环执行工具。
通过时间线循环执行的命令,请写到时间线控制器(system/controllers/timeline.mcfunction
)里面执行或间接执行。
时间线运行的原理是:
- 当时间线启用后,执行时间线控制器。
- 您可以控制时间线的时间值。
- 但是,时间值在时间线启用状态下默认不会流逝。
- 您可以调整时间线流逝值,控制每刻的时间值的增量。
- 使用时间值,可以使命令在特定时刻下执行。
- 我们提供了许多的库函数,可以帮助您快速掌控这些变量。它们位于
lib/modify_data/states/timeline/...
。包括:- 快捷启用时间线的方法(
enable.mcfunction
)。 - 快捷禁用时间线的方法(
disable.mcfunction
)。同时将流逝值改为 0。 - 快捷启用时间线流逝的方法(
enable_time_lapse.mcfunction
)。同时如果未启用时间线时,启用时间线。 - 快捷禁用时间线流逝的方法(
disable_time_lapse.mcfunction
)。 - 调用上面的方法时,声明保留原有的时间值(
keep_value.mcfunction
)。应在调用上面的方法前使用。 - 调用上面的方法时,声明不保留原有的时间值(
dont_keep_value.mcfunction
)。应在调用上面的方法前使用。
- 快捷启用时间线的方法(
时间线的参数变量的具体含义如下:
变量 | 含义 | 对应值的意义 |
---|---|---|
active.timeline | 时间线状态,控制时间线是否启用,以及运行的状态 | - 当为 0 或更低时,时间线处于禁用状态,时间线控制器不会运行- 当为 1 或更高时,时间线处于启用状态,时间线控制器将会运行 |
time.timeline | 时间线时间值,规定时间线的时间值 | - 可以通过调整data.timeLapse 来控制时间值的流逝 |
data.timeLapse | 时间线流逝值,规定时间线时间值的流逝值 | - 在时间线启用(active.timeline >=1 )时,time.timeline 将每刻自加data.timeLapse (由计时器定义)- 例如,当 data.timeLapse =2 时,time.timeline 将每刻自加2 |
data.keepValue | 时间线时间值是否保留,表示调用相关库函数时,是否保留原有的时间值 | - 若该值为1 ,则在调用库函数时,保留时间值- 其余情况,则在调用库函数时,抛弃时间值(设置 time.timeline =0 ) |
实例:当时间线启用后,则循环设置为和平
首先更改时间线控制文件(高亮部分为更改或新增部分):
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行
# --- 需要启用的时间线文件 ---
difficulty peaceful
然后,执行下面的命令以启用时间线:
/function lib/modify_data/states/timeline/enable
实例:当data.level
=5
时,执行函数并施加防火
首先更改时间线控制文件(高亮部分为更改或新增部分):
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行
# --- 需要启用的时间线文件 ---
execute if score level data matches 5 run function levels/level_5/timeline
因为在这里,我们通过特定条件执行了一个“子时间线”,所以我们常常称这个过程为注册时间线文件。
然后,我们需要在这个子时间线中,定义防火药效。
# ===== 时间线 =====
# --- 施加防火 ---
execute if score tick time matches 2 run effect @a fire_resistance 30 0 true
然后,执行下面的命令以启用时间线并执行规定函数:
/function lib/modify_data/states/timeline/enable
/scoreboard players set level data 5
实例:按照特定时间顺序执行命令
以下内容改编自《冒险小世界:剑之试炼》。要求是,当data.level
=301
时,对玩家播放特定剧情。这个需求,是需要时间来延时执行的,所以不仅需要时间线,还需要启用时间线流逝。
首先注册时间线文件:
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行
# --- 需要启用的时间线文件 ---
execute if score level data matches 301 run function levels/chapter3/3_0/timeline
然后,我们需要在这个子时间线中,定义剧情内容,并在剧情播放完毕之后关闭时间线。
# ===== 时间线 =====
# --- 倒计时剧情 ---
execute if score timeline time matches 20 run say 5
execute if score timeline time matches 40 run say 4
execute if score timeline time matches 60 run say 3
execute if score timeline time matches 80 run say 2
execute if score timeline time matches 100 run say 1
# --- 剧情结束后,关闭时间线 ---
# 此处不需要保留时间值
execute if score timeline time matches 101 run function lib/modify_data/states/timeline/dont_keep_value
execute if score timeline time matches 101 run function lib/modify_data/states/timeline/disable
然后,执行下面的命令以初始化时间值time.timeline
=0
,启用时间线和时间流逝并执行规定函数:
/function lib/modify_data/states/timeline/dont_keep_value
/function lib/modify_data/states/timeline/enable_time_lapse
/scoreboard players set level data 301
可用函数
您可以对本包中的下面的函数进行修改、调用。
文件名(.mcfunction ) | 用途 | 输出数据(变量、标签) |
---|---|---|
system/main | 主文件,保持循环执行 | —— |
system/timer | 计时器 | - time.tick - time.timeline +=data.timeLapse |
system/controller/timeline | 时间线控制器,注册文件,用于控制执行的时间线 | —— |
lib/modify_data/init/data | 重置或注册全局变量 | —— |
lib/modify_data/init/gamerule | 重置默认的游戏规则 | —— |
lib/modify_data/states/timeline/enable | 启用时间线 | - active.timeline =1 - time.timeline =0 (当data.keepValue !=1 时) |
lib/modify_data/states/timeline/disable | 禁用时间线 | - active.timeline =0 - data.timeLapse =0 - time.timeline =0 (当data.keepValue !=1 时) |
lib/modify_data/states/timeline/enable_time_lapse | 启用时间线的时间流逝 | - active.timeline =1 (当active.timeline <=0 时)- data.timeLapse =1 - time.timeline =0 (当data.keepValue !=1 时) |
lib/modify_data/states/timeline/disable_time_lapse | 禁用时间线的时间流逝 | - data.timeLapse =0 - time.timeline =0 (当data.keepValue !=1 时) |
更新日志
v3 版本
相比于 v2 版本,v3 版本主要进行了如下更改:
- 提升最低版本需求为 1.20.50。
- 移除和拆分了其中的绝大多数内容,仅保留时间线。
- 但是,被移除的内容存储在常用方法合集中,可供开发者需要时再取用。
- 移除了时间线的
_keep
类函数,使用data.keepValue
代替。 - 将
lib/modify_states/
移动到了lib/modify_data/states/
。 - 随着
/camera
的更新,锁定视角已不再需要,因此移除了data.lockCamera
变量。- 因此,本包也不再依赖标记实体。
v2 版本
相比于 v1 版本,v2 版本主要进行了如下更改:
- 合并了剧情线和时间线,进行了一些更改。
- 使用
data.lockCamera
变量决定是否锁定视角。 - 使用
data.timeLapse
变量决定是否时间流逝,而不是时间线的状态值active.timeline
。
- 使用