见 Terraria Wiki:项目/1.4.5 获取 wiki 状态与更新指南
無敵幀
無敵幀(也被稱為免傷幀)[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] 10%: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、陷阱等等的射彈)都被視為玩家。
在以下情況下,傷害來源被視為來自默認傷害來源:
靜態無敵
遊戲會記錄一個 1111 行,200 列的二維數組 perIDStaticNPCImmunity(perIDStaticNPCImmunity[1111][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,造成 15 嘀嗒的局部無敵幀,extraUpdates 值為 1)攻擊 NPC 欄位索引為 0 的實體會將列表中的第一個元素的值設為 15。該值每嘀嗒會減少 2,使得實際無敵幀長度為 8 嘀嗒。
來自非玩家來源的實體無敵
非玩家實體也會在受到熔岩的傷害、或在受到其他非玩家實體的接觸傷害後獲得無敵幀。在無敵幀持續時間內,它們無法被熔岩和其他非玩家實體再次傷害。這些傷害不被視為來自任何玩家,因而不會與由玩家攻擊造成的任何類型的無敵幀互相干擾。[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.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的ApplyTouchDamage()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的Update_NPCCollision()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的ItemCheck_CatchCritters()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的Update()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 7.0 7.1 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的Hurt()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 8.0 8.1 8.2 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的Spawn()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的ShadowDodge()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的NinjaDodge()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的BrainOfConfusionDodge()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的Update_NPCCollision()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的ApplyLifeAndOrMana()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的AI_067_FreakingPirates()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的JumpMovement()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的HorizontalMovement()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的MowTheLawn()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Player.cs中的DashMovement()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的Damage()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的penetrate欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.NPC.cs中的immune欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Main.cs中的myPlayer欄位 和Terraria.Netplay.cs中的InitializeServer()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Wiring.cs中的CurrentUser欄位 和Terraria.Wiring.cs中的SetCurrentUser()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.3.5.3 原始碼,Terraria.Projectile.cs中的IsNPCIndexImmuneToProjectileType()方法 和Terraria.Projectile.cs中的perIDStaticNPCImmunity欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的idStaticNPCHitCooldown欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的localNPCImmunity欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.Projectile.cs中的localNPCHitCooldown欄位。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 信息來自
電腦版 1.4.4.9 原始碼,Terraria.NPC.cs中的BeHurtByOtherNPC()和Terraria.NPC.cs中的Collision_LavaCollision()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 譯註:英文名字包括 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()方法。這可能已經不準確,因為
電腦版的當前版本已經是 1.4.5.5。
- ↑ 這一遊戲時間是開始遊戲會話後經過的時間(單位:嘀嗒)。它和由表記錄的遊戲內時間不相關。