Skip to content

Commit 3ba25ba

Browse files
committed
Spawn Conditions WIP.
1 parent 9d14fce commit 3ba25ba

17 files changed

+3418
-3213
lines changed

Pack Spawning/README.md

+607-605
Large diffs are not rendered by default.

Piston/Observer-onRemove.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -1,11 +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-
}
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+
}
1111
}

Piston/PistonBaseBlock-triggerEvent.java

+202-202
Large diffs are not rendered by default.

Piston/PistonBaseBlock.java

+131-131
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,132 @@
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();
132132
}

0 commit comments

Comments
 (0)