Skip to main content

anvil_region/
position.rs

1#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Copy, Clone)]
2pub struct RegionPosition {
3    pub x: i32,
4    pub z: i32,
5}
6
7impl RegionPosition {
8    pub fn new(x: i32, z: i32) -> RegionPosition {
9        RegionPosition { x, z }
10    }
11
12    pub fn from_chunk_position(chunk_x: i32, chunk_z: i32) -> RegionPosition {
13        let x = chunk_x >> 5;
14        let z = chunk_z >> 5;
15
16        RegionPosition::new(x, z)
17    }
18}
19
20#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Copy, Clone)]
21pub struct RegionChunkPosition {
22    pub x: u8,
23    pub z: u8,
24}
25
26impl RegionChunkPosition {
27    pub fn new(x: u8, z: u8) -> RegionChunkPosition {
28        debug_assert!(32 > x, "Region chunk x coordinate out of bounds");
29        debug_assert!(32 > z, "Region chunk z coordinate out of bounds");
30
31        RegionChunkPosition { x, z }
32    }
33
34    pub fn from_chunk_position(chunk_x: i32, chunk_z: i32) -> RegionChunkPosition {
35        let x = (chunk_x & 31) as u8;
36        let z = (chunk_z & 31) as u8;
37
38        RegionChunkPosition::new(x, z)
39    }
40
41    pub(crate) fn metadata_index(&self) -> usize {
42        self.x as usize + self.z as usize * 32
43    }
44}