summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/de/oscoder/tutorialmod/Config.java42
-rw-r--r--src/main/java/de/oscoder/tutorialmod/TutorialMod.java71
-rw-r--r--src/main/java/de/oscoder/tutorialmod/TutorialModClient.java31
-rw-r--r--src/main/resources/assets/tutorialmod/lang/en_us.json13
-rw-r--r--src/main/resources/tutorialmod.mixins.json12
-rw-r--r--src/main/templates/META-INF/neoforge.mods.toml87
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,)"