Minecraft Wiki

除另有声明,转载时均必须注明出处若簡繁轉換出錯,請以遊戲內為準请勇于扩充与修正内容有兴趣逛逛我们的微博沟通交流,欢迎到社区专页需要协助,请在告示板留言

了解更多

Minecraft Wiki
Advertisement
Information icon
此特性為Java版獨有。
此頁面所述的內容是透過利用錯誤實現的。

此錯誤未必對所有版本有效。該錯誤被修復後,下文所述的資訊將不再適用。
請慎重對待。

更新抑制(Update Suppression)是指在方塊更新傳播過程中,迫使遊戲停止目前方塊更新過程,跳過所有未執行的方塊更新,以及更新後的一系列其他遊戲邏輯。更新抑制器(Update Suppressor)則是用於完成更新抑制的裝置。

更新抑制允許玩家引起部分方塊的方塊更新,而避免其他方塊更新,故可以用於進行切門、將方塊放置在通常不可能存在的位置等;還由於可以取消後續的其他邏輯,可以用來複製方塊、物品分身、方塊實體替換。更新抑制器還可以用於製造可控的伺服器端崩潰。

警告:這些裝置有較大的風險導致遊戲崩潰甚至存檔損壞,建造及使用時請小心。若你僅需要跳過方塊更新但無法承擔此風險,請使用更新跳略。

原理[]

正常情況下,遊戲不會跳過所應該執行的邏輯。因此更新抑制都是透過遊戲錯誤來完成的。更新抑通常制是使用特定方式觸發程式拋出異常或錯誤,且該異常拋出後在特定位置被捕獲,從而跳過本應執行的邏輯。如果觸發了異常但遊戲並未將其捕獲,則會導致遊戲崩潰甚至存檔損壞。

一種常用的方式是由玩家操作來引發遊戲拋出異常。遊戲伺服器端在處理來自用戶端的資料包時,發生的任何異常都會被及時捕獲,在遊戲日誌中記錄下無法處理資料包(Failed to handle packet),而不會引發遊戲崩潰。因此如果異常的拋出是由玩家的用戶端操作直接引起的(俗稱「玩家更新」或「玩家操作」,下文稱「玩家操作」),且不是對著BUD鏈上的黏性活塞作出[需要測試],則不會使遊戲崩潰。但如果意外由其他方式引起異常,往往會使遊戲崩潰,甚至存檔損壞。

另外一種可能的方式是引起JVM錯誤,如記憶體溢出錯誤。在比較器產生的特定方塊更新中,所有異常或錯誤都會被捕獲,並拋出一個崩潰異常。該崩潰異常又可以透過上一種方式由玩家操作捕獲,從而避免崩潰。但若使用記憶體溢出錯誤,還需要保證異常被捕獲後已經釋放足夠的記憶體來使遊戲繼續執行。

舉例來說,以下常見事件屬於「玩家操作」:

以下事件屬於「玩家操作」:


記憶體溢出更新抑制[]

該段落需要補充更多資訊。

記憶體溢出(Out of Memory,簡稱OOM)更新抑制,又稱更新凍結(Update Freezing),是透過填滿記憶體,讓遊戲拋出記憶體溢出異常的更新抑制方式。

原作者的機器是為4395MB的記憶體設計的,但實際需要的記憶體可能會有浮動。該機器需要在伺服器端上執行。

原理[]

進行這種抑制需要玩家恰到好處地填充遊戲記憶體,這樣在需要更新抑制時,遊戲記憶體就會溢出。為了填滿記憶體,可以使用位於未載入區塊中的亂碼和填充方塊事件列表。

填充方塊事件列表有幾種方法:使用活塞陣列填充和使用飛行器填充。使用活塞陣列需要約37萬個活塞,使用飛行器可以省去大量活塞,但需要掛機較長時間。

使用記憶體溢出錯誤,還需要保證異常被捕獲後已經釋放足夠的記憶體來使遊戲繼續執行。

結構[]

更新凍結器是一個很龐大的機器(活塞陣列版本約856×10×2830,飛行器版本約732×100×3936),由很多部分構成。

強轉抑制[]

Paeonia (texture) TU1
該段落所介紹的內容已從Java版中移除。

強轉抑制在Java版1.20.223w35a)移除。

這可不是一台更新跳略器,這是一台貨真價實的更新抑制器!

——Void0

強轉抑制(Cast Suppression),或CCE更新抑制(CCE Suppression),是透過玩家操作引起遊戲拋出ClassCastException類型轉換異常的更新抑制方式。

該方法需要將特定的方塊實體替換為界伏盒,這一過程需要透過更新抑制進行。成功製造這樣一個界伏盒之後,放置一個檢測它的比較器,這個比較器就具有更新抑制的能力。

原理[]

類型轉換異常(ClassCastException,簡稱CCE)是Java的一個執行時異常,當一個對象的類型被強制轉換到一個它不符合的類型的時被拋出。更新抑制可以透過方塊實體替換拋出CCE實現。

