aboutsummaryrefslogtreecommitdiff
path: root/azalea-core/src
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2022-05-15 01:46:11 +0000
committerGitHub <noreply@github.com>2022-05-15 01:46:11 +0000
commitd0ac62d85276bc48e4f8e0e60afdc35840681622 (patch)
treeff4996b89d6f34c7c452d1b2950e53d512bce3c1 /azalea-core/src
parentef3cbe27f2a7eed5c635924d6fa0401dd04eae77 (diff)
parentc16e958d0be671a17edf060aee9850faccbcfe14 (diff)
downloadazalea-drasl-d0ac62d85276bc48e4f8e0e60afdc35840681622.tar.xz
Merge pull request #6 from mat-1/chunk-decoding
Chunk decoding
Diffstat (limited to 'azalea-core/src')
-rw-r--r--azalea-core/src/block_pos.rs6
-rwxr-xr-xazalea-core/src/difficulty.rs1
-rwxr-xr-xazalea-core/src/lib.rs6
-rw-r--r--azalea-core/src/position.rs157
4 files changed, 161 insertions, 9 deletions
diff --git a/azalea-core/src/block_pos.rs b/azalea-core/src/block_pos.rs
deleted file mode 100644
index 96a234cb..00000000
--- a/azalea-core/src/block_pos.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-#[derive(Clone, Copy, Debug)]
-pub struct BlockPos {
- pub x: i32,
- pub y: i32,
- pub z: i32,
-}
diff --git a/azalea-core/src/difficulty.rs b/azalea-core/src/difficulty.rs
index 21e980ba..5d869325 100755
--- a/azalea-core/src/difficulty.rs
+++ b/azalea-core/src/difficulty.rs
@@ -83,7 +83,6 @@ mod tests {
assert_eq!(1, Difficulty::EASY.id());
assert_eq!(2, Difficulty::NORMAL.id());
assert_eq!(3, Difficulty::HARD.id());
- assert_eq!(4, Difficulty::PEACEFUL.id());
}
#[test]
diff --git a/azalea-core/src/lib.rs b/azalea-core/src/lib.rs
index c6b51cb1..d2a2d558 100755
--- a/azalea-core/src/lib.rs
+++ b/azalea-core/src/lib.rs
@@ -1,5 +1,7 @@
//! Random miscellaneous things like UUIDs that don't deserve their own crate.
+#![feature(int_roundings)]
+
pub mod difficulty;
pub mod game_type;
pub mod resource_location;
@@ -8,8 +10,8 @@ pub mod serializable_uuid;
mod slot;
pub use slot::{Slot, SlotData};
-mod block_pos;
-pub use block_pos::BlockPos;
+mod position;
+pub use position::{BlockPos, ChunkBlockPos, ChunkPos, ChunkSectionBlockPos, ChunkSectionPos};
mod direction;
pub use direction::Direction;
diff --git a/azalea-core/src/position.rs b/azalea-core/src/position.rs
new file mode 100644
index 00000000..9c7cd132
--- /dev/null
+++ b/azalea-core/src/position.rs
@@ -0,0 +1,157 @@
+use std::ops::Rem;
+
+#[derive(Clone, Copy, Debug, Default)]
+pub struct BlockPos {
+ pub x: i32,
+ pub y: i32,
+ pub z: i32,
+}
+
+impl BlockPos {
+ pub fn new(x: i32, y: i32, z: i32) -> Self {
+ BlockPos { x, y, z }
+ }
+}
+
+impl Rem<i32> for BlockPos {
+ type Output = Self;
+
+ fn rem(self, rhs: i32) -> Self {
+ BlockPos {
+ x: self.x % rhs,
+ y: self.y % rhs,
+ z: self.z % rhs,
+ }
+ }
+}
+
+#[derive(Clone, Copy, Debug, Default, PartialEq)]
+pub struct ChunkPos {
+ pub x: i32,
+ pub z: i32,
+}
+
+impl ChunkPos {
+ pub fn new(x: i32, z: i32) -> Self {
+ ChunkPos { x, z }
+ }
+}
+
+impl From<&BlockPos> for ChunkPos {
+ fn from(pos: &BlockPos) -> Self {
+ ChunkPos {
+ x: pos.x.div_floor(16),
+ z: pos.z.div_floor(16),
+ }
+ }
+}
+
+/// The coordinates of a chunk section in the world.
+#[derive(Clone, Copy, Debug, Default)]
+pub struct ChunkSectionPos {
+ pub x: i32,
+ pub y: i32,
+ pub z: i32,
+}
+
+impl ChunkSectionPos {
+ pub fn new(x: i32, y: i32, z: i32) -> Self {
+ ChunkSectionPos { x, y, z }
+ }
+}
+
+impl From<BlockPos> for ChunkSectionPos {
+ fn from(pos: BlockPos) -> Self {
+ ChunkSectionPos {
+ x: pos.x.div_floor(16),
+ y: pos.y.div_floor(16),
+ z: pos.z.div_floor(16),
+ }
+ }
+}
+
+impl From<ChunkSectionPos> for ChunkPos {
+ fn from(pos: ChunkSectionPos) -> Self {
+ ChunkPos { x: pos.x, z: pos.z }
+ }
+}
+
+/// The coordinates of a block inside a chunk.
+#[derive(Clone, Copy, Debug, Default, PartialEq)]
+pub struct ChunkBlockPos {
+ pub x: u8,
+ pub y: i32,
+ pub z: u8,
+}
+
+impl ChunkBlockPos {
+ pub fn new(x: u8, y: i32, z: u8) -> Self {
+ ChunkBlockPos { x, y, z }
+ }
+}
+
+impl From<&BlockPos> for ChunkBlockPos {
+ fn from(pos: &BlockPos) -> Self {
+ ChunkBlockPos {
+ x: pos.x.rem_euclid(16).abs() as u8,
+ y: pos.y,
+ z: pos.z.rem_euclid(16).abs() as u8,
+ }
+ }
+}
+
+/// The coordinates of a block inside a chunk section.
+#[derive(Clone, Copy, Debug, Default)]
+pub struct ChunkSectionBlockPos {
+ /// A number between 0 and 16.
+ pub x: u8,
+ /// A number between 0 and 16.
+ pub y: u8,
+ /// A number between 0 and 16.
+ pub z: u8,
+}
+
+impl ChunkSectionBlockPos {
+ pub fn new(x: u8, y: u8, z: u8) -> Self {
+ ChunkSectionBlockPos { x, y, z }
+ }
+}
+
+impl From<&BlockPos> for ChunkSectionBlockPos {
+ fn from(pos: &BlockPos) -> Self {
+ ChunkSectionBlockPos {
+ x: pos.x.rem(16).abs() as u8,
+ y: pos.y.rem(16).abs() as u8,
+ z: pos.z.rem(16).abs() as u8,
+ }
+ }
+}
+
+impl From<&ChunkBlockPos> for ChunkSectionBlockPos {
+ fn from(pos: &ChunkBlockPos) -> Self {
+ ChunkSectionBlockPos {
+ x: pos.x,
+ y: pos.y.rem(16).abs() as u8,
+ z: pos.z,
+ }
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_from_block_pos_to_chunk_pos() {
+ let block_pos = BlockPos::new(5, 78, -2);
+ let chunk_pos = ChunkPos::from(&block_pos);
+ assert_eq!(chunk_pos, ChunkPos::new(0, -1));
+ }
+
+ #[test]
+ fn test_from_block_pos_to_chunk_block_pos() {
+ let block_pos = BlockPos::new(5, 78, -2);
+ let chunk_block_pos = ChunkBlockPos::from(&block_pos);
+ assert_eq!(chunk_block_pos, ChunkBlockPos::new(5, 78, 14));
+ }
+}