Skip to content

Commit cef0fb4

Browse files
committed
Fix loading blockstates too early
1 parent 3a6eafa commit cef0fb4

File tree

8 files changed

+84
-24
lines changed

8 files changed

+84
-24
lines changed

src/main/java/aztech/modern_industrialization/blocks/structure/StructureMultiblockHatchBlockEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public HatchFlags getFlags() {
117117

118118
@Override
119119
public StructureMember getMemberOverride() {
120-
return new StructureMember(preview, members, flags);
120+
return new StructureMember(() -> preview, members, flags);
121121
}
122122

123123
@Override

src/main/java/aztech/modern_industrialization/blocks/structure/StructureMultiblockMemberBlockEntity.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ public List<StructureMemberTest> getMembers() {
8181

8282
@Override
8383
public StructureMember getMemberOverride() {
84-
return new StructureMember(preview, members, null);
84+
return new StructureMember(() -> preview, members, null);
8585
}
8686

8787
@Override

src/main/java/aztech/modern_industrialization/compat/kubejs/machine/ShapeTemplateHelper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@
3131
import net.minecraft.resources.ResourceLocation;
3232

3333
public interface ShapeTemplateHelper {
34+
default ShapeTemplate structureShape(ResourceLocation id) {
35+
return new ShapeTemplate.Structure(id).build();
36+
}
37+
3438
default ShapeTemplate.LayeredBuilder layeredShape(String hatchCasing, String[][] layers) {
3539
return new ShapeTemplate.LayeredBuilder(MachineCasings.get(hatchCasing), layers);
3640
}

src/main/java/aztech/modern_industrialization/machines/multiblocks/ShapeTemplate.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@
2424
package aztech.modern_industrialization.machines.multiblocks;
2525

2626
import aztech.modern_industrialization.machines.models.MachineCasing;
27+
import aztech.modern_industrialization.machines.multiblocks.structure.MIStructureTemplateManager;
2728
import java.util.HashMap;
2829
import java.util.HashSet;
2930
import java.util.Map;
3031
import java.util.Set;
3132
import net.minecraft.core.BlockPos;
33+
import net.minecraft.resources.ResourceLocation;
3234
import org.jetbrains.annotations.Nullable;
3335

3436
/**
@@ -200,4 +202,24 @@ public ShapeTemplate build() {
200202
return innerBuilder.build();
201203
}
202204
}
205+
206+
public static class Structure {
207+
private final ResourceLocation id;
208+
209+
public Structure(ResourceLocation id) {
210+
this.id = id;
211+
}
212+
213+
public ShapeTemplate build() {
214+
var tag = MIStructureTemplateManager.load(id);
215+
if (tag == null) {
216+
throw new IllegalStateException("Failed to load structure with id %s".formatted(id));
217+
}
218+
ShapeTemplate template = MIStructureTemplateManager.deserialize(tag);
219+
if (template == null) {
220+
throw new IllegalStateException("Failed to parse structure with id %s".formatted(id));
221+
}
222+
return template;
223+
}
224+
}
203225
}

src/main/java/aztech/modern_industrialization/machines/multiblocks/structure/MIStructureTemplateManager.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@
4646
import net.minecraft.FileUtil;
4747
import net.minecraft.core.BlockPos;
4848
import net.minecraft.core.Direction;
49-
import net.minecraft.core.registries.BuiltInRegistries;
5049
import net.minecraft.nbt.CompoundTag;
5150
import net.minecraft.nbt.ListTag;
5251
import net.minecraft.nbt.NbtAccounter;
@@ -158,7 +157,7 @@ public static FromWorldResult fromWorld(Level level, BlockPos controllerPos, Dir
158157

159158
blockTag.put("pos", NbtUtils.writeBlockPos(toTemplatePos(controllerPos, controllerDirection, pos)));
160159

161-
StructureMember member = new StructureMember(state);
160+
StructureMember member = new StructureMember(() -> state);
162161

163162
BlockEntity blockEntity = level.getBlockEntity(pos);
164163
if (blockEntity instanceof StructureMemberOverride override) {
@@ -207,8 +206,6 @@ public static FromWorldResult fromWorld(Level level, BlockPos controllerPos, Dir
207206
public static ShapeTemplate deserialize(CompoundTag tag) {
208207
Objects.requireNonNull(tag);
209208

210-
var blockRegistry = BuiltInRegistries.BLOCK.asLookup();
211-
212209
ResourceLocation hatchCasingId = ResourceLocation.tryParse(tag.getString("hatch_casing"));
213210
if (hatchCasingId == null || !MachineCasings.registeredCasings.containsKey(hatchCasingId)) {
214211
return null;

src/main/java/aztech/modern_industrialization/machines/multiblocks/structure/StructureMultiblockFormatters.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public static List<StructureMemberTest> members(String inputMembers) {
9898
} else {
9999
try {
100100
var blockResult = BlockStateParser.parseForBlock(registry, part, true);
101-
members.add(new StructureMemberTestState(blockResult.blockState()));
101+
members.add(new StructureMemberTestState(blockResult::blockState));
102102
} catch (CommandSyntaxException ignored) {
103103
return null;
104104
}

src/main/java/aztech/modern_industrialization/machines/multiblocks/structure/member/StructureMember.java

Lines changed: 37 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,49 @@
2626
import aztech.modern_industrialization.machines.multiblocks.HatchFlags;
2727
import aztech.modern_industrialization.machines.multiblocks.SimpleMember;
2828
import java.util.ArrayList;
29+
import java.util.Collections;
2930
import java.util.List;
3031
import java.util.Objects;
32+
import java.util.function.Supplier;
3133
import net.minecraft.core.registries.BuiltInRegistries;
3234
import net.minecraft.nbt.CompoundTag;
3335
import net.minecraft.nbt.ListTag;
3436
import net.minecraft.nbt.NbtUtils;
3537
import net.minecraft.nbt.Tag;
3638
import net.minecraft.world.level.block.state.BlockState;
3739

38-
public record StructureMember(BlockState preview, List<StructureMemberTest> tests, HatchFlags hatchFlags) implements SimpleMember {
39-
public StructureMember(BlockState state) {
40+
public final class StructureMember implements SimpleMember {
41+
private final Supplier<BlockState> previewSupplier;
42+
private final List<StructureMemberTest> tests;
43+
private final HatchFlags hatchFlags;
44+
45+
private BlockState preview;
46+
47+
public StructureMember(Supplier<BlockState> preview, List<StructureMemberTest> tests, HatchFlags hatchFlags) {
48+
this.previewSupplier = preview;
49+
this.tests = tests;
50+
this.hatchFlags = hatchFlags;
51+
}
52+
53+
public StructureMember(Supplier<BlockState> state) {
4054
this(state, List.of(new StructureMemberTestState(state)), null);
4155
}
4256

57+
public BlockState preview() {
58+
if (preview == null) {
59+
preview = previewSupplier.get();
60+
}
61+
return preview;
62+
}
63+
64+
public List<StructureMemberTest> tests() {
65+
return Collections.unmodifiableList(tests);
66+
}
67+
68+
public HatchFlags hatchFlags() {
69+
return hatchFlags;
70+
}
71+
4372
@Override
4473
public boolean matchesState(BlockState state) {
4574
for (StructureMemberTest test : tests) {
@@ -52,21 +81,21 @@ public boolean matchesState(BlockState state) {
5281

5382
@Override
5483
public BlockState getPreviewState() {
55-
return preview;
84+
return this.preview();
5685
}
5786

5887
@Override
5988
public boolean equals(Object o) {
6089
if (o instanceof StructureMember other) {
61-
return preview == other.preview() &&
62-
tests.containsAll(other.tests()) && other.tests().containsAll(tests) &&
63-
Objects.equals(hatchFlags, other.hatchFlags());
90+
return this.preview() == other.preview() &&
91+
tests.containsAll(other.tests) && other.tests.containsAll(tests) &&
92+
Objects.equals(hatchFlags, other.hatchFlags);
6493
}
6594
return false;
6695
}
6796

6897
public void save(CompoundTag tag) {
69-
tag.put("preview", NbtUtils.writeBlockState(preview));
98+
tag.put("preview", NbtUtils.writeBlockState(this.preview()));
7099

71100
ListTag testsTag = new ListTag();
72101
for (StructureMemberTest test : tests) {
@@ -89,9 +118,7 @@ public static StructureMember from(CompoundTag tag) {
89118
return null;
90119
}
91120

92-
var registry = BuiltInRegistries.BLOCK.asLookup();
93-
94-
BlockState preview = NbtUtils.readBlockState(registry, tag.getCompound("preview"));
121+
Supplier<BlockState> preview = () -> NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), tag.getCompound("preview"));
95122

96123
ListTag testsTag = tag.getList("tests", Tag.TAG_COMPOUND);
97124
List<StructureMemberTest> tests = new ArrayList<>();

src/main/java/aztech/modern_industrialization/machines/multiblocks/structure/member/StructureMemberTestState.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,47 +23,57 @@
2323
*/
2424
package aztech.modern_industrialization.machines.multiblocks.structure.member;
2525

26+
import java.util.function.Supplier;
2627
import net.minecraft.core.registries.BuiltInRegistries;
2728
import net.minecraft.nbt.CompoundTag;
2829
import net.minecraft.nbt.NbtUtils;
2930
import net.minecraft.world.level.block.state.BlockState;
3031

3132
public class StructureMemberTestState implements StructureMemberTest {
33+
private Supplier<BlockState> blockStateSupplier;
34+
3235
private BlockState blockState;
3336

34-
public StructureMemberTestState(BlockState blockState) {
35-
this.blockState = blockState;
37+
public StructureMemberTestState(Supplier<BlockState> blockState) {
38+
this.blockStateSupplier = blockState;
3639
}
3740

3841
public StructureMemberTestState() {
3942
this(null);
4043
}
4144

45+
private BlockState blockState() {
46+
if (blockState == null) {
47+
blockState = blockStateSupplier.get();
48+
}
49+
return blockState;
50+
}
51+
4252
@Override
4353
public String id() {
4454
return "state";
4555
}
4656

4757
@Override
4858
public boolean matchesState(BlockState state) {
49-
return blockState == state;
59+
return this.blockState() == state;
5060
}
5161

5262
@Override
5363
public void load(CompoundTag tag) {
54-
var registry = BuiltInRegistries.BLOCK.asLookup();
55-
blockState = NbtUtils.readBlockState(registry, tag.getCompound("state"));
64+
blockStateSupplier = () -> NbtUtils.readBlockState(BuiltInRegistries.BLOCK.asLookup(), tag.getCompound("state"));
65+
blockState = null;
5666
}
5767

5868
@Override
5969
public void save(CompoundTag tag) {
60-
tag.put("state", NbtUtils.writeBlockState(blockState));
70+
tag.put("state", NbtUtils.writeBlockState(this.blockState()));
6171
}
6272

6373
@Override
6474
public boolean equals(Object o) {
6575
if (o instanceof StructureMemberTestState other) {
66-
return blockState == other.blockState;
76+
return this.blockState() == other.blockState();
6777
}
6878
return false;
6979
}

0 commit comments

Comments
 (0)