Minecraft 1.18.2 Forge Mod 开发: 武器攻击敌人后瞬移到敌人后方的功能实现

(最近研究1.18.2的Mod开发,写笔记为了做新mod时候直接复制粘贴)
心血来潮,想实现一个攻击敌人后瞬移到敌人后方的武器和朋友pvp
总的来说,这个效果很容易实现.


在模组主类中,我们需要重写攻击事件

//攻击
@SubscribeEvent
public void attack(AttackEntityEvent e){
    Player player = e.getPlayer();//获取玩家
    Entity target = e.getTarget();//获取生物对象
    /* 在此处写额外效果代码 */
}

在以上写额外效果地方,我们加上一个武器判断

//手持特定武器打人则瞬移,这里 ItemInit.SPECIAL_SWORD.get() 换成其他的物品即可
Item specialSword = ItemInit.SPECIAL_SWORD.get();
//如果要检测副手手持
//可以通过player.getOffhandItem().is(specialSword)检测
if(player.getMainHandItem().is(specialSword)){
	/*瞬移效果实现的地方*/
}

随后,实现瞬移效果需要我们获取玩家以及目标的坐标

Vec3 playerPos = player.position();
Vec3 targetPos = target.position();

那么接下来,我们需要获取玩家到生物的方向向量,并计算出瞬移后的位置

/*
	targetPos.subtract(playerPos)
	计算得出玩家位置 (playerPos) 到目标位置 (targetPos) 的向量,
	然后用 normalize() 函数将其转换为单位向量。
	这样做可以保证这个向量表示的是一个方向,而不包含具体的距离信息
*/
Vec3 direction = targetPos.subtract(playerPos).normalize();
/*
	瞬移后的坐标计算:
	用得出的方向向量(即direction)
	乘以我们的距离向量(即new Vec3(0,0,3.5))
	(这个3.5可以自己调,几个参数是我这边调出来感觉还行的)
	然后得出移动的向量,
	再用add函数添加到攻击目标的坐标上,
	便计算出了瞬移到攻击目标身后一定距离的坐标位置
*/
Vec3 teleportLoc = targetPos.add(direction.multiply(new Vec3(0,0,3.5)));

最后一步,把玩家瞬移即可

player.moveTo(teleportLoc);

但是同时要记住调整玩家视角到生物上:

player.lookAt(
    EntityAnchorArgument.Anchor.EYES, 
    new Vec3(targetPos.x, 
             targetPos.y + target.getEyeHeight(), 
             targetPos.z)
);
/*
	通过EntityAnchorArgument.Anchor.EYES
	玩家的视线将会被定位到目标位置的眼睛高度,可以自己调
	Vec3是以准确地指向目标位置的头部附近的坐标
	(即攻击目标眼睛的位置)
	然后玩家世界将被调整到朝向这个坐标
*/

连在一起,最终代码就形成了:

//攻击
@SubscribeEvent
public void attack(AttackEntityEvent e){
    Player player = e.getPlayer();
    Entity target = e.getTarget();
    //判断武器
    Item specialSword = ItemInit.SPECIAL_SWORD.get();
    if(player.getMainHandItem().is(specialSword)){
        //计算瞬移坐标
        Vec3 playerPos = player.position();
        Vec3 targetPos = target.position();
        Vec3 direction = targetPos.subtract(playerPos).normalize();
        Vec3 teleportLoc = targetPos.add(direction.multiply(new Vec3(0,0,3.5)));
        //瞬移并将视角朝向生物
        player.moveTo(teleportLoc);
        player.lookAt(EntityAnchorArgument.Anchor.EYES,new Vec3(targetPos.x, targetPos.y + target.getEyeHeight(), targetPos.z));
    }
}

效果图就不放了,懒得录视频啦,有兴趣的话自己试试.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值