evtc\effect/
agent.rs

1use crate::extract::transmute_field;
2use crate::AgentId;
3use crate::{extract::Extract, Event, StateChange, TryExtract};
4
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8/// Effect information from an [`Event`] with [`StateChange::EffectAgentCreate`].
9#[derive(Debug, Clone)]
10#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
11pub struct AgentEffect {
12    /// Time of registering the effect.
13    pub time: u64,
14
15    /// Source of the effect.
16    pub source: AgentId,
17
18    /// Target of the effect (if applicable).
19    pub target: AgentId,
20
21    /// Id of the effect.
22    ///
23    /// Use to map to a GUID using [`StateChange::IdToGUID`] events.
24    pub effect_id: u32,
25
26    /// Duration of the effect in milliseconds.
27    pub duration: u32,
28
29    /// Trackable id for effect remove.
30    pub tracking_id: u32,
31}
32
33impl Extract for AgentEffect {
34    #[inline]
35    unsafe fn extract(event: &Event) -> Self {
36        let effect_id = event.skill_id;
37        let duration = transmute_field!(event.affinity as u32);
38
39        Self {
40            time: event.time,
41            source: AgentId::from_src(event),
42            target: AgentId::from_dst(event),
43            effect_id,
44            duration,
45            tracking_id: event.get_pad_id(),
46        }
47    }
48}
49
50impl TryExtract for AgentEffect {
51    #[inline]
52    fn can_extract(event: &Event) -> bool {
53        event.get_statechange() == StateChange::EffectAgentCreate
54    }
55}
56
57/// Effect information from an [`Event`] with [`StateChange::EffectAgentRemove`].
58#[derive(Debug, Clone)]
59#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
60pub struct AgentEffectRemove {
61    /// Time of registering the effect.
62    pub time: u64,
63
64    /// Agent related to the effect.
65    pub agent: AgentId,
66
67    /// Trackable id for effect remove.
68    pub tracking_id: u32,
69}
70
71impl Extract for AgentEffectRemove {
72    #[inline]
73    unsafe fn extract(event: &Event) -> Self {
74        Self {
75            time: event.time,
76            agent: AgentId::from_src(event),
77            tracking_id: event.get_pad_id(),
78        }
79    }
80}
81
82impl TryExtract for AgentEffectRemove {
83    #[inline]
84    fn can_extract(event: &Event) -> bool {
85        event.get_statechange() == StateChange::EffectAgentRemove
86    }
87}