diff --git a/Data/expansions/classic/dbc_layouts.json b/Data/expansions/classic/dbc_layouts.json index ae75e254..ea0497a4 100644 --- a/Data/expansions/classic/dbc_layouts.json +++ b/Data/expansions/classic/dbc_layouts.json @@ -1,92 +1,48 @@ { - "Spell": { + "AreaTable": { + "ExploreFlag": 3, "ID": 0, - "Attributes": 5, - "AttributesEx": 6, - "IconID": 117, - "Name": 120, - "Tooltip": 147, - "Rank": 129, - "SchoolEnum": 1, - "CastingTimeIndex": 15, - "PowerType": 28, - "ManaCost": 29, - "RangeIndex": 33, - "DispelType": 4 + "MapID": 1, + "ParentAreaNum": 2 }, - "SpellRange": { - "MaxRange": 2 - }, - "ItemDisplayInfo": { - "ID": 0, - "LeftModel": 1, - "LeftModelTexture": 3, - "InventoryIcon": 5, - "GeosetGroup1": 7, - "GeosetGroup3": 9, - "TextureArmUpper": 14, - "TextureArmLower": 15, - "TextureHand": 16, - "TextureTorsoUpper": 17, - "TextureTorsoLower": 18, - "TextureLegUpper": 19, - "TextureLegLower": 20, - "TextureFoot": 21 - }, - "CharSections": { + "CharHairGeosets": { + "GeosetID": 4, "RaceID": 1, "SexID": 2, + "Variation": 3 + }, + "CharSections": { "BaseSection": 3, - "VariationIndex": 4, "ColorIndex": 5, + "Flags": 9, + "RaceID": 1, + "SexID": 2, "Texture1": 6, "Texture2": 7, "Texture3": 8, - "Flags": 9 + "VariationIndex": 4 }, - "SpellIcon": { - "ID": 0, - "Path": 1 + "CharacterFacialHairStyles": { + "Geoset100": 3, + "Geoset200": 5, + "Geoset300": 4, + "RaceID": 0, + "SexID": 1, + "Variation": 2 }, - "FactionTemplate": { + "CreatureDisplayInfo": { + "ExtraDisplayId": 3, "ID": 0, - "Faction": 1, - "FactionGroup": 3, - "FriendGroup": 4, - "EnemyGroup": 5, - "Enemy0": 6, - "Enemy1": 7, - "Enemy2": 8, - "Enemy3": 9 - }, - "Faction": { - "ID": 0, - "ReputationRaceMask0": 2, - "ReputationRaceMask1": 3, - "ReputationRaceMask2": 4, - "ReputationRaceMask3": 5, - "ReputationBase0": 10, - "ReputationBase1": 11, - "ReputationBase2": 12, - "ReputationBase3": 13 - }, - "AreaTable": { - "ID": 0, - "MapID": 1, - "ParentAreaNum": 2, - "ExploreFlag": 3 + "ModelID": 1, + "Skin1": 6, + "Skin2": 7, + "Skin3": 8 }, "CreatureDisplayInfoExtra": { - "ID": 0, - "RaceID": 1, - "SexID": 2, - "SkinID": 3, - "FaceID": 4, - "HairStyleID": 5, - "HairColorID": 6, - "FacialHairID": 7, + "BakeName": 20, "EquipDisplay0": 8, "EquipDisplay1": 9, + "EquipDisplay10": 18, "EquipDisplay2": 10, "EquipDisplay3": 11, "EquipDisplay4": 12, @@ -95,128 +51,89 @@ "EquipDisplay7": 15, "EquipDisplay8": 16, "EquipDisplay9": 17, - "EquipDisplay10": 18, - "BakeName": 20 - }, - "CreatureDisplayInfo": { + "FaceID": 4, + "FacialHairID": 7, + "HairColorID": 6, + "HairStyleID": 5, "ID": 0, - "ModelID": 1, - "ExtraDisplayId": 3, - "Skin1": 6, - "Skin2": 7, - "Skin3": 8 - }, - "TaxiNodes": { - "ID": 0, - "MapID": 1, - "X": 2, - "Y": 3, - "Z": 4, - "Name": 5 - }, - "TaxiPath": { - "ID": 0, - "FromNode": 1, - "ToNode": 2, - "Cost": 3 - }, - "TaxiPathNode": { - "ID": 0, - "PathID": 1, - "NodeIndex": 2, - "MapID": 3, - "X": 4, - "Y": 5, - "Z": 6 - }, - "TalentTab": { - "ID": 0, - "Name": 1, - "ClassMask": 12, - "OrderIndex": 14, - "BackgroundFile": 15 - }, - "Talent": { - "ID": 0, - "TabID": 1, - "Row": 2, - "Column": 3, - "RankSpell0": 4, - "PrereqTalent0": 9, - "PrereqRank0": 12 - }, - "SkillLineAbility": { - "SkillLineID": 1, - "SpellID": 2 - }, - "SkillLine": { - "ID": 0, - "Category": 1, - "Name": 3 - }, - "Map": { - "ID": 0, - "InternalName": 1 + "RaceID": 1, + "SexID": 2, + "SkinID": 3 }, "CreatureModelData": { "ID": 0, "ModelPath": 2 }, - "CharHairGeosets": { - "RaceID": 1, - "SexID": 2, - "Variation": 3, - "GeosetID": 4 - }, - "CharacterFacialHairStyles": { - "RaceID": 0, - "SexID": 1, - "Variation": 2, - "Geoset100": 3, - "Geoset300": 4, - "Geoset200": 5 - }, - "GameObjectDisplayInfo": { - "ID": 0, - "ModelName": 1 - }, "Emotes": { - "ID": 0, - "AnimID": 2 + "AnimID": 2, + "ID": 0 }, "EmotesText": { - "ID": 0, "Command": 1, "EmoteRef": 2, - "OthersTargetTextID": 3, - "SenderTargetTextID": 5, + "ID": 0, "OthersNoTargetTextID": 7, - "SenderNoTargetTextID": 9 + "OthersTargetTextID": 3, + "SenderNoTargetTextID": 9, + "SenderTargetTextID": 5 }, "EmotesTextData": { "ID": 0, "Text": 1 }, + "Faction": { + "ID": 0, + "ReputationBase0": 10, + "ReputationBase1": 11, + "ReputationBase2": 12, + "ReputationBase3": 13, + "ReputationRaceMask0": 2, + "ReputationRaceMask1": 3, + "ReputationRaceMask2": 4, + "ReputationRaceMask3": 5 + }, + "FactionTemplate": { + "Enemy0": 6, + "Enemy1": 7, + "Enemy2": 8, + "Enemy3": 9, + "EnemyGroup": 5, + "Faction": 1, + "FactionGroup": 3, + "FriendGroup": 4, + "ID": 0 + }, + "GameObjectDisplayInfo": { + "ID": 0, + "ModelName": 1 + }, + "ItemDisplayInfo": { + "GeosetGroup1": 7, + "GeosetGroup3": 9, + "ID": 0, + "InventoryIcon": 5, + "LeftModel": 1, + "LeftModelTexture": 3, + "TextureArmLower": 15, + "TextureArmUpper": 14, + "TextureFoot": 21, + "TextureHand": 16, + "TextureLegLower": 20, + "TextureLegUpper": 19, + "TextureTorsoLower": 18, + "TextureTorsoUpper": 17 + }, "Light": { "ID": 0, - "MapID": 1, - "X": 2, - "Z": 3, - "Y": 4, "InnerRadius": 5, - "OuterRadius": 6, "LightParamsID": 7, "LightParamsIDRain": 8, - "LightParamsIDUnderwater": 9 - }, - "LightParams": { - "LightParamsID": 0 - }, - "LightIntBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 + "LightParamsIDUnderwater": 9, + "MapID": 1, + "OuterRadius": 6, + "X": 2, + "Y": 4, + "Z": 3 }, "LightFloatBand": { "BlockIndex": 1, @@ -224,33 +141,119 @@ "TimeKey0": 3, "Value0": 19 }, - "WorldMapArea": { + "LightIntBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightParams": { + "LightParamsID": 0 + }, + "Map": { "ID": 0, - "MapID": 1, - "AreaID": 2, - "AreaName": 3, - "LocLeft": 4, - "LocRight": 5, - "LocTop": 6, - "LocBottom": 7, - "DisplayMapID": 8, - "ParentWorldMapID": 10 + "InternalName": 1 + }, + "SkillLine": { + "Category": 1, + "ID": 0, + "Name": 3 + }, + "SkillLineAbility": { + "SkillLineID": 1, + "SpellID": 2 + }, + "Spell": { + "Attributes": 5, + "AttributesEx": 6, + "CastingTimeIndex": 15, + "DispelType": 4, + "EffectBasePoints0": 80, + "EffectBasePoints1": 81, + "EffectBasePoints2": 82, + "ID": 0, + "IconID": 117, + "ManaCost": 29, + "Name": 120, + "PowerType": 28, + "RangeIndex": 33, + "Rank": 129, + "SchoolEnum": 1, + "Tooltip": 147 + }, + "SpellIcon": { + "ID": 0, + "Path": 1 + }, + "SpellRange": { + "MaxRange": 2 }, "SpellVisual": { - "ID": 0, "CastKit": 2, + "ID": 0, "ImpactKit": 3, "MissileModel": 8 }, + "SpellVisualEffectName": { + "FilePath": 2, + "ID": 0 + }, "SpellVisualKit": { - "ID": 0, "BaseEffect": 5, + "ID": 0, "SpecialEffect0": 11, "SpecialEffect1": 12, "SpecialEffect2": 13 }, - "SpellVisualEffectName": { + "Talent": { + "Column": 3, "ID": 0, - "FilePath": 2 + "PrereqRank0": 12, + "PrereqTalent0": 9, + "RankSpell0": 4, + "Row": 2, + "TabID": 1 + }, + "TalentTab": { + "BackgroundFile": 15, + "ClassMask": 12, + "ID": 0, + "Name": 1, + "OrderIndex": 14 + }, + "TaxiNodes": { + "ID": 0, + "MapID": 1, + "Name": 5, + "X": 2, + "Y": 3, + "Z": 4 + }, + "TaxiPath": { + "Cost": 3, + "FromNode": 1, + "ID": 0, + "ToNode": 2 + }, + "TaxiPathNode": { + "ID": 0, + "MapID": 3, + "NodeIndex": 2, + "PathID": 1, + "X": 4, + "Y": 5, + "Z": 6 + }, + "WorldMapArea": { + "AreaID": 2, + "AreaName": 3, + "DisplayMapID": 8, + "ID": 0, + "LocBottom": 7, + "LocLeft": 4, + "LocRight": 5, + "LocTop": 6, + "MapID": 1, + "ParentWorldMapID": 10 } } diff --git a/Data/expansions/tbc/dbc_layouts.json b/Data/expansions/tbc/dbc_layouts.json index 8142434e..ad9ab574 100644 --- a/Data/expansions/tbc/dbc_layouts.json +++ b/Data/expansions/tbc/dbc_layouts.json @@ -1,97 +1,53 @@ { - "Spell": { + "AreaTable": { + "ExploreFlag": 3, "ID": 0, - "Attributes": 5, - "AttributesEx": 6, - "IconID": 124, - "Name": 127, - "Tooltip": 154, - "Rank": 136, - "SchoolMask": 215, - "CastingTimeIndex": 22, - "PowerType": 35, - "ManaCost": 36, - "RangeIndex": 40, - "DispelType": 3 + "MapID": 1, + "ParentAreaNum": 2 }, - "SpellRange": { - "MaxRange": 4 - }, - "ItemDisplayInfo": { - "ID": 0, - "LeftModel": 1, - "LeftModelTexture": 3, - "InventoryIcon": 5, - "GeosetGroup1": 7, - "GeosetGroup3": 9, - "TextureArmUpper": 14, - "TextureArmLower": 15, - "TextureHand": 16, - "TextureTorsoUpper": 17, - "TextureTorsoLower": 18, - "TextureLegUpper": 19, - "TextureLegLower": 20, - "TextureFoot": 21 - }, - "CharSections": { + "CharHairGeosets": { + "GeosetID": 4, "RaceID": 1, "SexID": 2, + "Variation": 3 + }, + "CharSections": { "BaseSection": 3, - "VariationIndex": 4, "ColorIndex": 5, + "Flags": 9, + "RaceID": 1, + "SexID": 2, "Texture1": 6, "Texture2": 7, "Texture3": 8, - "Flags": 9 - }, - "SpellIcon": { - "ID": 0, - "Path": 1 - }, - "FactionTemplate": { - "ID": 0, - "Faction": 1, - "FactionGroup": 3, - "FriendGroup": 4, - "EnemyGroup": 5, - "Enemy0": 6, - "Enemy1": 7, - "Enemy2": 8, - "Enemy3": 9 - }, - "Faction": { - "ID": 0, - "ReputationRaceMask0": 2, - "ReputationRaceMask1": 3, - "ReputationRaceMask2": 4, - "ReputationRaceMask3": 5, - "ReputationBase0": 10, - "ReputationBase1": 11, - "ReputationBase2": 12, - "ReputationBase3": 13 + "VariationIndex": 4 }, "CharTitles": { "ID": 0, "Title": 2, "TitleBit": 20 }, - "AreaTable": { + "CharacterFacialHairStyles": { + "Geoset100": 3, + "Geoset200": 5, + "Geoset300": 4, + "RaceID": 0, + "SexID": 1, + "Variation": 2 + }, + "CreatureDisplayInfo": { + "ExtraDisplayId": 3, "ID": 0, - "MapID": 1, - "ParentAreaNum": 2, - "ExploreFlag": 3 + "ModelID": 1, + "Skin1": 6, + "Skin2": 7, + "Skin3": 8 }, "CreatureDisplayInfoExtra": { - "ID": 0, - "RaceID": 1, - "SexID": 2, - "SkinID": 3, - "FaceID": 4, - "HairStyleID": 5, - "HairColorID": 6, - "FacialHairID": 7, + "BakeName": 20, "EquipDisplay0": 8, "EquipDisplay1": 9, + "EquipDisplay10": 18, "EquipDisplay2": 10, "EquipDisplay3": 11, "EquipDisplay4": 12, @@ -100,158 +56,80 @@ "EquipDisplay7": 15, "EquipDisplay8": 16, "EquipDisplay9": 17, - "EquipDisplay10": 18, - "BakeName": 20 - }, - "CreatureDisplayInfo": { + "FaceID": 4, + "FacialHairID": 7, + "HairColorID": 6, + "HairStyleID": 5, "ID": 0, - "ModelID": 1, - "ExtraDisplayId": 3, - "Skin1": 6, - "Skin2": 7, - "Skin3": 8 - }, - "TaxiNodes": { - "ID": 0, - "MapID": 1, - "X": 2, - "Y": 3, - "Z": 4, - "Name": 5, - "MountDisplayIdAllianceFallback": 12, - "MountDisplayIdHordeFallback": 13, - "MountDisplayIdAlliance": 14, - "MountDisplayIdHorde": 15 - }, - "TaxiPath": { - "ID": 0, - "FromNode": 1, - "ToNode": 2, - "Cost": 3 - }, - "TaxiPathNode": { - "ID": 0, - "PathID": 1, - "NodeIndex": 2, - "MapID": 3, - "X": 4, - "Y": 5, - "Z": 6 - }, - "TalentTab": { - "ID": 0, - "Name": 1, - "ClassMask": 12, - "OrderIndex": 14, - "BackgroundFile": 15 - }, - "Talent": { - "ID": 0, - "TabID": 1, - "Row": 2, - "Column": 3, - "RankSpell0": 4, - "PrereqTalent0": 9, - "PrereqRank0": 12 - }, - "SkillLineAbility": { - "SkillLineID": 1, - "SpellID": 2 - }, - "SkillLine": { - "ID": 0, - "Category": 1, - "Name": 3 - }, - "Map": { - "ID": 0, - "InternalName": 1 + "RaceID": 1, + "SexID": 2, + "SkinID": 3 }, "CreatureModelData": { "ID": 0, "ModelPath": 2 }, - "CharHairGeosets": { - "RaceID": 1, - "SexID": 2, - "Variation": 3, - "GeosetID": 4 - }, - "CharacterFacialHairStyles": { - "RaceID": 0, - "SexID": 1, - "Variation": 2, - "Geoset100": 3, - "Geoset300": 4, - "Geoset200": 5 - }, - "GameObjectDisplayInfo": { - "ID": 0, - "ModelName": 1 - }, "Emotes": { - "ID": 0, - "AnimID": 2 + "AnimID": 2, + "ID": 0 }, "EmotesText": { - "ID": 0, "Command": 1, "EmoteRef": 2, - "OthersTargetTextID": 3, - "SenderTargetTextID": 5, + "ID": 0, "OthersNoTargetTextID": 7, - "SenderNoTargetTextID": 9 + "OthersTargetTextID": 3, + "SenderNoTargetTextID": 9, + "SenderTargetTextID": 5 }, "EmotesTextData": { "ID": 0, "Text": 1 }, - "Light": { + "Faction": { "ID": 0, - "MapID": 1, - "X": 2, - "Z": 3, - "Y": 4, - "InnerRadius": 5, - "OuterRadius": 6, - "LightParamsID": 7, - "LightParamsIDRain": 8, - "LightParamsIDUnderwater": 9 + "ReputationBase0": 10, + "ReputationBase1": 11, + "ReputationBase2": 12, + "ReputationBase3": 13, + "ReputationRaceMask0": 2, + "ReputationRaceMask1": 3, + "ReputationRaceMask2": 4, + "ReputationRaceMask3": 5 }, - "LightParams": { - "LightParamsID": 0 + "FactionTemplate": { + "Enemy0": 6, + "Enemy1": 7, + "Enemy2": 8, + "Enemy3": 9, + "EnemyGroup": 5, + "Faction": 1, + "FactionGroup": 3, + "FriendGroup": 4, + "ID": 0 }, - "LightIntBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "LightFloatBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "WorldMapArea": { + "GameObjectDisplayInfo": { "ID": 0, - "MapID": 1, - "AreaID": 2, - "AreaName": 3, - "LocLeft": 4, - "LocRight": 5, - "LocTop": 6, - "LocBottom": 7, - "DisplayMapID": 8, - "ParentWorldMapID": 10 + "ModelName": 1 }, - "SpellItemEnchantment": { + "ItemDisplayInfo": { + "GeosetGroup1": 7, + "GeosetGroup3": 9, "ID": 0, - "Name": 8 + "InventoryIcon": 5, + "LeftModel": 1, + "LeftModelTexture": 3, + "TextureArmLower": 15, + "TextureArmUpper": 14, + "TextureFoot": 21, + "TextureHand": 16, + "TextureLegLower": 20, + "TextureLegUpper": 19, + "TextureTorsoLower": 18, + "TextureTorsoUpper": 17 }, "ItemSet": { "ID": 0, - "Name": 1, "Item0": 18, "Item1": 19, "Item2": 20, @@ -262,6 +140,7 @@ "Item7": 25, "Item8": 26, "Item9": 27, + "Name": 1, "Spell0": 28, "Spell1": 29, "Spell2": 30, @@ -283,21 +162,145 @@ "Threshold8": 46, "Threshold9": 47 }, - "SpellVisual": { + "Light": { "ID": 0, + "InnerRadius": 5, + "LightParamsID": 7, + "LightParamsIDRain": 8, + "LightParamsIDUnderwater": 9, + "MapID": 1, + "OuterRadius": 6, + "X": 2, + "Y": 4, + "Z": 3 + }, + "LightFloatBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightIntBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightParams": { + "LightParamsID": 0 + }, + "Map": { + "ID": 0, + "InternalName": 1 + }, + "SkillLine": { + "Category": 1, + "ID": 0, + "Name": 3 + }, + "SkillLineAbility": { + "SkillLineID": 1, + "SpellID": 2 + }, + "Spell": { + "Attributes": 5, + "AttributesEx": 6, + "CastingTimeIndex": 22, + "DispelType": 3, + "EffectBasePoints0": 80, + "EffectBasePoints1": 81, + "EffectBasePoints2": 82, + "ID": 0, + "IconID": 124, + "ManaCost": 36, + "Name": 127, + "PowerType": 35, + "RangeIndex": 40, + "Rank": 136, + "SchoolMask": 215, + "Tooltip": 154 + }, + "SpellIcon": { + "ID": 0, + "Path": 1 + }, + "SpellItemEnchantment": { + "ID": 0, + "Name": 8 + }, + "SpellRange": { + "MaxRange": 4 + }, + "SpellVisual": { "CastKit": 2, + "ID": 0, "ImpactKit": 3, "MissileModel": 8 }, + "SpellVisualEffectName": { + "FilePath": 2, + "ID": 0 + }, "SpellVisualKit": { - "ID": 0, "BaseEffect": 5, + "ID": 0, "SpecialEffect0": 11, "SpecialEffect1": 12, "SpecialEffect2": 13 }, - "SpellVisualEffectName": { + "Talent": { + "Column": 3, "ID": 0, - "FilePath": 2 + "PrereqRank0": 12, + "PrereqTalent0": 9, + "RankSpell0": 4, + "Row": 2, + "TabID": 1 + }, + "TalentTab": { + "BackgroundFile": 15, + "ClassMask": 12, + "ID": 0, + "Name": 1, + "OrderIndex": 14 + }, + "TaxiNodes": { + "ID": 0, + "MapID": 1, + "MountDisplayIdAlliance": 14, + "MountDisplayIdAllianceFallback": 12, + "MountDisplayIdHorde": 15, + "MountDisplayIdHordeFallback": 13, + "Name": 5, + "X": 2, + "Y": 3, + "Z": 4 + }, + "TaxiPath": { + "Cost": 3, + "FromNode": 1, + "ID": 0, + "ToNode": 2 + }, + "TaxiPathNode": { + "ID": 0, + "MapID": 3, + "NodeIndex": 2, + "PathID": 1, + "X": 4, + "Y": 5, + "Z": 6 + }, + "WorldMapArea": { + "AreaID": 2, + "AreaName": 3, + "DisplayMapID": 8, + "ID": 0, + "LocBottom": 7, + "LocLeft": 4, + "LocRight": 5, + "LocTop": 6, + "MapID": 1, + "ParentWorldMapID": 10 } } diff --git a/Data/expansions/turtle/dbc_layouts.json b/Data/expansions/turtle/dbc_layouts.json index 42839fc6..be1602f8 100644 --- a/Data/expansions/turtle/dbc_layouts.json +++ b/Data/expansions/turtle/dbc_layouts.json @@ -1,90 +1,45 @@ { - "Spell": { + "AreaTable": { + "ExploreFlag": 3, "ID": 0, - "Attributes": 5, - "AttributesEx": 6, - "IconID": 117, - "Name": 120, - "Tooltip": 147, - "Rank": 129, - "SchoolEnum": 1, - "CastingTimeIndex": 15, - "PowerType": 28, - "ManaCost": 29, - "RangeIndex": 33, - "DispelType": 4 + "MapID": 1, + "ParentAreaNum": 2 }, - "SpellRange": { - "MaxRange": 2 - }, - "ItemDisplayInfo": { - "ID": 0, - "LeftModel": 1, - "LeftModelTexture": 3, - "InventoryIcon": 5, - "GeosetGroup1": 7, - "GeosetGroup3": 9, - "TextureArmUpper": 14, - "TextureArmLower": 15, - "TextureHand": 16, - "TextureTorsoUpper": 17, - "TextureTorsoLower": 18, - "TextureLegUpper": 19, - "TextureLegLower": 20, - "TextureFoot": 21 - }, - "CharSections": { + "CharHairGeosets": { + "GeosetID": 4, "RaceID": 1, "SexID": 2, + "Variation": 3 + }, + "CharSections": { "BaseSection": 3, - "VariationIndex": 4, "ColorIndex": 5, + "Flags": 9, + "RaceID": 1, + "SexID": 2, "Texture1": 6, "Texture2": 7, "Texture3": 8, - "Flags": 9 + "VariationIndex": 4 }, - "SpellIcon": { - "ID": 0, - "Path": 1 + "CharacterFacialHairStyles": { + "Geoset100": 3, + "Geoset200": 5, + "Geoset300": 4, + "RaceID": 0, + "SexID": 1, + "Variation": 2 }, - "FactionTemplate": { + "CreatureDisplayInfo": { + "ExtraDisplayId": 3, "ID": 0, - "Faction": 1, - "FactionGroup": 3, - "FriendGroup": 4, - "EnemyGroup": 5, - "Enemy0": 6, - "Enemy1": 7, - "Enemy2": 8, - "Enemy3": 9 - }, - "Faction": { - "ID": 0, - "ReputationRaceMask0": 2, - "ReputationRaceMask1": 3, - "ReputationRaceMask2": 4, - "ReputationRaceMask3": 5, - "ReputationBase0": 10, - "ReputationBase1": 11, - "ReputationBase2": 12, - "ReputationBase3": 13 - }, - "AreaTable": { - "ID": 0, - "MapID": 1, - "ParentAreaNum": 2, - "ExploreFlag": 3 + "ModelID": 1, + "Skin1": 6, + "Skin2": 7, + "Skin3": 8 }, "CreatureDisplayInfoExtra": { - "ID": 0, - "RaceID": 1, - "SexID": 2, - "SkinID": 3, - "FaceID": 4, - "HairStyleID": 5, - "HairColorID": 6, - "FacialHairID": 7, + "BakeName": 18, "EquipDisplay0": 8, "EquipDisplay1": 9, "EquipDisplay2": 10, @@ -95,153 +50,80 @@ "EquipDisplay7": 15, "EquipDisplay8": 16, "EquipDisplay9": 17, - "BakeName": 18 - }, - "CreatureDisplayInfo": { + "FaceID": 4, + "FacialHairID": 7, + "HairColorID": 6, + "HairStyleID": 5, "ID": 0, - "ModelID": 1, - "ExtraDisplayId": 3, - "Skin1": 6, - "Skin2": 7, - "Skin3": 8 - }, - "TaxiNodes": { - "ID": 0, - "MapID": 1, - "X": 2, - "Y": 3, - "Z": 4, - "Name": 5 - }, - "TaxiPath": { - "ID": 0, - "FromNode": 1, - "ToNode": 2, - "Cost": 3 - }, - "TaxiPathNode": { - "ID": 0, - "PathID": 1, - "NodeIndex": 2, - "MapID": 3, - "X": 4, - "Y": 5, - "Z": 6 - }, - "TalentTab": { - "ID": 0, - "Name": 1, - "ClassMask": 12, - "OrderIndex": 14, - "BackgroundFile": 15 - }, - "Talent": { - "ID": 0, - "TabID": 1, - "Row": 2, - "Column": 3, - "RankSpell0": 4, - "PrereqTalent0": 9, - "PrereqRank0": 12 - }, - "SkillLineAbility": { - "SkillLineID": 1, - "SpellID": 2 - }, - "SkillLine": { - "ID": 0, - "Category": 1, - "Name": 3 - }, - "Map": { - "ID": 0, - "InternalName": 1 + "RaceID": 1, + "SexID": 2, + "SkinID": 3 }, "CreatureModelData": { "ID": 0, "ModelPath": 2 }, - "CharHairGeosets": { - "RaceID": 1, - "SexID": 2, - "Variation": 3, - "GeosetID": 4 - }, - "CharacterFacialHairStyles": { - "RaceID": 0, - "SexID": 1, - "Variation": 2, - "Geoset100": 3, - "Geoset300": 4, - "Geoset200": 5 - }, - "GameObjectDisplayInfo": { - "ID": 0, - "ModelName": 1 - }, "Emotes": { - "ID": 0, - "AnimID": 2 + "AnimID": 2, + "ID": 0 }, "EmotesText": { - "ID": 0, "Command": 1, "EmoteRef": 2, - "OthersTargetTextID": 3, - "SenderTargetTextID": 5, + "ID": 0, "OthersNoTargetTextID": 7, - "SenderNoTargetTextID": 9 + "OthersTargetTextID": 3, + "SenderNoTargetTextID": 9, + "SenderTargetTextID": 5 }, "EmotesTextData": { "ID": 0, "Text": 1 }, - "Light": { + "Faction": { "ID": 0, - "MapID": 1, - "X": 2, - "Z": 3, - "Y": 4, - "InnerRadius": 5, - "OuterRadius": 6, - "LightParamsID": 7, - "LightParamsIDRain": 8, - "LightParamsIDUnderwater": 9 + "ReputationBase0": 10, + "ReputationBase1": 11, + "ReputationBase2": 12, + "ReputationBase3": 13, + "ReputationRaceMask0": 2, + "ReputationRaceMask1": 3, + "ReputationRaceMask2": 4, + "ReputationRaceMask3": 5 }, - "LightParams": { - "LightParamsID": 0 + "FactionTemplate": { + "Enemy0": 6, + "Enemy1": 7, + "Enemy2": 8, + "Enemy3": 9, + "EnemyGroup": 5, + "Faction": 1, + "FactionGroup": 3, + "FriendGroup": 4, + "ID": 0 }, - "LightIntBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "LightFloatBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "WorldMapArea": { + "GameObjectDisplayInfo": { "ID": 0, - "MapID": 1, - "AreaID": 2, - "AreaName": 3, - "LocLeft": 4, - "LocRight": 5, - "LocTop": 6, - "LocBottom": 7, - "DisplayMapID": 8, - "ParentWorldMapID": 10 + "ModelName": 1 }, - "SpellItemEnchantment": { + "ItemDisplayInfo": { + "GeosetGroup1": 7, + "GeosetGroup3": 9, "ID": 0, - "Name": 8 + "InventoryIcon": 5, + "LeftModel": 1, + "LeftModelTexture": 3, + "TextureArmLower": 15, + "TextureArmUpper": 14, + "TextureFoot": 21, + "TextureHand": 16, + "TextureLegLower": 20, + "TextureLegUpper": 19, + "TextureTorsoLower": 18, + "TextureTorsoUpper": 17 }, "ItemSet": { "ID": 0, - "Name": 1, "Item0": 10, "Item1": 11, "Item2": 12, @@ -252,6 +134,7 @@ "Item7": 17, "Item8": 18, "Item9": 19, + "Name": 1, "Spell0": 20, "Spell1": 21, "Spell2": 22, @@ -273,21 +156,141 @@ "Threshold8": 38, "Threshold9": 39 }, - "SpellVisual": { + "Light": { "ID": 0, + "InnerRadius": 5, + "LightParamsID": 7, + "LightParamsIDRain": 8, + "LightParamsIDUnderwater": 9, + "MapID": 1, + "OuterRadius": 6, + "X": 2, + "Y": 4, + "Z": 3 + }, + "LightFloatBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightIntBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightParams": { + "LightParamsID": 0 + }, + "Map": { + "ID": 0, + "InternalName": 1 + }, + "SkillLine": { + "Category": 1, + "ID": 0, + "Name": 3 + }, + "SkillLineAbility": { + "SkillLineID": 1, + "SpellID": 2 + }, + "Spell": { + "Attributes": 5, + "AttributesEx": 6, + "CastingTimeIndex": 15, + "DispelType": 4, + "EffectBasePoints0": 80, + "EffectBasePoints1": 81, + "EffectBasePoints2": 82, + "ID": 0, + "IconID": 117, + "ManaCost": 29, + "Name": 120, + "PowerType": 28, + "RangeIndex": 33, + "Rank": 129, + "SchoolEnum": 1, + "Tooltip": 147 + }, + "SpellIcon": { + "ID": 0, + "Path": 1 + }, + "SpellItemEnchantment": { + "ID": 0, + "Name": 8 + }, + "SpellRange": { + "MaxRange": 2 + }, + "SpellVisual": { "CastKit": 2, + "ID": 0, "ImpactKit": 3, "MissileModel": 8 }, + "SpellVisualEffectName": { + "FilePath": 2, + "ID": 0 + }, "SpellVisualKit": { - "ID": 0, "BaseEffect": 5, + "ID": 0, "SpecialEffect0": 11, "SpecialEffect1": 12, "SpecialEffect2": 13 }, - "SpellVisualEffectName": { + "Talent": { + "Column": 3, "ID": 0, - "FilePath": 2 + "PrereqRank0": 12, + "PrereqTalent0": 9, + "RankSpell0": 4, + "Row": 2, + "TabID": 1 + }, + "TalentTab": { + "BackgroundFile": 15, + "ClassMask": 12, + "ID": 0, + "Name": 1, + "OrderIndex": 14 + }, + "TaxiNodes": { + "ID": 0, + "MapID": 1, + "Name": 5, + "X": 2, + "Y": 3, + "Z": 4 + }, + "TaxiPath": { + "Cost": 3, + "FromNode": 1, + "ID": 0, + "ToNode": 2 + }, + "TaxiPathNode": { + "ID": 0, + "MapID": 3, + "NodeIndex": 2, + "PathID": 1, + "X": 4, + "Y": 5, + "Z": 6 + }, + "WorldMapArea": { + "AreaID": 2, + "AreaName": 3, + "DisplayMapID": 8, + "ID": 0, + "LocBottom": 7, + "LocLeft": 4, + "LocRight": 5, + "LocTop": 6, + "MapID": 1, + "ParentWorldMapID": 10 } } diff --git a/Data/expansions/wotlk/dbc_layouts.json b/Data/expansions/wotlk/dbc_layouts.json index 5a05a517..ab495769 100644 --- a/Data/expansions/wotlk/dbc_layouts.json +++ b/Data/expansions/wotlk/dbc_layouts.json @@ -1,109 +1,65 @@ { - "Spell": { + "Achievement": { + "Description": 21, "ID": 0, - "Attributes": 4, - "AttributesEx": 5, - "IconID": 133, - "Name": 136, - "Tooltip": 139, - "Rank": 153, - "SchoolMask": 225, - "PowerType": 14, - "ManaCost": 39, - "CastingTimeIndex": 47, - "RangeIndex": 49, - "DispelType": 2 + "Points": 39, + "Title": 4 }, - "SpellRange": { - "MaxRange": 4 - }, - "ItemDisplayInfo": { + "AchievementCriteria": { + "AchievementID": 1, + "Description": 9, "ID": 0, - "LeftModel": 1, - "LeftModelTexture": 3, - "InventoryIcon": 5, - "GeosetGroup1": 7, - "GeosetGroup3": 9, - "TextureArmUpper": 14, - "TextureArmLower": 15, - "TextureHand": 16, - "TextureTorsoUpper": 17, - "TextureTorsoLower": 18, - "TextureLegUpper": 19, - "TextureLegLower": 20, - "TextureFoot": 21 + "Quantity": 4 }, - "CharSections": { + "AreaTable": { + "ExploreFlag": 3, + "ID": 0, + "MapID": 1, + "ParentAreaNum": 2 + }, + "CharHairGeosets": { + "GeosetID": 4, "RaceID": 1, "SexID": 2, + "Variation": 3 + }, + "CharSections": { "BaseSection": 3, - "VariationIndex": 4, "ColorIndex": 5, + "Flags": 9, + "RaceID": 1, + "SexID": 2, "Texture1": 6, "Texture2": 7, "Texture3": 8, - "Flags": 9 - }, - "SpellIcon": { - "ID": 0, - "Path": 1 - }, - "FactionTemplate": { - "ID": 0, - "Faction": 1, - "FactionGroup": 3, - "FriendGroup": 4, - "EnemyGroup": 5, - "Enemy0": 6, - "Enemy1": 7, - "Enemy2": 8, - "Enemy3": 9 - }, - "Faction": { - "ID": 0, - "ReputationRaceMask0": 2, - "ReputationRaceMask1": 3, - "ReputationRaceMask2": 4, - "ReputationRaceMask3": 5, - "ReputationBase0": 10, - "ReputationBase1": 11, - "ReputationBase2": 12, - "ReputationBase3": 13 + "VariationIndex": 4 }, "CharTitles": { "ID": 0, "Title": 2, "TitleBit": 36 }, - "Achievement": { - "ID": 0, - "Title": 4, - "Description": 21, - "Points": 39 + "CharacterFacialHairStyles": { + "Geoset100": 3, + "Geoset200": 5, + "Geoset300": 4, + "RaceID": 0, + "SexID": 1, + "Variation": 2 }, - "AchievementCriteria": { + "CreatureDisplayInfo": { + "ExtraDisplayId": 3, "ID": 0, - "AchievementID": 1, - "Quantity": 4, - "Description": 9 - }, - "AreaTable": { - "ID": 0, - "MapID": 1, - "ParentAreaNum": 2, - "ExploreFlag": 3 + "ModelID": 1, + "Skin1": 6, + "Skin2": 7, + "Skin3": 8 }, "CreatureDisplayInfoExtra": { - "ID": 0, - "RaceID": 1, - "SexID": 2, - "SkinID": 3, - "FaceID": 4, - "HairStyleID": 5, - "HairColorID": 6, - "FacialHairID": 7, + "BakeName": 20, "EquipDisplay0": 8, "EquipDisplay1": 9, + "EquipDisplay10": 18, "EquipDisplay2": 10, "EquipDisplay3": 11, "EquipDisplay4": 12, @@ -112,158 +68,80 @@ "EquipDisplay7": 15, "EquipDisplay8": 16, "EquipDisplay9": 17, - "EquipDisplay10": 18, - "BakeName": 20 - }, - "CreatureDisplayInfo": { + "FaceID": 4, + "FacialHairID": 7, + "HairColorID": 6, + "HairStyleID": 5, "ID": 0, - "ModelID": 1, - "ExtraDisplayId": 3, - "Skin1": 6, - "Skin2": 7, - "Skin3": 8 - }, - "TaxiNodes": { - "ID": 0, - "MapID": 1, - "X": 2, - "Y": 3, - "Z": 4, - "Name": 5, - "MountDisplayIdAllianceFallback": 20, - "MountDisplayIdHordeFallback": 21, - "MountDisplayIdAlliance": 22, - "MountDisplayIdHorde": 23 - }, - "TaxiPath": { - "ID": 0, - "FromNode": 1, - "ToNode": 2, - "Cost": 3 - }, - "TaxiPathNode": { - "ID": 0, - "PathID": 1, - "NodeIndex": 2, - "MapID": 3, - "X": 4, - "Y": 5, - "Z": 6 - }, - "TalentTab": { - "ID": 0, - "Name": 1, - "ClassMask": 20, - "OrderIndex": 22, - "BackgroundFile": 23 - }, - "Talent": { - "ID": 0, - "TabID": 1, - "Row": 2, - "Column": 3, - "RankSpell0": 4, - "PrereqTalent0": 9, - "PrereqRank0": 12 - }, - "SkillLineAbility": { - "SkillLineID": 1, - "SpellID": 2 - }, - "SkillLine": { - "ID": 0, - "Category": 1, - "Name": 3 - }, - "Map": { - "ID": 0, - "InternalName": 1 + "RaceID": 1, + "SexID": 2, + "SkinID": 3 }, "CreatureModelData": { "ID": 0, "ModelPath": 2 }, - "CharHairGeosets": { - "RaceID": 1, - "SexID": 2, - "Variation": 3, - "GeosetID": 4 - }, - "CharacterFacialHairStyles": { - "RaceID": 0, - "SexID": 1, - "Variation": 2, - "Geoset100": 3, - "Geoset300": 4, - "Geoset200": 5 - }, - "GameObjectDisplayInfo": { - "ID": 0, - "ModelName": 1 - }, "Emotes": { - "ID": 0, - "AnimID": 2 + "AnimID": 2, + "ID": 0 }, "EmotesText": { - "ID": 0, "Command": 1, "EmoteRef": 2, - "OthersTargetTextID": 3, - "SenderTargetTextID": 5, + "ID": 0, "OthersNoTargetTextID": 7, - "SenderNoTargetTextID": 9 + "OthersTargetTextID": 3, + "SenderNoTargetTextID": 9, + "SenderTargetTextID": 5 }, "EmotesTextData": { "ID": 0, "Text": 1 }, - "Light": { + "Faction": { "ID": 0, - "MapID": 1, - "X": 2, - "Z": 3, - "Y": 4, - "InnerRadius": 5, - "OuterRadius": 6, - "LightParamsID": 7, - "LightParamsIDRain": 8, - "LightParamsIDUnderwater": 9 + "ReputationBase0": 10, + "ReputationBase1": 11, + "ReputationBase2": 12, + "ReputationBase3": 13, + "ReputationRaceMask0": 2, + "ReputationRaceMask1": 3, + "ReputationRaceMask2": 4, + "ReputationRaceMask3": 5 }, - "LightParams": { - "LightParamsID": 0 + "FactionTemplate": { + "Enemy0": 6, + "Enemy1": 7, + "Enemy2": 8, + "Enemy3": 9, + "EnemyGroup": 5, + "Faction": 1, + "FactionGroup": 3, + "FriendGroup": 4, + "ID": 0 }, - "LightIntBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "LightFloatBand": { - "BlockIndex": 1, - "NumKeyframes": 2, - "TimeKey0": 3, - "Value0": 19 - }, - "WorldMapArea": { + "GameObjectDisplayInfo": { "ID": 0, - "MapID": 1, - "AreaID": 2, - "AreaName": 3, - "LocLeft": 4, - "LocRight": 5, - "LocTop": 6, - "LocBottom": 7, - "DisplayMapID": 8, - "ParentWorldMapID": 10 + "ModelName": 1 }, - "SpellItemEnchantment": { + "ItemDisplayInfo": { + "GeosetGroup1": 7, + "GeosetGroup3": 9, "ID": 0, - "Name": 8 + "InventoryIcon": 5, + "LeftModel": 1, + "LeftModelTexture": 3, + "TextureArmLower": 15, + "TextureArmUpper": 14, + "TextureFoot": 21, + "TextureHand": 16, + "TextureLegLower": 20, + "TextureLegUpper": 19, + "TextureTorsoLower": 18, + "TextureTorsoUpper": 17 }, "ItemSet": { "ID": 0, - "Name": 1, "Item0": 18, "Item1": 19, "Item2": 20, @@ -274,6 +152,7 @@ "Item7": 25, "Item8": 26, "Item9": 27, + "Name": 1, "Spell0": 28, "Spell1": 29, "Spell2": 30, @@ -299,21 +178,145 @@ "ID": 0, "Name": 1 }, - "SpellVisual": { + "Light": { "ID": 0, + "InnerRadius": 5, + "LightParamsID": 7, + "LightParamsIDRain": 8, + "LightParamsIDUnderwater": 9, + "MapID": 1, + "OuterRadius": 6, + "X": 2, + "Y": 4, + "Z": 3 + }, + "LightFloatBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightIntBand": { + "BlockIndex": 1, + "NumKeyframes": 2, + "TimeKey0": 3, + "Value0": 19 + }, + "LightParams": { + "LightParamsID": 0 + }, + "Map": { + "ID": 0, + "InternalName": 1 + }, + "SkillLine": { + "Category": 1, + "ID": 0, + "Name": 3 + }, + "SkillLineAbility": { + "SkillLineID": 1, + "SpellID": 2 + }, + "Spell": { + "Attributes": 4, + "AttributesEx": 5, + "CastingTimeIndex": 47, + "DispelType": 2, + "EffectBasePoints0": 80, + "EffectBasePoints1": 81, + "EffectBasePoints2": 82, + "ID": 0, + "IconID": 133, + "ManaCost": 39, + "Name": 136, + "PowerType": 14, + "RangeIndex": 49, + "Rank": 153, + "SchoolMask": 225, + "Tooltip": 139 + }, + "SpellIcon": { + "ID": 0, + "Path": 1 + }, + "SpellItemEnchantment": { + "ID": 0, + "Name": 8 + }, + "SpellRange": { + "MaxRange": 4 + }, + "SpellVisual": { "CastKit": 2, + "ID": 0, "ImpactKit": 3, "MissileModel": 8 }, + "SpellVisualEffectName": { + "FilePath": 2, + "ID": 0 + }, "SpellVisualKit": { - "ID": 0, "BaseEffect": 5, + "ID": 0, "SpecialEffect0": 11, "SpecialEffect1": 12, "SpecialEffect2": 13 }, - "SpellVisualEffectName": { + "Talent": { + "Column": 3, "ID": 0, - "FilePath": 2 + "PrereqRank0": 12, + "PrereqTalent0": 9, + "RankSpell0": 4, + "Row": 2, + "TabID": 1 + }, + "TalentTab": { + "BackgroundFile": 23, + "ClassMask": 20, + "ID": 0, + "Name": 1, + "OrderIndex": 22 + }, + "TaxiNodes": { + "ID": 0, + "MapID": 1, + "MountDisplayIdAlliance": 22, + "MountDisplayIdAllianceFallback": 20, + "MountDisplayIdHorde": 23, + "MountDisplayIdHordeFallback": 21, + "Name": 5, + "X": 2, + "Y": 3, + "Z": 4 + }, + "TaxiPath": { + "Cost": 3, + "FromNode": 1, + "ID": 0, + "ToNode": 2 + }, + "TaxiPathNode": { + "ID": 0, + "MapID": 3, + "NodeIndex": 2, + "PathID": 1, + "X": 4, + "Y": 5, + "Z": 6 + }, + "WorldMapArea": { + "AreaID": 2, + "AreaName": 3, + "DisplayMapID": 8, + "ID": 0, + "LocBottom": 7, + "LocLeft": 4, + "LocRight": 5, + "LocTop": 6, + "MapID": 1, + "ParentWorldMapID": 10 } } diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index 355b87e6..0e77183f 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -2244,6 +2244,7 @@ public: const std::string& getSpellRank(uint32_t spellId) const; /// Returns the tooltip/description text from Spell.dbc (empty if unknown or has no text). const std::string& getSpellDescription(uint32_t spellId) const; + const int32_t* getSpellEffectBasePoints(uint32_t spellId) const; std::string getEnchantName(uint32_t enchantId) const; const std::string& getSkillLineName(uint32_t spellId) const; /// Returns the DispelType for a spell (0=none,1=magic,2=curse,3=disease,4=poison,5+=other) @@ -3322,7 +3323,11 @@ private: // Trainer bool trainerWindowOpen_ = false; TrainerListData currentTrainerList_; - struct SpellNameEntry { std::string name; std::string rank; std::string description; uint32_t schoolMask = 0; uint8_t dispelType = 0; uint32_t attrEx = 0; }; + struct SpellNameEntry { + std::string name; std::string rank; std::string description; + uint32_t schoolMask = 0; uint8_t dispelType = 0; uint32_t attrEx = 0; + int32_t effectBasePoints[3] = {0, 0, 0}; + }; std::unordered_map spellNameCache_; bool spellNameCacheLoaded_ = false; diff --git a/src/addons/lua_engine.cpp b/src/addons/lua_engine.cpp index db94d109..5fe5d1e1 100644 --- a/src/addons/lua_engine.cpp +++ b/src/addons/lua_engine.cpp @@ -1627,19 +1627,34 @@ static int lua_GetSpellBookItemName(lua_State* L) { // GetSpellDescription(spellId) → description string // Clean spell description template variables for display -static std::string cleanSpellDescription(const std::string& raw) { +static std::string cleanSpellDescription(const std::string& raw, const int32_t effectBase[3] = nullptr) { if (raw.empty() || raw.find('$') == std::string::npos) return raw; std::string result; result.reserve(raw.size()); for (size_t i = 0; i < raw.size(); ++i) { if (raw[i] == '$' && i + 1 < raw.size()) { char next = raw[i + 1]; - if (next == 's' || next == 'S' || next == 'o' || next == 'O' || + if (next == 's' || next == 'S') { + // $s1, $s2, $s3 — substitute with effect base points + 1 + i += 1; // skip 's' + int idx = 0; + if (i + 1 < raw.size() && raw[i + 1] >= '1' && raw[i + 1] <= '3') { + idx = raw[i + 1] - '1'; + ++i; + } + if (effectBase && effectBase[idx] != 0) { + int32_t val = std::abs(effectBase[idx]) + 1; + result += std::to_string(val); + } else { + result += 'X'; + } + while (i + 1 < raw.size() && raw[i + 1] >= '0' && raw[i + 1] <= '9') ++i; + } else if (next == 'o' || next == 'O' || next == 'e' || next == 'E' || next == 't' || next == 'T' || next == 'h' || next == 'H' || next == 'u' || next == 'U') { - // $s1, $o1, $e1 etc. — skip the variable, insert "X" + // Other variables — insert "X" placeholder result += 'X'; - i += 1; // skip letter + i += 1; while (i + 1 < raw.size() && raw[i + 1] >= '0' && raw[i + 1] <= '9') ++i; } else if (next == 'd' || next == 'D') { // $d = duration — replace with "X sec" @@ -1682,7 +1697,8 @@ static int lua_GetSpellDescription(lua_State* L) { if (!gh) { lua_pushstring(L, ""); return 1; } uint32_t spellId = static_cast(luaL_checknumber(L, 1)); const std::string& desc = gh->getSpellDescription(spellId); - std::string cleaned = cleanSpellDescription(desc); + const int32_t* ebp = gh->getSpellEffectBasePoints(spellId); + std::string cleaned = cleanSpellDescription(desc, ebp); lua_pushstring(L, cleaned.c_str()); return 1; } diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 961f8efd..b9988f70 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -23191,6 +23191,15 @@ void GameHandler::loadSpellNameCache() { if (hasAttrExField) { entry.attrEx = dbc->getUInt32(i, attrExField); } + // Load effect base points for $s1/$s2/$s3 tooltip substitution + if (spellL) { + uint32_t f0 = spellL->field("EffectBasePoints0"); + uint32_t f1 = spellL->field("EffectBasePoints1"); + uint32_t f2 = spellL->field("EffectBasePoints2"); + if (f0 != 0xFFFFFFFF) entry.effectBasePoints[0] = static_cast(dbc->getUInt32(i, f0)); + if (f1 != 0xFFFFFFFF) entry.effectBasePoints[1] = static_cast(dbc->getUInt32(i, f1)); + if (f2 != 0xFFFFFFFF) entry.effectBasePoints[2] = static_cast(dbc->getUInt32(i, f2)); + } spellNameCache_[id] = std::move(entry); } } @@ -23430,6 +23439,12 @@ void GameHandler::loadTalentDbc() { static const std::string EMPTY_STRING; +const int32_t* GameHandler::getSpellEffectBasePoints(uint32_t spellId) const { + const_cast(this)->loadSpellNameCache(); + auto it = spellNameCache_.find(spellId); + return (it != spellNameCache_.end()) ? it->second.effectBasePoints : nullptr; +} + const std::string& GameHandler::getSpellName(uint32_t spellId) const { auto it = spellNameCache_.find(spellId); return (it != spellNameCache_.end()) ? it->second.name : EMPTY_STRING;