KubeJS Goety

KubeJS Goety

用于Goety模组的KubeJS集成。允许通过JavaScript脚本自定义Goety仪式需求、酿造系统和配方系统。

KubeJS

KubeJS Goety

用于 Goety 模组的 KubeJS 集成。允许通过 JavaScript 脚本自定义 Goety 仪式需求、酿造系统和配方系统。

功能

  • ✅ 使用 GoetyEvents 事件系统
  • ✅ 创建和修改仪式类型,支持完全自定义的仪式条件检查逻辑
  • ✅ 酿造系统配置(容量修饰符、催化剂、增幅物)
  • ✅ 配方系统配置(仪式配方、酿造配方、粉碎配方等)
  • ✅ 服务端脚本支持(server_scripts)
  • ✅ 无需修改 Goety 模组本身

需求

  • Minecraft 1.20.1
  • Forge 47.1.65+
  • KubeJS 2001.6+
  • Goety 2.5.38+

安装

  1. 将模组放入 mods 文件夹
  2. 确保已安装 KubeJS 和 Goety 模组
  3. 启动游戏

仪式系统配置

GoetyEvents.modifyRitual 和 GoetyEvents.registerRitual

使用 GoetyEvents 事件系统自定义 Goety 仪式需求。

创建脚本文件

在您世界存档目录中创建一个脚本文件:

你的世界存档/
└── kubejs/
    └── server_scripts/
        └── goety_rituals.js

修改现有仪式条件

GoetyEvents.modifyRitual(event => {
    // event.modify(ritualId, modifier)
    // - ritualId: 要修改的仪式 ID (字符串)
    // - modifier: 接收仪式对象的修改器函数
    
    // 使用配置风格修改
    event.modify('storm', ritual => {
        ritual.blocks = ['8x #minecraft:copper_ores', '3x minecraft:lightning_rod'];
        ritual.setWeather('thunder');         // 需要雷雨天气
        ritual.setMinY(128);                  // 高度 >= 128
        ritual.setRequireSkyVisible(true);    // 需要天空可见
    });
    
    // 使用自定义函数修改
    event.modify('magic', ritual => {
        ritual.setRequirement((tileEntity, pos, level) => {
            // 自定义检查逻辑
            // 如果满足条件则返回 true,否则返回 false
            return true;
        });
    });
});

创建新的仪式类型

GoetyEvents.registerRitual(event => {
    // event.create(ritualId, builder)
    // - ritualId: 仪式的唯一标识符 (字符串)
    // - builder: 接收仪式对象的构建器函数
    
    // 创建简单仪式(仅需要方块)
    event.create('diamond_ritual', ritual => {
        ritual.blocks = ['5x minecraft:diamond_block', '3x minecraft:emerald_block'];
    });
    
    // 创建复杂仪式(需要特殊条件和完成效果)
    event.create('thunder_ritual', ritual => {
        ritual.blocks = ['minecraft:lightning_rod'];
        ritual.setWeather('thunder');         // 需要雷雨天气
        ritual.setRequireSkyVisible(true);    // 需要天空可见
        ritual.setJeiIcon('minecraft:lightning_rod');  // 设置 JEI 显示图标(可选)
        
        // 设置仪式完成时的回调函数(可选)
        // 注意:此回调在配方完成时触发,即仪式成功执行并产生结果后
        ritual.setOnFinish((world, darkAltarPos, tileEntity, castingPlayer, activationItem) => {
            // 获取坐标
            let x = darkAltarPos.getX ? darkAltarPos.getX() : darkAltarPos.x;
            let y = darkAltarPos.getY ? darkAltarPos.getY() : darkAltarPos.y;
            let z = darkAltarPos.getZ ? darkAltarPos.getZ() : darkAltarPos.z;
            
            // 使用指令播放声音(服务端)
            let server = world.getServer ? world.getServer() : null;
            if (server) {
                server.runCommandSilent(`playsound minecraft:entity.lightning_bolt.thunder weather @a ${x} ${y} ${z} 1 1`);
            }
        });
    });
});

禁用内置仪式

要禁用内置仪式,使用 modifyRitual 使条件检查始终返回 false:

GoetyEvents.modifyRitual(event => {
    event.modify('storm', ritual => {
        ritual.requirement = () => false; // 始终返回 false 以禁用仪式
    });
});

配置选项

