Skip to content

Instantly share code, notes, and snippets.

@Iunius118
Last active July 4, 2024 13:04
Show Gist options
  • Save Iunius118/8c55146b3622006a7bfa1a3f1119cbd6 to your computer and use it in GitHub Desktop.
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
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