diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/main/java/de/oscoder/tutorialmod/Config.java | 42 | ||||
| -rw-r--r-- | src/main/java/de/oscoder/tutorialmod/TutorialMod.java | 71 | ||||
| -rw-r--r-- | src/main/java/de/oscoder/tutorialmod/TutorialModClient.java | 31 | ||||
| -rw-r--r-- | src/main/resources/assets/tutorialmod/lang/en_us.json | 13 | ||||
| -rw-r--r-- | src/main/resources/tutorialmod.mixins.json | 12 | ||||
| -rw-r--r-- | src/main/templates/META-INF/neoforge.mods.toml | 87 |
6 files changed, 256 insertions, 0 deletions
diff --git a/src/main/java/de/oscoder/tutorialmod/Config.java b/src/main/java/de/oscoder/tutorialmod/Config.java new file mode 100644 index 0000000..ab23e24 --- /dev/null +++ b/src/main/java/de/oscoder/tutorialmod/Config.java @@ -0,0 +1,42 @@ +package de.oscoder.tutorialmod; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.resources.Identifier; +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; + +// 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 +public class Config { + private static final ModConfigSpec.Builder BUILDER = new ModConfigSpec.Builder(); + + public static final ModConfigSpec.BooleanValue LOG_DIRT_BLOCK = BUILDER + .comment("Whether to log the dirt block on common setup") + .define("logDirtBlock", true); + + public static final ModConfigSpec.IntValue MAGIC_NUMBER = BUILDER + .comment("A magic number") + .defineInRange("magicNumber", 42, 0, Integer.MAX_VALUE); + + public static final ModConfigSpec.ConfigValue<String> 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 + public static final ModConfigSpec.ConfigValue<List<? extends String>> 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(); + + private static boolean validateItemName(final Object obj) { + return obj instanceof String itemName && BuiltInRegistries.ITEM.containsKey(Identifier.parse(itemName)); + } +} diff --git a/src/main/java/de/oscoder/tutorialmod/TutorialMod.java b/src/main/java/de/oscoder/tutorialmod/TutorialMod.java new file mode 100644 index 0000000..9ca13d6 --- /dev/null +++ b/src/main/java/de/oscoder/tutorialmod/TutorialMod.java @@ -0,0 +1,71 @@ +package de.oscoder.tutorialmod; + +import org.slf4j.Logger; + +import com.mojang.logging.LogUtils; + +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.network.chat.Component; +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.neoforged.api.distmarker.Dist; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.fml.common.Mod; +import net.neoforged.fml.config.ModConfig; +import net.neoforged.fml.ModContainer; +import net.neoforged.fml.event.lifecycle.FMLCommonSetupEvent; +import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.event.BuildCreativeModeTabContentsEvent; +import net.neoforged.neoforge.event.server.ServerStartingEvent; +import net.neoforged.neoforge.registries.DeferredBlock; +import net.neoforged.neoforge.registries.DeferredHolder; +import net.neoforged.neoforge.registries.DeferredItem; +import net.neoforged.neoforge.registries.DeferredRegister; + +// The value here should match an entry in the META-INF/neoforge.mods.toml file +@Mod(TutorialMod.MOD_ID) +public class TutorialMod { + // Define mod id in a common place for everything to reference + public static final String MOD_ID = "tutorialmod"; + // Directly reference a slf4j logger + public static final Logger LOGGER = LogUtils.getLogger(); + + // The constructor for the mod class is the first code that is run when your mod is loaded. + // FML will recognize some parameter types like IEventBus or ModContainer and pass them in automatically. + public TutorialMod(IEventBus modEventBus, ModContainer modContainer) { + // Register the commonSetup method for modloading + modEventBus.addListener(this::commonSetup); + + // Register ourselves for server and other game events we are interested in. + // Note that this is necessary if and only if we want *this* class (TutorialMod) to respond directly to events. + // Do not add this line if there are no @SubscribeEvent-annotated functions in this class, like onServerStarting() below. + NeoForge.EVENT_BUS.register(this); + + // Register the item to a creative tab + modEventBus.addListener(this::addCreative); + + // Register our mod's ModConfigSpec so that FML can create and load the config file for us + modContainer.registerConfig(ModConfig.Type.COMMON, Config.SPEC); + } + + private void commonSetup(FMLCommonSetupEvent event) { + } + + // Add the example block item to the building blocks tab + private void addCreative(BuildCreativeModeTabContentsEvent event) { + } + + // You can use SubscribeEvent and let the Event Bus discover methods to call + @SubscribeEvent + public void onServerStarting(ServerStartingEvent event) { + } +} diff --git a/src/main/java/de/oscoder/tutorialmod/TutorialModClient.java b/src/main/java/de/oscoder/tutorialmod/TutorialModClient.java new file mode 100644 index 0000000..a6e1af0 --- /dev/null +++ b/src/main/java/de/oscoder/tutorialmod/TutorialModClient.java @@ -0,0 +1,31 @@ +package de.oscoder.tutorialmod; + +import net.minecraft.client.Minecraft; +import net.neoforged.api.distmarker.Dist; +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.event.lifecycle.FMLClientSetupEvent; +import net.neoforged.neoforge.client.gui.ConfigurationScreen; +import net.neoforged.neoforge.client.gui.IConfigScreenFactory; + +// This class will not load on dedicated servers. Accessing client side code from here is safe. +@Mod(value = TutorialMod.MOD_ID, dist = Dist.CLIENT) +// You can use EventBusSubscriber to automatically register all static methods in the class annotated with @SubscribeEvent +@EventBusSubscriber(modid = TutorialMod.MOD_ID, value = Dist.CLIENT) +public class TutorialModClient { + public TutorialModClient(ModContainer container) { + // Allows NeoForge to create a config screen for this mod's configs. + // The config screen is accessed by going to the Mods screen > clicking on your mod > clicking on config. + // Do not forget to add translations for your config options to the en_us.json file. + container.registerExtensionPoint(IConfigScreenFactory.class, ConfigurationScreen::new); + } + + @SubscribeEvent + static void onClientSetup(FMLClientSetupEvent event) { + // Some client setup code + TutorialMod.LOGGER.info("HELLO FROM CLIENT SETUP"); + TutorialMod.LOGGER.info("MINECRAFT NAME >> {}", Minecraft.getInstance().getUser().getName()); + } +} diff --git a/src/main/resources/assets/tutorialmod/lang/en_us.json b/src/main/resources/assets/tutorialmod/lang/en_us.json new file mode 100644 index 0000000..bda2c4d --- /dev/null +++ b/src/main/resources/assets/tutorialmod/lang/en_us.json @@ -0,0 +1,13 @@ +{ + "itemGroup.tutorialmod": "Example Mod Tab", + "block.tutorialmod.example_block": "Example Block", + "item.tutorialmod.example_item": "Example Item", + + "tutorialmod.configuration.title": "Tutorial Mod Configs", + "tutorialmod.configuration.section.tutorialmod.common.toml": "Tutorial Mod Configs", + "tutorialmod.configuration.section.tutorialmod.common.toml.title": "Tutorial Mod Configs", + "tutorialmod.configuration.items": "Item List", + "tutorialmod.configuration.logDirtBlock": "Log Dirt Block", + "tutorialmod.configuration.magicNumberIntroduction": "Magic Number Text", + "tutorialmod.configuration.magicNumber": "Magic Number" +} diff --git a/src/main/resources/tutorialmod.mixins.json b/src/main/resources/tutorialmod.mixins.json new file mode 100644 index 0000000..52a78ee --- /dev/null +++ b/src/main/resources/tutorialmod.mixins.json @@ -0,0 +1,12 @@ +{ + "required": true, + "package": "de.oscoder.tutorialmod.mixin", + "compatibilityLevel": "JAVA_25", + "mixins": [], + "injectors": { + "defaultRequire": 1 + }, + "overwrites": { + "requireAnnotations": true + } +}
\ No newline at end of file diff --git a/src/main/templates/META-INF/neoforge.mods.toml b/src/main/templates/META-INF/neoforge.mods.toml new file mode 100644 index 0000000..bb64fea --- /dev/null +++ b/src/main/templates/META-INF/neoforge.mods.toml @@ -0,0 +1,87 @@ +# This is an example neoforge.mods.toml file. It contains the data relating to the loading mods. +# There are several mandatory fields (#mandatory), and many more that are optional (#optional). +# The overall format is standard TOML format, v0.5.0. +# Note that there are a couple of TOML lists in this file. +# Find more information on toml format here: https://github.com/toml-lang/toml + +# The license for you mod. This is mandatory metadata and allows for easier comprehension of your redistributive properties. +# Review your options at https://choosealicense.com/. All rights reserved is the default copyright stance, and is thus the default here. +license="${mod_license}" + +# A URL to refer people to when problems occur with this mod +#issueTrackerURL="https://change.me.to.your.issue.tracker.example.invalid/" #optional + +# A list of mods - how many allowed here is determined by the individual mod loader +[[mods]] #mandatory + +# The modid of the mod +modId="${mod_id}" #mandatory + +# The version number of the mod +version="${mod_version}" #mandatory + +# A display name for the mod +displayName="${mod_name}" #mandatory + +# A URL to query for updates for this mod. See the JSON update specification https://docs.neoforged.net/docs/misc/updatechecker/ +#updateJSONURL="https://change.me.example.invalid/updates.json" #optional + +# A URL for the "homepage" for this mod, displayed in the mod UI +#displayURL="https://change.me.to.your.mods.homepage.example.invalid/" #optional + +# A file name (in the root of the mod JAR) containing a logo for display +#logoFile="examplemod.png" #optional + +# A text field displayed in the mod UI +#credits="" #optional + +# The authors of the mod, displayed in the mod UI (optional) +authors="OsCoder" + +# The description text for the mod (multi line!) (#mandatory) +description=''' +It's just for a tutorial. +''' + +# The [[mixins]] block allows you to declare your mixin config to FML so that it gets loaded. +[[mixins]] +config="${mod_id}.mixins.json" + +# The [[accessTransformers]] block allows you to declare where your AT file is. +# If this block is omitted, a fallback attempt will be made to load an AT from META-INF/accesstransformer.cfg +#[[accessTransformers]] +#file="META-INF/accesstransformer.cfg" + +# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional. +[[dependencies.${mod_id}]] #optional + # the modid of the dependency + modId="neoforge" #mandatory + # The type of the dependency. Can be one of "required", "optional", "incompatible" or "discouraged" (case insensitive). + # 'required' requires the mod to exist, 'optional' does not + # 'incompatible' will prevent the game from loading when the mod exists, and 'discouraged' will show a warning + type="required" #mandatory + # Optional field describing why the dependency is required or why it is incompatible + # reason="..." + # The version range of the dependency + versionRange="[${neo_version},)" #mandatory + # An ordering relationship for the dependency. + # BEFORE - This mod is loaded BEFORE the dependency + # AFTER - This mod is loaded AFTER the dependency + ordering="NONE" + # Side this dependency is applied on - BOTH, CLIENT, or SERVER + side="BOTH" + +# Here's another dependency +[[dependencies.${mod_id}]] + modId="minecraft" + type="required" + # This version range declares a minimum of the current minecraft version up to but not including the next major version + versionRange="${minecraft_version_range}" + ordering="NONE" + side="BOTH" + +# Features are specific properties of the game environment, that you may want to declare you require. This example declares +# that your mod requires GL version 3.2 or higher. Other features will be added. They are side aware so declaring this won't +# stop your mod loading on the server for example. +#[features.${mod_id}] +#openGLVersion="[3.2,)" |
