Minecraft 1.12.2 Mod开发笔记——实践1:爆炸弓/引爆剑/手榴弹

时间:2020-03-05 19:04:18   收藏:0   阅读:184

实践1:爆炸弓/引爆剑/手榴弹

我们来实现之前的引爆附魔效果

有关攻击的事件

有关弓箭的事件

可以看到,如果是引爆的近程武器,我们可以使用 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)

通过 AttackEntityEvent 事件实现引爆在近战武器上的效果

@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);
        }
    }
}

通过 ProjectileImpactEvent.Arrow 事件实现爆炸弓

@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);
            }
        }
    }
}

通过 LivingAttackEvent 事件

一些伤害类型可以直接使用 event.getSource() 获取伤害类型并与 DamageSource 中的常量进行比较,有些没有常量的伤害类型可以使用 event.getSource().getDamageType() 来获取伤害类型名称进行比较,名称可从 DamageSource 类中查看。其中远程武器比如弓箭等被定义为间接伤害,可以用 getTrueSource() 来获取射箭者实体。

投掷物手榴弹

未完待续......

原文:https://www.cnblogs.com/moonfan/p/12421704.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!