Skip to content

食用说明书

MiaoMiaoMax edited this page Nov 4, 2022 · 10 revisions

👋 Welcome to the MeowHouseModule wiki!
📝 Only Chinese versions available. (This sentence is machine-translated)

本作品采用知识共享署名-非商业性-相同方式共享 4.0 国际许可协议进行许可。
要查看此许可证的副本,请访问 https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh

This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/4.0/

食用前提

  • 前置addon [MeowHouse(喵喵屋)] 是不可或缺的
  • 游戏版本:1.19.40(Bedrock)
  • 游戏存档需要开实验玩法(应用测试框架,等)

关于存档的作弊选项

游戏存档的作弊选项可以不开,但在应用了行为包的存档,
成就已是被禁用,无法获得成就,而本模块是行为包。
所以推荐启用作弊,以获得更好的体验。


自定义单方块随机池

本节为高级食用方法,不推荐跳着看

什么是随机池

在本模块中“随机池”将指有选择优先级的随机表,不是单一的随机列表。

单一的随机列表将是以相同的概率选取列表里定义各个项,
假如列表有n个项,那么某一项被选到的概率为 1/n,无论随机次数是多少。

随机池将在定义列表里项的时候,同时赋予选取权重(优先级),
假如列表有n个项,某个项的权重为q,随机次数为i,那么他被选到的概率为 (q-i)/n 。
可以看到随机次数越大越容易选到权重越大的项。

首先我们看看随机池文件所在目录:

其中 events.js 事件随机池 的自定义对大部分玩家来说难度过高,
所以暂时不详细讲解。

好,让我们开始自定义吧 awa

1. events.js 事件随机池

const events2 = () => [
    [dfksjE_zombieSiege, 3]/* 僵尸围岛 */
]
const dfksjE_zombieSiege = (meowEvent, queryNoThis) => {
    queryNoThis.runCommandAsync(`say @${meowEvent.player.name},僵尸围岛`);
    for (let i = 0; i < 10; i++) {
        const zombie = meowEvent.dimension.spawnEntity("minecraft:zombie", meowEvent.player.location);
        zombie.addEffect(mc.MinecraftEffectTypes.fireResistance, 12000, 0, false);
    }
    return true;
}

以上为 events.js 事件随机池 的部分代码摘要。

让此随机池进一步简单化已是提案。。。

未完待续。。。

2. chests.js 宝箱随机池

const chests1 = () => [
    /* [随机权重, ["物品", 占用格数(可getRndInteger获得随机数), 每格最大数量, 特殊值, 每格最小数量(省略=默认1)], ...[第n个物品]] */
    [1, ["minecraft:apple", methods.getRndInteger(8, 10), 5, 0], ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]]
]

以上为 chests.js 宝箱随机池 的部分代码摘要。

其中 chests1 是一个池,chests2 chests3 同理,他们都是独立,互不干扰的。

const chests1 = () => [
    随机项1,
    随机项2,
    ·
    ·
    ·
    随机项n
]

chests1 指传奇宝箱随机池
chests2 指稀有宝箱随机池
chests3 指普通宝箱随机池

在上面的代码摘要可以看到,随机项:

/* [随机权重, ["物品", 占用格数(可getRndInteger获得随机数), 每格最大数量, 特殊值, 每格最小数量(省略=默认1)], ...[第n个物品]] */
[1, ["minecraft:apple", methods.getRndInteger(8, 10), 5, 0], ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]]

/* 这是注释 */ 不是一个随机项 awa

随机权重是这一项在所在随机池的权重(优先级)
在本章节开头已讲述,这里不再赘述。

在随机权重后面的是一个一个 [像这样被包住的东西] ,都代表一种物品。
他的写法为 [物品名, 占用格数, 梅格最大数量, 特殊值, 每格最小数量(可选)]

  • 物品名是命令give处能用的英文名,比如 minecraft:apple
    (物品的赋命名空间标识符(Namespaced identifier))

  • 占用格数为在宝箱中占用的格子,如果为n (n为不大于27的正整数),
    那么该物品在宝箱中将占用n个格子。
    可以使用 methods.getRndInteger(最小值, 最大值) 来获得随机数。

    请注意,在同一随机项中,所有物品共用27个格子,不会重复利用格子。
    假如有一物品占用了20个格子,那么留给其他未生成的物品的可用格子只有7个。

  • 每格最大数量,字面意思,每格该物品的最大数量。

  • 特殊值,字面意思,该物品的特殊值。

  • 每格最小数量,字面意思,每格该物品的最小数量。
    此参数不是必须的,可不填,默认值为1。

