====== 添加附魔 ====== ===== 自 1.21 版本之后添加附魔 ===== 从 1.21 开始,附魔都是数据驱动的,这意味着你需要在数据包中定义,而不是在代码中。详情请见 [[https://zh.minecraft.wiki/w/魔咒数据格式|Minecraft Wiki 相关页面]]。 要在代码中使用这些附魔,只需要存在附魔的 ''RegistryKey'' 对象: public final class TutorialEnchantments { public static final RegistryKey FROST = of("frost"); private static RegistryKey of(String name) { return RegistryKey.of(RegistryKeys.ENCHANTMENT, Identifier.of("tutorial", name)); } public static void initialize() { } } 记得在你的 ''ModInitializer'' 中引用 ''initialize'' 方法。 public class ExampleMod implements ModInitializer { // [...] @Override public void onInitialize() { // [...] TutorialEnchantments.initialize(); } } 要为附魔添加翻译的名称,请看本教程底部。 ===== 在 1.21 版本之前添加附魔 ===== :!: 此部分教程仅适用于旧的 Minecraft 版本。 如果你想添加属于你的模组的附魔,你需要做以下事情: * 创建一个继承于 ''Enchantment'' 或者已经存在的任意一个附魔类(比如 ''DamageEnchantment'')的类 * 注册你的附魔 * 如果需要,添加自定义功能或机制 * 添加你的附魔的翻译 ((当你注册你的附魔的时候,你的附魔的所有等级的附魔书都会被自动添加到游戏当中。 附魔的翻译 (''enchantment.modid.enchantname'') 将会成为附魔书的名字。)) 附魔可以实现属于他自己的功能 (比如挖掘矿石后直接使其成为金属锭) 也可以使用现有的机制 (比如''DamageEnchantment''), 他们能在合适的时候被使用。 基础的 ''Enchantment'' 类也有几种方法可以创建功能, 比如 "打击敌人" 的方法. ==== 创建独特的附魔类 ==== 我们的新附魔就叫 //Frost// ,可以在击中敌人后让他们慢下来。 迟缓效果, 持续时间和效力等级会随着附魔等级的增长而增长。 在我们的附魔类当中, 我们设定 ''UNCOMMON'' 为附魔的稀有度, ''WEAPON'' 作为可被附魔的目标, 并且以 ''MAINHAND'' 作为我们附魔使用的有效环境。 public class FrostEnchantment extends Enchantment { public FrostEnchantment() { super(Enchantment.Rarity.UNCOMMON, EnchantmentTarget.WEAPON, new EquipmentSlot[] {EquipmentSlot.MAINHAND}); } } 我们现在将重写一些基本功能的基本方法: ''getMinPower'' 与在附魔台中的附魔权重有关, 但是他并不是 1:1 的比例。 大多数的附魔类的这项返回值会像是 ''10 * level'', 根据附魔的最高等级和稀有度有不同的等级。 我们会返回 1 所以他会一直是可用的。注意。附魔的默认最高力量是 ''min(level) + 5'', 意味着这个附魔只会出现非常低的等级。你将不得不自行调整附魔属性并查看类似的附魔值以找到最佳数值。 @Override public int getMinPower(int level) { return 1; } ''getMaxLevel'' 是附魔的最高等级。 锋利附魔的最高等级为 5. ((具有多个级别的附魔将在名称后使用罗马数字来显示级别。如果附魔只有一个级别,则不会添加任何内容。)) @Override public int getMaxLevel() { return 3; } 最后,我们需要在 ''onTargetDamage'' 方法中实现我们所需要的迟缓效果, 当你用附有这个附魔的武器击中目标的时候,目标会获得这个效果 @Override public void onTargetDamaged(LivingEntity user, Entity target, int level) { if(target instanceof LivingEntity) { ((LivingEntity) target).addStatusEffect(new StatusEffectInstance(StatusEffects.SLOWNESS, 20 * 2 * level, level - 1)); } super.onTargetDamaged(user, target, level); } 如果我们击中的实体可以有状态效果 (''LivingEntity''是可以有状态效果的, 但是不是 ''Entity''), 将会给实体迟缓效果。 效果持续时间为每级2秒,效力等同于等级。 ==== 注册你的附魔 ==== 注册附魔遵循与往常相同的过程: public class EnchantingExample implements ModInitializer { public static Enchantment FROST = new FrostEnchantment(); @Override public void onInitialize() { Registry.register(Registries.ENCHANTMENT, new Identifier("tutorial", "frost")) } } 这会在命名空间 ''tutorial:frost'' 下注册我们的附魔。所有非宝藏附魔都可以在附魔台中获得,包括你注册的附魔。 ===== 添加翻译 ===== =) 此部分在 1.21 之后和之前的版本都有效。 你还是需要像往常一样添加翻译。回到[[tutorial:lang|模组语言文件]]一节并且添加内容: { "enchantment.tutorial.frost": "Frost" } { "enchantment.tutorial.frost": "霜" } 当你在游戏内,[[https://i.imgur.com/31nFl2H.png|你的主手装备应当能被附魔并且可用。]]