Last active
July 4, 2024 13:04
-
-
Save Iunius118/8c55146b3622006a7bfa1a3f1119cbd6 to your computer and use it in GitHub Desktop.
Example mod to add an enchantment for Forge 1.21-51.0.21
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.example.examplemod; | |
import com.mojang.logging.LogUtils; | |
import net.minecraft.Util; | |
import net.minecraft.core.HolderGetter; | |
import net.minecraft.core.HolderLookup; | |
import net.minecraft.core.RegistrySetBuilder; | |
import net.minecraft.core.registries.Registries; | |
import net.minecraft.data.DataGenerator; | |
import net.minecraft.data.PackOutput; | |
import net.minecraft.resources.ResourceKey; | |
import net.minecraft.resources.ResourceLocation; | |
import net.minecraft.tags.EnchantmentTags; | |
import net.minecraft.tags.ItemTags; | |
import net.minecraft.world.entity.EquipmentSlotGroup; | |
import net.minecraft.world.item.Item; | |
import net.minecraft.world.item.enchantment.Enchantment; | |
import net.minecraft.world.item.enchantment.EnchantmentEffectComponents; | |
import net.minecraft.world.item.enchantment.Enchantments; | |
import net.minecraft.world.item.enchantment.LevelBasedValue; | |
import net.minecraft.world.item.enchantment.effects.AddValue; | |
import net.minecraftforge.common.MinecraftForge; | |
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider; | |
import net.minecraftforge.common.data.LanguageProvider; | |
import net.minecraftforge.data.event.GatherDataEvent; | |
import net.minecraftforge.event.server.ServerStartingEvent; | |
import net.minecraftforge.eventbus.api.IEventBus; | |
import net.minecraftforge.eventbus.api.SubscribeEvent; | |
import net.minecraftforge.fml.common.Mod; | |
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; | |
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; | |
import org.slf4j.Logger; | |
import java.util.Set; | |
import java.util.concurrent.CompletableFuture; | |
// The value here should match an entry in the META-INF/mods.toml file | |
@Mod(ExampleMod.MODID) | |
public final class ExampleMod | |
{ | |
// Define mod id in a common place for everything to reference | |
public static final String MODID = "examplemod"; | |
// Directly reference a slf4j logger | |
private static final Logger LOGGER = LogUtils.getLogger(); | |
// Create a new enchantment resource key with the id "examplemod:example_enchantment" | |
public static final ResourceKey<Enchantment> EXAMPLE_ENCHANTMENT = ResourceKey.create(Registries.ENCHANTMENT, ResourceLocation.fromNamespaceAndPath(MODID, "example_enchantment")); | |
public ExampleMod() | |
{ | |
IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); | |
// Register the commonSetup method for modloading | |
modEventBus.addListener(this::commonSetup); | |
// Register the gatherData method for modloading | |
modEventBus.addListener(this::gatherData); | |
// Register ourselves for server and other game events we are interested in | |
MinecraftForge.EVENT_BUS.register(this); | |
} | |
private void commonSetup(final FMLCommonSetupEvent event) | |
{ | |
// Some common setup code | |
LOGGER.info("HELLO FROM COMMON SETUP"); | |
} | |
private void gatherData(GatherDataEvent event) | |
{ | |
DataGenerator gen = event.getGenerator(); | |
PackOutput packOutput = gen.getPackOutput(); | |
// Add a provider to generate enchantment data | |
DatapackBuiltinEntriesProvider builtinEntriesProvider = new DatapackBuiltinEntriesProvider(packOutput, event.getLookupProvider(), getEntriesBuilder(), Set.of(MODID)); | |
gen.addProvider(event.includeServer(), builtinEntriesProvider); | |
CompletableFuture<HolderLookup.Provider> lookupProvider = builtinEntriesProvider.getFullRegistries(); | |
// Add a language provider | |
LanguageProvider languageProvider = new LanguageProvider(packOutput, MODID, "en_us") { | |
@Override | |
protected void addTranslations() { | |
// Add localized name to Example Enchantment | |
add(Util.makeDescriptionId("enchantment", EXAMPLE_ENCHANTMENT.location()), "Example Enchantment"); | |
} | |
}; | |
gen.addProvider(event.includeClient(), languageProvider); | |
} | |
private RegistrySetBuilder getEntriesBuilder() | |
{ | |
RegistrySetBuilder.RegistryBootstrap<Enchantment> enchantmentRegistryBootstrap = bootstrapContext -> { | |
HolderGetter<Item> itemGetter = bootstrapContext.lookup(Registries.ITEM); | |
HolderGetter<Enchantment> enchantmentGetter = bootstrapContext.lookup(Registries.ENCHANTMENT); | |
// Create a new enchantment | |
Enchantment exampleEnchantment = Enchantment.enchantment( | |
Enchantment.definition( | |
itemGetter.getOrThrow(ItemTags.SHARP_WEAPON_ENCHANTABLE), | |
itemGetter.getOrThrow(ItemTags.SWORD_ENCHANTABLE), | |
10, 5, Enchantment.dynamicCost(1, 11), Enchantment.dynamicCost(21, 11), 1, | |
EquipmentSlotGroup.MAINHAND) | |
) | |
.exclusiveWith(enchantmentGetter.getOrThrow(EnchantmentTags.DAMAGE_EXCLUSIVE)) | |
.withEffect(EnchantmentEffectComponents.DAMAGE, new AddValue(LevelBasedValue.perLevel(1.0F, 0.5F))) | |
.build(EXAMPLE_ENCHANTMENT.location()); | |
// Register the enchantment to the bootstrap context | |
bootstrapContext.register(EXAMPLE_ENCHANTMENT, exampleEnchantment); | |
}; | |
return new RegistrySetBuilder().add(Registries.ENCHANTMENT, enchantmentRegistryBootstrap); | |
} | |
// 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"); | |
event.getServer().registryAccess().registryOrThrow(Registries.ENCHANTMENT).registrationInfo(Enchantments.SHARPNESS) | |
.ifPresent(info -> LOGGER.info("SHARPNESS >> {}", info)); | |
event.getServer().registryAccess().registryOrThrow(Registries.ENCHANTMENT).registrationInfo(EXAMPLE_ENCHANTMENT) | |
.ifPresent(info -> LOGGER.info("EXAMPLE ENCHANTMENT >> {}", info)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment