diff --git a/schemsearch-lib/src/nbt_search.rs b/schemsearch-lib/src/nbt_search.rs index 9fda1b0..f370ae0 100755 --- a/schemsearch-lib/src/nbt_search.rs +++ b/schemsearch-lib/src/nbt_search.rs @@ -7,7 +7,9 @@ use schemsearch_files::SpongeSchematic; const NBT_BLOCKS: &str = include_str!("blocks.txt"); lazy_static! { - static ref NBT_BLOCKS_SET: HashSet = NBT_BLOCKS.lines().map(ToOwned::to_owned).collect(); + static ref NBT_BLOCKS_SET: HashSet = { + NBT_BLOCKS.lines().map(|x| format!("minecraft:{}", x)).collect() + }; } pub fn has_invalid_nbt(schem: SpongeSchematic) -> bool { @@ -15,13 +17,94 @@ pub fn has_invalid_nbt(schem: SpongeSchematic) -> bool { return true; } - let nbt_blocks = schem.palette.iter().filter(|(k, _)| NBT_BLOCKS_SET.contains(*k)).map(|(_, v)| *v).collect::>(); + let nbt_blocks = schem.palette.iter().filter(|(k, _)| NBT_BLOCKS_SET.contains(k.to_owned())).map(|(_, v)| *v).collect::>(); - for block_entity in schem.block_data.iter() { - if nbt_blocks.contains(block_entity) { - return true; + for (i, block_entity) in schem.block_data.iter().enumerate() { + if nbt_blocks.contains(&*block_entity) { + // i = x + z * Width + y * Width * Length + let x = i % schem.width as usize; + let z = (i / schem.width as usize) % schem.length as usize; + let y = i / (schem.width as usize * schem.length as usize); + if schem.block_entities.iter().any(|e| !e.pos.eq(&[x as i32, y as i32, z as i32])) { + return true; + } } } return false; +} + +#[allow(unused_imports)] +#[cfg(test)] +mod tests { + use nbt::CompoundTag; + use schemsearch_files::{BlockEntity, SpongeSchematic}; + use super::*; + + #[test] + fn test_has_invalid_nbt() { + let schem = SpongeSchematic { + data_version: 1, + metadata: CompoundTag::new(), + width: 0, + height: 0, + length: 0, + offset: [0, 0, 0], + palette_max: 1, + palette: vec![("minecraft:chest".to_owned(), 1)].into_iter().collect(), + block_data: vec![1], + block_entities: vec![], + entities: None, + }; + + assert_eq!(has_invalid_nbt(schem), true); + } + + #[test] + fn test_has_invalid_nbt_2() { + let schem = SpongeSchematic { + data_version: 1, + metadata: CompoundTag::new(), + width: 1, + height: 1, + length: 1, + offset: [0, 0, 0], + palette_max: 1, + palette: vec![("minecraft:chest".to_owned(), 1)].into_iter().collect(), + block_data: vec![1], + block_entities: vec![ + BlockEntity { + id: "minecraft:chest".to_owned(), + pos: [0, 0, 0], + } + ], + entities: None, + }; + + assert_eq!(has_invalid_nbt(schem), false); + } + + #[test] + fn test_has_invalid_nbt_3() { + let schem = SpongeSchematic { + data_version: 1, + metadata: CompoundTag::new(), + width: 2, + height: 1, + length: 1, + offset: [0, 0, 0], + palette_max: 1, + palette: vec![("minecraft:chest".to_owned(), 1), ("minecraft:stone".to_owned(), 2)].into_iter().collect(), + block_data: vec![1, 2], + block_entities: vec![ + BlockEntity { + id: "minecraft:chest".to_owned(), + pos: [1, 0, 0], + } + ], + entities: None, + }; + + assert_eq!(has_invalid_nbt(schem), true); + } } \ No newline at end of file