活塞

来自Minecraft Wiki
跳转到导航 跳转到搜索
活塞
[[|]]Invicon Piston.png:Minecraft中Piston的精灵图,描述:活塞[[|]]Invicon Sticky Piston.png:Minecraft中Sticky Piston的精灵图,描述:黏性活塞

1.5
收回时:是
伸出时:否
收回时:可推动,可拉动
伸出时:不可推动,不可拉动
竖琴/钢琴

 #707070
方块ID
piston

当收到红石信号时,活塞可以推动最多12个方块。信号输入时,活塞会在不到一秒的时间内伸出活塞臂。任何挡道的实体都会被它推动,包括玩家,而且,如果你在活塞前端放一块黏液块,它们就会被弹走。弹弹弹!

活塞(Piston)是一种被红石信号激活时可以推动大多数方块和实体的方块,当红石信号结束时只会将方块留在原处。

黏性活塞(Sticky Piston)和普通活塞的功能相同,但当红石信号结束时也能拉回被移动的方块。

生成[编辑 | 编辑源代码]

普通的活塞不会生成在世界中。

自然生成[编辑 | 编辑源代码]

丛林神庙中会自然生成3个黏性活塞。

远古城市中心的红石地下室里会自然生成5个黏性活塞。

获取[编辑 | 编辑源代码]

合成[编辑 | 编辑源代码]

名称 材料 [隐藏]合成配方
活塞 任意木板 +
圆石 +
铁锭 +
红石粉
[[|]]Invicon Oak Planks.png:Minecraft中Oak Planks的精灵图,链接到木板,描述:橡木木板Invicon Spruce Planks.png:Minecraft中Spruce Planks的精灵图,链接到木板,描述:云杉木板Invicon Birch Planks.png:Minecraft中Birch Planks的精灵图,链接到木板,描述:白桦木板Invicon Jungle Planks.png:Minecraft中Jungle Planks的精灵图,链接到木板,描述:丛林木板Invicon Acacia Planks.png:Minecraft中Acacia Planks的精灵图,链接到木板,描述:金合欢木板Invicon Dark Oak Planks.png:Minecraft中Dark Oak Planks的精灵图,链接到木板,描述:深色橡木木板Invicon Mangrove Planks.png:Minecraft中Mangrove Planks的精灵图,链接到木板,描述:红树木板Invicon Cherry Planks.png:Minecraft中Cherry Planks的精灵图,链接到木板,描述:樱花木板Invicon Bamboo Planks.png:Minecraft中Bamboo Planks的精灵图,链接到木板,描述:竹板Invicon Pale Oak Planks.png:Minecraft中Pale Oak Planks的精灵图,链接到木板,描述:苍白橡木木板Invicon Crimson Planks.png:Minecraft中Crimson Planks的精灵图,链接到木板,描述:绯红木板Invicon Warped Planks.png:Minecraft中Warped Planks的精灵图,链接到木板,描述:诡异木板[[|]]Invicon Oak Planks.png:Minecraft中Oak Planks的精灵图,链接到木板,描述:橡木木板Invicon Spruce Planks.png:Minecraft中Spruce Planks的精灵图,链接到木板,描述:云杉木板Invicon Birch Planks.png:Minecraft中Birch Planks的精灵图,链接到木板,描述:白桦木板Invicon Jungle Planks.png:Minecraft中Jungle Planks的精灵图,链接到木板,描述:丛林木板Invicon Acacia Planks.png:Minecraft中Acacia Planks的精灵图,链接到木板,描述:金合欢木板Invicon Dark Oak Planks.png:Minecraft中Dark Oak Planks的精灵图,链接到木板,描述:深色橡木木板Invicon Mangrove Planks.png:Minecraft中Mangrove Planks的精灵图,链接到木板,描述:红树木板Invicon Cherry Planks.png:Minecraft中Cherry Planks的精灵图,链接到木板,描述:樱花木板Invicon Bamboo Planks.png:Minecraft中Bamboo Planks的精灵图,链接到木板,描述:竹板Invicon Pale Oak Planks.png:Minecraft中Pale Oak Planks的精灵图,链接到木板,描述:苍白橡木木板Invicon Crimson Planks.png:Minecraft中Crimson Planks的精灵图,链接到木板,描述:绯红木板Invicon Warped Planks.png:Minecraft中Warped Planks的精灵图,链接到木板,描述:诡异木板[[|]]Invicon Oak Planks.png:Minecraft中Oak Planks的精灵图,链接到木板,描述:橡木木板Invicon Spruce Planks.png:Minecraft中Spruce Planks的精灵图,链接到木板,描述:云杉木板Invicon Birch Planks.png:Minecraft中Birch Planks的精灵图,链接到木板,描述:白桦木板Invicon Jungle Planks.png:Minecraft中Jungle Planks的精灵图,链接到木板,描述:丛林木板Invicon Acacia Planks.png:Minecraft中Acacia Planks的精灵图,链接到木板,描述:金合欢木板Invicon Dark Oak Planks.png:Minecraft中Dark Oak Planks的精灵图,链接到木板,描述:深色橡木木板Invicon Mangrove Planks.png:Minecraft中Mangrove Planks的精灵图,链接到木板,描述:红树木板Invicon Cherry Planks.png:Minecraft中Cherry Planks的精灵图,链接到木板,描述:樱花木板Invicon Bamboo Planks.png:Minecraft中Bamboo Planks的精灵图,链接到木板,描述:竹板Invicon Pale Oak Planks.png:Minecraft中Pale Oak Planks的精灵图,链接到木板,描述:苍白橡木木板Invicon Crimson Planks.png:Minecraft中Crimson Planks的精灵图,链接到木板,描述:绯红木板Invicon Warped Planks.png:Minecraft中Warped Planks的精灵图,链接到木板,描述:诡异木板[[|]]Invicon Cobblestone.png:Minecraft中Cobblestone的精灵图,链接到圆石,描述:圆石[[|]]Invicon Iron Ingot.png:Minecraft中Iron Ingot的精灵图,链接到铁锭,描述:铁锭[[|]]Invicon Cobblestone.png:Minecraft中Cobblestone的精灵图,链接到圆石,描述:圆石[[|]]Invicon Cobblestone.png:Minecraft中Cobblestone的精灵图,链接到圆石,描述:圆石[[|]]Invicon Redstone Dust.png:Minecraft中Redstone Dust的精灵图,链接到红石粉,描述:红石粉[[|]]Invicon Cobblestone.png:Minecraft中Cobblestone的精灵图,链接到圆石,描述:圆石
[[|]]Invicon Piston.png:Minecraft中Piston的精灵图,描述:活塞
黏性活塞 黏液球 +
活塞
[[|]]Invicon Slimeball.png:Minecraft中Slimeball的精灵图,链接到黏液球,描述:黏液球[[|]]Invicon Piston.png:Minecraft中Piston的精灵图,描述:活塞
[[|]]Invicon Sticky Piston.png:Minecraft中Sticky Piston的精灵图,描述:黏性活塞

破坏[编辑 | 编辑源代码]

挖掘活塞、黏性活塞和活塞头[2]的合适工具是镐。移动的活塞不能被挖掘破坏。

方块 活塞
黏性活塞
活塞头
移动的活塞
硬度 1.5 -1[挖掘 1]
合适挖掘工具
挖掘时间[挖掘 2]
徒手 2.25
BlockSprite oak-planks.png:Minecraft中oak-planks的精灵图木质 1.15
BlockSprite cobblestone.png:Minecraft中cobblestone的精灵图石质 0.6
ItemSprite iron-ingot.png:Minecraft中iron-ingot的精灵图铁质 0.4
ItemSprite diamond.png:Minecraft中diamond的精灵图钻石质 0.3
ItemSprite netherite-ingot.png:Minecraft中netherite-ingot的精灵图下界合金质 0.25
ItemSprite gold-ingot.png:Minecraft中gold-ingot的精灵图金质 0.2
  1. 硬度为负数的方块不可通过挖掘来破坏。
  2. 根据受影响因素修正前的基础挖掘速度计算出的挖掘时间,单位:秒。更多信息详见挖掘 § 挖掘速度

活塞和黏性活塞被破坏后会掉落自身,并破坏其伸出的活塞头(若有)。活塞头被破坏后,生成自身的活塞也会在PP更新后被破坏。移动的活塞被破坏后会掉落对应的方块。

用途[编辑 | 编辑源代码]

活塞在被放置时永远朝向玩家。附着性方块(比如拉杆)可以放在活塞或黏性活塞上,但不可以放在激活的活塞侧面[仅Java版]

当活塞被激活时,活塞的木质表面(活塞头)会在启动延迟后尝试伸出,并移动在其前方的方块;当活塞被取消激活时,活塞头会被收回。如果是黏性活塞,活塞头被收回时也会尝试将前方的方块拉回。

黏性活塞只有在拉回时才有黏性,因此静止时黏性活塞头上的方块不会被黏住。

红石元件[编辑 | 编辑源代码]

用红石线激活活塞
激活

活塞是机械元件,可被下列形式激活:

Java版中,活塞还能通过半连接性激活。若以上所述的途径对于活塞正上方的方格(不需要实际存在红石元件,空气方块或非红石导体均可)成立,活塞会在收到方块更新(狭义)时被激活。

基岩版中,在同一红石刻内,电容器更新阶段前存在,但在电容器更新阶段被取消的信号无法激活活塞。

活塞不是红石导体,不可充能。

行为

活塞被激活或取消激活后会在启动延迟后推出或拉回。在基岩版中,活塞正在推拉时不响应输入变化。

启动延迟[编辑 | 编辑源代码]

活塞被激活或取消激活后不会立刻推出或拉回,从输入变化到活塞真正开始推拉的时延就是启动延迟。

基岩版中,启动延迟固定为2游戏刻(0.1秒),即活塞输入变化后2游戏刻(0.1秒)后开始推出或拉回。

Java版中,根据活塞输入变化发生在游戏计算的什么阶段,启动延迟可以为0游戏刻(0秒)(同刻启动)或1游戏刻(0.05秒)(下一刻启动):

  • 如果活塞是在执行计划刻或执行方块事件中被更新激活,那么活塞事件会在这一游戏刻的方块事件阶段被执行。此时启动延迟就是0游戏刻(0秒),也就是同刻启动。
  • 如果活塞是在执行实体、方块实体时更新激活,或是因为玩家的操作而被激活时,活塞事件会在下一刻的方块事件阶段被执行。此时启动延迟就是1游戏刻(0.05秒),也就是下一刻启动。

移动方块结构[编辑 | 编辑源代码]

工作的活塞会让方块被推动或拉动,从而使这些方块及其关联的方块跟随活塞的推拉而移动。

当下列情况发生时,方块会尝试被推动:

  • 方块正位于将要推出的活塞前方;
  • 方块位于另一个方块的移动方向前方时会尝试被推动。

当下列情况发生时,方块会尝试被拉动:

  • 方块正位于将要拉回的黏性活塞活塞头前方;
  • 方块位于将要移动的黏液块蜂蜜块移动方向的侧方或后方时会尝试被拉动。

若一个方块既符合推动条件又符合拉动条件,我们将它视为推动。

下方的原理图展示了不同情况下各个方块的推拉状况:

L
L
L
L
L
L
T
T
T
T
L
帮助活塞推出时的方块推拉状况(1) — T代表推,L代表拉。
L
L
T
T
T
T
T
L
T
T
帮助活塞推出时的方块推拉状况(2) — T代表推,L代表拉,不考虑不可拉动的方块。
L
L
T
T
T
T
T
X
X
L
帮助活塞推出时的方块推拉状况(3) — T代表推,L代表拉,X代表不参与推拉行为的方块。
L
T
T
L
T
L
L
L
L
L
L
帮助活塞拉回时的方块推拉状况(1) — T代表推,L代表拉。
L
L
L
L
T
T
T
T
T
L
T
T
帮助活塞拉回时的方块推拉状况(2) — T代表推,L代表拉,不考虑不可拉动的方块。
L
L
L
L
T
T
T
T
T
X
X
L
帮助活塞拉回时的方块推拉状况(3) — T代表推,L代表拉,X代表不参与推拉行为的方块。

