diff --git a/pumpkin-protocol/src/bedrock/client/mod.rs b/pumpkin-protocol/src/bedrock/client/mod.rs index 869a286be..64e18efaf 100644 --- a/pumpkin-protocol/src/bedrock/client/mod.rs +++ b/pumpkin-protocol/src/bedrock/client/mod.rs @@ -20,6 +20,7 @@ pub mod set_actor_data; pub mod set_actor_motion; pub mod set_player_gamemode; pub mod set_time; +pub mod set_title; pub mod start_game; pub mod update_abilities; pub mod update_artributes; diff --git a/pumpkin-protocol/src/bedrock/client/set_title.rs b/pumpkin-protocol/src/bedrock/client/set_title.rs new file mode 100644 index 000000000..5733842f8 --- /dev/null +++ b/pumpkin-protocol/src/bedrock/client/set_title.rs @@ -0,0 +1,37 @@ +use crate::{codec::var_int::VarInt, serial::PacketWrite}; +use pumpkin_macros::packet; + +#[derive(PacketWrite)] +#[packet(88)] +pub struct CSetTitle { + pub action_type: VarInt, + pub text: String, + pub fade_in_duration: VarInt, + pub remain_duration: VarInt, + pub fade_out_duration: VarInt, + pub xuid: String, + pub platform_online_id: String, + pub filtered_message: String, +} + +impl CSetTitle { + #[must_use] + pub fn new( + action_type: i32, + text: String, + fade_in_duration: i32, + remain_duration: i32, + fade_out_duration: i32, + ) -> Self { + Self { + action_type: VarInt(action_type), + text, + fade_in_duration: VarInt(fade_in_duration), + remain_duration: VarInt(remain_duration), + fade_out_duration: VarInt(fade_out_duration), + xuid: String::new(), + platform_online_id: String::new(), + filtered_message: String::new(), + } + } +} diff --git a/pumpkin/src/entity/player.rs b/pumpkin/src/entity/player.rs index 3d803c556..99abe976d 100644 --- a/pumpkin/src/entity/player.rs +++ b/pumpkin/src/entity/player.rs @@ -1542,17 +1542,54 @@ impl Player { } pub async fn show_title(&self, text: &TextComponent, mode: &TitleMode) { - match mode { - TitleMode::Title => self.client.enqueue_packet(&CTitleText::new(text)).await, - TitleMode::SubTitle => self.client.enqueue_packet(&CSubtitle::new(text)).await, - TitleMode::ActionBar => self.client.enqueue_packet(&CActionBar::new(text)).await, + match &self.client { + ClientPlatform::Java(client) => match mode { + TitleMode::Title => client.enqueue_packet(&CTitleText::new(text)).await, + TitleMode::SubTitle => client.enqueue_packet(&CSubtitle::new(text)).await, + TitleMode::ActionBar => client.enqueue_packet(&CActionBar::new(text)).await, + }, + ClientPlatform::Bedrock(client) => { + let action_type = match mode { + TitleMode::Title => 2, + TitleMode::SubTitle => 3, + TitleMode::ActionBar => 4, + }; + client + .send_game_packet( + &pumpkin_protocol::bedrock::client::set_title::CSetTitle::new( + action_type, + text.clone().get_text(), + 0, + 0, + 0, + ), + ) + .await; + } } } pub async fn send_title_animation(&self, fade_in: i32, stay: i32, fade_out: i32) { - self.client - .enqueue_packet(&CTitleAnimation::new(fade_in, stay, fade_out)) - .await; + match &self.client { + ClientPlatform::Java(client) => { + client + .enqueue_packet(&CTitleAnimation::new(fade_in, stay, fade_out)) + .await; + } + ClientPlatform::Bedrock(client) => { + client + .send_game_packet( + &pumpkin_protocol::bedrock::client::set_title::CSetTitle::new( + 5, + String::new(), + fade_in, + stay, + fade_out, + ), + ) + .await; + } + } } pub async fn spawn_particle(