跳到主要内容

主包 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。您可以在这里指定需要全局强制循环执行的功能。

实例:使用主函数提供全局饱和效果

高亮部分为新增内容。

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 效果

高亮部分为新增内容。

system/main.mcfunction
# ===== 主函数 =====

# --- 时间控制器 ---
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.ticktime.timeline

time.tick每游戏刻自加 1 分,并在达到 20 时复原到 0。因此,这个值将在 0~19 之间循环,循环周期为 1 秒。您可以利用这个特性写一个每秒执行的函数。格式大体为:

每秒执行一次命令
execute if score tick time matches (0~19的任意整数) run (命令)
实例:使用主函数每秒提供全局饱和效果

高亮部分为新增内容。

system/main.mcfunction
# ===== 主函数 =====

# --- 时间控制器 ---
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
实例:当时间线启用后,则循环设置为和平

首先更改时间线控制文件(高亮部分为更改或新增部分):

system/controllers/timeline.mcfunction
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行

# --- 需要启用的时间线文件 ---
difficulty peaceful

然后,执行下面的命令以启用时间线:

/function lib/modify_data/states/timeline/enable
实例:当data.level=5时,执行函数并施加防火

首先更改时间线控制文件(高亮部分为更改或新增部分):

system/controllers/timeline.mcfunction
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行

# --- 需要启用的时间线文件 ---
execute if score level data matches 5 run function levels/level_5/timeline

因为在这里,我们通过特定条件执行了一个“子时间线”,所以我们常常称这个过程为注册时间线文件

然后,我们需要在这个子时间线中,定义防火药效。

levels/level_5/timeline.mcfunction
# ===== 时间线 =====

# --- 施加防火 ---
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时,对玩家播放特定剧情。这个需求,是需要时间来延时执行的,所以不仅需要时间线,还需要启用时间线流逝。

首先注册时间线文件:

system/controllers/timeline.mcfunction
# ===== 时间线控制器 =====
# 该函数仅当时间线启用后执行

# --- 需要启用的时间线文件 ---
execute if score level data matches 301 run function levels/chapter3/3_0/timeline

然后,我们需要在这个子时间线中,定义剧情内容,并在剧情播放完毕之后关闭时间线。

levels/chapter3/3_0/timeline.mcfunction
# ===== 时间线 =====

# --- 倒计时剧情 ---
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

过往版本下载

下载 v2 版本 下载 v1 版本