一个方块将要被推动或拉动时,会产生不同的行为。方块的推拉行为有下列几类:

  • 方块允许推动与拉动。
  • 方块允许推动,但不可拉动。
  • 方块被推动时会被破坏,且不可拉动。
  • 方块不可推动与拉动。

当活塞本身正在伸出、正在收回或已经伸出时,它不可推动和拉动;但当活塞处于收回状态时,它可推动和拉动。黏液块和蜂蜜块之间不能相互拉动。

Java版中,所有方块实体都不可推动或拉动。

活塞推出或拉回所带动的方块结构就是移动方块结构,下列原理图用*标记了活塞推出时的移动方块结构。

*
*
*
*
*
帮助活塞移动方块结构(1) — 被推动的方块和被黏液块拉动的方块被移动。
*
*
*
*
*
*
*
*
*
帮助活塞移动方块结构(2) — 不可拉动的方块无法被黏液块拉动。
*
*
*
*
*
*
帮助活塞移动方块结构(3) — 黏液块与蜂蜜块不会互相拉动。

活塞的移动方块受到多种条件限制。在下列情况下,活塞无法推动方块,黏性活塞无法拉回方块但可以收回活塞头:

  • 移动方块结构的方块总数超过12个。
  • 黏性活塞尝试拉回不可拉动的方块。
  • 移动方块结构会被移动超过建筑高度上限或建筑高度下限。
  • 移动方块结构移动方向前方有不可推动的方块。
帮助无法移动的情况(1) — 移动方块总数超过12个。
帮助无法移动的情况(2) — 黏性活塞尝试拉动不可拉动的方块。
帮助无法移动的情况(3) — 移动方块结构被不可推动的方块阻挡。

当移动方块结构移动时,附着于这个方块结构上的附着性方块会被破坏,移动方向前方的推动破坏方块也会被破坏,整个结构变为移动状态。通常情况下,2游戏刻(0.1秒)后移动方块结构到位,整个结构回到普通的方块状态。部分情况下移动结构可以在短于2游戏刻(0.1秒)的时间内到位(即为瞬间到位)。在Java版中,若黏性活塞接收到一个小于3游戏刻(0.15秒)的短正脉冲信号,它就可能无法在信号消失时拉回推出的方块结构。

在活塞推出和拉回时会发出声音,以活塞为中心31×31×31的区域内都能听到。

推动实体[编辑 | 编辑源代码]

在移动方块结构正在移动时,它会对在移动范围内的实体施加推力,从而使这些实体跟随着方块结构的移动而移动。如果实体被推动后无法向着对应方向移动,移动的方块可能会推入实体中。如果方块是一个窒息方块,方块被推入生物后可能造成生物窒息而亡。

绝大多数实体都可以被推动,但区域效果云布尔型Markertrue盔甲架展示实体交互实体标记[仅Java版]不会被推动。

如果实体被正在移动的黏液块推动,则会以较高的速度被弹开。

技术性组件[编辑 | 编辑源代码]

活塞头[编辑 | 编辑源代码]

活塞头
1.5
不可推动,不可拉动
竖琴/钢琴

 #707070
方块ID
Java版:piston_head
基岩版:piston_arm_collision

活塞头(Piston Head)(又称活塞臂)是一个技术方块,用于已经伸出的活塞。

活塞头不能使用常规方式放置,只能使用/setblock命令或调试棒放置。

基岩版中,使用/give @s pistonarmcollision/give @s stickypistonarmcollision可分别获得活塞头和黏性活塞头的方块物品

当活塞头的后方接收到PP更新[仅Java版]更新[仅基岩版]时,它会检查自己的后方是否正确连接到了一个对应的活塞上。若没有连接到一个活塞或是活塞的方向与活塞头不对应,那么活塞头会被立刻破坏,且不掉落任何物品。

当活塞头被破坏时,活塞头对应的活塞也会被破坏,并掉落物品。

Java版中,活塞头使用一个方块状态来定义它是一个普通活塞头还是一个黏性活塞头。在基岩版中,两种活塞头使用不同的ID定义。

移动的活塞[编辑 | 编辑源代码]

移动的活塞
-1
不可推动,不可拉动
竖琴/钢琴

 #707070
方块ID
Java版:moving_piston
基岩版:moving_block

移动的活塞(Moving Piston)[仅Java版]移动的方块(Moving Block)[仅基岩版],又称36号方块(Block 36)[注 5],是无法获得的技术性方块,用于活塞推拉行为的过程中代替正在移动中的方块。

活塞推拉方块时,方块需要进入或离开网格单元而占据了每个不同方块网格,因此不能被存储为正常方块。活塞推拉方块的过程中,活塞本身和移动方块结构内的所有方块都被替换为“移动的活塞”方块,原先的方块数据全部存储入方块实体数据中。在活塞推拉到位后,移动的活塞方块会被重新复原为原先的方块。

Java版中,使用命令放置的移动的活塞不会创建方块实体,使得此移动的活塞永远保持当前状态不会自动转变为正常方块。

移动的活塞具有下面的性质:

  • 它本身不可见,但其方块实体可见且渲染为储存的方块的移动动画。
  • 它本身没有碰撞箱,但它会使用其方块实体中保存的方块碰撞箱,随方块移动程度改变碰撞箱的位置。
  • 它没有轮廓箱,玩家无法选中它。
  • 在不使用命令的情况下,它只能被爆炸破坏。它的爆炸抗性为0,与储存的方块无关。在这种情况下,某些方块可能本身爆炸抗性很高,但如果被推动时产生爆炸,则会因为36号方块的爆炸抗性为0而被破坏。
  • 它是不可替换的方块,玩家不能在它所在的位置直接放置方块。
  • 当玩家踩上移动的活塞时,移动的活塞发出石头的声音,与储存的方块无关。

移动的活塞无法继承多数其代表的方块的特征。[3]

