挖掘

发表时间: 2025-11-12 20:12:40

最后更新: 2025-11-12 20:12:40(1小时前)

本文标签: 方块机制

用户头像-Connie 等1名 热心馆友编辑完成

挖掘是我的世界的一种游戏内容

介绍

  1. 挖掘(Breaking/Digging/Mining/Punching)是玩家用于破坏方块的基本操作。
  2. 在非创造模式下,玩家挖掘时,会在每个游戏刻对目标方块累积损坏进度,这个过程被称为挖掘速度。
  3. 一旦损坏进度达到或超过1,该方块就会被成功挖掘。
  4. 玩家和方块本身的特性都会影响挖掘速度。
  5. 关于不同方块的挖掘速度、工具选择及挖掘所需时间的信息,可以参考挖掘/方块挖掘时间页面。
  6. 作为游戏机制中的重要组成部分,挖掘机制非常复杂,涉及客户端的预测与服务器的判定,二者之间通过网络进行交互。
  7. 每个玩家的挖掘进度是独立计算的,因此多个玩家在同一时刻挖掘同一方块时,无法叠加各自的进度。
  8. 方块的破裂效果取决于最后发送挖掘信息并被服务器接收的玩家。

基本机制

  1. 玩家可以通过将鼠标光标悬停在目标方块上并按住攻击键来进行挖掘。
  2. 当玩家靠近可以挖掘的方块时,角色会开始摆动手臂,并发出挖掘音效,方块表面开始显现裂纹。
  3. 随着挖掘过程的进行,裂纹会逐渐扩展覆盖整个方块,最终将其摧毁。
  4. 为了挖掘特定方块,玩家需首先选中该方块的轮廓箱,等缺乏轮廓的方块则无法被选中,自然也无法挖掘。
  5. 在冒险模式中,玩家只能挖掘那些其持有物品能够允许挖掘的方块,不能挖掘的方块不会显示轮廓箱。
  6. 所有可以被挖掘的方块均可用任意工具或徒手进行挖掘,即便某些方块的挖掘需要较长时间,只要持续挖掘,最终都会被破坏。
  7. 部分方块是完全无法挖掘的,例如基岩末地传送门框架命令方块和下界传送方块,除非玩家处于创造模式,否则无法通过挖掘来破坏这些方块。
  8. 持续按住鼠标左键进行挖掘时,动作将不断进行,但在成功挖掘一个方块后,玩家需要等待6游戏刻(0.3秒)才可重新开始,这段时间称为“挖掘冷却”。
  9. 如果一个方块被瞬间挖掘,则不会产生冷却时间。
  10. 玩家在挖掘时可以自由移动,甚至在游泳、跳跃或骑行的状态下,这为挖掘隧道或清理多个方块提供了便利。
  11. 不过,如果在挖掘时改变目标方块或工具,则会将当前的挖掘进度重置,必须从头开始进行挖掘。
  12. 多名玩家同时挖掘同一方块时,每位玩家都独立计算挖掘进度,相互之间不会影响,且挖掘所需的时间不会因此减少。
  13. 方块的裂纹效果则由最后发送挖掘过程消息的玩家所决定。
  14. 每个方块均有两个影响挖掘行为的属性:硬度和挖掘工具。
  15. 硬度会影响挖掘速度,黑曜石的硬度高于石头,因此在相同条件下挖掘黑曜石所需的时间更长。
  16. 挖掘工具则决定是否能够加速方块的挖掘,部分方块还需合适的挖掘工具,未使用合适工具时,挖掘速度将显著降低,且方块不会掉落物品。
  17. 例如,铁矿石的挖掘工具为任意具,而其合适工具为石镐或更高级别的镐;当用不适合的物品或徒手挖掘时,挖掘速度会非常缓慢,且不会掉落物品。
  18. 使用木镐时,尽管挖掘速度加快,但仍旧不会掉落物品;使用石镐时,挖掘速度会进一步加快,且在挖掘后会掉落物品。
  19. 某些方块则不需要特定的挖掘工具,这类方块没有合适的挖掘工具,无法被任何物品加速挖掘,但挖掘后一定会掉落物品,例如信标拉杆玻璃等。

