From 3c3b756e873e9284384b5c7c962ffc60be88e0b5 Mon Sep 17 00:00:00 2001 From: Meatwo310 Date: Fri, 1 May 2026 23:11:57 +0900 Subject: [PATCH 1/5] refactor(common,1.20.1-common,1.20.1-forge,26.1-common,26.1-neo): move mining speed logic into common modules --- .../softdeepslate/SoftDeepslateConfig.java | 35 ++++++ .../softdeepslate/SoftDeepslateLogic.java | 112 ++++++++++++++++++ .../net/meatwo310/softdeepslate/ModMain.java | 110 ++++++----------- .../softdeepslate/config/ServerConfig.java | 43 ++++--- .../softdeepslate/SoftDeepslateConfig.java | 35 ++++++ .../softdeepslate/SoftDeepslateLogic.java | 112 ++++++++++++++++++ .../net/meatwo310/softdeepslate/ModMain.java | 97 ++++++--------- .../softdeepslate/config/ServerConfig.java | 43 ++++--- .../softdeepslate/SoftDeepslateSettings.java | 8 ++ 9 files changed, 411 insertions(+), 184 deletions(-) create mode 100644 1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java create mode 100644 1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java create mode 100644 26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java create mode 100644 26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java create mode 100644 common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java new file mode 100644 index 0000000..7c872a3 --- /dev/null +++ b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java @@ -0,0 +1,35 @@ +package net.meatwo310.softdeepslate; + +import net.minecraft.resources.ResourceLocation; + +import java.util.List; + +public final class SoftDeepslateConfig { + private SoftDeepslateConfig() {} + + public static final double DEFAULT_MINING_SPEED = 2.0D; + + public static final String MINING_SPEED_COMMENT = """ + Adjusts the mining speed for deepslate. + Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone."""; + + public static final String BLOCKS_COMMENT = """ + List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. + `/reload` to apply."""; + + public static final List DEFAULT_BLOCKS = List.of( + "minecraft:deepslate", + "#forge:cobblestone/deepslate", + "#forge:ores_in_ground/deepslate", + "#softdeepslate:building_blocks" + ); + + public static boolean isValidIdOrTag(Object entry) { + return entry instanceof String s && isValidIdOrTag(s); + } + + public static boolean isValidIdOrTag(String entry) { + String normalized = entry.startsWith("#") ? entry.substring(1) : entry; + return ResourceLocation.tryParse(normalized) != null; + } +} diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java new file mode 100644 index 0000000..a18e58c --- /dev/null +++ b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -0,0 +1,112 @@ +package net.meatwo310.softdeepslate; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +public final class SoftDeepslateLogic { + private final SoftDeepslateSettings settings; + private final BlockResolver blockResolver; + private volatile Set blocksCache; + + public SoftDeepslateLogic(SoftDeepslateSettings settings, BlockResolver blockResolver) { + this.settings = Objects.requireNonNull(settings); + this.blockResolver = Objects.requireNonNull(blockResolver); + } + + public boolean shouldMineFaster(BlockState state) { + return getBlocks().contains(state.getBlock()); + } + + public double miningSpeed() { + return settings.miningSpeed(); + } + + public void invalidateBlockCache() { + blocksCache = null; + } + + private Set getBlocks() { + Set cached = blocksCache; + if (cached == null) { + synchronized (this) { + cached = blocksCache; + if (cached == null) { + cached = buildCache(); + blocksCache = cached; + } + } + } + return cached; + } + + private Set buildCache() { + HashSet blocks = new HashSet<>(); + + for (String name : settings.blocks()) { + if (name.startsWith("#")) { + cacheBlockTag(blocks, name.substring(1)); + } else { + cacheBlock(blocks, name); + } + } + + if (blocks.isEmpty()) { + Constants.LOGGER.warn("No valid blocks found"); + } else { + Constants.LOGGER.info("Cached {} blocks", blocks.size()); + } + + return Set.copyOf(blocks); + } + + private void cacheBlock(Set blocks, String blockName) { + ResourceLocation id = ResourceLocation.tryParse(blockName); + if (id == null) { + return; + } + + blockResolver.resolveBlock(id).ifPresentOrElse( + block -> { + Constants.LOGGER.debug("Caching block: {}{}", blockName, blocks.contains(block) ? " (DUPLICATED)" : ""); + blocks.add(block); + }, + () -> Constants.LOGGER.warn("Unknown block in config: {}", blockName) + ); + } + + private void cacheBlockTag(Set blocks, String blockTagName) { + ResourceLocation id = ResourceLocation.tryParse(blockTagName); + if (id == null) { + return; + } + + blockResolver.resolveTag(id).ifPresentOrElse( + taggedBlocks -> { + for (Block block : taggedBlocks) { + Constants.LOGGER.debug( + "Caching block from tag #{}: {}{}", + blockTagName, + blockResolver.blockName(block), + blocks.contains(block) ? " (DUPLICATED)" : "" + ); + blocks.add(block); + } + }, + () -> Constants.LOGGER.warn("Unknown block tag in config: #{}", blockTagName) + ); + } + + public interface BlockResolver { + Optional resolveBlock(ResourceLocation id); + + Optional> resolveTag(ResourceLocation id); + + String blockName(Block block); + } +} diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java index fc5e9c2..a5bb8d4 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java @@ -4,8 +4,6 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.common.util.Lazy; import net.minecraftforge.event.TagsUpdatedEvent; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -16,103 +14,67 @@ import net.minecraftforge.registries.tags.ITag; import net.minecraftforge.registries.tags.ITagManager; -import java.util.HashSet; import java.util.Optional; -import java.util.Set; @Mod(Constants.MODID) public class ModMain { - private static Lazy> blocksCache = Lazy.of(ModMain::buildCache); + private static SoftDeepslateLogic logic; public ModMain(FMLJavaModLoadingContext ctx) { Constants.LOGGER.debug(Constants.INITIALIZING, ModUtils.loc("1.20.1-forge")); + logic = new SoftDeepslateLogic(ServerConfig.INSTANCE, new ForgeBlockResolver()); ctx.registerConfig(ModConfig.Type.SERVER, ServerConfig.SPEC); } - private static Set buildCache() { - HashSet blocks = new HashSet<>(); - - for (String name : ServerConfig.BLOCKS.get()) { - if (name.startsWith("#")) { - cacheBlockTag(blocks, name.substring(1)); - } else { - cacheBlock(blocks, name); + @Mod.EventBusSubscriber(modid = Constants.MODID) + public static class Subscriber { + @SubscribeEvent + public static void onPlayerBreakSpeed(PlayerEvent.BreakSpeed event) { + SoftDeepslateLogic logic = logic(); + if (logic.shouldMineFaster(event.getState())) { + event.setNewSpeed((float) (event.getNewSpeed() * logic.miningSpeed())); } } - if (blocks.isEmpty()) { - Constants.LOGGER.warn("No valid blocks found"); - } else { - Constants.LOGGER.info("Cached {} blocks", blocks.size()); + @SubscribeEvent + public static void onTagsUpdated(TagsUpdatedEvent event) { + logic().invalidateBlockCache(); } - - return Set.copyOf(blocks); } - private static void cacheBlock(Set blocks, String blockName) { - ResourceLocation id = ResourceLocation.tryParse(blockName); - if (id == null) { - return; + private static SoftDeepslateLogic logic() { + if (logic == null) { + throw new IllegalStateException("SoftDeepslateLogic has not been initialized"); } - - Optional.ofNullable(ForgeRegistries.BLOCKS.getValue(id)).ifPresentOrElse( - block -> { - Constants.LOGGER.debug("Caching block: {}{}", blockName, blocks.contains(block) ? " (DUPLICATED)" : ""); - blocks.add(block); - }, - () -> Constants.LOGGER.warn("Unknown block in config: {}", blockName) - ); + return logic; } - private static void cacheBlockTag(Set blocks, String blockTagName) { - ResourceLocation id = ResourceLocation.tryParse(blockTagName); - if (id == null) { - return; - } - - ITagManager tagManager = ForgeRegistries.BLOCKS.tags(); - if (tagManager == null) { - Constants.LOGGER.warn("Block tag manager is not available: #{}", blockTagName); - return; - } - - TagKey tagKey = tagManager.createTagKey(id); - if (!tagManager.isKnownTagName(tagKey)) { - Constants.LOGGER.warn("Unknown block tag in config: #{}", blockTagName); - return; + private class ForgeBlockResolver implements SoftDeepslateLogic.BlockResolver { + @Override + public Optional resolveBlock(ResourceLocation id) { + return Optional.ofNullable(ForgeRegistries.BLOCKS.getValue(id)); } - ITag tag = tagManager.getTag(tagKey); - for (Block block : tag) { - ResourceLocation blockId = ForgeRegistries.BLOCKS.getKey(block); - String blockName = blockId != null ? blockId.toString() : "?"; - - Constants.LOGGER.debug( - "Caching block from tag #{}: {}{}", - blockTagName, - blockName, - blocks.contains(block) ? " (DUPLICATED)" : "" - ); - blocks.add(block); - } - } - - public static boolean shouldMineFaster(BlockState state) { - return blocksCache.get().contains(state.getBlock()); - } + @Override + public Optional> resolveTag(ResourceLocation id) { + ITagManager tagManager = ForgeRegistries.BLOCKS.tags(); + if (tagManager == null) { + Constants.LOGGER.warn("Block tag manager is not available: #{}", id); + return Optional.empty(); + } - @Mod.EventBusSubscriber(modid = Constants.MODID) - public static class Subscriber { - @SubscribeEvent - public static void onPlayerBreakSpeed(PlayerEvent.BreakSpeed event) { - if (shouldMineFaster(event.getState())) { - event.setNewSpeed((float) (event.getNewSpeed() * ServerConfig.MINING_SPEED.get())); + TagKey tagKey = tagManager.createTagKey(id); + if (!tagManager.isKnownTagName(tagKey)) { + return Optional.empty(); } + + return Optional.of(tagManager.getTag(tagKey)); } - @SubscribeEvent - public static void onTagsUpdated(TagsUpdatedEvent event) { - blocksCache = Lazy.of(ModMain::buildCache); + @Override + public String blockName(Block block) { + ResourceLocation id = ForgeRegistries.BLOCKS.getKey(block); + return id != null ? id.toString() : "?"; } } } diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index 528a958..da9f735 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,38 +1,35 @@ package net.meatwo310.softdeepslate.config; -import net.minecraft.resources.ResourceLocation; +import net.meatwo310.softdeepslate.SoftDeepslateConfig; +import net.meatwo310.softdeepslate.SoftDeepslateSettings; import net.minecraftforge.common.ForgeConfigSpec; import java.util.List; -public class ServerConfig { +public class ServerConfig implements SoftDeepslateSettings { + public static final ServerConfig INSTANCE = new ServerConfig(); + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); public static ForgeConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(""" - Adjusts the mining speed for deepslate. - Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone.""") - .defineInRange("miningSpeed", 2.0D, 0.0D, Float.MAX_VALUE); + .comment(SoftDeepslateConfig.MINING_SPEED_COMMENT) + .defineInRange("miningSpeed", SoftDeepslateConfig.DEFAULT_MINING_SPEED, 0.0D, Float.MAX_VALUE); public static ForgeConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(""" - List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. - `/reload` to apply.""") - .defineList("blocks", List.of( - "minecraft:deepslate", - "#forge:cobblestone/deepslate", - "#forge:ores_in_ground/deepslate", - "#softdeepslate:building_blocks" - ), ServerConfig::isValidIdOrTag); - - private static boolean isValidIdOrTag(Object entry) { - return entry instanceof String s && isValidIdOrTag(s); - } + .comment(SoftDeepslateConfig.BLOCKS_COMMENT) + .defineList("blocks", SoftDeepslateConfig.DEFAULT_BLOCKS, SoftDeepslateConfig::isValidIdOrTag); + + public static final ForgeConfigSpec SPEC = BUILDER.build(); - private static boolean isValidIdOrTag(String entry) { - String normalized = entry.startsWith("#") ? entry.substring(1) : entry; - return ResourceLocation.tryParse(normalized) != null; + private ServerConfig() {} + + @Override + public double miningSpeed() { + return MINING_SPEED.get(); } - public static final ForgeConfigSpec SPEC = BUILDER.build(); + @Override + public List blocks() { + return BLOCKS.get(); + } } diff --git a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java new file mode 100644 index 0000000..16d1d0b --- /dev/null +++ b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java @@ -0,0 +1,35 @@ +package net.meatwo310.softdeepslate; + +import net.minecraft.resources.Identifier; + +import java.util.List; + +public final class SoftDeepslateConfig { + private SoftDeepslateConfig() {} + + public static final double DEFAULT_MINING_SPEED = 2.0D; + + public static final String MINING_SPEED_COMMENT = """ + Adjusts the mining speed for deepslate. + Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone."""; + + public static final String BLOCKS_COMMENT = """ + List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. + `/reload` to apply."""; + + public static final List DEFAULT_BLOCKS = List.of( + "minecraft:deepslate", + "#c:cobblestones/deepslate", + "#c:ores_in_ground/deepslate", + "#softdeepslate:building_blocks" + ); + + public static boolean isValidIdOrTag(Object entry) { + return entry instanceof String s && isValidIdOrTag(s); + } + + public static boolean isValidIdOrTag(String entry) { + String normalized = entry.startsWith("#") ? entry.substring(1) : entry; + return Identifier.tryParse(normalized) != null; + } +} diff --git a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java new file mode 100644 index 0000000..a5e9b47 --- /dev/null +++ b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -0,0 +1,112 @@ +package net.meatwo310.softdeepslate; + +import net.minecraft.resources.Identifier; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.HashSet; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; + +public final class SoftDeepslateLogic { + private final SoftDeepslateSettings settings; + private final BlockResolver blockResolver; + private volatile Set blocksCache; + + public SoftDeepslateLogic(SoftDeepslateSettings settings, BlockResolver blockResolver) { + this.settings = Objects.requireNonNull(settings); + this.blockResolver = Objects.requireNonNull(blockResolver); + } + + public boolean shouldMineFaster(BlockState state) { + return getBlocks().contains(state.getBlock()); + } + + public double miningSpeed() { + return settings.miningSpeed(); + } + + public void invalidateBlockCache() { + blocksCache = null; + } + + private Set getBlocks() { + Set cached = blocksCache; + if (cached == null) { + synchronized (this) { + cached = blocksCache; + if (cached == null) { + cached = buildCache(); + blocksCache = cached; + } + } + } + return cached; + } + + private Set buildCache() { + HashSet blocks = new HashSet<>(); + + for (String name : settings.blocks()) { + if (name.startsWith("#")) { + cacheBlockTag(blocks, name.substring(1)); + } else { + cacheBlock(blocks, name); + } + } + + if (blocks.isEmpty()) { + Constants.LOGGER.warn("No valid blocks found"); + } else { + Constants.LOGGER.info("Cached {} blocks", blocks.size()); + } + + return Set.copyOf(blocks); + } + + private void cacheBlock(Set blocks, String blockName) { + Identifier id = Identifier.tryParse(blockName); + if (id == null) { + return; + } + + blockResolver.resolveBlock(id).ifPresentOrElse( + block -> { + Constants.LOGGER.debug("Caching block: {}{}", blockName, blocks.contains(block) ? " (DUPLICATED)" : ""); + blocks.add(block); + }, + () -> Constants.LOGGER.warn("Unknown block in config: {}", blockName) + ); + } + + private void cacheBlockTag(Set blocks, String blockTagName) { + Identifier id = Identifier.tryParse(blockTagName); + if (id == null) { + return; + } + + blockResolver.resolveTag(id).ifPresentOrElse( + taggedBlocks -> { + for (Block block : taggedBlocks) { + Constants.LOGGER.debug( + "Caching block from tag #{}: {}{}", + blockTagName, + blockResolver.blockName(block), + blocks.contains(block) ? " (DUPLICATED)" : "" + ); + blocks.add(block); + } + }, + () -> Constants.LOGGER.warn("Unknown block tag in config: #{}", blockTagName) + ); + } + + public interface BlockResolver { + Optional resolveBlock(Identifier id); + + Optional> resolveTag(Identifier id); + + String blockName(Block block); + } +} diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java index b7c0bc8..365d620 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java @@ -7,101 +7,70 @@ import net.minecraft.resources.ResourceKey; import net.minecraft.tags.TagKey; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.fml.ModContainer; import net.neoforged.fml.common.EventBusSubscriber; import net.neoforged.fml.common.Mod; import net.neoforged.fml.config.ModConfig; -import net.neoforged.neoforge.common.util.Lazy; import net.neoforged.neoforge.event.TagsUpdatedEvent; import net.neoforged.neoforge.event.entity.player.PlayerEvent; -import java.util.HashSet; -import java.util.Set; +import java.util.Optional; @Mod(Constants.MODID) public class ModMain { - private static final Lazy> blocksCache = Lazy.of(ModMain::buildCache); + private static SoftDeepslateLogic logic; public ModMain(IEventBus modEventBus, ModContainer modContainer) { Constants.LOGGER.debug(Constants.INITIALIZING, ModUtils.id("26.1-neo")); + logic = new SoftDeepslateLogic(ServerConfig.INSTANCE, new NeoBlockResolver()); modContainer.registerConfig(ModConfig.Type.SERVER, ServerConfig.SPEC); } - private static Set buildCache() { - HashSet blocks = new HashSet<>(); - - for (String name : ServerConfig.BLOCKS.get()) { - if (name.startsWith("#")) { - cacheBlockTag(blocks, name.substring(1)); - } else { - cacheBlock(blocks, name); + @EventBusSubscriber(modid = Constants.MODID) + public static class Subscriber { + @SubscribeEvent + public static void onPlayerBreakSpeed(PlayerEvent.BreakSpeed event) { + SoftDeepslateLogic logic = logic(); + if (logic.shouldMineFaster(event.getState())) { + event.setNewSpeed((float) (event.getNewSpeed() * logic.miningSpeed())); } } - if (blocks.isEmpty()) { - Constants.LOGGER.warn("No valid blocks found"); - } else { - Constants.LOGGER.info("Cached {} blocks", blocks.size()); + @SubscribeEvent + public static void onTagsUpdated(TagsUpdatedEvent event) { + logic().invalidateBlockCache(); } - - return Set.copyOf(blocks); } - private static void cacheBlock(Set blocks, String blockName) { - Identifier id = Identifier.tryParse(blockName); - if (id == null) { - return; + private static SoftDeepslateLogic logic() { + if (logic == null) { + throw new IllegalStateException("SoftDeepslateLogic has not been initialized"); } - - BuiltInRegistries.BLOCK.getOptional(id).ifPresentOrElse( - block -> { - Constants.LOGGER.debug("Caching block: {}{}", blockName, blocks.contains(block) ? " (DUPLICATED)" : ""); - blocks.add(block); - }, - () -> Constants.LOGGER.warn("Unknown block in config: {}", blockName) - ); + return logic; } - private static void cacheBlockTag(Set blocks, String blockTagName) { - Identifier id = Identifier.tryParse(blockTagName); - if (id == null) { - return; + private class NeoBlockResolver implements SoftDeepslateLogic.BlockResolver { + @Override + public Optional resolveBlock(Identifier id) { + return BuiltInRegistries.BLOCK.getOptional(id); } - TagKey tagKey = TagKey.create(Registries.BLOCK, id); - BuiltInRegistries.BLOCK.get(tagKey).ifPresentOrElse( - holders -> holders.forEach(holder -> { - Block block = holder.value(); - String blockName = holder.unwrapKey() - .map(ResourceKey::identifier) - .map(Identifier::toString) - .orElse("?"); - Constants.LOGGER.debug("Caching block from tag #{}: {}{}", blockTagName, blockName, blocks.contains(block) ? " (DUPLICATED)" : ""); - blocks.add(block); - }), - () -> Constants.LOGGER.warn("Unknown block tag in config: #{}", blockTagName) - ); - } - - public static boolean shouldMineFaster(BlockState state) { - return blocksCache.get().contains(state.getBlock()); - } - - @EventBusSubscriber(modid = Constants.MODID) - public static class Subscriber { - @SubscribeEvent - public static void onPlayerBreakSpeed(PlayerEvent.BreakSpeed event) { - if (shouldMineFaster(event.getState())) { - event.setNewSpeed((float) (event.getNewSpeed() * ServerConfig.MINING_SPEED.get())); - } + @Override + public Optional> resolveTag(Identifier id) { + TagKey tagKey = TagKey.create(Registries.BLOCK, id); + return BuiltInRegistries.BLOCK.get(tagKey).map(holders -> holders.stream() + .map(holder -> holder.value()) + .toList()); } - @SubscribeEvent - public static void onTagsUpdated(TagsUpdatedEvent event) { - blocksCache.invalidate(); + @Override + public String blockName(Block block) { + return BuiltInRegistries.BLOCK.getResourceKey(block) + .map(ResourceKey::identifier) + .map(Identifier::toString) + .orElse("?"); } } } diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index 36d522c..393e878 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,38 +1,35 @@ package net.meatwo310.softdeepslate.config; -import net.minecraft.resources.Identifier; +import net.meatwo310.softdeepslate.SoftDeepslateConfig; +import net.meatwo310.softdeepslate.SoftDeepslateSettings; import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; -public class ServerConfig { +public class ServerConfig implements SoftDeepslateSettings { + public static final ServerConfig INSTANCE = new ServerConfig(); + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); public static ModConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(""" - Adjusts the mining speed for deepslate. - Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone.""") - .defineInRange("miningSpeed", 2.0D, 0.0D, Float.MAX_VALUE); + .comment(SoftDeepslateConfig.MINING_SPEED_COMMENT) + .defineInRange("miningSpeed", SoftDeepslateConfig.DEFAULT_MINING_SPEED, 0.0D, Float.MAX_VALUE); public static ModConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(""" - List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. - `/reload` to apply.""") - .defineList("blocks", List.of( - "minecraft:deepslate", - "#c:cobblestones/deepslate", - "#c:ores_in_ground/deepslate", - "#softdeepslate:building_blocks" - ), () -> "", ServerConfig::isValidIdOrTag); - - private static boolean isValidIdOrTag(Object entry) { - return entry instanceof String s && isValidIdOrTag(s); - } + .comment(SoftDeepslateConfig.BLOCKS_COMMENT) + .defineList("blocks", SoftDeepslateConfig.DEFAULT_BLOCKS, () -> "", SoftDeepslateConfig::isValidIdOrTag); + + public static final ModConfigSpec SPEC = BUILDER.build(); - private static boolean isValidIdOrTag(String entry) { - String normalized = entry.startsWith("#") ? entry.substring(1) : entry; - return Identifier.tryParse(normalized) != null; + private ServerConfig() {} + + @Override + public double miningSpeed() { + return MINING_SPEED.get(); } - public static final ModConfigSpec SPEC = BUILDER.build(); + @Override + public List blocks() { + return BLOCKS.get(); + } } diff --git a/common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java b/common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java new file mode 100644 index 0000000..d911ff5 --- /dev/null +++ b/common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java @@ -0,0 +1,8 @@ +package net.meatwo310.softdeepslate; + +import java.util.List; + +public interface SoftDeepslateSettings { + double miningSpeed(); + List blocks(); +} From aadfc27d8409184827b2df6b137d72150013fd07 Mon Sep 17 00:00:00 2001 From: Meatwo310 Date: Fri, 1 May 2026 23:12:14 +0900 Subject: [PATCH 2/5] refactor(common,1.20.1-common,1.20.1-forge,26.1-common,26.1-neo): introduce shared server config contract --- .../softdeepslate/SoftDeepslateConfig.java | 35 ------------------- .../softdeepslate/SoftDeepslateLogic.java | 10 +++--- .../net/meatwo310/softdeepslate/ModMain.java | 2 +- .../softdeepslate/config/ServerConfig.java | 32 +++++++++++++---- .../softdeepslate/SoftDeepslateConfig.java | 35 ------------------- .../softdeepslate/SoftDeepslateLogic.java | 10 +++--- .../net/meatwo310/softdeepslate/ModMain.java | 2 +- .../softdeepslate/config/ServerConfig.java | 27 ++++++++++---- ...ateSettings.java => IModServerConfig.java} | 3 +- .../config/ConfigDoubleEntry.java | 9 +++++ .../config/ConfigStringListEntry.java | 13 +++++++ .../config/IModServerConfigValidator.java | 14 ++++++++ .../config/ModServerConfigEntries.java | 30 ++++++++++++++++ 13 files changed, 125 insertions(+), 97 deletions(-) delete mode 100644 1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java delete mode 100644 26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java rename common/src/main/java/net/meatwo310/softdeepslate/{SoftDeepslateSettings.java => IModServerConfig.java} (75%) create mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java create mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java create mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java create mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java deleted file mode 100644 index 7c872a3..0000000 --- a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.meatwo310.softdeepslate; - -import net.minecraft.resources.ResourceLocation; - -import java.util.List; - -public final class SoftDeepslateConfig { - private SoftDeepslateConfig() {} - - public static final double DEFAULT_MINING_SPEED = 2.0D; - - public static final String MINING_SPEED_COMMENT = """ - Adjusts the mining speed for deepslate. - Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone."""; - - public static final String BLOCKS_COMMENT = """ - List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. - `/reload` to apply."""; - - public static final List DEFAULT_BLOCKS = List.of( - "minecraft:deepslate", - "#forge:cobblestone/deepslate", - "#forge:ores_in_ground/deepslate", - "#softdeepslate:building_blocks" - ); - - public static boolean isValidIdOrTag(Object entry) { - return entry instanceof String s && isValidIdOrTag(s); - } - - public static boolean isValidIdOrTag(String entry) { - String normalized = entry.startsWith("#") ? entry.substring(1) : entry; - return ResourceLocation.tryParse(normalized) != null; - } -} diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java index a18e58c..34dd969 100644 --- a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java +++ b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -10,12 +10,12 @@ import java.util.Set; public final class SoftDeepslateLogic { - private final SoftDeepslateSettings settings; + private final IModServerConfig config; private final BlockResolver blockResolver; private volatile Set blocksCache; - public SoftDeepslateLogic(SoftDeepslateSettings settings, BlockResolver blockResolver) { - this.settings = Objects.requireNonNull(settings); + public SoftDeepslateLogic(IModServerConfig config, BlockResolver blockResolver) { + this.config = Objects.requireNonNull(config); this.blockResolver = Objects.requireNonNull(blockResolver); } @@ -24,7 +24,7 @@ public boolean shouldMineFaster(BlockState state) { } public double miningSpeed() { - return settings.miningSpeed(); + return config.miningSpeed(); } public void invalidateBlockCache() { @@ -48,7 +48,7 @@ private Set getBlocks() { private Set buildCache() { HashSet blocks = new HashSet<>(); - for (String name : settings.blocks()) { + for (String name : config.blocks()) { if (name.startsWith("#")) { cacheBlockTag(blocks, name.substring(1)); } else { diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java index a5bb8d4..aad2b9e 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java @@ -49,7 +49,7 @@ private static SoftDeepslateLogic logic() { return logic; } - private class ForgeBlockResolver implements SoftDeepslateLogic.BlockResolver { + private static class ForgeBlockResolver implements SoftDeepslateLogic.BlockResolver { @Override public Optional resolveBlock(ResourceLocation id) { return Optional.ofNullable(ForgeRegistries.BLOCKS.getValue(id)); diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index da9f735..cefcbf3 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,23 +1,36 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.softdeepslate.SoftDeepslateConfig; -import net.meatwo310.softdeepslate.SoftDeepslateSettings; +import net.meatwo310.softdeepslate.IModServerConfig; +import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.ForgeConfigSpec; import java.util.List; -public class ServerConfig implements SoftDeepslateSettings { +public class ServerConfig implements IModServerConfig, IModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); + private static final ConfigDoubleEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; + private static final ConfigStringListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS.withDefaultValue(List.of( + "minecraft:deepslate", + "#forge:cobblestone/deepslate", + "#forge:ores_in_ground/deepslate", + "#softdeepslate:building_blocks" + )); + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); public static ForgeConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(SoftDeepslateConfig.MINING_SPEED_COMMENT) - .defineInRange("miningSpeed", SoftDeepslateConfig.DEFAULT_MINING_SPEED, 0.0D, Float.MAX_VALUE); + .comment(MINING_SPEED_ENTRY.comment()) + .defineInRange( + MINING_SPEED_ENTRY.key(), + MINING_SPEED_ENTRY.defaultValue(), + MINING_SPEED_ENTRY.min(), + MINING_SPEED_ENTRY.max() + ); public static ForgeConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(SoftDeepslateConfig.BLOCKS_COMMENT) - .defineList("blocks", SoftDeepslateConfig.DEFAULT_BLOCKS, SoftDeepslateConfig::isValidIdOrTag); + .comment(BLOCKS_ENTRY.comment()) + .defineList(BLOCKS_ENTRY.key(), BLOCKS_ENTRY.defaultValue(), INSTANCE::isValidIdOrTag); public static final ForgeConfigSpec SPEC = BUILDER.build(); @@ -32,4 +45,9 @@ public double miningSpeed() { public List blocks() { return BLOCKS.get(); } + + @Override + public boolean isValidId(String entry) { + return ResourceLocation.tryParse(entry) != null; + } } diff --git a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java deleted file mode 100644 index 16d1d0b..0000000 --- a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateConfig.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.meatwo310.softdeepslate; - -import net.minecraft.resources.Identifier; - -import java.util.List; - -public final class SoftDeepslateConfig { - private SoftDeepslateConfig() {} - - public static final double DEFAULT_MINING_SPEED = 2.0D; - - public static final String MINING_SPEED_COMMENT = """ - Adjusts the mining speed for deepslate. - Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone."""; - - public static final String BLOCKS_COMMENT = """ - List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. - `/reload` to apply."""; - - public static final List DEFAULT_BLOCKS = List.of( - "minecraft:deepslate", - "#c:cobblestones/deepslate", - "#c:ores_in_ground/deepslate", - "#softdeepslate:building_blocks" - ); - - public static boolean isValidIdOrTag(Object entry) { - return entry instanceof String s && isValidIdOrTag(s); - } - - public static boolean isValidIdOrTag(String entry) { - String normalized = entry.startsWith("#") ? entry.substring(1) : entry; - return Identifier.tryParse(normalized) != null; - } -} diff --git a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java index a5e9b47..c00148f 100644 --- a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java +++ b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -10,12 +10,12 @@ import java.util.Set; public final class SoftDeepslateLogic { - private final SoftDeepslateSettings settings; + private final IModServerConfig config; private final BlockResolver blockResolver; private volatile Set blocksCache; - public SoftDeepslateLogic(SoftDeepslateSettings settings, BlockResolver blockResolver) { - this.settings = Objects.requireNonNull(settings); + public SoftDeepslateLogic(IModServerConfig config, BlockResolver blockResolver) { + this.config = Objects.requireNonNull(config); this.blockResolver = Objects.requireNonNull(blockResolver); } @@ -24,7 +24,7 @@ public boolean shouldMineFaster(BlockState state) { } public double miningSpeed() { - return settings.miningSpeed(); + return config.miningSpeed(); } public void invalidateBlockCache() { @@ -48,7 +48,7 @@ private Set getBlocks() { private Set buildCache() { HashSet blocks = new HashSet<>(); - for (String name : settings.blocks()) { + for (String name : config.blocks()) { if (name.startsWith("#")) { cacheBlockTag(blocks, name.substring(1)); } else { diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java index 365d620..3cdf581 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/ModMain.java @@ -51,7 +51,7 @@ private static SoftDeepslateLogic logic() { return logic; } - private class NeoBlockResolver implements SoftDeepslateLogic.BlockResolver { + private static class NeoBlockResolver implements SoftDeepslateLogic.BlockResolver { @Override public Optional resolveBlock(Identifier id) { return BuiltInRegistries.BLOCK.getOptional(id); diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index 393e878..2f51b4b 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,23 +1,31 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.softdeepslate.SoftDeepslateConfig; -import net.meatwo310.softdeepslate.SoftDeepslateSettings; +import net.meatwo310.softdeepslate.IModServerConfig; +import net.minecraft.resources.Identifier; import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; -public class ServerConfig implements SoftDeepslateSettings { +public class ServerConfig implements IModServerConfig, IModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); + private static final ConfigDoubleEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; + private static final ConfigStringListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS; + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); public static ModConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(SoftDeepslateConfig.MINING_SPEED_COMMENT) - .defineInRange("miningSpeed", SoftDeepslateConfig.DEFAULT_MINING_SPEED, 0.0D, Float.MAX_VALUE); + .comment(MINING_SPEED_ENTRY.comment()) + .defineInRange( + MINING_SPEED_ENTRY.key(), + MINING_SPEED_ENTRY.defaultValue(), + MINING_SPEED_ENTRY.min(), + MINING_SPEED_ENTRY.max() + ); public static ModConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(SoftDeepslateConfig.BLOCKS_COMMENT) - .defineList("blocks", SoftDeepslateConfig.DEFAULT_BLOCKS, () -> "", SoftDeepslateConfig::isValidIdOrTag); + .comment(BLOCKS_ENTRY.comment()) + .defineList(BLOCKS_ENTRY.key(), BLOCKS_ENTRY.defaultValue(), () -> "", INSTANCE::isValidIdOrTag); public static final ModConfigSpec SPEC = BUILDER.build(); @@ -32,4 +40,9 @@ public double miningSpeed() { public List blocks() { return BLOCKS.get(); } + + @Override + public boolean isValidId(String entry) { + return Identifier.tryParse(entry) != null; + } } diff --git a/common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java b/common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java similarity index 75% rename from common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java rename to common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java index d911ff5..c9ddb0e 100644 --- a/common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateSettings.java +++ b/common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java @@ -2,7 +2,8 @@ import java.util.List; -public interface SoftDeepslateSettings { +public interface IModServerConfig { double miningSpeed(); + List blocks(); } diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java new file mode 100644 index 0000000..5375be1 --- /dev/null +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java @@ -0,0 +1,9 @@ +package net.meatwo310.softdeepslate.config; + +public record ConfigDoubleEntry( + String key, + double defaultValue, + double min, + double max, + String comment +) {} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java new file mode 100644 index 0000000..dd80a58 --- /dev/null +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java @@ -0,0 +1,13 @@ +package net.meatwo310.softdeepslate.config; + +import java.util.List; + +public record ConfigStringListEntry( + String key, + List defaultValue, + String comment +) { + public ConfigStringListEntry withDefaultValue(List defaultValue) { + return new ConfigStringListEntry(key, defaultValue, comment); + } +} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java b/common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java new file mode 100644 index 0000000..ac72751 --- /dev/null +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java @@ -0,0 +1,14 @@ +package net.meatwo310.softdeepslate.config; + +public interface IModServerConfigValidator { + boolean isValidId(String entry); + + default boolean isValidIdOrTag(Object entry) { + return entry instanceof String s && isValidIdOrTag(s); + } + + default boolean isValidIdOrTag(String entry) { + String normalized = entry.startsWith("#") ? entry.substring(1) : entry; + return isValidId(normalized); + } +} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java new file mode 100644 index 0000000..6cbb5a5 --- /dev/null +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java @@ -0,0 +1,30 @@ +package net.meatwo310.softdeepslate.config; + +import java.util.List; + +public final class ModServerConfigEntries { + public static final ConfigDoubleEntry MINING_SPEED = new ConfigDoubleEntry( + "miningSpeed", + 2.0D, + 0.0D, + Float.MAX_VALUE, + """ + Adjusts the mining speed for deepslate. + Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone.""" + ); + + public static final ConfigStringListEntry BLOCKS = new ConfigStringListEntry( + "blocks", + List.of( + "minecraft:deepslate", + "#c:cobblestones/deepslate", + "#c:ores_in_ground/deepslate", + "#softdeepslate:building_blocks" + ), + """ + List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. + `/reload` to apply.""" + ); + + private ModServerConfigEntries() {} +} From 63e1cdf1c3e8fa0ef04ebfdb88c9e3bb9bad74a0 Mon Sep 17 00:00:00 2001 From: Meatwo310 Date: Fri, 1 May 2026 23:12:28 +0900 Subject: [PATCH 3/5] refactor(common,1.20.1-common,1.20.1-forge,26.1-common,26.1-neo): add generic config entry models --- .../softdeepslate/SoftDeepslateLogic.java | 5 +++-- .../softdeepslate/config/ServerConfig.java | 9 +++++---- .../softdeepslate/SoftDeepslateLogic.java | 5 +++-- .../softdeepslate/config/ServerConfig.java | 16 +++++++++++----- .../net/meatwo310/mdk/config/ConfigEntry.java | 7 +++++++ .../meatwo310/mdk/config/ConfigEnumEntry.java | 7 +++++++ .../meatwo310/mdk/config/ConfigInListEntry.java | 10 ++++++++++ .../meatwo310/mdk/config/ConfigListEntry.java | 14 ++++++++++++++ .../meatwo310/mdk/config/ConfigRangeEntry.java | 9 +++++++++ .../meatwo310/mdk/config/ConfigSimpleEntry.java | 7 +++++++ .../mdk/config/ConfigValidatedEntry.java | 10 ++++++++++ .../softdeepslate/config/ConfigDoubleEntry.java | 9 --------- .../config/ConfigStringListEntry.java | 13 ------------- .../ModServerConfig.java} | 5 ++--- .../config/ModServerConfigEntries.java | 10 +++++++--- ...idator.java => ModServerConfigValidator.java} | 2 +- 16 files changed, 96 insertions(+), 42 deletions(-) create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigEnumEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigInListEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigRangeEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigSimpleEntry.java create mode 100644 common/src/main/java/net/meatwo310/mdk/config/ConfigValidatedEntry.java delete mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java delete mode 100644 common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java rename common/src/main/java/net/meatwo310/softdeepslate/{IModServerConfig.java => config/ModServerConfig.java} (53%) rename common/src/main/java/net/meatwo310/softdeepslate/config/{IModServerConfigValidator.java => ModServerConfigValidator.java} (89%) diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java index 34dd969..019bad3 100644 --- a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java +++ b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -1,5 +1,6 @@ package net.meatwo310.softdeepslate; +import net.meatwo310.softdeepslate.config.ModServerConfig; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -10,11 +11,11 @@ import java.util.Set; public final class SoftDeepslateLogic { - private final IModServerConfig config; + private final ModServerConfig config; private final BlockResolver blockResolver; private volatile Set blocksCache; - public SoftDeepslateLogic(IModServerConfig config, BlockResolver blockResolver) { + public SoftDeepslateLogic(ModServerConfig config, BlockResolver blockResolver) { this.config = Objects.requireNonNull(config); this.blockResolver = Objects.requireNonNull(blockResolver); } diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index cefcbf3..a865950 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,16 +1,17 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.softdeepslate.IModServerConfig; +import net.meatwo310.mdk.config.ConfigListEntry; +import net.meatwo310.mdk.config.ConfigRangeEntry; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.ForgeConfigSpec; import java.util.List; -public class ServerConfig implements IModServerConfig, IModServerConfigValidator { +public class ServerConfig implements ModServerConfig, ModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); - private static final ConfigDoubleEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; - private static final ConfigStringListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS.withDefaultValue(List.of( + private static final ConfigRangeEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; + private static final ConfigListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS.withDefaultValue(List.of( "minecraft:deepslate", "#forge:cobblestone/deepslate", "#forge:ores_in_ground/deepslate", diff --git a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java index c00148f..2a3336f 100644 --- a/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java +++ b/26.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -1,5 +1,6 @@ package net.meatwo310.softdeepslate; +import net.meatwo310.softdeepslate.config.ModServerConfig; import net.minecraft.resources.Identifier; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; @@ -10,11 +11,11 @@ import java.util.Set; public final class SoftDeepslateLogic { - private final IModServerConfig config; + private final ModServerConfig config; private final BlockResolver blockResolver; private volatile Set blocksCache; - public SoftDeepslateLogic(IModServerConfig config, BlockResolver blockResolver) { + public SoftDeepslateLogic(ModServerConfig config, BlockResolver blockResolver) { this.config = Objects.requireNonNull(config); this.blockResolver = Objects.requireNonNull(blockResolver); } diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index 2f51b4b..05fc8a5 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,16 +1,17 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.softdeepslate.IModServerConfig; +import net.meatwo310.mdk.config.ConfigListEntry; +import net.meatwo310.mdk.config.ConfigRangeEntry; import net.minecraft.resources.Identifier; import net.neoforged.neoforge.common.ModConfigSpec; import java.util.List; -public class ServerConfig implements IModServerConfig, IModServerConfigValidator { +public class ServerConfig implements ModServerConfig, ModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); - private static final ConfigDoubleEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; - private static final ConfigStringListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS; + private static final ConfigRangeEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; + private static final ConfigListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS; private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); @@ -25,7 +26,12 @@ public class ServerConfig implements IModServerConfig, IModServerConfigValidator public static ModConfigSpec.ConfigValue> BLOCKS = BUILDER .comment(BLOCKS_ENTRY.comment()) - .defineList(BLOCKS_ENTRY.key(), BLOCKS_ENTRY.defaultValue(), () -> "", INSTANCE::isValidIdOrTag); + .defineList( + BLOCKS_ENTRY.key(), + BLOCKS_ENTRY.defaultValue(), + BLOCKS_ENTRY::newElementValue, + INSTANCE::isValidIdOrTag + ); public static final ModConfigSpec SPEC = BUILDER.build(); diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigEntry.java new file mode 100644 index 0000000..30ceff9 --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigEntry.java @@ -0,0 +1,7 @@ +package net.meatwo310.mdk.config; + +public interface ConfigEntry { + String key(); + T defaultValue(); + String comment(); +} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigEnumEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigEnumEntry.java new file mode 100644 index 0000000..040a577 --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigEnumEntry.java @@ -0,0 +1,7 @@ +package net.meatwo310.mdk.config; + +public record ConfigEnumEntry>( + String key, + E defaultValue, + String comment +) implements ConfigEntry {} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigInListEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigInListEntry.java new file mode 100644 index 0000000..6e433a6 --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigInListEntry.java @@ -0,0 +1,10 @@ +package net.meatwo310.mdk.config; + +import java.util.List; + +public record ConfigInListEntry( + String key, + T defaultValue, + List allowedValues, + String comment +) implements ConfigEntry {} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java new file mode 100644 index 0000000..99f3a6d --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java @@ -0,0 +1,14 @@ +package net.meatwo310.mdk.config; + +import java.util.List; + +public record ConfigListEntry( + String key, + List defaultValue, + T newElementValue, + String comment +) implements ConfigEntry> { + public ConfigListEntry withDefaultValue(List defaultValue) { + return new ConfigListEntry<>(key, defaultValue, newElementValue, comment); + } +} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigRangeEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigRangeEntry.java new file mode 100644 index 0000000..021d3fb --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigRangeEntry.java @@ -0,0 +1,9 @@ +package net.meatwo310.mdk.config; + +public record ConfigRangeEntry>( + String key, + T defaultValue, + T min, + T max, + String comment +) implements ConfigEntry {} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigSimpleEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigSimpleEntry.java new file mode 100644 index 0000000..73b530a --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigSimpleEntry.java @@ -0,0 +1,7 @@ +package net.meatwo310.mdk.config; + +public record ConfigSimpleEntry( + String key, + T defaultValue, + String comment +) implements ConfigEntry {} diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigValidatedEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigValidatedEntry.java new file mode 100644 index 0000000..1315863 --- /dev/null +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigValidatedEntry.java @@ -0,0 +1,10 @@ +package net.meatwo310.mdk.config; + +import java.util.function.Predicate; + +public record ConfigValidatedEntry( + String key, + T defaultValue, + Predicate validator, + String comment +) implements ConfigEntry {} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java deleted file mode 100644 index 5375be1..0000000 --- a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigDoubleEntry.java +++ /dev/null @@ -1,9 +0,0 @@ -package net.meatwo310.softdeepslate.config; - -public record ConfigDoubleEntry( - String key, - double defaultValue, - double min, - double max, - String comment -) {} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java deleted file mode 100644 index dd80a58..0000000 --- a/common/src/main/java/net/meatwo310/softdeepslate/config/ConfigStringListEntry.java +++ /dev/null @@ -1,13 +0,0 @@ -package net.meatwo310.softdeepslate.config; - -import java.util.List; - -public record ConfigStringListEntry( - String key, - List defaultValue, - String comment -) { - public ConfigStringListEntry withDefaultValue(List defaultValue) { - return new ConfigStringListEntry(key, defaultValue, comment); - } -} diff --git a/common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfig.java similarity index 53% rename from common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java rename to common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfig.java index c9ddb0e..7f931cd 100644 --- a/common/src/main/java/net/meatwo310/softdeepslate/IModServerConfig.java +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfig.java @@ -1,9 +1,8 @@ -package net.meatwo310.softdeepslate; +package net.meatwo310.softdeepslate.config; import java.util.List; -public interface IModServerConfig { +public interface ModServerConfig { double miningSpeed(); - List blocks(); } diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java index 6cbb5a5..0c86fdb 100644 --- a/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigEntries.java @@ -1,19 +1,22 @@ package net.meatwo310.softdeepslate.config; +import net.meatwo310.mdk.config.ConfigListEntry; +import net.meatwo310.mdk.config.ConfigRangeEntry; + import java.util.List; public final class ModServerConfigEntries { - public static final ConfigDoubleEntry MINING_SPEED = new ConfigDoubleEntry( + public static final ConfigRangeEntry MINING_SPEED = new ConfigRangeEntry<>( "miningSpeed", 2.0D, 0.0D, - Float.MAX_VALUE, + (double) Float.MAX_VALUE, """ Adjusts the mining speed for deepslate. Given that deepslate is twice as hard as stone, a default value of 2.0 allows it to be mined at the same rate as stone.""" ); - public static final ConfigStringListEntry BLOCKS = new ConfigStringListEntry( + public static final ConfigListEntry BLOCKS = new ConfigListEntry<>( "blocks", List.of( "minecraft:deepslate", @@ -21,6 +24,7 @@ public final class ModServerConfigEntries { "#c:ores_in_ground/deepslate", "#softdeepslate:building_blocks" ), + "", """ List of block IDs or block tags (prefix with #) where this mod adjusts the mining speed. `/reload` to apply.""" diff --git a/common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigValidator.java similarity index 89% rename from common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java rename to common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigValidator.java index ac72751..f3de537 100644 --- a/common/src/main/java/net/meatwo310/softdeepslate/config/IModServerConfigValidator.java +++ b/common/src/main/java/net/meatwo310/softdeepslate/config/ModServerConfigValidator.java @@ -1,6 +1,6 @@ package net.meatwo310.softdeepslate.config; -public interface IModServerConfigValidator { +public interface ModServerConfigValidator { boolean isValidId(String entry); default boolean isValidIdOrTag(Object entry) { From 4b90c70689adc8dabbf41337cf71bbc37d83a1d2 Mon Sep 17 00:00:00 2001 From: Meatwo310 Date: Fri, 1 May 2026 23:34:39 +0900 Subject: [PATCH 4/5] refactor(common,1.20.1-common,1.20.1-forge,26.1-neo): simplify config entry usage --- .../softdeepslate/SoftDeepslateLogic.java | 2 -- .../softdeepslate/config/ServerConfig.java | 21 ++++++++--------- .../softdeepslate/config/ServerConfig.java | 23 ++++++++----------- .../meatwo310/mdk/config/ConfigListEntry.java | 6 +---- 4 files changed, 19 insertions(+), 33 deletions(-) diff --git a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java index 019bad3..7526d68 100644 --- a/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java +++ b/1.20.1-common/src/main/java/net/meatwo310/softdeepslate/SoftDeepslateLogic.java @@ -105,9 +105,7 @@ private void cacheBlockTag(Set blocks, String blockTagName) { public interface BlockResolver { Optional resolveBlock(ResourceLocation id); - Optional> resolveTag(ResourceLocation id); - String blockName(Block block); } } diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index a865950..7b73d49 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,7 +1,5 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.mdk.config.ConfigListEntry; -import net.meatwo310.mdk.config.ConfigRangeEntry; import net.minecraft.resources.ResourceLocation; import net.minecraftforge.common.ForgeConfigSpec; @@ -10,28 +8,27 @@ public class ServerConfig implements ModServerConfig, ModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); - private static final ConfigRangeEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; - private static final ConfigListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS.withDefaultValue(List.of( + private static final List DEFAULT_BLOCKS = List.of( "minecraft:deepslate", "#forge:cobblestone/deepslate", "#forge:ores_in_ground/deepslate", "#softdeepslate:building_blocks" - )); + ); private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); public static ForgeConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(MINING_SPEED_ENTRY.comment()) + .comment(ModServerConfigEntries.MINING_SPEED.comment()) .defineInRange( - MINING_SPEED_ENTRY.key(), - MINING_SPEED_ENTRY.defaultValue(), - MINING_SPEED_ENTRY.min(), - MINING_SPEED_ENTRY.max() + ModServerConfigEntries.MINING_SPEED.key(), + ModServerConfigEntries.MINING_SPEED.defaultValue(), + ModServerConfigEntries.MINING_SPEED.min(), + ModServerConfigEntries.MINING_SPEED.max() ); public static ForgeConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(BLOCKS_ENTRY.comment()) - .defineList(BLOCKS_ENTRY.key(), BLOCKS_ENTRY.defaultValue(), INSTANCE::isValidIdOrTag); + .comment(ModServerConfigEntries.BLOCKS.comment()) + .defineList(ModServerConfigEntries.BLOCKS.key(), DEFAULT_BLOCKS, INSTANCE::isValidIdOrTag); public static final ForgeConfigSpec SPEC = BUILDER.build(); diff --git a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java index 05fc8a5..ecc40e8 100644 --- a/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java +++ b/26.1-neo/src/main/java/net/meatwo310/softdeepslate/config/ServerConfig.java @@ -1,7 +1,5 @@ package net.meatwo310.softdeepslate.config; -import net.meatwo310.mdk.config.ConfigListEntry; -import net.meatwo310.mdk.config.ConfigRangeEntry; import net.minecraft.resources.Identifier; import net.neoforged.neoforge.common.ModConfigSpec; @@ -10,26 +8,23 @@ public class ServerConfig implements ModServerConfig, ModServerConfigValidator { public static final ServerConfig INSTANCE = new ServerConfig(); - private static final ConfigRangeEntry MINING_SPEED_ENTRY = ModServerConfigEntries.MINING_SPEED; - private static final ConfigListEntry BLOCKS_ENTRY = ModServerConfigEntries.BLOCKS; - private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); public static ModConfigSpec.DoubleValue MINING_SPEED = BUILDER - .comment(MINING_SPEED_ENTRY.comment()) + .comment(ModServerConfigEntries.MINING_SPEED.comment()) .defineInRange( - MINING_SPEED_ENTRY.key(), - MINING_SPEED_ENTRY.defaultValue(), - MINING_SPEED_ENTRY.min(), - MINING_SPEED_ENTRY.max() + ModServerConfigEntries.MINING_SPEED.key(), + ModServerConfigEntries.MINING_SPEED.defaultValue(), + ModServerConfigEntries.MINING_SPEED.min(), + ModServerConfigEntries.MINING_SPEED.max() ); public static ModConfigSpec.ConfigValue> BLOCKS = BUILDER - .comment(BLOCKS_ENTRY.comment()) + .comment(ModServerConfigEntries.BLOCKS.comment()) .defineList( - BLOCKS_ENTRY.key(), - BLOCKS_ENTRY.defaultValue(), - BLOCKS_ENTRY::newElementValue, + ModServerConfigEntries.BLOCKS.key(), + ModServerConfigEntries.BLOCKS.defaultValue(), + ModServerConfigEntries.BLOCKS::newElementValue, INSTANCE::isValidIdOrTag ); diff --git a/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java b/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java index 99f3a6d..4492717 100644 --- a/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java +++ b/common/src/main/java/net/meatwo310/mdk/config/ConfigListEntry.java @@ -7,8 +7,4 @@ public record ConfigListEntry( List defaultValue, T newElementValue, String comment -) implements ConfigEntry> { - public ConfigListEntry withDefaultValue(List defaultValue) { - return new ConfigListEntry<>(key, defaultValue, newElementValue, comment); - } -} +) implements ConfigEntry> {} From 4461b62ff639fb75166150f3b1f1d1f2a1fb34aa Mon Sep 17 00:00:00 2001 From: Meatwo310 Date: Sat, 2 May 2026 00:29:34 +0900 Subject: [PATCH 5/5] fix(1.20.1-forge): avoid duplicate tag warning --- .../src/main/java/net/meatwo310/softdeepslate/ModMain.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java index aad2b9e..7c82ced 100644 --- a/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java +++ b/1.20.1-forge/src/main/java/net/meatwo310/softdeepslate/ModMain.java @@ -14,6 +14,7 @@ import net.minecraftforge.registries.tags.ITag; import net.minecraftforge.registries.tags.ITagManager; +import java.util.List; import java.util.Optional; @Mod(Constants.MODID) @@ -56,11 +57,11 @@ public Optional resolveBlock(ResourceLocation id) { } @Override - public Optional> resolveTag(ResourceLocation id) { + public Optional> resolveTag(ResourceLocation id) { ITagManager tagManager = ForgeRegistries.BLOCKS.tags(); if (tagManager == null) { Constants.LOGGER.warn("Block tag manager is not available: #{}", id); - return Optional.empty(); + return Optional.of(List.of()); } TagKey tagKey = tagManager.createTagKey(id);