【修改】在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);
    }
}
undefined

还有其他人

还有其他使用向量、矩阵和四元数的方法可供考虑,但如果有兴趣的话,以后可以再讨论。

广告
将在 10 秒后关闭
bannerAds