挖掘范围

  1. 在《我的世界》中,玩家通过挖掘与方块进行互动,挖掘的有效范围受到一定距离的限制。

  2. 在Java版游戏中,挖掘距离由属性block_interaction_range的计算值决定,其基础距离为4.5格。

  3. 创造模式下,玩家可获得额外的+0.5属性修饰符,进一步将挖掘距离提高至5格。

  4. 相较于Java版,在基岩版中,使用键盘和鼠标时的挖掘范围为5.7格,而使用控制器时范围为5.6格。

  5. 在基岩版的触摸屏模式里,创造模式的挖掘距离达到了12格,而生存模式则为6.7格。

  6. 对于虚拟现实(VR)用户,创造模式下的挖掘范围同样为12格,而生存模式下则为7格。

挖掘速度

一、 方块硬度

  1. 方块硬度(Hardness,h)是挖掘速度的一个关键因素。
  2. 每个方块都有其特定的硬度值,硬度越高,挖掘所需的时间就越长,速度也越慢;反之,硬度较低的方块则挖掘速度较快。
  3. 当某个方块的硬度值为-1时,它的挖掘速度被固定为0,这意味着在非创造模式下,玩家无法通过挖掘毁坏该方块。
  4. 若方块的硬度为0,则挖掘速度将被视为无穷大,任何外在因素都无法改变其挖掘速度。
  5. 例如,黑曜石的硬度高于石头,因此在相同条件下,挖掘黑曜石所需的时间将会长于挖掘石头的时间。

二、 挖掘工具

  1. 在《我的世界》中,某些方块在使用特定物品挖掘时,其挖掘速度会得到提升,这类物品被称为挖掘工具(Digging Tool)。

  2. 例如,原木的挖掘工具为,任意类型的都能提高对原木的挖掘效率

  3. 然而,还有一些方块不需要特定的挖掘工具,且没有合适的挖掘工具,因此这些方块的挖掘不会被任何物品加速。

  4. 在Java版中,挖掘工具的性能和适用方块是由物品堆叠组件tool所控制。

  5. 其中,default_mining_speed代表该挖掘工具对不适用方块的基础挖掘速度,而rules则定义了该工具针对某类方块的适用性,包括是否为合适挖掘工具和各自的基础速度。

  6. 部分方块在挖掘时要求使用合适的挖掘工具,否则挖掘速度会降至正常速度的30%,这种现象被称为挖掘惩罚。

  7. 在大多数情况下,适当的挖掘工具还决定了使用该物品时是否能掉落物品。

  8. 在本Wiki的挖掘表中,如果合适挖掘工具通过虚线图标表示,则说明该方块的挖掘工具为与图标对应的工具,且该方块不需要使用合适挖掘工具进行挖掘,徒手挖掘也不会导致挖掘惩罚。

  9. 反之,如果为正常图标表示,则该方块的挖掘工具同样是图标对应的工具,但必需使用合适的挖掘工具进行挖掘,徒手或使用非挖掘工具会引发挖掘惩罚。

  10. 表格中背景为绿色的单元格表示使用对应品质的工具挖掘时不会受到挖掘惩罚,而背景为红色的单元格则代表使用该工具挖掘会受到惩罚。

  11. 例如,铁矿石的挖掘工具为任意类型的镐,合适的挖掘工具为石镐及以上品质的镐。

  12. 当玩家使用非镐物品或徒手挖掘时,速度较慢且不会掉落任何物品;而使用木镐时,挖掘速度有所提升但依然无法掉落物品。

  13. 使用石镐挖掘时,速度更快,且在挖掘后将会掉落物品。

  14. 在默认情况下,挖掘工具对方块的加速随工具的品质变化,如下表所示:

