从 1.21 开始,Minecraft 中的自定义魔咒通过“数据驱动”的方式添加。 这让添加一些简单的魔咒(如增加攻击伤害)变得更容易,但创建复杂的魔咒则更具挑战性。 这个过程包括将魔咒分解成 效果组件。
效果组件包含定义魔咒特殊效果的代码。 Minecraft 原版已支持一些默认效果,例如物品损害值、击退和经验。
TIP
来看看 Minecraft Wiki 的附魔效果组件页面,检查 Minecraft 默认效果是否满足你的需求。 本指南假定你了解如何配置“简单”的数据驱动魔咒,并侧重于创建默认不支持的自定义魔咒效果。
自定义魔咒效果
先创建 enchantment 文件夹,然后在里面创建 effect 文件夹。 在里面,创建记录类 LightningEnchantmentEffect。
现在,创建构造器,并覆盖 EnchantmentEntityEffect 接口的方法。 还要创建 CODEC 变量以编码解码我们的效果;可以了解更多关于 codec 的信息。
我们的大部分代码都将进入 apply() 事件,当魔咒生效的条件得到满足时,该事件就会被调用。 我们稍后会配置这个 Effect 以在实体被击中时调用,但现在,让我们编写简单的代码来实现用闪电击中目标。
java
public record LightningEnchantmentEffect(LevelBasedValue amount) implements EnchantmentEntityEffect {
public static final MapCodec<LightningEnchantmentEffect> CODEC = RecordCodecBuilder.mapCodec(instance ->
instance.group(
LevelBasedValue.CODEC.fieldOf("amount").forGetter(LightningEnchantmentEffect::amount)
).apply(instance, LightningEnchantmentEffect::new)
);
@Override
public void apply(ServerLevel serverLevel, int level, EnchantedItemInUse context, Entity target, Vec3 pos) {
if (target instanceof LivingEntity victim) {
if (context.owner() != null && context.owner() instanceof Player player) {
float numStrikes = this.amount.calculate(level);
for (float i = 0; i < numStrikes; i++) {
BlockPos position = victim.blockPosition();
EntityType.LIGHTNING_BOLT.spawn(serverLevel, position, EntitySpawnReason.TRIGGERED);
}
}
}
}
@Override
public MapCodec<? extends EnchantmentEntityEffect> codec() {
return CODEC;
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
这里,变量 amount 表示与附魔等级成比例的数值。 我们可以根据等级来修改魔咒的效果。 在上面的代码中,我们使用附魔的等级来决定生成多少闪电。
注册魔咒效果
就像我们的模组中的其他部分,我们将会把我们的 EnchantmentEffect 加入到 Minecraft 的注册表中。 为了实现这一点,添加一个叫做 ModEnchantmentEffects(或者你想叫什么就叫什么)的类,和一个辅助方法来注册我们的魔咒。 确保在你的主类中调用 registerModEnchantmentEffects() 方法,这个主类应该包含 onInitialize() 方法。
java
public class ModEnchantmentEffects {
public static MapCodec<LightningEnchantmentEffect> LIGHTNING_EFFECT = register("lightning_effect", LightningEnchantmentEffect.CODEC);
private static <T extends EnchantmentEntityEffect> MapCodec<T> register(String id, MapCodec<T> codec) {
return Registry.register(BuiltInRegistries.ENCHANTMENT_ENTITY_EFFECT_TYPE, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, id), codec);
}
public static void registerModEnchantmentEffects() {
ExampleMod.LOGGER.info("Registering EnchantmentEffects for" + ExampleMod.MOD_ID);
}
}1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
创建魔咒
现在我们有了一个魔咒效果! 最后一步是创建应用我们自定义的效果的魔咒。 我们可以使用数据驱动的魔咒系统来创建魔咒,只需要在我们的模组的资源中添加一个 JSON 文件即可。
在 data/example-mod/enchantments 创建 JSON 文件。 文件的名称就会是魔咒的 ID:thundering.json 就会是 example-mod:thundering。
对于这个例子,我们使用以下魔咒定义,添加 thundering 魔咒并使用我们自定义的 lightning_effect:
json
{
"anvil_cost": 5,
"description": {
"translate": "enchantment.example-mod.thundering"
},
"effects": {
"minecraft:post_attack": [
{
"affected": "victim",
"effect": {
"type": "example-mod:lightning_effect",
"amount": {
"type": "minecraft:linear",
"base": 0.4,
"per_level_above_first": 0.2
}
},
"enchanted": "attacker"
}
]
},
"max_cost": {
"base": 1,
"per_level_above_first": 15
},
"max_level": 3,
"min_cost": {
"base": 1,
"per_level_above_first": 10
},
"slots": [
"hand"
],
"supported_items": "#minecraft:enchantable/weapon",
"weight": 10
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
你需要在 en_us.json 以及 zh_cn.json 中给你的自定义魔咒一个可读的名字:
json
"enchantment.example-mod.thundering": "Thundering",1
现在你应该有了一个可以正常生效的自定义附魔效果! 附魔一个武器,然后攻击一个生物试试吧。 下面的视频里有一个例子:


