public override void SetBlockAt(int px, int y, int pz, byte val)
{
if (y < 0 || y >= ChunkY) return;
/*
int X = px / ChunkX;
int Z = pz / ChunkZ;
int x = px - ((px >> 4) * ChunkX); //(px >> 4) & 0xf;
int z = pz - ((pz >> 4) * ChunkZ); //(py >> 4) & 0xf;
*/
int X, Z;
Vector3i local = Global2Local(new Vector3i(px, y, pz), out X, out Z);
Chunk c = GetChunk(X, Z);
if (c == null) return;
c.Blocks[local.X, y, local.Z] = val;
SetChunk(X, Z, c);
}