挖掘工具 基础速度s
Java版 基岩版
不使用对应的挖掘工具 1
木质工具 2
石质工具 4
铜质工具 5
铁质工具 6
钻石质工具 8
下界合金质工具 9
金质工具 12
剪刀 2 1
剪刀挖掘发光地衣藤蔓 2 3
剪刀挖掘羊毛 5 6
剪刀挖掘树叶蜘蛛网 15 16
挖掘树叶、南瓜雕刻南瓜南瓜灯西瓜大型垂滴叶
紫颂花、紫颂植物、可可果、发光地衣覆地苔藓藤蔓
1.5
剑挖掘蜘蛛 15
剑挖掘竹子和竹笋

 

三、 其他影响因素

  1. 在《我的世界》中,挖掘速度受到多个因素的影响,其中最主要的是方块的硬度和玩家所使用的工具类型。
  2. 除此之外,物品的附魔效果、玩家的状态效果以及具体状态也会显著影响挖掘的效率。
  3. 如果装备的工具附加了效率魔咒,并且其基础速度大于1,该工具的基础挖掘速度将会提升,具体增加量为l²+1,其中l表示效率魔咒的等级。
  4. 玩家如果具备急迫潮涌能量的状态效果,则挖掘速度会受到更高等级效果a的影响:在Java版中,速度会增加0.2倍a的值;而在基岩版中,挖掘速度将变成原来的(1+0.2a)¹·²a倍。
  5. 若玩家处于挖掘疲劳状态,该状态等级f的不同也会影响挖掘速度:在Java版中,当f为1时,速度乘以0.3;f为2时,乘以0.09;当f为3时,速度则变为0.0027,而更高等级的固定值为0.00081。
  6. 对于基岩版,挖掘速度则是原基础速度的0.21f倍。
  7. 如果玩家的眼部位置浸入水中,挖掘速度将受到减速影响:在Java版中,挖掘速度将与属性submerged_mining_speed的计算值相乘,默认值为0.2,而水下速掘魔咒可以使此值提升至1。
  8. 在基岩版中,若装备水下速掘魔咒,则挖掘速度保持不变,默认为原速度的20%。
  9. 当玩家未接触地面时,挖掘速度同样会降低至原速度的20%。
  10. 最终,在Java版中,挖掘速度会与属性block_break_speed的计算值相乘,最终默认为1。

四、 计算流程

  1. 挖掘速度的计算涉及多个因素,首先需要获取方块的硬度h和基础速度s。

  2. 当使用的工具具有效率魔咒,并且基础速度s大于1时,可以依据效率等级l来提升基础速度,公式为:s←s+l²+1。

  3. 之后需要计算基础除数r,若没有挖掘惩罚,基础除数为30;若有惩罚,则此值设为100。

  4. 初步的挖掘速度p是通过基础速度、硬度和基础除数进行计算,公式为:p=shr。

  5. 接下来,考虑状态效果、水中减速及浮空减速等因素,计算出的综合乘数m,将其用于最终的挖掘速度计算,得出p=smhr。

  6. 借助挖掘速度,可以推算出挖掘所需时间t,计算公式为:t=⌈hrsm⌉。

  7. 例如,如果使用效率II的木镐挖掘铁矿石,所需步骤如下:考虑铁矿石的硬度h=3,基础速度s=2,加上效率II带来的加成,结果为s=2+2²+1=7。

  8. 在此情况下,基础除数r为100,因为木镐并不是适合的挖掘工具;而综合乘数m为1,表示没有额外效果。

  9. 利用这些值,可以计算初步挖掘速度p=(71)/(3100)=7/300。

  10. 最终,通过计算挖掘时间t=ceil(300/7)=43,得出使用效率II的木镐挖掘铁矿石需要43个游戏刻(约2.15秒)。

  11. 另一个例子是,在Java版中,玩家处于浮空状态,使用具有效率的钻石来挖掘黑曜石。

  12. 此时,黑曜石的硬度h=50,基础速度s=8,同时基础除数r为30,因为这一工具是合适的挖掘工具。

  13. 计算综合乘数m为(1+0.2*2)*0.2=0.28,表示急迫II和浮空状态的影响。

  14. 结合这些信息,可以计算挖掘速度p=(80.28)/(5030)=14/9375。

  15. 最后,利用挖掘速度计算挖掘时间t=ceil(9375/14)=670,说明在这种情况下,玩家需要670个游戏刻(约33.5秒)才能成功挖掘黑曜石

