Skip to content

Commit d4b29e1

Browse files
committed
fix: maintain water level
1 parent 1da876d commit d4b29e1

File tree

2 files changed

+49
-13
lines changed

2 files changed

+49
-13
lines changed

src/player.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,11 @@ impl Player {
8585
};
8686

8787
for block in blocks.iter() {
88+
89+
if block.read().unwrap().block_type == BlockType::Water {
90+
continue;
91+
}
92+
8893
if let Some(intersection_points) =
8994
ray.intersects_box(&block.read().unwrap().collision_box)
9095
{

src/world.rs

Lines changed: 44 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,22 +75,53 @@ impl World {
7575
self.render_chunks(chunks_to_rerender)
7676
}
7777
pub fn remove_block(&mut self, block: Arc<RwLock<Block>>) {
78-
let block_borrow = block.read().unwrap();
79-
let mut chunks_to_rerender = vec![block_borrow.get_chunk_coords()];
80-
chunks_to_rerender.append(&mut block_borrow.get_neighbour_chunks_coords());
81-
82-
let chunk_map = self.chunks.read().unwrap();
83-
let chunk = chunk_map
84-
.get(&chunks_to_rerender[0])
85-
.expect("Cannot delete a block from unloaded chunk");
86-
78+
let mut has_adjacent_water = false;
79+
let mut chunks_to_rerender = vec![];
8780
{
88-
let mut chunk_lock = chunk.write().unwrap();
89-
chunk_lock.remove_block(&(block_borrow.position));
90-
// Drop chunk lock write
81+
let block_borrow = block.read().unwrap();
82+
chunks_to_rerender.push(block_borrow.get_chunk_coords());
83+
chunks_to_rerender.append(&mut block_borrow.get_neighbour_chunks_coords());
84+
85+
let chunk_map = self.chunks.read().unwrap();
86+
let chunk = chunk_map
87+
.get(&chunks_to_rerender[0])
88+
.expect("Cannot delete a block from unloaded chunk");
89+
90+
{
91+
let mut chunk_lock = chunk.write().unwrap();
92+
chunk_lock.remove_block(&(block_borrow.position));
93+
// Drop chunk lock write
94+
}
95+
96+
for offset in [
97+
glam::vec3(1.0, 0.0, 0.0),
98+
glam::vec3(-1.0, 0.0, 0.0),
99+
glam::vec3(0.0, 0.0, 1.0),
100+
glam::vec3(0.0, 0.0, -1.0),
101+
] {
102+
let position = block_borrow.absolute_position + offset;
103+
let chunk_pos = position.get_chunk_from_position_absolute();
104+
let chunk = chunk_map
105+
.get(&chunk_pos)
106+
.expect("Should be loaded chunk")
107+
.read()
108+
.unwrap();
109+
110+
if chunk.block_type_at(&position) == Some(BlockType::Water) {
111+
has_adjacent_water = true;
112+
}
113+
}
91114
}
92115

93-
self.render_chunks(chunks_to_rerender);
116+
// if it has a nearby block of water, replace the removed block with a water block.
117+
if has_adjacent_water {
118+
let mut blockbrw = block.write().unwrap();
119+
blockbrw.block_type = BlockType::Water;
120+
std::mem::drop(blockbrw);
121+
self.place_block(block);
122+
} else {
123+
self.render_chunks(chunks_to_rerender);
124+
}
94125
}
95126
pub fn get_blocks_absolute(&self, position: &Vec3) -> Option<Arc<RwLock<Block>>> {
96127
let (chunk_x, chunk_y) = position.get_chunk_from_position_absolute();

0 commit comments

Comments
 (0)