ritual 对象支持以下配置选项:

  • ritual.range (整数): 扫描范围 (默认 16)
  • ritual.blocks (数组/字符串): 方块需求配置
    • 支持的格式: '9x minecraft:stone', '/pattern/', '#tag', '@mod'
    • 正则表达式示例: '16x /prismarine/' 匹配所有包含 prismarine 的方块
  • ritual.setDimension(dimensionId, containsMatch) (字符串, 布尔值): 维度限制
    • dimensionId: 维度 ID,例如 'minecraft:the_nether' 或 'aether'
    • containsMatch: false (精确匹配,默认) 或 true (模糊匹配)
  • ritual.setWeather(weather) (字符串): 天气需求 ('thunder'/'rain'/'clear')
  • ritual.setTimeOfDay(timeOfDay) (字符串): 时间需求 ('day'/'night')
  • ritual.setBiome(biomeValue, type) (对象, 字符串): 生物群系需求
    • biomeValue: 生物群系值 (可以是字符串或数组),或方法名 (当 type='func' 时)
    • type: 'id' (生物群系 ID,默认),'tags' (标签),'func' (方法调用)
    • 方法调用: ritual.setBiome('coldEnoughToSnow', 'func') 调用 biome.coldEnoughToSnow(pos) 方法
    • 支持 Biome 类中的任何布尔方法,通过反射调用
  • ritual.setMinY(y) (整数): 最小高度需求
  • ritual.setMaxY(y) (整数): 最大高度需求
  • ritual.setRequireSkyVisible(boolean) (布尔值): 是否要求天空可见
  • ritual.setRequireAltarWaterlogged(boolean) (布尔值): 是否要求祭坛含水
  • ritual.setJeiIcon(item) (字符串/对象): JEI 显示图标 (物品 ID 或物品对象,可选,默认为黑曜石)
  • ritual.setOnFinish(callback) (函数): 配方完成时触发的回调函数 (即仪式成功执行并产生结果后),接收参数 (world, darkAltarPos, tileEntity, castingPlayer, activationItem)
  • ritual.setRequirement(function) (函数): 自定义检查函数 (会覆盖所有配置)

本地化(可选)

如果您创建了新的仪式类型并希望在 JEI 或游戏中显示英文名称,您需要添加本地化文件:

使用 KubeJS 资源包

在您世界存档目录中创建资源包结构:

你的世界存档/
└── kubejs/
    └── assets/
        └── goety/
            └── lang/
                └── en_us.json

在 en_us.json 中添加:

{
  "jei.goety.craftType.diamond_ritual": "Diamond Ritual",
  "jei.goety.craftType.flame_ritual": "Flame Ritual"
}

本地化键名格式:

  • 键名: jei.goety.craftType.<ritualId>
  • 其中 <ritualId> 是您创建仪式时使用的 ID

注意:

  • 如果您不添加本地化,仪式名称将显示为仪式 ID (例如 diamond_ritual)
  • 本地化是可选的,不影响仪式功能
  • 您可以只添加需要的语言文件

酿造系统配置

GoetyEvents.registerBrew

配置 Goety 的酿造系统,包括容量修饰符、催化剂和增幅物。

创建脚本文件

在您世界存档目录中创建一个脚本文件:

你的世界存档/
└── kubejs/
    └── server_scripts/
        └── goety_brews.js

注册容量修饰符

GoetyEvents.registerBrew(event => {
    // event.addCapacity(item, level)
    // - item: 物品 ID (字符串) 或物品对象
    // - level: 等级 (0-7)
    
    event.addCapacity('minecraft:nether_wart', 0);
    event.addCapacity('mymod:magic_crystal', 6);
});

注册增幅物

GoetyEvents.registerBrew(event => {
    // event.addAugmentation(item, modifier, level)
    // - item: 物品 ID (字符串) 或物品对象
    // - modifier: 增幅类型 (字符串)
    //   - 'capacity' - 容量
    //   - 'duration' - 持续时间
    //   - 'amplifier' - 效果放大器
    //   - 'aoe' - 效果范围
    //   - 'linger' - 滞留效果
    //   - 'quaff' - 饮用效果
    //   - 'velocity' - 速度
    //   - 'aquatic' - 水生
    //   - 'fire_proof' - 防火
    // - level: 等级 (整数)
    
    event.addAugmentation('minecraft:redstone', 'duration', 0);
    event.addAugmentation('mymod:time_crystal', 'duration', 3);
    event.addAugmentation('mymod:power_crystal', 'amplifier', 2);
});

完整示例

GoetyEvents.registerBrew(event => {
    // 容量修饰符
    event.addCapacity('mymod:magic_crystal', 6);
    event.addCapacity('mymod:magic_dust', 5);
    
    // 增幅物
    event.addAugmentation('mymod:time_crystal', 'duration', 3);
    event.addAugmentation('mymod:power_crystal', 'amplifier', 2);
    event.addAugmentation('mymod:range_crystal', 'aoe', 1);
});

