问题描述:游戏内所有的武器,空手攻击都不能造成伤害了,武器上的附魔效果正常
版本:1.12.2
是不是我搞错了什么...
我写的附魔效果是 攻击生物后有概率雷击该生物 运行逻辑是 通过监听LivingAttackEvent事件,来判断攻击者手上的武器是否有该附魔,然后执行概率雷击
事件类的代码
附魔类的代码
版本:1.12.2
是不是我搞错了什么...
我写的附魔效果是 攻击生物后有概率雷击该生物 运行逻辑是 通过监听LivingAttackEvent事件,来判断攻击者手上的武器是否有该附魔,然后执行概率雷击
事件类的代码
@SubscribeEvent
public static void OnPlayerAttack(LivingAttackEvent event)
{
Entity source = event.getSource().getImmediateSource();
if (source instanceof EntityPlayer && !source.world.isRemote)
{
EntityPlayer player = (EntityPlayer) source;
ItemStack heldItemMainhand = player.getHeldItemMainhand();
int level =
EnchantmentHelper.getEnchantmentLevel(EnchantmentRegistryHandler.ATTRACT_LIGHTNING, heldItemMainhand);
if (level > 0)
{
int probability = 5 + level * 5;
int randomInt = RandomUtils.nextInt(0, 100);
if (randomInt <= probability)
{
Entity target = event.getEntity();
target.getEntityWorld().addWeatherEffect(new EntityLightningBolt(target.getEntityWorld(), target.posX, target.posY,
target.posZ, false));
}
}
}
if (source instanceof EntityLivingBase && !source.world.isRemote)
{
EntityPlayer Player =(EntityPlayer) event.getEntity();
ItemStack ChestItem = Player.getItemStackFromSlot(EntityEquipmentSlot.CHEST);
int level =
EnchantmentHelper.getEnchantmentLevel(EnchantmentRegistryHandler.FIRE_CHEST,
ChestItem);
if (level>0)
{
source.setFire(3);
}
}
}
public class EnchantmentAttractLightning extends Enchantment
{
public EnchantmentAttractLightning()
{
super(Enchantment.Rarity.RARE, EnumEnchantmentType.WEAPON,new EntityEquipmentSlot[] {EntityEquipmentSlot.MAINHAND});
this.setName(AlphaMod.MODID+".attract_lightning");
this.setRegistryName("attractLightning");
}
@Override
public int getMaxLevel(){return 3;}
@Override
public int getMinEnchantability(int enchantmentLevel){return 16 + enchantmentLevel * 5;}
@Override
public int getMaxEnchantability(int enchantmentLevel){return 25 + enchantmentLevel * 5;}
}
 本帖最后由 道家深湖 于 2021-10-8 10:39 编辑 
我阅读了你的代码,虽然这里面有一些错误,但是并不能确定是他们造成的攻击无效。先修正这些错误。
如果还不行,
检查你是否在其他地方也写了订阅这个事件的东西,造成了影响。
你把这些订阅分别注释掉,再试,看看是不是其他的订阅也写错了。
另外,注意观察控制台报错。不是只有崩溃了控制台才会提供报错信息。
首先
复制代码错误,应为
复制代码前者是射箭时的箭矢之类的,后者才是箭矢的射出者。多数时候,你都需要检查true source。
第二个附魔,火焰箱子还是什么的,意思是玩家拿着箱子被揍时,如果手里拿着箱子,就会给攻击者点火是吧。其中的
复制代码错误
你没有判断event.getEntity()是不是player就强制转换,会崩。你前面那个都知道判断了,怎么到这就不判断了。如果forge catch了异常,结果就是攻击不正常(或者失灵);如果forge没catch,那么当有东西打一个不是玩家的生物时直接闪退。
  
后面关于注册的事,我建议你把你的翻译名和注册名统一一下,一个attract_lighting,一个attractLightning,后面多了容易把你自己搞晕。这倒不是什么严重的问题,单纯是规范的事。
再者,你对于bbs的使用也不太对。这种情况下贴代码要使用“代码块”而不是“引用”。你使用了“引用”,结果就是行距贼大,阅读很困难。
关于引雷附魔,我恰好有个教程,供你参考。
https://www.bilibili.com/video/BV1Ar4y1K7Qk?p=8
我阅读了你的代码,虽然这里面有一些错误,但是并不能确定是他们造成的攻击无效。先修正这些错误。
如果还不行,
检查你是否在其他地方也写了订阅这个事件的东西,造成了影响。
你把这些订阅分别注释掉,再试,看看是不是其他的订阅也写错了。
另外,注意观察控制台报错。不是只有崩溃了控制台才会提供报错信息。
首先
- event.getSource().getImmediateSource();
- event.getSource().getTrueSource();
第二个附魔,火焰箱子还是什么的,意思是玩家拿着箱子被揍时,如果手里拿着箱子,就会给攻击者点火是吧。其中的
- EntityPlayer Player =(EntityPlayer) event.getEntity();
你没有判断event.getEntity()是不是player就强制转换,会崩。你前面那个都知道判断了,怎么到这就不判断了。如果forge catch了异常,结果就是攻击不正常(或者失灵);如果forge没catch,那么当有东西打一个不是玩家的生物时直接闪退。
后面关于注册的事,我建议你把你的翻译名和注册名统一一下,一个attract_lighting,一个attractLightning,后面多了容易把你自己搞晕。这倒不是什么严重的问题,单纯是规范的事。
再者,你对于bbs的使用也不太对。这种情况下贴代码要使用“代码块”而不是“引用”。你使用了“引用”,结果就是行距贼大,阅读很困难。
关于引雷附魔,我恰好有个教程,供你参考。
https://www.bilibili.com/video/BV1Ar4y1K7Qk?p=8