valence_boss_bar/
components.rs

1use std::borrow::Cow;
2
3use bevy_ecs::prelude::{Bundle, Component};
4use derive_more::{Deref, DerefMut};
5use valence_entity::EntityLayerId;
6use valence_server::protocol::packets::play::boss_bar_s2c::{
7    BossBarAction, BossBarColor, BossBarDivision, BossBarFlags,
8};
9use valence_server::{Text, UniqueId};
10
11/// The bundle of components that make up a boss bar.
12#[derive(Bundle, Default)]
13pub struct BossBarBundle {
14    pub id: UniqueId,
15    pub title: BossBarTitle,
16    pub health: BossBarHealth,
17    pub style: BossBarStyle,
18    pub flags: BossBarFlags,
19    pub layer: EntityLayerId,
20}
21
22/// The title of a boss bar.
23#[derive(Component, Clone, Default, Deref, DerefMut)]
24pub struct BossBarTitle(pub Text);
25
26impl ToPacketAction for BossBarTitle {
27    fn to_packet_action(&self) -> BossBarAction {
28        BossBarAction::UpdateTitle(Cow::Borrowed(&self.0))
29    }
30}
31
32/// The health of a boss bar.
33#[derive(Component, Default, Deref, DerefMut)]
34pub struct BossBarHealth(pub f32);
35
36impl ToPacketAction for BossBarHealth {
37    fn to_packet_action(&self) -> BossBarAction {
38        BossBarAction::UpdateHealth(self.0)
39    }
40}
41
42/// The style of a boss bar. This includes the color and division of the boss
43/// bar.
44#[derive(Component, Default)]
45pub struct BossBarStyle {
46    pub color: BossBarColor,
47    pub division: BossBarDivision,
48}
49
50impl ToPacketAction for BossBarStyle {
51    fn to_packet_action(&self) -> BossBarAction {
52        BossBarAction::UpdateStyle(self.color, self.division)
53    }
54}
55
56impl ToPacketAction for BossBarFlags {
57    fn to_packet_action(&self) -> BossBarAction {
58        BossBarAction::UpdateFlags(*self)
59    }
60}
61
62/// Trait for converting a component to a boss bar action.
63pub(crate) trait ToPacketAction {
64    fn to_packet_action(&self) -> BossBarAction;
65}