User: rednesto Date: 14 Jun 24 09:09 Revision: b7276ac69453e16ea81c4d7987b7d38a45cf71ba Summary: Minecraft 1.21 templates TeamCity URL: https://ci.mcdev.io/viewModification.html?tab=vcsModificationFiles&modId=9320&personal=false Index: src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt =================================================================== --- src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/platform/bungeecord/creator/bungee-platforms.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -28,6 +28,8 @@ 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( Index: src/main/kotlin/platform/forge/creator/asset-steps.kt =================================================================== --- src/main/kotlin/platform/forge/creator/asset-steps.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/platform/forge/creator/asset-steps.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -108,6 +108,7 @@ } 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 @@ ) 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 } Index: src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt =================================================================== --- src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/platform/forge/util/ForgePackDescriptor.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -55,7 +55,8 @@ 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 @@ 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 } } Index: src/main/kotlin/platform/neoforge/creator/asset-steps.kt =================================================================== --- src/main/kotlin/platform/neoforge/creator/asset-steps.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/platform/neoforge/creator/asset-steps.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -122,6 +122,7 @@ ) 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 } Index: src/main/kotlin/platform/neoforge/creator/gradle-steps.kt =================================================================== --- src/main/kotlin/platform/neoforge/creator/gradle-steps.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/platform/neoforge/creator/gradle-steps.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -87,6 +87,10 @@ } else { mcVersion } + val loaderVersion = when { + mcVersion < MinecraftVersions.MC1_21 -> "2" + else -> "4" + } data.putUserData(GRADLE_VERSION_KEY, ngWrapperVersion) @@ -97,6 +101,7 @@ "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, Index: src/main/kotlin/util/MinecraftTemplates.kt =================================================================== --- src/main/kotlin/util/MinecraftTemplates.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/util/MinecraftTemplates.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -87,7 +87,9 @@ 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 @@ 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 @@ 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" Index: src/main/kotlin/util/MinecraftVersions.kt =================================================================== --- src/main/kotlin/util/MinecraftVersions.kt (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/kotlin/util/MinecraftVersions.kt (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -39,6 +39,8 @@ 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 Index: src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft =================================================================== --- src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -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()); + } + } +} Index: src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html =================================================================== --- src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/forge/Forge (1.20.6+) Main Class.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -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

+ + Index: src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft =================================================================== --- src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -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()); + } +} Index: src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html =================================================================== --- src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/forge/Forge (1.21+) Config.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -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

+ + Index: src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft =================================================================== --- src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -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()); + } +} Index: src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html =================================================================== --- src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) +++ src/main/resources/fileTemplates/j2ee/neoforge/NeoForge (1.21) Config.java.html (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -0,0 +1,25 @@ + + + + +

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

+ + Index: src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft =================================================================== --- src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft (revision efcfd5dee27fd5a722e84faf635554938357900c) +++ src/main/resources/fileTemplates/j2ee/neoforge/NeoForge gradle.properties.ft (revision b7276ac69453e16ea81c4d7987b7d38a45cf71ba) @@ -16,7 +16,7 @@ # 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}