fmc_vanilla 0.0.2

Bare-bones implementation of an fmc server
use fmc::{
    networking::{NetworkMessage, Server},
    players::Player,
    prelude::*,
    protocol::messages,
};

use crate::players::Hotbar;

pub struct HotbarPlugin;
impl Plugin for HotbarPlugin {
    fn build(&self, app: &mut App) {
        app.add_systems(
            Update,
            (initialize_interface, send_server_updates, equip_item),
        );
    }
}

fn initialize_interface(net: Res<Server>, new_player_query: Query<Entity, Added<Player>>) {
    for player_entity in new_player_query.iter() {
        net.send_one(
            player_entity,
            messages::InterfaceVisibilityUpdate {
                interface_path: "hotbar".to_owned(),
                visible: true,
            },
        );
    }
}

fn send_server_updates(net: Res<Server>, hotbar_query: Query<(Entity, &Hotbar), Changed<Hotbar>>) {
    for (player_entity, hotbar) in hotbar_query.iter() {
        let mut hotbar_node = messages::InterfaceItemBoxUpdate::default();
        for (i, item_stack) in hotbar.iter().enumerate() {
            if let Some(item) = item_stack.item() {
                hotbar_node.add_itembox(
                    "hotbar",
                    i as u32,
                    item.id,
                    item_stack.size(),
                    item.properties["durability"].as_u64().map(|v| v as u32),
                    item.properties["description"].as_str(),
                );
            } else {
                hotbar_node.add_empty_itembox("hotbar", i as u32);
            }
        }

        net.send_one(player_entity, hotbar_node);
    }
}
fn equip_item(
    net: Res<Server>,
    mut equip_events: EventReader<NetworkMessage<messages::InterfaceEquipItem>>,
    mut hotbar: Query<&mut Hotbar>,
) {
    for equip_event in equip_events.read() {
        if equip_event.interface_path != "hotbar" {
            return;
        }

        if equip_event.index > 8 {
            net.disconnect(equip_event.player_entity);
            continue;
        }

        let mut hotbar = hotbar.get_mut(equip_event.player_entity).unwrap();
        hotbar.equipped_item = equip_event.index as usize;
    }
}