1use std::borrow::Cow;
23use 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};
1011/// The bundle of components that make up a boss bar.
12#[derive(Bundle, Default)]
13pub struct BossBarBundle {
14pub id: UniqueId,
15pub title: BossBarTitle,
16pub health: BossBarHealth,
17pub style: BossBarStyle,
18pub flags: BossBarFlags,
19pub layer: EntityLayerId,
20}
2122/// The title of a boss bar.
23#[derive(Component, Clone, Default, Deref, DerefMut)]
24pub struct BossBarTitle(pub Text);
2526impl ToPacketAction for BossBarTitle {
27fn to_packet_action(&self) -> BossBarAction {
28 BossBarAction::UpdateTitle(Cow::Borrowed(&self.0))
29 }
30}
3132/// The health of a boss bar.
33#[derive(Component, Default, Deref, DerefMut)]
34pub struct BossBarHealth(pub f32);
3536impl ToPacketAction for BossBarHealth {
37fn to_packet_action(&self) -> BossBarAction {
38 BossBarAction::UpdateHealth(self.0)
39 }
40}
4142/// The style of a boss bar. This includes the color and division of the boss
43/// bar.
44#[derive(Component, Default)]
45pub struct BossBarStyle {
46pub color: BossBarColor,
47pub division: BossBarDivision,
48}
4950impl ToPacketAction for BossBarStyle {
51fn to_packet_action(&self) -> BossBarAction {
52 BossBarAction::UpdateStyle(self.color, self.division)
53 }
54}
5556impl ToPacketAction for BossBarFlags {
57fn to_packet_action(&self) -> BossBarAction {
58 BossBarAction::UpdateFlags(*self)
59 }
60}
6162/// Trait for converting a component to a boss bar action.
63pub(crate) trait ToPacketAction {
64fn to_packet_action(&self) -> BossBarAction;
65}