1#![allow(non_snake_case)]
3use wowlab_engine_combat::CombatSystemBuilder;
4use wowlab_engine_gamedata::ResolvedGameData;
5use wowlab_engine_ports::ResolveDependencies;
6pub(crate) mod aberrant_spellforge;
7pub(crate) mod algethar_puzzle_box;
8pub(crate) mod all_devouring_nucleus;
9pub(crate) mod araz_ritual_forge;
10pub(crate) mod arcanoweave_cord;
11pub(crate) mod brand_ceaseless_ire;
12pub(crate) mod bursting_lightshard;
13pub(crate) mod candle_confidant;
14pub(crate) mod chromebustible_bomb_suit;
15pub(crate) mod darkfuse_medichopper;
16pub(crate) mod diamantine_voidcore;
17pub(crate) mod emberwing_feather;
18pub(crate) mod flarendo_pilot_light;
19pub(crate) mod foul_behemoth_chelicera;
20pub(crate) mod gallagio_bottle_service;
21pub(crate) mod gaze_of_the_alnseer;
22pub(crate) mod geargrinder_spare_keys;
23pub(crate) mod heart_of_ancient_hunger;
24pub(crate) mod high_speakers_accretion;
25pub(crate) mod house_of_cards;
26pub(crate) mod junkmaestro_mega_magnet;
27pub(crate) mod kuj0_flame_vents;
28pub(crate) mod light_company_guidon;
29pub(crate) mod locuswalkers_ribbon;
30pub(crate) mod loomithar_living_silk;
31pub(crate) mod mad_queens_mandate;
32pub(crate) mod mereldar_toll;
33pub(crate) mod mister_lock_n_stalk;
34pub(crate) mod overclocked_gear_a_rang;
35pub(crate) mod ovinax_mercurial_egg;
36pub(crate) mod perfidious_projector;
37pub(crate) mod radiant_plume;
38pub(crate) mod ringing_ritual_mud;
39pub(crate) mod signet_of_the_priory;
40pub(crate) mod sikrans_endless_arsenal;
41pub(crate) mod skarmorak_shard;
42pub(crate) mod skyterror_corrosive_organ;
43pub(crate) mod soulbinder_embrace;
44pub(crate) mod sporecallers_blooming_loop;
45pub(crate) mod spymasters_web;
46pub(crate) mod torq_big_red_button;
47pub(crate) mod treacherous_transmitter;
48pub(crate) mod umbral_plume;
49pub(crate) mod unyielding_netherprism;
50pub(crate) mod vaelgors_final_stare;
51pub(crate) mod vexie_pit_whistle;
52const SIMPLE_EQUIP_AURA_ITEMS: &[(u32, &str, &[u32])] = &[
53 (212_456, "Void Reapers Contract", &[444_067]),
54 (219_311, "Void Pactstone", &[443_537]),
55 (219_312, "Empowering Crystal Anubikkaj", &[443_538]),
56 (219_314, "Ara Kara Sacbrood", &[443_541]),
57 (219_305, "Carved Blazikon Wax", &[443_527]),
58 (219_307, "Remnant Of Darkness", &[443_530]),
59 (219_302, "Scrapsinger Symphony", &[443_414]),
60 (219_304, "Conductors Wax Whistle", &[443_525]),
61 (219_317, "Harvester Edict", &[451_055]),
62 (219_316, "Ceaseless Swarmgland", &[443_545]),
63 (219_315, "Refracting Aggression Module", &[443_544]),
64 (219_296, "Entropic Skardyn Core", &[443_380]),
65 (225_577, "Sureki Zealots Insignia", &[457_683]),
66 (225_578, "Seal Of The Poisoned Pact", &[457_815, 457_918]),
67 (228_411, "Cyrces Circlet", &[462_342]),
68 (219_297, "Cinderbrew Stein", &[446_648]),
69 (242_394, "Eradicating Arcanocore", &[1_233_384]),
70 (242_400, "Nexus Kings Command", &[1_232_776]),
71 (242_397, "Sigil Cosmic Hunt", &[1_235_360]),
72 (242_398, "Naazindhris Mystic Lash", &[1_235_387]),
73 (242_399, "Screams Forgotten Sky", &[1_235_272]),
74 (242_395, "Astral Antenna", &[1_234_714]),
75 (230_026, "Scrapfield 9001", &[466_671]),
76 (230_198, "Eye Of Kezan", &[469_888]),
77 (230_194, "Reverb Radio", &[471_567]),
78 (230_192, "Mugs Moxie Jug", &[471_548]),
79 (232_541, "Improvised Seaforium Pacemaker", &[1_218_714, 1_218_712]),
80 (232_545, "Gigazap Zap Cap", &[1_219_103]),
81 (230_199, "Zee Thug Hotline", &[1_217_356, 1_217_829]),
82 (219_321, "Cirral Concoctory", &[443_559]),
83 (219_295, "Sigil Algari Concordance", &[443_378]),
84];
85type ItemRegisterFn = fn(
86 CombatSystemBuilder,
87 &ResolvedGameData,
88 wowlab_engine_gamedata::ItemBudget,
89) -> CombatSystemBuilder;
90const ITEMS: &[(u32, ItemRegisterFn)] = &[
91 (220_202, spymasters_web::register),
92 (221_023, treacherous_transmitter::register),
93 (220_305, ovinax_mercurial_egg::register),
94 (212_454, mad_queens_mandate::register),
95 (212_451, aberrant_spellforge::register),
96 (219_300, skarmorak_shard::register),
97 (219_308, signet_of_the_priory::register),
98 (212_453, skyterror_corrosive_organ::register),
99 (219_915, foul_behemoth_chelicera::register),
100 (219_313, mereldar_toll::register),
101 (219_303, high_speakers_accretion::register),
102 (219_301, overclocked_gear_a_rang::register),
103 (219_310, bursting_lightshard::register),
104 (242_401, brand_ceaseless_ire::register),
105 (242_402, araz_ritual_forge::register),
106 (242_404, all_devouring_nucleus::register),
107 (242_392, diamantine_voidcore::register),
108 (242_396, unyielding_netherprism::register),
109 (242_403, perfidious_projector::register),
110 (242_393, loomithar_living_silk::register),
111 (242_391, soulbinder_embrace::register),
112 (230_027, house_of_cards::register),
113 (230_019, vexie_pit_whistle::register),
114 (230_190, torq_big_red_button::register),
115 (230_191, flarendo_pilot_light::register),
116 (230_188, gallagio_bottle_service::register),
117 (230_197, geargrinder_spare_keys::register),
118 (230_029, chromebustible_bomb_suit::register),
119 (230_193, mister_lock_n_stalk::register),
120 (230_189, junkmaestro_mega_magnet::register),
121 (232_542, darkfuse_medichopper::register),
122 (232_543, ringing_ritual_mud::register),
123 (232_546, kuj0_flame_vents::register),
124 (225_649, candle_confidant::register),
125 (212_449, sikrans_endless_arsenal::register),
126 (249_343, gaze_of_the_alnseer::register),
127 (260_235, umbral_plume::register),
128 (249_806, radiant_plume::register),
129 (239_664, arcanoweave_cord::register),
130 (249_346, vaelgors_final_stare::register),
131 (249_344, light_company_guidon::register),
132 (250_144, emberwing_feather::register),
133 (249_342, heart_of_ancient_hunger::register),
134 (249_809, locuswalkers_ribbon::register),
135 (268_290, sporecallers_blooming_loop::register),
136 (193_701, algethar_puzzle_box::register),
137];
138pub const REGISTERED_ITEMS: &[(u32, &str)] = &[
140 (220_202, "SPYMASTERS_WEB"),
141 (221_023, "TREACHEROUS_TRANSMITTER"),
142 (220_305, "OVINAX_MERCURIAL_EGG"),
143 (212_454, "MAD_QUEENS_MANDATE"),
144 (212_451, "ABERRANT_SPELLFORGE"),
145 (219_300, "SKARMORAK_SHARD"),
146 (219_308, "SIGNET_OF_THE_PRIORY"),
147 (212_453, "SKYTERROR_CORROSIVE_ORGAN"),
148 (212_456, "VOID_REAPERS_CONTRACT"),
149 (219_915, "FOUL_BEHEMOTH_CHELICERA"),
150 (219_313, "MERELDAR_TOLL"),
151 (219_303, "HIGH_SPEAKERS_ACCRETION"),
152 (219_311, "VOID_PACTSTONE"),
153 (219_312, "EMPOWERING_CRYSTAL_ANUBIKKAJ"),
154 (219_314, "ARA_KARA_SACBROOD"),
155 (219_305, "CARVED_BLAZIKON_WAX"),
156 (219_307, "REMNANT_OF_DARKNESS"),
157 (219_301, "OVERCLOCKED_GEAR_A_RANG"),
158 (219_302, "SCRAPSINGER_SYMPHONY"),
159 (219_304, "CONDUCTORS_WAX_WHISTLE"),
160 (219_317, "HARVESTER_EDICT"),
161 (219_316, "CEASELESS_SWARMGLAND"),
162 (219_310, "BURSTING_LIGHTSHARD"),
163 (219_315, "REFRACTING_AGGRESSION_MODULE"),
164 (219_296, "ENTROPIC_SKARDYN_CORE"),
165 (225_577, "SUREKI_ZEALOTS_INSIGNIA"),
166 (225_578, "SEAL_OF_THE_POISONED_PACT"),
167 (228_411, "CYRCES_CIRCLET"),
168 (219_297, "CINDERBREW_STEIN"),
169 (242_401, "BRAND_CEASELESS_IRE"),
170 (242_402, "ARAZ_RITUAL_FORGE"),
171 (242_404, "ALL_DEVOURING_NUCLEUS"),
172 (242_392, "DIAMANTINE_VOIDCORE"),
173 (242_394, "ERADICATING_ARCANOCORE"),
174 (242_400, "NEXUS_KINGS_COMMAND"),
175 (242_397, "SIGIL_COSMIC_HUNT"),
176 (242_398, "NAAZINDHRIS_MYSTIC_LASH"),
177 (242_399, "SCREAMS_FORGOTTEN_SKY"),
178 (242_395, "ASTRAL_ANTENNA"),
179 (242_396, "UNYIELDING_NETHERPRISM"),
180 (242_403, "PERFIDIOUS_PROJECTOR"),
181 (242_393, "LOOMITHAR_LIVING_SILK"),
182 (242_391, "SOULBINDER_EMBRACE"),
183 (230_027, "HOUSE_OF_CARDS"),
184 (230_019, "VEXIE_PIT_WHISTLE"),
185 (230_026, "SCRAPFIELD_9001"),
186 (230_190, "TORQ_BIG_RED_BUTTON"),
187 (230_191, "FLARENDO_PILOT_LIGHT"),
188 (230_198, "EYE_OF_KEZAN"),
189 (230_194, "REVERB_RADIO"),
190 (230_192, "MUGS_MOXIE_JUG"),
191 (230_188, "GALLAGIO_BOTTLE_SERVICE"),
192 (230_197, "GEARGRINDER_SPARE_KEYS"),
193 (230_029, "CHROMEBUSTIBLE_BOMB_SUIT"),
194 (230_193, "MISTER_LOCK_N_STALK"),
195 (230_189, "JUNKMAESTRO_MEGA_MAGNET"),
196 (232_541, "IMPROVISED_SEAFORIUM_PACEMAKER"),
197 (232_542, "DARKFUSE_MEDICHOPPER"),
198 (232_543, "RINGING_RITUAL_MUD"),
199 (232_545, "GIGAZAP_ZAP_CAP"),
200 (232_546, "KUJ0_FLAME_VENTS"),
201 (230_199, "ZEE_THUG_HOTLINE"),
202 (219_321, "CIRRAL_CONCOCTORY"),
203 (225_649, "CANDLE_CONFIDANT"),
204 (219_295, "SIGIL_ALGARI_CONCORDANCE"),
205 (212_449, "SIKRANS_ENDLESS_ARSENAL"),
206 (249_343, "GAZE_OF_THE_ALNSEER"),
207 (260_235, "UMBRAL_PLUME"),
208 (249_806, "RADIANT_PLUME"),
209 (239_664, "ARCANOWEAVE_CORD"),
210 (249_346, "VAELGORS_FINAL_STARE"),
211 (249_344, "LIGHT_COMPANY_GUIDON"),
212 (250_144, "EMBERWING_FEATHER"),
213 (249_342, "HEART_OF_ANCIENT_HUNGER"),
214 (249_809, "LOCUSWALKERS_RIBBON"),
215 (268_290, "SPORECALLERS_BLOOMING_LOOP"),
216 (193_701, "ALGETHAR_PUZZLE_BOX"),
217];
218pub(crate) const ITEM_RESOLVE_IDS: &[ResolveDependencies] = &[
219 ResolveDependencies::new(220_202, &[444_958, 444_959]),
220 ResolveDependencies::new(221_023, &[446_209, 449_946]),
221 ResolveDependencies::new(220_305, &[445_066, 445_560]),
222 ResolveDependencies::new(212_454, &[443_124, 443_128]),
223 ResolveDependencies::new(212_451, &[443_415, 445_619]),
224 ResolveDependencies::new(219_300, &[443_407, 443_409]),
225 ResolveDependencies::new(219_308, &[443_531, 450_877]),
226 ResolveDependencies::new(212_453, &[444_488, 444_489]),
227 ResolveDependencies::new(212_456, &[444_067]),
228 ResolveDependencies::new(219_915, &[444_258, 444_264]),
229 ResolveDependencies::new(219_313, &[450_561, 450_641]),
230 ResolveDependencies::new(219_303, &[443_415, 462_035]),
231 ResolveDependencies::new(219_311, &[443_537]),
232 ResolveDependencies::new(219_312, &[443_538]),
233 ResolveDependencies::new(219_314, &[443_541]),
234 ResolveDependencies::new(219_305, &[443_527]),
235 ResolveDependencies::new(219_307, &[443_530]),
236 ResolveDependencies::new(219_301, &[443_411, 446_764]),
237 ResolveDependencies::new(219_302, &[443_414]),
238 ResolveDependencies::new(219_304, &[443_525]),
239 ResolveDependencies::new(219_317, &[451_055]),
240 ResolveDependencies::new(219_316, &[443_545]),
241 ResolveDependencies::new(219_310, &[443_536, 450_916]),
242 ResolveDependencies::new(219_315, &[443_544]),
243 ResolveDependencies::new(219_296, &[443_380]),
244 ResolveDependencies::new(225_577, &[457_683]),
245 ResolveDependencies::new(225_578, &[457_815, 457_918]),
246 ResolveDependencies::new(228_411, &[462_342]),
247 ResolveDependencies::new(219_297, &[446_648]),
248 ResolveDependencies::new(242_401, &[1_235_225]),
249 ResolveDependencies::new(242_402, &[1_232_797, 1_232_802]),
250 ResolveDependencies::new(242_404, &[1_235_500]),
251 ResolveDependencies::new(242_392, &[1_234_996]),
252 ResolveDependencies::new(242_394, &[1_233_384]),
253 ResolveDependencies::new(242_400, &[1_232_776]),
254 ResolveDependencies::new(242_397, &[1_235_360]),
255 ResolveDependencies::new(242_398, &[1_235_387]),
256 ResolveDependencies::new(242_399, &[1_235_272]),
257 ResolveDependencies::new(242_395, &[1_234_714]),
258 ResolveDependencies::new(242_396, &[1_233_553, 1_233_556]),
259 ResolveDependencies::new(242_403, &[1_235_557, 1_244_636]),
260 ResolveDependencies::new(242_393, &[1_232_719, 1_232_721]),
261 ResolveDependencies::new(242_391, &[1_235_218, 1_235_425]),
262 ResolveDependencies::new(230_027, &[466_680, 466_681]),
263 ResolveDependencies::new(230_019, &[466_646, 466_652]),
264 ResolveDependencies::new(230_026, &[466_671]),
265 ResolveDependencies::new(230_190, &[470_042, 470_286]),
266 ResolveDependencies::new(230_191, &[471_057, 471_142]),
267 ResolveDependencies::new(230_198, &[469_888]),
268 ResolveDependencies::new(230_194, &[471_567]),
269 ResolveDependencies::new(230_192, &[471_548]),
270 ResolveDependencies::new(230_188, &[471_213, 471_214]),
271 ResolveDependencies::new(230_197, &[471_058, 471_059]),
272 ResolveDependencies::new(230_029, &[466_693, 466_810]),
273 ResolveDependencies::new(230_193, &[467_469, 467_485]),
274 ResolveDependencies::new(230_189, &[471_211, 471_212]),
275 ResolveDependencies::new(232_541, &[1_218_712, 1_218_714]),
276 ResolveDependencies::new(232_542, &[1_220_488, 1_220_605]),
277 ResolveDependencies::new(232_543, &[1_219_102, 1_221_145]),
278 ResolveDependencies::new(232_545, &[1_219_103]),
279 ResolveDependencies::new(232_546, &[1_218_716, 1_219_410]),
280 ResolveDependencies::new(230_199, &[1_217_356, 1_217_829]),
281 ResolveDependencies::new(219_321, &[443_559]),
282 ResolveDependencies::new(225_649, &[455_451]),
283 ResolveDependencies::new(219_295, &[443_378]),
284 ResolveDependencies::new(212_449, &[447_970]),
285 ResolveDependencies::new(249_343, &[1_256_896, 1_266_686, 1_266_687]),
286 ResolveDependencies::new(260_235, &[1_265_808, 1_265_809]),
287 ResolveDependencies::new(249_806, &[1_260_592, 1_260_615]),
288 ResolveDependencies::new(239_664, &[1_241_529, 1_241_530]),
289 ResolveDependencies::new(249_346, &[1_259_293, 1_260_459]),
290 ResolveDependencies::new(249_344, &[1_251_817, 1_259_633]),
291 ResolveDependencies::new(250_144, &[1_250_508]),
292 ResolveDependencies::new(249_342, &[1_251_822, 1_262_753]),
293 ResolveDependencies::new(249_809, &[1_259_314, 1_259_317, 1_268_058]),
294 ResolveDependencies::new(268_290, &[1_285_138, 1_286_135, 1_286_316]),
295 ResolveDependencies::new(193_701, &[383_781]),
296];
297pub(crate) const ITEM_USE_SPELLS: &[(u32, u32)] = &[
298 (220_202, 444_959),
299 (221_023, 449_946),
300 (220_305, 445_560),
301 (212_454, 443_124),
302 (212_451, 445_619),
303 (219_300, 443_407),
304 (219_308, 443_531),
305 (212_453, 444_489),
306 (219_915, 444_264),
307 (219_313, 450_561),
308 (219_303, 443_415),
309 (219_301, 443_411),
310 (219_310, 443_536),
311 (242_402, 1_232_802),
312 (242_396, 1_233_556),
313 (242_403, 1_244_636),
314 (242_393, 1_232_721),
315 (242_391, 1_235_425),
316 (230_027, 466_681),
317 (230_019, 466_652),
318 (230_190, 470_286),
319 (230_191, 471_142),
320 (230_188, 471_214),
321 (230_197, 471_059),
322 (230_029, 466_810),
323 (230_193, 467_485),
324 (230_189, 471_212),
325 (232_542, 1_220_488),
326 (232_543, 1_219_102),
327 (232_546, 1_218_716),
328 (225_649, 455_451),
329 (212_449, 447_970),
330 (249_346, 1_260_459),
331 (249_344, 1_259_633),
332 (250_144, 1_250_508),
333 (193_701, 383_781),
334];
335pub(crate) const ITEM_DAMAGE_IDENTITIES: &[(
336 u32,
337 &[wowlab_engine_combat::DamageActionId],
338)] = &[
339 (
340 220_202,
341 wowlab_engine_combat::generated_identities::items::spymasters_web::damage::ALL,
342 ),
343 (
344 221_023,
345 wowlab_engine_combat::generated_identities::items::treacherous_transmitter::damage::ALL,
346 ),
347 (
348 220_305,
349 wowlab_engine_combat::generated_identities::items::ovinax_mercurial_egg::damage::ALL,
350 ),
351 (
352 212_454,
353 wowlab_engine_combat::generated_identities::items::mad_queens_mandate::damage::ALL,
354 ),
355 (
356 212_451,
357 wowlab_engine_combat::generated_identities::items::aberrant_spellforge::damage::ALL,
358 ),
359 (
360 219_300,
361 wowlab_engine_combat::generated_identities::items::skarmorak_shard::damage::ALL,
362 ),
363 (
364 219_308,
365 wowlab_engine_combat::generated_identities::items::signet_of_the_priory::damage::ALL,
366 ),
367 (
368 212_453,
369 wowlab_engine_combat::generated_identities::items::skyterror_corrosive_organ::damage::ALL,
370 ),
371 (
372 212_456,
373 wowlab_engine_combat::generated_identities::items::void_reapers_contract::damage::ALL,
374 ),
375 (
376 219_915,
377 wowlab_engine_combat::generated_identities::items::foul_behemoth_chelicera::damage::ALL,
378 ),
379 (
380 219_313,
381 wowlab_engine_combat::generated_identities::items::mereldar_toll::damage::ALL,
382 ),
383 (
384 219_303,
385 wowlab_engine_combat::generated_identities::items::high_speakers_accretion::damage::ALL,
386 ),
387 (
388 219_311,
389 wowlab_engine_combat::generated_identities::items::void_pactstone::damage::ALL,
390 ),
391 (
392 219_312,
393 wowlab_engine_combat::generated_identities::items::empowering_crystal_anubikkaj::damage::ALL,
394 ),
395 (
396 219_314,
397 wowlab_engine_combat::generated_identities::items::ara_kara_sacbrood::damage::ALL,
398 ),
399 (
400 219_305,
401 wowlab_engine_combat::generated_identities::items::carved_blazikon_wax::damage::ALL,
402 ),
403 (
404 219_307,
405 wowlab_engine_combat::generated_identities::items::remnant_of_darkness::damage::ALL,
406 ),
407 (
408 219_301,
409 wowlab_engine_combat::generated_identities::items::overclocked_gear_a_rang::damage::ALL,
410 ),
411 (
412 219_302,
413 wowlab_engine_combat::generated_identities::items::scrapsinger_symphony::damage::ALL,
414 ),
415 (
416 219_304,
417 wowlab_engine_combat::generated_identities::items::conductors_wax_whistle::damage::ALL,
418 ),
419 (
420 219_317,
421 wowlab_engine_combat::generated_identities::items::harvester_edict::damage::ALL,
422 ),
423 (
424 219_316,
425 wowlab_engine_combat::generated_identities::items::ceaseless_swarmgland::damage::ALL,
426 ),
427 (
428 219_310,
429 wowlab_engine_combat::generated_identities::items::bursting_lightshard::damage::ALL,
430 ),
431 (
432 219_315,
433 wowlab_engine_combat::generated_identities::items::refracting_aggression_module::damage::ALL,
434 ),
435 (
436 219_296,
437 wowlab_engine_combat::generated_identities::items::entropic_skardyn_core::damage::ALL,
438 ),
439 (
440 225_577,
441 wowlab_engine_combat::generated_identities::items::sureki_zealots_insignia::damage::ALL,
442 ),
443 (
444 225_578,
445 wowlab_engine_combat::generated_identities::items::seal_of_the_poisoned_pact::damage::ALL,
446 ),
447 (
448 228_411,
449 wowlab_engine_combat::generated_identities::items::cyrces_circlet::damage::ALL,
450 ),
451 (
452 219_297,
453 wowlab_engine_combat::generated_identities::items::cinderbrew_stein::damage::ALL,
454 ),
455 (
456 242_401,
457 wowlab_engine_combat::generated_identities::items::brand_ceaseless_ire::damage::ALL,
458 ),
459 (
460 242_402,
461 wowlab_engine_combat::generated_identities::items::araz_ritual_forge::damage::ALL,
462 ),
463 (
464 242_404,
465 wowlab_engine_combat::generated_identities::items::all_devouring_nucleus::damage::ALL,
466 ),
467 (
468 242_392,
469 wowlab_engine_combat::generated_identities::items::diamantine_voidcore::damage::ALL,
470 ),
471 (
472 242_394,
473 wowlab_engine_combat::generated_identities::items::eradicating_arcanocore::damage::ALL,
474 ),
475 (
476 242_400,
477 wowlab_engine_combat::generated_identities::items::nexus_kings_command::damage::ALL,
478 ),
479 (
480 242_397,
481 wowlab_engine_combat::generated_identities::items::sigil_cosmic_hunt::damage::ALL,
482 ),
483 (
484 242_398,
485 wowlab_engine_combat::generated_identities::items::naazindhris_mystic_lash::damage::ALL,
486 ),
487 (
488 242_399,
489 wowlab_engine_combat::generated_identities::items::screams_forgotten_sky::damage::ALL,
490 ),
491 (
492 242_395,
493 wowlab_engine_combat::generated_identities::items::astral_antenna::damage::ALL,
494 ),
495 (
496 242_396,
497 wowlab_engine_combat::generated_identities::items::unyielding_netherprism::damage::ALL,
498 ),
499 (
500 242_403,
501 wowlab_engine_combat::generated_identities::items::perfidious_projector::damage::ALL,
502 ),
503 (
504 242_393,
505 wowlab_engine_combat::generated_identities::items::loomithar_living_silk::damage::ALL,
506 ),
507 (
508 242_391,
509 wowlab_engine_combat::generated_identities::items::soulbinder_embrace::damage::ALL,
510 ),
511 (
512 230_027,
513 wowlab_engine_combat::generated_identities::items::house_of_cards::damage::ALL,
514 ),
515 (
516 230_019,
517 wowlab_engine_combat::generated_identities::items::vexie_pit_whistle::damage::ALL,
518 ),
519 (
520 230_026,
521 wowlab_engine_combat::generated_identities::items::scrapfield_9001::damage::ALL,
522 ),
523 (
524 230_190,
525 wowlab_engine_combat::generated_identities::items::torq_big_red_button::damage::ALL,
526 ),
527 (
528 230_191,
529 wowlab_engine_combat::generated_identities::items::flarendo_pilot_light::damage::ALL,
530 ),
531 (
532 230_198,
533 wowlab_engine_combat::generated_identities::items::eye_of_kezan::damage::ALL,
534 ),
535 (
536 230_194,
537 wowlab_engine_combat::generated_identities::items::reverb_radio::damage::ALL,
538 ),
539 (
540 230_192,
541 wowlab_engine_combat::generated_identities::items::mugs_moxie_jug::damage::ALL,
542 ),
543 (
544 230_188,
545 wowlab_engine_combat::generated_identities::items::gallagio_bottle_service::damage::ALL,
546 ),
547 (
548 230_197,
549 wowlab_engine_combat::generated_identities::items::geargrinder_spare_keys::damage::ALL,
550 ),
551 (
552 230_029,
553 wowlab_engine_combat::generated_identities::items::chromebustible_bomb_suit::damage::ALL,
554 ),
555 (
556 230_193,
557 wowlab_engine_combat::generated_identities::items::mister_lock_n_stalk::damage::ALL,
558 ),
559 (
560 230_189,
561 wowlab_engine_combat::generated_identities::items::junkmaestro_mega_magnet::damage::ALL,
562 ),
563 (
564 232_541,
565 wowlab_engine_combat::generated_identities::items::improvised_seaforium_pacemaker::damage::ALL,
566 ),
567 (
568 232_542,
569 wowlab_engine_combat::generated_identities::items::darkfuse_medichopper::damage::ALL,
570 ),
571 (
572 232_543,
573 wowlab_engine_combat::generated_identities::items::ringing_ritual_mud::damage::ALL,
574 ),
575 (
576 232_545,
577 wowlab_engine_combat::generated_identities::items::gigazap_zap_cap::damage::ALL,
578 ),
579 (
580 232_546,
581 wowlab_engine_combat::generated_identities::items::kuj0_flame_vents::damage::ALL,
582 ),
583 (
584 230_199,
585 wowlab_engine_combat::generated_identities::items::zee_thug_hotline::damage::ALL,
586 ),
587 (
588 219_321,
589 wowlab_engine_combat::generated_identities::items::cirral_concoctory::damage::ALL,
590 ),
591 (
592 225_649,
593 wowlab_engine_combat::generated_identities::items::candle_confidant::damage::ALL,
594 ),
595 (
596 219_295,
597 wowlab_engine_combat::generated_identities::items::sigil_algari_concordance::damage::ALL,
598 ),
599 (
600 212_449,
601 wowlab_engine_combat::generated_identities::items::sikrans_endless_arsenal::damage::ALL,
602 ),
603 (
604 249_343,
605 wowlab_engine_combat::generated_identities::items::gaze_of_the_alnseer::damage::ALL,
606 ),
607 (
608 260_235,
609 wowlab_engine_combat::generated_identities::items::umbral_plume::damage::ALL,
610 ),
611 (
612 249_806,
613 wowlab_engine_combat::generated_identities::items::radiant_plume::damage::ALL,
614 ),
615 (
616 239_664,
617 wowlab_engine_combat::generated_identities::items::arcanoweave_cord::damage::ALL,
618 ),
619 (
620 249_346,
621 wowlab_engine_combat::generated_identities::items::vaelgors_final_stare::damage::ALL,
622 ),
623 (
624 249_344,
625 wowlab_engine_combat::generated_identities::items::light_company_guidon::damage::ALL,
626 ),
627 (
628 250_144,
629 wowlab_engine_combat::generated_identities::items::emberwing_feather::damage::ALL,
630 ),
631 (
632 249_342,
633 wowlab_engine_combat::generated_identities::items::heart_of_ancient_hunger::damage::ALL,
634 ),
635 (
636 249_809,
637 wowlab_engine_combat::generated_identities::items::locuswalkers_ribbon::damage::ALL,
638 ),
639 (
640 268_290,
641 wowlab_engine_combat::generated_identities::items::sporecallers_blooming_loop::damage::ALL,
642 ),
643 (
644 193_701,
645 wowlab_engine_combat::generated_identities::items::algethar_puzzle_box::damage::ALL,
646 ),
647];
648pub(crate) fn register_equipped(
649 mut builder: CombatSystemBuilder,
650 data: &ResolvedGameData,
651 equipped: &[wowlab_engine_ports::EquippedItem],
652) -> Result<CombatSystemBuilder, wowlab_engine_ports::EngineError> {
653 for item in equipped {
654 if let Some((_, identities)) = ITEM_DAMAGE_IDENTITIES
655 .iter()
656 .find(|(item_id, _)| *item_id == item.item_id)
657 {
658 builder = builder.effect_identities(identities);
659 }
660
661 if let Some(&(_, register)) = ITEMS
662 .iter()
663 .find(|(registered_id, _)| *registered_id == item.item_id)
664 {
665 builder = register(builder, data, crate::items::item_budget(data, item)?);
666 }
667
668 if let Some(&(_, display, aura_ids)) = SIMPLE_EQUIP_AURA_ITEMS
669 .iter()
670 .find(|(registered_id, _, _)| *registered_id == item.item_id)
671 {
672 builder = crate::items::register_simple_equip_auras(
673 data,
674 display,
675 aura_ids,
676 || builder,
677 );
678 }
679
680 if let Some(&(_, use_spell)) = ITEM_USE_SPELLS
681 .iter()
682 .find(|(registered_id, _)| *registered_id == item.item_id)
683 {
684 builder = builder.item_use_spell(item.slot, use_spell);
685 }
686 }
687
688 builder = register_player_cast_hooks(builder, equipped);
689 builder = register_player_impact_hooks(builder, data, equipped);
690
691 Ok(builder)
692}
693const PLAYER_CAST_HOOKS: &[(u32, wowlab_engine_combat::CastHookFn)] = &[
694 (219_915, crate::hooks::items::foul_behemoth_chelicera::on_player_cast),
695 (242_404, crate::hooks::items::all_devouring_nucleus::on_player_cast),
696 (242_392, crate::hooks::items::diamantine_voidcore::on_player_cast),
697 (249_342, crate::hooks::items::heart_of_ancient_hunger::on_player_cast),
698 (249_809, crate::hooks::items::locuswalkers_ribbon::on_player_cast),
699];
700fn register_player_cast_hooks(
701 mut builder: CombatSystemBuilder,
702 equipped: &[wowlab_engine_ports::EquippedItem],
703) -> CombatSystemBuilder {
704 for item in equipped {
705 if let Some(&(_, hook)) = PLAYER_CAST_HOOKS
706 .iter()
707 .find(|(registered_id, _)| *registered_id == item.item_id)
708 {
709 builder = builder.on_player_cast(hook);
710 }
711 }
712
713 builder
714}
715type PlayerImpactHookEntry = (
716 u32,
717 Option<u32>,
718 wowlab_engine_combat::ImpactProcFn,
719 bool,
720 bool,
721 bool,
722);
723const PLAYER_IMPACT_HOOKS: &[PlayerImpactHookEntry] = &[
724 (
725 249_343,
726 Some(1_256_896),
727 crate::hooks::items::gaze_of_the_alnseer::on_player_impact,
728 false,
729 true,
730 false,
731 ),
732 (
733 239_664,
734 Some(1_241_529),
735 crate::hooks::items::arcanoweave_cord::on_player_impact,
736 false,
737 false,
738 false,
739 ),
740 (
741 268_290,
742 Some(1_285_138),
743 crate::hooks::items::sporecallers_blooming_loop::on_player_impact,
744 false,
745 false,
746 false,
747 ),
748];
749fn register_player_impact_hooks(
750 mut builder: CombatSystemBuilder,
751 data: &ResolvedGameData,
752 equipped: &[wowlab_engine_ports::EquippedItem],
753) -> CombatSystemBuilder {
754 for item in equipped {
755 if let Some(
756 &(_, driver_spell_id, hook, periodic_only, skip_periodic, crit_only),
757 ) = PLAYER_IMPACT_HOOKS
758 .iter()
759 .find(|(registered_id, ..)| *registered_id == item.item_id)
760 {
761 builder = builder
762 .register_impact_proc(wowlab_engine_combat::ImpactProc {
763 driver: driver_spell_id
764 .map_or_else(
765 wowlab_engine_combat::ProcDriver::default,
766 |driver| {
767 wowlab_engine_combat::ProcDriver::from_spell(
768 data,
769 driver,
770 wowlab_engine_combat::ProcTriggerSide::Caster,
771 )
772 },
773 ),
774 actor_filter: wowlab_engine_combat::ImpactActorFilter::Player,
775 chance: 1.0,
776 fire: hook,
777 spell_filter: None,
778 periodic_only,
779 skip_periodic,
780 crit_only,
781 });
782 }
783 }
784
785 builder
786}