bevy_tnua/control_helpers/
blip_reuse_avoidance.rs

1use bevy::platform::collections::HashMap;
2use bevy::prelude::*;
3use bevy_tnua_physics_integration_layer::obstacle_radar::TnuaObstacleRadar;
4
5use crate::controller::TnuaActionFlowStatus;
6use crate::prelude::TnuaController;
7
8#[derive(Default, Component)]
9pub struct TnuaBlipReuseAvoidance {
10    current_entity: Option<Entity>,
11    entities_to_avoid: HashMap<Entity, &'static str>,
12}
13
14impl TnuaBlipReuseAvoidance {
15    pub fn update(&mut self, controller: &TnuaController, radar: &TnuaObstacleRadar) {
16        let current_entity = controller
17            .dynamic_action()
18            .and_then(|action| action.target_entity());
19
20        if current_entity != self.current_entity {
21            if let Some(old_entity) = self.current_entity.as_ref() {
22                if let TnuaActionFlowStatus::ActionEnded(action_name)
23                | TnuaActionFlowStatus::Cancelled {
24                    old: action_name,
25                    new: _,
26                } = controller.action_flow_status()
27                {
28                    self.entities_to_avoid.insert(*old_entity, action_name);
29                }
30            }
31        }
32
33        self.entities_to_avoid
34            .retain(|entity, _| radar.has_blip(*entity));
35
36        self.current_entity = current_entity;
37    }
38
39    pub fn should_avoid(&self, entity: Entity) -> bool {
40        self.entities_to_avoid.contains_key(&entity)
41    }
42}