Skip to main content

steel_core/entity/consume_effect/
mod.rs

1//! Consume-effect behaviors: one small module per vanilla `ConsumeEffect`
2//! subtype under `net/minecraft/world/item/consume_effects`.
3
4mod apply_effects;
5mod clear_all_effects;
6mod play_sound;
7mod remove_effects;
8mod teleport_randomly;
9
10use std::sync::Arc;
11
12use steel_registry::consume_effect::ConsumeEffectData;
13
14pub use apply_effects::ApplyEffectsBehavior;
15pub use clear_all_effects::ClearAllEffectsBehavior;
16pub use play_sound::PlaySoundBehavior;
17pub use remove_effects::RemoveEffectsBehavior;
18pub use teleport_randomly::TeleportRandomlyBehavior;
19
20use crate::behavior::CONSUME_EFFECT_BEHAVIORS;
21use crate::entity::LivingEntity;
22use crate::world::World;
23
24/// Mirrors vanilla's `ConsumeEffect.apply(Level, ItemStack, LivingEntity)`
25pub trait ConsumeEffectBehavior: Send + Sync {
26    /// Applies this effect's behavior to `user`, downcasting `effect` to the
27    /// concrete `ConsumeEffectData` payload this behavior expects.
28    fn apply(&self, effect: &ConsumeEffectData, world: &Arc<World>, user: &dyn LivingEntity);
29}
30
31/// Applies one `ConsumeEffectData` entry from a `Consumable.on_consume_effects`
32/// list, by looking up its registered behavior.
33pub(crate) fn apply_consume_effect(
34    effect: &ConsumeEffectData,
35    world: &Arc<World>,
36    user: &dyn LivingEntity,
37) {
38    CONSUME_EFFECT_BEHAVIORS
39        .get_behavior(effect.effect_type())
40        .apply(effect, world, user);
41}