MineCraft 1.20.1模组开发-(1)-为蓝宝石剑添加右键发射凋零骷髅头以及攻击附加漂浮的效果

MineCraft 1.20.1模组开发-(1)-为蓝宝石剑添加右键发射凋零骷髅头以及攻击附加漂浮的效果

以下均为Forge开发,使用JAVA编写,IDE为IDEA,版本为1.20.1

功能:
1、实现蓝宝石剑(自定义武器)右键释放凋零骷髅头,花费一点耐久,冷却时间为2s
2、实现左键攻击给敌人附加2s的漂浮效果

可以模仿WitherBoss类中的erformRangedAttack函数~~以及ShieldItem(实现冷却时间)~~实现

首先来看看WitherBoss(凋零)类中是如何发射凋零骷髅的,可以通过输入WitherBoss然后按ctrl点击跳转

在这里插入图片描述

类似的,我们可以在自定义的剑的类中在右键use方法中使用,通过重写Item类中的use方法实现。

具体步骤:

  • 为了实现冷却时间效果,可查看Player中coolDown相关的信息->pPlayer.getCooldowns().addCooldown(this, 40);

  • 为了实现发射骷髅头的效果,首先需要先获取目标地点,可以通过pPlayer.getLookAngle()得到看的角度,getLookAngle能够获取看向地点的角度,大概是一个以xz为平面,y为纵轴的三维坐标系中的一个向量,直接乘上距离再加上位置即可获得目标位置,具体可以看源码以及使用数学去解一下。其次是召唤凋零骷髅,本质上其实是生成一个Entity对象,因此只需要模仿WitherBoss类中的实现即可.最后,需要为其生成音效以及减少耐久,具体可见下面的源码。

源代码SapphireSword

import xxx省略

public class SapphireSword extends SwordItem implements Vanishable{

    public SapphireSword(Tier pTier, int pAttackDamageModifier, float pAttackSpeedModifier, Properties pProperties) {
        super(pTier, pAttackDamageModifier, pAttackSpeedModifier, pProperties);
    }

    @Override
    public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List<Component> pTooltipComponents, TooltipFlag pIsAdvanced) {
        pTooltipComponents.add(
                Component.literal("右键").withStyle(ChatFormatting.RESET).withStyle(ChatFormatting.LIGHT_PURPLE)
                        .append(Component.literal("发射凋零骷髅头").withStyle(ChatFormatting.RESET)
                                .withStyle(ChatFormatting.DARK_GRAY).withStyle(ChatFormatting.BOLD)));
        pTooltipComponents.add(Component.literal("冷却时间2s,消耗1耐久")
                .withStyle(ChatFormatting.RESET).withStyle(ChatFormatting.AQUA));
        super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced);
    }


    //实现右键释放凋零骷髅,使用花费一点耐久,冷却时间为2s
    // 可以模仿WitherBoss类中的performRangedAttack函数以及ShieldItem(实现冷却时间)实现
    @Override
    public InteractionResultHolder<ItemStack> use(Level pLevel, Player pPlayer, InteractionHand pUsedHand) {
        if (!pLevel.isClientSide) {

            //设置冷却时间
            pPlayer.getCooldowns().addCooldown(this, 40);

            pLevel.levelEvent((Player) null, 1024, pPlayer.blockPosition().above(2), 0);
            //指定距离
            int distance = 20;
            //获取目标地点
            //getLookAngle能够获取看向地点的角度,大概是一个以xz为平面,y为纵轴的三维坐标系中的一个向量,直接乘上距离在加上位置
            //即可获得目标位置,具体可以看源码以及使用数学去解一下
            double targetX = pPlayer.position().x + pPlayer.getLookAngle().x * distance;
            double targetz = pPlayer.position().z + pPlayer.getLookAngle().z * distance;
            double targety = pPlayer.position().y + pPlayer.getLookAngle().y * distance;
            //获取眼睛前方一格的位置(起始地点)
            double eyePositionx = pPlayer.getEyePosition().x+pPlayer.getLookAngle().x * 1;
            double eyePositiony = pPlayer.getEyePosition().y+pPlayer.getLookAngle().y * 1;
            double eyePositionz = pPlayer.getEyePosition().z+pPlayer.getLookAngle().z * 1;
            //偏移量
            double d3 = targetX - eyePositionx;
            double d4 = targety - eyePositiony;
            double d5 = targetz - eyePositionz;
            WitherSkull witherskull = new WitherSkull(pLevel, pPlayer, d3, d4, d5);
            witherskull.setOwner(pPlayer);

            witherskull.setPosRaw(eyePositionx, eyePositiony, eyePositionz);
            pLevel.addFreshEntity(witherskull);
            //播放声音
            pLevel.playSound((Player) null, pPlayer.getX(), pPlayer.getY(), pPlayer.getZ(), SoundEvents.WITHER_SHOOT,
                    SoundSource.PLAYERS, 1.0F, 1.0F);

            //减少耐久
            ItemStack handItem;
            InteractionHand hand;
            if (pPlayer.getItemInHand(InteractionHand.MAIN_HAND).getItem() == ModItems.SAPPHIRE_SWORD.get()) {
                handItem = pPlayer.getItemInHand(InteractionHand.MAIN_HAND);
                hand = InteractionHand.MAIN_HAND;
            } else {
                handItem = pPlayer.getItemInHand(InteractionHand.OFF_HAND);
                hand = InteractionHand.OFF_HAND;
            }
            handItem.hurtAndBreak(1, pPlayer
                    , player1 -> player1.broadcastBreakEvent(hand));
        }

        return InteractionResultHolder.pass(pPlayer.getItemInHand(pUsedHand));
    }

    //实现攻击附加漂浮效果
    @Override
    public boolean hurtEnemy(ItemStack pStack, LivingEntity pTarget, LivingEntity pAttacker) {
        pTarget.addEffect(new MobEffectInstance(MobEffects.LEVITATION,40));
        return super.hurtEnemy(pStack, pTarget, pAttacker);
    }
}


实现功能二:添加漂浮效果
只需要重写hurtEnemy方法即可

    //实现攻击附加漂浮效果
    @Override
    public boolean hurtEnemy(ItemStack pStack, LivingEntity pTarget, LivingEntity pAttacker) {
        pTarget.addEffect(new MobEffectInstance(MobEffects.LEVITATION,40));
        return super.hurtEnemy(pStack, pTarget, pAttacker);
    }
  • 完成函数编辑后,将其注入到ModItem类(不需要一样,就和注册普通物品一样)中,
    在这里插入图片描述

游戏内展示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值