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



    • ブロックに埋まる。
    • ボートにぶつかる。
    • クモの巣の中で素早く移動する。
    • 充分な速度で、スニークしながら着地する。
    • stepping発動可能なブロックを、超高速(移動速度上昇100など)で通り抜ける。
    • 壁に向かって素早く移動する。



    • 当たり判定と重なる(ブロックに埋まる、ボートにぶつかるなど)。
    • 不正に」移動する。




    • 着地時にonGroundフラグがtrueに設定される(スニークの挙動が変わる)。
    • クモの巣に接触時にinWebフラグがfalseに設定される。
    • 壁や天井に衝突時に各種collidedフラグがtrueに設定される。










    • 水平方向に0.25m/tより高い速度で移動している。
    • 着地1tick前に地面の最低1ブロック上にいる(1.11+では0.6b)。

    You are not required to time the sneak exactly, but sneaking too early will significantly reduce the player's horizontal speed.

    The minimum jump height required to achieve at least -1m/t of vertical speed is -7.3125b. An easy setup to try this method is -9.5b. Here is an example:

    Sneak Glitch

    A sneak glitch (or shift glitch) happens when the player sneaks while landing on an edge, which causes them to fall anyway (this was fixed in 1.16.2).

    When performing a sneak glitch, the server's expected movement for the player is different from their actual movement. Here's why:

    • During the original calculation, the player is sneaking but not "on ground", hence they move past the edge. However, they still land, which sets onGround = true.
    • During the recalculation, the player is now considered "on ground" before actually landing, which changes the behaviour of sneaking: they can not "fall off the edge", despite not being at ground level.

    With at least 0.25m/t of horizontal speed and appropriate placement, performing a sneak glitch can therefore trigger a lagback. After being teleported back to their previous position, the player is now able to jump. The resulting jump looks similar to a blip-up, in the sense that the player can start jumping mid-air. Here is an example:

    Some jump heights do not work. This is still being investigated.


    In singleplayer, lagbacks are caused by this section of code (heavily simplified, we ignore exceptional cases such as flying, sleeping, teleporting, respawning, mounting an entity...):
    public void processPlayer(PacketPlayer packetIn)
        double posY_original = this.playerEntity.posY;
        this.lastPosX = this.playerEntity.posX;
        this.lastPosY = this.playerEntity.posY;
        this.lastPosZ = this.playerEntity.posZ;
        double next_posX = packetIn.getPositionX();
        double next_posY = packetIn.getPositionY();
        double next_posZ = packetIn.getPositionZ();
        float yaw = this.playerEntity.rotationYaw;
        float pitch = this.playerEntity.rotationPitch;
        if (packetIn.getRotating()) {yaw = packetIn.getYaw(); pitch = packetIn.getPitch();}
        <div lang="en" dir="ltr" class="mw-content-ltr">
    //checks whether the player is starting from inside a collision box: in this case, there is no lagback
        boolean noCollisionInside = worldserver.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.getEntityBoundingBox().contract(0.0625, 0.0625, 0.0625).isEmpty();
        <div lang="en" dir="ltr" class="mw-content-ltr">
    //begin movement verification
        double deltaX = next_posX - this.playerEntity.posX;
        double deltaY = next_posY - this.playerEntity.posY;
        double deltaZ = next_posZ - this.playerEntity.posZ;
        <div lang="en" dir="ltr" class="mw-content-ltr">
    if (this.playerEntity.onGround && !packetIn.isOnGround() && deltaY > 0.0)
        this.playerEntity.moveEntity(deltaX, deltaY, deltaZ);
        this.playerEntity.onGround = packetIn.isOnGround();
        //calculates error between the expected and actual positions
        double errorX = next_posX - this.playerEntity.posX;
        double errorZ = next_posZ - this.playerEntity.posZ;
        double error_squared = errorX * errorX + errorZ * errorZ;
        boolean movedWrongly = (error_squared > 0.0625 && !this.playerEntity.theItemInWorldManager.isCreative());
        <div lang="en" dir="ltr" class="mw-content-ltr">
    //sets the player to their actual position, and checks for collisions
        this.playerEntity.setPositionAndRotation(next_posX, next_posY, next_posZ, yaw, pitch);
        boolean next_noCollisionInside = worldserver.getCollidingBoundingBoxes(this.playerEntity, this.playerEntity.getEntityBoundingBox().contract(0.0625, 0.0625, 0.0625).isEmpty();
        <div lang="en" dir="ltr" class="mw-content-ltr">
    //detects an error: player moved wrongly, or moved inside a collision box
        if (noCollisionInside && (movedWrongly || !next_noCollisionInside))
            //lags the player back to their previous position
            this.setPlayerLocation(this.lastPosX, this.lastPosY, this.lastPosZ, yaw, pitch);
        <div lang="en" dir="ltr" class="mw-content-ltr">
    this.playerEntity.handleFalling(this.playerEntity.posY - posY_original, packetIn.isOnGround());
    Note that the handling of fall damage is not processed if the player gets lagbacked. This may cause the player to suffer unexpectedly high fall damage when they eventually land. Since 1.15 (when the boat fall damage bug was fixed), jumping resets the player's fall distance, which can be abused to survive high falls when combined with lagback.