aboutsummaryrefslogtreecommitdiff
path: root/azalea-world/src/lib.rs
diff options
context:
space:
mode:
authormat <github@matdoes.dev>2022-05-14 14:12:57 -0500
committermat <github@matdoes.dev>2022-05-14 14:12:57 -0500
commit6d2fd8afbad44bbe88f701e1d67cc2f251246c07 (patch)
tree3fa06efe4408c28db89aa6f115414d7a6995b1cc /azalea-world/src/lib.rs
parent70271ede1982b618b5bb592da4adffabcdd76dac (diff)
downloadazalea-drasl-6d2fd8afbad44bbe88f701e1d67cc2f251246c07.tar.xz
start adding get_block_state
Diffstat (limited to 'azalea-world/src/lib.rs')
-rw-r--r--azalea-world/src/lib.rs43
1 files changed, 40 insertions, 3 deletions
diff --git a/azalea-world/src/lib.rs b/azalea-world/src/lib.rs
index 4da2fb0f..aa99a470 100644
--- a/azalea-world/src/lib.rs
+++ b/azalea-world/src/lib.rs
@@ -1,7 +1,8 @@
mod bit_storage;
mod palette;
-use azalea_core::ChunkPos;
+use crate::palette::PalettedContainerType;
+use azalea_core::{BlockPos, ChunkPos, ChunkSectionBlockPos};
use azalea_protocol::mc_buf::{McBufReadable, McBufWritable};
pub use bit_storage::BitStorage;
use palette::PalettedContainer;
@@ -11,8 +12,6 @@ use std::{
sync::{Arc, Mutex},
};
-use crate::palette::PalettedContainerType;
-
#[cfg(test)]
mod tests {
#[test]
@@ -54,6 +53,10 @@ impl World {
pub fn update_view_center(&mut self, pos: &ChunkPos) {
self.storage.view_center = *pos;
}
+
+ pub fn get_block_state(&self, pos: &BlockPos) -> Option<u32> {
+ self.storage.get_block_state(pos)
+ }
}
impl Index<&ChunkPos> for World {
type Output = Option<Arc<Mutex<Chunk>>>;
@@ -115,6 +118,15 @@ impl ChunkStorage {
(chunk_pos.x - self.view_center.x).unsigned_abs() <= self.chunk_radius
&& (chunk_pos.z - self.view_center.z).unsigned_abs() <= self.chunk_radius
}
+
+ pub fn get_block_state(&self, pos: &BlockPos) -> Option<u32> {
+ let chunk_pos = ChunkPos::from(pos);
+ let chunk = &self[&chunk_pos];
+ match chunk {
+ Some(chunk) => Some(chunk.lock().unwrap().get(pos)),
+ None => None,
+ }
+ }
}
impl Index<&ChunkPos> for ChunkStorage {
@@ -150,6 +162,23 @@ impl Chunk {
}
Ok(Chunk { sections })
}
+
+ pub fn section_index(&self, y: i32) -> u32 {
+ // TODO: check the build height and stuff, this code will be broken if the min build height is 0
+ // (LevelHeightAccessor.getMinSection in vanilla code)
+ assert!(y >= 0);
+ (y as u32) / 16
+ }
+
+ pub fn get(&self, pos: &BlockPos) -> u32 {
+ let section_index = self.section_index(pos.y);
+ println!("section index: {}", section_index);
+ // TODO: make sure the section exists
+ let section = &self.sections[section_index as usize];
+ let chunk_section_pos = ChunkSectionBlockPos::from(pos);
+ let block_state = section.get(chunk_section_pos);
+ block_state
+ }
}
impl McBufWritable for Chunk {
@@ -194,3 +223,11 @@ impl McBufWritable for Section {
Ok(())
}
}
+
+impl Section {
+ // TODO: return a BlockState instead of a u32
+ fn get(&self, pos: ChunkSectionBlockPos) -> u32 {
+ self.states
+ .get(pos.x as usize, pos.y as usize, pos.z as usize)
+ }
+}