方块实体[编辑 | 编辑源代码]

参见:方块实体

该技术性方块具有与其相关联的保存了其附加数据的方块实体。

Java版

  • NBT复合标签/JSON对象 方块实体数据
    • 方块实体共通标签,见Template:Nbt inherit/blockentity/source[显示]
    • NBT复合标签/JSON对象*
      *
      blockState
      :所代表的被移动的方块。
    • 布尔型*
      *
      extending
      :表示移动的活塞是否是由推出的活塞移动而被创建的。
    • 整型*
      *
      facing
      :(0≤值≤5)创建移动的活塞的活塞的方向。从0到5分别对应下上北南西东,如果超过值域则对6取余并取绝对值后对应方向。
    • 单精度浮点数*
      *
      progress
      :(0≤值≤1)方块已经移动的进度。如果设置值超过1则重置为1,并到位。
    • 布尔型*
      *
      source
      :表示移动的活塞是否为引发移动的活塞或活塞头。

基岩版

活塞移动细节[编辑 | 编辑源代码]

Java版[编辑 | 编辑源代码]

创建移动方块结构

当活塞推出,黏性活塞推出或收回时,系统会以活塞前方的方块作为“起始点”递归创建一个移动方块结构,并计算这个结构是否能被移动和移动这个方块结构需破坏周围什么方块。创建移动方块结构的流程如下:

  1. 确定移动方向。若活塞正在推出,那么方向与活塞一致;若活塞正在收回,则方向与活塞相反。
  2. 创建移动列表和破坏列表。移动列表负责储存将移动的方块,破坏列表负责储存方块结构移动开始时将破坏的方块。
  3. 若起始点是一个推动破坏的方块,且活塞正在推出,则在破坏列表中加入该方块,中止创建移动方块结构。
  4. 从起始点向后方查找可以被拉动的方块,从远到近依次编号,添加入移动列表中,直到找到空气或即将移动的活塞本身。
    • 若查找过程中移动列表大小超过12,则中止创建移动方块结构,整个方块结构无法被移动。
  5. 从起始点向前查找方块,从近到远依次编号添加入移动列表中,直到找到空气、即将移动的活塞本身、推动破坏的方块、不可推动的方块或已经存在于移动列表中的方块。
    • 若查找过程中移动列表大小超过12,则中止创建移动方块结构,整个方块结构无法被移动。
    • 若查找到推动破坏的方块而中止查找,则将该方块添加入破坏列表中。
    • 若查找到不可推动的方块或即将移动的活塞本身而中止查找,则说明整个移动方块结构被阻挡,无法移动。此时创建移动方块结构中止,整个方块结构都不会移动。
    • 若查找到已存在于移动列表中的方块而中止查找,说明当前移动列表的元素顺序出现了问题,需要将目前计算的这列方块插入到已经存在于移动列表的方块前方。
  6. 按照移动列表内元素的顺序,依次遍历各个元素(包括将在这个循环中添加的方块):
    1. 检查方块是否为黏液块或蜂蜜块。若不是,不执行接下来的分支创建;若是,执行下面的流程:
    2. 按照下、上、北、南、西、东的顺序,尝试添加分支:
      • 若当前方向正好为推动方向或推动方向的反向,则不创建在这个方向上的分支。
      • 若对应方向上的方块无法拉动(包括黏液块和蜂蜜块之间不可拉动),则不创建在这个方向上的分支。
      • 以对应方向上的方块为新的起始点,执行外层的4、5步骤。
  7. 遍历元素结束后,移动列表和破坏列表就被填充完毕,创建移动方块结构完毕。

从这个流程可以看出,活塞移动方块结构内的编号顺序是按照移动方向依次递增的。垂直于移动方向上来看,离活塞越近,编号也越小。

5
6
2
1
2
3
4
1
7
8
3
9
4
帮助活塞移动方块结构编号(1) — 活塞向东推动,水平方向。
2
6
5
1
4
3
2
1
3
8
7
4
9
帮助活塞移动方块结构编号(2) — 活塞向西推动,水平方向。
7
8
3
1
2
3
4
1
5
6
2
9
4
帮助活塞移动方块结构编号(3) — 活塞向东推动,垂直方向。
产生更新

当活塞开始伸出或收回时,它会与移动方块结构按照一定的顺序发出方块更新。

若活塞未伸出,但当前具有红石信号,那么活塞被激活并尝试推出:

  1. 若活塞不可推出,则不产生更新。
  2. 计算移动方块结构,获得移动列表和破坏列表。
  3. 逆序破坏破坏列表内的方块,此过程不产生NC更新和PP更新。
  4. 逆序在移动后的位置放置移动的活塞方块,存储移动方块的信息,此过程不产生NC更新。
  5. 活塞应该产生活塞头的位置放置移动的活塞,保存活塞头信息,此过程不产生NC更新。
  6. 对于移动方块后留下的“空位”,以位置的哈希码大小排序从小到大将它们设置为空气,此过程不产生NC更新和PP更新。设置完成后,再按照这个顺序遍历一次这些方块产生PP更新。其中,位置的哈希码计算公式为x+31y+961z,取最后32位有符号整数作为这个位置的哈希码。
  7. 逆序对破坏方块列表内的方块产生间接PP更新和NC更新,再逆序对移动方块列表内的方块产生NC更新,最后在活塞头产生NC更新。
  8. 移动准备结束,活塞设置自身方块状态,产生NC更新和PP更新。

