全面重做的伤害机制

全面重做的伤害机制

围绕伤害的几个机制进行了全面重做。包括元素伤害和盾牌格挡。

冒险

全面改革伤害

对围绕伤害的若干机制进行了全面改革。其灵感来源于《黑暗之魂》和《英灵神殿》等游戏,旨在深化《我的世界》的战斗。

效果积累

效果积累是一种资源(如同生命值),默认为零。某些事件(如受到伤害)会增加或减少这些资源。积累值也会随时间缓慢减少。

如果积累值达到某个阈值,就会施加相应的状态效果,并将积累值重置为零。

目前,有以下几种效果积累:

  • 流血
  • 燃烧
  • 冰冻
  • 中毒
  • 感电
  • 失衡

效果积累会显示在 HUD 上。

该系统的几乎所有方面都可以通过实体属性、配置文件和/或数据包进行配置。

状态效果

全面改革伤害添加了若干被效果积累所使用的状态效果。它们可以在服务器配置中进行配置。

其中一些效果目前没有游戏玩法上的作用,因为所需的第三方 API 尚未更新。

效果积累也可以配置为使用其他效果。

全面改革伤害添加的状态效果有:

  • "overhauleddamage:bleeding",造成实体最大生命值一定百分比的伤害。当实体移动时,伤害翻倍。
  • "overhauleddamage:burning",造成伤害。此效果试图将硬编码的 "on_fire" 实体标志重新实现为一种状态效果。
  • "overhauleddamage:chilled",降低攻击和移动速度。
  • "overhauleddamage:frozen",目前没有游戏玩法上的作用。计划用于使实体无法移动并阻止任何行动。目前正在等待第三方模组更新。
  • "overhauleddamage:poison",原版状态效果的可配置版本。与原版对应物不同,此效果可以致死。
  • "overhauleddamage:shocked",目前没有游戏玩法上的作用。计划用于增加对实体造成的伤害。目前正在等待第三方模组更新。
  • "overhauleddamage:staggered",目前没有游戏玩法上的作用。计划用于使实体无法移动并阻止任何行动。目前正在等待第三方模组更新。
  • "overhauleddamage:hit_stun",降低攻击和移动速度。

全面改革伤害计算

在《我的世界》中,对实体造成的每次伤害都有一个"伤害类型"。这决定了死亡消息以及抗性等机制。

全面改革伤害扩展了此系统。每个启用的改革自然都会禁用相应的原版实现。

当实体受到伤害时,这不再只是减少生命值。根据伤害类型,可能会产生各种效果。这仍然可以包括生命值减少,但也可能是效果积累增加,甚至可以修改法力/耐力。

具体发生什么,由伤害类型决定,或者更准确地说,由伤害类型所属的类别(或攻击类型)决定。

攻击类型

每个"伤害类型"属于一个或多个类别(称为"攻击类型")。这由一个浮点值列表(称为乘数)定义,每个攻击类型对应一个乘数。

攻击类型有:

  • 通用
  • 钝击
  • 穿刺
  • 斩击
  • 毒素
  • 火焰
  • 冰霜
  • 闪电

默认情况下,每个伤害类型对通用的乘数为 1.0,对其余的乘数为 0.0。例外情况在服务器配置中定义。

新伤害计算的第一步是使用对实体造成的伤害量来确定每种攻击类型的量。

attack_type_amount = damage_amount * attack_type_multiplier

真实伤害

位于 "overhauleddamage:is_true_damage" 伤害类型标签中的伤害类型将忽略自定义伤害计算。它们不受盾牌格挡、护甲或抗性的影响。它们不施加效果积累。它们只对生命值(和/或法力/耐力,如适用)造成伤害。


被格挡的伤害

计算的这一部分仅在以下情况发生时进行:

  • 被攻击的实体当前正在用盾牌格挡
  • 伤害类型可以被所装备的盾牌格挡(由 "minecraft:blocks_attacks" 数据组件决定)
  • 已安装 "Blocking Overhaul" 模组
  • 在服务器配置中启用了全面改革伤害的 "Blocking Overhaul" 版本
  • 如果安装了 "Stamina Attributes",实体还必须至少有一点耐力(或者 "blocking_requires_stamina" 服务器配置必须设置为 false)

招架

招架取代了普通格挡,并在满足某些条件时增加 parry_multiplier:

  • 实体位于 "blockingoverhaul:can_parry" 实体类型标签中
  • 格挡时间(自开始格挡以来的刻数)等于或小于实体的 "blockingoverhaul:parry_window" 属性
  • 攻击由 LivingEntity 造成
  • 用于格挡的物品具有 "blockingoverhaul:parries_attacks" 数据组件

parry_multiplier = (if parrying) ? ("blockingoverhaul:parry_multiplier" attribute) : 1

耐力消耗应用

如果安装了 Stamina Attributes,则应用格挡/招架攻击的耐力消耗。如果在此之后实体的耐力低于零,则格挡/招架攻击的尝试失败,伤害量不会减少。

被格挡伤害计算

