From 363ecba90cabe4578b2937ab899a06d986b68d9b Mon Sep 17 00:00:00 2001 From: MeexReay Date: Thu, 8 May 2025 10:21:26 +0300 Subject: [PATCH] play sound send animation helpers --- src/play/helper.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/play/mod.rs | 26 +++++++++++++++++++++++--- 2 files changed, 61 insertions(+), 3 deletions(-) diff --git a/src/play/helper.rs b/src/play/helper.rs index a2f30c6..7b692e0 100644 --- a/src/play/helper.rs +++ b/src/play/helper.rs @@ -38,6 +38,44 @@ pub fn send_entity_event( client.write_packet(&packet) } +pub fn send_entity_animation( + receiver: Arc, + entity_id: i32, + animation: u8, +) -> Result<(), ServerError> { + let mut packet = Packet::empty(clientbound::play::ENTITY_ANIMATION); + + packet.write_varint(entity_id)?; + packet.write_byte(animation)?; + + receiver.write_packet(&packet)?; + + Ok(()) +} + +pub fn play_sound(receiver: Arc, sound: String) -> Result<(), ServerError> { + let mut packet = Packet::empty(clientbound::play::ENTITY_SOUND_EFFECT); + + let timestamp = SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_micros() as i64; + + packet.write_varint(0)?; + packet.write_string(&sound)?; + packet.write_boolean(false)?; // is fixed range + // packet.write_float(0.0)?; // fixed range + packet.write_varint(receiver.entity_info().entity_id)?; + packet.write_varint(0)?; // sound category (0 - master) + packet.write_float(1.0)?; // volume + packet.write_float(1.0)?; // pitch + packet.write_long(timestamp)?; // seed + + receiver.write_packet(&packet)?; + + Ok(()) +} + pub fn sync_player_pos( client: Arc, x: f64, diff --git a/src/play/mod.rs b/src/play/mod.rs index 10af7db..872c72f 100644 --- a/src/play/mod.rs +++ b/src/play/mod.rs @@ -3,8 +3,8 @@ use std::{sync::Arc, thread, time::Duration}; use config::handle_configuration_state; use helper::{ - send_entity_event, send_game_event, send_keep_alive, send_system_message, set_center_chunk, - sync_player_pos, unload_chunk, + play_sound, send_entity_event, send_game_event, send_keep_alive, send_system_message, + set_center_chunk, sync_player_pos, unload_chunk, }; use rust_mc_proto::{DataReader, DataWriter, Packet}; use uuid::Uuid; @@ -335,6 +335,7 @@ pub fn handle_play_state( send_player(client.clone(), player.clone())?; send_player(player.clone(), client.clone())?; send_rainbow_message(&player, format!("{} joined the game", player_name))?; + play_sound(player.clone(), format!("minecraft:block.bell.use"))?; } thread::spawn({ @@ -350,6 +351,7 @@ pub fn handle_play_state( serverbound::play::CLICK_CONTAINER, serverbound::play::CHAT_COMMAND, serverbound::play::SIGNED_CHAT_COMMAND, + serverbound::play::PLAYER_COMMAND, ])?; match packet.id() { @@ -363,15 +365,31 @@ pub fn handle_play_state( send_rainbow_message(&client, format!("index clicked: {slot}"))?; } + serverbound::play::PLAYER_COMMAND => { + let _ = packet.read_varint()?; // entity id + let action = packet.read_varint()?; // action id + let _ = packet.read_varint()?; // jump boost on horse + + if action == 0 { + // press sneak key + for player in client.server.players() { + play_sound(player.clone(), format!("minecraft:block.bell.use"))?; + } + } else if action == 1 { + // release sneak key + } + } serverbound::play::CHAT_COMMAND | serverbound::play::SIGNED_CHAT_COMMAND => { let command = packet.read_string()?; if command == "gamemode creative" { send_game_event(client.clone(), 3, 1.0)?; // 3 - Set gamemode send_rainbow_message(&client, format!("gamemode creative installed"))?; + play_sound(client.clone(), format!("minecraft:block.bell.use"))?; } else if command == "gamemode survival" { send_game_event(client.clone(), 3, 0.0)?; // 3 - Set gamemode send_rainbow_message(&client, format!("gamemode survival installed"))?; + play_sound(client.clone(), format!("minecraft:block.bell.use"))?; } } serverbound::play::CHAT_MESSAGE => { @@ -394,7 +412,8 @@ pub fn handle_play_state( } for player in client.server.players() { - send_system_message(player, message.clone(), false)?; + send_system_message(player.clone(), message.clone(), false)?; + play_sound(player.clone(), format!("minecraft:block.bell.use"))?; } } serverbound::play::SET_PLAYER_POSITION => { @@ -554,6 +573,7 @@ pub fn handle_disconnect( &player, format!("{} left the game", client.player_info().unwrap().name), )?; + play_sound(player.clone(), format!("minecraft:block.bell.use"))?; } Ok(())