Skip to content

Commit d756766

Browse files
committed
Support mapblock v29 (MT 5.5.0 and later)
1 parent 5353832 commit d756766

23 files changed

+587
-479
lines changed

Cargo.lock

Lines changed: 85 additions & 50 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mapeditr"
3-
version = "1.0.0"
3+
version = "1.1.0"
44
authors = ["random-geek (github.com/random-geek)"]
55
edition = "2018"
66

@@ -12,3 +12,4 @@ edition = "2018"
1212
memmem = "0.1"
1313
sqlite = "0.26"
1414
thiserror = "1"
15+
zstd = "0.11"

src/block_utils.rs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ pub fn merge_blocks(
2424
) {
2525
assert!(block_parts_valid(&src_area, &dst_area));
2626

27-
let src_nd = src_block.node_data.get_ref();
28-
let dst_nd = dst_block.node_data.get_mut();
27+
let src_nd = &src_block.node_data;
28+
let dst_nd = &mut dst_block.node_data;
2929
let offset = dst_area.min - src_area.min;
3030
// Warning: diff can be negative!
3131
let diff = offset.x + offset.y * 16 + offset.z * 256;
@@ -104,12 +104,11 @@ pub fn merge_metadata(
104104

105105
/// Culls duplicate and unused IDs from the name-ID map and node data.
106106
pub fn clean_name_id_map(block: &mut MapBlock) {
107-
let nd = block.node_data.get_mut();
108107
let id_count = (block.nimap.get_max_id().unwrap() + 1) as usize;
109108

110109
// Determine which IDs are used.
111110
let mut used = vec![false; id_count];
112-
for id in &nd.nodes {
111+
for id in &block.node_data.nodes {
113112
used[*id as usize] = true;
114113
}
115114

@@ -136,7 +135,7 @@ pub fn clean_name_id_map(block: &mut MapBlock) {
136135
block.nimap = new_nimap;
137136

138137
// Re-assign node IDs.
139-
for id in &mut nd.nodes {
138+
for id in &mut block.node_data.nodes {
140139
*id = map[*id as usize];
141140
}
142141
}

src/commands/clone.rs

Lines changed: 8 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,7 @@ use super::{Command, ArgResult, BLOCK_CACHE_SIZE};
33
use crate::{unwrap_or, opt_unwrap_or};
44
use crate::spatial::{Vec3, Area, MAP_LIMIT};
55
use crate::map_database::MapDatabase;
6-
use crate::map_block::{MapBlock, MapBlockError, is_valid_generated,
7-
NodeMetadataList, NodeMetadataListExt};
6+
use crate::map_block::{MapBlock, MapBlockError, is_valid_generated};
87
use crate::block_utils::{merge_blocks, merge_metadata, clean_name_id_map};
98
use crate::instance::{ArgType, InstBundle, InstArgs};
109
use crate::utils::{CacheMap, query_keys};
@@ -69,14 +68,11 @@ fn clone(inst: &mut InstBundle) {
6968
for dst_key in dst_keys {
7069
inst.status.inc_done();
7170

72-
let (mut dst_block, mut dst_meta) = unwrap_or!(
71+
let mut dst_block = unwrap_or!(
7372
opt_unwrap_or!(
7473
get_cached(&mut inst.db, &mut block_cache, dst_key),
7574
continue
76-
).and_then(|b| -> Result<_, MapBlockError> {
77-
let m = NodeMetadataList::deserialize(b.metadata.get_ref())?;
78-
Ok((b, m))
79-
}),
75+
),
8076
{ inst.status.inc_failed(); continue; }
8177
);
8278

@@ -90,14 +86,10 @@ fn clone(inst: &mut InstBundle) {
9086
continue;
9187
}
9288
let src_key = src_pos.to_block_key();
93-
let (src_block, src_meta) = opt_unwrap_or!(
94-
|| -> Option<_> {
95-
let b = get_cached(
96-
&mut inst.db, &mut block_cache, src_key)?.ok()?;
97-
let m = NodeMetadataList::deserialize(b.metadata.get_ref())
98-
.ok()?;
99-
Some((b, m))
100-
}(),
89+
// Continue if a None or Some(Err) value is retrieved.
90+
let src_block = opt_unwrap_or!(
91+
get_cached(&mut inst.db, &mut block_cache, src_key)
92+
.map(|res| res.ok()).flatten(),
10193
continue
10294
);
10395

@@ -109,12 +101,11 @@ fn clone(inst: &mut InstBundle) {
109101

110102
merge_blocks(&src_block, &mut dst_block,
111103
src_frag_rel, dst_frag_rel);
112-
merge_metadata(&src_meta, &mut dst_meta,
104+
merge_metadata(&src_block.metadata, &mut dst_block.metadata,
113105
src_frag_rel, dst_frag_rel);
114106
}
115107

116108
clean_name_id_map(&mut dst_block);
117-
*dst_block.metadata.get_mut() = dst_meta.serialize(dst_block.version);
118109
inst.db.set_block(dst_key, &dst_block.serialize()).unwrap();
119110
}
120111

0 commit comments

Comments
 (0)