diff --git a/src/core/common.rs b/src/core/common.rs index 7280be9..d961ea9 100644 --- a/src/core/common.rs +++ b/src/core/common.rs @@ -144,7 +144,9 @@ pub struct Config { /// Path for storage of the final merged processed entity data file pub entities_path_final: PathBuf, /// Path of viewer metadata file - pub metadata_path: PathBuf, + pub viewer_info_path: PathBuf, + /// Path of viewer entities file + pub viewer_entities_path: PathBuf, } impl Config { @@ -161,7 +163,10 @@ impl Config { let processed_dir: PathBuf = [&args.output_dir, Path::new("processed")].iter().collect(); let entities_dir: PathBuf = [&processed_dir, Path::new("entities")].iter().collect(); let entities_path_final = [&entities_dir, Path::new("entities.bin")].iter().collect(); - let metadata_path = [&args.output_dir, Path::new("info.json")].iter().collect(); + let viewer_info_path = [&args.output_dir, Path::new("info.json")].iter().collect(); + let viewer_entities_path = [&args.output_dir, Path::new("entities.json")] + .iter() + .collect(); Config { num_threads, @@ -171,7 +176,8 @@ impl Config { processed_dir, entities_dir, entities_path_final, - metadata_path, + viewer_info_path, + viewer_entities_path, } } diff --git a/src/core/metadata_writer.rs b/src/core/metadata_writer.rs index 5783356..caf7726 100644 --- a/src/core/metadata_writer.rs +++ b/src/core/metadata_writer.rs @@ -3,7 +3,11 @@ use anyhow::{Context, Result}; use serde::Serialize; -use crate::{core::common::*, io::fs, world::de}; +use crate::{ + core::common::*, + io::{fs, storage}, + world::{block_entity::BlockEntity, de}, +}; /// Minimum and maximum X and Z tile coordinates for a mipmap level #[derive(Debug, Serialize)] @@ -46,6 +50,13 @@ struct Metadata<'t> { spawn: Spawn, } +/// Viewer entity JSON data structure +#[derive(Debug, Serialize, Default)] +struct Entities { + /// List of signs + signs: Vec, +} + /// The MetadataWriter is used to generate the viewer metadata file pub struct MetadataWriter<'a> { /// Common MinedMap configuration from command line @@ -109,6 +120,19 @@ impl<'a> MetadataWriter<'a> { } } + /// Generates [Entities] data from collected entity lists + fn entities(&self) -> Result { + let data: ProcessedEntities = + storage::read_file(&self.config.entities_path_final, storage::Format::Json) + .context("Failed to read entity data file")?; + + let ret = Entities { + signs: data.block_entities, + }; + + Ok(ret) + } + /// Runs the viewer metadata file generation pub fn run(self) -> Result<()> { let level_dat = self.read_level_dat()?; @@ -122,8 +146,15 @@ impl<'a> MetadataWriter<'a> { metadata.mipmaps.push(Self::mipmap_entry(tile_map)); } - fs::create_with_tmpfile(&self.config.metadata_path, |file| { - serde_json::to_writer(file, &metadata).context("Failed to write metadata") - }) + fs::create_with_tmpfile(&self.config.viewer_info_path, |file| { + serde_json::to_writer(file, &metadata).context("Failed to write info.json") + })?; + + let entities = self.entities()?; + fs::create_with_tmpfile(&self.config.viewer_entities_path, |file| { + serde_json::to_writer(file, &entities).context("Failed to write entities.json") + })?; + + Ok(()) } }