下载
简介
此前置为本人自制前置,提供部分基础的数据包开发环境,以及一些可选的前置模块。
VoidDataCore(下称VDC) 的宗旨是开发的舒适度和效率优先,不必追求极致的能效比、静态开销、规范和全方位无死角。或许能成为一台跑得飞快的破自行车。
基于此,一部分基本的模块和函数内置于 vdc:built_in 函数空间,并且强制开启。
占用资源
所有名为 '_' 和 ':' 的存储名、记分板名
命名空间为 vdc 的存储
使用
模块控制
除了内嵌模块,所有模块都拥有 :ctrl 函数空间,其中包括四个函数:
·init :初始化,一般会重置本函数所有的运行数据,谨慎使用。
·load:加载函数,会检查一些必要的环境是否存在,并加载 tick 函数。初次执行会执行 init 函数。
· uninst&unload:清除或卸载函数用。
使用模块前,需要先运行 ctrl/load 函数以加载模块。
一些比较复杂的模块,会摘出来获得一个独立的命名空间。这样的命名空间以 _ 开头以与系统函数区分。
已有模块
本文用 scb(记分板名) 或 scb(目标名, 记分板名) 表示记分板, sto(存储名){内容} 或 sto(存储名,存储路径){内容} 表示 NBT 存储。
内嵌模块
这些模块会强制加载
VDC 基本模块
- uid | 玩家编号 | scb(@s, uid) | 所有玩家会自动获得按顺序编号的 uid。
- pl_init | 玩家初始化函数 | func(
#pl_init) | 写入这个函数标签的函数会在玩家初始化时执行。
- time | 系统时间 | sto(:){time} scb(time,sys) | 自动记录的系统时间
- entity.nrt | 非即时实体数量 | scb(entity.nrt, sys) | 用于估算的实体数量。每 10tick 更新一次。
- cmd | 动态命令 | func(cmd){cmd:""} | 一个执行以字符串形式保存和输入的命令的函数。命名空间为 minecraft
- cmds | 动态命令组 | func(cmds){cmds:[""]} | 按元素序号执行一连串的动态命令
- func16 | 16 行动态函数 | func(func16["",max16]) | 16 行的动态函数,空行自动以 return 1 填充,最多 16 个元素。
基本触发器 built_in/tri
- pl.died | 玩家死亡 | func(
#vdc:tri/pl.died) | 玩家死亡时触发
- pl.rejoin | 玩家重进 | func(
#vdc:tri/pl.rejoin) | 玩家重进游戏触发(初次进入不触发)
- pl.respawn| 玩家重生 | func(
#vdc:tri/pl.died) | 玩家重生时触发(可能暂时和立即重生游戏规则冲突)
常用功能 built_in/gnr
本来视追也该放这个模块下,不过鸽了。
数字
- pi* | scb(pi*,num) =2..5 | π。 表示精度(放大倍数) ,下同。 使用不同的放大倍数应该搭配不同的被除数。
- e* | scb(e*,num) *=2..5 | 自然常数。
- 常数 | scb(*,num) *=1..1000 | 1000 以内常数
- 倍数 | 2000 5000 10000 50000 100000 1000000 10000000 100000000 1000000000 | 一些比较大的数。两千、五千、一万、五万,以及十万到十亿的十的倍数。
时钟 _clo
这个模块也算内嵌模块,但是因为可能会比较频繁的调用,因此独立命名空间。
见下文
玩家空间 _pllib
本模块需要加载后使用
- 提供一个玩家空间:sto(vdc:pllib){ 0[] }。下文用 ~ 表示。
- 空间内自动初始化以下内容:
- uid | ~.uid | 一般使用 uid 来进行索引: storage vdc:pllib 0[(uid:$(uid))]。
- UUID | ~.UUID
- 名称 | ~.name
- 缓冲区 | ~.buffer
玩家背包 _inv
本模块需要加载后使用
- 依赖玩家空间,加载本模块自动加载玩家空间。数据存储在 ~.Inv[]
- 将玩家背包分为四个部分:背包 Backpack 、快捷栏 Hotbar、装甲栏 ArmorSlots、末影箱 Ender
- 默认储存在 ~.Inv[].,表示上面四个部分的英文
- 物品栏数据是一个列表 Inv[],其中每个元素表示一个物品栏(Root),元素 0 表示当前物品栏。
- 同时玩家有五个对应的记分板分数: scb(inv.part.*) *=root, backpack, armorslots, enderchest
- 可以通过修改记分板并保存旧数据 / 加载新数据可以切换玩家物品栏的某个部分。
- 对玩家背包进行基本操作
- fetch | func(_inv:fetch) | 将玩家存储的物品栏数据拉到 sto(vdc:inv,0)
- sort | func(_inv:sort) | 将玩家当前的物品栏数据到 sto(vdc:inv,0)
- clear | func(_inv:clear/*) | 清除物品栏的指定部分
- save | func(_inv:save/*) | 保存物品栏的指定部分
- renew | func(_inv:renew/*) | 更新物品栏的指定部分。从 sto(vdc:inv,0) 拉取数据。
- 这套函数最好配合 _inv:sort 使用。这套组合拳的作用是使用 data 命令对物品栏中的物品批量修改。
- 追踪玩家背包
- 设置玩家分数以标记玩家:/scb pl set @s inv.tracing set 1
- 通过 func(
#_inv:tracer) 调集外部函数广播事件。
- 通过 tag= 来输出和识别特征。
特征
#> inv:trace/test
say ____
execute if entity @s[tag=inv.trace.diff] run say 不同
execute if entity @s[tag=inv.trace.diff.cursor] run say 不同-光标
execute if entity @s[tag=inv.trace.diff.inv] run say 不同-物品栏
execute if entity @s[tag=inv.trace.diff.ender] run say 不同-末影箱
execute if entity @s[tag=inv.trace.diff.craft] run say 不同-合成栏
execute if entity @s[tag=inv.trace.thrown] run say 丢弃
execute if entity @s[tag=inv.trace.clicked] run say 点击
execute if entity @s[tag=inv.trace.draw] run say 拿到捏点
execute if entity @s[tag=inv.trace.draw.stack] run say 拿起一叠
execute if entity @s[tag=inv.trace.draw.half] run say 拿起半叠
execute if entity @s[tag=inv.trace.put.exchange] run say 交换捏点
execute if entity @s[tag=inv.trace.put.exchange] run say 交换
execute if entity @s[tag=inv.trace.put] run say 放下捏点
execute if entity @s[tag=inv.trace.put.all] run say 放下全部
execute if entity @s[tag=inv.trace.put.some] run say 放下一些
execute if entity @s[tag=inv.trace.put_to.thrown] run say 放到-丢弃
execute if entity @s[tag=inv.trace.put_to.1] run say 放到一个格子
execute if entity @s[tag=inv.trace.put_to.multi] run say 放到多个格子
execute if entity @s[tag=inv.trace.open_item_slots] run say 打开带格子的GUI
execute if entity @s[tag=inv.trace.fetched] run say 捡起
execute if entity @s[tag=inv.trace.reduced] run say 失去
execute if entity @s[tag=inv.trace.reduce.1] run say 失去一个
execute if entity @s[tag=inv.trace.reduce.removed] run say 失去一叠
execute if entity @s[tag=inv.trace.reduce.thrown] run say 失去-丢弃
execute if entity @s[tag=inv.trace.exchange] run say 交换
execute if entity @s[tag=inv.trace.clicked.s2t] run say 双击
execute if entity @s[tag=inv.trace.clicked.s3t] run say 三击
say ____
[/detail]
- 详细信息会输出到 sto(_){ output }。包括该槽位的槽位id、变化前的物品、变化后的物品、变化的类型等。
- { slot:b, from:{}, to:{}, action:""}
- 用我描述参数的格式就是:
- sto(_,output){ b:slot c:from{ id... } c:to s:action(remove|move|plus|minus|exchange) }
- 可以调取这些参数来做效果。
- 在物品中放入命令字符串,检测到变化后执行动态命令,就可以做按钮。
- 可以把被动的物品改回去,比如说检测到拿起一半(空手右键物品),就自动把物品扔回去,然后触发效果。
时钟 _clo
本模块为内嵌模块,且为系统级模块。其下每个模块都需要单独加载。
休眠缓时循环 hiber
- 此模块用处是将任务的执行周期拉长
- 此模块下有多个子模块。这些子模块都需要单独加载才能使用。其名称格式为 pnx ,其中 p 表示周期,为固定前缀。 n 表示数字,x表示单位。
- p3s 即每 3 s执行一次。
- 其中 p10t 由 VDC 基本模块自动强制调用。
- 周期自动对齐系统时间,当系统时间整除周期时苏醒(执行任务)。
- 将你的函数添加到
#_clo:hiber/pnx 函数标签来在休眠循环苏醒时被调用。
异步缓时循环 async
- 此模块用处是将任务均摊到时间轴上以对功耗进行削峰,或是安排其他跨 tick 任务。
- 此模块类似休眠模块,同样有多个需要单独加载的子模块。
- 每个目录下都有 phx.mcf 函数,其中 ph 意为相位,x为相位编号。
- 部分目录额外有 _hn 的后缀,意为休眠多少刻。
- _h1 意为每个相位后休眠 1t,也就是 2 t 执行一个相位。
- p8t_h1 每个相位执行后休眠 1t,一个周期 8t,总共有 4 个相位。
- 周期同样对齐系统时间,相位 0 时恰好被系统时间整除。
- 将你的函数添加到
#_clo:async/pnx(_hn)/ph* 以在特定相位时被调用。
时序任务系统 order
- 动态、自动处理任务的系统。
- 允许你设置任务的复杂参数
- 包括执行时间(绝对,相对)、条件触发(检测命令+成功命令+失败命令)、执行类型(命令,命令组)、执行后处理(弃置、直到成功、循环)、延时等等。
- 任务输入写在 sto(_ , import){}
- 先写输入再调用函数来输入任务
- 执行输入函数后会删除输入参数,需要重新输入
- 通过 order/_import.normal 函数来输入任务,需要遵循严苛的格式检查
格式
# input: sto(_,import){ s:name i/s:time|ls:timeslots s:type(direct|condition*) s:exe(cmd|cmds|func4**|func16**) s:end(drop|tilsuc*1|loop*1) *c:condition{s:cmd} *?c:fallback{s:cmd} **/s:cmd **ls:sto[4|16] 1*s:delay *s:delay}
# tilsuc: 直到成功...
# time 为 string 时,解析为相对值
- 通过 order/_import.simpform 来使用简单格式输入任务
- time 为字符串时解析为相对时间,单位为 tick。
- 直接命令 | {cmd:"say sucks", time:"10"}
- 条件命令 | {end:"tilsuc", condition:{cmd:"execute if entity @e[type=pig] run return 1"}, cmd:"say man!", fallback:{cmd:"say what can i say"}, delay:"10" } | tilsuc 是成功后停止检测,fallback 可以不写。
- 通过 order/_import.simplocal 来使用简单格式 + 局部参数输入任务
- 可以保留局部参数(执行者,执行坐标)
- 例:
简写,能懂就行
data sto _ import set value {cmd:"say sucks",time:"10"}
exe as @n[type=pig] run func order/_import.simplocal
# .. 10 tick
[猪] sucks
- 通过 order/_import.simplocal.static 来使用简单格数 + 执行者 + 记录当前执行方位(坐标+朝向)。
简写,能懂就行
data sto _ import set value {cmd:"tp @s ~ ~ ~ ~ ~",time:"60"}
execute as VRainbow_ run func order/_import.simplocal
# VRainbow_ 会在 3 秒后被传送回原地。