summaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorOsCoder <oscoder@lczimmermann.eu>2026-09-16 15:00:56 +0200
committerOsCoder <oscoder@lczimmermann.eu>2026-09-16 15:00:56 +0200
commitea71da9ccaa29adbaf1d2aff0196df898a271e45 (patch)
tree5b86201be9b281bc66bf1daa809b458922c3d3f2 /src/main/java
downloadtutorialmod-ea71da9ccaa29adbaf1d2aff0196df898a271e45.tar.xz
tutorialmod-ea71da9ccaa29adbaf1d2aff0196df898a271e45.zip
Initial Commit
Diffstat (limited to 'src/main/java')
-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
3 files changed, 144 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());
+ }
+}