Skip to content

Client Component Division #266

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 31 commits into from
Mar 11, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
345dd25
Set up initial changes
rj00a Mar 3, 2023
07b951d
Revert McEntity -> Actor change
rj00a Mar 4, 2023
af62094
Merge branch 'main' into component-division
rj00a Mar 4, 2023
16bd139
Implement client systems
rj00a Mar 5, 2023
a40ab10
clean up `inventory`, get `valence` to build
rj00a Mar 6, 2023
b7b4f54
Stylistic tweaks in `inventory`
rj00a Mar 6, 2023
54955d5
Merge branch 'main' into component-division
rj00a Mar 6, 2023
cc8be1e
fix unit tests not building for `component-division` (#271)
dyc3 Mar 6, 2023
c1e6d3e
fix inventory tests on `component-division` (#275)
dyc3 Mar 7, 2023
344479e
Some progress on examples
rj00a Mar 8, 2023
f613625
Merge branch 'main' into component-division
rj00a Mar 8, 2023
4ef443c
misc fixes for `component-division` (#278)
dyc3 Mar 8, 2023
5c413b9
fix playground
dyc3 Mar 8, 2023
f532d38
Fix warnings
rj00a Mar 9, 2023
130a6fa
Make client scratch buffer a separate component
rj00a Mar 9, 2023
3d279e9
Fix lints
rj00a Mar 9, 2023
b054ac1
Fix failing chunk test
rj00a Mar 9, 2023
d53131a
Merge branch 'main' into component-division
rj00a Mar 9, 2023
c75fc2a
fix conway and text examples
dyc3 Mar 9, 2023
e80179f
Fix teleports
rj00a Mar 10, 2023
dd00b27
Properly spawn player entities in most examples
rj00a Mar 10, 2023
9fc292e
Combine yaw and pitch components.
rj00a Mar 10, 2023
ce026c0
Fix OldLocation not being updated properly
rj00a Mar 10, 2023
ea39346
Apply SystemState in event loop
rj00a Mar 10, 2023
6b74b8a
Merge branch 'main' into component-division
rj00a Mar 10, 2023
f7dd705
Fix block entities example
rj00a Mar 11, 2023
02a96f5
Fix parkour example
rj00a Mar 11, 2023
bd3afb2
Fix remaining issues
rj00a Mar 11, 2023
86fc928
Merge branch 'main' into component-division
rj00a Mar 11, 2023
93c0300
Fix broken doc test
rj00a Mar 11, 2023
855de34
Fix lints in examples
rj00a Mar 11, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions crates/playground/src/extras.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,17 @@ use valence::prelude::*;
/// Toggles client's game mode between survival and creative when they start
/// sneaking.
pub fn toggle_gamemode_on_sneak(
mut clients: Query<&mut Client>,
mut clients: Query<&mut GameMode>,
mut events: EventReader<StartSneaking>,
) {
for event in events.iter() {
let Ok(mut client) = clients.get_component_mut::<Client>(event.client) else {
let Ok(mut mode) = clients.get_component_mut::<GameMode>(event.client) else {
continue;
};
let mode = client.game_mode();
client.set_game_mode(match mode {
*mode = match *mode {
GameMode::Survival => GameMode::Creative,
GameMode::Creative => GameMode::Survival,
_ => GameMode::Creative,
});
};
}
}
13 changes: 5 additions & 8 deletions crates/playground/src/playground.template.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ const SPAWN_Y: i32 = 64;

pub fn build_app(app: &mut App) {
app.add_plugin(ServerPlugin::new(()))
.add_system(default_event_handler.in_schedule(EventLoopSchedule))
.add_startup_system(setup)
.add_system(default_event_handler.in_schedule(EventLoopSchedule))
.add_system(init_clients)
.add_system(despawn_disconnected_clients);
}
Expand All @@ -34,15 +34,12 @@ fn setup(mut commands: Commands, server: Res<Server>) {
}

fn init_clients(
mut clients: Query<&mut Client, Added<Client>>,
mut clients: Query<(&mut Position, &mut Location), Added<Client>>,
instances: Query<Entity, With<Instance>>,
) {
let instance = instances.get_single().unwrap();

for mut client in &mut clients {
client.set_position([0.5, SPAWN_Y as f64 + 1.0, 0.5]);
client.set_instance(instance);
client.set_game_mode(GameMode::Survival);
for (mut pos, mut loc) in &mut clients {
pos.0 = [0.5, SPAWN_Y as f64 + 1.0, 0.5].into();
loc.0 = instances.single();
}
}

Expand Down
31 changes: 20 additions & 11 deletions crates/valence/examples/bench_players.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(clippy::type_complexity)]

use std::time::Instant;

use valence::client::despawn_disconnected_clients;
Expand Down Expand Up @@ -65,19 +67,26 @@ fn setup(mut commands: Commands, server: Res<Server>) {
}

fn init_clients(
mut clients: Query<(Entity, &mut Client), Added<Client>>,
mut clients: Query<
(
Entity,
&UniqueId,
&mut Position,
&mut Location,
&mut GameMode,
),
Added<Client>,
>,
instances: Query<Entity, With<Instance>>,
mut commands: Commands,
) {
let instance = instances.single();

for (client_entity, mut client) in &mut clients {
client.set_position([0.0, SPAWN_Y as f64 + 1.0, 0.0]);
client.set_instance(instance);
client.set_game_mode(GameMode::Creative);

let player_entity = McEntity::with_uuid(EntityKind::Player, instance, client.uuid());

commands.entity(client_entity).insert(player_entity);
for (entity, unique_id, mut pos, mut loc, mut game_mode) in &mut clients {
pos.0 = [0.0, SPAWN_Y as f64 + 1.0, 0.0].into();
loc.0 = instances.single();
*game_mode = GameMode::Creative;

commands
.entity(entity)
.insert(McEntity::with_uuid(EntityKind::Player, loc.0, unique_id.0));
}
}
14 changes: 7 additions & 7 deletions crates/valence/examples/biomes.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(clippy::type_complexity)]

use valence::client::despawn_disconnected_clients;
use valence::client::event::default_event_handler;
use valence::prelude::*;
Expand Down Expand Up @@ -77,14 +79,12 @@ fn setup(mut commands: Commands, server: Res<Server>) {
}

fn init_clients(
mut clients: Query<&mut Client, Added<Client>>,
mut clients: Query<(&mut Position, &mut Location, &mut GameMode), Added<Client>>,
instances: Query<Entity, With<Instance>>,
) {
for mut client in &mut clients {
client.set_position([0.0, SPAWN_Y as f64 + 1.0, 0.0]);
client.set_respawn_screen(true);
client.set_instance(instances.single());
client.set_game_mode(GameMode::Creative);
client.send_message("Welcome to Valence!".italic());
for (mut pos, mut loc, mut game_mode) in &mut clients {
pos.set([0.0, SPAWN_Y as f64 + 1.0, 0.0]);
loc.0 = instances.single();
*game_mode = GameMode::Creative;
}
}
43 changes: 30 additions & 13 deletions crates/valence/examples/block_entities.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(clippy::type_complexity)]

use valence::client::despawn_disconnected_clients;
use valence::client::event::{default_event_handler, ChatMessage, PlayerInteractBlock};
use valence::nbt::{compound, List};
Expand Down Expand Up @@ -61,19 +63,34 @@ fn setup(mut commands: Commands, server: Res<Server>) {
}

fn init_clients(
mut clients: Query<&mut Client, Added<Client>>,
mut clients: Query<
(
Entity,
&UniqueId,
&mut Position,
&mut Look,
&mut Location,
&mut GameMode,
),
Added<Client>,
>,
instances: Query<Entity, With<Instance>>,
mut commands: Commands,
) {
for mut client in &mut clients {
client.set_position([1.5, FLOOR_Y as f64 + 1.0, 1.5]);
client.set_yaw(-90.0);
client.set_instance(instances.single());
client.set_game_mode(GameMode::Creative);
for (entity, uuid, mut pos, mut look, mut loc, mut game_mode) in &mut clients {
pos.set([1.5, FLOOR_Y as f64 + 1.0, 1.5]);
look.yaw = -90.0;
loc.0 = instances.single();
*game_mode = GameMode::Creative;

commands
.entity(entity)
.insert(McEntity::with_uuid(EntityKind::Player, loc.0, uuid.0));
}
}

fn event_handler(
clients: Query<&Client>,
clients: Query<(&Username, &Properties, &UniqueId)>,
mut messages: EventReader<ChatMessage>,
mut block_interacts: EventReader<PlayerInteractBlock>,
mut instances: Query<&mut Instance>,
Expand All @@ -83,14 +100,14 @@ fn event_handler(
client, message, ..
} in messages.iter()
{
let Ok(client) = clients.get(*client) else {
let Ok((username, _, _)) = clients.get(*client) else {
continue
};

let mut sign = instance.block_mut(SIGN_POS).unwrap();
let nbt = sign.nbt_mut().unwrap();
nbt.insert("Text2", message.to_string().color(Color::DARK_GREEN));
nbt.insert("Text3", format!("~{}", client.username()).italic());
nbt.insert("Text3", format!("~{}", username).italic());
}

for PlayerInteractBlock {
Expand All @@ -101,19 +118,19 @@ fn event_handler(
} in block_interacts.iter()
{
if *hand == Hand::Main && *position == SKULL_POS {
let Ok(client) = clients.get(*client) else {
let Ok((_, properties, uuid)) = clients.get(*client) else {
continue
};

let Some(textures) = client.properties().iter().find(|prop| prop.name == "textures") else {
continue
let Some(textures) = properties.textures() else {
continue;
};

let mut skull = instance.block_mut(SKULL_POS).unwrap();
let nbt = skull.nbt_mut().unwrap();
*nbt = compound! {
"SkullOwner" => compound! {
"Id" => client.uuid(),
"Id" => uuid.0,
"Properties" => compound! {
"textures" => List::Compound(vec![compound! {
"Value" => textures.value.clone(),
Expand Down
55 changes: 35 additions & 20 deletions crates/valence/examples/building.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
#![allow(clippy::type_complexity)]

use valence::client::despawn_disconnected_clients;
use valence::client::event::{
default_event_handler, PlayerInteractBlock, StartDigging, StartSneaking, StopDestroyBlock,
Expand Down Expand Up @@ -48,85 +50,98 @@ fn setup(mut commands: Commands, server: Res<Server>) {
}

fn init_clients(
mut clients: Query<&mut Client, Added<Client>>,
mut clients: Query<
(
Entity,
&UniqueId,
&mut Client,
&mut Position,
&mut Location,
&mut GameMode,
),
Added<Client>,
>,
instances: Query<Entity, With<Instance>>,
mut commands: Commands,
) {
for mut client in &mut clients {
client.set_position([0.0, SPAWN_Y as f64 + 1.0, 0.0]);
client.set_instance(instances.single());
client.set_game_mode(GameMode::Creative);
for (entity, uuid, mut client, mut pos, mut loc, mut game_mode) in &mut clients {
pos.0 = [0.0, SPAWN_Y as f64 + 1.0, 0.0].into();
loc.0 = instances.single();
*game_mode = GameMode::Creative;
client.send_message("Welcome to Valence! Build something cool.".italic());
commands
.entity(entity)
.insert(McEntity::with_uuid(EntityKind::Player, loc.0, uuid.0));
}
}

fn toggle_gamemode_on_sneak(
mut clients: Query<&mut Client>,
mut clients: Query<&mut GameMode>,
mut events: EventReader<StartSneaking>,
) {
for event in events.iter() {
let Ok(mut client) = clients.get_component_mut::<Client>(event.client) else {
let Ok(mut mode) = clients.get_component_mut::<GameMode>(event.client) else {
continue;
};
let mode = client.game_mode();
client.set_game_mode(match mode {
*mode = match *mode {
GameMode::Survival => GameMode::Creative,
GameMode::Creative => GameMode::Survival,
_ => GameMode::Creative,
});
};
}
}

fn digging_creative_mode(
clients: Query<&Client>,
clients: Query<&GameMode>,
mut instances: Query<&mut Instance>,
mut events: EventReader<StartDigging>,
) {
let mut instance = instances.single_mut();

for event in events.iter() {
let Ok(client) = clients.get_component::<Client>(event.client) else {
let Ok(game_mode) = clients.get(event.client) else {
continue;
};
if client.game_mode() == GameMode::Creative {
if *game_mode == GameMode::Creative {
instance.set_block(event.position, BlockState::AIR);
}
}
}

fn digging_survival_mode(
clients: Query<&Client>,
clients: Query<&GameMode>,
mut instances: Query<&mut Instance>,
mut events: EventReader<StopDestroyBlock>,
) {
let mut instance = instances.single_mut();

for event in events.iter() {
let Ok(client) = clients.get_component::<Client>(event.client) else {
let Ok(game_mode) = clients.get(event.client) else {
continue;
};
if client.game_mode() == GameMode::Survival {
if *game_mode == GameMode::Survival {
instance.set_block(event.position, BlockState::AIR);
}
}
}

fn place_blocks(
mut clients: Query<(&Client, &mut Inventory)>,
mut clients: Query<(&mut Inventory, &GameMode, &PlayerInventoryState)>,
mut instances: Query<&mut Instance>,
mut events: EventReader<PlayerInteractBlock>,
) {
let mut instance = instances.single_mut();

for event in events.iter() {
let Ok((client, mut inventory)) = clients.get_mut(event.client) else {
let Ok((mut inventory, game_mode, inv_state)) = clients.get_mut(event.client) else {
continue;
};
if event.hand != Hand::Main {
continue;
}

// get the held item
let slot_id = client.held_item_slot();
let slot_id = inv_state.held_item_slot();
let Some(stack) = inventory.slot(slot_id) else {
// no item in the slot
continue;
Expand All @@ -137,7 +152,7 @@ fn place_blocks(
continue;
};

if client.game_mode() == GameMode::Survival {
if *game_mode == GameMode::Survival {
// check if the player has the item in their inventory and remove
// it.
if stack.count() > 1 {
Expand Down
Loading