伤害

来自Minecraft基岩版开发Wiki

伤害Damage)是指在Minecraft中通过一个实体或世界本身造成另一个实体的生命值发生改变的过程。狭义的伤害仅指生命值减少的情形,此时,对于生命值增加的情形,我们称之为治疗Heal)。

单位

伤害的生命值的变化量,因此和生命值共用同一种单位,即半颗心halfheart♥)。每半颗心(♥)俗称1点生命值。正的伤害一般代表生命值的减少,负的伤害一般代表生命值的增加。

存储

包括玩家在内的所有实体都可以拥有控制自身攻击伤害和跌落伤害的两个特性。在存档中,他们存储在每个实体的 AttributesNBT标签内,控制该实体可以造成的该种类伤害的最大值、最小值和当前值。

ID 描述
minecraft:attack_damage 控制攻击伤害
minecraft:fall_damage 控制跌落伤害

应用

很多API中都暴露了应用伤害的接口,模组开发者可以通过以下方式使用这些接口。

原生

[需要更多信息]

附加包

附加包中可以以数据驱动的形式控制实体和方块的伤害等属性,目前可用的修改方法如下:

脚本引擎中还有如下调用方法:

  • minecraft:entity_hurt服务端事件的数据中的absorbed_damagedamage字段,分别为此次伤害中实体由于伤害吸收状态效果吸收的伤害和最终结算的伤害。

ModSDK

在在ModSDK中除了上述附加包中的数据驱动调用形式,还有以下数据驱动修改方式:

ModAPI中还有如下调用方法:

  • 实体的ActorHurtServerEvent服务端事件的数据中的damage字段,为此次攻击给予的伤害;
  • 实体的ActuallyHurtServerEvent服务端事件的数据中的damage字段,为该实体受到的伤害;
  • 生物的DamageEvent服务端事件的数据中的damage字段,为该实体实际结算的伤害。
  • 玩家的PlayerAttackEntityEvent服务端事件的数据中的damage字段,为玩家此次攻击给予的伤害‌[需要验证]
  • 弹射物的projectile类的CreateProjectileEntity组件第三个参数对象的damage字段,为该弹射物的伤害值;
  • 实体的hurt类的SetHurtByEntity组件第二个参数,为对实体造成伤害值。

InnerCore

AdaptedScript中,‌[需要更多信息]

CoreEngine中,伤害可以通过以下方法获取:

上表中网络ID列中的值可以通过以下方法被调用:

ModPE

ModPE中,可以使用以下钩子函数来获取伤害:

  • entityHurtHook的第三个参数,为该实体受伤时结算的伤害。

伤害类型

Minecraft中的伤害由来源不同被分为很多伤害类型Damage types)。不仅不同的伤害类型在实体受到伤害时会被分开结算,玩家的死亡信息也会由类型不同而有所不同。下面列出当前游戏内所有伤害类型的表格以及他们的相关数据,该表格源自源码中的ActorDamageCause类。

枚举键 内部ID 接口字符串‌ ‌[仅附加包] 枚举值 原版中的产生途径
None none none -1
Override override override 0 程序直接覆写生命值
Contact contact contact 1 仙人掌甜浆果丛
EntityAttack entity_attack attack 2 近战攻击
Projectile projectile projectile 3 弹射物
Suffocation suffocation suffocation 4 窒息
Fall fall fall 5 跌落末影珍珠
Fire fire fire 6 篝火
FireTick fire_tick fire_tick 7 身上连续着火
Lava lava lava 8 熔岩
Drowning drowning drowning 9 溺水或淋雨
BlockExplosion block_explosion block_explosion 10 方块爆炸
EntityExplosion entity_explosion entity_explosion 11 实体爆炸
Void void void 12 虚空
Suicide suicide suicide 13 /kill指令
Magic magic magic 14 药水龙息唤魔者尖牙守卫者激光
Wither wither wither 15 凋零
Starve starve starve 16 饥饿
Anvil anvil anvil 17 铁砧
Thorns thorns thorns 18 荆棘
FallingBlock falling_block falling_block 19 下落的方块(除了铁砧)
Piston piston piston 20 活塞
FlyIntoWall fly_into_wall fly_into_wall 21 动能
Magma magma - 22 岩浆块
Fireworks fireworks - 23 烟花火箭
Lightning lightning - 24 闪电
Charging charging - 25 物品或实体蓄力‌[需要验证]
Temperature temperature - 26 雪傀儡在干燥、温暖或下界生物群系
Freezing freezing - 27 冰冻
Stalactite stalactite - 28 钟乳石
Stalagmite stalagmite - 29 石笋
All all fatal 31 任意伤害[注 1]
  1. 源码内描述:Any damage which kills the subject

伤害类型又称作伤害来源Damage sources),在源码中又被称作伤害成因Damage causes),模组开发者可以通过以下方式调用伤害成因。

原生

可以使用ActorDamageCause::<key>调用到上表中的枚举值列中的值,其中<key>是上表中枚举建列中的项。‌[需要更多信息]

附加包

附加包中伤害类型只能直接以上表中接口字符串列中的值以字符串的形式被调用,目前可以数据驱动的调用方法如下:

脚本引擎中还有如下调用方法:

ModSDK

ModSDKModAPI中可以使用<api>.GetMinecraftEnum().ActorDamageCause.<key>得到上表中的内部ID列中的值,其中<api>是Python脚本中导入的当前服务端或客户端的API<key>是上表中枚举建列中的项。

除了上述附加包中的数据驱动调用形式,在ModAPI中伤害类型还能以如下形式被调用:

  • 实体的ActorHurtServerEvent服务端事件的数据中的cause字段;
  • 实体的ActuallyHurtServerEvent服务端事件的数据中的cause字段;
  • 生物的DamageEvent服务端事件的数据中的cause字段。

InnerCore

AdaptedScript中,‌[需要更多信息]

CoreEngine中,上表中枚举值列中的值可以通过以下方法获取:

上表中枚举值列中的值可以通过以下方法被调用: