(self, save: &impl OdbReader, storage: &mut impl OdbWriter)
| 21 | } |
| 22 | |
| 23 | fn flatten(self, save: &impl OdbReader, storage: &mut impl OdbWriter) -> Result<Vec<String>> { |
| 24 | let mut processed = Vec::new(); |
| 25 | for pattern in GZIP_NBT_GLOB_PATTERNS { |
| 26 | for key in save.glob(pattern)? { |
| 27 | log::info!("Process gzip nbt file {key}"); |
| 28 | let compressed = save.get(&key)?; |
| 29 | let mut decoder = GzDecoder::new(compressed.as_slice()); |
| 30 | let decompressed = if decoder.header().is_some() { |
| 31 | let mut decompressed = Vec::new(); |
| 32 | decoder |
| 33 | .read_to_end(&mut decompressed) |
| 34 | .context("failed to decompress gzip data")?; |
| 35 | decompressed |
| 36 | } else { |
| 37 | log::info!( |
| 38 | "Failed to decompress because header is invalid, treat as uncompressed" |
| 39 | ); |
| 40 | compressed |
| 41 | }; |
| 42 | let sorted = { |
| 43 | let nbt = load_nbt(Cursor::new(&decompressed))?; |
| 44 | let nbt = sort_nbt(nbt); |
| 45 | |
| 46 | // Sort recipe book for player data |
| 47 | let nbt = { |
| 48 | let match_file_old = glob::Pattern::new("playerdata/*.dat") |
| 49 | .context("failed to compile glob pattern")? |
| 50 | .matches(&key); |
| 51 | let match_file_new = glob::Pattern::new("players/data/*.dat") |
| 52 | .context("failed to compile glob pattern")? |
| 53 | .matches(&key); |
| 54 | if match_file_old || match_file_new { |
| 55 | let name = nbt.name().to_owned(); |
| 56 | let mut comp = nbt.as_compound(); |
| 57 | sort_recipe_book(&mut comp); |
| 58 | BaseNbt::new(name, comp) |
| 59 | } else { |
| 60 | nbt |
| 61 | } |
| 62 | }; |
| 63 | |
| 64 | // Sort recipe book for player data in level.dat |
| 65 | let nbt = { |
| 66 | if key == "level.dat" || key == "level.dat_old" { |
| 67 | let name = nbt.name().to_owned(); |
| 68 | let mut comp = nbt.as_compound(); |
| 69 | if let Some(data) = comp.compound_mut("Data") |
| 70 | && let Some(player) = data.compound_mut("Player") |
| 71 | { |
| 72 | sort_recipe_book(player); |
| 73 | } |
| 74 | BaseNbt::new(name, comp) |
| 75 | } else { |
| 76 | nbt |
| 77 | } |
| 78 | }; |
| 79 | |
| 80 | // Sort player attributes in level.dat |
nothing calls this directly
no test coverage detected