mirror of
https://github.com/italicsjenga/valence.git
synced 2024-12-23 14:31:30 +11:00
Make superflat option per client rather than per world
This commit is contained in:
parent
a5a560220c
commit
3649a8ca99
|
@ -87,7 +87,6 @@ impl Config for Game {
|
|||
fn init(&self, server: &mut Server<Self>) {
|
||||
let (_, world) = server.worlds.insert(DimensionId::default(), ());
|
||||
server.state = Some(server.player_lists.insert(()).0);
|
||||
world.meta.set_flat(true);
|
||||
|
||||
let min_y = server.shared.dimension(DimensionId::default()).min_y;
|
||||
|
||||
|
@ -117,7 +116,7 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
fn update(&self, server: &mut Server<Self>) {
|
||||
let (world_id, world) = server.worlds.iter_mut().next().unwrap();
|
||||
let (world_id, _) = server.worlds.iter_mut().next().unwrap();
|
||||
|
||||
let current_tick = server.shared.current_tick();
|
||||
|
||||
|
@ -152,6 +151,7 @@ impl Config for Game {
|
|||
client.state.extra_knockback = true;
|
||||
|
||||
client.spawn(world_id);
|
||||
client.set_flat(true);
|
||||
client.set_game_mode(GameMode::Survival);
|
||||
client.teleport(
|
||||
[
|
||||
|
|
|
@ -101,7 +101,6 @@ impl Config for Game {
|
|||
fn init(&self, server: &mut Server<Self>) {
|
||||
let world = server.worlds.insert(DimensionId::default(), ()).1;
|
||||
server.state.player_list = Some(server.player_lists.insert(()).0);
|
||||
world.meta.set_flat(true);
|
||||
|
||||
for chunk_z in -2..Integer::div_ceil(&(SIZE_X as i32), &16) + 2 {
|
||||
for chunk_x in -2..Integer::div_ceil(&(SIZE_Z as i32), &16) + 2 {
|
||||
|
@ -144,6 +143,7 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
client.spawn(world_id);
|
||||
client.set_flat(true);
|
||||
client.teleport(spawn_pos, 0.0, 0.0);
|
||||
client.set_player_list(server.state.player_list.clone());
|
||||
|
||||
|
|
|
@ -81,7 +81,6 @@ impl Config for Game {
|
|||
fn init(&self, server: &mut Server<Self>) {
|
||||
let (world_id, world) = server.worlds.insert(DimensionId::default(), ());
|
||||
server.state.player_list = Some(server.player_lists.insert(()).0);
|
||||
world.meta.set_flat(true);
|
||||
|
||||
let size = 5;
|
||||
for z in -size..size {
|
||||
|
@ -127,6 +126,7 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
client.spawn(world_id);
|
||||
client.set_flat(true);
|
||||
client.set_game_mode(GameMode::Creative);
|
||||
client.teleport(
|
||||
[
|
||||
|
|
|
@ -76,7 +76,6 @@ impl Config for Game {
|
|||
fn init(&self, server: &mut Server<Self>) {
|
||||
let (world_id, world) = server.worlds.insert(DimensionId::default(), ());
|
||||
server.state = Some(server.player_lists.insert(()).0);
|
||||
world.meta.set_flat(true);
|
||||
|
||||
let size = 5;
|
||||
for z in -size..size {
|
||||
|
@ -127,6 +126,7 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
client.spawn(world_id);
|
||||
client.set_flat(true);
|
||||
client.set_game_mode(GameMode::Creative);
|
||||
client.teleport(
|
||||
[
|
||||
|
|
|
@ -84,9 +84,8 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
fn init(&self, server: &mut Server<Self>) {
|
||||
let (_, world) = server.worlds.insert(DimensionId::default(), ());
|
||||
server.worlds.insert(DimensionId::default(), ());
|
||||
server.state = Some(server.player_lists.insert(()).0);
|
||||
world.meta.set_flat(true);
|
||||
}
|
||||
|
||||
fn update(&self, server: &mut Server<Self>) {
|
||||
|
@ -119,6 +118,7 @@ impl Config for Game {
|
|||
}
|
||||
|
||||
client.spawn(world_id);
|
||||
client.set_flat(true);
|
||||
client.set_game_mode(GameMode::Creative);
|
||||
client.teleport([0.0, 200.0, 0.0], 0.0, 0.0);
|
||||
client.set_player_list(server.state.clone());
|
||||
|
|
|
@ -227,6 +227,7 @@ pub struct Client<C: Config> {
|
|||
#[bitfield(u16)]
|
||||
struct ClientBits {
|
||||
spawn: bool,
|
||||
flat: bool,
|
||||
teleported_this_tick: bool,
|
||||
/// If spawn_position or spawn_position_yaw were modified this tick.
|
||||
modified_spawn_position: bool,
|
||||
|
@ -238,7 +239,7 @@ struct ClientBits {
|
|||
velocity_modified: bool,
|
||||
created_this_tick: bool,
|
||||
view_distance_modified: bool,
|
||||
#[bits(6)]
|
||||
#[bits(5)]
|
||||
_pad: u8,
|
||||
}
|
||||
|
||||
|
@ -325,6 +326,20 @@ impl<C: Config> Client<C> {
|
|||
mem::replace(&mut self.new_player_list, id)
|
||||
}
|
||||
|
||||
/// Sets if this client sees the world as superflat. Superflat worlds have
|
||||
/// a horizon line lower than normal worlds.
|
||||
///
|
||||
/// The player must be spawned for changes to take effect.
|
||||
pub fn set_flat(&mut self, flat: bool) {
|
||||
self.bits.set_flat(flat);
|
||||
}
|
||||
|
||||
/// Gets if this client sees the world as superflat. Superflat worlds have
|
||||
/// a horizon line lower than normal worlds.
|
||||
pub fn is_flat(&self) -> bool {
|
||||
self.bits.flat()
|
||||
}
|
||||
|
||||
/// Changes the world this client is located in and respawns the client.
|
||||
/// This can be used to respawn the client after death.
|
||||
///
|
||||
|
@ -862,7 +877,7 @@ impl<C: Config> Client<C> {
|
|||
let current_tick = shared.current_tick();
|
||||
|
||||
// Send the join game packet and other initial packets. We defer this until now
|
||||
// so that the user can set the client's location, game mode, etc.
|
||||
// so that the user can set the client's initial location, game mode, etc.
|
||||
if self.created_this_tick() {
|
||||
if let Some(id) = &self.new_player_list {
|
||||
player_lists
|
||||
|
@ -899,7 +914,7 @@ impl<C: Config> Client<C> {
|
|||
reduced_debug_info: false,
|
||||
enable_respawn_screen: false,
|
||||
is_debug: false,
|
||||
is_flat: world.meta.is_flat(),
|
||||
is_flat: self.bits.flat(),
|
||||
last_death_location: self
|
||||
.death_location
|
||||
.map(|(id, pos)| (ident!("{LIBRARY_NAMESPACE}:dimension_{}", id.0), pos)),
|
||||
|
@ -921,7 +936,7 @@ impl<C: Config> Client<C> {
|
|||
game_mode: self.game_mode(),
|
||||
previous_game_mode: self.game_mode(),
|
||||
is_debug: false,
|
||||
is_flat: false,
|
||||
is_flat: self.bits.flat(),
|
||||
copy_metadata: true,
|
||||
last_death_location: None,
|
||||
});
|
||||
|
@ -939,7 +954,7 @@ impl<C: Config> Client<C> {
|
|||
game_mode: self.game_mode(),
|
||||
previous_game_mode: self.game_mode(),
|
||||
is_debug: false,
|
||||
is_flat: world.meta.is_flat(),
|
||||
is_flat: self.bits.flat(),
|
||||
copy_metadata: true,
|
||||
last_death_location: self
|
||||
.death_location
|
||||
|
|
21
src/world.rs
21
src/world.rs
|
@ -49,10 +49,7 @@ impl<C: Config> Worlds<C> {
|
|||
state,
|
||||
spatial_index: SpatialIndex::new(),
|
||||
chunks: Chunks::new(self.server.clone(), dim),
|
||||
meta: WorldMeta {
|
||||
dimension: dim,
|
||||
is_flat: false,
|
||||
},
|
||||
meta: WorldMeta { dimension: dim },
|
||||
});
|
||||
|
||||
(WorldId(id), world)
|
||||
|
@ -136,8 +133,6 @@ pub struct World<C: Config> {
|
|||
/// Contains miscellaneous world state.
|
||||
pub struct WorldMeta {
|
||||
dimension: DimensionId,
|
||||
is_flat: bool,
|
||||
// TODO: time, weather
|
||||
}
|
||||
|
||||
impl WorldMeta {
|
||||
|
@ -145,18 +140,4 @@ impl WorldMeta {
|
|||
pub fn dimension(&self) -> DimensionId {
|
||||
self.dimension
|
||||
}
|
||||
|
||||
/// Gets if this world is considered a superflat world. Superflat worlds
|
||||
/// have a horizon line at y=0.
|
||||
pub fn is_flat(&self) -> bool {
|
||||
self.is_flat
|
||||
}
|
||||
|
||||
/// Sets if this world is considered a superflat world. Superflat worlds
|
||||
/// have a horizon line at y=0.
|
||||
///
|
||||
/// Clients already in the world must be respawned to see any changes.
|
||||
pub fn set_flat(&mut self, flat: bool) {
|
||||
self.is_flat = flat;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue