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// Add more systems here!