fix: SEmote packet

This commit is contained in:
Alexander Medvedev 2026-08-09 18:48:59 +02:00
parent 92658f5853
commit b18c26ccb4
3 changed files with 27 additions and 22 deletions

View File

@ -11,8 +11,8 @@ pub const EMOTE_FLAG_MUTE_CHAT: u8 = 1 << 1;
#[packet(138)] #[packet(138)]
pub struct SEmote<'a> { pub struct SEmote<'a> {
pub runtime_entity_id: VarULong, pub runtime_entity_id: VarULong,
pub emote_id: Cow<'a, str>,
pub emote_length: VarUInt, pub emote_length: VarUInt,
pub emote_id: Cow<'a, str>,
pub xuid: Cow<'a, str>, pub xuid: Cow<'a, str>,
pub platform_id: Cow<'a, str>, pub platform_id: Cow<'a, str>,
pub flags: u8, pub flags: u8,
@ -21,15 +21,15 @@ pub struct SEmote<'a> {
impl<'a> PacketReadSlice<'a> for SEmote<'a> { impl<'a> PacketReadSlice<'a> for SEmote<'a> {
fn read_slice(buf: &mut &'a [u8]) -> Result<Self, Error> { fn read_slice(buf: &mut &'a [u8]) -> Result<Self, Error> {
let runtime_entity_id = VarULong::read_slice(buf)?; let runtime_entity_id = VarULong::read_slice(buf)?;
let emote_id = Cow::Borrowed(read_str_slice(buf)?);
let emote_length = VarUInt::read_slice(buf)?; let emote_length = VarUInt::read_slice(buf)?;
let emote_id = Cow::Borrowed(read_str_slice(buf)?);
let xuid = Cow::Borrowed(read_str_slice(buf)?); let xuid = Cow::Borrowed(read_str_slice(buf)?);
let platform_id = Cow::Borrowed(read_str_slice(buf)?); let platform_id = Cow::Borrowed(read_str_slice(buf)?);
let flags = u8::read_slice(buf)?; let flags = u8::read_slice(buf)?;
Ok(Self { Ok(Self {
runtime_entity_id, runtime_entity_id,
emote_id,
emote_length, emote_length,
emote_id,
xuid, xuid,
platform_id, platform_id,
flags, flags,
@ -41,8 +41,8 @@ impl PacketRead for SEmote<'static> {
fn read<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { fn read<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> {
Ok(Self { Ok(Self {
runtime_entity_id: VarULong::read(reader)?, runtime_entity_id: VarULong::read(reader)?,
emote_id: Cow::Owned(String::read(reader)?),
emote_length: VarUInt::read(reader)?, emote_length: VarUInt::read(reader)?,
emote_id: Cow::Owned(String::read(reader)?),
xuid: Cow::Owned(String::read(reader)?), xuid: Cow::Owned(String::read(reader)?),
platform_id: Cow::Owned(String::read(reader)?), platform_id: Cow::Owned(String::read(reader)?),
flags: u8::read(reader)?, flags: u8::read(reader)?,
@ -53,8 +53,8 @@ impl PacketRead for SEmote<'static> {
impl PacketWrite for SEmote<'_> { impl PacketWrite for SEmote<'_> {
fn write<W: Write>(&self, writer: &mut W) -> Result<(), Error> { fn write<W: Write>(&self, writer: &mut W) -> Result<(), Error> {
self.runtime_entity_id.write(writer)?; self.runtime_entity_id.write(writer)?;
self.emote_id.as_ref().write(writer)?;
self.emote_length.write(writer)?; self.emote_length.write(writer)?;
self.emote_id.as_ref().write(writer)?;
self.xuid.as_ref().write(writer)?; self.xuid.as_ref().write(writer)?;
self.platform_id.as_ref().write(writer)?; self.platform_id.as_ref().write(writer)?;
self.flags.write(writer) self.flags.write(writer)

View File

@ -26,9 +26,9 @@ use pumpkin_protocol::{
server::{ server::{
animate::SAnimate, block_pick_request::SBlockPickRequest, animate::SAnimate, block_pick_request::SBlockPickRequest,
client_cache_status::SClientCacheStatus, command_request::SCommandRequest, client_cache_status::SClientCacheStatus, command_request::SCommandRequest,
container_close::SContainerClose, emote::SEmote, interaction::SInteraction, container_close::SContainerClose, emote::SEmote, emote_list::SEmoteList,
inventory_transaction::SInventoryTransaction, loading_screen::SLoadingScreen, interaction::SInteraction, inventory_transaction::SInventoryTransaction,
login::SLogin, mob_equipment::SMobEquipment, loading_screen::SLoadingScreen, login::SLogin, mob_equipment::SMobEquipment,
packet_violation_warning::SPacketViolationWarning, player_action::SPlayerAction, packet_violation_warning::SPacketViolationWarning, player_action::SPlayerAction,
player_auth_input::SPlayerAuthInput, request_ability::SRequestAbility, player_auth_input::SPlayerAuthInput, request_ability::SRequestAbility,
request_chunk_radius::SRequestChunkRadius, request_chunk_radius::SRequestChunkRadius,
@ -624,6 +624,7 @@ impl BedrockClient {
} }
} }
#[allow(clippy::too_many_lines)]
pub async fn handle_play_packet( pub async fn handle_play_packet(
&self, &self,
player: &Arc<Player>, player: &Arc<Player>,
@ -690,9 +691,9 @@ impl BedrockClient {
SEmote::PACKET_ID => { SEmote::PACKET_ID => {
self.handle_emote(player, server, SEmote::read_slice(reader)?).await; self.handle_emote(player, server, SEmote::read_slice(reader)?).await;
} }
// SEmoteList::PACKET_ID => { SEmoteList::PACKET_ID => {
// self.handle_emote_list(player, server, SEmoteList::read(reader)?); self.handle_emote_list(player, server, &SEmoteList::read(reader)?);
// } }
pumpkin_protocol::bedrock::server::modal_form_response::SModalFormResponse::PACKET_ID => { pumpkin_protocol::bedrock::server::modal_form_response::SModalFormResponse::PACKET_ID => {
self.handle_modal_form_response( self.handle_modal_form_response(
player, player,

View File

@ -28,6 +28,7 @@ use pumpkin_protocol::{
command_request::SCommandRequest, command_request::SCommandRequest,
container_close::SContainerClose, container_close::SContainerClose,
emote::SEmote, emote::SEmote,
emote_list::SEmoteList,
interaction::{Action, SInteraction}, interaction::{Action, SInteraction},
inventory_transaction::{SInventoryTransaction, TransactionData}, inventory_transaction::{SInventoryTransaction, TransactionData},
mob_equipment::SMobEquipment, mob_equipment::SMobEquipment,
@ -463,10 +464,17 @@ impl BedrockClient {
return; return;
} }
tracing::info!(
"handle_emote: player={} packet={:?}",
player.gameprofile.name,
packet
);
let entity = &player.living_entity.entity; let entity = &player.living_entity.entity;
let world = entity.world.load(); let world = entity.world.load();
let mut broadcast_packet = packet; let mut broadcast_packet = packet;
broadcast_packet.runtime_entity_id = VarULong(entity.entity_id as u64);
broadcast_packet.flags |= pumpkin_protocol::bedrock::server::emote::EMOTE_FLAG_SERVER_SIDE; broadcast_packet.flags |= pumpkin_protocol::bedrock::server::emote::EMOTE_FLAG_SERVER_SIDE;
world world
@ -481,17 +489,13 @@ impl BedrockClient {
.await; .await;
} }
// pub fn handle_emote_list( pub fn handle_emote_list(&self, player: &Arc<Player>, _server: &Server, packet: &SEmoteList) {
// &self, tracing::info!(
// player: &Arc<Player>, "handle_emote_list: player={} packet={:?}",
// _server: &Server, player.gameprofile.name,
// packet: &SEmoteList, packet
// ) { );
// debug!( }
// "Player {} sent emote list: {:?}",
// player.gameprofile.name, packet.emote_pieces
// );
// }
#[allow(clippy::too_many_lines, clippy::collapsible_if, clippy::unreachable)] #[allow(clippy::too_many_lines, clippy::collapsible_if, clippy::unreachable)]
pub async fn handle_inventory_action( pub async fn handle_inventory_action(