如何让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
相关产品推荐
相关产品推荐

