Skip to content

Commit 394a76a

Browse files
committed
Add empty layer type and initial tests
(MINOR)
1 parent ec52588 commit 394a76a

File tree

4 files changed

+123
-0
lines changed

4 files changed

+123
-0
lines changed

forge-main/src/main/java/dev/compactmods/crafting/core/CCLayerTypes.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import dev.compactmods.crafting.CompactCrafting;
44
import dev.compactmods.crafting.api.recipe.layers.RecipeLayerType;
5+
import dev.compactmods.crafting.recipes.layers.EmptyRecipeLayer;
56
import dev.compactmods.crafting.recipes.layers.FilledComponentRecipeLayer;
67
import dev.compactmods.crafting.recipes.layers.HollowComponentRecipeLayer;
78
import dev.compactmods.crafting.recipes.layers.MixedComponentRecipeLayer;
@@ -36,6 +37,9 @@ public class CCLayerTypes {
3637
public static final RegistryObject<RecipeLayerType<MixedComponentRecipeLayer>> MIXED_LAYER_TYPE =
3738
RECIPE_LAYERS.register("mixed", SimpleLayerType.supplier(MixedComponentRecipeLayer.CODEC));
3839

40+
public static final RegistryObject<RecipeLayerType<EmptyRecipeLayer>> EMPTY_LAYER_TYPE =
41+
RECIPE_LAYERS.register("empty", SimpleLayerType.supplier(EmptyRecipeLayer.CODEC));
42+
3943
// endregion ======================================================================================================
4044

4145
public static void init(IEventBus eventBus) {
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package dev.compactmods.crafting.recipes.layers;
2+
3+
import com.mojang.serialization.Codec;
4+
import dev.compactmods.crafting.api.components.IRecipeComponents;
5+
import dev.compactmods.crafting.api.recipe.layers.IRecipeBlocks;
6+
import dev.compactmods.crafting.api.recipe.layers.IRecipeLayer;
7+
import dev.compactmods.crafting.api.recipe.layers.RecipeLayerType;
8+
import dev.compactmods.crafting.api.recipe.layers.dim.IDynamicSizedRecipeLayer;
9+
import dev.compactmods.crafting.core.CCLayerTypes;
10+
import net.minecraft.core.BlockPos;
11+
import net.minecraft.world.phys.AABB;
12+
13+
import java.util.Collections;
14+
import java.util.Map;
15+
import java.util.Optional;
16+
import java.util.Set;
17+
import java.util.stream.Stream;
18+
19+
public class EmptyRecipeLayer implements IRecipeLayer, IDynamicSizedRecipeLayer {
20+
21+
public static final Codec<EmptyRecipeLayer> CODEC = Codec.unit(EmptyRecipeLayer::new);
22+
23+
@Override
24+
public void setRecipeDimensions(AABB dimensions) {
25+
26+
}
27+
28+
@Override
29+
public Set<String> getComponents() {
30+
return Collections.emptySet();
31+
}
32+
33+
@Override
34+
public Map<String, Integer> getComponentTotals() {
35+
return Collections.emptyMap();
36+
}
37+
38+
@Override
39+
public Optional<String> getComponentForPosition(BlockPos pos) {
40+
return Optional.empty();
41+
}
42+
43+
@Override
44+
public Stream<BlockPos> getPositionsForComponent(String component) {
45+
return Stream.empty();
46+
}
47+
48+
@Override
49+
public RecipeLayerType<?> getType() {
50+
return CCLayerTypes.EMPTY_LAYER_TYPE.get();
51+
}
52+
53+
@Override
54+
public boolean matches(IRecipeComponents components, IRecipeBlocks blocks) {
55+
final boolean allIdentified = blocks.allIdentified();
56+
57+
// Check 1 - If anything was unidentified, ensure all the states are air
58+
if(!allIdentified) {
59+
final boolean anyNonAir = blocks.getUnmappedPositions()
60+
.map(blocks::getStateAtPosition)
61+
.anyMatch(state -> !state.isAir());
62+
63+
if(anyNonAir)
64+
return false;
65+
}
66+
67+
// Check 2 - Any of the matched components are non-air
68+
final boolean anyNonAirKnown = blocks.getKnownComponentTotals().keySet()
69+
.stream()
70+
.anyMatch(comp -> !components.isEmptyBlock(comp));
71+
72+
return !anyNonAirKnown;
73+
}
74+
}

forge-main/src/test/java/dev/compactmods/crafting/tests/GameTestTemplates.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@
33
public class GameTestTemplates {
44

55
public static final String EMPTY = "empty_1x1";
6+
public static final String MEDIUM_FIELD = "medium_field";
67
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package dev.compactmods.crafting.tests.recipes.layers;
2+
3+
import dev.compactmods.crafting.CompactCrafting;
4+
import dev.compactmods.crafting.api.field.MiniaturizationFieldSize;
5+
import dev.compactmods.crafting.recipes.layers.EmptyRecipeLayer;
6+
import dev.compactmods.crafting.tests.GameTestTemplates;
7+
import dev.compactmods.crafting.tests.testers.TestHelper;
8+
import net.minecraft.core.BlockPos;
9+
import net.minecraft.gametest.framework.GameTest;
10+
import net.minecraft.gametest.framework.GameTestHelper;
11+
import net.minecraft.world.level.block.Blocks;
12+
import net.minecraftforge.gametest.GameTestHolder;
13+
import net.minecraftforge.gametest.PrefixGameTestTemplate;
14+
15+
@PrefixGameTestTemplate(false)
16+
@GameTestHolder(CompactCrafting.MOD_ID)
17+
public class EmptyLayerTests {
18+
19+
@GameTest(template = GameTestTemplates.EMPTY)
20+
public static void CanCreateLayerInstance(final GameTestHelper test) {
21+
final var layer = new EmptyRecipeLayer();
22+
test.succeed();
23+
}
24+
25+
@GameTest(template = GameTestTemplates.MEDIUM_FIELD)
26+
public static void failsMatchIfAnyBlocksPresent(final GameTestHelper test) {
27+
final var testHelper = TestHelper.forTest(test)
28+
.forComponents()
29+
.forSingleLayer(MiniaturizationFieldSize.MEDIUM);
30+
31+
final var emptyLayer = new EmptyRecipeLayer();
32+
emptyLayer.setRecipeDimensions(MiniaturizationFieldSize.MEDIUM);
33+
34+
// Set a block in the field area
35+
test.setBlock(BlockPos.ZERO.above(), Blocks.GOLD_BLOCK);
36+
37+
boolean matched = emptyLayer.matches(testHelper.components(), testHelper.blocks());
38+
if(matched) {
39+
test.fail("Layer should not have matched.");
40+
} else {
41+
test.succeed();
42+
}
43+
}
44+
}

0 commit comments

Comments
 (0)