75 lines
2.4 KiB
Rust
75 lines
2.4 KiB
Rust
use std::io::Write;
|
|
|
|
use crate::java::client::play::BosseventAction;
|
|
use crate::ser::NetworkWriteExt;
|
|
use crate::{ClientPacket, WritingError};
|
|
use pumpkin_data::packet::clientbound::PLAY_BOSS_EVENT;
|
|
use pumpkin_macros::java_packet;
|
|
use pumpkin_util::version::MinecraftVersion;
|
|
|
|
/// Updates the "Boss Bar" displayed at the top of the player's screen.
|
|
///
|
|
/// This packet is used to manage health bars for entities like the Ender Dragon
|
|
/// or Wither, as well as custom progress bars for server events or raids.
|
|
#[java_packet(PLAY_BOSS_EVENT)]
|
|
pub struct CBossEvent<'a> {
|
|
/// A unique identifier for this specific boss bar instance.
|
|
pub uuid: &'a uuid::Uuid,
|
|
/// The action to perform (Add, Remove, Update Health, etc.).
|
|
pub action: BosseventAction,
|
|
}
|
|
|
|
impl<'a> CBossEvent<'a> {
|
|
#[must_use]
|
|
pub const fn new(uuid: &'a uuid::Uuid, action: BosseventAction) -> Self {
|
|
Self { uuid, action }
|
|
}
|
|
}
|
|
|
|
impl ClientPacket for CBossEvent<'_> {
|
|
fn write_packet_data(
|
|
&self,
|
|
write: impl Write,
|
|
_version: &MinecraftVersion,
|
|
) -> Result<(), WritingError> {
|
|
let mut write = write;
|
|
|
|
write.write_uuid(self.uuid)?;
|
|
let action = &self.action;
|
|
match action {
|
|
BosseventAction::Add {
|
|
title,
|
|
health,
|
|
color,
|
|
division,
|
|
flags,
|
|
} => {
|
|
write.write_var_int(&0.into())?;
|
|
write.write_slice(&title.encode())?;
|
|
write.write_f32_be(*health)?;
|
|
write.write_var_int(color)?;
|
|
write.write_var_int(division)?;
|
|
write.write_u8(*flags)
|
|
}
|
|
BosseventAction::Remove => write.write_var_int(&1.into()),
|
|
BosseventAction::UpdateHealth(health) => {
|
|
write.write_var_int(&2.into())?;
|
|
write.write_f32_be(*health)
|
|
}
|
|
BosseventAction::UpdateTile(title) => {
|
|
write.write_var_int(&3.into())?;
|
|
write.write_slice(&title.encode())
|
|
}
|
|
BosseventAction::UpdateStyle { color, dividers } => {
|
|
write.write_var_int(&4.into())?;
|
|
write.write_var_int(color)?;
|
|
write.write_var_int(dividers)
|
|
}
|
|
BosseventAction::UpdateFlags(flags) => {
|
|
write.write_var_int(&5.into())?;
|
|
write.write_u8(*flags)
|
|
}
|
|
}
|
|
}
|
|
}
|