无敌帧
无敌帧(也被称为免伤帧)[a]是一段短暂的时间,在这一时段中实体无法受到任何伤害。它通常是在受到伤害后立即获得的。
无敌帧的通常目的是防止实体从持续性的或快速重复的伤害源处受到过多伤害。例如,如果没有无敌帧,浸没在熔岩中的玩家就会每嘀嗒[1]受到一次伤害,即每秒 60 次。
对于玩家来说,除了受到伤害以外,在一些其他情况下也会获得无敌帧。
玩家无敌
玩家会在受到任何来源的伤害后得到无敌帧。无敌帧的长度根据情况会有所不同;特定的物品也会在其效果触发时提供无敌帧。见下方获取详细信息。
无敌帧分组
在 电脑版、
主机版、和
移动版中,一些伤害来源分组会提供单独的“类型”的无敌帧。这些不同类型的无敌帧不会互相干扰。绝大多数的伤害来源都被分类到同一组中(下方的“第 5 组”),但有四种其他分组:
多刺灌木
尖刺
木尖刺
仙人球(电脑版、主机版、和移动版)(仅限静止时的接触伤害)
仙人掌(仅在 The Constant
和 Get fixed boi 世界中)
例如,若玩家从尖刺(上方的“第 1 组”)受到伤害,他在这段无敌帧期间不会受到接触仙人球(同样是“第 1 组”)的伤害,但他在这段时间内仍然会从敌怪处(“第 5 组”)受到伤害。
在 前代主机版和任天堂
版中,没有不同的无敌分组。所有伤害来源都提供相同“类型”的无敌帧。
无敌帧长度
默认情况下,受到伤害通常会给予玩家 0.67 秒 的无敌帧。这一时间在受到的伤害为 1 时会减半,在 PvP 中则会更低。十字项链和其升级物会增加无敌帧的长度[b]。许多其他效果也会提供无敌帧,例如重生、闪避、格挡、或用坐骑造成伤害。见下表获取细节。
来源 | 默认[c] | 十字项链[d] | |
---|---|---|---|
受伤时的默认无敌帧[7] | 0.67 秒 | 1.33 秒 | |
若所受伤害为 1[7] | 0.33 秒 | 0.67 秒 | |
PvP伤害[e] | 0.13 秒 | 无 | |
在 PvP 中死亡后重生[8] | 5 秒 | 无 | |
在非 PvP 中死亡后重生[8] | 3 秒 | 无 | |
在进入世界时,或被传送回生成点时 (例:通过魔镜)[8] |
1 秒 | 无 | |
![]() |
神圣防护(电脑版、主机版、和移动版)[9] | 1.33 秒[f] | 2 秒[f] |
![]() |
暗影躲避(前代主机版、和3DS版) | ||
![]() |
黑腰带(和其升级物)[10] | ||
![]() |
混乱之脑(闪避效果)[11] | ||
![]() |
地狱之剑(电脑版、主机版、和移动版)(格挡)[12] | 0.5 秒 | 1 秒 |
![]() |
中士联盾(电脑版、主机版、和移动版)(格挡) | ||
![]() |
诡药(电脑版、主机版、和移动版)[13] | 使用时以不同几率提供无敌帧:[f] 11%:4 秒 |
无 |
![]() |
同伴方块(电脑版、主机版、和移动版)(捅刺)[14] | 不提供 | 无 |
![]() |
史莱姆坐骑(电脑版、主机版、前代主机版、和移动版)(击中时)[15] | 0.1 秒 | 无 |
![]() |
羽翼史莱姆坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
独角兽坐骑(电脑版、主机版、和移动版)(击中时)[16] | ||
![]() |
花马坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
骏马坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
黑马坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
山羊坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
海盗船坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
阴森树坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
蛇蜥怪坐骑(电脑版、主机版、和移动版)(击中时) | ||
![]() |
割草机(电脑版、主机版、和移动版)[17] | ||
![]() |
高尔夫球车(电脑版、主机版、和移动版)(击中时) | 0.2 秒 | 无 |
![]() |
克苏鲁护盾(电脑版、主机版、和移动版)(猛冲击中)[18] | 0.07 秒 | 无 |
![]() |
耀斑盔甲(电脑版、主机版、和移动版)(猛冲击中) |
实体无敌
非玩家实体(敌怪、小动物、和友好的 NPC)会从玩家的“穿透”或“持续性”攻击(即来自任何伤害来源、在击中实体后仍然还能造成伤害的攻击)获得无敌帧。[19]这包括由玩家造成的伤害(如流星弹、邪箭、魔刺、或彩虹枪),也包括危险物(如发射射弹的机关)。实体的无敌帧通常持续 0.17 秒。
在内部,射弹是否视为“穿透”是由其 penetrate
决定的。这一属性决定了单个射弹能击中多少个目标。[20]如果 penetrate
的值大于 1
,射弹就被视为“穿透”。在射弹对目标造成伤害后,其 penetrate
属性会减少 1,射弹会在 penetrate
到达 0 时消失。penetrate
的值为 1
的射弹被视为“非穿透”——射弹会在击中目标时消失,通常不为被击中的实体提供任何无敌帧,若使用全局无敌,则也不受无敌帧影响。
- “穿透”射弹在其
penetrate
到达1
时(即在击中足够多的目标之后)会变为“非穿透”。
伤害来源有三种不同的为实体提供无敌的方式:
- 全局无敌:对来自一个玩家的所有穿透伤害无敌。
- 静态无敌:对来自一个玩家的其他相同类型的射弹的伤害无敌。
- 局部无敌:对那一特定的射弹的伤害无敌。
全局无敌
如果一个玩家的射弹提供全局无敌,在无敌帧持续时间内,受到伤害的实体会暂时对同一玩家的所有穿透伤害来源无敌,包括其他类型的攻击。它默认持续 0.17 秒,但对于某些射弹不同,以允许更频繁/更不频繁地击中。在多人模式下,这类无敌对于每个玩家是分别检查的,因此一个玩家对实体施加全局无敌时不会阻止其他玩家的穿透伤害击中它。
这是《泰拉瑞亚》的对实体的无敌帧系统的最初实现方式,因此大量的射弹(尤其是较旧的那些)使用的是全局无敌。这一类无敌基本上来说“阻止”了玩家使用不同类型的穿透伤害来源造成伤害。许多提供全局无敌的射弹都是基于这一限制平衡的,否则它们会造成过高的伤害。
在 前代主机版和任天堂
版中,全局无敌适用于所有穿透射弹。这会极大地限制作用于同一目标的其他穿透性武器,以及发射多个穿透射弹的武器(如剧毒法杖)。大部分仆从也被视为具有穿透攻击,这也会影响与其一同使用的穿透性武器的效果。这一问题在蜘蛛法杖上极为显著。
静态无敌
如果一个射弹提供静态无敌,受到伤害的实体会仅对那一特定类型的射弹(即具有相同 ID 的射弹)的伤害无敌,在无敌帧持续时间内,来自同一玩家的所有那一类型的射弹都无法对该实体造成伤害。来自其他玩家的那一类型的射弹不受影响。
使用这类无敌时,虽然在无敌帧持续时间内同一类型的穿透射弹不能重复造成伤害,任何其他类型的穿透射弹都能正常造成伤害。大多数提供静态无敌的射弹都是基于这一点进行平衡的。
例如,在胡蜂枪的胡蜂(射弹 ID 189)伤害实体后,该实体会暂时对所有胡蜂变为无敌。在无敌帧的持续时间内,胡蜂会穿过实体而不造成伤害。不过,该实体在胡蜂的无敌帧期间仍然会受到任何其他类型射弹的伤害,如雨云魔杖的雨滴(射弹 ID 239,和胡蜂的 ID 189 不同)或乌鸦仆从(射弹 ID 317)。
局部无敌
如果一个射弹提供局部无敌,在无敌帧持续时间内,受到伤害的实体仅会对该射弹本身(即造成伤害的那一特定射弹实例)无敌。所有其他穿透射弹,包括同一类型的射弹,在无敌帧期间仍然能造成伤害。
因此,发射大量造成局部无敌的射弹的效率会比造成静态无敌的射弹要高。由于这类无敌在《泰拉瑞亚》历史上大部分时间内都没有广泛使用,几乎所有穿透性武器都没有依照它来平衡。
例如,所有致命球仆从(造成局部无敌)都遵循其自己独立的无敌计时器运作,完全不会互相冲突。如果一个致命球对实体造成了伤害,在它造成的无敌帧期间另一个致命球仍然能够造成伤害。在更高的召唤数时,相比造成全局或静态无敌,造成局部无敌的致命球能显著造成更高的伤害。
部分使用局部无敌的射弹在生成时会继承其他射弹的无敌帧,例如空中祸害的分裂箭。
技术性信息
每种无敌帧在内部由不同方式实现。
全局无敌
每个实体会记录一个拥有 256 个元素的免伤时间数组。[21]这些元素中的前 255 个分别对应一个玩家;最后的第 256 个元素不对应任何玩家(可以将其视为默认的伤害来源)。每个元素的值默认为 0。若它大于 0,则它每嘀嗒会降低 1,且其对应伤害来源无法对实体造成伤害。
当对实体施加全局无敌时,无敌帧的长度会被加给列表中对应伤害来源的那个元素。在大部分情况下,伤害来源都是发射射弹的那个玩家。不过,如果伤害和任何玩家都不相关,或者无法找到作为伤害来源的玩家,伤害就会被视为来自默认的伤害来源,无敌帧的长度会被加给第 256 个元素。
单人模式下,所有友方射弹的伤害来源(即所有能对敌怪造成伤害的射弹,这包括来自武器、NPC、机关等等的射弹)都被视为玩家。
在以下情况下,伤害来源被视为来自默认伤害来源:
静态无敌
游戏会记录一个 1022 行,200 列的二维数组 perIDStaticNPCImmunity
(perIDStaticNPCImmunity[1022][200]
)。[24]每行代表一类射弹,每列代表一个 NPC 栏位。
当造成静态无敌的射弹伤害实体时,元素 perIDStaticNPCImmunity[射弹的ID][NPC 栏位索引]
的值会被设为 当前游戏时间[g] + 无敌帧长度
。“无敌帧的长度”等于射弹的 idStaticNPCHitCooldown
属性。[25]在射弹伤害实体后,它还会将实体和对应伤害源相关的全局无敌时间设为零。
当造成静态无敌的射弹将要伤害实体时,游戏会检查元素 perIDStaticNPCImmunity[射弹 ID][NPC 栏位索引]
的值是否不超过当前游戏时间。如果它大于当前游戏时间,则射弹将无法对实体造成伤害。
例如,玩家用寒霜剑的寒霜矢射弹(ID 119,造成 10 嘀嗒的静态无敌帧)攻击NPC 栏位索引为 0 的实体会将元素 perIDStaticNPCImmunity[119][0]
的值设为当前游戏时间 + 10
。因而,在接下来的 10 嘀嗒内,来自同一玩家的任何寒霜矢射弹将无法对该实体造成伤害。
局部无敌
每个射弹会记录一个拥有 200 个元素的免伤时间数组[26],每个元素对应一个 NPC 栏位。每个元素的值默认为 0。当造成局部无敌的射弹伤害实体时,对应该实体所占用的 NPC 栏位的元素将会被设置为无敌帧的长度。“无敌帧的长度”等于射弹的 localNPCHitCooldown
属性。[27]当相关的元素的值不为 0 时,射弹无法对占用 NPC 栏位的实体造成伤害。此外,若射弹的 localNPCHitCooldown
不是 -2,在其伤害实体后,它还会将实体和对应伤害源相关的全局无敌时间设为零。
因为该值的降低基于射弹更新,所以它会受到射弹的 extraUpdates
属性影响。射弹更新默认每嘀嗒发生一次,而 extraUpdates
具有 n
的值意味着射弹每嘀嗒会额外进行 n
次更新。当值大于 0 时,它每次更新会降低 1。
另外,localNPCHitCooldown
有两个特殊值:-1 和 -2。
- 如果
localNPCHitCooldown
为 -1,就意味着被射弹伤害的实体会对那个特定射弹永久免疫;该实体永远无法再次被那个特定射弹伤害。换言之,一个射弹仅能伤害单个实体一次。 - 如果
localNPCHitCooldown
是 -2,关于局部无敌的机制会被无视。局部无敌免伤时间数组中的所有值都不会改变;射弹会改为遵循穿透射弹的通常行为,在射弹可穿透且伤害到实体时对其造成 10 嘀嗒的全局无敌帧。
- 如果
localNPCHitCooldown
不是负值,射弹的局部无敌的实际长度(单位为嘀嗒)可以用下方公式计算:
- [math]\displaystyle{ \text{无敌帧}=\left\lfloor\frac{\textit{localNPCHitCooldown}}{\textit{extraUpdates}+1}\right\rfloor + \textit{localNPCHitCooldown}\mod(\textit{extraUpdates}+1) }[/math]
例如,用狂星之怒的射弹(ID 503,造成 30 嘀嗒的局部无敌帧,extraUpdates
值为 1)攻击 NPC 栏位索引为 0 的实体会将列表中的第一个元素的值设为 30。该值每嘀嗒会减少 2,使得实际无敌帧长度为 15 嘀嗒。
来自非玩家来源的实体无敌
非玩家实体也会在受到熔岩的伤害、或在受到其他非玩家实体的接触伤害后获得无敌帧。在无敌帧持续时间内,它们无法被熔岩和其他非玩家实体再次伤害。这些伤害不被视为来自任何玩家,因而不会与由玩家攻击造成的任何类型的无敌帧互相干扰。[28]
当受到熔岩伤害时,所有实体都会获得 0.5 秒的无敌帧。
当受到接触伤害时,永恒水晶(电脑版、主机版、和移动版)会获得 0.33 秒的无敌帧,所有其他实体会获得 0.5 秒的无敌帧。
仅有少数几种方式能让非玩家实体互相之间受到接触伤害,包括:
- 小动物和城镇 NPC 从敌怪处受到接触伤害。
- (电脑版、主机版、和移动版)永恒水晶从敌怪处受到伤害。
- (电脑版、主机版、和移动版)蜜蜂攻击敌怪。
- (电脑版、主机版、和移动版)蜜蜂存在时,蜂王造成和受到其他敌怪的伤害。
历史
- 电脑版 1.4.1.2:熔岩对玩家的伤害现在和其他伤害来源分开,具有独自的无敌帧分组。
- 电脑版 1.3.0.5:伤害性图格(多刺灌木、尖刺、和木尖刺)对玩家的伤害现在和其他伤害来源分开,具有独自的无敌帧分组。
- 电脑正式版:引入。
参考
- ↑ 嘀嗒是可由软件计数的时间单位。《泰拉瑞亚》的大多数更新逻辑都会每嘀嗒发生一次。一个嘀嗒的长度为 1/60 秒,因此一秒钟内有 60 嘀嗒,一分钟内有 3600 嘀嗒。
- ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.GameContent.DontStarveDarknessDamageDealer.cs
中的Update()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的ApplyTouchDamage()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的Update_NPCCollision()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的ItemCheck_CatchCritters()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的Update()
方法。 - ↑ 7.0 7.1 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的Hurt()
方法。 - ↑ 8.0 8.1 8.2 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的Spawn()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的ShadowDodge()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的NinjaDodge()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的BrainOfConfusionDodge()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的Update_NPCCollision()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的ApplyLifeAndOrMana()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的AI_067_FreakingPirates()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的JumpMovement()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的HorizontalMovement()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的MowTheLawn()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的DashMovement()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的Damage()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的penetrate
字段。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.NPC.cs
中的immune
字段。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Main.cs
中的myPlayer
字段 和Terraria.Netplay.cs
中的InitializeServer()
方法。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Wiring.cs
中的CurrentUser
字段 和Terraria.Wiring.cs
中的SetCurrentUser()
方法。 - ↑ 信息来自
电脑版 1.3.5.3 源代码,
Terraria.Projectile.cs
中的IsNPCIndexImmuneToProjectileType()
方法 和Terraria.Projectile.cs
中的perIDStaticNPCImmunity
字段。这可能已经不准确,因为电脑版的当前版本已经是 1.4.4.9。
- ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的idStaticNPCHitCooldown
字段。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的localNPCImmunity
字段。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.Projectile.cs
中的localNPCHitCooldown
字段。 - ↑ 信息来自
电脑版 1.4.4.9 源代码,
Terraria.NPC.cs
中的BeHurtByOtherNPC()
和Terraria.NPC.cs
中的Collision_LavaCollision()
方法。
- ↑ 译注:英文名字包括 invincibility frame、immune frame、immunity frame、invulnerability frame;有时简写为 iframe 或 i-frame
- ↑ 十字项链和其升级物不会互相叠加。
- ↑ 默认提供的无敌帧。
- ↑ 装备十字项链或其升级物时提供的无敌帧。“无”意为不受十字项链影响。
- ↑ 包括来自另一玩家的伤害和自己造成的伤害,例如爆炸物和(前代主机版、和3DS版)爆破弹。
- ↑ 6.0 6.1 6.2 提供所有类型的无敌帧。信息来自
电脑版 1.4.4.9 源代码,
Terraria.Player.cs
中的SetImmuneTimeForAllTypes()
方法。 - ↑ 这一游戏时间是开始游戏会话后经过的时间(单位:嘀嗒)。它和由表记录的游戏内时间不相关。