Skip to main content

steel_core/entity/consume_effect/
apply_effects.rs

1//! `ApplyStatusEffectsConsumeEffect` behavior (golden apple, poisonous potato,
2//! rotten flesh, etc.). Suspicious stew's effect is a separate, unrelated
3//! `SuspiciousStewEffects` data component, not this.
4
5use std::sync::Arc;
6
7use steel_registry::consume_effect::{ApplyStatusEffectsConsumeEffect, ConsumeEffectData};
8
9use super::ConsumeEffectBehavior;
10use crate::entity::LivingEntity;
11use crate::entity::potion_contents::to_runtime_instance;
12use crate::world::World;
13
14/// Mirrors vanilla `ApplyStatusEffectsConsumeEffect.apply`: unlike drinking a
15/// potion, this always goes through `LivingEntity.addEffect`
16pub struct ApplyEffectsBehavior;
17
18impl ConsumeEffectBehavior for ApplyEffectsBehavior {
19    fn apply(&self, effect: &ConsumeEffectData, _world: &Arc<World>, user: &dyn LivingEntity) {
20        let Some(apply) = effect.downcast_ref::<ApplyStatusEffectsConsumeEffect>() else {
21            return;
22        };
23        if rand::random::<f32>() >= apply.probability() {
24            return;
25        }
26        for instance in apply.effects() {
27            user.add_mob_effect(to_runtime_instance(instance, instance.duration()));
28        }
29    }
30}