diff --git a/src/main.rs b/src/main.rs index 578c234..927f1d7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,6 @@ enum Commands { VPKContents(VPKContentsSubcommand), BSPContents(BSPContentsSubcommand), DownloadMeshes(DownloadMeshesSubcommand), - WriteAttributes(WriteAttributesSubcommand), } #[derive(Args)] @@ -69,9 +68,6 @@ struct DownloadMeshesSubcommand { #[arg(long,required=true)] roblox_files:Vec<PathBuf> } -#[derive(Args)] -struct WriteAttributesSubcommand { -} fn main() -> AResult<()> { let cli = Cli::parse(); @@ -84,27 +80,9 @@ fn main() -> AResult<()> { Commands::BSPContents(subcommand)=>bsp_contents(subcommand.input_file), Commands::ConvertTextures(_subcommand)=>convert_textures(), Commands::DownloadMeshes(subcommand)=>download_meshes(subcommand.roblox_files), - Commands::WriteAttributes(_subcommand)=>write_attributes(), } } -fn recursive_collect_regex(objects: &mut std::vec::Vec<rbx_dom_weak::types::Ref>,dom: &rbx_dom_weak::WeakDom, instance: &rbx_dom_weak::Instance, regex: &lazy_regex::Lazy<lazy_regex::Regex>){ - for &referent in instance.children() { - if let Some(c) = dom.get_by_ref(referent) { - if regex.captures(c.name.as_str()).is_some(){ - objects.push(c.referent());//copy ref - } - recursive_collect_regex(objects,dom,c,regex); - } - } -} - -fn get_button_refs(dom:&rbx_dom_weak::WeakDom) -> Vec<rbx_dom_weak::types::Ref>{ - let mut buttons = std::vec::Vec::new(); - recursive_collect_regex(&mut buttons, dom, dom.root(),lazy_regex::regex!(r"Button(\d+)$")); - buttons -} - enum ReaderType<'a, R:Read+Seek>{ GZip(flate2::read::GzDecoder<&'a mut R>), Raw(&'a mut R), @@ -140,19 +118,6 @@ fn load_dom<R:Read+Seek>(input:&mut R)->AResult<rbx_dom_weak::WeakDom>{ } } -fn get_dom<R:Read+Seek>(input:&mut R)->AResult<rbx_dom_weak::WeakDom>{ - match maybe_gzip_decode(input){ - Ok(ReaderType::GZip(mut readable)) => { - //gzip - let mut extracted:Vec<u8>=Vec::new(); - readable.read_to_end(&mut extracted)?; - Ok(load_dom(&mut std::io::Cursor::new(extracted))?) - }, - Ok(ReaderType::Raw(readable)) => Ok(load_dom(readable)?), - Err(e) => Err(e)?, - } -} - /* The ones I'm interested in: Beam.Texture Decal.Texture @@ -202,7 +167,7 @@ fn download_textures(paths:Vec<PathBuf>)->AResult<()>{ } }; let mut input=std::io::BufReader::new(file); - match get_dom(&mut input){ + match load_dom(&mut input){ Ok(dom)=>{ for object in dom.into_raw().1.into_values(){ match object.class.as_str(){ @@ -252,7 +217,7 @@ fn download_meshes(paths:Vec<PathBuf>)->AResult<()>{ } }; let mut input=std::io::BufReader::new(file); - match get_dom(&mut input){ + match load_dom(&mut input){ Ok(dom)=>{ for object in dom.into_raw().1.into_values(){ match object.class.as_str(){ @@ -370,51 +335,6 @@ fn convert_textures() -> AResult<()>{ Ok(()) } -fn write_attributes() -> AResult<()>{ - for entry in std::fs::read_dir("maps/unprocessed")? { - let file_thing=entry?; - println!("processing map={:?}",file_thing.file_name()); - let mut input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?); - let mut dom = get_dom(&mut input)?; - - let button_refs = get_button_refs(&dom); - - for &button_ref in &button_refs { - if let Some(button)=dom.get_by_ref_mut(button_ref){ - match button.properties.get_mut("Attributes"){ - Some(rbx_dom_weak::types::Variant::Attributes(attributes))=>{ - println!("Appending Ref={} to existing attributes for {}",button_ref,button.name); - attributes.insert("Ref".to_string(),rbx_dom_weak::types::Variant::String(button_ref.to_string())); - }, - None=>{ - println!("Creating new attributes with Ref={} for {}",button_ref,button.name); - let mut attributes=rbx_dom_weak::types::Attributes::new(); - attributes.insert("Ref".to_string(),rbx_dom_weak::types::Variant::String(button_ref.to_string())); - button.properties.insert("Attributes".to_string(),rbx_dom_weak::types::Variant::Attributes(attributes)); - } - _=>unreachable!("Fetching attributes did not return attributes."), - } - } - } - let mut dest={ - let mut dest=PathBuf::from("maps/attributes"); - dest.push(file_thing.file_name()); - let output = std::io::BufWriter::new(std::fs::File::create(dest)?); - //write workspace:GetChildren()[1] - let workspace_children=dom.root().children(); - if workspace_children.len()!=1{ - return Err(anyhow::Error::msg("there can only be one model")); - } - rbx_binary::to_writer(output, &dom, &[workspace_children[0]])?; - //move original to processed folder - PathBuf::from("maps/unaltered") - }; - dest.push(file_thing.file_name()); - std::fs::rename(file_thing.path(), dest)?; - } - Ok(()) -} - enum VMTContent{ VMT(String), VTF(String),