若活塞已伸出,但当前没有红石信号,那么活塞被取消激活并尝试收回:

  1. 若活塞头位置是移动的活塞方块实体,则瞬间到位。
  2. 设置自身状态为移动的活塞,此时不产生NC更新和PP更新。之后添加方块实体,并产生NC更新和PP更新。
  3. 若活塞是普通的活塞,则设置活塞头方块为空气,产生NC更新和PP更新,移动准备结束。
  4. 若活塞是黏性活塞,检查对应方向前方的第二格方块(即黏性活塞可能拉回的方块):
    • 若这个方块是一个移动的活塞方块实体,并且方向与黏性活塞相同,并处于正在推出状态,则瞬间到位。
    • 否则,检查前方方块是否为移动的活塞方块实体:
      • 若是,并且方向与黏性活塞相同,并正在推出,推动进度小于一半或刚刷新一次推动进度或此事件发生在计划刻和方块事件阶段内,则设置活塞头位置为空气,产生NC更新和PP更新,不拉回方块。
      • 若不是或没有满足上述条件,则再次检查前方的第二格方块是否为活塞可拉动的方块(但不检查移动方块结构):
        • 若不是可拉动的方块,则设置活塞头位置为空气,产生NC更新和PP更新。
        • 若是可拉动的方块,且移动方块结构也可以被拉动,则与上文推出类似,创建移动列表和破坏列表,并进行对应的NC更新和PP更新。
        • 若是可拉动的方块,但移动方块结构不能被拉动,则只会设置活塞头位置为空气,不产生NC更新和PP更新。
到位

在移动过程中,方块转变为移动的活塞方块,历经两次方块实体游戏刻计算后,在第三次调用刻计算时,执行普通到位。若从活塞开始伸出的那一游戏刻记为第0游戏刻开始计算,普通到位会在第2游戏刻的方块实体阶段被调用。

若在移动过程中移动的活塞被破坏,则会瞬间到位。

普通到位的流程如下:

  1. 删除方块实体。
  2. 检查当前方块是否为移动的活塞,若不是,则中止流程。
  3. 检查移动的活塞内部包含的要到位的方块到位后是否能成功附着或是否能在到位位置上存在,并矫正方块的形状。此过程约等于周围6个方块对本方块产生PP更新。
    • 若检查失败,则先设置本方块位置为要到位的方块,设置过程不产生NC更新和PP更新,最后再产生NC更新和PP更新。
    • 若检查成功,先将要到位的方块的含水状态清除,然后将本方块位置设置为要到位的方块,此过程产生NC更新和PP更新,再对本方块本身接收一次NC更新。

瞬间到位的流程如下:

  1. 删除方块实体。
  2. 检查当前方块是否为移动的活塞,如果不是,则中止流程。
  3. 检查自身是否为活塞头或活塞。
    • 若是,则将本方块位置设置为空气,此过程产生NC更新和PP更新,再对本方块本身接收一次NC更新。
    • 若不是,则将要到位的方块转换为最后要到位的方块,此过程约等于周围6个方块对本方块产生PP更新,用于矫正方块的形状和检查方块是否能在到位位置上存在。之后设置本方块位置为最后要到位的方块,此过程产生NC更新和PP更新,再对本方块本身接收一次NC更新。

瞬间到位和普通到位最明显的差异是是否清除方块的含水状态。当含水的方块被普通到位时,含水状态会被清除;而被瞬间到位时,含水状态不会被清除。

基岩版[编辑 | 编辑源代码]

活塞方块实体更新
  1. 初始化。
    活塞在被放置后的第一次更新中,活塞会设置一些关于活塞头、推出方向等的值并在完成后发送通知。在第一次更新后直到被删除前,该活塞都不会继续执行这一段代码。
  2. 根据活塞的红石状态同步和改变自身的推出状态。
  3. 计算活塞的浮点坐标,设置碰撞箱。
  4. 若活塞推出状态的值是1(即活塞需要推出)则执行推出检查函数pistonblockactor::_checkAttachedBlocks。若返回值为0,则本函数直接返回,意味着活塞推出失败。
    同步活塞红石状态(并非信号状态)和推出状态。
    调用pistonblockactor::_spawnmovingblocks函数,该函数为活塞推出方块、破坏方块一系列行为执行的主函数。
  5. 向活塞的六个面发送NC更新。
  6. 若活塞的推出状态不是1和3,而是2,则执行对推出的每个位置的移动的方块转方块的函数。
    调用pistonblockactor::_spawnblocks,该函数为遍历列表使移动的方块转方块的主函数。
  7. 若活塞的推出状态是3(即活塞需要收回),则执行和4相近的内容,仅在活塞收回中多出了一个删除方块的操作(可能是删除活塞头位置的方块)。
  8. 收回转方块和推出转方块类似。
活塞推出检查

checkattachedblocks函数用于检查活塞是否能推出,实际上这个函数更多的是计算一些位置、方向、发送事件和释放内存,同时调用真正的检查函数pistonblockactor::attachedblockwalker。这个函数会递归搜寻检查要被活塞推出的方块,检查每一个可能位置上的方块,并把可推出或破坏的方块加入列表,逻辑如下:

检查函数的参数是一个方块实体对象、一个blocksource对象,正在检查的方块的三维向量(递归搜寻,所以只是一个方块的坐标),还有两个指针。
  1. 遍历一次已加入列表的方块,若参数中的三维坐标在列表已经存在,则立即返回1。
  2. 计算正在检查的方块移动后的新坐标是否突破了高度限制。
  3. 计算活塞坐标和正在检查的坐标是否满足某种关系,并检查这个坐标是否为移动的方块,若是则通过检查[需要更多信息]
  4. 处理液体方块。
  5. 检查所检查位置是否有方块实体,若有则检查该方块实体是否为可移动的方块实体。
  6. 检查这个位置是否为空气,若是则通过检查。
  7. 处理黏性链接handleslimeconnection函数。
  8. 再次处理液体方块。
  9. 调用attachedblockwalker函数自身,并检查返回值,若返回值为0(即不能推出),自身也返回0(不能推出)。
活塞推出方块主函数
  1. 调用pistonblockactor::sortattachedblocks函数排序方块推出列表中的方块。
  2. 检查列表是否过长以至于溢出。
  3. 生成一个random对象,也就是处理随机数的,用于处理活塞推方块掉落物品。
  4. 遍历破坏列表里的方块,生成破坏后的掉落物并破坏方块。
  5. 遍历移动列表里的方块,对每个遍历到的坐标执行pistonblockactor::spawnmovingblock函数。
  6. 一些检查,释放内存。
