diff --git a/src/main/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlock.java b/src/main/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlock.java index 0c31d30..e71c703 100644 --- a/src/main/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlock.java +++ b/src/main/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlock.java @@ -27,9 +27,11 @@ public static Optional fromId(String id) { } public static Optional fromMap(Map map) { - return Optional - .ofNullable(Objects.toString(map.get("id"), null)) - .flatMap(CraftEngineCustomBlock::fromId); + String id = Objects.toString(map.get("id"), null); + if (id == null) { + return Optional.empty(); + } + return Optional.of(new CraftEngineCustomBlock(id)); } @Override diff --git a/src/test/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlockTest.java b/src/test/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlockTest.java index cd35d31..4383f96 100644 --- a/src/test/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlockTest.java +++ b/src/test/java/world/bentobox/aoneblock/oneblocks/customblock/CraftEngineCustomBlockTest.java @@ -1,5 +1,6 @@ package world.bentobox.aoneblock.oneblocks.customblock; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.LinkedHashMap; @@ -27,4 +28,23 @@ void fromMapReturnsEmptyWhenIdMissing() { assertTrue(result.isEmpty(), "Should return empty when 'id' is missing"); } + + /** + * {@code fromMap} must succeed even when CraftEngine has not yet loaded its + * block registry (i.e. without calling {@code CraftEngineHook.exists}). + * This prevents false "Bad custom block" errors during the initial server + * start-up phase that occurs before CraftEngine fires its reload event. + */ + @Test + void fromMapReturnsPresentWhenIdProvided() { + Map map = new LinkedHashMap<>(); + map.put("type", "craftengine"); + map.put("id", "oneblock:common_loot_block"); + map.put("probability", 300); + + var result = CraftEngineCustomBlock.fromMap(map); + + assertTrue(result.isPresent(), "Should return a block when 'id' is present, regardless of CraftEngine load state"); + assertInstanceOf(CraftEngineCustomBlock.class, result.get()); + } }