Skip to content

Commit efd9ce6

Browse files
committed
Piston part is almost finished.
1 parent 70f95c9 commit efd9ce6

15 files changed

+354
-186
lines changed

Piston/Observer-onRemove.java

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
void onRemove(blockState, level, blockPos, blockState2, bl) {
2+
//方块没有发生改变则返回
3+
if (blockState.is(blockState2.getBlock())) {
4+
return;
5+
}
6+
//非客户端,侦测器亮起,正处于计划刻
7+
if (!level.isClientSide && blockState.getValue(POWERED).booleanValue() && level.getBlockTicks().hasScheduledTick(blockPos, this)) {
8+
//向后方输出位置发出方块更新
9+
updateNeighborsInFront(level, blockPos, (BlockState)blockState.setValue(POWERED, false));
10+
}
11+
}

Piston/PistonBaseBlock-triggerEvent.java

+28-29
Original file line numberDiff line numberDiff line change
@@ -7,69 +7,68 @@ boolean triggerEvent(blockState, level, blockPos, n, n2) {
77
direction = blockState.getValue(FACING);
88
//非客户端
99
if (!level.isClientSide) {
10-
//检查充能情况
10+
//检查激活情况
1111
bl = getNeighborSignal(level, blockPos, direction);
12-
//如果被充能,而方块事件为需要收回或瞬推
12+
//如果激活,而方块事件为收回或瞬推收回
1313
if (bl && (n == 1 || n == 2)) {
1414
//将活塞设置成伸出状态
1515
//flags:0b00000010 寻路更新
1616
level.setBlock(blockPos, blockState.setValue(EXTENDED, true), 2);
1717
return false;
1818
}
19-
//如果没有充能,方块事件为伸出,则取消该方块事件
19+
//如果没有激活,而方块事件为伸出,方块事件执行失败
2020
if (!bl && n == 0) return false;
2121
}
2222
//伸出事件
2323
if (n == 0) {
24-
//移动前方方块
24+
//移动前方方块,若无法移动,则方块事件执行失败
2525
if (!moveBlocks(level, blockPos, direction, true)) return false;
2626
//将活塞设置为伸出状态
27-
//flags:0b01000011 放置移除更新 寻路更新 方块更新/CUD
27+
//flags:0b01000011 放置移除更新 寻路更新 方块更新
2828
level.setBlock(blockPos, blockState.setValue(EXTENDED, true), 67);
2929
//播放活塞伸出的声音
3030
level.playSound(null, blockPos, SoundEvents.PISTON_EXTEND, SoundSource.BLOCKS, 0.5f, level.random.nextFloat() * 0.25f + 0.6f);
31+
//方块事件执行成功
3132
return true;
32-
} else {
33-
//其他方块事件(?) 返回
33+
} else {//收回事件及瞬推收回事件
34+
//其他方块事件(?),返回
3435
if (n != 1 && n != 2) return true;
35-
36-
//收回或瞬推收回事件
37-
3836
//活塞头位置的方块实体
3937
blockEntity = level.getBlockEntity(blockPos.relative(direction));
40-
//如果是b36,则将其变回普通方块
41-
if (blockEntity instanceof PistonMovingBlockEntity) {
42-
((PistonMovingBlockEntity)blockEntity).finalTick();
43-
}
38+
//如果是b36,则使其瞬间到位
39+
if (blockEntity instanceof PistonMovingBlockEntity)((PistonMovingBlockEntity)blockEntity).finalTick();
4440
//将活塞设置成b36
4541
blockState2 = (Blocks.MOVING_PISTON.defaultBlockState().setValue(MovingPistonBlock.FACING, direction)).setValue(MovingPistonBlock.TYPE, isSticky ? PistonType.STICKY : PistonType.DEFAULT);
46-
//flags:0b00010100 无形状更新 寻路更新 客户端
42+
//flags:0b00010100 无形状更新 寻路更新
4743
level.setBlock(blockPos, blockState2, 20);
48-
//将该位置设置成b36方块实体
44+
//设置成b36方块实体
4945
level.setBlockEntity(blockPos, MovingPistonBlock.newMovingBlockEntity(defaultBlockState().setValue(FACING, Direction.from3DDataValue(n2 & 7)), direction, false, true));
50-
//给该位置一个方块更新
46+
//发出方块更新
5147
level.blockUpdated(blockPos, blockState2.getBlock());
52-
//给该位置一个形状更新
48+
//发出形状更新
5349
blockState2.updateNeighbourShapes(level, blockPos, 2);
5450
//如果是粘性活塞
5551
if (isSticky) {
5652
//伸出方向一格之外的位置
5753
blockPos2 = blockPos.offset(direction.getStepX() * 2, direction.getStepY() * 2, direction.getStepZ() * 2);
5854
blockState3 = level.getBlockState(blockPos2);
5955
bl = false;
60-
//如果这个方块是b36且方向为该活塞伸出方向且处于伸出状态(瞬推收回)
56+
//如果这个方块是b36且且与活塞同向推出
6157
if (blockState3.is(Blocks.MOVING_PISTON) && (blockEntity2 = level.getBlockEntity(blockPos2)) instanceof PistonMovingBlockEntity && (pistonMovingBlockEntity = (PistonMovingBlockEntity)blockEntity2).getDirection() == direction && pistonMovingBlockEntity.isExtending()) {
62-
//将其变回普通方块
58+
//让该方块瞬间到位
6359
pistonMovingBlockEntity.finalTick();
6460
bl = true;
6561
}
66-
//如果不是上面的情况(正常收回)
62+
//如果不是上面的情况
6763
if (!bl) {
68-
//如果是收回事件且该方块不是空气且活塞可以拉动且该方块能被正常移动或该方块是活塞/粘性活塞
64+
//如果是收回事件
65+
//且该方块不是空气
66+
//且活塞可以移动前方一格的方块
67+
//且该方块能被正常移动或该方块是活塞/粘性活塞
6968
if (n == 1 && !blockState3.isAir() && PistonBaseBlock.isPushable(blockState3, level, blockPos2, direction.getOpposite(), false, direction) && (blockState3.getPistonPushReaction() == PushReaction.NORMAL || blockState3.is(Blocks.PISTON) || blockState3.is(Blocks.STICKY_PISTON))) {
70-
//拉动前方方块
69+
//移动前方方块
7170
moveBlocks(level, blockPos, direction, false);
72-
} else {//前方方块没有方块被拉动
71+
} else {//前方一格的方块不能被拉动
7372
//删除活塞臂位置的方块
7473
level.removeBlock(blockPos.relative(direction), false);
7574
}
@@ -127,7 +126,7 @@ boolean moveBlocks(level, blockPos, direction, bl) {
127126
//掉落方块实体的物品
128127
PistonBaseBlock.dropResources(object22, level, (BlockPos)object3, (BlockEntity)object);
129128
//将该方块设置成空气
130-
//flags:0b00010010 18 无形状更新 寻路更新
129+
//flags:0b00010010 无形状更新 寻路更新
131130
level.setBlock((BlockPos)object3, Blocks.AIR.defaultBlockState(), 18);
132131
//添加到列表中
133132
arrblockState[n3++] = object22;
@@ -141,7 +140,7 @@ boolean moveBlocks(level, blockPos, direction, bl) {
141140
//删除哈希表中方块
142141
hashMap.remove(object3);
143142
//将该方块设置成b36
144-
//flags: 0b01101000 调用onPlace/onRemove
143+
//flags: 0b01101000 放置移除更新
145144
level.setBlock((BlockPos)object3, Blocks.MOVING_PISTON.defaultBlockState().setValue(FACING, direction), 68);
146145
//将该方块设置成b36方块实体
147146
level.setBlockEntity((BlockPos)object3, MovingPistonBlock.newMovingBlockEntity(arrayList.get(n), direction, bl, false));
@@ -157,7 +156,7 @@ boolean moveBlocks(level, blockPos, direction, bl) {
157156
//从哈希表中删除
158157
hashMap.remove(blockPos2);
159158
//将活塞头的位置设置成b36
160-
//flags: 0b01101000 调用onPlace/onRemove
159+
//flags: 0b01101000 放置移除更新
161160
level.setBlock(blockPos2, blockState, 68);
162161
//将活塞头的位置设置成b36方块实体
163162
level.setBlockEntity(blockPos2, MovingPistonBlock.newMovingBlockEntity(object3, direction, true, true));
@@ -166,7 +165,7 @@ boolean moveBlocks(level, blockPos, direction, bl) {
166165
//对于哈希表中剩下的方块位置
167166
for (blockPos3 : hashMap.keySet()) {
168167
//设置成空气
169-
//flags: 0b01010010 调用onPlace/onRemove 无形状更新 寻路更新
168+
//flags: 0b01010010 放置移除更新 无形状更新 寻路更新
170169
level.setBlock(blockPos3, blockState, 82);
171170
}
172171
//对于哈希表中的所有方块
@@ -188,7 +187,7 @@ boolean moveBlocks(level, blockPos, direction, bl) {
188187
//红石粉间接位置更新
189188
blockState3.updateIndirectNeighbourShapes(level, (BlockPos)object, 2);
190189
//给出方块更新
191-
level.updateNeighborsAt((BlockPos)object, blockState3.getBlock());/
190+
level.updateNeighborsAt((BlockPos)object, blockState3.getBlock());
192191
}
193192
//对于移动方块列表中的所有方块
194193
for (n2 = pushList.size() - 1; n2 >= 0; --n2) {

Piston/PistonMovingBlockEntity.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ void finalTick() {
1111
if (level.getBlockState(worldPosition).is(Blocks.MOVING_PISTON)) {
1212
//是否为产生移动的活塞?是则变为空气,否则在形状更新后到位
1313
blockState = isSourcePiston ? Blocks.AIR.defaultBlockState() : Block.updateFromNeighbourShapes(movedState, level, worldPosition);
14-
//设置方块
14+
//设置方块 形状更新 寻路更新 方块更新
1515
level.setBlock(worldPosition, blockState, 3);
16-
//发出方块更新
16+
//自身受到方块更新
1717
level.neighborChanged(worldPosition, blockState.getBlock(), worldPosition);
1818
}
1919
}

Piston/PistonStructureResolver.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ boolean addBlockLine(blockPos, direction) {
8282
}
8383
n = 1;
8484
do {
85-
//如果该方块正向n格存在与方块移动列表中 n4位置
85+
//如果该方块正向n格已存在于方块移动列表中 n4位置
8686
if ((n4 = toPush.indexOf(blockPos3 = blockPos.relative(pushDirection, n))) > -1) {
8787
//n3、n4重排列表
8888
reorderListAtCollision(n3, n4);
@@ -118,6 +118,8 @@ boolean addBlockLine(blockPos, direction) {
118118

119119
//重排列表
120120
void reorderListAtCollision(n, n2) {
121+
//[0, n2], [size-n, n2] [n2, size-n]
122+
//交换后n个的位置与中间部分
121123
arrayList.addAll(toPush.subList(0, n2));
122124
arrayList2.addAll(toPush.subList(toPush.size() - n, toPush.size()));
123125
arrayList3.addAll(toPush.subList(n2, toPush.size() - n));

0 commit comments

Comments
 (0)