Skip to main content

wowlab_parsers/parsers/dbc/rows/
item.rs

1// #t(file: rust_duplicate_strings) DBC field attributes repeat an upstream-schema ownership reason that Rust requires as a literal.
2
3use serde::Deserialize;
4use wowlab_engine_macros::{HasFk, HasId};
5
6/// DBC row from Item.db2: base item data with class, subclass, and inventory type.
7#[derive(Clone, Debug, Deserialize, HasId)]
8#[allow(
9    non_snake_case,
10    reason = "fields mirror upstream DBC CSV headers exactly"
11)]
12pub struct ItemRow {
13    pub ID: i32,
14    pub ClassID: i32,
15    pub SubclassID: i32,
16    pub Material: i32,
17    pub InventoryType: i32,
18    pub SheatheType: i32,
19    #[serde(rename = "Sound_override_subclassID")]
20    pub SoundOverrideSubclassID: i32,
21    pub IconFileDataID: i32,
22    pub ItemGroupSoundsID: i32,
23    pub ContentTuningID: i32,
24    pub ModifiedCraftingReagentItemID: i32,
25    #[serde(rename = "Field_12_0_0_63534_010")]
26    pub Field_12_0_0_63534_010: i32,
27    pub CraftingQualityID: i32,
28    pub ItemSquishEraID: i32,
29    pub RecraftReagentCountPercentage: i32,
30    pub OrderSource: i32,
31}
32
33/// DBC row from ItemSparse.db2: extended item data with stats, flags, and requirements.
34#[derive(Clone, Debug, Deserialize, HasId)]
35#[allow(
36    non_snake_case,
37    reason = "fields mirror upstream DBC CSV headers exactly"
38)]
39pub struct ItemSparseRow {
40    pub ID: i32,
41    pub Description_lang: Option<String>,
42    pub Display3_lang: Option<String>,
43    pub Display2_lang: Option<String>,
44    pub Display1_lang: Option<String>,
45    pub Display_lang: Option<String>,
46    pub ExpansionID: i32,
47    pub DmgVariance: f32,
48    pub LimitCategory: i32,
49    pub DurationInInventory: i32,
50    pub QualityModifier: f32,
51    pub BagFamily: i32,
52    pub StartQuestID: i32,
53    pub LanguageID: i32,
54    pub ItemRange: f32,
55    pub StatPercentageOfSocket_0: f32,
56    pub StatPercentageOfSocket_1: f32,
57    pub StatPercentageOfSocket_2: f32,
58    pub StatPercentageOfSocket_3: f32,
59    pub StatPercentageOfSocket_4: f32,
60    pub StatPercentageOfSocket_5: f32,
61    pub StatPercentageOfSocket_6: f32,
62    pub StatPercentageOfSocket_7: f32,
63    pub StatPercentageOfSocket_8: f32,
64    pub StatPercentageOfSocket_9: f32,
65    pub StatPercentEditor_0: i32,
66    pub StatPercentEditor_1: i32,
67    pub StatPercentEditor_2: i32,
68    pub StatPercentEditor_3: i32,
69    pub StatPercentEditor_4: i32,
70    pub StatPercentEditor_5: i32,
71    pub StatPercentEditor_6: i32,
72    pub StatPercentEditor_7: i32,
73    pub StatPercentEditor_8: i32,
74    pub StatPercentEditor_9: i32,
75    #[serde(rename = "StatModifier_bonusStat_0")]
76    pub StatModifierBonusStat_0: i32,
77    #[serde(rename = "StatModifier_bonusStat_1")]
78    pub StatModifierBonusStat_1: i32,
79    #[serde(rename = "StatModifier_bonusStat_2")]
80    pub StatModifierBonusStat_2: i32,
81    #[serde(rename = "StatModifier_bonusStat_3")]
82    pub StatModifierBonusStat_3: i32,
83    #[serde(rename = "StatModifier_bonusStat_4")]
84    pub StatModifierBonusStat_4: i32,
85    #[serde(rename = "StatModifier_bonusStat_5")]
86    pub StatModifierBonusStat_5: i32,
87    #[serde(rename = "StatModifier_bonusStat_6")]
88    pub StatModifierBonusStat_6: i32,
89    #[serde(rename = "StatModifier_bonusStat_7")]
90    pub StatModifierBonusStat_7: i32,
91    #[serde(rename = "StatModifier_bonusStat_8")]
92    pub StatModifierBonusStat_8: i32,
93    #[serde(rename = "StatModifier_bonusStat_9")]
94    pub StatModifierBonusStat_9: i32,
95    pub Stackable: i32,
96    pub MaxCount: i32,
97    pub MinReputation: i32,
98    pub RequiredAbility: i32,
99    #[serde(default)]
100    pub AllowableRaces_0: Option<i64>,
101    #[serde(default)]
102    pub AllowableRaces_1: Option<i64>,
103    pub SellPrice: i32,
104    pub BuyPrice: i32,
105    pub VendorStackCount: i32,
106    pub PriceVariance: f32,
107    pub PriceRandomValue: f32,
108    pub Flags_0: i32,
109    pub Flags_1: i32,
110    pub Flags_2: i32,
111    pub Flags_3: i32,
112    pub Flags_4: i32,
113    pub OppositeFactionItemID: i32,
114    pub ModifiedCraftingReagentItemID: i32,
115    pub ContentTuningID: i32,
116    pub PlayerLevelToItemLevelCurveID: i32,
117    pub ItemLevelOffsetCurveID: i32,
118    pub ItemLevelOffsetItemLevel: i32,
119    pub ItemSquishEraID: i32,
120    pub ItemNameDescriptionID: i32,
121    pub RequiredTransmogHoliday: i32,
122    pub RequiredHoliday: i32,
123    #[serde(rename = "Gem_properties")]
124    pub GemProperties: i32,
125    #[serde(rename = "Socket_match_enchantment_ID")]
126    pub SocketMatchEnchantmentID: i32,
127    pub TotemCategoryID: i32,
128    pub InstanceBound: i32,
129    pub ZoneBound_0: i32,
130    pub ZoneBound_1: i32,
131    pub ItemSet: i32,
132    pub LockID: i32,
133    pub PageID: i32,
134    pub ItemDelay: i32,
135    pub MinFactionID: i32,
136    pub RequiredSkillRank: i32,
137    pub RequiredSkill: i32,
138    pub ItemLevel: i32,
139    pub AllowableClass: i32,
140    pub ArtifactID: i32,
141    pub SpellWeight: i32,
142    pub SpellWeightCategory: i32,
143    pub SocketType_0: i32,
144    pub SocketType_1: i32,
145    pub SocketType_2: i32,
146    pub SheatheType: i32,
147    pub Material: i32,
148    pub PageMaterialID: i32,
149    pub Bonding: i32,
150    pub DamageType: i32,
151    pub ContainerSlots: i32,
152    pub RequiredPVPMedal: i32,
153    pub RequiredPVPRank: i32,
154    pub RequiredLevel: i32,
155    pub InventoryType: i32,
156    pub OverallQualityID: i32,
157}
158
159/// DBC row from ItemXItemEffect.db2: maps items to their on-use or on-equip effects.
160#[derive(Clone, Debug, Deserialize, HasFk)]
161#[allow(
162    non_snake_case,
163    reason = "fields mirror upstream DBC CSV headers exactly"
164)]
165#[fk_field = "ItemID"]
166pub struct ItemXItemEffectRow {
167    pub ID: i32,
168    pub ItemEffectID: i32,
169    pub ItemID: i32,
170}
171
172/// DBC row from ItemEffect.db2: spell trigger and cooldown for an item effect.
173#[derive(Clone, Debug, Deserialize, HasId)]
174#[allow(
175    non_snake_case,
176    reason = "fields mirror upstream DBC CSV headers exactly"
177)]
178pub struct ItemEffectRow {
179    pub ID: i32,
180    pub LegacySlotIndex: i32,
181    pub TriggerType: i32,
182    pub Charges: i32,
183    pub CoolDownMSec: i32,
184    pub CategoryCoolDownMSec: i32,
185    pub SpellCategoryID: i32,
186    pub SpellID: i32,
187    pub ChrSpecializationID: i32,
188}
189
190/// DBC row from ItemSet.db2: set bonus definition with member item IDs.
191#[derive(Clone, Debug, Deserialize, HasId)]
192#[allow(
193    non_snake_case,
194    reason = "fields mirror upstream DBC CSV headers exactly"
195)]
196pub struct ItemSetRow {
197    pub ID: i32,
198    pub Name_lang: Option<String>,
199    pub SetFlags: i32,
200    pub RequiredSkill: i32,
201    pub RequiredSkillRank: i32,
202    pub ItemID_0: i32,
203    pub ItemID_1: i32,
204    pub ItemID_2: i32,
205    pub ItemID_3: i32,
206    pub ItemID_4: i32,
207    pub ItemID_5: i32,
208    pub ItemID_6: i32,
209    pub ItemID_7: i32,
210    pub ItemID_8: i32,
211    pub ItemID_9: i32,
212    pub ItemID_10: i32,
213    pub ItemID_11: i32,
214    pub ItemID_12: i32,
215    pub ItemID_13: i32,
216    pub ItemID_14: i32,
217    pub ItemID_15: i32,
218    pub ItemID_16: i32,
219}
220
221/// DBC row from ItemSetSpell.db2: spell triggered at a specific set piece threshold.
222#[derive(Clone, Debug, Deserialize, HasFk)]
223#[allow(
224    non_snake_case,
225    reason = "fields mirror upstream DBC CSV headers exactly"
226)]
227#[fk_field = "ItemSetID"]
228pub struct ItemSetSpellRow {
229    pub ID: i32,
230    pub ChrSpecID: i32,
231    pub SpellID: i32,
232    pub TraitSubTreeID: i32,
233    pub Threshold: i32,
234    pub ItemSetID: i32,
235}
236
237/// DBC row from ItemClass.db2: top-level item class (weapon, armor, consumable, etc.).
238#[derive(Clone, Debug, Deserialize, HasId)]
239#[allow(
240    non_snake_case,
241    reason = "fields mirror upstream DBC CSV headers exactly"
242)]
243pub struct ItemClassRow {
244    pub ID: i32,
245    pub ClassName_lang: Option<String>,
246    pub ClassID: i32,
247    pub PriceModifier: f32,
248    pub Flags: i32,
249}
250
251/// DBC row from ItemSubClass.db2: item sub-class with weapon/armor type details.
252#[derive(Clone, Debug, Deserialize, HasId)]
253#[allow(
254    non_snake_case,
255    reason = "fields mirror upstream DBC CSV headers exactly"
256)]
257pub struct ItemSubClassRow {
258    pub DisplayName_lang: Option<String>,
259    pub VerboseName_lang: Option<String>,
260    pub ID: i32,
261    pub ClassID: i32,
262    pub SubClassID: i32,
263    pub AuctionHouseSortOrder: i32,
264    pub PrerequisiteProficiency: i32,
265    pub Flags: i32,
266    pub DisplayFlags: i32,
267    pub WeaponSwingSize: i32,
268    pub PostrequisiteProficiency: i32,
269}
270
271/// DBC row from ItemModifiedAppearance.db2: maps items to their appearance.
272#[derive(Clone, Debug, Deserialize, HasFk)]
273#[allow(
274    non_snake_case,
275    reason = "fields mirror upstream DBC CSV headers exactly"
276)]
277#[fk_field = "ItemID"]
278pub struct ItemModifiedAppearanceRow {
279    pub ID: i32,
280    pub ItemID: i32,
281    pub ItemAppearanceModifierID: i32,
282    pub ItemAppearanceID: i32,
283    pub OrderIndex: i32,
284    pub TransmogSourceTypeEnum: i32,
285    pub Flags: i32,
286}
287
288/// DBC row from ItemAppearance.db2: visual appearance with icon and display info.
289#[derive(Clone, Debug, Deserialize, HasId)]
290#[allow(
291    non_snake_case,
292    reason = "fields mirror upstream DBC CSV headers exactly"
293)]
294pub struct ItemAppearanceRow {
295    pub ID: i32,
296    pub DisplayType: i32,
297    pub ItemDisplayInfoID: i32,
298    pub DefaultIconFileDataID: i32,
299    pub UiOrder: i32,
300    pub TransmogPlayerConditionID: i32,
301}
302
303/// DBC row from ItemBonus.db2: bonus modifier applied to items via bonus lists.
304#[derive(Clone, Debug, Deserialize, HasFk)]
305#[allow(
306    non_snake_case,
307    reason = "fields mirror upstream DBC CSV headers exactly"
308)]
309#[fk_field = "ParentItemBonusListID"]
310pub struct ItemBonusRow {
311    pub ID: i32,
312    pub Value_0: i32,
313    pub Value_1: i32,
314    pub Value_2: i32,
315    pub Value_3: i32,
316    pub ParentItemBonusListID: i32,
317    pub Type: i32,
318    pub OrderIndex: i32,
319}
320
321/// DBC row from GemProperties.db2: gem enchant ID and socket type.
322#[derive(Clone, Debug, Deserialize, HasId)]
323#[allow(
324    non_snake_case,
325    reason = "fields mirror upstream DBC CSV headers exactly"
326)]
327pub struct GemPropertiesRow {
328    pub ID: i32,
329    pub Enchant_ID: i32,
330    pub Type: i32,
331}
332
333/// DBC row from ItemBonusTreeNode.db2: a node in the item bonus tree walk.
334#[derive(Clone, Debug, Deserialize, HasFk)]
335#[allow(
336    non_snake_case,
337    reason = "fields mirror upstream DBC CSV headers exactly"
338)]
339#[fk_field = "ParentItemBonusTreeID"]
340pub struct ItemBonusTreeNodeRow {
341    pub ID: i32,
342    pub ItemContext: i32,
343    pub ChildItemBonusTreeID: i32,
344    pub ChildItemBonusListID: i32,
345    pub ChildItemBonusListGroupID: i32,
346    pub IblGroupPointsModSetID: i32,
347    pub MinMythicPlusLevel: i32,
348    pub MaxMythicPlusLevel: i32,
349    pub ParentItemBonusTreeID: i32,
350}
351
352/// DBC row from ItemBonusListGroupEntry.db2: an entry within a bonus list group.
353#[derive(Clone, Debug, Deserialize, HasFk)]
354#[allow(
355    non_snake_case,
356    reason = "fields mirror upstream DBC CSV headers exactly"
357)]
358#[fk_field = "ItemBonusListGroupID"]
359pub struct ItemBonusListGroupEntryRow {
360    pub ID: i32,
361    pub ItemBonusListGroupID: i32,
362    pub ItemBonusListID: i32,
363    pub ItemLevelSelectorID: i32,
364    pub SequenceValue: i32,
365    pub Flags: i32,
366}
367
368/// DBC row from ItemLevelSelector.db2: item level selector metadata.
369#[derive(Clone, Debug, Deserialize, HasId)]
370#[allow(
371    non_snake_case,
372    reason = "fields mirror upstream DBC CSV headers exactly"
373)]
374pub struct ItemLevelSelectorRow {
375    pub ID: i32,
376    pub MinItemLevel: i32,
377    pub ItemLevelSelectorQualitySetID: i32,
378    pub AzeriteUnlockMappingSetID: i32,
379}
380
381/// DBC row from ItemLevelSelectorQualitySet.db2: rare/epic ilvl pair for selectors.
382#[derive(Clone, Debug, Deserialize, HasId)]
383#[allow(
384    non_snake_case,
385    reason = "fields mirror upstream DBC CSV headers exactly"
386)]
387pub struct ItemLevelSelectorQualitySetRow {
388    pub ID: i32,
389    pub IlvlRare: i32,
390    pub IlvlEpic: i32,
391}
392
393/// DBC row from ItemLevelSelectorQuality.db2: quality-specific bonus list mapping.
394#[derive(Clone, Debug, Deserialize, HasId)]
395#[allow(
396    non_snake_case,
397    reason = "fields mirror upstream DBC CSV headers exactly"
398)]
399pub struct ItemLevelSelectorQualityRow {
400    pub ID: i32,
401    pub QualityItemBonusListID: i32,
402    pub Quality: i32,
403    pub ParentILSQualitySetID: i32,
404}
405
406/// DBC row from ItemXBonusTree.db2: maps an item to its bonus tree root.
407#[derive(Clone, Debug, Deserialize, HasFk)]
408#[allow(
409    non_snake_case,
410    reason = "fields mirror upstream DBC CSV headers exactly"
411)]
412#[fk_field = "ItemID"]
413pub struct ItemXBonusTreeRow {
414    pub ID: i32,
415    pub ItemBonusTreeID: i32,
416    pub ItemID: i32,
417}
418
419/// DBC row from CraftingData.db2: a crafted product header (recipe output).
420#[derive(Clone, Debug, Deserialize, HasId)]
421#[allow(
422    non_snake_case,
423    reason = "fields mirror upstream DBC CSV headers exactly"
424)]
425pub struct CraftingDataRow {
426    pub ID: i32,
427    pub Type: i32,
428    pub CraftingDifficultyID: i32,
429    pub CraftedItemID: i32,
430    pub ItemBonusTreeID: i32,
431}
432
433/// DBC row from CraftingDataItemQuality.db2: per-quality item variant of a crafted product.
434#[derive(Clone, Debug, Deserialize, HasFk)]
435#[allow(
436    non_snake_case,
437    reason = "fields mirror upstream DBC CSV headers exactly"
438)]
439#[fk_field = "CraftingDataID"]
440pub struct CraftingDataItemQualityRow {
441    pub ID: i32,
442    pub ItemID: i32,
443    pub CraftingDataID: i32,
444}
445
446/// DBC row from CraftingDataEnchantQuality.db2: per-quality permanent enchantment.
447#[derive(Clone, Debug, Deserialize, HasFk)]
448#[allow(
449    non_snake_case,
450    reason = "fields mirror upstream DBC CSV headers exactly"
451)]
452#[fk_field = "CraftingDataID"]
453pub struct CraftingDataEnchantQualityRow {
454    pub ID: i32,
455    /// Foreign key to `CraftingQuality.ID`, not the quality tier itself.
456    pub Rank: i32,
457    pub SpellItemEnchantmentID: i32,
458    pub ItemID: i32,
459    pub CraftingDataID: i32,
460}
461
462/// DBC row from SkillLineAbility.db2: maps a spell to a skill line (e.g. profession).
463#[derive(Clone, Debug, Deserialize, HasFk)]
464#[allow(
465    non_snake_case,
466    reason = "fields mirror upstream DBC CSV headers exactly"
467)]
468#[fk_field = "Spell"]
469pub struct SkillLineAbilityRow {
470    pub ID: i32,
471    pub SkillLine: i32,
472    pub Spell: i32,
473    /// Bitmask of classes that may learn the ability; `0` means every class.
474    pub ClassMask: i32,
475    /// Low 32 bits of the race bitmask; `0` in both words means "inherit the skill line's races".
476    pub RaceMasks_0: i32,
477    /// High 32 bits of the race bitmask.
478    pub RaceMasks_1: i32,
479}
480
481/// DBC row from SkillRaceClassInfo.db2: which races and classes a skill line belongs to.
482#[derive(Clone, Debug, Deserialize, HasFk)]
483#[allow(
484    non_snake_case,
485    reason = "fields mirror upstream DBC CSV headers exactly"
486)]
487#[fk_field = "SkillID"]
488pub struct SkillRaceClassInfoRow {
489    pub ID: i32,
490    pub SkillID: i32,
491    pub ClassMask: i32,
492    pub Flags: i32,
493    pub RaceMasks_0: i32,
494    pub RaceMasks_1: i32,
495}
496
497/// DBC row from Profession.db2: a profession definition keyed by enum value.
498#[derive(Clone, Debug, Deserialize, HasId)]
499#[allow(
500    non_snake_case,
501    reason = "fields mirror upstream DBC CSV headers exactly"
502)]
503pub struct ProfessionRow {
504    pub ID: i32,
505    pub SkillLineID: i32,
506    pub ProfessionEnumValue: i32,
507}
508
509/// DBC row from ModifiedCraftingItem.db2: links a crafted item to its quality tier.
510#[derive(Clone, Debug, Deserialize, HasId)]
511#[allow(
512    non_snake_case,
513    reason = "fields mirror upstream DBC CSV headers exactly"
514)]
515#[id_field = "ItemID"]
516pub struct ModifiedCraftingItemRow {
517    pub ItemID: i32,
518    pub ModifiedCraftingReagentItemID: i32,
519    pub CraftingQualityID: i32,
520}
521
522/// DBC row from CraftingQuality.db2: a quality tier (1..5) for crafted items.
523#[derive(Clone, Debug, Deserialize, HasId)]
524#[allow(
525    non_snake_case,
526    reason = "fields mirror upstream DBC CSV headers exactly"
527)]
528pub struct CraftingQualityRow {
529    pub ID: i32,
530    pub QualityTier: i32,
531    pub CraftingQualityAtlasSetID: i32,
532}
533
534/// DBC row from CurrencyTypes.db2: currency definition (valor, flightstones, crests, etc.).
535#[derive(Clone, Debug, Deserialize, HasId)]
536#[allow(
537    non_snake_case,
538    reason = "fields mirror upstream DBC CSV headers exactly"
539)]
540pub struct CurrencyTypesRow {
541    pub ID: i32,
542    pub Name_lang: Option<String>,
543    pub CategoryID: i32,
544    pub InventoryIconFileID: i32,
545    pub MaxQty: i32,
546    pub MaxEarnablePerWeek: i32,
547    pub Quality: i32,
548    pub OrderIndex: i32,
549    pub Flags_0: i32,
550}
551
552/// DBC row from CurrencyCategory.db2: grouping category for currencies.
553#[derive(Clone, Debug, Deserialize, HasId)]
554#[allow(
555    non_snake_case,
556    reason = "fields mirror upstream DBC CSV headers exactly"
557)]
558pub struct CurrencyCategoryRow {
559    pub ID: i32,
560    pub Name_lang: Option<String>,
561    pub Flags: i32,
562    pub ExpansionID: i32,
563    pub ParentCategoryID: i32,
564}
565
566/// DBC row from ItemBonusListGroup.db2: header for an item bonus list group.
567#[derive(Clone, Debug, Deserialize, HasId)]
568#[allow(
569    non_snake_case,
570    reason = "fields mirror upstream DBC CSV headers exactly"
571)]
572pub struct ItemBonusListGroupRow {
573    pub ID: i32,
574    pub SequenceSpellID: i32,
575    pub PlayerConditionID: i32,
576    pub ItemExtendedCostID: i32,
577    pub ItemLogicalCostGroupID: i32,
578    pub ItemGroupIlvlScalingID: i32,
579}
580
581/// DBC row from ItemGroupIlvlScalingEntry.db2: per-currency scaling entry for a bonus list group.
582#[derive(Clone, Debug, Deserialize, HasFk)]
583#[allow(
584    non_snake_case,
585    reason = "fields mirror upstream DBC CSV headers exactly"
586)]
587#[fk_field = "ItemGroupIlvlScalingID"]
588pub struct ItemGroupIlvlScalingEntryRow {
589    pub ID: i32,
590    pub CurrencyTypeID: i32,
591    pub ItemID: i32,
592    pub CostScaling: f32,
593    pub Flags: i32,
594    pub PlayerConditionID: i32,
595    pub ConditionalCostScaling: f32,
596    pub ItemGroupIlvlScalingID: i32,
597}
598
599/// DBC row from ItemConversion.db2: header for an item conversion (e.g. catalyst output).
600#[derive(Clone, Debug, Deserialize, HasId)]
601#[allow(
602    non_snake_case,
603    reason = "fields mirror upstream DBC CSV headers exactly"
604)]
605pub struct ItemConversionRow {
606    pub ID: i32,
607    pub ItemBonusTreeID: i32,
608    pub ItemLogicalCostGroupID: i32,
609    pub AlternateItemLogicalCostGroupID: i32,
610    pub PlayerConditionID: i32,
611}
612
613/// DBC row from ItemConversionEntry.db2: source items for an item conversion.
614#[derive(Clone, Debug, Deserialize, HasFk)]
615#[allow(
616    non_snake_case,
617    reason = "fields mirror upstream DBC CSV headers exactly"
618)]
619#[fk_field = "ItemConversionID"]
620pub struct ItemConversionEntryRow {
621    pub ID: i32,
622    pub ItemID: i32,
623    pub ItemConversionID: i32,
624}
625
626/// DBC row from ChallengeModeItemBonusOverride.db2: Mythic+ bonus tree override for a key tier.
627#[derive(Clone, Debug, Deserialize, HasId)]
628#[allow(
629    non_snake_case,
630    reason = "fields mirror upstream DBC CSV headers exactly"
631)]
632pub struct ChallengeModeItemBonusOverrideRow {
633    pub ID: i32,
634    pub ItemBonusTreeGroupID: i32,
635    pub DstItemBonusTreeID: i32,
636    pub Value: i32,
637    pub RequiredTimeEventPassed: i32,
638    pub RequiredTimeEventNotPassed: i32,
639    pub SrcItemBonusTreeID: i32,
640}
641
642/// DBC row from ItemBonusSequenceSpell.db2: spell sequence trigger for an item bonus.
643#[derive(Clone, Debug, Deserialize, HasId)]
644#[allow(
645    non_snake_case,
646    reason = "fields mirror upstream DBC CSV headers exactly"
647)]
648pub struct ItemBonusSequenceSpellRow {
649    pub ID: i32,
650    pub SpellID: i32,
651    pub ItemID: i32,
652}