规范

每个参数之间要用,(英文逗号)隔开,这是必须的。
后面跟着的空格,是书写规范,非必须,
但让我们的代码-随机池可读性更高。(即看着舒服)
方便日后维护,提高效率。

例如:[参数1, 参数2, 参数3] 或者适当添加换行与缩进:

[
  参数1,
  参数2,
  参数3
]

缩进一般以4个空格、1个制表符为常见单位。
除此之外,还有2个空格、3个空格、8个空格、等为缩进单位。
选择什么单位当然是看自己的意愿,但推荐还是4个空格。
因为用手机编辑时制表符可能没有那么方便输入。
(此项目的雏形正是在作者手机上诞生的)
(当时作者找了好久手机上好用的编辑器)
好,收,离题了,如果你有对自己更高的要求,不妨看看大佬们总结的书写原则
注意,请不要混用缩进单位,一个经典的例子:制表符与4个空格混用。
这将会让你的代码有糊糊味。。。

例如:

  • 在现有的某一项进行修改,原:

    [1, ["minecraft:apple", methods.getRndInteger(8, 10), 5, 0], ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]]

    为了演示,我们给他适当添加换行与缩进:

    [
        1, 
        ["minecraft:apple", methods.getRndInteger(8, 10), 5, 0],
        ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]
    ]

    温馨提示:这样也是可以运行的,是有效的,前提是规范没有错。

    给苹果 minecraft:apple 定义每格最小数量为 2:

    [
        1, 
        ["minecraft:apple", methods.getRndInteger(8, 10), 5, 0, 2 /* 最小格数 */],
        ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]
    ]

    之后把苹果从8到10之间的随机占用格数,改成9到11之间的随机占用格数:

    [
        1, 
        ["minecraft:apple", methods.getRndInteger(9, 11) /* 占用格数 */, 5, 0, 2],
        ["minecraft:golden_apple", methods.getRndInteger(2, 5), 5, 0]
    ]

    之后把金苹果 minecraft:golden_apple 的占用格数改成 1:

    [
        1, 
        ["minecraft:apple", methods.getRndInteger(9, 11), 5, 0, 2],
        ["minecraft:golden_apple", 1 /* 占用格数 */, 5, 0]
    ]

    添加附魔金苹果 minecraft:enchanted_golden_apple
    并定义占用一个格子,每格最小为0个,最大为1个:

    [
        1, 
        ["minecraft:apple", methods.getRndInteger(9, 11), 5, 0, 2],
        ["minecraft:golden_apple", 1, 5, 0], // 不要忘记","(英文逗号)
        ["minecraft:enchanted_golden_apple", 1, 1, 0, 0] // 添加的附魔金苹果
    ]

    经过以上修改后在随机池的样子:

    const chests1 = () => [
        [
            1, 
            ["minecraft:apple", methods.getRndInteger(9, 11), 5, 0, 2],
            ["minecraft:golden_apple", 1, 5, 0],
            ["minecraft:enchanted_golden_apple", 1, 1, 0, 0]
        ]
    ]
    
    // 或者
    const chests1 = () => [
        [1, ["minecraft:apple", methods.getRndInteger(9, 11), 5, 0, 2], ["minecraft:golden_apple", 1, 5, 0], ["minecraft:enchanted_golden_apple", 1, 1, 0, 0]]
    ]

    关于 “占用格数的随机数” 与 “每格最小最大数产生的随机数”

    当然只要你愿意,双重随机也不是不行。
    非必须,不建议这样,毕竟即使是0.001s的性能开销,也是浪费了性能。
    当然,你无所谓的话。。。那就无所谓吧。谁。谁要管你(气嘟嘟 o(≧口≦)o

    双重随机的妙用:

    ["minecraft:apple", methods.getRndInteger(0, 1), 1, 0, 0]

    如上例子,这个苹果将更难于被生成:

    • 初始化 ——————————> 生成概率 = 100% ——> 100%
    • 占用格数为0至1的随机数 ——> 生成概率 * 50% ———> 50%
    • 每格最小为0,最大为1 ———> 生成概率 * 50% ———> 25%
    • 结果:生成概率 = 25%

未完待续。。。

温馨提醒:你看到上面有一个Pages了吗,点开他将打开此Wiki的大门(

欢迎关注作者bilibli平台 CNQuanYeCha 的动态

如果觉得不错,可以给项目一个Star awa

Clone this wiki locally