evtc\event/
event_kind.rs

1use crate::{
2    agent::{
3        AgentStatusEvent, AttackTargetEvent, BarrierUpdateEvent, BreakbarPercentEvent,
4        BreakbarStateEvent, DownContributionEvent, EnterCombatEvent, GliderEvent,
5        HealthUpdateEvent, MaxHealthEvent, StunbreakEvent, TargetableEvent, TeamChangeEvent,
6    },
7    buff::{
8        BuffApplyEvent, BuffDamageEvent, BuffFormula, BuffInfo, BuffInitialEvent, BuffRemoveEvent,
9        StackActiveEvent, StackResetEvent,
10    },
11    content::ContentInfo,
12    effect::{
13        AgentEffect, AgentEffectRemove, Effect45, Effect51, GroundEffect, GroundEffectRemove,
14    },
15    log::{ArcBuildEvent, ErrorEvent, LogEvent},
16    marker::{AgentMarkerEvent, SquadMarkerEvent},
17    missile::{MissileCreate, MissileLaunch, MissileRemove},
18    player::{GuildEvent, RewardEvent},
19    position::PositionEvent,
20    ruleset::Ruleset,
21    skill::{ActivationEvent, SkillInfo, SkillTiming},
22    strike::StrikeEvent,
23    weapon::WeaponSwapEvent,
24    Event, EventCategory, Language, StateChange,
25};
26
27#[cfg(feature = "serde")]
28use serde::{Deserialize, Serialize};
29
30/// Possible [`Event`] kinds.
31#[derive(Debug, Clone)]
32#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
33#[cfg_attr(feature = "serde", serde(tag = "kind"))]
34pub enum EventKind {
35    /// Agent entered combat.
36    EnterCombat(EnterCombatEvent),
37
38    /// Agent left combat.
39    ExitCombat(AgentStatusEvent),
40
41    /// Agent is now alive.
42    ChangeUp(AgentStatusEvent),
43
44    /// Agent is now dead.
45    ChangeDead(AgentStatusEvent),
46
47    /// Agent is now downed.
48    ChangeDown(AgentStatusEvent),
49
50    /// Agent is now in game tracking range.
51    Spawn(AgentStatusEvent),
52
53    /// Agent is no longer being tracked or out of game tracking range.
54    Despawn(AgentStatusEvent),
55
56    /// Agent health change.
57    HealthUpdate(HealthUpdateEvent),
58
59    /// Log started.
60    SquadCombatStart(LogEvent),
61
62    /// Log ended.
63    SquadCombatEnd(LogEvent),
64
65    /// Agent swapped weapon set.
66    WeaponSwap(WeaponSwapEvent),
67
68    /// Agent maximum health change.
69    MaxHealthUpdate(MaxHealthEvent),
70
71    /// Agent is "recording" player.
72    PointOfView(AgentStatusEvent),
73
74    /// Game text language.
75    Language {
76        time: u64,
77        language: Result<Language, u64>,
78    },
79
80    /// Game build.
81    GWBuild { time: u64, build: u64 },
82
83    /// Sever shard id.
84    ShardId { time: u64, shard: u64 },
85
86    /// Agent got a reward chest.
87    Reward(RewardEvent),
88
89    /// Appears once per buff per agent on logging start.
90    BuffInitial(BuffInitialEvent),
91
92    /// Agent position change.
93    Position(PositionEvent),
94
95    /// Agent velocity change.
96    Velocity(PositionEvent),
97
98    /// Agent facing change.
99    Facing(PositionEvent),
100
101    /// Agent team change.
102    TeamChange(TeamChangeEvent),
103
104    /// Agent is now an attack target.
105    AttackTarget(AttackTargetEvent),
106
107    /// Agent targetability change.
108    Targetable(TargetableEvent),
109
110    /// Map id.
111    MapId { time: u64, map: u64 },
112
113    /// Agent with active buff.
114    StackActive(StackActiveEvent),
115
116    /// Agent with reset buff.
117    StackReset(StackResetEvent),
118
119    /// Agent is in guild.
120    Guild(GuildEvent),
121
122    /// Buff information.
123    BuffInfo(BuffInfo),
124
125    /// Buff formula.
126    BuffFormula(BuffFormula),
127
128    /// Skill information.
129    SkillInfo(SkillInfo),
130
131    /// Skill action.
132    SkillTiming(SkillTiming),
133
134    /// Agent breakbar state change.
135    BreakbarState(BreakbarStateEvent),
136
137    /// Breakbar percentage.
138    BreakbarPercent(BreakbarPercentEvent),
139
140    /// Error.
141    Integrity(ErrorEvent),
142
143    /// Agent has marker.
144    AgentMarker(AgentMarkerEvent),
145
146    /// Agent barrier change.
147    BarrierUpdate(BarrierUpdateEvent),
148
149    /// Arc UI stats reset.
150    StatReset { time: u64, target: u64 },
151
152    /// A custom event created by an extension (addon/plugin).
153    Extension { sig: u32, event: Event },
154
155    /// Delayed combat event.
156    ApiDelayed { event: Box<EventKind> },
157
158    /// Instance started.
159    InstanceStart { time: u64, start: u64 },
160
161    /// Tick rate.
162    RateHealth { time: u64, rate: u64 },
163
164    /// Last 90% before down for downs contribution.
165    Last90BeforeDown(DownContributionEvent),
166
167    /// Effect created or ended.
168    Effect45(Effect45),
169
170    /// Content id to GUID.
171    ///
172    /// This maps a volatile content id to a stable GUID.
173    IdToGUID(ContentInfo),
174
175    /// Log NPC changed.
176    LogNPCUpdate(LogEvent),
177
178    /// A custom combat event created by an extension (addon/plugin).
179    ExtensionCombat { sig: u32, event: Event },
180
181    /// Fractal scale.
182    FractalScale { time: u64, scale: u64 },
183
184    /// Effect created or ended.
185    Effect51(Effect51),
186
187    /// Combat ruleset.
188    Ruleset(Ruleset),
189
190    /// Activation (cast) event.
191    Activation(ActivationEvent),
192
193    /// Buff removed.
194    BuffRemove(BuffRemoveEvent),
195
196    /// Buff applied.
197    BuffApply(BuffApplyEvent),
198
199    /// Buff damage.
200    BuffDamage(BuffDamageEvent),
201
202    /// Direct (strike) damage.
203    Strike(StrikeEvent),
204
205    /// Squad marker placed or removed.
206    SquadMarker(SquadMarkerEvent),
207
208    /// ArcDPS build information.
209    ArcBuild(ArcBuildEvent),
210
211    /// Agent gliding state changed.
212    Glider(GliderEvent),
213
214    /// Effect
215    Stunbreak(StunbreakEvent),
216
217    /// Missile created.
218    MissileCreate(MissileCreate),
219
220    /// Missile launched or relaunched.
221    MissileLaunch(MissileLaunch),
222
223    /// Missile removed or destroyed.
224    MissileRemove(MissileRemove),
225
226    /// Ground effect created.
227    EffectGroundCreate(GroundEffect),
228
229    /// Ground effect removed.
230    EffectGroundRemove(GroundEffectRemove),
231
232    /// Effect around Agent created.
233    EffectAgentCreate(AgentEffect),
234
235    /// Effect around Agent removed.
236    EffectAgentRemove(AgentEffectRemove),
237
238    /// Unknown event.
239    Unknown(Event),
240}
241
242impl From<Event> for EventKind {
243    #[inline]
244    fn from(mut event: Event) -> Self {
245        unsafe {
246            match event.categorize() {
247                EventCategory::StateChange => match event.get_statechange() {
248                    StateChange::None => unreachable!("statechange none in statechange category"),
249                    StateChange::IdleEvent | StateChange::ReplInfo => {
250                        unreachable!("illegal internal statechange")
251                    }
252                    StateChange::EnterCombat => Self::EnterCombat(event.extract()),
253                    StateChange::ExitCombat => Self::ExitCombat(event.extract()),
254                    StateChange::ChangeUp => Self::ChangeUp(event.extract()),
255                    StateChange::ChangeDead => Self::ChangeDead(event.extract()),
256                    StateChange::ChangeDown => Self::ChangeDown(event.extract()),
257                    StateChange::Spawn => Self::Spawn(event.extract()),
258                    StateChange::Despawn => Self::Despawn(event.extract()),
259                    StateChange::HealthUpdate => Self::HealthUpdate(event.extract()),
260                    StateChange::SquadCombatStart => Self::SquadCombatStart(event.extract()),
261                    StateChange::SquadCombatEnd => Self::SquadCombatEnd(event.extract()),
262                    StateChange::WeaponSwap => Self::WeaponSwap(event.extract()),
263                    StateChange::MaxHealthUpdate => Self::MaxHealthUpdate(event.extract()),
264                    StateChange::PointOfView => Self::PointOfView(event.extract()),
265                    StateChange::Language => Self::Language {
266                        time: event.time,
267                        language: Language::try_from(event.src_agent as i32)
268                            .map_err(|_| event.src_agent),
269                    },
270                    StateChange::GWBuild => Self::GWBuild {
271                        time: event.time,
272                        build: event.src_agent,
273                    },
274                    StateChange::ShardId => Self::ShardId {
275                        time: event.time,
276                        shard: event.src_agent,
277                    },
278                    StateChange::Reward => Self::Reward(event.extract()),
279                    StateChange::BuffInitial => Self::BuffInitial(event.extract()),
280                    StateChange::Position => Self::Position(event.extract()),
281                    StateChange::Velocity => Self::Velocity(event.extract()),
282                    StateChange::Facing => Self::Facing(event.extract()),
283                    StateChange::TeamChange => Self::TeamChange(event.extract()),
284                    StateChange::AttackTarget => Self::AttackTarget(event.extract()),
285                    StateChange::Targetable => Self::Targetable(event.extract()),
286                    StateChange::MapId => Self::MapId {
287                        time: event.time,
288                        map: event.src_agent,
289                    },
290                    StateChange::StackActive => Self::StackActive(event.extract()),
291                    StateChange::StackReset => Self::StackReset(event.extract()),
292                    StateChange::Guild => Self::Guild(event.extract()),
293                    StateChange::BuffInfo => Self::BuffInfo(event.extract()),
294                    StateChange::BuffFormula => Self::BuffFormula(event.extract()),
295                    StateChange::SkillInfo => Self::SkillInfo(event.extract()),
296                    StateChange::SkillTiming => Self::SkillTiming(event.extract()),
297                    StateChange::BreakbarState => Self::BreakbarState(event.extract()),
298                    StateChange::BreakbarPercent => Self::BreakbarPercent(event.extract()),
299                    StateChange::Integrity => Self::Integrity(event.extract()),
300                    StateChange::Marker => Self::AgentMarker(event.extract()),
301                    StateChange::BarrierUpdate => Self::BarrierUpdate(event.extract()),
302                    StateChange::StatReset => Self::StatReset {
303                        time: event.time,
304                        target: event.src_agent,
305                    },
306                    StateChange::Extension => Self::Extension {
307                        sig: event.get_pad_id(),
308                        event,
309                    },
310                    StateChange::ApiDelayed => {
311                        event.is_statechange = StateChange::None.into();
312                        Self::ApiDelayed {
313                            event: event.into_kind().into(),
314                        }
315                    }
316                    StateChange::InstanceStart => Self::InstanceStart {
317                        time: event.time,
318                        start: event.src_agent,
319                    },
320                    StateChange::RateHealth => Self::RateHealth {
321                        time: event.time,
322                        rate: event.src_agent,
323                    },
324                    StateChange::Last90BeforeDown => Self::Last90BeforeDown(event.extract()),
325                    StateChange::Effect45 => Self::Effect45(event.extract()),
326                    StateChange::IdToGUID => Self::IdToGUID(event.extract()),
327                    StateChange::LogNPCUpdate => Self::LogNPCUpdate(event.extract()),
328                    StateChange::ExtensionCombat => Self::ExtensionCombat {
329                        sig: event.get_pad_id(),
330                        event,
331                    },
332                    StateChange::FractalScale => Self::FractalScale {
333                        time: event.time,
334                        scale: event.src_agent,
335                    },
336                    StateChange::Effect51 => Self::Effect51(event.extract()),
337                    StateChange::Ruleset => {
338                        Self::Ruleset(Ruleset::from_bits_retain(event.src_agent))
339                    }
340                    StateChange::SquadMarker => Self::SquadMarker(event.extract()),
341                    StateChange::ArcBuild => Self::ArcBuild(event.extract()),
342                    StateChange::Glider => Self::Glider(event.extract()),
343                    StateChange::Stunbreak => Self::Stunbreak(event.extract()),
344                    StateChange::MissileCreate => Self::MissileCreate(event.extract()),
345                    StateChange::MissileLaunch => Self::MissileLaunch(event.extract()),
346                    StateChange::MissileRemove => Self::MissileRemove(event.extract()),
347                    StateChange::EffectGroundCreate => Self::EffectGroundCreate(event.extract()),
348                    StateChange::EffectGroundRemove => Self::EffectGroundRemove(event.extract()),
349                    StateChange::EffectAgentCreate => Self::EffectAgentCreate(event.extract()),
350                    StateChange::EffectAgentRemove => Self::EffectAgentRemove(event.extract()),
351                    StateChange::Unknown(_) => Self::Unknown(event),
352                },
353                EventCategory::Activation => Self::Activation(event.extract()),
354                EventCategory::BuffRemove => Self::BuffRemove(event.extract()),
355                EventCategory::BuffApply => Self::BuffApply(event.extract()),
356                EventCategory::BuffDamage => Self::BuffDamage(event.extract()),
357                EventCategory::Strike => Self::Strike(event.extract()),
358            }
359        }
360    }
361}