wangmcptr
EntityDamageByEntityEvent e = new EntityDamageByEntityEvent()
getPluginManager().callEvent(e);
事情是这样的,我想对一个目标造成伤害,LivingEntity里有个damage方法,但是这个方法受攻击冷却影响,这其中可以把目标的受伤间隔调成0然后造成伤害后再改回来,但这个方法显得有些低端而且会扰乱普攻的冷却,所以想到了直接调用上面这个事件,但接下来如何造成伤害却不知道,我想反编译看看源码,但是试了几个反编译工具都反编译失败。
我能想到的是接下来用sethealth对目标造成伤害,但是正确的写法应该是什么,请大神指点,我用的是1.14.4版本。

a8105
第一种方式,使用setHealth,但前提是必须自己触发事件保证对其他插件的兼容,以确保不会出现这个插件无法被控制,无论是不是能造成伤害都造成伤害:
setHealth不会触发事件,因此
setHealth时先触发一次EntityDamageEvent,这样能保证兼容99%的伤害控制等等的插件,假设EntityDamageEvent被setCancelled了,不setHealth即可


但我更推荐第二种方法:

不需要你手动call EntityDamageByEntityEvent
可以被造成伤害的实体都会继承Damageable
先判断是否继承Damageable,如果是则强转
Damageable able=(Damageable)entity;
然后able.damage(你对这个实体造成的伤害值);
即可,该方法也会触发EntityDamageEvent等等事件,兼容性更好
假设你需要指定是谁对这个实体造成的伤害
则是:
able.damage(你对这个实体造成的伤害值,是哪个实体对这个实体造成伤害)
例如:
当一个玩家右键了一个僵尸
able=这个僵尸
player=这个玩家
able.damage(10,player);
则是玩家对这个僵尸造成了10伤害
有伤害来源时,这个方**额外触发EntityDamageByEntity等事件
但Damageable的damage方法造出的伤害不仅会被取消,还会被修改伤害
假设楼主需要写真实伤害等固定伤害不受任何加成,则推荐第一种方法,反之则第二种

wangmcptr
本帖最后由 wangmcptr 于 2019-9-19 15:58 编辑
a8105 发表于 2019-9-19 02:22
第一种方式,使用setHealth,但前提是必须自己触发事件保证对其他插件的兼容,以确保不会出现这个插件无法被控 ...

试了一下第二种方法,还是会受伤害间隔影响,我知道可以设置目标的setNoDamageTicks,但是经过测试,在连续普攻中夹杂这种方式的伤害会使普通次数明显高于正常的攻击次数,所以想问问有什么更好的方法吗,既能随时造成伤害,又不影响普攻给目标带来的短暂无敌时间。

下一页 最后一页