
本文介绍在 Minecraft Forge 中实现“仅对近战攻击生效”的自定义附魔逻辑,通过重写 canApplyTogether 方法阻止其与箭类附魔共存,从而避免意外作用于弓箭射击。
本文介绍在 minecraft forge 中实现“仅对近战攻击生效”的自定义附魔逻辑,通过重写 `canapplytogether` 方法阻止其与箭类附魔共存,从而避免意外作用于弓箭射击。
在 Minecraft Forge 开发中,若你创建了一个类似“剧毒打击”的自定义附魔(例如击中实体时施加中毒效果),但发现它错误地作用于弓箭射击(如射出的箭也触发中毒),这通常是因为附魔未主动限制适用场景。与原版“火焰附加”(Fire Aspect)类似,真正的目标应是:仅在近战攻击(手持武器直接挥击)时生效,完全忽略远程攻击(包括弓、弩、三叉戟投掷等)。
关键在于理解 Forge 的附魔兼容性机制——canApplyTogether(Enchantment) 方法并非控制“何时触发效果”,而是决定“能否与其他附魔共存于同一物品”。因此,要禁用弓箭场景,我们不需修改攻击事件逻辑,而应阻止该附魔被附魔到弓上。因为弓本身必须搭配箭类附魔(如 EnchantmentArrowDamage)才能发挥远程功能;若你的附魔明确拒绝与所有箭类附魔共存,则 Forge 将自动禁止将其附魔至弓(或任何支持箭附魔的物品)。
以下是推荐的实现方式:
@Override
public boolean canApplyTogether(Enchantment ench) {
// 明确禁止与所有箭类附魔共存(涵盖弓的核心功能)
if (ench instanceof EnchantmentArrowDamage
|| ench instanceof EnchantmentArrowFire
|| ench instanceof EnchantmentArrowInfinite
|| ench instanceof EnchantmentArrowKnockback) {
return false;
}
return super.canApplyTogether(ench);
}✅ 为什么有效?
- 弓在附魔界面中必须至少拥有一个箭类附魔(如“力量”对应 EnchantmentArrowDamage)才被视为“可远程使用的弓”。
- 当玩家尝试将你的剧毒附魔与“力量 I”一同附到弓上时,canApplyTogether 返回 false,Forge 会直接禁用该组合,UI 中该附魔呈灰色不可选。
- 而剑、斧等近战武器不依赖箭类附魔,因此可正常附魔并触发效果。
⚠️ 注意事项:
- 此方法不阻止玩家用作弊指令强行赋予(如 /enchant @s yourmod:poison 1),如需彻底防御,应在 onEntityHit 事件中二次校验攻击类型(检查 LivingEntity.getMainHandItem().getItem() instanceof SwordItem 等)。
- 若未来 Minecraft 新增箭类附魔(如 EnchantmentArrowPiercing),请同步更新判断逻辑。
- 建议配合 getMinLevel() / getMaxLevel() 合理设置等级范围,并在 getRarity() 中返回 Rarity.UNCOMMON 或更高,以匹配平衡性设计。
总结:通过精准约束附魔兼容性,你既能复刻原版“火焰附加”的行为逻辑,又能保持代码简洁、性能高效,是 Forge 附魔开发中的最佳实践之一。

