活塞移动方块函数
  1. 判断被移动的方块是否有方块实体,而且方块实体是“2LL”类方块实体(应该是容器)。
    强制关闭箱子,若是大型箱子,则断开连接。
  2. 检查成就。
  3. 判断被移动的方块是否为空气,具有方块实体。方块实体是“19LL”类,即移动的方块。
    若是,将这个MB方块实体里的方块直接替换掉这个位置的方块(注意,和放置不同,这里的替换甚至不会发出NC更新)。
  4. 构造一个movingblock,并放置在目标位置。
  5. 若被移动的方块有方块实体,则将该方块实体的两个值记录到另两个变量里,将它们本身改成0(可能是与移动状态相关的),然后移除该方块实体。
  6. 若没有,也要移除一遍该位置的方块实体,即使根本就没有。
  7. 若新建的movingblock的位置没有成功地新建movingblock的方块实体,则直接跳到最后(删除原位置的方块)。
  8. 处理活塞移动的一些特殊情况。
  9. 若被移动的方块含有别的方块,而且该方块没有“0x2000000L”性质(液体方块具有这个性质),就一起移动,记录到movingblock里。
  10. 发送一些通知,并调用新创建的movingblock的函数移动碰撞的实体。
  11. 删除原位置的方块。
活塞处理方块转方块函数
  1. 检查活塞状态,若不是0和2状态,就执行转方块。
    遍历活塞推动方块的列表。
  2. 检查正在处理的方块是否为移动的方块。
  3. 若被推动的方块含液体方块,则检查相邻方块有没有液体方块,处理连接渲染状态。
  4. 将被移动的方块含的方块,即extrablock,放置出来。
  5. 将被移动的方块放出来。
移动的方块实体更新函数
  1. 作为方块实体类的子类,调用blockactor::tick
  2. 判断自身记录的方块是否为移动的方块(也就是被移动的movingblock),若是,则把记录的movingblock直接替换成空气,它的extrablock也会被替换。
  3. 若检查自身记录的活塞位置没有活塞,则转方块。

音效[编辑 | 编辑源代码]

Java版

音效字幕分类描述命名空间ID本地化键名
方块:被破坏方块破坏方块block.stone.breaksubtitles.block.generic.break
某物:摔落到方块上玩家带有摔落伤害时摔落在方块上block.stone.fallsubtitles.block.generic.fall
方块:损坏中方块挖掘方块block.stone.hitsubtitles.block.generic.hit
方块:被放置方块放置方块block.stone.placesubtitles.block.generic.place
脚步声玩家在方块上行走block.stone.stepsubtitles.block.generic.footsteps
活塞:移动方块活塞伸出block.piston.extendsubtitles.block.piston.move
活塞:移动方块活塞缩回block.piston.contractsubtitles.block.piston.move

基岩版

音效分类描述命名空间ID系统音效类型音量音高衰减距离预载
方块方块作为物品使用时发出的音效use.stoneitem.use.on1.00.816
方块破坏方块dig.stonebreak1.00.8-116
方块挖掘方块hit.stonehit0.370.516
方块放置方块dig.stoneplace1.00.8-116
玩家带有摔落伤害时摔落在方块上fall.stonefall0.41.016
玩家在方块上行走step.stonestep0.31.016
方块在方块上跳跃jump.stonejump0.121.016
方块在方块上着陆land.stoneland0.221.016
方块活塞伸出tile.piston.outpiston.out0.50.6-0.7516
方块活塞缩回tile.piston.inpiston.in0.50.6-0.7516

数据值[编辑 | 编辑源代码]

ID[编辑 | 编辑源代码]

Java版

名称命名空间ID方块标签JE本地化键名
BlockSprite piston.png:Minecraft中piston的精灵图 活塞pistonmineable/pickaxe
block.minecraft.piston
BlockSprite sticky-piston.png:Minecraft中sticky-piston的精灵图 黏性活塞sticky_piston
block.minecraft.sticky_piston
BlockSprite piston-head.png:Minecraft中piston-head的精灵图 活塞头piston_head
block.minecraft.piston_head
BlockSprite moving-piston.png:Minecraft中moving-piston的精灵图 移动的活塞moving_pistondragon_immune
wither_immune
block.minecraft.moving_piston
名称命名空间ID
BlockSprite moving-piston.png:Minecraft中moving-piston的精灵图 移动的活塞方块实体piston

基岩版

