ダメージブースト
ダメージブーストとは、何らかの方法でダメージを受けるとジャンプ力が上昇するという仕組みである。
明確な説明とソースコードの解析がなされていないため、このページには大筋を記載している。
プレイヤーは複数の種類の自然ダメージを受けることができる: 落下、炎上、サボテン、毒など。
興味深い点として、溺水ダメージは速度に影響を与えない。より古いバージョンでは、継続的に溺水ダメージを受け下方向に押されることで、水から抜け出せなくなることがあった。ただし、1.8でも毒などその他の種類のダメージによって、同様の問題に直面することがある。
アスレチックサーバーでは通常はダメージが無効化されているが、この仕組みはアスレチックマップのタイムアタックなどで非常に有用である。
導入:
ダメージを受けると、その情報がパケットを通じてサーバーに渡され、プレイヤーに返される。これは、統合サーバー(シングルプレイ)と専用サーバー(マルチプレイ)のいずれにも当てはまる。この処理中に、プレイヤーの動きが変更される。
- プレイヤーの速度がサーバーと同期している場合、ダメージを受けてもほぼ同じ速度が維持される。
- プレイヤーの速度がサーバーと同期していない場合、予想される速度で更新されるため、ダメージを受けると加速しているように見える。
プレイヤーの速度が非同期化されるタイミングや仕組みは未解明だが、既知の事例がいくつか存在する:
- ブロックから走り降りる、端で最後のtickでジャンプする
- スライムブロックに飛び乗る
- はしごから降りる
- 水/溶岩内
NetHandlerがプレイヤーの動きのコードとは独立してjump()メソッドを呼び出していることが、非同期化に繋がっていると推測される。
注:
- 「ほぼ同じ」という表現は、速度パケットへの倍精度浮動小数点数の格納方法によって、速度の値が1/8000単位に丸められているという事実を表している。
- 自然ダメージは、エンティティに攻撃された際に適用されるノックバックとは異なっている。
同期型ダメージブースト
サーバーと同期している状態でダメージを受けると、プレイヤーの速度が次のtickに保持される。
この速度保持をジャンプの始めの速度(0.42m/t)に利用し、出来る限り上方速度を維持しようというのが狙いである。最適な方法で行うと、ジャンプの最高点は約1.6685mに達し、1.625ブロックの高さまでジャンプすることが可能になる。
非同期型ダメージブースト
非同期状態でのダメージはプレイヤーを「その場で加速」させる(実際には、プレイヤーの速度は単に更新されているだけ)。この下方加速度は、スライムブロック(1.12以降ではベッドも)でバウンドすることで、上向きに変換できる。
なお、スライムブロックの縁に着地することで、ダメージを受けながらもバウンドすることができる。
非同期状態でダメージを受けることによる影響には、まだ完全には解明されていないものがある。特に、ジャンプ後の着地が早まったり、不自然なジャンプが発動したりすることがある。
跳躍力上昇との相互作用
当然ながら、跳躍力上昇効果をダメージブーストと組み合わせることで、より高くジャンプ/バウンドすることができる。レベル129以降の跳躍力上昇では高くジャンプすることができなくなるが(サーバーがポーション効果を符号なしbyteではなくbyteとして送信しているのが原因)、ダメージブーストはサーバー側で計算されるため、プレイヤーはその影響を受ける。
実際に、プレイヤーがジャンプもしくはジャンプ後にダメージを受けると、最大3.9 m/tの初速で、上方向に飛ばされることがある(この上限は速度パケットにハードコーディングされている)。
具体的に、跳躍力上昇レベル252~256では、プレイヤーは低くジャンプすることができる。この状況では、バグは非常に容易に発生する。
注: 跳躍力上昇レベル129~249は、スライムブロックの上で単にジャンプするだけで、垂直方向の負の速度を大きなバウンドに変換できるため悪用可能。