内置附魔效果组件(Built-In Enchantment Effect Components)
内置附魔效果组件(Built-In Enchantment Effect Components)
Minecraft 原版提供了多种不同类型的附魔效果组件,用于附魔定义。本文将解释每种组件的用途及其代码定义。
值效果组件(Value Effect Components)
值效果组件用于修改游戏中某个数值的附魔,由 EnchantmentValueEffect
类实现。如果一个值被多个值效果组件修改(例如多个附魔),所有效果都会叠加。
值效果组件可以使用以下操作来修改给定的值:
-
minecraft:set
: 覆盖给定的基于等级的值。 -
minecraft:add
: 将指定的基于等级的值添加到旧值上。 -
minecraft:multiply
: 将指定的基于等级的系数乘以旧值。 -
minecraft:remove_binomial
: 使用二项分布对给定的(基于等级的)概率进行采样。如果成功,则从值中减去 1。注意,许多值实际上是标志,1 表示完全开启,0 表示完全关闭。 -
minecraft:all_of
: 接受一个值效果列表,并按顺序应用它们。
例如,锋利(Sharpness) 附魔使用 minecraft:damage
值效果组件来实现其效果:
"effects": {
// 该效果组件的类型为 "minecraft:damage"。
// 这意味着效果将修改武器伤害。
"minecraft:damage": [
{
// 要应用的值效果。
"effect": {
// 值效果的类型。此处为 "minecraft:add",因此值(见下文)将添加到武器伤害值上。
"type": "minecraft:add",
// 值块。此处值为 LevelBasedValue,初始为 1,每级增加 0.5。
"value": {
"type": "minecraft:linear",
"base": 1.0,
"per_level_above_first": 0.5
}
}
}
]
}
value
块中的对象是一个 LevelBasedValue
,可用于使值效果组件的效果强度随等级变化。
EnchantmentValueEffect#process
方法可用于根据提供的数值操作调整值,例如:
// `valueEffect` 是一个 EnchantmentValueEffect 实例。
// `enchantLevel` 是表示附魔等级的整数。
float baseValue = 1.0;
float modifiedValue = valueEffect.process(enchantLevel, server.random, baseValue);
原版附魔值效果组件类型
定义为 DataComponentType<EnchantmentValueEffect>
-
minecraft:crossbow_charge_time
: 修改弩的蓄力时间(秒)。用于快速装填(Quick Charge) 。 -
minecraft:trident_spin_attack_strength
: 修改三叉戟旋转攻击的“强度”(见TridentItem#releaseUsing
)。用于激流(Riptide) 。
定义为 DataComponentType<List<ConditionalEffect<EnchantmentValueEffect>>>
护甲相关:
-
minecraft:armor_effectiveness
: 决定护甲对武器的有效性,范围为 0(无保护)到 1(正常保护)。用于穿透(Breach) 。 -
minecraft:damage_protection
: 每点伤害减免减少 4% 的伤害,最多减免 80%。用于爆炸保护(Blast Protection) 、摔落保护(Feather Falling) 、火焰保护(Fire Protection) 、保护(Protection)和弹射物保护(Projectile Protection) 。
-
攻击相关:
-
minecraft:damage
: 修改武器的攻击伤害。用于锋利(Sharpness) 、穿刺(Impaling) 、节肢杀手(Bane of Arthropods) 、力量(Power)和亡灵杀手(Smite) 。 -
minecraft:smash_damage_per_fallen_block
: 为锤子增加每下落一个方块的伤害。用于密度(Density) 。 -
minecraft:knockback
: 修改武器造成的击退距离(以游戏单位计)。用于击退(Knockback)和冲击(Punch) 。 -
minecraft:mob_experience
: 修改击杀生物获得的经验值。未使用。
-
耐久相关:
-
minecraft:item_damage
: 修改物品的耐久损耗。值小于 1 时表示物品有概率不损耗耐久。用于耐久(Unbreaking) 。 -
minecraft:repair_with_xp
: 使物品通过经验修复,并决定修复效果。用于经验修补(Mending) 。
-
弹射物相关:
-
minecraft:ammo_use
: 修改弓或弩发射时消耗的弹药量。值被限制为整数,小于 1 时表示不消耗弹药。用于无限(Infinity) 。 -
minecraft:projectile_piercing
: 修改武器发射的弹射物穿透的实体数量。用于穿透(Piercing) 。 -
minecraft:projectile_count
: 修改弓发射时生成的弹射物数量。用于多重射击(Multishot) 。 -
minecraft:projectile_spread
: 修改弹射物发射时的最大散布角度(度)。用于多重射击(Multishot) 。 -
minecraft:trident_return_acceleration
: 使三叉戟返回持有者,并修改返回时的加速度。用于忠诚(Loyalty) 。
-
其他:
-
minecraft:block_experience
: 修改破坏方块获得的经验值。用于精准采集(Silk Touch) 。 -
minecraft:fishing_time_reduction
: 减少钓鱼时浮标下沉所需的时间(秒)。用于海之眷顾(Lure) 。 -
minecraft:fishing_luck_bonus
: 修改钓鱼战利品表中使用的幸运值。用于海之眷顾(Luck of the Sea) 。
-
定义为 DataComponentType<List<TargetedConditionalEffect<EnchantmentValueEffect>>>
-
minecraft:equipment_drops
: 修改被该武器击杀的生物掉落装备的概率。用于抢夺(Looting) 。
基于位置的效果组件(Location Based Effect Components)
基于位置的效果组件实现了 EnchantmentLocationBasedEffect
。这些组件定义了需要知道附魔持有者在世界中位置的操作。它们使用两个主要方法:EnchantmentEntityEffect#onChangedBlock
(在附魔物品被装备或持有者位置变化时调用)和 onDeactivate
(在附魔物品被移除时调用)。
以下示例使用 minecraft:attributes
基于位置的效果组件类型来修改持有者的实体大小:
"minecraft:attributes": [
{
// "amount" 块是一个 LevelBasedValue。
"amount": {
"type": "minecraft:linear",
"base": 1,
"per_level_above_first": 1
},
// 要修改的属性。此处为 "minecraft:scale"。
"attribute": "minecraft:generic.scale",
// 该属性修饰符的唯一标识符。不应与其他修饰符重叠,但无需注册。
"id": "examplemod:enchantment.size_change",
// 对属性使用的操作。可以是 "add_value"、"add_multiplied_base" 或 "add_multiplied_total"。
"operation": "add_value"
}
]
原版添加了以下基于位置的事件:
-
minecraft:all_of
: 按顺序运行一系列实体效果。 -
minecraft:apply_mob_effect
: 对受影响的生物应用状态效果。 -
minecraft:attribute
: 对附魔持有者应用属性修饰符。 -
minecraft:damage_entity
: 对受影响的实体造成伤害。如果在攻击上下文中,则与攻击伤害叠加。 -
minecraft:damage_item
: 损耗物品的耐久。 -
minecraft:explode
: 召唤爆炸。 -
minecraft:ignite
: 点燃实体。 -
minecraft:play_sound
: 播放指定的声音。 -
minecraft:replace_block
: 替换给定偏移处的方块。 -
minecraft:replace_disk
: 替换一个方块圆盘。 -
minecraft:run_function
: 运行指定的数据包函数。 -
minecraft:set_block_properies
: 修改指定方块的方块状态属性。 -
minecraft:spawn_particles
: 生成粒子。 -
minecraft:summon_entity
: 召唤实体。
实体效果组件(Entity Effect Components)
实体效果组件实现了 EnchantmentEntityEffect
,是 EnchantmentLocationBasedEffect
的子类型。这些组件重写 EnchantmentLocationBasedEffect#onChangedBlock
以运行 EnchantmentEntityEffect#apply
;此 apply
方法也会在代码库的其他地方直接调用,具体取决于组件的类型。这使得效果可以在不等待持有者位置变化的情况下发生。
所有基于位置的效果组件类型也适用于实体效果组件,除了 minecraft:attribute
,它仅注册为基于位置的效果组件。
以下示例展示了火焰附加(Fire Aspect) 附魔的 JSON 定义:
"minecraft:post_attack": [
{
// 决定攻击的“受害者”、“攻击者”或“伤害实体”(如果有弹射物则为弹射物,否则为攻击者)是否受到效果影响。
"affected": "victim",
// 决定应用哪种实体效果。
"effect": {
// 该效果的类型为 "minecraft:ignite"。
"type": "minecraft:ignite",
// "minecraft:ignite" 需要一个 LevelBasedValue 作为实体被点燃的持续时间。
"duration": {
"type": "minecraft:linear",
"base": 4.0,
"per_level_above_first": 4.0
}
},
// 决定谁(“受害者”、“攻击者”或“伤害实体”)必须拥有附魔才能生效。
"enchanted": "attacker",
// 可选的条件,控制效果是否生效。
"requirements": {
"condition": "minecraft:damage_source_properties",
"predicate": {
"is_direct": true
}
}
}
]
其他原版附魔组件类型
-
minecraft:damage_immunity
: 对指定伤害类型应用免疫。用于冰霜行者(Frost Walker) 。 -
minecraft:prevent_equipment_drop
: 防止玩家死亡时掉落该物品。用于消失诅咒(Curse of Vanishing) 。 -
minecraft:prevent_armor_change
: 防止从护甲槽中卸下该物品。用于绑定诅咒(Curse of Binding) 。 -
minecraft:crossbow_charge_sounds
: 决定弩蓄力时的音效事件。每个条目代表附魔的一个等级。 -
minecraft:trident_sound
: 决定使用三叉戟时的音效事件。每个条目代表附魔的一个等级。
更多详细信息,请参阅 Minecraft Wiki 的相关页面。