这里注明不同模块有啥子用, 可以按照需求使用需要的模块, 不需要的请直接删掉data/s3_def/functions下对应的(文件夹/文件)

如果需要了解结构，注意不要忽视了函数标签和进度的作用
> ticks
  提供不同顺序不同执行者触发的函数标签, 它们是正常游戏时每个gametick内始终触发的
  每种触发都包含3个人为定义的触发顺序(init, def, run)
    > tick
      一般的tick
        > entity
          as @e, 执行位置为tick(run)
        > player
          as @a, 执行位置为tick(run), 且在tick/entity后
    > advance
      进度, 执行者为每个玩家
    > schedule
      计划, 无指定的执行者
    > rcb
      不存在的, 这个执行顺序又不稳定, 而且放rcb也是个问题

> state_def < 前置: triggers(使用到了计分板s3.flag)
  定义一些状态对应的计分板
    > world
    > player
        > find
          玩家存在检测(#s3.player.find s3.flag)
        > hand
            > clock
              玩家手上拿着钟时计分板(#s3.player.hand.clock s3.flag)的值为1
        > xp
          计算玩家的经验值点数(#s3.player.xp s3.int)
    > entity
        > find
          实体存在检测(#s3.entity.find s3.flag)
        > predicates
          一些断言检测

> triggers < 前置: ticks
  提供各种条件下触发的函数标签
  每种触发都包含3个人为定义的触发顺序(init, def, run)
    > world
        > load
          一般的load
        > loaded
          第一次检测到玩家后触发, 检测和触发位置为tick/player(init)
    > player
        > join
          玩家每一次进入时触发, 包括第一次, 检测为计分板判据检测, 触发位置为tick/player(init), 且在loaded后
        > start
          玩家第一次进入时触发, 检测为进度检测, 触发位置为tick/player(init), 且在join后
        > dead
          玩家死亡后触发, 检测为计分板判据检测, 触发位置为tick/player(init)

> scb < 前置: triggers(load)
  提供基本的计分板
dummy:
s3.bool
s3.byte
s3.int
s3.flag
s3.temp
used:carrot_on_a_stick:
s3.carrot_click
used:warped_fungus_on_a_stick:
s3.warped_click
数字(存在计分板#<num> s3.int上):
-128~127
-2147483648, 2147483647
2^n, 10^n(0到2147483647的范围内)
以及一些其它的数(325,360,1200,2220,3600,24000,214013,2330001,2531011)

> time < 前置: triggers(load)
  关于时间的玩意，把MC一天的时间转化为24小时制，并且同时计算天数转化为年月日
    > refresh
      在tick(init)刷新时间到计分板上
    > get
        > num
          获取gametick, 以数字形式存到storage, 没有触发, 需要主动调用
        > str
          获取gametick, 以字符串形式存到storage, 没有触发, 需要主动调用
    > check
      查看时间的东西, 没有触发, 需要主动调用
    > fix_to_gametime
      修正时间到gametime, 没有触发, 需要主动调用

> uid < 前置: scb
    给每个实体提供临时的uid(s3.int), 在tick(init)刷新, 在tick/entity(init)获取

> info_show < 前置: scb(s3.int), state_def(玩家存在检测), time(显示gametime)
  显示一些信息
    > load_cost
      tick(run)的时候计时
      loaded(run)时tellraw玩家从load开始到玩家出现所经历的时间
    > loaded
      loaded(run)时tellraw玩家
    > join
      join(run)时tellraw玩家
    > start
      start(run)时tellraw玩家

> clock_time < 前置: time, state_def
  玩家手上拿着钟能在actionbar上显示时间，就是上面time模块获取的时间, 时间是转化为, 检测在tick/player(def), 运行在tick/player(run)

> dimensions < 前置: triggers
    > check
      发现新维度时设立marker, 进度触发和loaded(run)触发, 在tick/player(run)重设进度

> data < 前置: scb
  创建一个新维度用于存储和处理信息，目测在1.17用不了(毕竟世界格式变更)，实际未测试
    > get_name
      取得执行者的名字, 输出在storage data data.get_name
    > set_pointer
      重置指针, load触发, 或者主动触发

> player_data < 前置: data
  关于玩家uid分配和nbt存储的内容，以方块形式存储在自定义维度，采用盔甲架作为实体指针execute in s3_def:data at @e[type=armor_stand,tag=s3.data_pointer]即可定位指针
    > check_uuid
      检查当前位置的存储是否存在uuid, 以及是否与自身uuid相等
      返回(#data.check_uuid s3.flag), uuid不存在(0), uuid存在但不相等(-1), uuid存在且相等(1)
    > get_uid
      取得执行者uid的json文本形式, 输出在storage data data.get_uid
    > lock
      根据自身的uid将指针移动到对应位置Pos[<uid>,0,0]
      返回(#data.lock), uid不存在或小于1(0), 否则(1)
    > set_box
      当前位置放置潜影盒并设立存储, 原来有则会被覆盖
      返回(#data.set_box), 放置后检测不到潜影盒(0), 已存在潜影盒(-1), 放置成功(1)
    > set_data
      当前位置的容器内设立存储, 并存下uuid之类的信息, 若原来有, 则会被覆盖
    > set_uid
      检查uid对应的位置是否存在存储, 否则递归寻找存储并重置uid, 找不到则创建存储并重置uid
      start(init)触发
    > set_uid_from_x
      根据当前的x轴坐标设立自身的uid
      返回(#data.check_box s3.flag), 潜影盒不存在(0), 潜影盒存在(1)
    > def[tick/player(def)]
      把玩家的uid转化到假名上
      把指针移动到玩家默认存储的位置(Pos[<uid>,0,0])，所以记得移动后移回来

> temp_clear < 前置: ticks
    > entity
      清除标记为s3.temp的实体, 触发在advance(run)

> custom_func < 前置: triggers
  自定义函数, 主要是便于玩家使用多参数函数而设立的, 用法为execute store success <选择器> <操作> run data modify storage temp func.run_list append value {func:"<函数名>", input:{<参数>}} 
  不过实际上目前还没有添加任何自定义函数
    > read
      把特定实体存储复制到storage内, 触发在tick(init)
    > refresh
      检测data内的输入,并运行, 触发在tick(init), 且在read后
    > clear
      收尾, 触发在tick/entity(entity)

> locations < 前置: dimensions
  提供位置的保存和读取, 支持所有实体(大概), 支持自定义维度，可选是否保存朝向角度
locations下的格式像这样locations:{Pos:[x.xd,x.xd,x.xd],Rotation:[x.xf,x.xf],Dimension:"xx:xx"}
    > save
      将位置信息保存到(storage temp locations), 需要主动触发, 默认保存朝向角度, 不需要请设(#locations.save_rotation s3.bool)为1以外的值
    > load
      将实体传送到(storage temp locations)所指的位置, 需要主动触发，若没有朝向角度则不会改变实体的朝向

> inventories
  提供玩家物品栏的保存和读取，支持一次存取自定义范围的物品，附带存取玩家的游戏模式(末影箱保存服务可能在未来上线， 狗头)
  没有使用replaceitem，修改了minecraft下的潜影盒战利品表
    > save
        > hand
          保存手上的物品
        > only(输入: #s3.inventories.save.only s3.int)
          仅保存指定格的物品
        > range(输入: #s3.inventories.save.range.min s3.int, #s3.inventories.save.range.max s3.int)
          保存slot从x开始到y的物品
        > all
          保存全部物品
        > gamemode
          保存游戏模式
    > load
        > hand
          读取物品到手上
        > only(输入: #s3.inventories.load.only s3.int)
          仅读取指定格的物品到指定格
        > range(输入: #s3.inventories.load.range.min s3.int, #s3.inventories.load.range.max s3.int)
          读取slot从x开始到y的物品到slot从x到y, 读取前会清除slot从x到y的格子
        > all
          读取全部物品
        > gamemode
          读取游戏模式

> sight < 前置: uid 
  玩家的视线检测
    > at[tick/player(run)]
      触发的地方()
    > normal
      一个视线检测的例子, 极限距离32格, 检测间距0.2格, 大小为160, 空气类阻力为1, 非空气的#s3_def:can_see_through的阻力是空气的2倍, 不可穿过其它方块(as <玩家> at <触碰位置> #s3_def:sight/normal/block), 不可穿过实体(at <触碰位置> as @e #s3_def:sight/normal/entity), 视线结束时(as <玩家> at <结束位置> #s3_def:sight/normal/end), 超出范围而未结束不会调用函数标签
    > dense
      一个更精密的视线检测, 极限距离8格, 检测间距0.01格, 大小为800, 碰到不可被替换方块或者实体会结束递归
      实体(#s3_def:sight/dense/entity)(as @e at <触碰位置>)
      方块(#s3_def:sight/dense/block)(as <玩家> at <触碰位置>)
      结束(#s3_def:sight/dense/end)(as <玩家> at <结束位置>)
