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
类(不需要一样,就和注册普通物品一样)中,
游戏内展示: