fmc_vanilla 0.0.1

Bare-bones implementation of an fmc server
use fmc::{
    blocks::{BlockId, Blocks},
    items::Items,
    players::Player,
    prelude::*,
};

use crate::players::Inventory;

use super::{ItemUses, UsableItems};

pub struct BreadPlugin;
impl Plugin for BreadPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(Startup, register_bread)
            .add_systems(Update, eat_bread.after(super::RegisterItemUse));
    }
}

#[derive(Component)]
struct Bread(BlockId);

fn register_bread(
    mut commands: Commands,
    blocks: Res<Blocks>,
    items: Res<Items>,
    mut usable_items: ResMut<UsableItems>,
) {
    usable_items.insert(
        items.get_id("bread").unwrap(),
        commands
            .spawn((ItemUses::default(), Bread(blocks.get_id("bread"))))
            .id(),
    );
}

fn eat_bread(
    mut bread_uses: Query<&mut ItemUses, (With<Bread>, Changed<ItemUses>)>,
    mut player_query: Query<&mut Inventory, With<Player>>,
) {
    let Ok(mut uses) = bread_uses.get_single_mut() else {
        return;
    };

    for player_entity in uses.read() {
        let mut inventory = player_query.get_mut(player_entity).unwrap();
        let held_item = inventory.held_item_stack_mut();

        held_item.take(1);
    }
}