tutorial:enchantments
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| tutorial:enchantments [2019/07/02 20:23] – finish up end of tut draylar | tutorial:enchantments [2024/08/23 13:52] (current) – [Adding Translations] solidblock | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Adding Enchantments ===== | + | ====== Adding Enchantments ====== |
| + | |||
| + | ===== Adding enchantments since 1.21 ===== | ||
| + | Since 1.21, enchantments has been data-driven, | ||
| + | |||
| + | To use the enchantments in code, you should just store '' | ||
| + | <code java TutorialEnchantments> | ||
| + | public final class TutorialEnchantments { | ||
| + | public static final RegistryKey< | ||
| + | |||
| + | private static RegistryKey< | ||
| + | return RegistryKey.of(RegistryKeys.ENCHANTMENT, | ||
| + | } | ||
| + | |||
| + | public static void initialize() { | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Remember to refer to the '' | ||
| + | <code java ExampleMod> | ||
| + | public class ExampleMod implements ModInitializer { | ||
| + | // [...] | ||
| + | |||
| + | @Override | ||
| + | public void onInitialize() { | ||
| + | // [...] | ||
| + | TutorialEnchantments.initialize(); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | To add a translated name for your enchantment, | ||
| + | |||
| + | ===== Adding enchantments before 1.21 ===== | ||
| + | :!: This part of the tutorial only applies to older Minecraft versions. | ||
| To add enchantments to your mod, you'll need to: | To add enchantments to your mod, you'll need to: | ||
| Line 7: | Line 42: | ||
| * add translations for your enchantment ((When you register enchantments, | * add translations for your enchantment ((When you register enchantments, | ||
| - | Enchantments can either have custom functionality implemented separately (such as smelting ores mined) or can use already existing mechanics (such as '' | + | Enchantments can either have custom functionality implemented separately (such as smelting ores mined) or can use already existing mechanics (such as '' |
| ==== Creating Enchantment Class ==== | ==== Creating Enchantment Class ==== | ||
| - | We'll be creating an enchantment called //Wrath//, which adds an extra 1.5 points of damage, per level, to a melee weapon. The easiest way to do this is by creating a class that extends | + | Our new enchantment |
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| - | public class WrathEnchantment | + | public class FrostEnchantment |
| - | { | + | public |
| - | public | + | super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] |
| - | | + | |
| - | super(weight, typeIndex, slots) | + | |
| - | } | + | |
| - | + | ||
| - | @Override | + | |
| - | public float getAttackDamage(int level, EntityGroup group) | + | |
| - | { | + | |
| - | // .... | + | |
| - | } | + | |
| - | + | ||
| - | @Override | + | |
| - | public int getMinimumPower(int int_1) | + | |
| - | | + | |
| - | // .... | + | |
| - | | + | |
| - | + | ||
| - | @Override | + | |
| - | public int getMaximumLevel() | + | |
| - | { | + | |
| - | // .... | + | |
| - | } | + | |
| - | + | ||
| - | @Override | + | |
| - | public boolean differs(Enchantment enchantment) | + | |
| - | { | + | |
| - | // .... | + | |
| } | } | ||
| } | } | ||
| </ | </ | ||
| - | '' | + | We will now override a few basic methods for basic functionality: |
| + | |||
| + | '' | ||
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| @Override | @Override | ||
| - | public | + | public |
| - | { | + | return 1; |
| - | return | + | |
| } | } | ||
| </ | </ | ||
| - | '' | + | '' |
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| @Override | @Override | ||
| - | public int getMinimumPower(int int_1) | + | public int getMaxLevel() { |
| - | { | + | return |
| - | return | + | |
| } | } | ||
| </ | </ | ||
| - | '' | + | Finally, we will implement our slowness effect in the '' |
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| @Override | @Override | ||
| - | public | + | public |
| - | { | + | |
| - | | + | livingEntity.addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, |
| + | | ||
| + | |||
| + | super.onTargetDamaged(user, | ||
| } | } | ||
| </ | </ | ||
| + | If the entity we are hitting can have status effects ('' | ||
| - | Finally, '' | + | The final enchantment file should look like this. |
| - | <code java [enable_line_numbers=" | + | <code java [enable_line_numbers=" |
| - | @Override | + | public class FrostEnchantment extends Enchantment { |
| - | public | + | public |
| - | { | + | super(Enchantment.Rarity.UNCOMMON, |
| - | return | + | } |
| + | |||
| + | @Override | ||
| + | public int getMinPower(int level) | ||
| + | return 1; | ||
| + | | ||
| + | |||
| + | @Override | ||
| + | public int getMaxLevel() { | ||
| + | | ||
| + | } | ||
| + | |||
| + | public void onTargetDamaged(LivingEntity user, Entity target, int level) { | ||
| + | if(target instanceof LivingEntity) { | ||
| + | ((LivingEntity) target).addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, | ||
| + | } | ||
| + | |||
| + | super.onTargetDamaged(user, | ||
| + | } | ||
| } | } | ||
| </ | </ | ||
| Line 84: | Line 115: | ||
| Registering enchantments follows the same process as usual: | Registering enchantments follows the same process as usual: | ||
| <code java [enable_line_numbers=" | <code java [enable_line_numbers=" | ||
| - | private | + | public class ExampleMod implements ModInitializer { |
| + | public | ||
| - | @Override | + | |
| - | public void onInitialize() | + | public void onInitialize() { |
| - | { | + | Registry.register(Registries.ENCHANTMENT, |
| - | WRATH = Registry.register( | + | |
| - | Registry.ENCHANTMENT, | + | |
| - | new Identifier(" | + | |
| - | new WrathEnchantment( | + | |
| - | Enchantment.Weight.VERY_RARE, | + | |
| - | 0, | + | |
| - | EquipmentSlot.MAINHAND | + | |
| - | ) | + | |
| - | | + | |
| } | } | ||
| </ | </ | ||
| + | > **Note:** In practice, if you have many enchantments, | ||
| - | This registers our enchantment under the namespace '' | + | This registers our enchantment under the namespace '' |
| + | |||
| + | ===== Adding Translations ===== | ||
| + | =) This part works both versions since 1.21 and before 1.21. | ||
| - | ==== Adding Translations & Testing ==== | ||
| You'll need to add a translation to your enchantment as well. Head over to your [[tutorial: | You'll need to add a translation to your enchantment as well. Head over to your [[tutorial: | ||
| - | <code json [enable_line_numbers=" | + | < |
| { | { | ||
| - | " | + | " |
| } | } | ||
| </ | </ | ||
| - | If you go in-game, you should be able to enchant main hand weapons with your new enchant: | + | If you go in-game, |
| + | |||
| - | {{: | ||
tutorial/enchantments.1562098982.txt.gz · Last modified: 2019/07/02 20:23 by draylar