mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Move common code out into function
This commit is contained in:
parent
5bf17779ec
commit
8c2a5559d3
@ -482,49 +482,9 @@ fn handle_site(
|
|||||||
.map_or(false, |id| server.index.sites[id].name() == dest_name)
|
.map_or(false, |id| server.index.sites[id].name() == dest_name)
|
||||||
}) {
|
}) {
|
||||||
Some(site) => {
|
Some(site) => {
|
||||||
// The bulk of this code is to find the z coordinate to teleport to, searching
|
let pos = server
|
||||||
// for the lowest available one. Copied nearly verbatim from server's lib.rs
|
|
||||||
let dest_chunk = site.center;
|
|
||||||
// Unwrapping because generate_chunk only returns err when should_continue evals
|
|
||||||
// to true
|
|
||||||
let (tc, _cs) = server
|
|
||||||
.world
|
.world
|
||||||
.generate_chunk(server.index.as_index_ref(), dest_chunk, || false)
|
.find_lowest_accessible_pos(server.index.as_index_ref(), site.center);
|
||||||
.unwrap();
|
|
||||||
let min_z = tc.get_min_z();
|
|
||||||
let max_z = tc.get_max_z();
|
|
||||||
|
|
||||||
let pos = TerrainChunkSize::center_wpos(dest_chunk);
|
|
||||||
let pos = Vec3::new(pos.x, pos.y, min_z);
|
|
||||||
let pos = {
|
|
||||||
use common::vol::ReadVol;
|
|
||||||
(0..(max_z - min_z))
|
|
||||||
.map(|z_diff| pos + Vec3::unit_z() * z_diff)
|
|
||||||
.find(|test_pos| {
|
|
||||||
let chunk_relative_xy =
|
|
||||||
test_pos.xy().map2(TerrainChunkSize::RECT_SIZE, |e, sz| {
|
|
||||||
e.rem_euclid(sz as i32)
|
|
||||||
});
|
|
||||||
tc.get(
|
|
||||||
Vec3::new(chunk_relative_xy.x, chunk_relative_xy.y, test_pos.z)
|
|
||||||
- Vec3::unit_z(),
|
|
||||||
)
|
|
||||||
.map_or(false, |b| b.is_filled())
|
|
||||||
&& (0..3).all(|z| {
|
|
||||||
tc.get(
|
|
||||||
Vec3::new(
|
|
||||||
chunk_relative_xy.x,
|
|
||||||
chunk_relative_xy.y,
|
|
||||||
test_pos.z,
|
|
||||||
) + Vec3::unit_z() * z,
|
|
||||||
)
|
|
||||||
.map_or(true, |b| !b.is_solid())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.unwrap_or(pos)
|
|
||||||
.map(|e| e as f32)
|
|
||||||
+ 0.5
|
|
||||||
};
|
|
||||||
server.state.write_component(target, comp::Pos(pos));
|
server.state.write_component(target, comp::Pos(pos));
|
||||||
server.state.write_component(target, comp::ForceUpdate);
|
server.state.write_component(target, comp::ForceUpdate);
|
||||||
},
|
},
|
||||||
|
@ -66,7 +66,6 @@ use common::{
|
|||||||
slowjob::SlowJobPool,
|
slowjob::SlowJobPool,
|
||||||
terrain::TerrainChunkSize,
|
terrain::TerrainChunkSize,
|
||||||
uid::UidAllocator,
|
uid::UidAllocator,
|
||||||
vol::{ReadVol, RectVolSize},
|
|
||||||
};
|
};
|
||||||
use common_ecs::run_now;
|
use common_ecs::run_now;
|
||||||
use common_net::{
|
use common_net::{
|
||||||
@ -318,38 +317,7 @@ impl Server {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
// Calculate the middle of the chunk in the world
|
world.find_lowest_accessible_pos(index, spawn_chunk)
|
||||||
let spawn_wpos = TerrainChunkSize::center_wpos(spawn_chunk);
|
|
||||||
|
|
||||||
// Unwrapping because generate_chunk only returns err when should_continue evals
|
|
||||||
// to true
|
|
||||||
let (tc, _cs) = world.generate_chunk(index, spawn_chunk, || false).unwrap();
|
|
||||||
let min_z = tc.get_min_z();
|
|
||||||
let max_z = tc.get_max_z();
|
|
||||||
|
|
||||||
let pos = Vec3::new(spawn_wpos.x, spawn_wpos.y, min_z);
|
|
||||||
(0..(max_z - min_z))
|
|
||||||
.map(|z_diff| pos + Vec3::unit_z() * z_diff)
|
|
||||||
.find(|test_pos| {
|
|
||||||
let chunk_relative_xy = test_pos
|
|
||||||
.xy()
|
|
||||||
.map2(TerrainChunkSize::RECT_SIZE, |e, sz| e.rem_euclid(sz as i32));
|
|
||||||
tc.get(
|
|
||||||
Vec3::new(chunk_relative_xy.x, chunk_relative_xy.y, test_pos.z)
|
|
||||||
- Vec3::unit_z(),
|
|
||||||
)
|
|
||||||
.map_or(false, |b| b.is_filled())
|
|
||||||
&& (0..3).all(|z| {
|
|
||||||
tc.get(
|
|
||||||
Vec3::new(chunk_relative_xy.x, chunk_relative_xy.y, test_pos.z)
|
|
||||||
+ Vec3::unit_z() * z,
|
|
||||||
)
|
|
||||||
.map_or(true, |b| !b.is_solid())
|
|
||||||
})
|
|
||||||
})
|
|
||||||
.unwrap_or(pos)
|
|
||||||
.map(|e| e as f32)
|
|
||||||
+ 0.5
|
|
||||||
};
|
};
|
||||||
#[cfg(not(feature = "worldgen"))]
|
#[cfg(not(feature = "worldgen"))]
|
||||||
let spawn_point = Vec3::new(0.0, 0.0, 256.0);
|
let spawn_point = Vec3::new(0.0, 0.0, 256.0);
|
||||||
|
@ -165,6 +165,41 @@ impl World {
|
|||||||
|
|
||||||
pub fn sample_blocks(&self) -> BlockGen { BlockGen::new(ColumnGen::new(&self.sim)) }
|
pub fn sample_blocks(&self) -> BlockGen { BlockGen::new(ColumnGen::new(&self.sim)) }
|
||||||
|
|
||||||
|
pub fn find_lowest_accessible_pos(&self, index: IndexRef, chunk_pos: Vec2<i32>) -> Vec3<f32> {
|
||||||
|
// Calculate the middle of the chunk in the world
|
||||||
|
let spawn_wpos = TerrainChunkSize::center_wpos(chunk_pos);
|
||||||
|
|
||||||
|
// Unwrapping because generate_chunk only returns err when should_continue evals
|
||||||
|
// to true
|
||||||
|
let (tc, _cs) = self.generate_chunk(index, chunk_pos, || false).unwrap();
|
||||||
|
let min_z = tc.get_min_z();
|
||||||
|
let max_z = tc.get_max_z();
|
||||||
|
|
||||||
|
let pos = Vec3::new(spawn_wpos.x, spawn_wpos.y, min_z);
|
||||||
|
(0..(max_z - min_z))
|
||||||
|
.map(|z_diff| pos + Vec3::unit_z() * z_diff)
|
||||||
|
.find(|test_pos| {
|
||||||
|
let chunk_relative_xy = test_pos
|
||||||
|
.xy()
|
||||||
|
.map2(TerrainChunkSize::RECT_SIZE, |e, sz| e.rem_euclid(sz as i32));
|
||||||
|
tc.get(
|
||||||
|
Vec3::new(chunk_relative_xy.x, chunk_relative_xy.y, test_pos.z)
|
||||||
|
- Vec3::unit_z(),
|
||||||
|
)
|
||||||
|
.map_or(false, |b| b.is_filled())
|
||||||
|
&& (0..3).all(|z| {
|
||||||
|
tc.get(
|
||||||
|
Vec3::new(chunk_relative_xy.x, chunk_relative_xy.y, test_pos.z)
|
||||||
|
+ Vec3::unit_z() * z,
|
||||||
|
)
|
||||||
|
.map_or(true, |b| !b.is_solid())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.unwrap_or(pos)
|
||||||
|
.map(|e| e as f32)
|
||||||
|
+ 0.5
|
||||||
|
}
|
||||||
|
|
||||||
#[allow(clippy::or_fun_call)] // TODO: Pending review in #587
|
#[allow(clippy::or_fun_call)] // TODO: Pending review in #587
|
||||||
#[allow(clippy::eval_order_dependence)]
|
#[allow(clippy::eval_order_dependence)]
|
||||||
#[allow(clippy::result_unit_err)]
|
#[allow(clippy::result_unit_err)]
|
||||||
|
Loading…
Reference in New Issue
Block a user