Files
netease-modsdk-wiki/docs/wiki/animation-controllers/molang-into-scoreboard.md

3.5 KiB
Raw Permalink Blame History

title, mentions
title mentions
将Molang数据导入记分板
SirLich
MedicalJewel105
shanewolf38
Luthorius
TheItsNameless
ThomasOrs

将Molang数据导入记分板

以下提供了一种将任意Molang变量、查询等即时转换为记分板数值的方法。请确保控制器convert状态中调用的动画名称与实体定义中的动画名称animation.namespace.molang_to_score完全匹配。

注意: 需要先在游戏中执行以下两条命令进行初始化: /scoreboard objectives add MoLang dummy /scoreboard players set "#10" MoLang 10

::: code-group

"controller.animation.namespace.molang_to_score": {
  "initial_state": "idle",
  "states": {
    "idle": {
      "transitions": [ { "convert": "<转换启动条件>" } ],
      "on_exit": [ 
        "/scoreboard players set @s MoLang 0",
        "/scoreboard players set \"#var\" MoLang 0",
        "v.convert = <需要转换的变量>;",
        "v.digit = 1000000000;"
      ]
    },
    "convert": {
      "animations": [
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score",
        "molang_to_score"
      ],
      "transitions": [ { "idle": "1" } ]
    }
  }
}

:::

::: code-group

"animation.namespace.molang_to_score": {
  "animation_length": 10.0,
  "anim_time_update": "t.digit = Math.mod(Math.floor(v.convert / v.digit), 10) + 0.1; v.digit = v.digit / 10; return t.digit;",
  "timeline": {
    "0.0": [ 
      "/scoreboard players operation @s MoLang *= \"#10\" MoLang",
      "/scoreboard players operation @s MoLang += \"#var\" MoLang",
      "/scoreboard players set \"#var\" MoLang 0"
    ],
    "1.0": [ "/scoreboard players set \"#var\" MoLang 1" ],
    "2.0": [ "/scoreboard players set \"#var\" MoLang 2" ],
    "3.0": [ "/scoreboard players set \"#var\" MoLang 3" ],
    "4.0": [ "/scoreboard players set \"#var\" MoLang 4" ],
    "5.0": [ "/scoreboard players set \"#var\" MoLang 5" ],
    "6.0": [ "/scoreboard players set \"#var\" MoLang 6" ],
    "7.0": [ "/scoreboard players set \"#var\" MoLang 7" ],
    "8.0": [ "/scoreboard players set \"#var\" MoLang 8" ],
    "9.0": [ "/scoreboard players set \"#var\" MoLang 9" ]
  }
}

:::

实现原理: 当转换启动时控制器会重置玩家的MoLang分数和#var虚拟玩家的MoLang分数。转换变量v.convert被初始化,数字位变量v.digit被设置为获取第十位数字10^10。第一个动画运行时会根据当前位数设置动画时间并将数字位变量调整为下一位第9位10^9。由于时间轴索引会持续运行到设定时间"0.0"时间点的事件总是会被触发。这会将玩家的MoLang分数乘以10来设置正确的位数然后加上最后获取的数字首次运行时由于控制器重置了#var该值始终为0。整个过程重复执行11次以获取转换变量的全部10位数字。需要注意的是每个动画处理的是前一个动画设置的数字位因此需要运行11次动画。

游戏内测试方法:<转换启动条件>设为q.is_using_item<需要转换的变量>设为Math.random_integer(0, 9999)。手持苹果开始食用,即可观察数值转换过程。