You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Minecraft Forge自定义中毒附魔仅近战生效,禁用弓效果?

解决自定义附魔仅对近战武器生效的问题

要让你的中毒附魔像火焰附加一样只作用于近战武器,需要从限制附魔适用范围和确保近战攻击才触发效果两个层面处理:

1. 限制附魔可应用的物品类型

火焰附加之所以不能附在弓上,核心是它重写了附魔类的canApply方法,限制仅对剑生效。你可以在自定义附魔类中做同样的处理,甚至扩展到斧等其他近战武器:

public class PoisonEnchantment extends Enchantment {
    // 构造方法等已省略
    @Override
    public boolean canApply(ItemStack stack) {
        // 只允许剑、斧类近战武器
        return stack.getItem() instanceof SwordItem || stack.getItem() instanceof AxeItem;
    }

    @Override
    public boolean canApplyAtEnchantingTable(ItemStack stack) {
        // 附魔台也遵循同样的规则
        return canApply(stack);
    }
}

如果要兼容更多自定义近战武器,推荐使用Minecraft的物品标签(Tag)来判断,比如:

@Override
public boolean canApply(ItemStack stack) {
    return stack.is(Tags.Items.SWORDS) || stack.is(Tags.Items.AXES);
}

2. 确保仅近战攻击触发效果

虽然限制了附魔范围,但玩家仍可通过指令将附魔强制加到弓上。因此需要在效果触发的逻辑中增加攻击类型判断:

假设你是通过LivingHurtEvent来触发中毒效果,修改监听逻辑如下:

@SubscribeEvent
public void onLivingHurt(LivingHurtEvent event) {
    DamageSource damageSource = event.getSource();
    Entity attacker = damageSource.getEntity();

    // 检查攻击者是否为持有近战武器的活体实体
    if (attacker instanceof LivingEntity livingAttacker) {
        ItemStack weapon = livingAttacker.getMainHandItem();
        // 验证武器是近战类型且带有你的自定义附魔
        if ((weapon.is(Tags.Items.SWORDS) || weapon.is(Tags.Items.AXES)) 
            && weapon.getEnchantmentLevel(PoisonEnchantment.INSTANCE) > 0) {
            // 触发中毒效果
            event.getEntity().addEffect(new EffectInstance(Effects.POISON, 200, 0));
        }
    }
}

这样无论通过何种方式将附魔加到非近战武器上,都不会触发效果,完全复刻火焰附加的生效逻辑。

内容的提问来源于stack exchange,提问作者Wes0_0

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:05:10