Fix a crash caused by duplicate block mappings
This commit is contained in:
parent
f8f60b98be
commit
feb7ea1630
|
@ -31,7 +31,7 @@ impl BlockStorage {
|
||||||
|
|
||||||
pub fn get(&self, idx: usize) -> block::Block {
|
pub fn get(&self, idx: usize) -> block::Block {
|
||||||
let idx = self.blocks.get(idx);
|
let idx = self.blocks.get(idx);
|
||||||
self.block_map.get(idx).map_or(block::Missing{}, |v| v.0)
|
self.block_map[idx].0
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set(&mut self, idx: usize, b: block::Block) -> bool {
|
pub fn set(&mut self, idx: usize, b: block::Block) -> bool {
|
||||||
|
@ -101,7 +101,7 @@ impl BlockStorage {
|
||||||
self.blocks = data;
|
self.blocks = data;
|
||||||
// Recount blocks
|
// Recount blocks
|
||||||
for bi in 0 .. 4096 {
|
for bi in 0 .. 4096 {
|
||||||
let bl_id = self.blocks.get(bi);
|
let mut bl_id = self.blocks.get(bi);
|
||||||
if self.blocks.bit_size == 13 { // Global palette
|
if self.blocks.bit_size == 13 { // Global palette
|
||||||
if self.block_map.get(bl_id)
|
if self.block_map.get(bl_id)
|
||||||
.map(|v| v.1)
|
.map(|v| v.1)
|
||||||
|
@ -114,7 +114,19 @@ impl BlockStorage {
|
||||||
self.rev_block_map.insert(bl, bl_id);
|
self.rev_block_map.insert(bl, bl_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let bmap = self.block_map.get_mut(bl_id).unwrap();
|
{
|
||||||
|
// Sometimes we can have two mappings for the same block
|
||||||
|
// (either due to a server bug or unimplemented blocks
|
||||||
|
// in steven). This attempts to repair this by replacing
|
||||||
|
// duplicate mappings with the last one.
|
||||||
|
let bmap = self.block_map.get_mut(bl_id).unwrap();
|
||||||
|
let rev = *self.rev_block_map.get(&bmap.0).unwrap();
|
||||||
|
if rev != bl_id {
|
||||||
|
bl_id = rev;
|
||||||
|
self.blocks.set(bi, bl_id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let mut bmap = self.block_map.get_mut(bl_id).unwrap();
|
||||||
if bmap.1 == 0xFFFFF {
|
if bmap.1 == 0xFFFFF {
|
||||||
bmap.1 = 0;
|
bmap.1 = 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue