基本資訊
- 發現者:Zvleon
- 發現時間:2023 年 5 月 16 日
- 主要效果:讓多件裝備的攻擊判定(hitbox)或裝備效果異常疊加在 Link 身上,藉此堆疊武器攻擊力、盾牌效果等。
核心定義
Zuggle 是裝備 actor 的
EquipmentUserComponent中ActorLink狀態與 actor 層 calculation dependency 狀態不同步的結果。裝備不再是正常裝備槽中的裝備,也不再處於「進行中的丟棄 / smuggle」狀態,但仍保留對 Link 的計算依賴,因此能以異常狀態附著、持續存在,並在讀檔或場景切換後依然保持。
白話來說,遊戲原本要把「裝備某件武器」這件事同步記在兩個地方:
- Menu 端:選單、背包、目前裝備資料。
- World / actor 端:場景中的實體裝備 actor,以及它和 Link 之間的運算連結。
正常丟棄、切換或解除裝備時,這兩邊應該一起更新並清理乾淨。Zuggle 發生時,這些資料沒有同步完成。
正常流程 vs. Zuggle 流程
正常裝備一件武器、弓或盾時,裝備會透過 EquipmentUserComponent 裡的 ActorLink 連到 Link 身上。
當裝備被丟棄、切換或解除裝備時,遊戲理論上要同步完成以下幾件事:
- 更新背包資料(
GameData)。 - 更新目前裝備槽狀態。
- 移除或替換舊裝備的
ActorLink。 - 解除裝備 actor 對 Link 的計算依賴(calculation dependency)。
Zuggle 發生時,ActorLink、裝備狀態與丟棄佇列的更新時序彼此錯開;即使其中一部分資料已經被移除、覆蓋或判定完成,裝備 actor 對 Link 的 calculation dependency 仍可能殘留。
這也是為什麼 Zuggle 不能簡單歸類為「背包錯位」或「卡在 drop 佇列裡」:真正讓 Zuggle 成立的關鍵,是帳面狀態已經改變,但 actor 層的依賴關係仍殘留。
Map Zuggle 的形成時序
以下以 Map Zuggle 作為說明範例。裝備被丟棄時,不會立即解除與 Link 的連結,而是先進入 PouchMgr 的丟棄佇列,並暫存被丟棄裝備的連結。
- 在地圖開啟前,從快速選單丟棄目前裝備。
- 快速重新開啟選單,切換到另一件裝備。
- 關閉選單,讓地圖開啟,使換裝與丟棄請求在不同時間點被處理。
- 再從背包丟棄目前裝備,讓兩次丟棄請求進入後續處理。
這個過程會讓背包資料、目前裝備狀態,以及 PouchMgr 暫存的裝備連結發生不同步。當後續丟棄流程判定暫存裝備與目前裝備為同一件時,遊戲可能跳過正常的解除或刪除流程。
最後形成「多件裝備仍保留對 Link 的
calculation dependency,但EquipmentUserComponent只剩一個有效ActorLink」的狀態,這就是 Map Zuggle。
四個系統各自的狀態
| 系統 | Zuggle 發生時的狀態 |
|---|---|
GameData(背包 / 選單) | 認為裝備已被切換、丟棄,或不再是目前裝備 |
PouchMgr(丟棄佇列處理) | 丟棄請求已處理完畢,或判定失敗後已退回背包 |
EquipmentUserComponent | 目前裝備槽的 ActorLink 已被移除、覆蓋,或改指向另一件裝備 |
| actor 層 dependency | 裝備 actor 對 Link 的 calculation dependency 仍殘留,沒有同步解除 |
mPendingDrop:決定 Zuggle 表現形式的關鍵值
dt-12345/zuggle 的逆向工程說明指出,被 zuggle 的裝備身上,DynamicEquipmentComponent 裡有一個布林值,暫稱為 mPendingDrop。它用來標記「這件裝備目前是否還在等待被丟棄」,並會影響 Zuggle 之後呈現的型態。
mPendingDrop | 裝備行為 | 型態 |
|---|---|---|
true | 忽略幾乎所有外部狀態變更請求,只接受丟棄類指令 | Static Zuggle(標準型) |
false | 拒絕丟棄請求,但仍接受其他裝備狀態變更 | Dynamic Zuggle |
※ 訂正:先前整理曾把這兩種行為寫反;正確版本以此表為準。
Zuggle 與 Smuggle 的差異
| 狀態性質 | 一句話定義 | |
|---|---|---|
| Smuggle | 丟棄 / 裝備處理仍在進行中 | 裝備仍保留 active drop / smuggle relation,系統還把它當成正在丟棄中的裝備 |
| Zuggle | 丟棄 / 裝備處理已被結案、覆蓋或遺忘,但依賴沒清 | 選單與裝備槽的帳面狀態已改變,但裝備 actor 對 Link 的 calculation dependency 沒有同步解除 |
簡單說:
Smuggle 抓的是「正在丟棄中」那個階段的矛盾;Zuggle 抓的是「丟棄 / 裝備流程已經跑完或被覆蓋」之後,依賴關係仍然殘留的落差。
※「active / 已結束」是整理時的歸納講法,方便理解,但不是原始資料中的正式術語。
一句話總結
Zuggle 的本質,是把「丟棄或切換裝備」這個看似單一的動作拆成兩條沒有同步完成的路徑:
- Menu / GameData / PouchMgr 這條「帳面狀態」路徑。
- EquipmentUserComponent / actor dependency 這條「實體依賴」路徑。
當帳面狀態已經被處理、覆蓋或結案,但實體 actor 對 Link 的 calculation dependency 沒有同步解除時,系統就會留下一件「選單或裝備槽不再正常承認,但世界端仍異常依附 Link」的裝備。
而 mPendingDrop 則決定這件殘留裝備之後更接近 Static Zuggle,還是 Dynamic Zuggle。