Skip to main content

steel_core/entity/consume_effect/
play_sound.rs

1//! `PlaySoundConsumeEffect` behavior (e.g. ominous bottle, via `Consumable
2//! .Builder.soundAfterConsume`, sugar for this exact effect).
3
4use std::sync::Arc;
5
6use glam::DVec3;
7use steel_registry::consume_effect::{ConsumeEffectData, PlaySoundConsumeEffect};
8
9use super::ConsumeEffectBehavior;
10use crate::entity::LivingEntity;
11use crate::world::World;
12
13/// Mirrors vanilla `PlaySoundConsumeEffect.apply`.
14pub struct PlaySoundBehavior;
15
16impl ConsumeEffectBehavior for PlaySoundBehavior {
17    fn apply(&self, effect: &ConsumeEffectData, world: &Arc<World>, user: &dyn LivingEntity) {
18        let Some(play_sound) = effect.downcast_ref::<PlaySoundConsumeEffect>() else {
19            return;
20        };
21        let Some(sound) = play_sound.sound().registry_ref() else {
22            return;
23        };
24        // Vanilla plays this at the entity's block-position center via
25        // `Level.playSound(null, BlockPos, ...)`
26        let block_pos = user.block_position();
27        let block_center = DVec3::new(
28            f64::from(block_pos.x()) + 0.5,
29            f64::from(block_pos.y()) + 0.5,
30            f64::from(block_pos.z()) + 0.5,
31        );
32        world.play_sound_at(sound, user.sound_source(), block_center, 1.0, 1.0, None);
33    }
34}