evtc\agent/
breakbar.rs
1use crate::{extract::Extract, AgentId, Event, StateChange, TryExtract};
2use num_enum::{FromPrimitive, IntoPrimitive};
3
4#[cfg(feature = "serde")]
5use serde::{Deserialize, Serialize};
6
7#[cfg(feature = "strum")]
8use strum::{Display, EnumCount, EnumIter, IntoStaticStr, VariantNames};
9
10#[derive(Debug, Clone)]
12#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
13pub struct BreakbarStateEvent {
14 pub time: u64,
16
17 pub agent: AgentId,
19
20 pub state: BreakbarState,
22}
23
24impl Extract for BreakbarStateEvent {
25 #[inline]
26 unsafe fn extract(event: &Event) -> Self {
27 Self {
28 time: event.time,
29 agent: AgentId::from_src(event),
30 state: (event.value as u16).into(),
31 }
32 }
33}
34
35impl TryExtract for BreakbarStateEvent {
36 #[inline]
37 fn can_extract(event: &Event) -> bool {
38 event.get_statechange() == StateChange::BreakbarState
39 }
40}
41
42#[derive(Debug, Clone)]
44#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
45pub struct BreakbarPercentEvent {
46 pub time: u64,
48
49 pub agent: AgentId,
51
52 pub health: f32,
54}
55
56impl Extract for BreakbarPercentEvent {
57 #[inline]
58 unsafe fn extract(event: &Event) -> Self {
59 let health = f32::from_ne_bytes(event.value.to_ne_bytes());
60
61 Self {
62 time: event.time,
63 agent: AgentId::from_src(event),
64 health,
65 }
66 }
67}
68
69impl TryExtract for BreakbarPercentEvent {
70 #[inline]
71 fn can_extract(event: &Event) -> bool {
72 event.get_statechange() == StateChange::BreakbarPercent
73 }
74}
75
76#[derive(
80 Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, IntoPrimitive, FromPrimitive,
81)]
82#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
83#[cfg_attr(
84 feature = "strum",
85 derive(Display, EnumCount, EnumIter, IntoStaticStr, VariantNames)
86)]
87#[repr(u16)]
88pub enum BreakbarState {
89 Active = 0,
91
92 Recover = 1,
94
95 Immune = 2,
97
98 None = 3,
100
101 #[num_enum(catch_all)]
103 Unknown(u16),
104}