multiplex roblox format

This commit is contained in:
Quaternions 2023-09-30 03:13:52 -07:00
parent 0d5b918ea1
commit 07f6053839

View File

@ -105,6 +105,24 @@ fn get_texture_refs(dom:&rbx_dom_weak::WeakDom) -> Vec<rbx_dom_weak::types::Ref>
objects objects
} }
fn get_dom<R:Read+Seek>(input:&mut R)->Result<rbx_dom_weak::WeakDom,String>{
let mut first_8=[0u8;8];
if let (Ok(()),Ok(()))=(std::io::Read::read_exact(input, &mut first_8),std::io::Seek::rewind(input)){
match &first_8[0..4]{
b"<rob"=>{
match &first_8[4..8]{
b"lox!"=>rbx_binary::from_reader(input).map_err(|e|format!("{:?}",e)),
b"lox "=>rbx_xml::from_reader(input,rbx_xml::DecodeOptions::default()).map_err(|e|format!("{:?}",e)),
other=>Err(format!("Unknown Roblox file type {:?}",other)),
}
}
_=>Err("unsupported file type".to_owned()),
}
}else{
Err("peek failed".to_owned())
}
}
fn get_id() -> BoxResult<u32>{ fn get_id() -> BoxResult<u32>{
match std::fs::read_to_string("id"){ match std::fs::read_to_string("id"){
Ok(id_file)=>Ok(id_file.parse::<u32>()?), Ok(id_file)=>Ok(id_file.parse::<u32>()?),
@ -261,9 +279,9 @@ fn download_textures(paths: Vec<std::path::PathBuf>) -> BoxResult<()>{
]; ];
let mut texture_list=std::collections::HashSet::new(); let mut texture_list=std::collections::HashSet::new();
for path in paths { for path in paths {
let input = std::io::BufReader::new(std::fs::File::open(path.clone())?); let mut input = std::io::BufReader::new(std::fs::File::open(path.clone())?);
match rbx_binary::from_reader(input){ match get_dom(&mut input){
Ok(dom)=>{ Ok(dom)=>{
let object_refs = get_texture_refs(&dom); let object_refs = get_texture_refs(&dom);
for &object_ref in object_refs.iter() { for &object_ref in object_refs.iter() {
@ -391,9 +409,9 @@ fn scan() -> BoxResult<()>{
for entry in std::fs::read_dir("maps/unprocessed")? { for entry in std::fs::read_dir("maps/unprocessed")? {
let file_thing=entry?; let file_thing=entry?;
let input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?); let mut input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?);
let dom = rbx_binary::from_reader(input)?; let dom = get_dom(&mut input)?;
let script_refs = get_script_refs(&dom); let script_refs = get_script_refs(&dom);
@ -449,9 +467,9 @@ fn extract(paths: Vec<std::path::PathBuf>) -> BoxResult<()>{
for path in paths { for path in paths {
let file_name=path.file_name(); let file_name=path.file_name();
let input = std::io::BufReader::new(std::fs::File::open(&path)?); let mut input = std::io::BufReader::new(std::fs::File::open(&path)?);
let dom = rbx_binary::from_reader(input)?; let dom = get_dom(&mut input)?;
let script_refs = get_script_refs(&dom); let script_refs = get_script_refs(&dom);
@ -484,8 +502,8 @@ fn replace() -> BoxResult<()>{
for entry in std::fs::read_dir("maps/blocked")? { for entry in std::fs::read_dir("maps/blocked")? {
let file_thing=entry?; let file_thing=entry?;
let input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?); let mut input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?);
let mut dom = rbx_binary::from_reader(input)?; let mut dom = get_dom(&mut input)?;
let script_refs = get_script_refs(&dom); let script_refs = get_script_refs(&dom);
@ -555,9 +573,9 @@ fn upload() -> BoxResult<()>{
for entry in std::fs::read_dir("maps/passed")? { for entry in std::fs::read_dir("maps/passed")? {
let file_thing=entry?; let file_thing=entry?;
println!("map file: {:?}",file_thing.file_name()); println!("map file: {:?}",file_thing.file_name());
let input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?); let mut input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?);
let dom = rbx_binary::from_reader(input)?; let dom = get_dom(&mut input)?;
let (modelname,creator,displayname) = get_mapinfo(&dom)?; let (modelname,creator,displayname) = get_mapinfo(&dom)?;
//Creator: [auto fill creator] //Creator: [auto fill creator]
@ -670,8 +688,8 @@ fn interactive() -> BoxResult<()>{
'map_loop: for entry in std::fs::read_dir("maps/unprocessed")? { 'map_loop: for entry in std::fs::read_dir("maps/unprocessed")? {
let file_thing=entry?; let file_thing=entry?;
println!("processing map={:?}",file_thing.file_name()); println!("processing map={:?}",file_thing.file_name());
let input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?); let mut input = std::io::BufReader::new(std::fs::File::open(file_thing.path())?);
let mut dom = rbx_binary::from_reader(input)?; let mut dom = get_dom(&mut input)?;
let script_refs = get_script_refs(&dom); let script_refs = get_script_refs(&dom);