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#[derive(Debug, Clone)]
32#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
33#[cfg_attr(feature = "serde", serde(tag = "kind"))]
34pub enum EventKind {
35 EnterCombat(EnterCombatEvent),
37
38 ExitCombat(AgentStatusEvent),
40
41 ChangeUp(AgentStatusEvent),
43
44 ChangeDead(AgentStatusEvent),
46
47 ChangeDown(AgentStatusEvent),
49
50 Spawn(AgentStatusEvent),
52
53 Despawn(AgentStatusEvent),
55
56 HealthUpdate(HealthUpdateEvent),
58
59 SquadCombatStart(LogEvent),
61
62 SquadCombatEnd(LogEvent),
64
65 WeaponSwap(WeaponSwapEvent),
67
68 MaxHealthUpdate(MaxHealthEvent),
70
71 PointOfView(AgentStatusEvent),
73
74 Language {
76 time: u64,
77 language: Result<Language, u64>,
78 },
79
80 GWBuild { time: u64, build: u64 },
82
83 ShardId { time: u64, shard: u64 },
85
86 Reward(RewardEvent),
88
89 BuffInitial(BuffInitialEvent),
91
92 Position(PositionEvent),
94
95 Velocity(PositionEvent),
97
98 Facing(PositionEvent),
100
101 TeamChange(TeamChangeEvent),
103
104 AttackTarget(AttackTargetEvent),
106
107 Targetable(TargetableEvent),
109
110 MapId { time: u64, map: u64 },
112
113 StackActive(StackActiveEvent),
115
116 StackReset(StackResetEvent),
118
119 Guild(GuildEvent),
121
122 BuffInfo(BuffInfo),
124
125 BuffFormula(BuffFormula),
127
128 SkillInfo(SkillInfo),
130
131 SkillTiming(SkillTiming),
133
134 BreakbarState(BreakbarStateEvent),
136
137 BreakbarPercent(BreakbarPercentEvent),
139
140 Integrity(ErrorEvent),
142
143 AgentMarker(AgentMarkerEvent),
145
146 BarrierUpdate(BarrierUpdateEvent),
148
149 StatReset { time: u64, target: u64 },
151
152 Extension { sig: u32, event: Event },
154
155 ApiDelayed { event: Box<EventKind> },
157
158 InstanceStart { time: u64, start: u64 },
160
161 RateHealth { time: u64, rate: u64 },
163
164 Last90BeforeDown(DownContributionEvent),
166
167 Effect45(Effect45),
169
170 IdToGUID(ContentInfo),
174
175 LogNPCUpdate(LogEvent),
177
178 ExtensionCombat { sig: u32, event: Event },
180
181 FractalScale { time: u64, scale: u64 },
183
184 Effect51(Effect51),
186
187 Ruleset(Ruleset),
189
190 Activation(ActivationEvent),
192
193 BuffRemove(BuffRemoveEvent),
195
196 BuffApply(BuffApplyEvent),
198
199 BuffDamage(BuffDamageEvent),
201
202 Strike(StrikeEvent),
204
205 SquadMarker(SquadMarkerEvent),
207
208 ArcBuild(ArcBuildEvent),
210
211 Glider(GliderEvent),
213
214 Stunbreak(StunbreakEvent),
216
217 MissileCreate(MissileCreate),
219
220 MissileLaunch(MissileLaunch),
222
223 MissileRemove(MissileRemove),
225
226 EffectGroundCreate(GroundEffect),
228
229 EffectGroundRemove(GroundEffectRemove),
231
232 EffectAgentCreate(AgentEffect),
234
235 EffectAgentRemove(AgentEffectRemove),
237
238 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}