我们来实现之前的引爆附魔效果
可以看到,如果是引爆的近程武器,我们可以使用 AttackEntityEvent 或 LivingAttackEvent 来实现;如果是弓这个远程武器,我们可以用 LivingAttackEvent 或 ProjectileImpactEvent.Arrow 来实现。注意箭/火焰弹等远程武器不会触发 AttackEntityEvent。
Minecraft 中的爆炸使用 World 对象的
createExplosion(Entity entityIn, x, y, z, strength, boolean isSmoking)
实现。
此外,World 对象还有一个
newExplosion(Entity entityIn, x, y, z, strength, boolean isFlaming, boolean isSmoking)
方法,比上面的多了一个 isFlaming 参数,即爆炸是否产生火。而上面的那个方法即为 isFlaming=false 的情况。
EnchantmentHelper.getEnchantmentLevel(Enchantment enchID, ItemStack stack)
@SubscribeEvent
public static void onPlayerAttack(AttackEntityEvent event) {
Entity e = event.getTarget();
EntityPlayer player = event.getEntityPlayer();
if (!player.world.isRemote) {
if (EnchantmentHelper.getEnchantmentLevel(ElementLoader.ignite, player.getHeldItemMainhand()) == 1) {
player.world.createExplosion(player, e.posX, e.posY, e.posZ, 3.0f, true);
}
}
}
@SubscribeEvent
public static void onArrowAttack(ProjectileImpactEvent.Arrow event) {
EntityArrow e = event.getArrow();
if (!e.world.isRemote) {
if (e.shootingEntity instanceof EntityPlayer) {
EntityPlayer player = (EntityPlayer) e.shootingEntity;
if (EnchantmentHelper.getEnchantmentLevel(ElementLoader.ignite, player.getHeldItemMainhand()) != 0) {
e.world.createExplosion(null, e.posX, e.posY, e.posZ, 10.0f, true);
}
}
}
}
一些伤害类型可以直接使用 event.getSource()
获取伤害类型并与 DamageSource 中的常量进行比较,有些没有常量的伤害类型可以使用 event.getSource().getDamageType()
来获取伤害类型名称进行比较,名称可从 DamageSource 类中查看。其中远程武器比如弓箭等被定义为间接伤害,可以用 getTrueSource()
来获取射箭者实体。
未完待续......
Minecraft 1.12.2 Mod开发笔记——实践1:爆炸弓/引爆剑/手榴弹
原文:https://www.cnblogs.com/moonfan/p/12421704.html