mirror of
https://github.com/italicsjenga/valence.git
synced 2025-01-27 22:16:32 +11:00
parent
1ceafe0ce0
commit
7d05cb8309
1 changed files with 10 additions and 70 deletions
|
@ -533,23 +533,6 @@ impl<const LOADED: bool> Chunk<LOADED> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let idx = (x + z * 16 + y * 16 * 16) as _;
|
|
||||||
match block.block_entity_kind() {
|
|
||||||
Some(kind) => {
|
|
||||||
let block_entity = BlockEntity {
|
|
||||||
kind,
|
|
||||||
nbt: compound! {},
|
|
||||||
};
|
|
||||||
self.block_entities.insert(idx, block_entity);
|
|
||||||
if LOADED && !self.refresh {
|
|
||||||
self.modified_block_entities.insert(idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
self.block_entities.remove(&idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
old_block
|
old_block
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -615,30 +598,6 @@ impl<const LOADED: bool> Chunk<LOADED> {
|
||||||
}
|
}
|
||||||
|
|
||||||
sect.block_states.fill(block);
|
sect.block_states.fill(block);
|
||||||
|
|
||||||
for z in 0..16 {
|
|
||||||
for x in 0..16 {
|
|
||||||
for y in 0..16 {
|
|
||||||
let y = sect_y * 16 + y;
|
|
||||||
let idx = (x + z * 16 + y * 16 * 16) as _;
|
|
||||||
match block.block_entity_kind() {
|
|
||||||
Some(kind) => {
|
|
||||||
let block_entity = BlockEntity {
|
|
||||||
kind,
|
|
||||||
nbt: compound! {},
|
|
||||||
};
|
|
||||||
self.block_entities.insert(idx, block_entity);
|
|
||||||
if LOADED && !self.refresh {
|
|
||||||
self.modified_block_entities.insert(idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
self.block_entities.remove(&idx);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Gets a reference to the block entity at the provided offsets in the
|
/// Gets a reference to the block entity at the provided offsets in the
|
||||||
|
@ -686,15 +645,15 @@ impl<const LOADED: bool> Chunk<LOADED> {
|
||||||
);
|
);
|
||||||
let idx = (x + z * 16 + y * 16 * 16) as _;
|
let idx = (x + z * 16 + y * 16 * 16) as _;
|
||||||
let old = self.block_entities.insert(idx, block_entity);
|
let old = self.block_entities.insert(idx, block_entity);
|
||||||
if LOADED {
|
if LOADED && !self.refresh {
|
||||||
self.modified_block_entities.insert(idx);
|
self.modified_block_entities.insert(idx);
|
||||||
self.cached_init_packets.get_mut().clear();
|
self.cached_init_packets.get_mut().clear();
|
||||||
}
|
}
|
||||||
old
|
old
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Edits the block entity at the provided offsets in the chunk.
|
/// Returns a mutable reference to the block entity at the provided offsets
|
||||||
/// Does nothing if there is no block entity at the provided offsets.
|
/// in the chunk.
|
||||||
///
|
///
|
||||||
/// **Note**: The arguments to this function are offsets from the minimum
|
/// **Note**: The arguments to this function are offsets from the minimum
|
||||||
/// corner of the chunk in _chunk space_ rather than _world space_.
|
/// corner of the chunk in _chunk space_ rather than _world space_.
|
||||||
|
@ -704,23 +663,19 @@ impl<const LOADED: bool> Chunk<LOADED> {
|
||||||
/// Panics if the offsets are outside the bounds of the chunk. `x` and `z`
|
/// Panics if the offsets are outside the bounds of the chunk. `x` and `z`
|
||||||
/// must be less than 16 while `y` must be less than `section_count() * 16`.
|
/// must be less than 16 while `y` must be less than `section_count() * 16`.
|
||||||
#[track_caller]
|
#[track_caller]
|
||||||
pub fn edit_block_entity(
|
pub fn block_entity_mut(&mut self, x: usize, y: usize, z: usize) -> Option<&mut BlockEntity> {
|
||||||
&mut self,
|
|
||||||
x: usize,
|
|
||||||
y: usize,
|
|
||||||
z: usize,
|
|
||||||
f: impl FnOnce(&mut BlockEntity),
|
|
||||||
) {
|
|
||||||
assert!(
|
assert!(
|
||||||
x < 16 && y < self.section_count() * 16 && z < 16,
|
x < 16 && y < self.section_count() * 16 && z < 16,
|
||||||
"chunk block offsets of ({x}, {y}, {z}) are out of bounds"
|
"chunk block offsets of ({x}, {y}, {z}) are out of bounds"
|
||||||
);
|
);
|
||||||
let idx = (x + z * 16 + y * 16 * 16) as _;
|
let idx = (x + z * 16 + y * 16 * 16) as _;
|
||||||
self.block_entities.entry(idx).and_modify(f);
|
|
||||||
if LOADED {
|
let res = self.block_entities.get_mut(&idx);
|
||||||
|
if LOADED && res.is_some() && !self.refresh {
|
||||||
self.modified_block_entities.insert(idx);
|
self.modified_block_entities.insert(idx);
|
||||||
self.cached_init_packets.get_mut().clear();
|
self.cached_init_packets.get_mut().clear();
|
||||||
}
|
}
|
||||||
|
self.block_entities.get_mut(&idx)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sets the block at the provided offsets in the chunk. The previous
|
/// Sets the block at the provided offsets in the chunk. The previous
|
||||||
|
@ -995,7 +950,7 @@ mod tests {
|
||||||
chunk.refresh = false;
|
chunk.refresh = false;
|
||||||
|
|
||||||
assert!(chunk.block_entity(0, 0, 0).is_none());
|
assert!(chunk.block_entity(0, 0, 0).is_none());
|
||||||
chunk.set_block_state(0, 0, 0, BlockState::CHEST);
|
chunk.set_block(0, 0, 0, BlockState::CHEST);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
chunk.block_entity(0, 0, 0),
|
chunk.block_entity(0, 0, 0),
|
||||||
Some(&BlockEntity {
|
Some(&BlockEntity {
|
||||||
|
@ -1003,22 +958,7 @@ mod tests {
|
||||||
nbt: compound! {}
|
nbt: compound! {}
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
chunk.set_block_state(0, 0, 0, BlockState::STONE);
|
chunk.set_block(0, 0, 0, BlockState::STONE);
|
||||||
assert!(chunk.block_entity(0, 0, 0).is_none());
|
assert!(chunk.block_entity(0, 0, 0).is_none());
|
||||||
|
|
||||||
chunk.fill_block_states(2, BlockState::CHEST);
|
|
||||||
for x in 0..16 {
|
|
||||||
for z in 0..16 {
|
|
||||||
for y in 32..47 {
|
|
||||||
assert_eq!(
|
|
||||||
chunk.block_entity(x, y, z),
|
|
||||||
Some(&BlockEntity {
|
|
||||||
kind: BlockEntityKind::Chest,
|
|
||||||
nbt: compound! {}
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue