1
- //三种会检查伸出的情况
2
-
3
- //被手动放置
4
- void setPlacedBy (level , blockPos , blockState , livingEntity , itemStack ) {
5
- //非客户端
6
- if (!level .isClientSide ) checkIfExtend (level , blockPos , blockState );
7
- }
8
-
9
- //受到更新
10
- void neighborChanged (blockState , level , blockPos , block , blockPos2 , bl ) {
11
- //非客户端
12
- if (!level .isClientSide ) checkIfExtend (level , blockPos , blockState );
13
- }
14
-
15
- //其他方式放置的方块,如推动
16
- void onPlace (blockState , level , blockPos , blockState2 , bl ) {
17
- //如果方块没变则跳过
18
- if (blockState2 .is (blockState .getBlock ())) return ;
19
- //非客户端且此处不为方块实体
20
- if (!level .isClientSide && level .getBlockEntity (blockPos ) == null ) checkIfExtend (level , blockPos , blockState );
21
- }
22
-
23
- //检查是否需要伸出
24
- //n = 0, 伸出
25
- //n = 1, 收回
26
- //n = 2, 瞬推收回
27
- void checkIfExtend (level , blockPos , blockState ) {
28
- //活塞的朝向
29
- direction = blockState .getValue (FACING );
30
- //检查激活情况
31
- bl = getNeighborSignal (level , blockPos , direction );
32
- //如果活塞会被激活而没有伸出
33
- if (bl && !blockState .getValue (EXTENDED ).booleanValue ()) {
34
- //分析方块结构检查能否伸出
35
- if (new PistonStructureResolver (level , blockPos , direction , true ).resolve ()) {
36
- //将本次伸出添加到方块事件
37
- level .blockEvent (blockPos , this , 0 , direction .get3DDataValue ());
38
- }
39
- //如果活塞没有被激活而伸出了
40
- } else if (!bl && blockState .getValue (EXTENDED ).booleanValue ()) {
41
- //伸出一格之外的位置,获取此处方块状态
42
- blockPos2 = blockPos .relative (direction , 2 );
43
- blockState2 = level .getBlockState (blockPos2 );
44
- n = 1 ;
45
- //如果这个方块是朝向与当前活塞同向推出的b36方块
46
- //且这次更新不为b36方块的到位更新
47
- if (blockState2 .is (Blocks .MOVING_PISTON ) && blockState2 .getValue (FACING ) == direction && (blockEntity = level .getBlockEntity (blockPos2 )) instanceof PistonMovingBlockEntity && (pistonMovingBlockEntity = (PistonMovingBlockEntity )blockEntity ).isExtending () && (pistonMovingBlockEntity .getProgress (0.0f ) < 0.5f || level .getGameTime () == pistonMovingBlockEntity .getLastTicked () || ((ServerLevel )level ).isHandlingTick ())) {
48
- //设置n
49
- n = 2 ;
50
- }
51
- //添加方块事件
52
- level .blockEvent (blockPos , this , n , direction .get3DDataValue ());
53
- }
54
- }
55
-
56
- //检查是否被激活
57
- boolean getNeighborSignal (level , blockPos , direction ) {
58
- //朝各个方向检查激活情况
59
- for (direction2 : Direction .values ()) {
60
- //不检查伸出的方向
61
- if (direction2 == direction || !level .hasSignal (blockPos .relative (direction2 ), direction2 )) continue ;
62
- return true ;
63
- }
64
- //如果此处有向上激活的信号则激活(?迷惑操作)
65
- if (level .hasSignal (blockPos , Direction .DOWN )) {
66
- return true ;
67
- }
68
- //检查活塞上方的位置(引发qc特性的上位激活)
69
- blockPos2 = blockPos .above ();
70
- //朝各个方向检查激活情况
71
- for (direction3 : Direction .values ()) {
72
- //不检查下方
73
- if (direction3 == Direction .DOWN || !level .hasSignal (blockPos2 .relative (direction3 ), direction3 )) continue ;
74
- return true ;
75
- }
76
- return false ;
77
- }
78
-
79
- //检查方块是否能够被活塞移动
80
- //direction:移动方向
81
- //direction2:作用方向
82
- //bl:包含破坏
83
- boolean isPushable (blockState , level , blockPos , direction , bl , direction2 ) {
84
- //如果该位置在世界之外,不能推动
85
- if (blockPos .getY () < 0 || blockPos .getY () > level .getMaxBuildHeight () - 1 || !level .getWorldBorder ().isWithinBounds (blockPos )) {
86
- return false ;
87
- }
88
- //如果该方块是空气,可以推动
89
- if (blockState .isAir ()) {
90
- return true ;
91
- }
92
- //如果该方块是黑曜石或哭泣的黑曜石或重生锚,不能推动
93
- if (blockState .is (Blocks .OBSIDIAN ) || blockState .is (Blocks .CRYING_OBSIDIAN ) || blockState .is (Blocks .RESPAWN_ANCHOR )) {
94
- return false ;
95
- }
96
- //如果在y0向下,不能推动
97
- if (direction == Direction .DOWN && blockPos .getY () == 0 ) {
98
- return false ;
99
- }
100
- //如果在世界顶部向上,不能推动
101
- if (direction == Direction .UP && blockPos .getY () == level .getMaxBuildHeight () - 1 ) {
102
- return false ;
103
- }
104
- //如果该方块是伸出的活塞底座,不能伸出
105
- if (blockState .is (Blocks .PISTON ) || blockState .is (Blocks .STICKY_PISTON )) {
106
- if (blockState .getValue (EXTENDED ).booleanValue ()) {
107
- return false ;
108
- }
109
- } else {//该方块不是活塞底座
110
- //如果该方块无法挖掘,不能移动
111
- if (blockState .getDestroySpeed (level , blockPos ) == -1.0f ) {
112
- return false ;
113
- }
114
- //推动情况
115
- switch (blockState .getPistonPushReaction ()) {
116
- //阻碍,不能推动
117
- case BLOCK : {
118
- return false ;
119
- }
120
- //破坏,返回bl
121
- case DESTROY : {
122
- return bl ;
123
- }
124
- //仅推动,如果是推动则可以
125
- case PUSH_ONLY : {
126
- return direction == direction2 ;
127
- }
128
- }
129
- }
130
- //如果是方块实体,不能推动
131
- return !blockState .getBlock ().isEntityBlock ();
1
+ //三种会检查伸出的情况
2
+
3
+ //被手动放置
4
+ void setPlacedBy (level , blockPos , blockState , livingEntity , itemStack ) {
5
+ //非客户端
6
+ if (!level .isClientSide ) checkIfExtend (level , blockPos , blockState );
7
+ }
8
+
9
+ //受到更新
10
+ void neighborChanged (blockState , level , blockPos , block , blockPos2 , bl ) {
11
+ //非客户端
12
+ if (!level .isClientSide ) checkIfExtend (level , blockPos , blockState );
13
+ }
14
+
15
+ //其他方式放置的方块,如推动
16
+ void onPlace (blockState , level , blockPos , blockState2 , bl ) {
17
+ //如果方块没变则跳过
18
+ if (blockState2 .is (blockState .getBlock ())) return ;
19
+ //非客户端且此处不为方块实体
20
+ if (!level .isClientSide && level .getBlockEntity (blockPos ) == null ) checkIfExtend (level , blockPos , blockState );
21
+ }
22
+
23
+ //检查是否需要伸出
24
+ //n = 0, 伸出
25
+ //n = 1, 收回
26
+ //n = 2, 瞬推收回
27
+ void checkIfExtend (level , blockPos , blockState ) {
28
+ //活塞的朝向
29
+ direction = blockState .getValue (FACING );
30
+ //检查激活情况
31
+ bl = getNeighborSignal (level , blockPos , direction );
32
+ //如果活塞会被激活而没有伸出
33
+ if (bl && !blockState .getValue (EXTENDED ).booleanValue ()) {
34
+ //分析方块结构检查能否伸出
35
+ if (new PistonStructureResolver (level , blockPos , direction , true ).resolve ()) {
36
+ //将本次伸出添加到方块事件
37
+ level .blockEvent (blockPos , this , 0 , direction .get3DDataValue ());
38
+ }
39
+ //如果活塞没有被激活而伸出了
40
+ } else if (!bl && blockState .getValue (EXTENDED ).booleanValue ()) {
41
+ //伸出一格之外的位置,获取此处方块状态
42
+ blockPos2 = blockPos .relative (direction , 2 );
43
+ blockState2 = level .getBlockState (blockPos2 );
44
+ n = 1 ;
45
+ //如果这个方块是朝向与当前活塞同向推出的b36方块
46
+ //且这次更新不为b36方块的到位更新
47
+ if (blockState2 .is (Blocks .MOVING_PISTON ) && blockState2 .getValue (FACING ) == direction && (blockEntity = level .getBlockEntity (blockPos2 )) instanceof PistonMovingBlockEntity && (pistonMovingBlockEntity = (PistonMovingBlockEntity )blockEntity ).isExtending () && (pistonMovingBlockEntity .getProgress (0.0f ) < 0.5f || level .getGameTime () == pistonMovingBlockEntity .getLastTicked () || ((ServerLevel )level ).isHandlingTick ())) {
48
+ //设置n
49
+ n = 2 ;
50
+ }
51
+ //添加方块事件
52
+ level .blockEvent (blockPos , this , n , direction .get3DDataValue ());
53
+ }
54
+ }
55
+
56
+ //检查是否被激活
57
+ boolean getNeighborSignal (level , blockPos , direction ) {
58
+ //朝各个方向检查激活情况
59
+ for (direction2 : Direction .values ()) {
60
+ //不检查伸出的方向
61
+ if (direction2 == direction || !level .hasSignal (blockPos .relative (direction2 ), direction2 )) continue ;
62
+ return true ;
63
+ }
64
+ //如果此处有向上激活的信号则激活(?迷惑操作)
65
+ if (level .hasSignal (blockPos , Direction .DOWN )) {
66
+ return true ;
67
+ }
68
+ //检查活塞上方的位置(引发qc特性的上位激活)
69
+ blockPos2 = blockPos .above ();
70
+ //朝各个方向检查激活情况
71
+ for (direction3 : Direction .values ()) {
72
+ //不检查下方
73
+ if (direction3 == Direction .DOWN || !level .hasSignal (blockPos2 .relative (direction3 ), direction3 )) continue ;
74
+ return true ;
75
+ }
76
+ return false ;
77
+ }
78
+
79
+ //检查方块是否能够被活塞移动
80
+ //direction:移动方向
81
+ //direction2:作用方向
82
+ //bl:包含破坏
83
+ boolean isPushable (blockState , level , blockPos , direction , bl , direction2 ) {
84
+ //如果该位置在世界之外,不能推动
85
+ if (blockPos .getY () < 0 || blockPos .getY () > level .getMaxBuildHeight () - 1 || !level .getWorldBorder ().isWithinBounds (blockPos )) {
86
+ return false ;
87
+ }
88
+ //如果该方块是空气,可以推动
89
+ if (blockState .isAir ()) {
90
+ return true ;
91
+ }
92
+ //如果该方块是黑曜石或哭泣的黑曜石或重生锚,不能推动
93
+ if (blockState .is (Blocks .OBSIDIAN ) || blockState .is (Blocks .CRYING_OBSIDIAN ) || blockState .is (Blocks .RESPAWN_ANCHOR )) {
94
+ return false ;
95
+ }
96
+ //如果在y0向下,不能推动
97
+ if (direction == Direction .DOWN && blockPos .getY () == 0 ) {
98
+ return false ;
99
+ }
100
+ //如果在世界顶部向上,不能推动
101
+ if (direction == Direction .UP && blockPos .getY () == level .getMaxBuildHeight () - 1 ) {
102
+ return false ;
103
+ }
104
+ //如果该方块是伸出的活塞底座,不能伸出
105
+ if (blockState .is (Blocks .PISTON ) || blockState .is (Blocks .STICKY_PISTON )) {
106
+ if (blockState .getValue (EXTENDED ).booleanValue ()) {
107
+ return false ;
108
+ }
109
+ } else {//该方块不是活塞底座
110
+ //如果该方块无法挖掘,不能移动
111
+ if (blockState .getDestroySpeed (level , blockPos ) == -1.0f ) {
112
+ return false ;
113
+ }
114
+ //推动情况
115
+ switch (blockState .getPistonPushReaction ()) {
116
+ //阻碍,不能推动
117
+ case BLOCK : {
118
+ return false ;
119
+ }
120
+ //破坏,返回bl
121
+ case DESTROY : {
122
+ return bl ;
123
+ }
124
+ //仅推动,如果是推动则可以
125
+ case PUSH_ONLY : {
126
+ return direction == direction2 ;
127
+ }
128
+ }
129
+ }
130
+ //如果是方块实体,不能推动
131
+ return !blockState .getBlock ().isEntityBlock ();
132
132
}
0 commit comments