Skip to content

Commit 4f8f6b4

Browse files
committed
Add extra guards around field registration
1 parent 9b7b875 commit 4f8f6b4

File tree

2 files changed

+32
-8
lines changed

2 files changed

+32
-8
lines changed

src/main/java/dev/compactmods/crafting/field/ActiveWorldFields.java

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,10 @@
1111
import dev.compactmods.crafting.api.field.IMiniaturizationField;
1212
import dev.compactmods.crafting.network.FieldDeactivatedPacket;
1313
import dev.compactmods.crafting.network.NetworkHandler;
14+
import dev.compactmods.crafting.projector.FieldProjectorBlock;
1415
import dev.compactmods.crafting.projector.FieldProjectorTile;
16+
import dev.compactmods.crafting.projector.ProjectorHelper;
17+
import net.minecraft.block.BlockState;
1518
import net.minecraft.tileentity.TileEntity;
1619
import net.minecraft.util.math.BlockPos;
1720
import net.minecraft.util.math.ChunkPos;
@@ -72,12 +75,28 @@ public IMiniaturizationField registerField(IMiniaturizationField field) {
7275
laziness.put(center, lazy);
7376
field.setRef(lazy);
7477

78+
final Optional<BlockPos> anyMissing = ProjectorHelper
79+
.getMissingProjectors(level, field.getFieldSize(), field.getCenter())
80+
.findFirst();
81+
82+
if(anyMissing.isPresent()) {
83+
CompactCrafting.LOGGER.warn("Trying to register an active field with missing projector at: {}", anyMissing.get());
84+
return field;
85+
}
86+
7587
field.getProjectorPositions().forEach(pos -> {
76-
TileEntity tileAt = level.getBlockEntity(pos);
77-
if(tileAt instanceof FieldProjectorTile) {
78-
((FieldProjectorTile) tileAt).setFieldRef(lazy);
88+
BlockState stateAt = level.getBlockState(pos);
89+
if(!(stateAt.getBlock() instanceof FieldProjectorBlock))
90+
return;
91+
92+
if(stateAt.hasTileEntity()) {
93+
TileEntity tileAt = level.getBlockEntity(pos);
94+
if (tileAt instanceof FieldProjectorTile) {
95+
((FieldProjectorTile) tileAt).setFieldRef(lazy);
96+
}
7997
}
8098
});
99+
81100
lazy.addListener(lo -> {
82101
lo.ifPresent(this::unregisterField);
83102
});

src/main/java/dev/compactmods/crafting/projector/ProjectorHelper.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package dev.compactmods.crafting.projector;
22

3+
import javax.annotation.Nonnull;
34
import java.util.Optional;
45
import java.util.stream.Stream;
56
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
@@ -108,9 +109,7 @@ public static Stream<BlockPos> getMissingProjectors(IBlockReader level, BlockPos
108109
MiniaturizationFieldSize size = fieldSize.get();
109110
BlockPos center = size.getCenterFromProjector(initialProjector, projectorFacing);
110111

111-
return size.getProjectorLocations(center)
112-
// inverted filter - if the projector doesn't point to the center or isn't a projector, add to list
113-
.filter(proj -> !projectorFacesCenter(level, proj, center, size));
112+
return getMissingProjectors(level, size, center);
114113
} else {
115114
// No opposing projector to limit field size.
116115
// Scan for a cross-axis projector to try to limit.
@@ -123,15 +122,21 @@ public static Stream<BlockPos> getMissingProjectors(IBlockReader level, BlockPos
123122
MiniaturizationFieldSize matchedSize = firstMatchedSize.get();
124123

125124
BlockPos matchedCenter = matchedSize.getCenterFromProjector(initialProjector, projectorFacing);
126-
return matchedSize.getProjectorLocations(matchedCenter)
127-
.filter(proj -> !ProjectorHelper.projectorFacesCenter(level, proj, matchedCenter, matchedSize));
125+
return ProjectorHelper.getMissingProjectors(level, matchedSize, matchedCenter);
128126
} else {
129127
// Need an opposing projector set up to limit size
130128
return ProjectorHelper.getValidOppositePositions(initialProjector, projectorFacing);
131129
}
132130
}
133131
}
134132

133+
@Nonnull
134+
public static Stream<BlockPos> getMissingProjectors(IBlockReader level, MiniaturizationFieldSize size, BlockPos center) {
135+
return size.getProjectorLocations(center)
136+
// inverted filter - if the projector doesn't point to the center or isn't a projector, add to list
137+
.filter(proj -> !projectorFacesCenter(level, proj, center, size));
138+
}
139+
135140
public static boolean projectorFacesCenter(IBlockReader world, BlockPos proj, BlockPos actualCenter, MiniaturizationFieldSize size) {
136141
return FieldProjectorBlock.getDirection(world, proj)
137142
.map(projFacing -> size.getCenterFromProjector(proj, projFacing).equals(actualCenter))

0 commit comments

Comments
 (0)