45 Strafe

    From Minecraft Parkour Wiki
    This page is a translated version of the page 45 Strafe and the translation is 100% complete.
    Other languages:

    45° Strafeとは、通常よりも高い速度を得られる技術である。

    前進キーとstrafeキーを入力し、45°方向を向くことで実行できる(名前の由来はそこから)。


    45° Strafeは以下のどちらでも可能:

    • 左45°に振り向き、右Strafeキーを入力。
    • 右45°に振り向き、左Strafeキーを入力。


    振り向きは素早く(1tick以内)かつ正確(誤差最大±11.5°、±0°に近いほど良い)でなければならないため、安定して実行するのは難しい。

    1bm 4.375bなど、45° strafeが必須のジャンプも存在する。



    動きへの影響

    毎tick、プレイヤーはキー入力などの要素に基づいた加速度を得る。

    • 正面に(strafe入力なしで)動いている場合、得られる加速度は倍になる。
    • strafe入力ありの場合、加速度は倍になる。

    よって、45° Strafeは通常の移動方法よりも倍(約2%)速い。


    特殊なケース: 45°スニーク

    • 正面に(strafe入力なしで)スニークしている場合、得られる加速度は倍になる。
    • strafe入力ありの場合、得られる加速度は(≒ 1.386)倍になる。

    45°スニークは助走なしジャンプに使用される()。

    通常のスニークよりも約41%速いため、bridgingなどアスレチック以外でも使用されている。



    解説

    以下は水平方向の移動に関するソースコードを簡略化したもの。

    /* 
     * EntityとEntityLivingBaseのソースコード
     * 不要、無関係な部分は削除済
     */
    
    public void onLivingUpdate()
    {
        /* 
         * moveStrafingとmoveForwardは相対的な動きを表す。
         * moveStrafing = 左に動いている場合1.0、右に動いている場合-1.0、それ以外は0.0。
         * moveForward = 前に動いている場合1.0、後ろに動いている場合-1.0、それ以外は0.0。
         *
         * 更に、スニークしている場合、moveStrafingとmoveForward *= 0.3。
         */
    
        this.moveStrafing *= 0.98F;
        this.moveForward *= 0.98F;
        this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
    }
    
    
    
    public void moveEntityWithHeading(float strafe, float forward)
    {
        /* 次tickに保持される速度は慣性によって決定される */
        float mult = 0.91F;
        if (this.onGround)
        {
            /* プレイヤーの1b下のブロックの滑りやすさを取得 */
            mult *= getBlockSlipperinessAt(this.posX, this.getEntityBoundingBox().minY - 1, this.posZ);
        }
    
        /* 加速度 = (0.6*0.91)^3 / (滑りやすさ*0.91)^3) */
        float acceleration = 0.16277136F / (mult * mult * mult);
    
        float movementFactor;
        if (this.onGround)
            movementFactor = this.landMovementFactor * acceleration;
            /* 基本加速度: 0.1; ダッシュしている場合x1.3で、ステータス効果の影響を受ける。 */
    
        else
            movementFactor = this.airMovementFactor; 
            /* 基本加速度: 0.02; ダッシュしている場合x1.3。 */
    
        this.updateMotionXZ(strafe, forward, movementFactor); 
        this.moveEntity(this.motionX, this.motionY, this.motionZ);
    
        this.motionY -= 0.08D; /* 重力 */
        this.motionY *= 0.98D; /* 抗力 */
    
        this.motionX *= mult;
        this.motionZ *= mult;
    }
    
    
    
    public void updateMotionXZ(float strafe, float forward, float movementFactor)
    {
        /*
         * この関数が45° strafeが存在する原因。この世界では幾何学には何の意味もない……。
         * 注:
         *     - ダッシュの倍率は「movementFactor」の中。
         *     - スニークの倍率は「strafe」と「forward」の中。
         * これは、スニークがダッシュより遥か以前に実装されたためと思われる。
         */
        float distance = strafe * strafe + forward * forward;
    
        if (distance >= 1.0E-4F)
        {
            distance = MathHelper.sqrt_float(distance);
                
            if (distance < 1.0F)
                distance = 1.0F;
    
            distance = movementFactor / distance;
            strafe = strafe * distance;
            forward = forward * distance;
            float sinYaw = MathHelper.sin(this.rotationYaw * Math.PI / 180.0F);
            float cosYaw = MathHelper.cos(this.rotationYaw * Math.PI / 180.0F);
            this.motionX += strafe * cosYaw - forward * sinYaw;
            this.motionZ += forward * cosYaw + strafe * sinYaw;
        }
    }