pub fn system
( mut csER: EventReader<CollisionStarted>,
tagQ: Query<&Tag>,
mut hdEW: EventWriter<damage::hit_damage_event>,
mut htEW: EventWriter<damage::hit_target_event>,
mut hoEW: EventWriter<damage::hit_obstacle_event>,
mut hpEW: EventWriter<hit_player_event>,
)
{ for CollisionStarted(e1, e2) in csER.read()
{ let tag1 = tagQ.get(*e1).unwrap_or(&Tag::None);
let tag2 = tagQ.get(*e2).unwrap_or(&Tag::None);
match (tag1, *e1, *e2, tag2)
{ (Tag::None, _, _, Tag::None) =>
{ error!("collision tag component is missing on both entities."); }
(Tag::damage, damage_a, damage_b, Tag::damage) =>
{ hdEW.send(damage::hit_damage_event(damage_a, damage_b)); }
(Tag::damage, damage, target, Tag::target) |
(Tag::target, target, damage, Tag::damage) =>
{ htEW.send(damage::hit_target_event(damage, target)); }
(Tag::damage, damage, target, Tag::None) |
(Tag::None, target, damage, Tag::damage) =>
{ hoEW.send(damage::hit_obstacle_event(damage, target)); }
(Tag::damage, _, _, _) | (_, _, _, Tag::damage) =>
{ error!("damage hit something unexpected."); }
(Tag::player_sensor, player_sensor, presumably_player, Tag::target) |
(Tag::target, presumably_player, player_sensor, Tag::player_sensor) =>
{ hpEW.send(hit_player_event(player_sensor, presumably_player)); }
}
pub fn player_system
( mut hpER: EventReader<hit_player_event>,
mut playerQ: Query<&mut Player::component>,
)
{ for hit_player_event(player_sensor, presumably_player) in hpER.read()
{ let Ok(mut player) = playerQ.get_mut(*presumably_player)
else { error!("non-player has triggered a player sensor."); continue; };
} }