界伏盒計算自己的比較器輸出時,會先取得自己的方塊實體,並強制類型轉換為物品欄。其他容器類方塊都沒有這類不加判斷的類型轉換,所以這類更新抑制裝置必須用界伏盒建造。

如果讓一個界伏盒擁有非物品欄的方塊實體,那麼每當要計算它應有的比較器輸出時,就會拋出CCE。這可以透過方塊實體替換來實現。

將一個比較器背對這樣的界伏盒放置,每次更新這個比較器時,就會重新計算一次該輸出的能量以判斷是否應該更新其狀態,於是引發異常。這個界伏盒和比較器兩者就構成了一個沒有狀態、不需要重設的強轉抑制器。

建造[]

建造強轉抑制器需要先進行方塊實體替換。合適的帶有方塊實體且無物品欄的方塊包括講台1.14及以上)和唱片機1.11-1.13),它們被破壞時,在刪除自己的方塊實體之前會先發出一次方塊更新。玩家可以用別的更新抑制方法打斷邏輯,跳過刪除方塊實體這一步。

Make CCE Suppressor before 1

正在發出紅石訊號的講台被破壞的時候,會在刪除方塊實體之前更新自己下方的毗鄰,此時觸發更新抑制就可以保留方塊實體。講台發出紅石訊號的時長只有2遊戲刻,但是也可以透過額外的一次更新抑制來使講台保持啟動狀態,因為在1.17以下,棧溢出更新抑制仍然適用,額外一次更新抑制成本不高。玩家翻書時,講台發出訊號,啟動動力鐵軌,並觸發更新抑制。由於講台發出訊號早於講台計劃解除啟動狀態的計劃刻,所以計劃刻沒有產生,講台保持啟動狀態。這種製作方法也適用於1.17及以上,但由於需要多次觸發更新抑制,這種方法略顯麻煩。

Make CCE Suppressor in 1

1.17及以上直接拆掉對著更新抑制器的浮空比較器邊上的有書的講台也可以

1.17及之後的版本,放有書的講台被破壞時,會在刪除自己的方塊實體之前發出一次比較器更新。因此,還可以直接破壞對著更新抑制器的浮空比較器後面的有書的講台,如右圖。

保留了講台的方塊實體後,在其位置放置一個界伏盒,由於該位置已經存在方塊實體,界伏盒不會產生新的方塊實體,這就實現了方塊實體替換。這就是強轉抑制器的核心,更新一個從它這裏取輸出的比較器,就會觸發強轉抑制。

應用[]

Usage of CCE Suppression

圖中燈亮,抑制器啟動;燈滅,抑制器關閉

製作完成後的強轉抑制器
控制桿朝上,抑制器啟動;朝下,抑制器關閉

將物品放入投擲器時,投擲器物品欄發生變化,發出比較器更新,抑制器中的比較器重新計算自己的輸入訊號,並觸發更新抑制。這樣就完成了一次物品分身。連續這樣操作就可以很快地製作物品分身,這是目前已知的最好的物品分身的製作方法。

強轉抑制器是無狀態的,每次更新比較器時,一般都會拋出異常,但也可能不會拋出。異常的觸發是在計算界伏盒輸出的時候發生的,如果收到的更新不會使比較器重新計算輸入,就不會拋出異常。

強轉抑制器是在比較器從界伏盒取輸出時發生的,所以如果沒有比較器,就不會觸發更新抑制。你也可以在比較器和界伏盒之間放置一個紅石導體,其被充能到15訊號強度時,會屏蔽後面的容器,比較器就不會計算容器的輸出,這樣可以關閉強轉抑制器。

按本教學做出的強轉抑制器的比較器輸出為15,這個輸出也可用於更新抑制。

錯誤報告[]

下面是強轉抑制的伺服器端錯誤報告和崩潰報告,可供技術玩家參考。

棧溢出更新抑制[]

該段落需要補充更多資訊。

所需資訊:需要機器的建造教學

Paeonia (texture) TU1
該段落所介紹的內容已從Java版中移除。

棧溢出更新抑制在Java版1.1922w11a)修復。

棧溢出(Stack Overflow)更新抑制是利用方塊更新的大量傳播填滿棧,讓遊戲拋出棧溢出異常來實現更新抑制的方法。

原理[]

這種更新抑制器會引起足夠的方塊更新,向棧中加入大量資料來導致棧溢出,此時遊戲會拋出棧溢出異常。根據不同作業系統中JVM預設的棧的大小不同,所需要的方塊更新數量不同,抑制器所需的大小也就不同。

極簡更新抑制器[]

該段落介紹的內容已在最新版本的Minecraft中移除,僅在特定版本中可用。

該段落的機器在1.1620w18a)至1.17.1為更新抑制器,1.191.19.4為更新跳略器,1.15.2及以下、1.181.18.2[需要更多資訊]1.20及以上無法使用。
請務必注意該機器在不同版本的特性與效果。

極簡更新抑制器(簡易版)
其中動力鐵軌不可移除
A
B
極簡更新抑制器(完整版)

此裝置使得在1.1620w18a)至1.17.1進行更新抑制的成本大大降低。但在1.171.17.1中有可能造成未知原因的崩潰1.181.18.2中該機器會由於未知原因會導致崩潰[需要更多資訊],但這些版本中重新進入後都會成功更新抑制;1.20-pre2及以後,紅石線會連接四周開啟的地板門上的紅石線,導致該裝置徹底失效。

地板門應使用木質地板門,且其在關閉時應在方塊的上半部分。在地板門上要放置紅石線。

使用這個機器前建議打開遊戲聲音。使用機器需要先打開地板門,之後敲擊音階盒B。若敲擊音階盒時機器發出地板門聲,則可關閉地板門,此時更新抑制完成就位。否則需要先打開地板門,敲擊音階盒A,此時地板門會關閉。之後即可再次嘗試。也可以透過使用紅石訊號強/弱充能音階盒A再取消充能完成一次復位。

B
A
自復位極簡更新抑制器

右側是上方更新抑制器的自復位變種。圖中偵測器用於復位這個更新抑制器。

S
自復位極簡更新抑制器
(上層)
A
B
自復位極簡更新抑制器
(下層)

這是3gt自復位更新抑制器,裝置需要朝向南方。在使用此機器觸發一次更新抑制後,在音階盒B上方放置朝上的活塞即可完成製作。

鐵軌更新抑制器[]

提示:本段落的主題不是#安全網

鐵軌更新抑制器1.18.2及以下版本中玩家最常使用的更新抑制器,也是研究最為成熟的更新抑制器。這種更新抑制器從上往下可以看到大量鐵軌。

Stack Overflow Suppressor

鐵軌更新抑制器,帶一小段BUD鏈

錯誤報告[]

下面是棧溢出更新抑制的伺服器端錯誤報告和崩潰報告,可供技術玩家參考。

歷史[]

22w11a中,更新的儲存從棧變更為隊列[需要更多資訊],更新順序不再顛倒,因此棧溢出更新抑制被修復,這在MC-249082中被認為是按預期工作。然而,這個更新在22w12a中修復[1],取而代之的是更新跳略。現在玩家常使用記憶體溢出更新抑制強轉抑制進行更新抑制。

Java版
2016年6月11日Panda4994發現了棧溢出更新抑制,發佈了高塔更新抑制器[2]
1.13?隨著方塊更新被拆分為NC更新PP更新,高塔更新抑制器失效。
1.17?講台在拆除後會發出比較器更新了。這使得製作強轉抑制器只需觸發1次更新抑制。
1.18?極簡更新抑制器在觸發時會崩潰了,但更新抑制後的結果會被儲存。
1.1922w11a棧溢出更新抑制被修復,MC-249082被標記為「有意為之」。
22w12aMC-249181被修復。
2023年4月17日FX-PR0CESS、Igna778發現了記憶體溢出更新抑制(活塞陣列),發佈了基於活塞陣列的記憶體溢出更新抑制器。[3][4]
2023年4月29日NicNac在Discord上公佈了極簡更新抑制器。當天HackerRouter將Discord上的截圖公佈在bilibili。[5]
2023年6月12日Void0發現了強轉抑制,發佈了BV1Hu4y1o71G,次日發佈了關於強轉抑制器的筆記
2023年6月14日Igna778發佈了基於飛行器的記憶體溢出更新抑制器[6]
1.20.223w35a強轉抑制被修復。比較器在檢測被方塊實體替換後的界伏盒不再輸出任何訊號或觸發更新抑制。

畫廊[]

影片[]

外部連結[]

參見[]

參考[]

  1. MC-249181 — 「動力鐵軌和觸發鐵軌的更新順序被顛倒了。」 — 錯誤狀態為「已修復」。
  2. 「Update Suppression, Block Duplication, Skull Converter and More」 – Panda4994。YouTube,2016年6月11日。(Bilibili搬運
  3. 「[1.19+] Update Suppression is back to stay」 – FX - PR0CESS。YouTube,2023年4月17日。(Bilibili搬運
  4. 「Minecraft Update Suppression is Back: The OOM Method that Bypasses Mojang's Patch」 – Igna778。YouTube,2023年4月17日。(Bilibili搬運
  5. HackerRouter的動態 — 嗶哩嗶哩
  6. 「Shulker Suppression - The Ultimate Update Bug That Cant Be Patched!」 – Igna778。YouTube,2023年6月15日。(Bilibili搬運

注釋[]

  1. 1.0 1.1 原存檔中使用的是該方塊
  2. 2.0 2.1 原存檔中(9290,-50,-12515)和(9290,-50,-12810)處向東看可看到部分活塞陣列不完整
  3. 部分影片中兩個內容都有講解

語言

Advertisement