bevy_tnua/control_helpers/
blip_reuse_avoidance.rs1use 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}