本篇教程由作者设定使用 CC BY-NC-SA 协议。

方块实体破坏机制

搬运翻译自模组官方wiki

机制概述

Powershot 方块实体破坏机制与配置文件-第1张图片弹射物破坏逻辑流程图

  1. 每当一个弹射物被发射出去时,就会为它计算出一个力量值并赋予它。注意,这个力量等级和原版 Minecraft 的力量魔咒等级是不一样的。这是 Powershot 内部的隐藏计算值。

  2. 然后弹射物正常飞行,直到撞上一个实体方块。

  3. 当它击中一个方块时,将进行检查以确定该方块是否可被破坏,并检查弹射物是否满足了方块被破坏所需的力量值。然后,它要么:

    1. 如果该方块不能被破坏或未满足破坏要求,则停止弹射物飞行并将其力量值设置为零;

    2. 穿过并破坏方块,力量值减去相应数值并继续飞行。每当它击中更多方块时,都要重复以上检查。

    力量值计算

    弹射物的初始力量值用以下方式计算:

    1. 用一个基础值乘以弹射物的速度,单位为方块距离/秒

    2. 将发射它的物品上存在的任何魔法的等级乘以相应的乘数的等级乘以其相应的乘数

    3. 将所有这些值加在一起。用一个公式来总结就是:

      Powershot 方块实体破坏机制与配置文件-第2张图片

      其中:

      P 为计算初始力量值
      B 为基础力量值
      S 为弹射物的速度(方块距离/秒)
      Li 为发射弹射物的物品(弓、弩等)带有的各个魔咒等级
      Mi 为每个魔咒的相关乘数因子

    基本力量值和每种魔咒的乘数因子可以通过配置文件来设置。请注意,如果一个弹射物不是用一个物品发射的(例如从发射器中发射的),那么它就不会通过魔咒加成项获得任何额外的力量值。

    下表列出了在原版 Minecraft 中的一些弹射物的速度。

    弹射物来源速度
    玩家(弓)0.3-3.0

    玩家(弩)3.15

    骷髅1.6

    掠夺者
    1.6

    幻术师2.5

    发射器1.1
    三叉戟玩家1.6

    溺尸体1.6

    可破坏方块

    可破坏方块被赋予两种属性,决定了它们与弹射物的交互方式。

    • 力量值要求

      弹射物破坏方块所需的最小力量值

      力量值低于要求的弹射物将无法破坏该方块(例如,力量值为2.5的弹射物无法破坏力量值要求为3.0的方块,而力量值为3.0的弹射物则可以)。

    • 力量值衰减

      方块被破坏时弹射物减少的力量值

      一旦弹射物破坏了一个方块,它的力量值就会被该方块的力量值衰减所降低(例如,一个力量值为2.5的弹射物在破坏一个力量值衰减为1.0的方块时,它的力量值就会降低到1.5)。

      可以通过配置文件来指定可破坏方块和它们的属性。


    配置文件

    Powershot 的配置被存储为两个JSON文件:power_calculation.json 和 breakable_blocks.json。它们应该在<minecraft根目录>/config/powershot 文件夹目录下可以找到。

    为了更好地理解这些配置的作用,建议先完整阅读关于这个模组的工作原理(见上文方块破坏机制一栏)。


    power_calculation.json

    这个文件定义了用于计算弹射物力量值的数值。它应该包含一个具有下列成员的 json object 对象:


    值名值类型描述
    schema_versionNumber配置文件格式版本(不用动它)
    base_powerNumber弹射物基础力量值
    enchantment_multipliersObject魔咒乘数因子条目

    魔咒乘数因子条目
    魔咒乘数因子条目必须是一个包含 命名空间-魔咒-ID-乘数因子对(namespaced-enchantment-ID-to-multiplier) 的对象。

    样例:

    {
      "minecraft:power": 2.0,
      "minecraft:piercing": 2.0,
      "minecraft:punch": 1.0,
      "minecraft:knockback": -1.0
    }


    breakable_blocks.json
    该文件定义了所有可破坏方块和它们的属性。它应该包含一个 json object 对象,具有以下成员:



    值名值类型描述
    schema_versionNumber配置文件格式版本(不用动它)
    entriesArray一个包含顶层条目的数组

    顶层条目

    一个顶层条目必须是一个 json object 对象,它包含一个方块条目和/或一个标签条目用来指定一个或一组可被破坏方块。在这里还可以配置力量值要求和力量值衰减。下表描述了有效的成员值。

    值名值类型值是否必须存在的条件描述
    blocks
    String/Object/Array如果 tags 没有被指定方块条目
    tagsString/Array如果 blocks 没有被指定标签条目
    power_req
    Number无(默认值为1.5)力量值要求
    power_redNumber无(默认值为1.5)力量值衰减

    样例:

    {
      "blocks": "minecraft:glass",
      "tags": "minecraft:logs",
      "power_req": 3.0,
      "power_red": 1.5
    }


    方块条目

    一个方块条目必须指定一个方块或一组方块。它可以是一个字符串、一个 json object 对象或一个数组。

    作为字符串

    一个字符串方块条目必须是一个单一的带有命名空间的方块ID。被指定方块在所有状态下皆可被弹射物破坏。

    样例:

    "minecraft:torch"

    作为对象

    一个对象方块条目必须包含一个带有命名空间的方块ID。对象里可以包含一个方块状态条目的数组,以指定哪些状态应该是可破坏的。如果对象不包含后者,那么该方块的所有状态都是可破坏的。下表描述了有效的对象成员:


    值名值类型值是否必须存在的条件描述
    id
    String必选带命名空间的方块ID
    statesArray非必选一个方块状态条目数组


    样例:

    {
      "id": "minecraft:glass_pane",
      "states": [
        "north=true,south=true",
        "north=false,south=false,east=true,west=true"
       ]
    }

    作为数组

    一个数组方块条目必须只包含字符串方块条目和/或对象方块条目。

    样例:

    [
      "minecraft:cocoa",
      "minecraft:torch",
      {
        "id": "minecraft:glass_pane",
        "states": [
          "north=true,south=true",
          "north=false,south=false,east=true,west=true"
         ]
       }
    ]

    方块状态条目

    一个方块状态条目必须是一个字符串,包含以逗号隔开的方块状态属性的字符串,代表一个单一的方块状态。如果没有指定一个方块状态的所有属性,未指定的属性将被设置为其默认值。例如,如果你在为方块 minecraft:bamboo 创建条目,下面的样例将代表同一个方块状态。

    样例:

    "age=1"
    "age=1,leaves=none,state=0"

    标签条目

    一个标签条目必须指定一个或一组方块标记。它可以是一个字符串或一个数组。

    作为字符串

    一个字符串标签条目必须是一个单一的带命名空间的方块标签。该标签所包含的所有方块的所有状态皆可被弹射物破坏。

    样例:

    "minecraft:logs"

    作为数组

    一个数组标签条目必须只包含字符串标签条目。

    样例:

    [
      "minecraft:bamboo_plantable_on",
      "minecraft:logs",
      "minecraft:enderman_holdable"
    ]