ソウルサンド
ソウルサンドは、上を歩くと減速効果を受ける特殊ブロックである。
性質
- ソウルサンドは高さが0.875bのため、氷とスライムの滑りやすさの影響を受ける。
氷/スライムブロックが真下にあるソウルサンドの上では、通常のソウルサンドの上よりも更に速度が落ちる。
- ソウルサンド上では、各tick終了時に水平方向の速度が0.4倍される。
- この効果はプレイヤーが空中にいる場合にも適用され、とりわけジャンプの最後のtickが影響を受ける。
プレイヤーのバウンディングボックスがソウルサンドの占めるマス(の各方向0.001mずつ短い範囲)に触れることが条件。
- この効果は累積する: 足元のソウルサンドの数だけ、0.4倍の効果を受ける。
そのため、単体のソウルサンドの上を歩くよりも、2つのソウルサンドの間を歩く方が少し遅い。
- ソウルサンドの縁(0.001mまで)では、減速効果を受けない。
多くの場合、ソウルサンド関係のジャンプは立ち位置を正しく調整すればより簡単にできる。
解説
以下は前述の性質を解説するソースコードを少し簡略化したもの:
/* Entity.java内、各tickの終わりに呼び出される(Entity.moveEntityから) */
protected void doBlockCollisions()
{
BlockPos posMin = new BlockPos(this.minX+0.001, this.minY+0.001, this.minZ+0.001);
BlockPos posMax = new BlockPos(this.maxX-0.001, this.maxY-0.001, this.maxZ-0.001);
for (int i = posMin.getX(); i <= posMax.getX(); ++i)
{
for (int j = posMin.getY(); j <= posMax.getY(); ++j)
{
for (int k = posMin.getZ(); k <= posMax.getZ(); ++k)
{
BlockPos pos = new BlockPos(i, j, k);
Block block = getBlockState(pos);
block.onEntityCollidedWithBlock(this); //関係するブロックについては補遺を参照。
}
}
}
}
/* BlockSoulSand.java内、上記コード内で呼び出される */
public void onEntityCollidedWithBlock(Entity entityIn)
{
entityIn.motionX *= 0.4;
entityIn.motionZ *= 0.4;
//注: 各ソウルサンドから別々に減速効果を受ける。
}
補遺:
(非表示になっているブロックは、矢と木のボタンなどの、特定のエンティティとブロック間の相互作用にのみ関連しているもの)
バージョン間の違い
1.13
ソウルサンドの真上に水源を設置すると、その上の連続する水源全てが上向きの気泡柱に変換されるようになった。触れたプレイヤーは上に押し上げられる。
1.15
ソウルサンド上での動きが大きく変更された:
- 下のブロックの滑りやすさの影響を受けなくなった(高さ0.5b以上のブロック全て)。
- 減速効果が適用されるのはブロック境界より内側だけになった。周囲0.3mは通常のブロックと同じように機能する。
- 減速効果が0.5b上まで適用されるようになった(半ブロックを含む)。
- 何らかの方法でソウルサンド内に埋まると、内部にいくつかある「中間の床」に立つことができる。それぞれ0.125/0.25/0.375/0.5/0.625/0.75の高さにあり、最初の4つは下のブロックの滑りやすさの影響を受ける。