playground/
playground.rs
1use valence::log::LogPlugin;
2use valence::prelude::*;
3
4#[allow(unused_imports)]
5use crate::extras::*;
6
7const SPAWN_Y: i32 = 64;
8
9pub(crate) fn build_app(app: &mut App) {
10 app.insert_resource(NetworkSettings {
11 connection_mode: ConnectionMode::Offline,
12 ..Default::default()
13 })
14 .add_plugins(DefaultPlugins.build().disable::<LogPlugin>())
15 .add_systems(Startup, setup)
16 .add_systems(EventLoopUpdate, toggle_gamemode_on_sneak)
17 .add_systems(Update, (init_clients, despawn_disconnected_clients))
18 .run();
19}
20
21fn setup(
22 mut commands: Commands,
23 server: Res<Server>,
24 biomes: Res<BiomeRegistry>,
25 dimensions: Res<DimensionTypeRegistry>,
26) {
27 let mut layer = LayerBundle::new(ident!("overworld"), &dimensions, &biomes, &server);
28
29 for z in -5..5 {
30 for x in -5..5 {
31 layer.chunk.insert_chunk([x, z], UnloadedChunk::new());
32 }
33 }
34
35 for z in -25..25 {
36 for x in -25..25 {
37 layer
38 .chunk
39 .set_block([x, SPAWN_Y, z], BlockState::GRASS_BLOCK);
40 }
41 }
42
43 commands.spawn(layer);
44}
45
46fn init_clients(
47 mut clients: Query<
48 (
49 &mut EntityLayerId,
50 &mut VisibleChunkLayer,
51 &mut VisibleEntityLayers,
52 &mut Position,
53 &mut GameMode,
54 ),
55 Added<Client>,
56 >,
57 layers: Query<Entity, (With<ChunkLayer>, With<EntityLayer>)>,
58) {
59 for (
60 mut layer_id,
61 mut visible_chunk_layer,
62 mut visible_entity_layers,
63 mut pos,
64 mut game_mode,
65 ) in &mut clients
66 {
67 let layer = layers.single();
68
69 layer_id.0 = layer;
70 visible_chunk_layer.0 = layer;
71 visible_entity_layers.0.insert(layer);
72 pos.set([0.0, f64::from(SPAWN_Y) + 1.0, 0.0]);
73 *game_mode = GameMode::Creative;
74 }
75}
76
77