注意:

  • 添加容量修饰符和增幅物 → 使用 GoetyEvents.registerBrew
  • 添加催化剂(酿造配方) → 使用 event.recipes.goety.brewing (详见下方配方系统)

配方系统配置

ServerEvents.recipes

使用 KubeJS 标准配方事件来配置 Goety 的配方系统。

创建脚本文件

在您世界存档目录中创建一个脚本文件:

你的世界存档/
└── kubejs/
    └── server_scripts/
        └── goety_recipes.js

仪式配方

ServerEvents.recipes(event => {
    // event.recipes.goety.ritual(result, ritualType, ingredients)
    // - result: 输出物品 (OutputItem)
    // - ritualType: 仪式类型 ID,根据功能选择:
    //   - 'goety:craft' - 合成物品 (最常用)
    //   - 'goety:enchant' - 附魔
    //   - 'goety:summon' - 召唤实体
    //   - 'goety:summon_tamed' - 召唤已驯服实体
    //   - 'goety:convert' - 转化实体
    //   - 'goety:teleport' - 传送
    // - ingredients: 材料数组 (InputItem[])
    
    // 合成仪式
    event.recipes.goety.ritual('minecraft:emerald', 'goety:craft', [
        'minecraft:gold_ingot',
        'minecraft:gold_ingot',
        'minecraft:diamond'
    ])
        .activationItem('minecraft:ender_pearl')
        .craftType('forge')  // 锻造仪式
        .soulCost(5)
        .duration(20);
    
    // 召唤仪式
    event.recipes.goety.ritual('goety:jei_dummy/none', 'goety:summon', [
        'minecraft:rotten_flesh',
        'minecraft:bone'
    ])
        .activationItem('minecraft:ender_pearl')
        .craftType('necroturgy')
        .soulCost(10)
        .entityToSummon('minecraft:zombie')
        .summonLife(6000);
});

酿造配方

ServerEvents.recipes(event => {
    // event.recipes.goety.brewing(ingredient, effect)
    // - ingredient: 材料物品 (InputItem)
    // - effect: 效果 ID (字符串,例如 'minecraft:regeneration')
    
    event.recipes.goety.brewing('minecraft:golden_apple', 'minecraft:regeneration')
        .soulCost(15)
        .capacityExtra(0)
        .duration(30);  // 30 秒
    
    // 需要特定实体的酿造配方
    event.recipes.goety.brewing('minecraft:nether_star', 'minecraft:resistance')
        .soulCost(50)
        .entityType('minecraft:ender_dragon');  // 需要末影龙
});

配置优先级:

  • 您可以使用 event.recipes.goety.brewing 添加新的催化剂配方或调整现有效果的灵魂消耗 (.soulCost())
  • 如果同时使用了 config/goety-brews.toml 和 KubeJS 脚本,则 KubeJS 脚本具有更高优先级,会覆盖配置文件设置
  • 建议使用 KubeJS 脚本,因为它更灵活且易于版本控制

粉碎配方

ServerEvents.recipes(event => {
    // event.recipes.goety.pulverize(ingredient)
    // - ingredient: 材料物品 (InputItem)
    
    // 产出方块的粉碎配方
    event.recipes.goety.pulverize('minecraft:cobblestone')
        .blockResult('minecraft:gravel');
    
    // 产出物品的粉碎配方
    event.recipes.goety.pulverize('minecraft:gravel')
        .itemResult('minecraft:flint');
});

诅咒灌注配方

ServerEvents.recipes(event => {
    // event.recipes.goety.cursed_infuser_recipes(result, ingredient)
    // - result: 输出物品 ID (字符串)
    // - ingredient: 材料物品 (InputItem)
    
    event.recipes.goety.cursed_infuser_recipes('minecraft:emerald', 'minecraft:iron_sword')
        .cookingTime(100);  // 5 秒 (100 ticks)
});

火盆配方

ServerEvents.recipes(event => {
    // event.recipes.goety.brazier(result, ingredients)
    // - result: 输出物品 (OutputItem)
    // - ingredients: 材料数组 (InputItem[])
    
    event.recipes.goety.brazier('minecraft:emerald', [
        'minecraft:soul_sand',
        'minecraft:soul_sand',
        'minecraft:soul_sand',
        'minecraft:lapis_lazuli'
    ])
        .soulCost(10);
});

移除配方

ServerEvents.recipes(event => {
    // 移除现有配方
    event.remove({ type: 'goety:ritual', craftType: 'magic' });
    event.remove({ type: 'goety:brewing', effect: 'minecraft:poison' });
    event.remove({ type: 'goety:pulverize', ingredient: 'minecraft:cobblestone' });
});

贡献

欢迎提交 Issue 和 Pull Request!