最近看到了這部影片
裡面有提到使用草偏移的位置找到座標
這我以前有聽過
不過沒有仔細研究過
大部分花或草都不會被擺放在方塊的正中央
而是會有些偏移
這當然是為了讓遊戲看起來更加自然
這些偏移值是由x和z所決定的
和高度(y)無關
和方塊旋轉一樣不受種子碼或世界類型影響
上次的那個找材質旋轉方向的函式是有經過修改過的
最原本的那段代碼是出現在
net.minecraft.util.math裡的MathHelper這個class裡的getCoordinateRandom
這是原本的代碼
public static long getCoordinateRandom(int x, int y, int z)
{
long i = (long)(x * 3129871) ^ (long)z * 116129781L ^ (long)y;
i = i * i * 42317861L + i * 11L;
return i;
}
而這次花草的偏移值也有用到這個函式
計算偏移值的代碼出現在
net.minecraft.block裡的Block這個class裡的
public Vec3d getOffset(IBlockState state, IBlockAccess worldIn, BlockPos pos)
這個函式做得基本上就是
如過方塊不會偏移就回還零向量
如果會偏移就呼叫下面這段
long i = MathHelper.getCoordinateRandom(pos.getX(), 0, pos.getZ());
return new Vec3d(((double)((float)(i >> 16 & 15L) / 15.0F) - 0.5D) * 0.5D, block$enumoffsettype == Block.EnumOffsetType.XYZ ? ((double)((float)(i >> 20 & 15L) / 15.0F) - 1.0D) * 0.2D : 0.0D, ((double)((float)(i >> 24 & 15L) / 15.0F) - 0.5D) * 0.5D);
我們這裡只需要回傳向量裡的的x和z
這是我們想要的結果
long i = getCoordinateRandom(x, 0, z);
double offsetX = ((double)((float)(i >> 16 & 15L) / 15.0f) - 0.5) * 0.5;
double offsetZ = ((double)((float)(i >> 24 & 15L) / 15.0f) - 0.5) * 0.5;
有了這個函式我們就可以來試用看看
如下圖
右方是X+
下方是Z+
左上角的花座標是(0,0)
這是這九個座標算出的偏移值
0 0
-0.250 -0.250
2 0
-0.183 0.050
4 0
-0.083 0.183
0 2
0.017 -0.150
2 2
-0.050 -0.217
4 2
0.017 -0.183
0 4
-0.250 0.183
2 4
0.117 -0.083
4 4
-0.250 0.217
對照上圖沒什麼問題
花了一段時間研究
花草的偏移位置總共有256種(16x16)可能
以下是16種可能會出現的數字
-0.25 |
-0.217 |
-0.183 |
-0.15 |
-0.117 |
-0.083 |
-0.05 |
-0.017 |
0.017 |
0.05 |
0.083 |
0.117 |
0.15 |
0.183 |
0.217 |
0.25 |
因為花草的偏移有太多種可能性
且每一種相差不太大
要從一張照片中判斷出一株植物準確的偏移值
比起判斷方塊旋轉方向困難許多
因此用這個方法找出方塊座標非常困難
不過理論上仍然可行