被格挡的伤害量不再由 "minecraft:blocks_attacks" 数据组件决定,而是取决于攻击的 damage_type(更具体地说,是其 attack_types)以及若干实体属性。有两种不同的模式:固定值伤害减免和基于百分比的伤害减免。

  • 固定值模式:

blocked_attack_type_amount = blocked_attack_type_damage_attribute * parry_multiplier

  • 基于百分比模式:

blocked_attack_type_amount = attack_type_amount * blocked_attack_type_damage_attribute * parry_multiplier / 100

失衡应用

然后将所有 attack_type_stagger_amount 的总和应用于被攻击实体的失衡积累。如果实体因此失衡,则格挡/招架尝试失败,并且不会格挡任何伤害。

attack_type_stagger_amount = (attack_type_amount - blocked_attack_type_amount) * attack_type_stagger_multiplier

伤害减免

如果格挡/招架尝试成功,则攻击量会减少。

new_attack_type_amount = old_attack_type_amount - blocked_attack_type_amount

额外效果

如果攻击有攻击者,则格挡/招架会产生额外后果。如果攻击被招架,则攻击者立即失衡。

如果攻击被正常格挡,则攻击实体或防御实体之一会被击退可变距离。

additional_attack_type_knockback = old_attack_type_amount * attack_type_negative_block_force_multiplier

applied_knock_back = ((defender's "blockingoverhaul:block_force" attribute) * parry_multiplier) - (attacker's "minecraft:attack_knockback" attribute) + (sum of all additional_attack_type_knockback) * total_applied_blocking_knockback_multiplier_config_option

如果 applied_knock_back 大于零,则将其应用于攻击实体。

如果 applied_knock_back 小于零,则将其绝对值应用于格挡实体。


护甲伤害减免

剩余的 attack type 量会被护甲减少,使用以下公式:

effective_armor = armor_attribute * armor_toughness_attribute (此功能可以在服务器配置中禁用)

attack_type_armor_damage = attack_type_amount * effective_armor * attack_type_armor_multiplier / 100;

attack_type_amount = attack_type_amount - attack_type_armor_damage

然后所有 attack_type_armor_damage 的总和用于损坏实体的护甲。


抗性伤害减免

每种攻击类型都有一个对应的抗性属性。剩余的 attack type 量会被抗性减少,使用以下公式:

attack_type_amount = attack_type_amount - (attack_type_amount * attack_type_resistance_attribute) / 100;


攻击的效果

剩余的 attack type 量会对被攻击的实体施加其效果。

流血积累

如果伤害类型位于 "overhauleddamage:applies_bleeding" 伤害类型标签中,则攻击可以施加流血积累。其量通过将每个 attack type 量乘以一个可配置的乘数,并将结果相加来计算。

燃烧积累

施加的燃烧积累就是 fire_amount。

寒冷效果和冰冻积累

冰霜伤害施加寒冷效果。效果持续时间为 frost_amount * 一个可配置的乘数。

施加的冰冻积累就是 frost_amount。

失衡积累

如果没有尝试用盾牌格挡/招架攻击,则现在施加失衡积累。其量通过将每个 attack type 量乘以一个可配置的乘数,并将结果相加来计算。

中毒积累

施加的中毒积累就是 poison_amount。

感电积累

施加的感电积累就是 lightning_amount。

击退

如果没有尝试用盾牌格挡/招架攻击,并且启用了击退改革,则现在施加攻击击退。其量通过将每个 attack type 量乘以一个可配置的乘数,并将总和乘以一个可配置的全局乘数来计算。

对生命值/法力/耐力施加的伤害

"施加的伤害"的量通过将每个剩余的 attack type 量乘以一个可配置的乘数,并将结果相加来计算。

如果安装了 Mana Attributes 和/或 Stamina Attributes,则可以从法力/耐力中抽取一部分"施加的伤害"。剩余的"施加的伤害"量则从实体的生命值中扣除。

将全面改革伤害整合到原版《我的世界》和模组包中

全面改革伤害应如何整合到模组包的游戏玩法和平衡中,这高度主观,因此大多数功能都可以进行广泛配置和/或使用数据驱动的方法进行配置。

大多数功能都有一些大致合理的默认值,可以用作自定义的基线。

如果您在配置全面改革伤害时有任何问题或疑问,可以在 GitHub 或 Discord 上联系我。

API

全面改革伤害提供了一个 Java API,允许任何生物实体使用自定义伤害类型造成伤害。

实现 "UsesCustomDamageType" 接口并覆盖 "overhauleddamage$getCustomDamageType()" 方法。

内置数据包

全面改革伤害还附带几个内置数据包,它们进一步整合现有内容或添加新内容。

全面改革伤害附魔

此数据包添加了几个新附魔:

  • 流血保护
  • 冰霜附加
  • 冰霜保护
  • 闪电附加
  • 闪电保护
  • 毒素附加
  • 毒素保护

原版附魔改革

此数据包重做了一些原版附魔,以使用全面改革伤害引入的机制。

这包括:

  • 爆炸保护
  • 火焰附加
  • 火焰保护
  • 弹射物保护
  • 保护