【修改】在Minecraft中进行朝向所指方向瞬间传送【Mod】
假设在Minecraft的MOD中添加了一个能够进行传送的物品。Minecraft的世界是由方块组成的,这使得确定传送目的地的坐标变得困难。
在这里,以右键点击使用的传送物品“传送棒”为例进行说明。
使用getYRot()
由于存在一个以Y轴为轴的旋转角度获取方法getYRot,所以可以使用该方法。这是一种易于理解和简单的方法。
public class ItemWarpStick extends Item {
public ItemWarpStick() {
super(new Item.Properties().tab(CreativeModeTab.TAB_COMBAT));
}
public Vec3 toVec3(BlockPos pos) {
return new Vec3(pos.getX(), pos.getY(), pos.getZ());
}
@Override
public InteractionResultHolder<ItemStack> use(Level level, Player playerIn, InteractionHand handIn) {
BlockPos pos = playerIn.getOnPos();
float YRot = playerIn.getYRot() % 360;
if (YRot > 180) {
YRot -= 360;
}
if (YRot < -180) {
YRot += 360;
}
if (YRot <= 15.0f && YRot > -15.0f) {
playerIn.setPos(toVec3(pos).add(0, 1, 3));
} else if (YRot <= 45.0f && YRot > 15.0f) {
playerIn.setPos(toVec3(pos).add(-1, 1, 2));
} else if (YRot <= 75.0f && YRot > 45.0f) {
playerIn.setPos(toVec3(pos).add(-2, 1, 1));
} else if (YRot <= 105.0f && YRot > 75.0f) {
playerIn.setPos(toVec3(pos).add(-3, 1, 0));
} else if (YRot <= 135.0f && YRot > 105.0f) {
playerIn.setPos(toVec3(pos).add(-2, 1, -1));
} else if (YRot <= 165.0f && YRot > 135.0f) {
playerIn.setPos(toVec3(pos).add(-1, 1, -2));
} else if (YRot <= -135.0f && YRot > -165.0f) {
playerIn.setPos(toVec3(pos).add(0, 1, -3));
} else if (YRot <= -105.0f && YRot > -135.0f) {
playerIn.setPos(toVec3(pos).add(1, 1, -2));
} else if (YRot <= -75.0f && YRot > -105.0f) {
playerIn.setPos(toVec3(pos).add(2, 1, -1));
} else if (YRot <= -45.0f && YRot > -75.0f) {
playerIn.setPos(toVec3(pos).add(3, 1, 0));
} else if (YRot <= -15.0f && YRot > -45.0f) {
playerIn.setPos(toVec3(pos).add(2, 1, 1));
} else {
playerIn.setPos(toVec3(pos).add(1, 1, 2));
}
return super.use(level, playerIn, handIn);
}
}
还有其他人
还有其他使用向量、矩阵和四元数的方法可供考虑,但如果有兴趣的话,以后可以再讨论。