五、 瞬间挖掘

  1. 在《我的世界》中,当挖掘速度达到或超过1时,所需的挖掘时间为一游戏刻,这种挖掘方式被称为瞬间挖掘。

  2. 对于Java版玩家来说,只有在他们的挖掘速度属性值大于0的情况下,硬度为0的方块才能实现瞬间挖掘。

  3. 相较之下,在基岩版中,任何情况下硬度为0的方块均可被瞬间挖掘。

  4. 竹子与其他方块存在显著差异,它在使用剑进行挖掘时,无论玩家的状态或方块硬度如何,总是会被瞬间挖掘。

  5. 而当使用其他工具挖掘竹子时,其挖掘速度则与其他方块相同。

  6. 下表给出了指定状态下玩家使用指定工具时能够瞬间挖掘的方块硬度,保留小数点后1位,假设所挖掘的方块不产生挖掘惩罚:

版本 挖掘工具 无急迫效果 急迫I [隐藏]急迫II
无效率 效率I 效率II 效率III 效率IV 效率V 无效率 效率I 效率II 效率III 效率IV 效率V 无效率 效率I 效率II 效率III 效率IV 效率V
Java版 不使用挖掘工具 0 0.1 0.2 0.3 0.6 0.9 0 0.1 0.2 0.4 0.7 1 0 0.1 0.2 0.5 0.8 1.2
0 0.1 0.2 0.3 0.6 0.9 0 0.1 0.2 0.4 0.7 1.1 0 0.1 0.3 0.5 0.8 1.2
木质工具,剪刀 0 0.1 0.2 0.4 0.6 0.9 0 0.1 0.2 0.4 0.7 1.1 0 0.1 0.3 0.5 0.8 1.3
石质工具 0.1 0.2 0.3 0.4 0.7 1 0.1 0.2 0.3 0.5 0.8 1.2 0.1 0.2 0.4 0.6 0.9 1.4
剪刀挖掘羊毛 0.1 0.2 0.3 0.5 0.7 1 0.2 0.2 0.4 0.6 0.8 1.2 0.2 0.3 0.4 0.7 1 1.4
铁质工具 0.2 0.2 0.3 0.5 0.7 1 0.2 0.3 0.4 0.6 0.9 1.2 0.2 0.3 0.5 0.7 1 1.4
钻石质工具 0.2 0.3 0.4 0.6 0.8 1.1 0.3 0.4 0.5 0.7 1 1.3 0.3 0.4 0.6 0.8 1.1 1.5
下界合金质工具 0.3 0.3 0.4 0.6 0.8 1.1 0.3 0.4 0.5 0.7 1 1.4 0.4 0.5 0.6 0.8 1.2 1.6
金质工具 0.4 0.4 0.5 0.7 0.9 1.2 0.4 0.5 0.6 0.8 1.1 1.5 0.5 0.6 0.7 1 1.3 1.7
剪刀挖掘树叶或蜘蛛网,剑挖掘蜘蛛网 0.5 0.5 0.6 0.8 1 1.3 0.6 0.6 0.8 1 1.2 1.6 0.7 0.7 0.9 1.1 1.4 1.9
基岩 不使用挖掘工具 0 0.1 0.2 0.3 0.6 0.9 0 0.1 0.2 0.5 0.8 1.2 0 0.2 0.4 0.7 1.2 1.8
0 0.1 0.2 0.3 0.6 0.9 0 0.1 0.3 0.5 0.8 1.3 0.1 0.2 0.4 0.7 1.2 1.8
木质工具,剪刀 0 0.1 0.2 0.4 0.6 0.9 0 0.1 0.3 0.5 0.9 1.3 0.1 0.2 0.4 0.8 1.2 1.8
石质工具 0.1 0.2 0.3 0.4 0.7 1 0.1 0.2 0.4 0.6 1 1.4 0.2 0.4 0.6 0.9 1.4 2
剪刀挖掘羊毛 0.1 0.2 0.3 0.5 0.7 1 0.2 0.3 0.4 0.7 1 1.4 0.3 0.4 0.6 1 1.4 2
铁质工具 0.2 0.2 0.3 0.5 0.7 1 0.2 0.3 0.5 0.7 1.1 1.5 0.4 0.5 0.7 1 1.5 2.1
钻石质工具 0.2 0.3 0.4 0.6 0.8 1.1 0.3 0.4 0.6 0.8 1.2 1.6 0.5 0.6 0.8 1.2 1.6 2.2
下界合金质工具 0.3 0.3 0.4 0.6 0.8 1.1 0.4 0.5 0.6 0.9 1.2 1.6 0.6 0.7 0.9 1.2 1.7 2.3
金质工具 0.4 0.4 0.5 0.7 0.9 1.2 0.5 0.6 0.8 1 1.3 1.8 0.8 0.9 1.1 1.4 1.9 2.5
剪刀挖掘树叶蜘蛛网,挖掘蜘蛛网 0.5 0.5 0.6 0.8 1 1.3 0.7 0.8 0.9 1.2 1.5 1.9 1 1.1 1.3 1.6 2.1 2.7

 

