(最近研究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));
}
}
效果图就不放了,懒得录视频啦,有兴趣的话自己试试.

1506

被折叠的 条评论
为什么被折叠?