名称命名空间ID别名ID(BE本地化键名
BlockSprite piston.png:Minecraft中piston的精灵图 活塞piston
tile.piston.name
BlockSprite sticky-piston.png:Minecraft中sticky-piston的精灵图 黏性活塞sticky_piston
tile.sticky_piston.name
BlockSprite piston-head.png:Minecraft中piston-head的精灵图 活塞头piston_arm_collisionpistonArmCollision
tile.piston_arm_collision.name
BlockSprite piston-head.png:Minecraft中piston-head的精灵图 黏性活塞头sticky_piston_arm_collisionstickyPistonArmCollision
tile.sticky_piston_arm_collision.name
BlockSprite moving-block.png:Minecraft中moving-block的精灵图 移动的方块moving_blockmovingBlock
tile.moving_block.name
名称命名空间ID
BlockSprite moving-piston.png:Minecraft中moving-piston的精灵图 活塞方块实体PistonArm
BlockSprite moving-piston.png:Minecraft中moving-piston的精灵图 移动的活塞方块实体MovingBlock

方块数据[编辑 | 编辑源代码]

0x1
0x2
0x4
一个储存0-5的三位字段表示活塞的朝向:
  • 0: 活塞朝下
  • 1: 活塞朝上
  • 2: 活塞朝北
  • 3: 活塞朝南
  • 4: 活塞朝西
  • 5: 活塞朝东

方块实体[编辑 | 编辑源代码]

本段落所述内容仅适用于基岩版

方块状态[编辑 | 编辑源代码]

参见:方块状态

Java版

方块 方块属性 默认值 接受值 描述
活塞
黏性活塞
extended false true 活塞已伸出
false 活塞未伸出
facing north north 方块朝向北方
east 方块朝向东方
south 方块朝向南方
west 方块朝向西方
up 方块朝向上方
down 方块朝向下方
活塞头 facing north north 方块朝向北方
east 方块朝向东方
south 方块朝向南方
west 方块朝向西方
up 方块朝向上方
down 方块朝向下方
short false true 活塞头较短,整体长1格
false 正常的活塞头,整体长1.25格
type normal normal 该方块属于一个普通活塞
sticky 该方块属于一个黏性活塞
移动的活塞 facing north north 方块朝向北方
east 方块朝向东方
south 方块朝向南方
west 方块朝向西方
up 方块朝向上方
down 方块朝向下方
type normal normal 该方块属于一个普通活塞
sticky 该方块属于一个黏性活塞

基岩版

方块 方块属性 默认值 接受值 描述
移动的方块 无法获取到此方块的方块状态
活塞
黏性活塞
活塞头
黏性活塞头
facing_direction 0 0 方块朝向下方
1 方块朝向上方
2 方块朝向南方
3 方块朝向北方
4 方块朝向东方
5 方块朝向西方

成就[编辑 | 编辑源代码]

主条目:成就
图标 成就 游戏内描述 实际需求(若异) Xbox点数 奖杯(PS)
AchievementSprite inception.png:Minecraft中inception的精灵图NewAchievementSprite inception.png:Minecraft中inception的精灵图始作俑者
Inception
用一个活塞推另一个,然后用那个活塞拉最开始那一个。将2个活塞面对面放置,其中至少有一个是黏性活塞。顺次激活二者使整体移动1格。20G银杯

视频[编辑 | 编辑源代码]

历史[编辑 | 编辑源代码]

该段落需要添加等轴渲染图

请在将需要的等轴渲染图添加到该段落后移除此模板。
具体说明:MCPE-38053、原Mod中黏性活塞推出时的渲染图

Java版Classic
2009年5月21日Notch表示有兴趣添加当接收到来自线路的脉冲时可以拉动和推动其他方块的方块; 他把这种方块分别称为“Pulley1”与“Pulley2”。“Pulley1”会拉动一个方块,而“Pulley2”则会推动一个方块。
Java版Beta
? 最初的活塞是由Hippoplatimus发布在Minecraft官方论坛上的一个Mod。[4]这个版本的活塞源代码随后被交到了Jeb手中,Jeb随后将其加入到了原版Minecraft中;Hippoplatimus位列游戏鸣谢名单中的“补充程序员(Additional Programming)”一栏,这一栏用于感谢作品得以被加入原版Minecraft的Mod制作者。
另一位用户DiEvAl也在私下提交过代码,他提出了利用方块实体追踪移动的方块的想法。[5][6]
然而,由于Jeb那时忙于携带版的开发,活塞没有在Beta 1.5和Beta 1.6更新中发布。最终,当携带版足够好可以在E3上展示时,Jeb回到Java版的开发,最终在Beta 1.7中添加了活塞和黏性活塞。
2011年6月7日Jeb在动态中发布了一张开发中的活塞的图片。
活塞的纹理是截屏而来的,而在开发过程中活塞头上面有铁环穿过。铁环在发布版本中被移除,只留下在边角上的铁支架。
1.7




加入了活塞和黏性活塞,以及与之相关的活塞头和移动的方块。
六面活塞作为活塞的极端数据值变种而存在。
1.7_01黏性活塞不再会在它们缩回时黏住方块。
Java版
?移动的活塞方块的线框现在与其碰撞箱对齐。
1.2.4正式版云杉木板白桦木板以及丛林木板现在可以用来合成活塞。
1.2.5活塞头方块现在可以通过选取方块键获得。
1.3.112w16a活塞头方块不再可以通过选取方块键获得。
12w22a黏性活塞现在可以在丛林神庙中自然生成,用于弓箭陷阱隐藏宝藏
12w27a改进了活塞来使它们不那么容易出错,这也代表它们会更新得更慢一些。同时这也更改了活塞的工作原理,使得玩家可能需要调整其中继器的延迟以及其他类似的红石装置。由于这次改动,活塞现在需要2红石刻(4游戏刻)的时间来伸缩,但它们仍然会瞬间缩回。
1.7.213w37a34号方块(活塞头)和36号方块从/give命令中移除。
1.7.1金合欢木板深色橡木木板现在可以用来合成活塞。
1.814w17a 更改了活塞及相关方块正面朝上和朝下的纹理。
14w18a现在当活塞推动黏液块时,黏液块会带动与其相邻的、可以被推动的方块。
现在活塞朝上推动时,其顶部若放有一个黏液块,则会将黏液块上的实体生物玩家掉落物、已发射的等)弹射到空中。
14w19a附着活塞的黏液块现在可以推动侧面的和下面的方块。
14w26a活塞现在使用方块状态,取代了之前的数据值。因此怪异的活塞已被移除。
14w29a

这个版本现在存在“短”版的活塞头,其用途未知。
piston_head的方块状态添加了short=true/false
14w32a移动的活塞头不再拥有碰撞箱。
1.915w49a没有伸长的活塞、面朝下的活塞和面朝上的活塞头现在被认为拥有固体的顶部表面,就像倒置的楼梯和上半顶部的台阶。同时还存在着这样的一个漏洞:当活塞头收回时,它会拉动穿过它的实体,称为易位。
1.11.116w50apiston_extension方块实体添加了一个名为source的新字节标签,当方块代表活塞头部时为true,而代表被推动的方块时为false。易位被修复了。
1.1217w16a黏性活塞不再能拉动带釉陶瓦。现在活塞推动黏液块时不会推动附着在黏液块侧面的带釉陶瓦。
pre3黏液块不再能推动在它任何一侧的带釉陶瓦。
1.1317w47a移动方块的ID已从piston_extension改变为moving_piston
扁平化之前,这些方块的数字ID为29、33、34和36。
活塞现在可以推动音符盒
pre6黏性活塞现在再次可以拉动带釉陶瓦
pre8黏性活塞不再可以拉动带釉陶瓦。
1.1418w43a






更改了与活塞有关的纹理。
虽然橡木木板的纹理在随后的快照中进行了升级,但活塞的纹理并未因此受到改动。[7]
18w44a活塞不再是透明方块了。
18w46a伸出的活塞现在允许光透过某些面。
1.1519w41a加入了蜂蜜块。蜂蜜块与活塞有着多种不同种类的交互。
1.1620w06a活塞的硬度由0.5增加到了1.5。
现在可以更快地破坏活塞。
放置在活塞背部的红石部件不再会在活塞收回时掉落。
绯红木板诡异木板现在可以用来合成活塞。
1.1720w45a被活塞破坏的方块现在会产生粒子
1.1922w11a红树木板现在可以用来合成活塞。
22w13a现在黏性活塞和活塞头会生成在远古城市中心的地下室内。
22w17a 更改了活塞和黏性活塞的纹理,使得活塞头的橡木木板部分颜色与实际一致。
1.2124w20a更改了活塞伸出和收缩的音效。
24w21a回退了24w20a的音效更改,并降低了原音效的音量和衰减距离。
1.21.525w10a现在被活塞破坏的方块会播放其破坏音效。[8]
携带版Alpha
0.15.0build 1 加入了活塞和黏性活塞,它们拥有独有的动画和推动方块实体的能力。
?同样存在怪异的活塞,但这种活塞并不是六面活塞。
基岩版
1.10.01.10.0.3 更改了纹理。
1.13.0?黏性活塞头现在是独立的方块,分离于普通的活塞头,不再由方块状态决定。命名空间ID现在是stickypistonarmcollision,数字ID为472。
1.16.01.15.0.55现在推动含水方块将使其失去含水状态。
?movingblock方块不再能够使用命令放置。
1.18.301.18.30.26活塞头、黏性活塞头和移动的方块的ID分别由pistonarmcollisionstickypistonarmcollisionmovingblock更改为piston_arm_collisionsticky_piston_arm_collisionmoving_block
1.19.01.19.0.26现在黏性活塞可以生成于远古城市中心的地下室。
1.19.501.19.50.20现在活塞头与黏性活塞头推出和收回的动画更加流畅。[9]
现在活塞推动方块的动画更加流畅。[10]
1.19.51方块在被活塞推动时被破坏后不再会重新出现。
1.20.301.20.20.21活塞和黏性活塞的硬度由0.5改为1.5。
活塞的爆炸抗性由0.5改为1.5。
1.20.30.20现在可以更快地破坏活塞。
New Nintendo 3DS版
0.1.0 加入了活塞和黏性活塞。
原主机版
Xbox 360Xbox OnePS3PS4PS VitaWii USwitch
TU3CU11.001.001.00Patch 11.0.1 加入了活塞和黏性活塞。
TU141.04活塞现在花费双倍的时间(2红石刻或4游戏刻)来延长,但它们仍然立即收缩。
1.90 更改了活塞的纹理。
原主机版
Xbox 360Xbox OnePS3PS4PS VitaWii USwitch
TU3CU11.001.001.00Patch 11.0.1 加入了活塞和黏性活塞。
TU141.04活塞现在花费双倍的时间(2红石刻或4游戏刻)来延长,但它们仍然立即收缩。
1.90 更改了活塞的纹理。

你知道吗[编辑 | 编辑源代码]

  • Mojang曾经声称活塞只能推动12个方块的限制不会被改动,因为“现有的限制是有意设计的”。[11]
  • 当活塞托举着一个受重力影响的方块(例如沙子)并不断迅速地伸缩,该方块很有可能最终掉落为物品。因为该方块所对应的实体要变回对应方块时,活塞臂刚好伸出了。不过,沙砾不会掉落为燧石
  • 如果通过短脉冲充能的黏性活塞直接推动含水方块,那么含水方块在被推动到新地点后还会保持含水。
  • 生物可以在活塞头方块中生成。
  • 地毯可以放在活塞臂上,如果用/setblock替换活塞臂的话,地毯还会留在原位。
  • 基岩版中,使用命令生成的活塞头是不可见且是没有碰撞箱的。这个版本中移动的活塞不能使用方块放置命令放置。
  • 活塞头在基岩版中与Java版形状略有不同。
  • 如果一个活塞在世界的顶部,并且面向上,或者在底部且面向下,它就不能伸出。
  • 一个活塞不能推动另一个被激活的活塞。
  • “移动中的活塞”方块是透明的并且不发光。
    • 发光的方块被活塞移动的瞬间会短暂变暗,不透明的方块被移动的瞬间则能够透光。
    • 移动中的活塞无法使生物窒息。

画廊[编辑 | 编辑源代码]

艺术作品[编辑 | 编辑源代码]

参见[编辑 | 编辑源代码]

注释[编辑 | 编辑源代码]

  1. 紫水晶母岩被活塞推动时会被破坏,且不掉落任何物品。
  2. 花盆被活塞推动时会被破坏,花盆中的植物也会掉落。
  3. 物品展示框在Java版中是实体而非方块,在基岩版中是方块。
  4. 画严格来说是实体而非方块。
  5. 此名称来源于移动的活塞在扁平化前的方块ID。

参考[编辑 | 编辑源代码]

  1. “Block of the Week: Piston” – Minecraft.net,2017年10月13日
  2. MC-171370 — “活塞头用镐破坏的速度比用斧头破坏得更快” — 漏洞状态为“有意为之”。
  3. MC-123217
  4. http://www.minecraftforum.net/viewtopic.php?t=247686&f=1032
  5. http://www.reddit.com/r/Minecraft/comments/hvkmo/attribution_of_the_piston_mod_in_vanilla_minecraft/
  6. http://imageshack.us/photo/my-images/51/jebf.jpg/
  7. MC-248841 — 漏洞状态为“有意为之”。
  8. MC-203550 — 漏洞状态为“已修复”。
  9. MCPE-155987 — 漏洞状态为“已修复”。
  10. MCPE-146597 — 漏洞状态为“已修复”。
  11. Piston Push Limits (and increases). The current limitations are by design.  — Minecraft Feedback,2019年1月3日。
  12. https://twitter.com/notch/status/83513677654929408

导航[编辑 | 编辑源代码]