挖掘流程

一、 网络同步

  1. 在《我的世界》中,挖掘过程的同步在服务端和客户端之间并不完全一致。
  2. 客户端会预测方块的挖掘状态,并当预测到方块应该被破坏时,立即在客户端世界中对其进行破坏。
  3. 然而在服务端,玩家的挖掘进度不会即时更新,服务端仅记录挖掘的开始和中止时刻,以此判断挖掘是否成功,从而向客户端反馈挖掘的结果。
  4. 当网络连接不稳定或服务端出现延迟时,客户端可能会发生“方块弹回”现象,这即是由于同步问题导致的表现。
  5. 在此挖掘过程的网络同步中,主要通过以下几种网络包来实现服务端与客户端之间的数据传输。
  6. 玩家动作网络包(ServerboundPlayerActionPacket)由客户端发送至服务端,告知服务端玩家正在进行的操作,其内容包括玩家的动作类型、方块的位置、方块的面以及预测序号。
  7. 在挖掘过程中,玩家的动作共有三种类型:开始挖掘、停止挖掘和中止挖掘。
  8. 方块更改确认网络包(ClientboundBlockChangedAckPacket)则是由服务端发送给客户端,确认客户端发送的玩家动作已被接收,并涉及指定的预测序号。
  9. 方块更改网络包(ClientboundBlockUpdatePacket)由服务端向客户端发送,用于告知客户端某方块的状态已发生变化,通常在服务端判断客户端挖掘失败时进行强制同步。
  10. 最后,方块挖掘进度网络包(ClientboundBlockDestructionPacket)也由服务端发送给客户端,目的是通知其他玩家该方块正在被挖掘以及其挖掘的进度情况。

