Minecraft Wiki

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

了解更多

Minecraft Wiki
此特性为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),由很多部分构成。

强转抑制[]

该段落所介绍的内容已从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.17

正在发出红石信号的讲台被破坏的时候,会在删除方块实体之前更新自己下方的毗邻,此时触发更新抑制就可以保留方块实体。讲台发出红石信号的时长只有2游戏刻,但是也可以通过额外的一次更新抑制来使讲台保持激活状态,因为在1.17以下,栈溢出更新抑制仍然适用,额外一次更新抑制成本不高。玩家翻书时,讲台发出信号,激活动力铁轨,并触发更新抑制。由于讲台发出信号早于讲台计划解除激活状态的计划刻,所以计划刻没有产生,讲台保持激活状态。这种制作方法也适用于1.17及以上,但由于需要多次触发更新抑制,这种方法略显麻烦。

Make CCE Suppressor in 1.17

1.17及以上直接拆掉对着更新抑制器的浮空比较器边上的有书的讲台也可以

1.17及之后的版本,放有书的讲台被破坏时,会在删除自己的方块实体之前发出一次比较器更新。因此,还可以直接破坏对着更新抑制器的浮空比较器后面的有书的讲台,如右图。

保留了讲台的方块实体后,在其位置放置一个潜影盒,由于该位置已经存在方块实体,潜影盒不会产生新的方块实体,这就实现了方块实体替换。这就是强转抑制器的核心,更新一个从它这里取输出的比较器,就会触发强转抑制。

应用[]

Usage of CCE Suppression

图中灯亮,抑制器启动;灯灭,抑制器关闭

制作完成后的强转抑制器
拉杆朝上,抑制器启动;朝下,抑制器关闭

将物品放入投掷器时,投掷器物品栏发生变化,发出比较器更新,抑制器中的比较器重新计算自己的输入信号,并触发更新抑制。这样就完成了一次物品分身。连续这样操作就可以很快地制作物品分身,这是目前已知的最好的物品分身的制作方法。

强转抑制器是无状态的,每次更新比较器时,一般都会抛出异常,但也可能不会抛出。异常的触发是在计算潜影盒输出的时候发生的,如果收到的更新不会使比较器重新计算输入,就不会抛出异常。

强转抑制器是在比较器从潜影盒取输出时发生的,所以如果没有比较器,就不会触发更新抑制。你也可以在比较器和潜影盒之间放置一个红石导体,其被充能到15信号强度时,会屏蔽后面的容器,比较器就不会计算容器的输出,这样可以关闭强转抑制器。

按本教程做出的强转抑制器的比较器输出为15,这个输出也可用于更新抑制。

错误报告[]

下面是强转抑制的服务端错误报告和崩溃报告,可供技术玩家参考。

栈溢出更新抑制[]

该段落需要补充更多信息。

所需信息:需要机器的建造教程

该段落所介绍的内容已从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],取而代之的是更新跳略。现在玩家常使用内存溢出更新抑制强转抑制进行更新抑制。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


关于“沙盒/教程/更新抑制”的历史,请见各版本页面。


画廊[]

视频[]

外部链接[]

参见[]

参考[]

  1. MC-249181 — “动力铁轨和激活铁轨的更新顺序被颠倒了。” — 漏洞状态为“已修复”。

注释[]

  1. 1.0 1.1 原存档中使用的是该方块
  2. 2.0 2.1 原存档中(9290,-50,-12515)和(9290,-50,-12810)处向东看可看到部分活塞阵列不完整
  3. 部分视频中两个内容都有讲解

语言