
One Enough Damage
自由调整怪物伤害、硬编码伤害以及许多技能伤害。
OneEnoughDamage
你是否曾遇到过无法修改的硬编码伤害值?
你是否曾因为没有可用的切入点而难以平衡投射物、尖牙、魔法、召唤物或范围攻击的伤害?
你是否知道利维坦有 11 种不同的伤害值,而伊格尼斯有 17 种?
你的整合包是否包含数百种需要平衡伤害的生物?
有了 OED,调整伤害变得简单。每个模组的硬编码伤害会在启动时被扫描,相关的属性条目会自动注册到对应的生物身上。 你也可以直接在配置文件中编辑默认值,包括原版的伤害属性。对于需要平衡各种伤害的整合包作者来说,只需一秒即可完成重载。
自动属性注册
默认情况下,此模组会在启动时扫描 Minecraft 本身以及所有已安装模组中的硬编码伤害,然后将任何可以分配给特定生物的伤害注册为属性。
归属关系通过静态分析来追踪。例如,由唤魔者召唤的唤魔者尖牙会被分配给该唤魔者,大多数召唤伤害、增益效果伤害以及类似情况也能被正确分配给所有可能的源生物。
属性 ID 示例:oneenoughdamage:fuzs/illagerinvasion/world/entity/monster/invoker_fangs/damage/2/r
命名规则是精确的伤害点路径、顺序和计算模式。r 表示固定伤害,而 m 表示倍率伤害。倍率属性仅用于动态情况,例如随难度变化的伤害,默认值为 1.0。
你安装的模组越多,扫描所需的时间就越长。一个包含大约 200 个模组的整合包预计需要十秒钟进行扫描。首次启动后,你可以在配置中启用 readCache,这样后续启动将直接读取缓存并跳过扫描阶段。
快速伤害调整
安装此模组后,你有两种方法来调整生物伤害:直接在配置文件中编辑默认伤害值,或者通过 KubeJS 等工具动态修改属性。
以下文件生成在 config/OED/ 目录下:
damage_points-cache.json:扫描缓存,供机器读取。文件可能很大,通常可以忽略。damage-point-dictionary.md:已注册属性的伤害点字典,内置中英双语名称,并按生物分组显示伤害,方便查找。damage-point-dictionary.toml:可编辑的配置文件,布局类似字典。其中也包含原版的minecraft:generic.attack_damage。damage-point-unattributed.md:当前无法安全分配给某个生物的伤害点。oneenoughdamage.toml:模组行为配置文件。
修改 damage-point-dictionary.toml 中的属性值会直接更改属性注册时使用的默认值,但需要重启游戏才能生效。这非常适合不需要动态伤害变更的简单平衡调整。
如果你仍在测试,可以在配置中启用 debugMode。这样,文件中的默认值更改将被监视并立即注入到游戏中。
可编辑的条目包括原版的 minecraft:generic.attack_damage,因此即使硬编码伤害不是你的主要关注点,你也可以快速调整和测试许多生物的伤害。
damage-point-dictionary.toml 会进行增量更新。当你添加或移除模组时,现有配置会被备份,同时添加或移除条目,并保留你对属性值的修改。
动态伤害调整
如果你需要动态调整伤害,建议使用 KubeJS 调用与属性相关的方法,或使用指令。
推荐教程:
以下示例将灾变模组中紫晶蟹在受伤后缩回地下并重新跳出时造成的范围伤害加倍。安装 ProbeJS 后,输入 @attribute 可以触发属性名称的自动补全。
// server_scripts
EntityEvents.hurt(event => {
if (event.getEntity().is("cataclysm:amethyst_crab")) {
/** @type {Internal.LivingEntity} */
let entity = event.getEntity();
let attr = `oneenoughdamage:com/github/l_ender/cataclysm/entity/animation_monster/boss_monsters/amethyst_crab_entity/area_attack/1/m`;
entity.modifyAttribute(attr, "oneenoughdamage:example", 1, 'addition');
}
});
覆盖率
大多数由原始数字或简单变量组合定义的伤害都可以被扫描到。由于部分模组作者有自己的实现方式,无法保证 100% 的覆盖率。
迄今为止,原版 Minecraft、灾变模组和袭击者入侵模组已进行测试,覆盖率非常高。后两个模组的伤害几乎全部是硬编码的。
灾变模组拥有自己的动态伤害系统,因此许多已注册的属性采用倍率形式,默认值为 1.0。这部分无法保证完美检测,需要持续改进。
对于灾变模组,此模组的主要用途是平衡同一生物身上的不同伤害值。例如,利维坦有 11 种不同的伤害值,伊格尼斯有 17 种,而原版只提供了单一的 minecraft:generic.attack_damage,这远远不够。
实际上,仍有一些硬编码情况此模组无法解决。例如,一个生物可能召唤一个没有 owner 字段的投射物实体,并且该投射物可能使用空的 DamageSource 对玩家造成伤害。
通过一些技巧,有可能追踪造成该伤害的生物类型。不幸的是,当同一类型的多个生物同时存在时,精确追踪目标生物是非常困难的。
为此,有一个基于附近搜索的备用方案效果不错:
inferAttributeHolder:当伤害没有直接的LivingEntity攻击者时,尝试推断附近的实体作为所有者。inferAttributeHolderSearchRadius:所有者推断的搜索半径,以方块为单位。
如果你遇到其他覆盖问题,欢迎反馈。
未来计划
- 持续改进覆盖率
- 添加游戏内可视化编辑属性默认值的功能
- 移植到其他版本
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。