From b7276ac69453e16ea81c4d7987b7d38a45cf71ba Mon Sep 17 00:00:00 2001 From: RedNesto Date: Fri, 14 Jun 2024 11:09:51 +0200 Subject: [PATCH] Minecraft 1.21 templates --- .../bungeecord/creator/bungee-platforms.kt | 2 + .../platform/forge/creator/asset-steps.kt | 2 + .../forge/util/ForgePackDescriptor.kt | 6 +- .../platform/neoforge/creator/asset-steps.kt | 1 + .../platform/neoforge/creator/gradle-steps.kt | 5 + src/main/kotlin/util/MinecraftTemplates.kt | 6 + src/main/kotlin/util/MinecraftVersions.kt | 2 + .../forge/Forge (1.20.6+) Main Class.java.ft | 125 ++++++++++++++++++ .../Forge (1.20.6+) Main Class.java.html | 25 ++++ .../j2ee/forge/Forge (1.21+) Config.java.ft | 64 +++++++++ .../j2ee/forge/Forge (1.21+) Config.java.html | 25 ++++ .../neoforge/NeoForge (1.21) Config.java.ft | 63 +++++++++ .../neoforge/NeoForge (1.21) Config.java.html | 25 ++++ .../neoforge/NeoForge gradle.properties.ft | 2 +- 14 files changed, 350 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft create mode 100644 src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html create mode 100644 src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft create mode 100644 src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html create mode 100644 src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft create mode 100644 src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html diff --git a/src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt b/src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt index 254c24c49..04b321428 100644 --- a/src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt +++ b/src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt @@ -28,6 +28,8 @@ import com.demonwav.mcdev.util.SemanticVersion class BungeeMainPlatformStep(parent: BungeePlatformStep) : AbstractBungeePlatformStep(parent, PlatformType.BUNGEECORD) { override fun getRepositories(mcVersion: SemanticVersion) = listOf( BuildRepository("sonatype", "https://oss.sonatype.org/content/groups/public/"), + // Seems to be required since 1.21 + BuildRepository("Minecraft Libraries", "https://libraries.minecraft.net/"), ) override fun getDependencies(mcVersion: SemanticVersion) = listOf( diff --git a/src/main/kotlin/platform/forge/creator/asset-steps.kt b/src/main/kotlin/platform/forge/creator/asset-steps.kt index a52811858..e68058f8f 100644 --- a/src/main/kotlin/platform/forge/creator/asset-steps.kt +++ b/src/main/kotlin/platform/forge/creator/asset-steps.kt @@ -108,6 +108,7 @@ class ForgeProjectFilesStep(parent: NewProjectWizardStep) : AbstractLongRunningA } val mainClassTemplate = when { + mcVersion >= MinecraftVersions.MC1_20_6 -> MinecraftTemplates.FG3_1_20_6_MAIN_CLASS_TEMPLATE mcVersion >= MinecraftVersions.MC1_20 -> MinecraftTemplates.FG3_1_20_MAIN_CLASS_TEMPLATE mcVersion >= MinecraftVersions.MC1_19_3 -> MinecraftTemplates.FG3_1_19_3_MAIN_CLASS_TEMPLATE mcVersion >= MinecraftVersions.MC1_19 -> MinecraftTemplates.FG3_1_19_MAIN_CLASS_TEMPLATE @@ -124,6 +125,7 @@ class ForgeProjectFilesStep(parent: NewProjectWizardStep) : AbstractLongRunningA ) val configTemplate = when { + mcVersion >= MinecraftVersions.MC1_21 -> MinecraftTemplates.FG3_1_21_CONFIG_TEMPLATE mcVersion >= MinecraftVersions.MC1_20 -> MinecraftTemplates.FG3_1_20_CONFIG_TEMPLATE else -> null } diff --git a/src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt b/src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt index 0b984a288..9fb68a20a 100644 --- a/src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt +++ b/src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt @@ -55,7 +55,8 @@ data class ForgePackDescriptor(val format: Int, val comment: String) { val FORMAT_15 = ForgePackDescriptor(15, "") val FORMAT_18 = ForgePackDescriptor(18, "") val FORMAT_26 = ForgePackDescriptor(26, "") - val FORMAT_41 = ForgePackDescriptor(26, "") + val FORMAT_41 = ForgePackDescriptor(41, "") + val FORMAT_48 = ForgePackDescriptor(48, "") // See https://minecraft.gamepedia.com/Tutorials/Creating_a_resource_pack#.22pack_format.22 fun forMcVersion(version: SemanticVersion): ForgePackDescriptor? = when { @@ -71,7 +72,8 @@ data class ForgePackDescriptor(val format: Int, val comment: String) { version < MinecraftVersions.MC1_20_2 -> FORMAT_15 version < MinecraftVersions.MC1_20_3 -> FORMAT_18 version < MinecraftVersions.MC1_20_5 -> FORMAT_26 - version >= MinecraftVersions.MC1_20_5 -> FORMAT_41 + version < MinecraftVersions.MC1_21 -> FORMAT_41 + version >= MinecraftVersions.MC1_21 -> FORMAT_48 else -> null } } diff --git a/src/main/kotlin/platform/neoforge/creator/asset-steps.kt b/src/main/kotlin/platform/neoforge/creator/asset-steps.kt index 83978733c..1d7af10e6 100644 --- a/src/main/kotlin/platform/neoforge/creator/asset-steps.kt +++ b/src/main/kotlin/platform/neoforge/creator/asset-steps.kt @@ -122,6 +122,7 @@ class NeoForgeProjectFilesStep(parent: NewProjectWizardStep) : AbstractLongRunni ) val configClassTemplate = when { + mcVersion >= MinecraftVersions.MC1_21 -> MinecraftTemplates.NEOFORGE_1_21_CONFIG_TEMPLATE mcVersion >= MinecraftVersions.MC1_20_5 -> MinecraftTemplates.NEOFORGE_1_20_5_CONFIG_TEMPLATE else -> MinecraftTemplates.NEOFORGE_CONFIG_TEMPLATE } diff --git a/src/main/kotlin/platform/neoforge/creator/gradle-steps.kt b/src/main/kotlin/platform/neoforge/creator/gradle-steps.kt index a6a6deb18..e1592551e 100644 --- a/src/main/kotlin/platform/neoforge/creator/gradle-steps.kt +++ b/src/main/kotlin/platform/neoforge/creator/gradle-steps.kt @@ -87,6 +87,10 @@ class NeoForgeGradleFilesStep(parent: NewProjectWizardStep) : AbstractLongRunnin } else { mcVersion } + val loaderVersion = when { + mcVersion < MinecraftVersions.MC1_21 -> "2" + else -> "4" + } data.putUserData(GRADLE_VERSION_KEY, ngWrapperVersion) @@ -97,6 +101,7 @@ class NeoForgeGradleFilesStep(parent: NewProjectWizardStep) : AbstractLongRunnin "MC_NEXT_VERSION" to mcNextVersion, "NEOFORGE_VERSION" to neoforgeVersion, "NEOFORGE_SPEC_VERSION" to neoforgeVersion.parts[0].versionString, + "LOADER_VERSION" to loaderVersion, "NEOGRADLE_VERSION" to neogradleVersion, "GROUP_ID" to buildSystemProps.groupId, "ARTIFACT_ID" to buildSystemProps.artifactId, diff --git a/src/main/kotlin/util/MinecraftTemplates.kt b/src/main/kotlin/util/MinecraftTemplates.kt index 3769ea168..5674d58c4 100644 --- a/src/main/kotlin/util/MinecraftTemplates.kt +++ b/src/main/kotlin/util/MinecraftTemplates.kt @@ -87,7 +87,9 @@ class MinecraftTemplates : FileTemplateGroupDescriptorFactory { forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_19_MAIN_CLASS_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_19_3_MAIN_CLASS_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_20_MAIN_CLASS_TEMPLATE)) + forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_20_6_MAIN_CLASS_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_20_CONFIG_TEMPLATE)) + forgeGroup.addTemplate(FileTemplateDescriptor(FG3_1_21_CONFIG_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_BUILD_GRADLE_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_GRADLE_PROPERTIES_TEMPLATE)) forgeGroup.addTemplate(FileTemplateDescriptor(FG3_SETTINGS_GRADLE_TEMPLATE)) @@ -214,7 +216,9 @@ class MinecraftTemplates : FileTemplateGroupDescriptorFactory { const val FG3_1_19_MAIN_CLASS_TEMPLATE = "Forge (1.19+) Main Class.java" const val FG3_1_19_3_MAIN_CLASS_TEMPLATE = "Forge (1.19.3+) Main Class.java" const val FG3_1_20_MAIN_CLASS_TEMPLATE = "Forge (1.20+) Main Class.java" + const val FG3_1_20_6_MAIN_CLASS_TEMPLATE = "Forge (1.20.6+) Main Class.java" const val FG3_1_20_CONFIG_TEMPLATE = "Forge (1.20+) Config.java" + const val FG3_1_21_CONFIG_TEMPLATE = "Forge (1.21+) Config.java" const val FG3_BUILD_GRADLE_TEMPLATE = "Forge (1.13+) build.gradle" const val FG3_GRADLE_PROPERTIES_TEMPLATE = "Forge (1.13+) gradle.properties" const val FG3_SETTINGS_GRADLE_TEMPLATE = "Forge (1.13+) settings.gradle" @@ -282,6 +286,8 @@ class MinecraftTemplates : FileTemplateGroupDescriptorFactory { const val NEOFORGE_1_20_5_CONFIG_TEMPLATE = "NeoForge (1.20.5) Config.java" const val NEOFORGE_1_20_5_BUILD_GRADLE_TEMPLATE = "NeoForge (1.20.5) build.gradle" + const val NEOFORGE_1_21_CONFIG_TEMPLATE = "NeoForge (1.21) Config.java" + const val NEOFORGE_BLOCK_TEMPLATE = "NeoForgeBlock.java" const val NEOFORGE_ITEM_TEMPLATE = "NeoForgeItem.java" const val NEOFORGE_PACKET_TEMPLATE = "NeoForgePacket.java" diff --git a/src/main/kotlin/util/MinecraftVersions.kt b/src/main/kotlin/util/MinecraftVersions.kt index 6c446635e..9d19a575c 100644 --- a/src/main/kotlin/util/MinecraftVersions.kt +++ b/src/main/kotlin/util/MinecraftVersions.kt @@ -39,6 +39,8 @@ object MinecraftVersions { val MC1_20_3 = SemanticVersion.release(1, 20, 3) val MC1_20_4 = SemanticVersion.release(1, 20, 4) val MC1_20_5 = SemanticVersion.release(1, 20, 5) + val MC1_20_6 = SemanticVersion.release(1, 20, 6) + val MC1_21 = SemanticVersion.release(1, 21) fun requiredJavaVersion(minecraftVersion: SemanticVersion) = when { minecraftVersion <= MC1_16_5 -> JavaSdkVersion.JDK_1_8 diff --git a/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft new file mode 100644 index 000000000..11a627ec8 --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft @@ -0,0 +1,125 @@ +package ${PACKAGE_NAME}; + +import com.mojang.logging.LogUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.core.registries.Registries; +import net.minecraft.world.food.FoodProperties; +import net.minecraft.world.item.BlockItem; +import net.minecraft.world.item.CreativeModeTab; +import net.minecraft.world.item.CreativeModeTabs; +import net.minecraft.world.item.Item; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockBehaviour; +import net.minecraft.world.level.material.MapColor; +import net.minecraftforge.api.distmarker.Dist; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.event.BuildCreativeModeTabContentsEvent; +import net.minecraftforge.event.server.ServerStartingEvent; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.config.ModConfig; +import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; +import org.slf4j.Logger; + +// The value here should match an entry in the META-INF/mods.toml file +@Mod(${CLASS_NAME}.MODID) +public class ${CLASS_NAME} { + + // Define mod id in a common place for everything to reference + public static final String MODID = "${MOD_ID}"; + // Directly reference a slf4j logger + private static final Logger LOGGER = LogUtils.getLogger(); + // Create a Deferred Register to hold Blocks which will all be registered under the "${MOD_ID}" namespace + public static final DeferredRegister BLOCKS = DeferredRegister.create(ForgeRegistries.BLOCKS, MODID); + // Create a Deferred Register to hold Items which will all be registered under the "${MOD_ID}" namespace + public static final DeferredRegister ITEMS = DeferredRegister.create(ForgeRegistries.ITEMS, MODID); + // Create a Deferred Register to hold CreativeModeTabs which will all be registered under the "examplemod" namespace + public static final DeferredRegister CREATIVE_MODE_TABS = DeferredRegister.create(Registries.CREATIVE_MODE_TAB, MODID); + + // Creates a new Block with the id "${MOD_ID}:example_block", combining the namespace and path + public static final RegistryObject EXAMPLE_BLOCK = BLOCKS.register("example_block", () -> new Block(BlockBehaviour.Properties.of().mapColor(MapColor.STONE))); + // Creates a new BlockItem with the id "${MOD_ID}:example_block", combining the namespace and path + public static final RegistryObject EXAMPLE_BLOCK_ITEM = ITEMS.register("example_block", () -> new BlockItem(EXAMPLE_BLOCK.get(), new Item.Properties())); + + // Creates a new food item with the id "examplemod:example_id", nutrition 1 and saturation 2 + public static final RegistryObject EXAMPLE_ITEM = ITEMS.register("example_item", () -> new Item(new Item.Properties().food(new FoodProperties.Builder() + .alwaysEdible().nutrition(1).saturationModifier(2f).build()))); + + // Creates a creative tab with the id "examplemod:example_tab" for the example item, that is placed after the combat tab + public static final RegistryObject EXAMPLE_TAB = CREATIVE_MODE_TABS.register("example_tab", () -> CreativeModeTab.builder() + .withTabsBefore(CreativeModeTabs.COMBAT) + .icon(() -> EXAMPLE_ITEM.get().getDefaultInstance()) + .displayItems((parameters, output) -> { + output.accept(EXAMPLE_ITEM.get()); // Add the example item to the tab. For your own tabs, this method is preferred over the event + }).build()); + + public ${CLASS_NAME}() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); + + // Register the commonSetup method for modloading + modEventBus.addListener(this::commonSetup); + + // Register the Deferred Register to the mod event bus so blocks get registered + BLOCKS.register(modEventBus); + // Register the Deferred Register to the mod event bus so items get registered + ITEMS.register(modEventBus); + // Register the Deferred Register to the mod event bus so tabs get registered + CREATIVE_MODE_TABS.register(modEventBus); + + // Register ourselves for server and other game events we are interested in + MinecraftForge.EVENT_BUS.register(this); + + // Register the item to a creative tab + modEventBus.addListener(this::addCreative); + + // Register our mod's ForgeConfigSpec so that Forge can create and load the config file for us + ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, Config.SPEC); + } + + private void commonSetup(final FMLCommonSetupEvent event) { + // Some common setup code + LOGGER.info("HELLO FROM COMMON SETUP"); + LOGGER.info("DIRT BLOCK >> {}", ForgeRegistries.BLOCKS.getKey(Blocks.DIRT)); + + if (Config.logDirtBlock) + LOGGER.info("DIRT BLOCK >> {}", ForgeRegistries.BLOCKS.getKey(Blocks.DIRT)); + + LOGGER.info(Config.magicNumberIntroduction + Config.magicNumber); + + Config.items.forEach((item) -> LOGGER.info("ITEM >> {}", item.toString())); + } + + // Add the example block item to the building blocks tab + private void addCreative(BuildCreativeModeTabContentsEvent event) + { + if (event.getTabKey() == CreativeModeTabs.BUILDING_BLOCKS) + event.accept(EXAMPLE_BLOCK_ITEM); + } + // You can use SubscribeEvent and let the Event Bus discover methods to call + @SubscribeEvent + public void onServerStarting(ServerStartingEvent event) { + // Do something when the server starts + LOGGER.info("HELLO from server starting"); + } + + // You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent + @Mod.EventBusSubscriber(modid = MODID, bus = Mod.EventBusSubscriber.Bus.MOD, value = Dist.CLIENT) + public static class ClientModEvents { + + @SubscribeEvent + public static void onClientSetup(FMLClientSetupEvent event) + { + // Some client setup code + LOGGER.info("HELLO FROM CLIENT SETUP"); + LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName()); + } + } +} diff --git a/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html new file mode 100644 index 000000000..a4d2b9279 --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html @@ -0,0 +1,25 @@ + + + + +

This is a built-in file template used to create a new main class for Forge projects 1.20.6 and above

+ + diff --git a/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft new file mode 100644 index 000000000..3a49f15d7 --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft @@ -0,0 +1,64 @@ +package ${PACKAGE_NAME}; + +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.minecraftforge.common.ForgeConfigSpec; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.config.ModConfigEvent; +import net.minecraftforge.registries.ForgeRegistries; + +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +// An example config class. This is not required, but it's a good idea to have one to keep your config organized. +// Demonstrates how to use Forge's config APIs +@Mod.EventBusSubscriber(modid = ${CLASS_NAME}.MODID, bus = Mod.EventBusSubscriber.Bus.MOD) +public class Config +{ + private static final ForgeConfigSpec.Builder BUILDER = new ForgeConfigSpec.Builder(); + + private static final ForgeConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER + .comment("Whether to log the dirt block on common setup") + .define("logDirtBlock", true); + + private static final ForgeConfigSpec.IntValue MAGIC_NUMBER = BUILDER + .comment("A magic number") + .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); + + public static final ForgeConfigSpec.ConfigValue MAGIC_NUMBER_INTRODUCTION = BUILDER + .comment("What you want the introduction message to be for the magic number") + .define("magicNumberIntroduction", "The magic number is... "); + + // a list of strings that are treated as resource locations for items + private static final ForgeConfigSpec.ConfigValue> ITEM_STRINGS = BUILDER + .comment("A list of items to log on common setup.") + .defineListAllowEmpty("items", List.of("minecraft:iron_ingot"), Config::validateItemName); + + static final ForgeConfigSpec SPEC = BUILDER.build(); + + public static boolean logDirtBlock; + public static int magicNumber; + public static String magicNumberIntroduction; + public static Set items; + + private static boolean validateItemName(final Object obj) + { + return obj instanceof final String itemName && ForgeRegistries.ITEMS.containsKey(ResourceLocation.parse(itemName)); + } + + @SubscribeEvent + static void onLoad(final ModConfigEvent event) + { + logDirtBlock = LOG_DIRT_BLOCK.get(); + magicNumber = MAGIC_NUMBER.get(); + magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); + + // convert the list of strings into a set of items + items = ITEM_STRINGS.get().stream() + .map(itemName -> ForgeRegistries.ITEMS.getValue(ResourceLocation.parse(itemName))) + .collect(Collectors.toSet()); + } +} diff --git a/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html new file mode 100644 index 000000000..7bc7c827e --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html @@ -0,0 +1,25 @@ + + + + +

This is a built-in file template used to create a new config class for Forge projects 1.21 and above

+ + diff --git a/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft new file mode 100644 index 000000000..b04b88c8f --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft @@ -0,0 +1,63 @@ +package ${PACKAGE_NAME}; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.item.Item; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.EventBusSubscriber; +import net.neoforged.fml.event.config.ModConfigEvent; +import net.neoforged.neoforge.common.ModConfigSpec; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +// An example config class. This is not required, but it's a good idea to have one to keep your config organized. +// Demonstrates how to use Neo's config APIs +@EventBusSubscriber(modid = ${CLASS_NAME}.MODID, bus = EventBusSubscriber.Bus.MOD) +public class Config +{ + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); + + private static final ModConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER + .comment("Whether to log the dirt block on common setup") + .define("logDirtBlock", true); + + private static final ModConfigSpec.IntValue MAGIC_NUMBER = BUILDER + .comment("A magic number") + .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); + + public static final ModConfigSpec.ConfigValue MAGIC_NUMBER_INTRODUCTION = BUILDER + .comment("What you want the introduction message to be for the magic number") + .define("magicNumberIntroduction", "The magic number is... "); + + // a list of strings that are treated as resource locations for items + private static final ModConfigSpec.ConfigValue> ITEM_STRINGS = BUILDER + .comment("A list of items to log on common setup.") + .defineListAllowEmpty("items", List.of("minecraft:iron_ingot"), Config::validateItemName); + + static final ModConfigSpec SPEC = BUILDER.build(); + + public static boolean logDirtBlock; + public static int magicNumber; + public static String magicNumberIntroduction; + public static Set items; + + private static boolean validateItemName(final Object obj) + { + return obj instanceof String itemName && BuiltInRegistries.ITEM.containsKey(ResourceLocation.parse(itemName)); + } + + @SubscribeEvent + static void onLoad(final ModConfigEvent event) + { + logDirtBlock = LOG_DIRT_BLOCK.get(); + magicNumber = MAGIC_NUMBER.get(); + magicNumberIntroduction = MAGIC_NUMBER_INTRODUCTION.get(); + + // convert the list of strings into a set of items + items = ITEM_STRINGS.get().stream() + .map(itemName -> BuiltInRegistries.ITEM.get(ResourceLocation.parse(itemName))) + .collect(Collectors.toSet()); + } +} diff --git a/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html new file mode 100644 index 000000000..8ff2f24fa --- /dev/null +++ b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html @@ -0,0 +1,25 @@ + + + + +

This is a built-in file template used to create a new config class for NeoForge 1.21 projects.

+ + diff --git a/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft index 91afe9ac6..3fff05605 100644 --- a/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft +++ b/src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft @@ -16,7 +16,7 @@ neo_version=${NEOFORGE_VERSION} # The Neo version range can use any version of Neo as bounds neo_version_range=[${NEOFORGE_SPEC_VERSION},) # The loader version range can only use the major version of FML as bounds -loader_version_range=[2,) +loader_version_range=[${LOADER_VERSION},) #if (${PARCHMENT_VERSION}) neogradle.subsystems.parchment.minecraftVersion=${PARCHMENT_MC_VERSION}