二、 客户端操作

  1. 在《我的世界》游戏客户端中,玩家对方块进行挖掘的动作大致可以分为三类:开始挖掘、持续挖掘和停止挖掘。

  2. 开始挖掘时,玩家选择一个方块并按下挖掘键位,随后游戏会检查玩家的挖掘权限和世界边界

  3. 如果玩家不具备挖掘该方块的条件,则挖掘行为不会被触发。

  4. 在创造模式下,玩家的挖掘行为会立即预测方块的破坏,并向服务器发送开始挖掘的指令,同时加入6个游戏刻(即0.3秒)的挖掘冷却时间。

  5. 若玩家不是在创造模式,则挖掘流程会有不同的执行步骤。

  6. 如果玩家当前正在挖掘方块,则首先需向服务器发送中止挖掘的请求,以便开始新的挖掘动作。

  7. 若目标方块可以瞬间被挖掘,则游戏会立即预测其破坏,反之则会设置为挖掘状态,并更新当前的计时和进度。

  8. 在玩家持续挖掘时,游戏将执行一系列检查并计算挖掘冷却时间,以决定是否可以继续挖掘。

  9. 在创造模式下,玩家可迅速预测破坏方块并发送开始挖掘请求,而在其他模式下,系统会判定当前挖掘的方块是否与之前相同。

  10. 如果当前方块为空气,挖掘状态将被终止。如若不满足以上条件,则挖掘进度与计时将不断增加。

  11. 一旦挖掘进度达到或超过1,游戏将预测该方块的破坏,向服务器发送停止挖掘的指令,同时重置进度与计时,并加入挖掘冷却。

  12. 在任何情况下,方块的裂纹状态都将被更新。

  13. 当玩家选择停止挖掘时,客户端会向服务器发送中止挖掘的请求,并重置所有相关进度与状态。

  14. 这样总结来看,游戏每个刻只允许破坏一个方块,且每一刻仅能计算与一个方块的交互。

  15. 若方块可以瞬时被挖掘,系统将不会施加挖掘冷却,从而允许玩家达到最快的挖掘速度。

  16. 值得注意的是,在停止挖掘时,挖掘冷却也不再适用。

  17. 挖掘冷却的程序完全由客户端操作,服务器不会验证两次挖掘之间的冷却时间,因此任何规避手段都不会影响挖掘有效性。

  18. 在创造模式中,玩家若持续按住挖掘键,每6游戏刻(0.3秒)将能破坏一个方块,但点按的方式则可以实现更高的挖掘效率

  19. 不同的挖掘操作会产生不同的网络包情况,例如在创造模式下或瞬时挖掘时,只需发送一个开始挖掘指令。

  20. 对于非瞬时挖掘的方块,则需要经历开始与停止或中止的指令交互,而在持续挖掘过程中如果更换目标,则会先发送中止指令,再开始新的挖掘过程。

三、 服务端操作

  1. 在Minecraft的服务器运行中,服务端主要处理来自客户端的三种基本操作:开始、停止和中止。

  2. 不论服务端接收到何种操作,它都会首先检查玩家与方块的交互距离,如果不符合要求,则该操作会被直接忽略。

  3. 当服务器接收到挖掘操作时,它需要确认挖掘位置是否超过建筑的最大高度,若超过,则服务器将向客户端发送方块更改的网络包,以告知此位置的方块类型。

  4. 在确认挖掘有效且成功破坏方块后,服务端将执行以下步骤:首先检查玩家是否有权破坏该方块,包括管理员与非管理员对命令方块的限制检查。

  5. 如果检查未通过,则服务端强制同步客户端的当前方块状态,虽然挖掘动作被记录,但方块未被真正破坏。

  6. 服务器接下来会对被挖掘的方块进行对应处理,将其替换为相应的流体方块或空气,并执行方块更新操作。

  7. 如果玩家不处于创造模式,则还需执行物品掉落及耐久损耗的相关流程。

  8. 当客户端发送开始挖掘的请求时,服务器首先检查多个前提条件:若玩家不是管理员,并且挖掘位置在出生点保护范围内,挖掘即被视为无效。

  9. 若挖掘位置在世界边界之外,也会被强制同步至客户端并被视为无效。

  10. 如果玩家处于创造模式,服务端将确认挖掘有效,方块随之被破坏,流程结束。

  11. 如果检测到玩家无权挖掘该方块(如在冒险模式中的限制),服务器同样会强制同步客户端的方块信息并放弃挖掘。

  12. 随后,服务端会记录开始挖掘的时间,并计算挖掘速度。

  13. 若该方块能够被瞬时挖掘,服务端确认挖掘有效并立刻破坏方块,结束当前流程。

  14. 服务器会检查玩家是否正在进行挖掘,若是,便会强制同步挖掘位置的方块状态至客户端,以防上次挖掘未能有效执行。

  15. 在进入挖掘状态后,记录当前挖掘位置,并将方块裂纹数据同步给所有其他玩家。

  16. 当客户端发出停止挖掘的指令时,若挖掘位置与服务端记录不符,则该网络包将被忽略。

  17. 如果位置一致且不是空气方块,服务器会计算挖掘时间差和速度,以便确定当前挖掘进度。

  18. 如果进度达到或超过70%,则服务端确认挖掘成功,破坏方块并退出挖掘状态。

  19. 若挖掘进度低于70%且没有延迟挖掘动作,将退出挖掘状态并进入延迟挖掘模式,同时设定延迟挖掘开始的时间为挖掘开始时间。

  20. 当客户端发送中止挖掘动作时,服务端将退出挖掘状态,若中止的位置与当前挖掘位置不一致,服务端会在日志中记录此不匹配。

  21. 在每个游戏刻中,服务端还会进行挖掘进度的计算,以便将方块裂纹数据同步给其他客户端。

  22. 另外,服务端还设计了延迟挖掘机制,在玩家停止挖掘时若进度未达到70%,服务器仍将继续计算,直到满分100%。

  23. 延迟挖掘机制旨在确保在掉帧的情况下,仍能保持合理的挖掘体验,避免客户端无法挖掘掉帧的方块。

四、 挖掘预测

  1. 在Minecraft中,由于客户端与服务端的不同步,玩家在客户端所进行的挖掘行为实际上是由客户端自行预测的,而服务端会在后续返回的数据中包含其自身的状态以实现同步。

  2. 每当客户端进行一次预测破坏时,发送至服务端的网络包中都会附带一个递增的预测序号,用以标识每次的预测。

  3. 在客户端实施预测破坏的同时,游戏会保存与该预测序号关联的服务端验证状态,这其中包括方块的位置及其状态。

  4. 当客户端预测破坏一个方块时,游戏世界中的相应方块会被替换为空气方块,而服务端验证状态中的方块则仍保持未破坏的原状态。

  5. 随着动作网络包发送至服务端,服务端会记录下最新的最大预测序号,并在此基础上计算挖掘的动作。

  6. 服务端在计算完毕后,接下来会向客户端发送一个方块更改确认的网络包,以确认其上的方块状态。

  7. 在确认包发出之前,服务端就已完成了对挖掘动作的计算,因此客户端在收到确认时,验证状态早已通过服务端传来的数据实现同步。

  8. 此时,服务端验证状态内的方块状态与服务端在发送确认时的方块状态相一致,客户端只需结束预测,并将服务端验证状态内的方块状态同步至自身世界。

  9. 可以通过以下详细流程来理解这一过程:首先,客户端预测破坏方块,生成预测序号和服务端验证状态,并发送挖掘动作;接着,服务端计算挖掘动作并记录下最大预测序号,随后进入下一游戏刻;然后,服务端发送区块数据;客户端接收到区块数据后,修改服务端验证状态;最后,服务端发送更改确认,客户端确认并根据服务端验证状态调整客户端世界,以达到同步,结束预测。

五、 挖掘弹回

  1. 挖掘弹回是一种在《我的世界》中的常见现象,指的是玩家成功破坏方块后,方块又重新生成,并在一段时间后再次被破坏而掉落。

  2. 这一现象通常由两种因素引起:一是客户端与服务器之间的网络连接不稳定,二是服务器延迟时刻超过30%。

  3. 这两种情况的核心机制相似,均显示出客户端预测的挖掘速度超过服务器实际的处理速度,而后者的速度通常至少慢于前者30%。

  4. 服务器的慢速可以源于其自身的响应缓慢(掉帧),也可能是由于网络连接的问题,造成需要分多次发送的网络包在接收时被压缩到更短的时间内。

  5. 无论是什么原因,客户端和服务器经历了一系列的操作流程,最终导致玩家在客户端上看到挖掘弹回的现象。

  6. 首先,客户端启动挖掘并发送挖掘开始的信号给服务器,挖掘是一个需要持续操作的过程。

  7. 服务器接收到该信号后,进入挖掘状态并记录下挖掘开始的时间。

  8. 随后,客户端完成挖掘并预测方块已被破坏,接着发送停止挖掘的信号。

  9. 由于服务器处理速度相对较慢,此时挖掘进度尚未达到70%,因此服务器退出了挖掘状态,转而进入延迟挖掘状态,并设定该过程开始的时间为挖掘开始时的时间。

  10. 由于在停止挖掘时,服务器的方块状态未发生变化,因此没有发送方块变更的网络包。

  11. 随后,服务器向客户端发送方块变更确认,客户端接收该确认信息并进行预测。

  12. 然而,因服务器未发出任何方块变更的网络包,客户端将方块状态恢复至挖掘开始前的状态,造成了挖掘弹回现象。

  13. 服务器中的延迟挖掘将持续,直到挖掘进度达到或超过100%,此时方块被破坏并掉落,相关信息会发送到客户端。

  14. 最后,客户端接收到方块破坏和掉落的信息,导致该方块在客户端世界中被第二次消除,同时生成了掉落物。

