====== 添加附魔 ======
===== 自 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|你的主手装备应当能被附魔并且可用。]]