六、 进度暂留

 
  1. 在Minecraft中,玩家持续挖掘方块时,如果离开了该方块的交互范围,挖掘便无法继续进行,但挖掘的进度仍有可能被保留。

  2. 例如,玩家在砍伐一棵树时,最上方的树干块可能无法直接交互,但通过跳跃的方式仍可以进行挖掘,此时按住挖掘键便可持续挖掘上方的方块。

  3. 另一个例子是,如果在一块耕地上播种植物并迅速催熟后再次挖掘,可以让下方的耕地通过间歇性的挖掘逐渐被挖掉。

  4. 这种尽管中途中断了挖掘,但最终仍成功完成挖掘的行为被称为“进度暂留”。

  5. 进度暂留的实现需要满足以下条件:玩家必须专注于挖掘一个特定的方块,而不可同时挖掘其他方块。

  6. 玩家在开始与目标方块交互前,需要预先按下挖掘键,而不是在按下时才指向该方块。

  7. 当玩家失去对方块的交互时,挖掘键仍需保持按下,玩家可以在此时选择放开挖掘键,或者在决定失去交互的时候放置其他方块。

  8. 在不与任何方块交互的情况下,玩家可以执行其他操作,例如攻击生物、放置方块或切换至创造模式进行挖掘。

  9. 玩家在挖掘过程中所持的主手物品必须保持一致,虽然在不进行挖掘时可以更换工具,但挖掘时必须使用相同的物品

  10. 实现进度暂留的原因在于其流程:当玩家首次开始挖掘时,客户端会进入挖掘状态,并向服务器发送开始挖掘的信号。

  11. 如果在持续按下挖掘键的情况下失去了与方块的交互,并且未转移到其他方块上,则客户端仍维持在挖掘状态中,而进度被保留在内存中。

  12. 当玩家重新与方块交互时,且未转移目标方块,客户端认为玩家仍在持续挖掘,从而进度被累加并保留。

  13. 当挖掘进度达到或超过100%时,该方块会被挖掘,客户端向服务器发出停止挖掘的信号。

  14. 可以察觉到,进度暂留是一项完全在客户端进行的操作,而服务器只记录开始和停止挖掘的信号。

  15. 由于客户端处理挖掘所消耗的时间往往大于服务器的响应,因此服务器会判断挖掘的进度是有效的,并执行方块的破坏及掉落。

  16. 如果玩家在过程中进行快速挖掘或者使用创造模式进行挖掘,则这些操作会影响服务器的挖掘记录并导致客户端与服务器的数据不同步。

  17. 举例而言,若玩家在一段时间内使用进度暂留机制进行挖掘,再破坏一个瞬间挖掘的方块后上恢复挖掘,便可能会遇到“挖掘弹回”现象。

  18. 这种情况下,客户端会认为该方块的挖掘进度已被计算在内,而服务器由于瞬间挖掘的缘故更新了挖掘开始时间,从而导致进度不同步,最终出现“挖掘弹回”的状况。

📑
🤔
⬆️