From e164023b8a27defdd1474ada69097cc4df30e95e Mon Sep 17 00:00:00 2001 From: Sarjuuk Date: Mon, 17 Jun 2024 17:23:59 +0200 Subject: [PATCH] Setup/DBC * move dbc structures to separate files and allow loading a specific build * handle localized single string fields * add cli option for output table name * add cli option for wowbuild --- setup/setup.php | 19 +- setup/tools/clisetup/dbc.func.php | 118 ++ setup/tools/dbc.class.php | 458 ++---- setup/tools/dbc/12340.ini | 1527 ++++++++++++++++++++ setup/tools/dbc/13623.ini | 89 ++ setup/tools/dbc/15595.ini | 2177 +++++++++++++++++++++++++++++ 6 files changed, 4064 insertions(+), 324 deletions(-) create mode 100644 setup/tools/clisetup/dbc.func.php create mode 100644 setup/tools/dbc/12340.ini create mode 100644 setup/tools/dbc/13623.ini create mode 100644 setup/tools/dbc/15595.ini diff --git a/setup/setup.php b/setup/setup.php index 6712eda7..cd221c53 100644 --- a/setup/setup.php +++ b/setup/setup.php @@ -51,21 +51,14 @@ switch ($cmd) // we accept only on sync($s, $b); finish(); case 'dbc': - foreach (CLISetup::getOpt('dbc') as $n) - { - if (empty($n)) - continue; + require_once 'setup/tools/clisetup/dbc.func.php'; - $dbc = new DBC(trim($n), ['temporary' => false]); - if ($dbc->error) - return false; + $args = []; + foreach ($argv as $i => $str) + if ($i && $str[0] != '-') + $args[] = $str; - if (!$dbc->readFile()) - { - CLI::write('CLISetup::loadDBC() - DBC '.$n.'.dbc could not be written to DB!', CLI::LOG_ERROR); - return false; - } - } + dbc($args); break; } diff --git a/setup/tools/clisetup/dbc.func.php b/setup/tools/clisetup/dbc.func.php new file mode 100644 index 00000000..ee182551 --- /dev/null +++ b/setup/tools/clisetup/dbc.func.php @@ -0,0 +1,118 @@ + false]; + if ($args[0]) + $opts['tableName'] = $args[0]; + + $dbc = new DBC(strtolower($n), $opts, $args[1] ?: DBC::DEFAULT_WOW_BUILD); + if ($dbc->error) + { + CLI::write('[dbc] required DBC '.CLI::bold($n).'.dbc not found!', CLI::LOG_ERROR); + CLI::write(); + return false; + } + + if (!$dbc->readFile()) + { + CLI::write('[dbc] DBC '.CLI::bold($n).'.dbc could not be written to DB!', CLI::LOG_ERROR); + CLI::write(); + return false; + } + + $self = DB::Aowow()->selectCell('SELECT DATABASE()'); + CLI::write('[dbc] DBC '.CLI::bold($n).'.dbc written to '.CLI::bold('`'.($self ?? 'NULL').'`.`'.$dbc->getTableName().'`').'!', CLI::LOG_OK); + CLI::write(); + } + + return true; + + function writeCLIHelp() : bool + { + CLI::write(' usage: php aowow --dbc= [--locales=] [tablename [wowbuild]]', -1, false); + CLI::write(); + CLI::write(' Extract dbc files from mpqDataDir into sql table. If the dbc file contains a locale block, data from all available locales gets merged into the same table.', -1, false); + CLI::write(); + CLI::write(' Known WoW builds:', -1, false); + + foreach (glob('setup/tools/dbc/*.ini') as $f) + { + $a = $b = []; + preg_match('/(\d+)\.ini$/', $f, $a); + if ($h = fopen($f, 'r')) + { + preg_match('/(\d\.\d.\d\.?\d*)/', fgets($h), $b); + fclose($h); + } + + CLI::write(' '.CLI::bold($a[1]).' > '.$b[1], -1, false); + } + + CLI::write(); + CLI::write(' Known DBC files:', -1, false); + + $defs = DBC::getDefinitions(); + $letter = ''; + $buff = []; + + asort($defs); + + foreach ($defs as $d) + { + if (!$letter) + $letter = $d[0]; + else if ($letter != $d[0]) + { + CLI::write(' '.CLI::bold(Util::ucFirst($letter)).':', -1, false); + foreach (explode("\n", Lang::breakTextClean(implode(', ', $buff), 120, Lang::FMT_RAW)) as $line) + CLI::write(' '.$line, -1, false); + + $buff = [$d]; + $letter = $d[0]; + } + else + $buff[] = $d; + } + + CLI::write(' '.CLI::bold(Util::ucFirst($letter)).':', -1, false); + foreach (explode("\n", Lang::breakTextClean(implode(', ', $buff), 120, Lang::FMT_RAW)) as $line) + CLI::write(' '.$line, -1, false); + + CLI::write(); + CLI::write(); + + return true; + } +}; + +?> diff --git a/setup/tools/dbc.class.php b/setup/tools/dbc.class.php index 717c2b77..036efb41 100644 --- a/setup/tools/dbc.class.php +++ b/setup/tools/dbc.class.php @@ -26,238 +26,8 @@ if (!CLI) die('not in cli mode'); -/* - Supported format characters: - x - not used/unknown, 4 bytes - X - not used/unknown, 1 byte - s - char* - f - float, 4 bytes (rounded to 4 digits after comma) - u - unsigned int, 4 bytes - i - signed int, 4 bytes - b - unsigned char, 1 byte - d - sorted by this field, not included in array - n - same, but field included in array -*/ class DBC { - private $_formats = array( // locales block for copy pasta: sxsssxsxsxxxxxxxx | xxxxxxxxxxxxxxxxx - 'achievement' => 'niiisxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxiiiiisxsssxsxsxxxxxxxxii', - 'achievement_category' => 'nixxxxxxxxxxxxxxxxxx', - 'achievement_criteria' => 'niiiiiiiisxsssxsxsxxxxxxxxiixii', - 'areatable' => 'niixixxiiixsxsssxsxsxxxxxxxxixxxxxxx', - 'areatrigger' => 'niffxxxxxf', - 'battlemasterlist' => 'niixxxxxxixxxxxxxxxxxxxxxxxxixii', - 'charbaseinfo' => 'bb', - 'charstartoutfit' => 'nbbbXiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - 'chartitles' => 'nxsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxi', - 'chrclasses' => 'nxixsxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxsxixi', - 'chrraces' => 'niixxxxixxxsxisxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxi', - 'creaturedisplayinfo' => 'niiixxssssxxixxx', - 'creaturedisplayinfoextra' => 'nxxxxxxxxxxxxxxxxxxxs', - 'creaturefamily' => 'nxxxxixiiisxsssxsxsxxxxxxxxs', - 'creaturemodeldata' => 'nxxxxxxxxxxxxixxxxxxxxxxxxxx', - 'creaturesounddata' => 'niiiixiiiiiiiiixxxxixxxxixiiiiixxiiiix', - 'currencytypes' => 'niix', - 'declinedword' => 'ns', - 'declinedwordcases' => 'niis', - 'dungeonmap' => 'niiffffi', - 'durabilitycosts' => 'niiiiiiiiixiiiiiiiiiiixiiiixix', - 'durabilityquality' => 'nf', - 'dungeonencounter' => 'niiiisxsssxsxsxxxxxxxxx', - 'emotes' => 'nsiiiii', - 'emotestext' => 'nsiiiixixixiixxixxx', - 'emotestextdata' => 'nsxsssxsxsxxxxxxxx', - 'emotestextsound' => 'niiii', - 'faction' => 'niiiiiiiiiiiiiixxxiffixsxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxx', - 'factiontemplate' => 'nixiiiiiiiiiii', - 'gemproperties' => 'nixxi', - 'glyphproperties' => 'niii', - 'gtchancetomeleecrit' => 'f', - 'gtchancetomeleecritbase' => 'f', - 'gtchancetospellcrit' => 'f', - 'gtchancetospellcritbase' => 'f', - 'gtcombatratings' => 'f', - 'gtoctclasscombatratingscalar' => 'nf', - 'gtoctregenhp' => 'f', - 'gtregenmpperspt' => 'f', - 'gtregenhpperspt' => 'f', - 'holidays' => 'nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxixxxxxxxxxxiisxix', - 'holidaydescriptions' => 'nsxsssxsxsxxxxxxxx', - 'holidaynames' => 'nsxsssxsxsxxxxxxxx', - 'item' => 'niiiiiii', - 'itemdisplayinfo' => 'nssxxsxxxxxiixxxxxxxxxxxx', - 'itemgroupsounds' => 'niixx', - 'itemextendedcost' => 'niiiiiiiiiiiiiix', - 'itemlimitcategory' => 'nsxsssxsxsxxxxxxxxii', - 'itemrandomproperties' => 'nsiiiiisxsssxsxsxxxxxxxx', - 'itemrandomsuffix' => 'nsxsssxsxsxxxxxxxxsiiiiiiiiii', - 'itemset' => 'nsxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiiiii', - 'itemsubclass' => 'iixxxxxxxixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx', - 'lfgdungeons' => 'nsxsssxsxsxxxxxxxxiiiiiiixiixixixxxxxxxxxxxxxxxxx', - 'lock' => 'niiiiixxxiiiiixxxiiiiixxxxxxxxxxx', - 'locktype' => 'nsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxs', - 'mailtemplate' => 'nsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxx', - 'map' => 'nsixisxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxiffxixi', - 'mapdifficulty' => 'niixxxxxxxxxxxxxxxxxxis', - 'material' => 'nxxii', - 'npcsounds' => 'niiix', - 'overridespelldata' => 'niiiixixxxxx', - 'powerdisplay' => 'nisbbb', - 'questfactionreward' => 'niiiiiiiiii', - 'questsort' => 'nsxsssxsxsxxxxxxxx', - 'questxp' => 'niiiiiiiiii', - 'randproppoints' => 'niiiiiiiiiiiiiii', - 'scalingstatdistribution' => 'niiiiiiiiiiiiiiiiiiiii', - 'scalingstatvalues' => 'xniiiiiiiiiiiiiiiiiiiiii', - 'screeneffect' => 'nsxxxxxxii', - 'skillline' => 'nixsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxixxxxxxxxxxxxxxxxxx', - 'skilllineability' => 'niiiixxixiiixx', - 'skilllinecategory' => 'nsxsssxsxsxxxxxxxxi', - 'skillraceclassinfo' => 'niiiiixx', - 'soundambience' => 'nii', - 'soundemitters' => 'nffxxxxiix', - 'soundentries' => 'nisssssssssssxxxxxxxxxxsxixxxx', - 'spell' => 'niiiuuuuuuuuixixixixxxxxxxxxiiixxxxiiiiiiiiiiiixxiiiiiiiiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiiiiiiiifffiiiiiiiiiiiiiiifffiiiiiiiiiiiiixsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxsxsssxsxsxxxxxxxxiiiiiiiiiixxfffxxxiixiixifffii', - 'spellcasttimes' => 'nixx', - 'spelldescriptionvariables' => 'ns', - 'spelldifficulty' => 'xiiii', - 'spellduration' => 'nixx', - 'spellfocusobject' => 'nsxsssxsxsxxxxxxxx', - 'spellicon' => 'ns', - 'spellitemenchantment' => 'niiiiiiixxxiiisxsssxsxsxxxxxxxxxxxiiii', - 'spellitemenchantmentcondition' => 'nbbbbbxxxxxbbbbbbbbbbiiiiiXXXXX', - 'spellradius' => 'nfxf', - 'spellrange' => 'nffffisxsssxsxsxxxxxxxxxxxxxxxxxxxxxxxxx', - 'spellrunecost' => 'niiii', - 'spellshapeshiftform' => 'nxsxsssxsxsxxxxxxxxiixxiixxiiiiiiii', - 'spellvisual' => 'niiiiiixxxxiixiixxxxxxiiiixxxxxx', - 'spellvisualkit' => 'nxxxxxxxxxxxxxxixxxxxxxxxxxxxxxxxxxxxx', - 'talent' => 'niiiiiiiixxxxixxixxixii', - 'talenttab' => 'nsxsssxsxsxxxxxxxxiiiiis', - 'taxinodes' => 'niffxsxsssxsxsxxxxxxxxxx', - 'taxipath' => 'niix', - 'taxipathnode' => 'niiiffxxxxx', - 'totemcategory' => 'nsxsssxsxsxxxxxxxxiu', - 'vocaluisounds' => 'nxiiixx', - 'weaponimpactsounds' => 'nixiiiiiiiiiiiiiiiiiiii', - 'weaponswingsounds2' => 'nixi', - 'worldmaparea' => 'niisffffxix', // 4.x - niisffffxixxxx - 'worldmapoverlay' => 'niixxxxxsiiiixxxx', // 4.x - niixxxsiiiixxxx - 'worldmaptransforms' => 'niffffiffi', - 'worldstatezonesounds' => 'iiiiiiix', - 'zoneintromusictable' => 'nxixx', - 'zonemusic' => 'nxxxxxii' - ); - - private $_fields = array( - 'achievement' => 'id,faction,map,previous,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,description_loc0,description_loc2,description_loc3,description_loc4,description_loc6,description_loc8,category,points,orderInGroup,flags,iconId,reward_loc0,reward_loc2,reward_loc3,reward_loc4,reward_loc6,reward_loc8,reqCriteriaCount,refAchievement', - 'achievement_category' => 'id,parentCategory', - 'achievement_criteria' => 'id,refAchievementId,type,value1,value2,value3,value4,value5,value6,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,completionFlags,groupFlags,timeLimit,order', - 'areatable' => 'id,mapId,areaTable,flags,soundAmbience,zoneMusic,zoneIntroMusic,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,factionGroupMask', - 'areatrigger' => 'id,mapId,posY,posX,orientation', - 'battlemasterlist' => 'id,mapId,moreMapId,areaType,maxPlayers,minLevel,maxLevel', - 'charbaseinfo' => 'raceId,classId', - 'charstartoutfit' => 'id,raceId,classId,gender,item1,item2,item3,item4,item5,item6,item7,item8,item9,item10,item11,item12,item13,item14,item15,item16,item17,item18,item19,item20', - 'chartitles' => 'id,male_loc0,male_loc2,male_loc3,male_loc4,male_loc6,male_loc8,female_loc0,female_loc2,female_loc3,female_loc4,female_loc6,female_loc8,bitIdx', - 'chrclasses' => 'id,powerType,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,fileString,flags,expansion', - 'chrraces' => 'id,flags,factionId,baseLanguage,fileString,side,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,expansion', - 'creaturedisplayinfo' => 'id,modelId,creatureSoundId,extraInfoId,skin1,skin2,skin3,iconString,npcSoundId', - 'creaturedisplayinfoextra' => 'id,textureString', - 'creaturefamily' => 'id,skillLine1,petFoodMask,petTalentType,categoryEnumID,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,iconString', - 'creaturemodeldata' => 'id,creatureSoundId', - 'creaturesounddata' => 'id,exertion,exertionCritical,injury,injuryCritical,death,stun,stand,footstepTerrainId,aggro,wingFlap,wingGlide,alert,fidget,customAttack,loop,jumpStart,jumpEnd,petAttack,petOrder,petDismiss,birth,spellcast,submerge,submerged', - 'currencytypes' => 'id,itemId,category', - 'declinedword' => 'id,word', - 'declinedwordcases' => 'id,wordId,caseIdx,word', - 'dungeonmap' => 'id,mapId,floor,minY,maxY,minX,maxX,areaId', - 'durabilitycosts' => 'id,w0,w1,w2,w3,w4,w5,w6,w7,w8,w10,w11,w12,w13,w14,w15,w16,w17,w18,w19,w20,a1,a2,a3,a4,a6', - 'durabilityquality' => 'id,mod', - 'dungeonencounter' => 'id,map,mode,order,bit,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'emotes' => 'id,name,animationId,flags,state,stateParam,soundId', - 'emotestext' => 'id,command,emoteId,etd0,etd1,etd2,etd4,etd6,etd8,etd9,etd12', - 'emotestextsound' => 'id,emotesTextId,raceId,gender,soundId', - 'emotestextdata' => 'id,text_loc0,text_loc2,text_loc3,text_loc4,text_loc6,text_loc8', - 'faction' => 'id,repIdx,baseRepRaceMask1,baseRepRaceMask2,baseRepRaceMask3,baseRepRaceMask4,baseRepClassMask1,baseRepClassMask2,baseRepClassMask3,baseRepClassMask4,baseRepValue1,baseRepValue2,baseRepValue3,baseRepValue4,repFlags1,parentFaction,spilloverRateIn,spilloverRateOut,spilloverMaxRank,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'factiontemplate' => 'id,factionId,ourMask,friendlyMask,hostileMask,enemyFactionId1,enemyFactionId2,enemyFactionId3,enemyFactionId4,friendFactionId1,friendFactionId2,friendFactionId3,friendFactionId4', - 'gemproperties' => 'id,enchantmentId,colorMask', - 'glyphproperties' => 'id,spellId,typeFlags,iconId', - 'gtchancetomeleecrit' => 'chance', - 'gtchancetomeleecritbase' => 'chance', - 'gtchancetospellcrit' => 'chance', - 'gtchancetospellcritbase' => 'chance', - 'gtcombatratings' => 'ratio', - 'gtoctclasscombatratingscalar' => 'idx,ratio', - 'gtoctregenhp' => 'ratio', - 'gtregenmpperspt' => 'ratio', - 'gtregenhpperspt' => 'ratio', - 'holidays' => 'id,looping,nameId,descriptionId,textureString,scheduleType', - 'holidaydescriptions' => 'id,description_loc0,description_loc2,description_loc3,description_loc4,description_loc6,description_loc8', - 'holidaynames' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'item' => 'id,classId,subClassId,soundOverride,material,displayInfoId,inventoryType,sheatheType', - 'itemdisplayinfo' => 'id,leftModelName,rightModelName,inventoryIcon1,spellVisualId,groupSoundId', - 'itemgroupsounds' => 'id,pickUpSoundId,dropDownSoundId', - 'itemextendedcost' => 'id,reqHonorPoints,reqArenaPoints,reqArenaSlot,reqItemId1,reqItemId2,reqItemId3,reqItemId4,reqItemId5,itemCount1,itemCount2,itemCount3,itemCount4,itemCount5,reqPersonalRating', - 'itemlimitcategory' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,count,isGem', - 'itemrandomproperties' => 'id,nameINT,enchantId1,enchantId2,enchantId3,enchantId4,enchantId5,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'itemrandomsuffix' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,nameINT,enchantId1,enchantId2,enchantId3,enchantId4,enchantId5,allocationPct1,allocationPct2,allocationPct3,allocationPct4,allocationPct5', - 'itemset' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,spellId1,spellId2,spellId3,spellId4,spellId5,spellId6,spellId7,spellId8,itemCount1,itemCount2,itemCount3,itemCount4,itemCount5,itemCount6,itemCount7,itemCount8,reqSkillId,reqSkillLevel', - 'itemsubclass' => 'class,subClass,weaponSize', - 'lfgdungeons' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,levelMin,levelMax,targetLevel,targetLevelMin,targetLevelMax,mapId,difficulty,type,faction,expansion,groupId', - 'lock' => 'id,type1,type2,type3,type4,type5,properties1,properties2,properties3,properties4,properties5,reqSkill1,reqSkill2,reqSkill3,reqSkill4,reqSkill5', - 'locktype' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,state_loc0,state_loc2,state_loc3,state_loc4,state_loc6,state_loc8,process_loc0,process_loc2,process_loc3,process_loc4,process_loc6,process_loc8,strref', - 'mailtemplate' => 'id,subject_loc0,subject_loc2,subject_loc3,subject_loc4,subject_loc6,subject_loc8,text_loc0,text_loc2,text_loc3,text_loc4,text_loc6,text_loc8', - 'map' => 'id,nameINT,areaType,isBG,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,parentMapId,parentX,parentY,expansion,maxPlayers', - 'mapdifficulty' => 'id,mapId,difficulty,nPlayer,nPlayerString', - 'material' => 'id,sheatheSoundId,unsheatheSoundId', - 'npcsounds' => 'id,greetSoundId,byeSoundId,angrySoundId', - 'overridespelldata' => 'id,spellId1,spellId2,spellId3,spellId4,spellId5', - 'powerdisplay' => 'id,realType,globalString,r,g,b', - 'questfactionreward' => 'id,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10', - 'questsort' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'questxp' => 'id,field1,field2,field3,field4,field5,field6,field7,field8,field9,field10', - 'randproppoints' => 'id,epic1,epic2,epic3,epic4,epic5,rare1,rare2,rare3,rare4,rare5,uncommon1,uncommon2,uncommon3,uncommon4,uncommon5', - 'scalingstatdistribution' => 'id,statMod1,statMod2,statMod3,statMod4,statMod5,statMod6,statMod7,statMod8,statMod9,statMod10,modifier1,modifier2,modifier3,modifier4,modifier5,modifier6,modifier7,modifier8,modifier9,modifier10,maxLevel', - 'scalingstatvalues' => 'id,shoulderMultiplier,trinketMultiplier,weaponMultiplier,rangedMultiplier,clothShoulderArmor,leatherShoulderArmor,mailShoulderArmor,plateShoulderArmor,weaponDPS1H,weaponDPS2H,casterDPS1H,casterDPS2H,rangedDPS,wandDPS,spellPower,primBudged,tertBudged,clothCloakArmor,clothChestArmor,leatherChestArmor,mailChestArmor,plateChestArmor', - 'screeneffect' => 'id,name,soundAmbienceId,zoneMusicId', - 'skillline' => 'id,categoryId,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,description_loc0,description_loc2,description_loc3,description_loc4,description_loc6,description_loc8,iconId', - 'skilllineability' => 'id,skillLineId,spellId,reqRaceMask,reqClassMask,reqSkillLevel,acquireMethod,skillLevelGrey,skillLevelYellow', - 'skilllinecategory' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,index', - 'skillraceclassinfo' => 'id,skillLine,raceMask,classMask,flags,reqLevel', - 'soundambience' => 'id,soundIdDay,soundIdNight', - 'soundemitters' => 'id,posY,posX,soundId,mapId', - 'soundentries' => 'id,type,name,file1,file2,file3,file4,file5,file6,file7,file8,file9,file10,path,flags', - 'spell' => 'id,category,dispelType,mechanic,attributes0,attributes1,attributes2,attributes3,attributes4,attributes5,attributes6,attributes7,stanceMask,stanceMaskNot,targets,spellFocus,castTimeId,recoveryTime,recoveryTimeCategory,procChance,procCharges,maxLevel,baseLevel,spellLevel,durationId,powerType,powerCost,powerCostPerLevel,powerPerSecond,powerPerSecondPerLevel,rangeId,stackAmount,tool1,tool2,reagent1,reagent2,reagent3,reagent4,reagent5,reagent6,reagent7,reagent8,reagentCount1,reagentCount2,reagentCount3,reagentCount4,reagentCount5,reagentCount6,reagentCount7,reagentCount8,equippedItemClass,equippedItemSubClassMask,equippedItemInventoryTypeMask,effect1Id,effect2Id,effect3Id,effect1DieSides,effect2DieSides,effect3DieSides,effect1RealPointsPerLevel,effect2RealPointsPerLevel,effect3RealPointsPerLevel,effect1BasePoints,effect2BasePoints,effect3BasePoints,effect1Mechanic,effect2Mechanic,effect3Mechanic,effect1ImplicitTargetA,effect2ImplicitTargetA,effect3ImplicitTargetA,effect1ImplicitTargetB,effect2ImplicitTargetB,effect3ImplicitTargetB,effect1RadiusId,effect2RadiusId,effect3RadiusId,effect1AuraId,effect2AuraId,effect3AuraId,effect1Periode,effect2Periode,effect3Periode,effect1ValueMultiplier,effect2ValueMultiplier,effect3ValueMultiplier,effect1ChainTarget,effect2ChainTarget,effect3ChainTarget,effect1CreateItemId,effect2CreateItemId,effect3CreateItemId,effect1MiscValue,effect2MiscValue,effect3MiscValue,effect1MiscValueB,effect2MiscValueB,effect3MiscValueB,effect1TriggerSpell,effect2TriggerSpell,effect3TriggerSpell,effect1PointsPerComboPoint,effect2PointsPerComboPoint,effect3PointsPerComboPoint,effect1SpellClassMaskA,effect2SpellClassMaskA,effect3SpellClassMaskA,effect1SpellClassMaskB,effect2SpellClassMaskB,effect3SpellClassMaskB,effect1SpellClassMaskC,effect2SpellClassMaskC,effect3SpellClassMaskC,spellVisualId1,spellVisualId2,iconId,iconIdActive,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,rank_loc0,rank_loc2,rank_loc3,rank_loc4,rank_loc6,rank_loc8,description_loc0,description_loc2,description_loc3,description_loc4,description_loc6,description_loc8,buff_loc0,buff_loc2,buff_loc3,buff_loc4,buff_loc6,buff_loc8,powerCostPercent,startRecoveryCategory,startRecoveryTime,maxTargetLevel,spellFamilyId,spellFamilyFlags1,spellFamilyFlags2,spellFamilyFlags3,maxAffectedTargets,damageClass,effect1DamageMultiplier,effect2DamageMultiplier,effect3DamageMultiplier,toolCategory1,toolCategory2,schoolMask,runeCostId,powerDisplayId,effect1BonusMultiplier,effect2BonusMultiplier,effect3BonusMultiplier,spellDescriptionVariable,spellDifficulty', - 'spellcasttimes' => 'id,baseTime', - 'spelldescriptionvariables' => 'id,vars', - 'spellduration' => 'id,baseTime', - 'spelldifficulty' => 'normal10,normal25,heroic10,heroic25', - 'spellfocusobject' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'spellicon' => 'id,iconPath', - 'spellitemenchantment' => 'id,charges,type1,type2,type3,amount1,amount2,amount3,object1,object2,object3,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,conditionId,skillLine,skillLevel,requiredLevel', - 'spellitemenchantmentcondition' => 'id,color1,color2,color3,color4,color5,comparator1,comparator2,comparator3,comparator4,comparator5,cmpColor1,cmpColor2,cmpColor3,cmpColor4,cmpColor5,value1,value2,value3,value4,value5', - 'spellradius' => 'id,radiusMin,radiusMax', - 'spellrange' => 'id,rangeMinHostile,rangeMinFriend,rangeMaxHostile,rangeMaxFriend,rangeType,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'spellrunecost' => 'id,costBlood,costUnholy,costFrost,runicPowerGain', - 'spellshapeshiftform' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,flags,creatureType,displayIdA,displayIdH,spellId1,spellId2,spellId3,spellId4,spellId5,spellId6,spellId7,spellId8', - 'spellvisual' => 'id,precastKitId,castKitId,impactKitId,stateKitId,statedoneKitId,channelKitId,missileSoundId,animationSoundId,casterImpactKitId,targetImpactKitId,missileTargetingKitId,instantAreaKitId,impactAreaKitId,persistentAreaKitId', - 'spellvisualkit' => 'id,soundId', - 'talent' => 'id,tabId,row,column,rank1,rank2,rank3,rank4,rank5,reqTalent,reqRank,talentSpell,petCategory1,petCategory2', - 'talenttab' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,iconId,raceMask,classMask,creatureFamilyMask,tabNumber,textureFile', - 'taxinodes' => 'id,mapId,posX,posY,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8', - 'taxipath' => 'id,startNodeId,endNodeId', - 'taxipathnode' => 'id,pathId,nodeIdx,mapId,posX,posY', - 'totemcategory' => 'id,name_loc0,name_loc2,name_loc3,name_loc4,name_loc6,name_loc8,category,categoryMask', - 'vocaluisounds' => 'id,raceId,soundIdMale,soundIdFemale', - 'weaponimpactsounds' => 'id,subClass,hit1,hit2,hit3,hit4,hit5,hit6,hit7,hit8,hit9,hit10,crit1,crit2,crit3,crit4,crit5,crit6,crit7,crit8,crit9,crit10', - 'weaponswingsounds2' => 'id,weaponSize,soundId', - 'worldmaparea' => 'id,mapId,areaId,nameINT,left,right,top,bottom,defaultDungeonMapId', - 'worldmapoverlay' => 'id,worldMapAreaId,areaTableId,textureString,w,h,x,y', - 'worldmaptransforms' => 'id,sourceMapId,minX,minY,maxX,maxY,targetMapId,offsetX,offsetY,dungeonMapId', - 'worldstatezonesounds' => 'stateId,value,areaId,wmoAreaId,zoneIntroMusicId,zoneMusicId,soundAmbienceId', - 'zoneintromusictable' => 'id,soundId', - 'zonemusic' => 'id,soundIdDay,soundIdNight' - ); - private $isGameTable = false; private $localized = false; private $tempTable = true; @@ -266,42 +36,66 @@ class DBC private $dataBuffer = []; private $bufferSize = 500; + private static $structs = []; + private $fileRefs = []; + private $curFile = ''; public $error = true; public $fields = []; - public $format = ''; + public $format = []; public $file = ''; + private $macro = array( + 'LOC' => 'sxsssxsxsxxxxxxxx', // pre 4.x locale block (in use) + 'X_LOC' => 'xxxxxxxxxxxxxxxxx' // pre 4.x locale block (unused) + ); - public function __construct($file, $opts = []) + private $unpackFmt = array( // Supported format characters: + 'x' => 'x/x/x/x', // x - not used/unknown, 4 bytes + 'X' => 'x', // X - not used/unknown, 1 byte + 's' => 'V', // s - string block index, 4 bytes + 'S' => 'V', // S - string block index, 4 bytes - localized; autofill + 'f' => 'f', // f - float, 4 bytes (rounded to 4 digits after comma) + 'i' => 'l', // i - signed int, 4 bytes + 'u' => 'V', // u - unsigned int, 4 bytes + 'b' => 'C', // b - unsigned char, 1 byte + 'd' => 'x4', // d - ordered by this field, not included in array + 'n' => 'V' // n - int, 4 bytes, ordered by this field + ); + + public const DEFAULT_WOW_BUILD = '12340'; + private const INI_FILE_PATH = 'setup/tools/dbc/%s.ini'; + + public function __construct($file, $opts = [], string $wowBuild = self::DEFAULT_WOW_BUILD) { + self::loadStructs($wowBuild); + $file = strtolower($file); - if (empty($this->_fields[$file]) || empty($this->_formats[$file])) + if (empty(self::$structs[$file])) { - CLI::write('no structure known for '.$file.'.dbc, aborting.', CLI::LOG_ERROR); - CLI::write(); + CLI::write('no structure known for '.$file.'.dbc, build '.$wowBuild, CLI::LOG_ERROR); return; } - if (!DB::isConnected(DB_AOWOW)) + foreach (self::$structs[$file] as $name => $type) { - CLI::write('not connected to db, aborting.', CLI::LOG_ERROR); - CLI::write(); - return; + // resolove locale macro + if (isset($this->macro[$type])) + { + $this->localized = true; + for ($i = 0; $i < strlen($this->macro[$type]); $i++) + $this->format[$name.'_loc'.$i] = $this->macro[$type][$i]; + } + else + { + $this->format[$name] = $type; + if ($type == 'S') + $this->localized = true; + } } - $this->fields = explode(',', $this->_fields[$file]); - $this->format = $this->_formats[$file]; - $this->file = $file; - $this->localized = !!strstr($this->format, 'sxsssxsxsxxxxxxxx'); - - if (count($this->fields) != strlen(str_ireplace('x', '', $this->format))) - { - CLI::write('known field types ['.count($this->fields).'] and names ['.strlen(str_ireplace('x', '', $this->format)).'] do not match for '.$file.'.dbc, aborting.', CLI::LOG_ERROR); - CLI::write(); - return; - } + $this->file = $file; if (is_bool($opts['temporary'])) $this->tempTable = $opts['temporary']; @@ -313,7 +107,7 @@ class DBC // gameTable-DBCs don't have an index and are accessed through value order // allas, you cannot do this with mysql, so we add a 'virtual' index - $this->isGameTable = $this->format == 'f' && substr($file, 0, 2) == 'gt'; + $this->isGameTable = array_values($this->format) == ['f'] && substr($file, 0, 2) == 'gt'; $foundMask = 0x0; foreach (CLISetup::$expectedPaths as $locStr => $locId) @@ -336,7 +130,6 @@ class DBC if (!$this->fileRefs) { CLI::write('no suitable files found for '.$file.'.dbc, aborting.', CLI::LOG_ERROR); - CLI::write(); return; } @@ -346,21 +139,18 @@ class DBC if (count($x) != 1) { CLI::write('some DBCs have differenct record counts ('.implode(', ', $x).' respectively). cannot merge!', CLI::LOG_ERROR); - CLI::write(); return; } $x = array_unique(array_column($headers, 'fieldCount')); if (count($x) != 1) { CLI::write('some DBCs have differenct field counts ('.implode(', ', $x).' respectively). cannot merge!', CLI::LOG_ERROR); - CLI::write(); return; } $x = array_unique(array_column($headers, 'recordSize')); if (count($x) != 1) { CLI::write('some DBCs have differenct record sizes ('.implode(', ', $x).' respectively). cannot merge!', CLI::LOG_ERROR); - CLI::write(); return; } @@ -375,9 +165,9 @@ class DBC $this->createTable(); if ($this->localized) - CLI::write(' - reading and merging '.$this->file.'.dbc for locales '.implode(', ', array_keys($this->fileRefs))); + CLI::write(' - DBC: reading and merging '.$this->file.'.dbc for locales '.Lang::concat(array_intersect_key(Util::$localeStrings, $this->fileRefs), true, 'CLI::bold')); else - CLI::write(' - reading '.$this->file.'.dbc'); + CLI::write(' - DBC: reading '.$this->file.'.dbc'); if (!$this->read()) { @@ -388,6 +178,32 @@ class DBC return true; } + public function getTableName() : string + { + return $this->tableName; + } + + public static function getDefinitions() : array + { + if (empty(self::$structs)) + self::loadStructs(); + + return array_keys(self::$structs); + } + + private static function loadStructs(string $wowBuild = self::DEFAULT_WOW_BUILD) : void + { + $structFile = sprintf(self::INI_FILE_PATH, $wowBuild); + + if (!file_exists($structFile)) + { + CLI::write('no structure file found for wow build '.$wowBuild, CLI::LOG_ERROR); + return; + } + + self::$structs = parse_ini_file($structFile, true); + } + private function endClean() { foreach ($this->fileRefs as &$ref) @@ -443,9 +259,9 @@ class DBC return false; } - if ($header['fieldCount'] != strlen($this->format)) + if ($header['fieldCount'] != count($this->format)) { - CLI::write('incorrect format string ('.$this->format.') specified for file '.$this->curFile.' fieldCount='.$header['fieldCount'], CLI::LOG_ERROR); + CLI::write('incorrect format ('.implode('', $this->format).') specified for file '.$this->curFile.' fieldCount='.$header['fieldCount'], CLI::LOG_ERROR); fclose($handle); return false; } @@ -460,40 +276,47 @@ class DBC if ($this->error) return; - $n = 0; $pKey = ''; $query = 'CREATE '.($this->tempTable ? 'TEMPORARY' : '').' TABLE `'.$this->tableName.'` ('; if ($this->isGameTable) { - $query .= '`idx` BIGINT(20) NOT NULL, '; + $query .= '`idx` INT SIGNED NOT NULL, '; $pKey = 'idx'; } - foreach (str_split($this->format) as $idx => $f) + foreach ($this->format as $name => $type) { - switch ($f) + switch ($type) { case 'f': - $query .= '`'.$this->fields[$n].'` FLOAT NOT NULL, '; + $query .= '`'.$name.'` FLOAT NOT NULL, '; + break; + case 'S': + for ($l = 0; $l < strlen($this->macro['LOC']); $l++) + if ($this->macro['LOC'][$l] == 's') + $query .= '`'.$name.'_loc'.$l.'` TEXT NULL, '; + break; case 's': - $query .= '`'.$this->fields[$n].'` TEXT NOT NULL, '; + $query .= '`'.$name.'` TEXT NULL, '; + break; + case 'b': + $query .= '`'.$name.'` TINYINT UNSIGNED NOT NULL, '; break; case 'i': case 'n': - case 'b': + $query .= '`'.$name.'` INT SIGNED NOT NULL, '; + break; case 'u': - $query .= '`'.$this->fields[$n].'` BIGINT(20) NOT NULL, '; + $query .= '`'.$name.'` INT UNSIGNED NOT NULL, '; break; default: // 'x', 'X', 'd' continue 2; } - if ($f == 'n') - $pKey = $this->fields[$n]; - - $n++; + if ($type == 'n') + $pKey = $name; } if ($pKey) @@ -512,53 +335,57 @@ class DBC if (!$this->dataBuffer || $this->error) return; - // make inserts more manageable - $fields = $this->fields; + $cols = []; + foreach ($this->format as $n => $type) + { + switch ($type) + { + case 'x': + case 'X': + case 'd': + continue 2; + case 'S': + for ($l = 0; $l < strlen($this->macro['LOC']); $l++) + if ($this->macro['LOC'][$l] == 's') + $cols[] = $n.'_loc'.$l; + break; + default: + $cols[] = $n; + } + } if ($this->isGameTable) - array_unshift($fields, 'idx'); + array_unshift($cols, 'idx'); - DB::Aowow()->query('INSERT INTO ?# (?#) VALUES (?a)', $this->tableName, $fields, $this->dataBuffer); + DB::Aowow()->query('INSERT INTO ?# (?#) VALUES (?a)', $this->tableName, $cols, $this->dataBuffer); $this->dataBuffer = []; } private function read() { - // l - signed long (always 32 bit, machine byte order) - // V - unsigned long (always 32 bit, little endian byte order) - $unpackStr = ''; - $unpackFmt = array( - 'x' => 'x/x/x/x', - 'X' => 'x', - 's' => 'V', - 'f' => 'f', - 'i' => 'l', // not sure if 'l' or 'V' should be used here - 'u' => 'V', - 'b' => 'C', - 'd' => 'x4', - 'n' => 'V' - ); - // Check that record size also matches - $recSize = 0; - for ($i = 0; $i < strlen($this->format); $i++) + $itr = 0; + $recSize = 0; + $unpackStr = ''; + foreach ($this->format as $ch) { - $ch = $this->format[$i]; if ($ch == 'X' || $ch == 'b') $recSize += 1; else $recSize += 4; - if (!isset($unpackFmt[$ch])) + if (!isset($this->unpackFmt[$ch])) { CLI::write('unknown format parameter \''.$ch.'\' in format string', CLI::LOG_ERROR); return false; } - $unpackStr .= '/'.$unpackFmt[$ch]; + $unpackStr .= '/'.$this->unpackFmt[$ch]; if ($ch != 'X' && $ch != 'x') - $unpackStr .= 'f'.$i; + $unpackStr .= 'f'.$itr; // output can't have numeric key as it gets interpreted as repeat factor here + + $itr++; } $unpackStr = substr($unpackStr, 1); @@ -567,7 +394,6 @@ class DBC while (preg_match('/(x\/)+x/', $unpackStr, $r)) $unpackStr = substr_replace($unpackStr, 'x'.((strlen($r[0]) + 1) / 2), strpos($unpackStr, $r[0]), strlen($r[0])); - // we asserted all DBCs to be identical in structure. pick first header for checks $header = reset($this->fileRefs)[2]; @@ -578,13 +404,9 @@ class DBC } // And, finally, extract the records - $strings = []; - $rSize = $header['recordSize']; - $rCount = $header['recordCount']; - $fCount = strlen($this->format); $strBlock = 4 + 16 + $header['recordSize'] * $header['recordCount']; - for ($i = 0; $i < $rCount; $i++) + for ($i = 0; $i < $header['recordCount']; $i++) { $row = []; $idx = $i; @@ -597,19 +419,33 @@ class DBC { $rec = unpack($unpackStr, fread($handle, $header['recordSize'])); - $n = -1; - for ($j = 0; $j < $fCount; $j++) + $offset = 0; + foreach (array_values($this->format) as $j => $type) { if (!isset($rec['f'.$j])) continue; - if (!empty($row[$j])) + $outIdx = $j + $offset; + + if (isset($row[$outIdx]) && $type != 'S') continue; - $n++; - - switch ($this->format[$j]) + switch ($type) { + case 'S': // localized String - autofill + $offset = substr_count($this->macro['LOC'], 's'); + + for ($k = 0; $k < strlen($this->macro['LOC']); $k++) + { + if ($this->macro['LOC'][$k] != 's') + continue; + + if (!isset($row[$j + $k])) // prep locale fields + $row[$j + $k] = null; + } + + // provide outIdx for passthrough + $outIdx = $j + $locId; case 's': $curPos = ftell($handle); fseek($handle, $strBlock + $rec['f'.$j]); @@ -623,15 +459,15 @@ class DBC while ($chr != "\000"); fseek($handle, $curPos); - $row[$j] = $str; + $row[$outIdx] = $str; break; case 'f': - $row[$j] = round($rec['f'.$j], 8); + $row[$outIdx] = round($rec['f'.$j], 8); break; case 'n': // DO NOT BREAK! $idx = $rec['f'.$j]; default: // nothing special .. 'i', 'u' and the likes - $row[$j] = $rec['f'.$j]; + $row[$outIdx] = $rec['f'.$j]; } } diff --git a/setup/tools/dbc/12340.ini b/setup/tools/dbc/12340.ini new file mode 100644 index 00000000..3b39aa12 --- /dev/null +++ b/setup/tools/dbc/12340.ini @@ -0,0 +1,1527 @@ +; DBC structure - 3.3.5.12340 +; +; x - not used/unknown, 4 bytes +; X - not used/unknown, 1 byte +; s - string block index, 4 bytes +; S - string block index, 4 bytes - localized; autofill; not used in 3.3.5 +; f - float, 4 bytes (rounded to 4 digits after comma) +; u - unsigned int, 4 bytes +; i - signed int, 4 bytes +; b - unsigned char, 1 byte +; d - sorted by this field, not included in array +; n - same, but field included in array +; +; LOC - used locale strings macro [sxsssxsxsxxxxxxxx] +; X_LOC - unused locale strings macro [xxxxxxxxxxxxxxxxx] + +[achievement] +id = n +faction = i +map = i +previous = i +name = LOC +description = LOC +category = i +points = i +orderInGroup = i +flags = i +iconId = i +reward = LOC +reqCriteriaCount = i +refAchievement = i + +[achievement_category] +id = n +parentCategory = i +UNUSED2 = X_LOC +UNUSED3 = x + +[achievement_criteria] +id = n +refAchievementId = i +type = i +value1 = i +value2 = i +value3 = i +value4 = i +value5 = i +value6 = i +name = LOC +completionFlags = i +groupFlags = i +UNUSED12 = x +timeLimit = i +order = i + +[areatable] +id = n +mapId = i +areaTable = i +areaBit = x +flags = i +soundProviderPref = x +soundProviderPrefWater = x +soundAmbience = i +zoneMusic = i +zoneIntroMusic = i +explorationLevel = x +name = LOC +factionGroupMask = i +liquidType1 = x +liquidType2 = x +liquidType3 = x +liquidType4 = x +minElevation = x +ambientMultiplier = x +lightId = x + +[areatrigger] +id = n +mapId = i +posY = f +posX = f +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +orientation = f + +[battlemasterlist] +id = n +mapId = i +moreMapId = i +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +areaType = i +UNUSED10 = X_LOC +UNUSED11 = x +maxPlayers = i +UNUSED13 = x +minLevel = i +maxLevel = i + +[charbaseinfo] +raceId = b +classId = b + +[charstartoutfit] +id = n +raceId = b +classId = b +gender = b +UNUSED4 = X +item1 = i +item2 = i +item3 = i +item4 = i +item5 = i +item6 = i +item7 = i +item8 = i +item9 = i +item10 = i +item11 = i +item12 = i +item13 = i +item14 = i +item15 = i +item16 = i +item17 = i +item18 = i +item19 = i +item20 = i +UNUSED25 = X_LOC +UNUSED26 = X_LOC +UNUSED27 = X_LOC +UNUSED28 = x + +[chartitles] +id = n +UNUSED1 = x +male = LOC +female = LOC +bitIdx = i + +[chrclasses] +id = n +UNUSED1 = x +powerType = i +UNUSED3 = x +name = LOC +UNUSED5 = X_LOC +UNUSED6 = X_LOC +fileString = s +UNUSED8 = x +flags = i +UNUSED10 = x +expansion = i + +[chrraces] +id = n +flags = i +factionId = i +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +baseLanguage = i +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +fileString = s +UNUSED12 = x +side = i +name = LOC +UNUSED15 = X_LOC +UNUSED16 = X_LOC +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +expansion = i + +[creaturedisplayinfo] +id = n +modelId = i +creatureSoundId = i +extraInfoId = i +UNUSED4 = x +UNUSED5 = x +skin1 = s +skin2 = s +skin3 = s +iconString = s +UNUSED10 = x +UNUSED11 = x +npcSoundId = i +UNUSED13 = x +UNUSED14 = x +UNUSED15 = x + +[creaturedisplayinfoextra] +id = n +UNUSED1 = X_LOC +UNUSED2 = x +UNUSED3 = x +textureString = s + +[creaturefamily] +id = n +UNUSED1 = x +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +skillLine1 = i +UNUSED6 = x +petFoodMask = i +petTalentType = i +categoryEnumID = i +name = LOC +iconString = s + +[creaturemodeldata] +id = n +UNUSED1 = x +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +UNUSED11 = x +UNUSED12 = x +creatureSoundId = i +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x +UNUSED22 = x +UNUSED23 = x +UNUSED24 = x +UNUSED25 = x +UNUSED26 = x +UNUSED27 = x + +[creaturesounddata] +id = n +exertion = i +exertionCritical = i +injury = i +injuryCritical = i +UNUSED5 = x +death = i +stun = i +stand = i +footstepTerrainId = i +aggro = i +wingFlap = i +wingGlide = i +alert = i +fidget = i +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x +customAttack = i +UNUSED20 = x +UNUSED21 = x +UNUSED22 = x +UNUSED23 = x +loop = i +UNUSED25 = x +jumpStart = i +jumpEnd = i +petAttack = i +petOrder = i +petDismiss = i +UNUSED31 = x +UNUSED32 = x +birth = i +spellcast = i +submerge = i +submerged = i +UNUSED37 = x + +[currencytypes] +id = n +itemId = i +category = i +UNUSED3 = x + +[declinedword] +id = n +word = s + +[declinedwordcases] +id = n +wordId = i +caseIdx = i +word = s + +[dungeonmap] +id = n +mapId = i +floor = i +minY = f +maxY = f +minX = f +maxX = f +worldMapAreaId = i + +[durabilitycosts] +id = n +w0 = i +w1 = i +w2 = i +w3 = i +w4 = i +w5 = i +w6 = i +w7 = i +w8 = i +UNUSED10 = x +w10 = i +w11 = i +w12 = i +w13 = i +w14 = i +w15 = i +w16 = i +w17 = i +w18 = i +w19 = i +w20 = i +UNUSED22 = x +a1 = i +a2 = i +a3 = i +a4 = i +UNUSED27 = x +a6 = i +UNUSED29 = x + +[durabilityquality] +id = n +mod = f + +[dungeonencounter] +id = n +map = i +mode = i +order = i +bit = i +name = LOC +UNUSED6 = x + +[emotes] +id = n +name = s +animationId = i +flags = i +state = i +stateParam = i +soundId = i + +[emotestext] +id = n +command = s +emoteId = i +etd0 = i +etd1 = i +etd2 = i +UNUSED6 = x +etd4 = i +UNUSED8 = x +etd6 = i +UNUSED10 = x +etd8 = i +etd9 = i +UNUSED13 = x +UNUSED14 = x +etd12 = i +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x + +[emotestextsound] +id = n +emotesTextId = i +raceId = i +gender = i +soundId = i + +[emotestextdata] +id = n +text = LOC + +[faction] +id = n +repIdx = i +baseRepRaceMask1 = i +baseRepRaceMask2 = i +baseRepRaceMask3 = i +baseRepRaceMask4 = i +baseRepClassMask1 = i +baseRepClassMask2 = i +baseRepClassMask3 = i +baseRepClassMask4 = i +baseRepValue1 = i +baseRepValue2 = i +baseRepValue3 = i +baseRepValue4 = i +repFlags1 = i +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +parentFaction = i +spilloverRateIn = f +spilloverRateOut = f +spilloverMaxRank = i +UNUSED22 = x +name = LOC +UNUSED24 = X_LOC + +[factiontemplate] +id = n +factionId = i +UNUSED2 = x +ourMask = i +friendlyMask = i +hostileMask = i +enemyFactionId1 = i +enemyFactionId2 = i +enemyFactionId3 = i +enemyFactionId4 = i +friendFactionId1 = i +friendFactionId2 = i +friendFactionId3 = i +friendFactionId4 = i + +[gemproperties] +id = n +enchantmentId = i +UNUSED2 = x +UNUSED3 = x +colorMask = i + +[glyphproperties] +id = n +spellId = i +typeFlags = i +iconId = i + +[gtchancetomeleecrit] +chance = f + +[gtchancetomeleecritbase] +chance = f + +[gtchancetospellcrit] +chance = f + +[gtchancetospellcritbase] +chance = f + +[gtcombatratings] +ratio = f + +[gtoctclasscombatratingscalar] +idx = n +ratio = f + +[gtoctregenhp] +ratio = f + +[gtregenmpperspt] +ratio = f + +[gtregenhpperspt] +ratio = f + +[holidays] +id = n +UNUSED1 = X_LOC +UNUSED2 = X_LOC +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +looping = i +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +UNUSED11 = x +UNUSED12 = x +UNUSED13 = x +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x +nameId = i +descriptionId = i +textureString = s +UNUSED20 = x +scheduleType = i +UNUSED22 = x + +[holidaydescriptions] +id = n +description = LOC + +[holidaynames] +id = n +name = LOC + +[item] +id = n +classId = i +subClassId = i +soundOverride = i +material = i +displayInfoId = i +inventoryType = i +sheatheType = i + +[itemdisplayinfo] +id = n +leftModelName = s +rightModelName = s +UNUSED3 = x +UNUSED4 = x +inventoryIcon1 = s +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +spellVisualId = i +groupSoundId = i +UNUSED13 = x +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x +UNUSED22 = x +UNUSED23 = x +UNUSED24 = x + +[itemgroupsounds] +id = n +pickUpSoundId = i +dropDownSoundId = i +UNUSED3 = x +UNUSED4 = x + +[itemextendedcost] +id = n +reqHonorPoints = i +reqArenaPoints = i +reqArenaSlot = i +reqItemId1 = i +reqItemId2 = i +reqItemId3 = i +reqItemId4 = i +reqItemId5 = i +itemCount1 = i +itemCount2 = i +itemCount3 = i +itemCount4 = i +itemCount5 = i +reqPersonalRating = i +UNUSED15 = x + +[itemlimitcategory] +id = n +name = LOC +count = i +isGem = i + +[itemrandomproperties] +id = n +nameINT = s +enchantId1 = i +enchantId2 = i +enchantId3 = i +enchantId4 = i +enchantId5 = i +name = LOC + +[itemrandomsuffix] +id = n +name = LOC +nameINT = s +enchantId1 = i +enchantId2 = i +enchantId3 = i +enchantId4 = i +enchantId5 = i +alLOCationPct1 = i +alLOCationPct2 = i +alLOCationPct3 = i +alLOCationPct4 = i +alLOCationPct5 = i + +[itemset] +id = n +name = LOC +UNUSED2 = X_LOC +spellId1 = i +spellId2 = i +spellId3 = i +spellId4 = i +spellId5 = i +spellId6 = i +spellId7 = i +spellId8 = i +itemCount1 = i +itemCount2 = i +itemCount3 = i +itemCount4 = i +itemCount5 = i +itemCount6 = i +itemCount7 = i +itemCount8 = i +reqSkillId = i +reqSkillLevel = i + +[itemsubclass] +class = i +subClass = i +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +weaponSize = i +UNUSED10 = X_LOC +UNUSED11 = X_LOC + +[lfgdungeons] +id = n +name = LOC +levelMin = i +levelMax = i +targetLevel = i +targetLevelMin = i +targetLevelMax = i +mapId = i +difficulty = i +UNUSED9 = x +type = i +faction = i +UNUSED12 = x +expansion = i +UNUSED14 = x +groupId = i +UNUSED16 = X_LOC + +[lock] +id = n +type1 = i +type2 = i +type3 = i +type4 = i +type5 = i +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +properties1 = i +properties2 = i +properties3 = i +properties4 = i +properties5 = i +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x +reqSkill1 = i +reqSkill2 = i +reqSkill3 = i +reqSkill4 = i +reqSkill5 = i +UNUSED22 = x +UNUSED23 = x +UNUSED24 = x +UNUSED25 = x +UNUSED26 = x +UNUSED27 = x +UNUSED28 = x +UNUSED29 = x +UNUSED30 = x +UNUSED31 = x +UNUSED32 = x + +[locktype] +id = n +name = LOC +state = LOC +process = LOC +strref = s + +[mailtemplate] +id = n +subject = LOC +text = LOC + +[map] +id = n +nameINT = s +areaType = i +UNUSED3 = x +isBG = i +name = LOC +UNUSED6 = X_LOC +UNUSED7 = X_LOC +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +parentMapId = i +parentX = f +parentY = f +UNUSED14 = x +expansion = i +UNUSED16 = x +maxPlayers = i + +[mapdifficulty] +id = n +mapId = i +difficulty = i +UNUSED3 = X_LOC +UNUSED4 = x +nPlayer = i +nPlayerString = s + +[material] +id = n +UNUSED1 = x +UNUSED2 = x +sheatheSoundId = i +unsheatheSoundId = i + +[npcsounds] +id = n +greetSoundId = i +byeSoundId = i +angrySoundId = i +UNUSED4 = x + +[overridespelldata] +id = n +spellId1 = i +spellId2 = i +spellId3 = i +spellId4 = i +UNUSED5 = x +spellId5 = i +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +UNUSED11 = x + +[powerdisplay] +id = n +realType = i +globalString = s +r = b +g = b +b = b + +[questfactionreward] +id = n +field1 = i +field2 = i +field3 = i +field4 = i +field5 = i +field6 = i +field7 = i +field8 = i +field9 = i +field10 = i + +[questsort] +id = n +name = LOC + +[questxp] +id = n +field1 = i +field2 = i +field3 = i +field4 = i +field5 = i +field6 = i +field7 = i +field8 = i +field9 = i +field10 = i + +[randproppoints] +id = n +epic1 = i +epic2 = i +epic3 = i +epic4 = i +epic5 = i +rare1 = i +rare2 = i +rare3 = i +rare4 = i +rare5 = i +uncommon1 = i +uncommon2 = i +uncommon3 = i +uncommon4 = i +uncommon5 = i + +[scalingstatdistribution] +id = n +statMod1 = i +statMod2 = i +statMod3 = i +statMod4 = i +statMod5 = i +statMod6 = i +statMod7 = i +statMod8 = i +statMod9 = i +statMod10 = i +modifier1 = i +modifier2 = i +modifier3 = i +modifier4 = i +modifier5 = i +modifier6 = i +modifier7 = i +modifier8 = i +modifier9 = i +modifier10 = i +maxLevel = i + +[scalingstatvalues] +UNUSED0 = x +id = n +shoulderMultiplier = i +trinketMultiplier = i +weaponMultiplier = i +rangedMultiplier = i +clothShoulderArmor = i +leatherShoulderArmor = i +mailShoulderArmor = i +plateShoulderArmor = i +weaponDPS1H = i +weaponDPS2H = i +casterDPS1H = i +casterDPS2H = i +rangedDPS = i +wandDPS = i +spellPower = i +primBudged = i +tertBudged = i +clothCloakArmor = i +clothChestArmor = i +leatherChestArmor = i +mailChestArmor = i +plateChestArmor = i + +[screeneffect] +id = n +name = s +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +soundAmbienceId = i +zoneMusicId = i + +[skillline] +id = n +categoryId = i +UNUSED2 = x +name = LOC +description = LOC +iconId = i +UNUSED6 = X_LOC +UNUSED7 = x + +[skilllineability] +id = n +skillLineId = i +spellId = i +reqRaceMask = i +reqClassMask = i +UNUSED5 = x +UNUSED6 = x +reqSkillLevel = i +UNUSED8 = x +acquireMethod = i +skillLevelGrey = i +skillLevelYellow = i +UNUSED12 = x +UNUSED13 = x + +[skilllinecategory] +id = n +name = LOC +index = i + +[skillraceclassinfo] +id = n +skillLine = i +raceMask = i +classMask = i +flags = i +reqLevel = i +UNUSED6 = x +UNUSED7 = x + +[soundambience] +id = n +soundIdDay = i +soundIdNight = i + +[soundemitters] +id = n +posY = f +posX = f +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +soundId = i +mapId = i +UNUSED9 = x + +[soundentries] +id = n +type = i +name = s +file1 = s +file2 = s +file3 = s +file4 = s +file5 = s +file6 = s +file7 = s +file8 = s +file9 = s +file10 = s +UNUSED13 = x +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x +UNUSED22 = x +path = s +UNUSED24 = x +flags = i +UNUSED26 = x +UNUSED27 = x +UNUSED28 = x +UNUSED29 = x + +[spell] +id = n +category = i +dispelType = i +mechanic = i +attributes0 = u +attributes1 = u +attributes2 = u +attributes3 = u +attributes4 = u +attributes5 = u +attributes6 = u +attributes7 = u +stanceMask = i +UNUSED13 = x +stanceMaskNot = i +UNUSED15 = x +targets = i +UNUSED17 = x +spellFocus = i +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x +UNUSED22 = x +UNUSED23 = x +UNUSED24 = x +UNUSED25 = x +UNUSED26 = x +UNUSED27 = x +castTimeId = i +recoveryTime = i +recoveryTimeCategory = i +UNUSED31 = x +UNUSED32 = x +UNUSED33 = x +UNUSED34 = x +procChance = i +procCharges = i +maxLevel = i +baseLevel = i +spellLevel = i +durationId = i +powerType = i +powerCost = i +powerCostPerLevel = i +powerPerSecond = i +powerPerSecondPerLevel = i +rangeId = i +UNUSED47 = x +UNUSED48 = x +stackAmount = i +tool1 = i +tool2 = i +reagent1 = i +reagent2 = i +reagent3 = i +reagent4 = i +reagent5 = i +reagent6 = i +reagent7 = i +reagent8 = i +reagentCount1 = i +reagentCount2 = i +reagentCount3 = i +reagentCount4 = i +reagentCount5 = i +reagentCount6 = i +reagentCount7 = i +reagentCount8 = i +equippedItemClass = i +equippedItemSubClassMask = i +equippedItemInventoryTypeMask = i +effect1Id = i +effect2Id = i +effect3Id = i +effect1DieSides = i +effect2DieSides = i +effect3DieSides = i +effect1RealPointsPerLevel = f +effect2RealPointsPerLevel = f +effect3RealPointsPerLevel = f +effect1BasePoints = i +effect2BasePoints = i +effect3BasePoints = i +effect1Mechanic = i +effect2Mechanic = i +effect3Mechanic = i +effect1ImplicitTargetA = i +effect2ImplicitTargetA = i +effect3ImplicitTargetA = i +effect1ImplicitTargetB = i +effect2ImplicitTargetB = i +effect3ImplicitTargetB = i +effect1RadiusId = i +effect2RadiusId = i +effect3RadiusId = i +effect1AuraId = i +effect2AuraId = i +effect3AuraId = i +effect1Periode = i +effect2Periode = i +effect3Periode = i +effect1ValueMultiplier = f +effect2ValueMultiplier = f +effect3ValueMultiplier = f +effect1ChainTarget = i +effect2ChainTarget = i +effect3ChainTarget = i +effect1CreateItemId = i +effect2CreateItemId = i +effect3CreateItemId = i +effect1MiscValue = i +effect2MiscValue = i +effect3MiscValue = i +effect1MiscValueB = i +effect2MiscValueB = i +effect3MiscValueB = i +effect1TriggerSpell = i +effect2TriggerSpell = i +effect3TriggerSpell = i +effect1PointsPerComboPoint = f +effect2PointsPerComboPoint = f +effect3PointsPerComboPoint = f +effect1SpellClassMaskA = i +effect2SpellClassMaskA = i +effect3SpellClassMaskA = i +effect1SpellClassMaskB = i +effect2SpellClassMaskB = i +effect3SpellClassMaskB = i +effect1SpellClassMaskC = i +effect2SpellClassMaskC = i +effect3SpellClassMaskC = i +spellVisualId1 = i +spellVisualId2 = i +iconId = i +iconIdActive = i +UNUSED135 = x +name = LOC +rank = LOC +description = LOC +buff = LOC +powerCostPercent = i +startRecoveryCategory = i +startRecoveryTime = i +maxTargetLevel = i +spellFamilyId = i +spellFamilyFlags1 = i +spellFamilyFlags2 = i +spellFamilyFlags3 = i +maxAffectedTargets = i +damageClass = i +UNUSED150 = x +UNUSED151 = x +effect1DamageMultiplier = f +effect2DamageMultiplier = f +effect3DamageMultiplier = f +UNUSED155 = x +UNUSED156 = x +UNUSED157 = x +toolCategory1 = i +toolCategory2 = i +UNUSED160 = x +schoolMask = i +runeCostId = i +UNUSED163 = x +powerDisplayId = i +effect1BonusMultiplier = f +effect2BonusMultiplier = f +effect3BonusMultiplier = f +spellDescriptionVariable = i +spellDifficulty = i + +[spellcasttimes] +id = n +baseTime = i +UNUSED2 = x +UNUSED3 = x + +[spelldescriptionvariables] +id = n +vars = s + +[spellduration] +id = n +baseTime = i +UNUSED2 = x +UNUSED3 = x + +[spelldifficulty] +UNUSED0 = x +normal10 = i +normal25 = i +heroic10 = i +heroic25 = i + +[spellfocusobject] +id = n +name = LOC + +[spellicon] +id = n +iconPath = s + +[spellitemenchantment] +id = n +charges = i +type1 = i +type2 = i +type3 = i +amount1 = i +amount2 = i +amount3 = i +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +object1 = i +object2 = i +object3 = i +name = LOC +UNUSED15 = x +UNUSED16 = x +UNUSED17 = x +conditionId = i +skillLine = i +skillLevel = i +requiredLevel = i + +[spellitemenchantmentcondition] +id = n +color1 = b +color2 = b +color3 = b +color4 = b +color5 = b +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +comparator1 = b +comparator2 = b +comparator3 = b +comparator4 = b +comparator5 = b +cmpColor1 = b +cmpColor2 = b +cmpColor3 = b +cmpColor4 = b +cmpColor5 = b +value1 = i +value2 = i +value3 = i +value4 = i +value5 = i +UNUSED26 = X +UNUSED27 = X +UNUSED28 = X +UNUSED29 = X +UNUSED30 = X + +[spellradius] +id = n +radiusMin = f +UNUSED2 = x +radiusMax = f + +[spellrange] +id = n +rangeMinHostile = f +rangeMinFriend = f +rangeMaxHostile = f +rangeMaxFriend = f +rangeType = i +name = LOC +UNUSED7 = X_LOC + +[spellrunecost] +id = n +costBlood = i +costUnholy = i +costFrost = i +runicPowerGain = i + +[spellshapeshiftform] +id = n +UNUSED1 = x +name = LOC +flags = i +creatureType = i +UNUSED5 = x +UNUSED6 = x +displayIdA = i +displayIdH = i +UNUSED9 = x +UNUSED10 = x +spellId1 = i +spellId2 = i +spellId3 = i +spellId4 = i +spellId5 = i +spellId6 = i +spellId7 = i +spellId8 = i + +[spellvisual] +id = n +precastKitId = i +castKitId = i +impactKitId = i +stateKitId = i +statedoneKitId = i +channelKitId = i +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +missileSoundId = i +animationSoundId = i +UNUSED13 = x +casterImpactKitId = i +targetImpactKitId = i +UNUSED16 = x +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x +missileTargetingKitId = i +instantAreaKitId = i +impactAreaKitId = i +persistentAreaKitId = i +UNUSED26 = x +UNUSED27 = x +UNUSED28 = x +UNUSED29 = x +UNUSED30 = x +UNUSED31 = x + +[spellvisualkit] +id = n +UNUSED1 = x +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x +UNUSED11 = x +UNUSED12 = x +UNUSED13 = x +UNUSED14 = x +soundId = i +UNUSED16 = X_LOC +UNUSED17 = x +UNUSED18 = x +UNUSED19 = x +UNUSED20 = x +UNUSED21 = x + +[talent] +id = n +tabId = i +row = i +column = i +rank1 = i +rank2 = i +rank3 = i +rank4 = i +rank5 = i +UNUSED9 = x +UNUSED10 = x +UNUSED11 = x +UNUSED12 = x +reqTalent = i +UNUSED14 = x +UNUSED15 = x +reqRank = i +UNUSED17 = x +UNUSED18 = x +talentSpell = i +UNUSED20 = x +petCategory1 = i +petCategory2 = i + +[talenttab] +id = n +name = LOC +iconId = i +raceMask = i +classMask = i +creatureFamilyMask = i +tabNumber = i +textureFile = s + +[taxinodes] +id = n +mapId = i +posX = f +posY = f +UNUSED4 = x +name = LOC +UNUSED6 = x +UNUSED7 = x + +[taxipath] +id = n +startNodeId = i +endNodeId = i +UNUSED3 = x + +[taxipathnode] +id = n +pathId = i +nodeIdx = i +mapId = i +posX = f +posY = f +UNUSED6 = x +UNUSED7 = x +UNUSED8 = x +UNUSED9 = x +UNUSED10 = x + +[totemcategory] +id = n +name = LOC +category = i +categoryMask = u + +[vocaluisounds] +id = n +UNUSED1 = x +raceId = i +soundIdMale = i +soundIdFemale = i +UNUSED5 = x +UNUSED6 = x + +[weaponimpactsounds] +id = n +subClass = i +UNUSED2 = x +hit1 = i +hit2 = i +hit3 = i +hit4 = i +hit5 = i +hit6 = i +hit7 = i +hit8 = i +hit9 = i +hit10 = i +crit1 = i +crit2 = i +crit3 = i +crit4 = i +crit5 = i +crit6 = i +crit7 = i +crit8 = i +crit9 = i +crit10 = i + +[weaponswingsounds2] +id = n +weaponSize = i +UNUSED2 = x +soundId = i + +[worldmaparea] +id = n +mapId = i +areaId = i +nameINT = s +left = f +right = f +top = f +bottom = f +displayMapId = x +defaultDungeonMapId = i +parentWorldMapId = x + +[worldmapoverlay] +id = n +worldMapAreaId = i +areaTableId = i +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +UNUSED6 = x +UNUSED7 = x +textureString = s +w = i +h = i +x = i +y = i +UNUSED13 = x +UNUSED14 = x +UNUSED15 = x +UNUSED16 = x + +[worldmaptransforms] +id = n +sourceMapId = i +minX = f +minY = f +maxX = f +maxY = f +targetMapId = i +offsetX = f +offsetY = f +dungeonMapId = i + +[worldstatezonesounds] +stateId = i +value = i +areaId = i +wmoAreaId = i +zoneIntroMusicId = i +zoneMusicId = i +soundAmbienceId = i +UNUSED7 = x + +[zoneintromusictable] +id = n +UNUSED1 = x +soundId = i +UNUSED3 = x +UNUSED4 = x + +[zonemusic] +id = n +UNUSED1 = x +UNUSED2 = x +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +soundIdDay = i +soundIdNight = i diff --git a/setup/tools/dbc/13623.ini b/setup/tools/dbc/13623.ini new file mode 100644 index 00000000..da23181f --- /dev/null +++ b/setup/tools/dbc/13623.ini @@ -0,0 +1,89 @@ +; DBC structure - 4.0.6.13623 +; +; x - not used/unknown, 4 bytes +; X - not used/unknown, 1 byte +; s - string block index, 4 bytes +; S - string block index, 4 bytes - localized; autofill +; f - float, 4 bytes (rounded to 4 digits after comma) +; u - unsigned int, 4 bytes +; i - signed int, 4 bytes +; b - unsigned char, 1 byte +; d - sorted by this field, not included in array +; n - same, but field included in array +; +; LOC - used locale strings macro [sxsssxsxsxxxxxxxx] +; X_LOC - unused locale strings macro [xxxxxxxxxxxxxxxxx] + +[areatable] +id = n +mapId = i +areaTable = i +areaBit = x +flags = i +UNK1 = i +soundProviderPref = x +soundProviderPrefWater = x +soundAmbience = i +zoneMusic = i +nameINT = s +zoneIntroMusic = i +explorationLevel = x +name = S +factionGroupMask = i +liquidType1 = x +liquidType2 = x +liquidType3 = x +liquidType4 = x +minElevation = x +ambientMultiplier = x +lightId = x +mountFLags = x +uwIntroSound = x +uwZoneMusic = x +uwAmbience = x +worldPvpId = x +pvpCombatWorldStateId = x + +[dungeonmap] +id = n +mapId = i +floor = i +minY = f ; maxY ? +maxY = f ; maxX ? +minX = f ; minY ? +maxX = f ; minX ? +worldMapAreaId = i + +[worldmaparea] +id = n +mapId = i +areaId = i +nameINT = s +left = f +right = f +top = f +bottom = f +displayMapId = x +defaultDungeonMapId = i +parentWorldMapId = x +flags = i +levelMin = x +levelMax = x + +[worldmapoverlay] +id = n +worldMapAreaId = i +areaTableId = i +UNUSED3 = x +UNUSED4 = x +UNUSED5 = x +textureString = s +w = i +h = i +x = i +y = i +UNUSED11 = x +UNUSED12 = x +UNUSED13 = x +UNUSED14 = x +playerConditionId = x diff --git a/setup/tools/dbc/15595.ini b/setup/tools/dbc/15595.ini new file mode 100644 index 00000000..9a11de6e --- /dev/null +++ b/setup/tools/dbc/15595.ini @@ -0,0 +1,2177 @@ +; DBC structure - 4.3.4.15595 +; +; x - not used/unknown, 4 bytes +; X - not used/unknown, 1 byte +; s - string block index, 4 bytes +; S - string block index, 4 bytes - localized; autofill +; f - float, 4 bytes (rounded to 4 digits after comma) +; u - unsigned int, 4 bytes +; i - signed int, 4 bytes +; b - unsigned char, 1 byte +; d - sorted by this field, not included in array +; n - same, but field included in array +; +; LOC - used locale strings macro [sxsssxsxsxxxxxxxx] +; X_LOC - unused locale strings macro [xxxxxxxxxxxxxxxxx] + +[areatable] +id = n +mapId = i +areaTable = i +areaBit = x +flags = i +soundProviderPref = x +soundProviderPrefWater = x +soundAmbience = i +zoneMusic = i +introSound = x +; nameINT = s +; zoneIntroMusic = i +explorationLevel = x +name = S +factionGroupMask = i +liquidType1 = x +liquidType2 = x +liquidType3 = x +liquidType4 = x +minElevation = x +ambientMultiplier = x +lightId = x +mountFLags = x +uwIntroSound = x +uwZoneMusic = x +uwAmbience = x +worldPvpId = x +pvpCombatWorldStateId = x + +[dungeonmap] +id = n +mapId = i +floor = i +minX = f +maxX = f +minY = f +maxY = f +worldMapAreaId = i + +[worldmaparea] +id = n +mapId = i +areaId = i +nameINT = s +left = f +right = f +top = f +bottom = f +displayMapId = x +defaultDungeonMapId = i +parentWorldMapId = x +flags = i +levelMin = x +levelMax = x + +[worldmapoverlay] +id = n +worldMapAreaId = i +areaTableId = i +areaTableId2 = x +areaTableId3 = x +areaTableId4 = x +textureString = s +w = i +h = i +x = i +y = i +hitRectTop = x +hitRectLeft = x +hitRectBottom = x +hitRectRight = x + +; from TrnityCore - Cataclysm Preservation Project +; Achievementfmt = "niixsxiixixxii"; +; AnimKitfmt = "nxx"; +; AchievementCriteriafmt = "niiiliiiisiiiiiiiiiiiii"; +; AreaTableEntryfmt = "niiiiiiiiiisiiiiiffiiiiiii"; +; AreaGroupEntryfmt = "niiiiiii"; +; AreaPOIEntryfmt = "nxiiiiiiiiixffixixxixx"; +; AreaTriggerEntryfmt = "nifffiiifffff"; +; ArmorLocationfmt = "nfffff"; +; AuctionHouseEntryfmt = "niiix"; +; BankBagSlotPricesEntryfmt = "ni"; +; BannedAddOnsfmt = "nxxxxxxxxxx"; +; BarberShopStyleEntryfmt = "nixxxiii"; +; BattlemasterListEntryfmt = "niiiiiiiiixsiiiixxxx"; +; CharStartOutfitEntryfmt = "dbbbXiiiiiiiiiiiiiiiiiiiiiiiixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxii"; +; CharSectionsEntryfmt = "diiixxxiii"; +; CharTitlesEntryfmt = "nxssix"; +; ChatChannelsEntryfmt = "nixsx"; +; ChrClassesEntryfmt = "nixsxxxixiiiii"; +; ChrRacesEntryfmt = "niixiixixxxxixsxxxxxixxx"; +; ChrClassesXPowerTypesfmt = "nii"; +; CinematicCameraEntryfmt = "nsiffff"; +; CinematicSequencesEntryfmt = "nxiiiiiiii"; +; CreatureDisplayInfofmt = "nixifxxxxxxxxxxxx"; +; CreatureDisplayInfoExtrafmt = "diixxxxxxxxxxxxxxxxxx"; +; CreatureModelDatafmt = "nisxfxxxxxxxxxxffxxxxxxxxxxxxxf"; +; CreatureFamilyfmt = "nfifiiiiixsx"; +; CreatureSpellDatafmt = "niiiixxxx"; +; CreatureTypefmt = "nxx"; +; CurrencyTypesfmt = "nixxxxiiiix"; +; DestructibleModelDatafmt = "ixxixxxixxxixxxixxxxxxxx"; +; DungeonEncounterfmt = "niixisxx"; +; DurabilityCostsfmt = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +; DurabilityQualityfmt = "nf"; +; EmotesEntryfmt = "nxxiiixx"; +; EmotesTextEntryfmt = "nxixxxxxxxxxxxxxxxx"; +; EmotesTextSoundEntryfmt = "niiii"; +; FactionEntryfmt = "niiiiiiiiiiiiiiiiiiffiisxi"; +; FactionTemplateEntryfmt = "niiiiiiiiiiiii"; +; GameObjectArtKitfmt = "nxxxxxxx"; +; GameObjectDisplayInfofmt = "nsxxxxxxxxxxffffffxxx"; +; GemPropertiesEntryfmt = "nixxii"; +; GlyphPropertiesfmt = "niii"; +; GlyphSlotfmt = "nii"; +; GtBarberShopCostBasefmt = "xf"; +; GtCombatRatingsfmt = "xf"; +; GtOCTHpPerStaminafmt = "df"; +; GtChanceToMeleeCritBasefmt = "xf"; +; GtChanceToMeleeCritfmt = "xf"; +; GtChanceToSpellCritBasefmt = "xf"; +; GtChanceToSpellCritfmt = "xf"; +; GtNPCManaCostScalerfmt = "xf"; +; GtOCTClassCombatRatingScalarfmt = "df"; +; GtOCTRegenHPfmt = "f"; +; GtOCTRegenMPfmt = "f"; +; GtRegenMPPerSptfmt = "xf"; +; GtSpellScalingfmt = "df"; +; GtOCTBaseHPByClassfmt = "df"; +; GtOCTBaseMPByClassfmt = "df"; +; GuildPerkSpellsfmt = "dii"; +; Holidaysfmt = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix"; +; ImportPriceArmorfmt = "nffff"; +; ImportPriceQualityfmt = "nf"; +; ImportPriceShieldfmt = "nf"; +; ImportPriceWeaponfmt = "nf"; +; ItemPriceBasefmt = "diff"; +; ItemReforgefmt = "nifif"; +; ItemBagFamilyfmt = "nx"; +; ItemArmorQualityfmt = "nfffffffi"; +; ItemArmorShieldfmt = "nifffffff"; +; ItemArmorTotalfmt = "niffff"; +; ItemClassfmt = "dixxfx"; +; ItemDamagefmt = "nfffffffi"; +; ItemDisenchantLootfmt = "niiiiii"; +; ItemDisplayTemplateEntryfmt = "nxxxxxxxxxxixxxxxxxxxxx"; +; ItemLimitCategoryEntryfmt = "nxii"; +; ItemRandomPropertiesfmt = "nxiiiiis"; +; ItemRandomSuffixfmt = "nsxiiiiiiiiii"; +; ItemSetEntryfmt = "dsiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +; LFGDungeonEntryfmt = "nsiiiiiiiiixxixixiiii"; +; LFGDungeonsGroupingMapfmt = "niii"; +; LightEntryfmt = "nifffxxxxxxxxxx"; +; LiquidTypefmt = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +; LockEntryfmt = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; +; PhaseEntryfmt = "nsi"; +; PhaseGroupfmt = "nii"; +; MailTemplateEntryfmt = "nxs"; +; MapEntryfmt = "nsiiiisissififfiiiii"; +; MapDifficultyEntryfmt = "diisiix"; +; MovieEntryfmt = "nxxx"; +; NamesProfanityEntryfmt = "dsi"; +; NamesReservedEntryfmt = "dsi"; +; MountCapabilityfmt = "niiiiiii"; +; MountTypefmt = "niiiiiiiiiiiiiiiiiiiiiiii"; +; NameGenfmt = "dsii"; +; NumTalentsAtLevelfmt = "df"; +; OverrideSpellDatafmt = "niiiiiiiiiixx"; +; QuestFactionRewardfmt = "niiiiiiiiii"; +; QuestPOIBlobfmt = "niii"; +; QuestPOIPointfmt = "niii"; +; QuestSortEntryfmt = "nx"; +; QuestXPfmt = "niiiiiiiiii"; +; PlayerConditionfmt = "ns"; +; PowerDisplayfmt = "nixxxx"; +; PvPDifficultyfmt = "diiiii"; +; RandomPropertiesPointsfmt = "niiiiiiiiiiiiiii"; +; ResearchBranchEntryfmt = "nsiisi"; +; ResearchFieldEntryfmt = "nsi"; +; ResearchProjectEntryfmt = "nssiiiisi"; +; ResearchSiteEntryfmt = "niiss"; +; ScalingStatDistributionfmt = "niiiiiiiiiiiiiiiiiiiiii"; +; ScalingStatValuesfmt = "iniiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +; SkillLinefmt = "nisxixi"; +; SkillLineAbilityfmt = "niiiixxiiiiiii"; +; SkillRaceClassInfofmt = "diiiiixix"; +; SkillTiersfmt = "nxxxxxxxxxxxxxxxxiiiiiiiiiiiiiiii"; +; SoundEntriesfmt = "nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; +; SpellCastTimefmt = "nixx"; +; SpellCategoriesEntryfmt = "diiiiii"; +; SpellCategoryfmt = "niix"; +; SpellDifficultyfmt = "niiii"; +; SpellDurationfmt = "niii"; +; SpellEffectEntryfmt = "nifiiiffiiiiiifiifiiiiiiiix"; +; SpellEntryfmt = "niiiiiiiiiiiiiiifiiiissxxiixxifiiiiiiixiiiiiiiii"; +; SpellFocusObjectfmt = "nx"; +; SpellItemEnchantmentfmt = "nxiiiiiixxxiiisiiiiiiix"; +; SpellItemEnchantmentConditionfmt = "nbbbXxxxxxxbbbXXbbbxiiixxXXXXXX"; +; SpellRadiusfmt = "nfff"; +; SpellRangefmt = "nffffixx"; +; SpellReagentsEntryfmt = "diiiiiiiiiiiiiiii"; +; SpellScalingEntryfmt = "diiiiffffffffffi"; +; SpellTotemsEntryfmt = "niiii"; +; SpellTargetRestrictionsEntryfmt = "nfiiii"; +; SpellPowerEntryfmt = "diiiixxf"; +; SpellInterruptsEntryfmt = "diiiii"; +; SpellEquippedItemsEntryfmt = "diii"; +; SpellAuraOptionsEntryfmt = "niiii"; +; SpellAuraRestrictionsEntryfmt = "diiiiiiii"; +; SpellCastingRequirementsEntryfmt = "niiiiii"; +; SpellClassOptionsEntryfmt = "dxiiiix"; +; SpellCooldownsEntryfmt = "diii"; +; SpellLevelsEntryfmt = "diii"; +; SpellRuneCostfmt = "niiii"; +; SpellShapeshiftEntryfmt = "niiiix"; +; SpellShapeshiftFormfmt = "nxxiixiiiiiiiiiiiiiix"; +; SpellVisualfmt = "dxxxxxxiixxxxxxxxxxxxxxxxxxxxxxxi"; +; SpellVisualKitfmt = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"; +; StableSlotPricesfmt = "ni"; +; SummonPropertiesfmt = "niiiii"; +; TalentEntryfmt = "niiiiiiiiiiiiiixxxx"; +; TalentTabEntryfmt = "nxxiiixxxii"; +; TalentTreePrimarySpellsfmt = "diix"; +; TaxiNodesEntryfmt = "nifffsiiiff"; +; TaxiPathEntryfmt = "niii"; +; TaxiPathNodeEntryfmt = "diiifffiiii"; +; TotemCategoryEntryfmt = "nxii"; +; UnitPowerBarfmt = "niiixffxxxxxxxxxxxxxxxxxxxx"; +; TransportAnimationfmt = "diifffx"; +; TransportRotationfmt = "diiffff"; +; VehicleEntryfmt = "niffffiiiiiiiifffffffffffffffssssfifiiii"; +; VehicleSeatEntryfmt = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiiffffffffffffiiiiiiii"; +; WMOAreaTableEntryfmt = "niiixxxxxiixxxx"; +; WorldSafeLocsEntryfmt = "nifffx"; + +; struct AchievementEntry +; { +; uint32 ID; // 0 +; int32 Faction; // 1 -1=all, 0=horde, 1=alliance +; int32 MapID; // 2 -1=none +; //uint32 Supercedes; // 3 its Achievement parent (can`t start while parent uncomplete, use its Criteria if don`t have own, use its progress on begin) +; char* Title; // 4 +; //char* Description; // 5 +; uint32 Category; // 6 +; uint32 Points; // 7 reward points +; //uint32 Ui_order; // 8 +; uint32 Flags; // 9 +; //uint32 IconID; // 10 icon (from SpellIcon.dbc) +; //char* Reward; // 11 +; uint32 MinimumCriteria; // 12 - need this count of completed criterias (own or referenced achievement criterias) +; uint32 SharesCriteria; // 13 - referenced achievement (counting of all completed criterias) +; }; + +; struct AchievementCategoryEntry +; { +; uint32 ID; // 0 +; uint32 Parent; // 1 -1 for main category +; //char* Name; // 2 +; //uint32 Ui_order; // 3 +; }; + +; struct AchievementCriteriaEntry +; { +; uint32 ID; // 0 +; uint32 AchievementID; // 1 +; uint32 Type; // 2 +; uint64 Quantity; // 4 +; uint32 StartEvent; // 5 +; int32 StartAsset; // 6 +; uint32 FailEvent; // 7 +; int32 FailAsset; // 8 +; char* Description; // 9 +; uint32 Flags; // 10 +; uint32 TimerStartEvent; // 11 +; uint32 TimerAsset; // 12 +; uint32 TimerTime; // 13 +; uint32 OrderIndex; // 14 +; uint32 RequiredWorldStateID; // 15 +; int32 RequiredWorldStateValue; // 16 +; uint32 AdditionalConditionType[3]; // 17-19 +; uint32 AdditionalConditionValue[3]; // 20-22 +; }; + +; struct AnimKitEntry +; { +; uint32 ID; // 0 +; //uint32 OneShotDuration; // 1 +; //uint32 OneShotStopAnimKitID; // 2 +; }; + +; struct AreaGroupEntry +; { +; uint32 ID; // 0 +; uint32 AreaID[6]; // 1-6 +; uint32 NextAreaID; // 7 index of next group +; }; + +; struct AreaPOIEntry +; { +; uint32 ID; // 0 +; // uint32 Importance // 1 +; uint32 Icon[9]; // 2-10 +; // uint32 FactionID // 11 +; DBCPosition2D Pos; // 12 - 13 +; uint32 ContinentID; // 14 +; // uint32 Flags; // 15 +; uint32 AreaID; // 16 +; //char* Name; // 17 +; //char* Description; // 18 +; uint32 WorldStateID; // 19 +; //uint32 WorldMapLink; // 20 +; //uint32 PortLocID; // 21 +; }; + +; struct AreaTriggerEntry +; { +; uint32 ID; // 0 +; uint32 ContinentID; // 1 +; DBCPosition3D Pos; // 2 - 4 +; uint32 PhaseUseFlags; // 5 +; uint32 PhaseID; // 6 +; uint32 PhaseGroupID; // 7 +; float Radius; // 8 +; float Box_length; // 9 +; float Box_width; // 10 +; float Box_height; // 11 +; float Box_yaw; // 12 +; }; + +; struct ArmorLocationEntry +; { +; uint32 ID; // 0 +; float Value[5]; // 1-5 multiplier for armor types (cloth...plate, no armor?) +; }; + +; struct AuctionHouseEntry +; { +; uint32 ID; // 0 index +; uint32 FactionID; // 1 id of faction.dbc for player factions associated with city +; uint32 DepositRate; // 2 1/3 from real +; uint32 ConsignmentRate; // 3 +; //char* Name; // 4 +; }; + +; struct BankBagSlotPricesEntry +; { +; uint32 ID; // 0 +; uint32 Cost; // 1 +; }; + +; struct BannedAddOnsEntry +; { +; uint32 ID; // 0 +; // uint32 NameMD5[4]; // 1 - 4 +; // uint32 VersionMD5[4]; // 5 - 8 +; // uint32 LastModified; // 9 +; // uint32 Flags; // 10 +; }; + +; struct BarberShopStyleEntry +; { +; uint32 ID; // 0 +; uint32 Type; // 1 value 0 -> hair, value 2 -> facialhair +; //char* DisplayName; // 2 +; //uint32 Description; // 3 +; //float Cost_Modifier; // 4 +; uint32 Race; // 5 +; uint32 Sex; // 6 +; uint32 Data; // 7 +; }; + +; struct BattlemasterListEntry +; { +; uint32 ID; // 0 +; int32 MapID[8]; // 1-8 +; uint32 InstanceType; // 9 map type (3 - BG, 4 - arena) +; //uint32 GroupsAllowed; // 10 (0 or 1) +; char* Name; // 11 +; uint32 MaxGroupSize; // 12 maxGroupSize, used for checking if queue as group +; uint32 HolidayWorldState; // 13 new 3.1 +; uint32 MinLevel; // 14, min level (sync with PvPDifficulty.dbc content) +; uint32 MaxLevel; // 15, max level (sync with PvPDifficulty.dbc content) +; //uint32 RatedPlayers; // 16 4.0.1 +; //uint32 MinPlayers; // 17 - 4.0.6.13596 +; //uint32 MaxPlayers; // 18 4.0.1 +; //uint32 Flags; // 19 4.0.3, value 2 for Rated Battlegrounds +; }; + +; struct CharStartOutfitEntry +; { +; //uint32 ID; // 0 +; uint8 RaceID; // 1 +; uint8 ClassID; // 2 +; uint8 SexID; // 3 +; //uint8 OutfitID; // 4 +; int32 ItemID[24]; // 5-28 +; //int32 DisplayItemID[24]; // 29-52 not required at server side +; //int32 InventoryType[24]; // 53-76 not required at server side +; uint32 PetDisplayID; // 77 Pet Model ID for starting pet +; uint32 PetFamilyID; // 78 Pet Family Entry for starting pet +; }; + +; struct CharSectionsEntry +; { +; //uint32 ID // 0 +; uint32 RaceID; // 1 +; uint32 SexID; // 2 +; uint32 BaseSection; // 3 +; //char* TextureName[3]; // 4 - 7 +; uint32 Flags; // 8 +; uint32 VariationIndex; // 9 +; uint32 ColorIndex; // 10 +; }; + +; struct CharTitlesEntry +; { +; uint32 ID; // 0 title ids, for example in Quest::GetCharTitleId() +; //uint32 Condition_ID; // 1 +; char* Name; // 2 +; char* Name1; // 3 +; uint32 Mask_ID; // 4 used in PLAYER_CHOSEN_TITLE and 1<[21] + ArmorSubClassCost<32>[8] +; }; + +; struct DurabilityQualityEntry +; { +; uint32 ID; // 0 +; float Data; // 1 +; }; + +; struct EmotesEntry +; { +; uint32 ID; // 0 +; //char* EmoteSlashCommand; // 1, internal name +; //uint32 AnimID; // 2, ref to animationData +; uint32 EmoteFlags; // 3, bitmask, may be unit_flags +; uint32 EmoteSpecProc; // 4, Can be 0, 1 or 2 (determine how emote are shown) +; uint32 EmoteSpecProcParam; // 5, uncomfirmed, may be enum UnitStandStateType +; //uint32 EventSoundID; // 6, ref to soundEntries +; //uint32 SpellVisualKitID // 7 +; }; + +; struct EmotesTextEntry +; { +; uint32 ID; // 0 +; // char* Name; // 1 +; uint32 EmoteID; // 2 +; // uint32 EmoteText[16]; // 3 - 18 +; }; + +; struct EmotesTextSoundEntry +; { +; uint32 ID; // 0 +; uint32 EmotesTextID; // 1 +; uint32 RaceID; // 2 +; uint32 SexID; // 3 0 male / 1 female +; uint32 SoundID; // 4 +; }; + +; struct FactionEntry +; { +; uint32 ID; // 0 +; int32 ReputationIndex; // 1 +; uint32 ReputationRaceMask[4]; // 2 - 5 +; uint32 ReputationClassMask[4]; // 6 - 9 +; int32 ReputationBase[4]; // 10 - 13 +; uint32 ReputationFlags[4]; // 14 - 17 +; uint32 ParentFactionID; // 18 +; float ParentFactionMod[2]; // 19 - 20 Faction gains incoming rep * spilloverRateIn and Faction outputs rep * spilloverRateOut as spillover reputation +; uint32 ParentFactionCap[2]; // 21 - 22 The highest rank the faction will profit from incoming spillover and It does not seem to be the max standing at which a faction outputs spillover ...so no idea +; char* Name; // 23 +; // char* Description; // 24 +; uint32 Expansion; // 25 +; }; + +; struct FactionTemplateEntry +; { +; uint32 ID; // 0 +; uint32 Faction; // 1 +; uint32 Flags; // 2 +; uint32 FactionGroup; // 3 +; uint32 FriendGroup; // 4 +; uint32 EnemyGroup; // 5 +; uint32 Enemies[4]; // 6 +; uint32 Friend[4]; // 10 +; }; + +; struct GameObjectArtKitEntry +; { +; uint32 ID; // 0 +; //char* TextureVariation[3] // 1-3 +; //char* AttachModel[4] // 4-8 +; }; + +; struct GameObjectDisplayInfoEntry +; { +; uint32 ID; // 0 +; char* ModelName; // 1 +; // uint32 Sound[10]; // 2 - 11 +; DBCPosition3D GeoBoxMin; // 12 - 14 +; DBCPosition3D GeoBoxMax; // 15 - 17 +; // uint32 ObjectEffectPackageID; // 18 +; // float OverrideLootEffectScale; // 19 +; // float OverrideNameScale; // 20 +; }; + +; struct GemPropertiesEntry +; { +; uint32 ID; // 0 +; uint32 Enchant_ID; // 1 +; // uint32 Maxcount_inv; // 2 +; // uint32 Maxcount_item; // 3 +; uint32 Type; // 4 +; uint32 Min_item_level; // 5 +; }; + +; struct GlyphPropertiesEntry +; { +; uint32 ID; // 0 +; uint32 SpellID; // 1 +; uint32 GlyphSlotFlags; // 2 +; uint32 SpellIconID; // 3 GlyphIconId (SpellIcon.dbc) +; }; + +; struct GlyphSlotEntry +; { +; uint32 ID; // 0 +; uint32 Type; // 1 +; uint32 Tooltip; // 2 +; }; + +; // All Gt* DBC store data for 100 levels, some by 100 per class/race +; #define GT_MAX_LEVEL 100 +; // gtOCTClassCombatRatingScalar.dbc stores data for 32 ratings, look at MAX_COMBAT_RATING for real used amount +; #define GT_MAX_RATING 32 +; +; struct GtBarberShopCostBaseEntry +; { +; //uint32 level; +; float cost; +; }; + +; struct GtCombatRatingsEntry +; { +; //uint32 level; +; float ratio; +; }; + +; struct GtChanceToMeleeCritBaseEntry +; { +; //uint32 level; +; float base; +; }; + +; struct GtChanceToMeleeCritEntry +; { +; //uint32 level; +; float ratio; +; }; + +; struct GtChanceToSpellCritBaseEntry +; { +; float base; +; }; + +; struct GtNPCManaCostScalerEntry +; { +; float ratio; +; }; + +; struct GtChanceToSpellCritEntry +; { +; float ratio; +; }; + +; struct GtOCTClassCombatRatingScalarEntry +; { +; float ratio; +; }; + +; struct GtOCTRegenHPEntry +; { +; float ratio; +; }; + +; struct GtOCTRegenMPEntry +; { +; float ratio; +; }; + +; struct gtOCTHpPerStaminaEntry +; { +; float ratio; +; }; + +; struct GtRegenHPPerSptEntry +; { +; float ratio; +; }; + +; struct GtRegenMPPerSptEntry +; { +; float ratio; +; }; + +; struct GtSpellScalingEntry +; { +; float value; +; }; + +; struct GtOCTBaseHPByClassEntry +; { +; float ratio; +; }; + +; struct GtOCTBaseMPByClassEntry +; { +; float ratio; +; }; + +; struct GuildPerkSpellsEntry +; { +; // uint32 ID; // 0 +; uint32 GuildLevel; // 1 +; uint32 SpellID; // 2 +; }; + +; /* not used +; struct HolidayDescriptionsEntry +; { +; uint32 ID; // 0 +; //char* Description // 1 +; }; +*/ + +; struct HolidayNamesEntry +; { +; uint32 ID; // 0 +; //char* Name // 1 +; }; + +; struct HolidaysEntry +; { +; uint32 ID; // 0 +; uint32 Duration[10]; // 1-10 +; uint32 Date[26]; // 11-36 (dates in unix time starting at January, 1, 2000) +; uint32 Region; // 37 (wow region) +; uint32 Looping; // 38 +; uint32 CalendarFlags[10]; // 39-48 +; //uint32 HolidayNameID; // 49 (HolidayNames.dbc) +; //uint32 HolidayDescriptionID; // 50 (HolidayDescriptions.dbc) +; char* TextureFilename; // 51 +; uint32 Priority; // 52 +; int32 CalendarFilterType; // 53 (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) +; //uint32 Flags; // 54 (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) +; }; + +; // ImportPriceArmor.dbc +; struct ImportPriceArmorEntry +; { +; uint32 ID; // 0 Id/InventoryType +; float ClothModifier; // 1 Price factor cloth +; float LeatherModifier; // 2 Price factor leather +; float ChainModifier; // 3 Price factor mail +; float PlateModifier; // 4 Price factor plate +; }; + +; // ImportPriceQuality.dbc +; struct ImportPriceQualityEntry +; { +; uint32 QualityId; // 1 Quality Id (+1?) +; float Factor; // 2 Price factor +; }; + +; // ImportPriceShield.dbc +; struct ImportPriceShieldEntry +; { +; uint32 ID; // 1 +; float Data; // 2 Price factor +; }; + +; // ImportPriceWeapon.dbc +; struct ImportPriceWeaponEntry +; { +; uint32 ID; // 1 Unk id (mainhand - 0, offhand - 1, weapon - 2, 2hweapon - 3, ranged/rangedright/relic - 4) +; float Data; // 2 Price factor +; }; + +; // ItemPriceBase.dbc +; struct ItemPriceBaseEntry +; { +; // uint32 ID; // 0 +; uint32 ItemLevel; // 1 Item level (1 - 1000) +; float Armor; // 2 Price factor for armor +; float Weapon; // 3 Price factor for weapons +; }; + +; struct ItemReforgeEntry +; { +; uint32 ID; // 0 +; uint32 Source_stat; // 1 +; float Source_multiplier; // 2 +; uint32 Target_stat; // 3 +; float Target_multiplier; // 4 +; }; + +; // common struct for: +; // ItemDamageAmmo.dbc +; // ItemDamageOneHand.dbc +; // ItemDamageOneHandCaster.dbc +; // ItemDamageRanged.dbc +; // ItemDamageThrown.dbc +; // ItemDamageTwoHand.dbc +; // ItemDamageTwoHandCaster.dbc +; // ItemDamageWand.dbc +; struct ItemDamageEntry +; { +; uint32 ID; // 0 item level +; float Quality[7]; // 1-7 multiplier for item quality +; uint32 ItemLevel; // 8 item level +; }; + +; struct ItemArmorQualityEntry +; { +; uint32 ID; // 0 +; float Qualitymod[7]; // 1-7 multiplier for item quality +; uint32 ItemLevel; // 8 item level +; }; + +; struct ItemArmorShieldEntry +; { +; uint32 ID; // 0 +; uint32 ItemLevel; // 1 item level +; float Quality[7]; // 2-8 multiplier for item quality +; }; + +; struct ItemArmorTotalEntry +; { +; uint32 ID; // 0 +; uint32 ItemLevel; // 1 item level +; float Value[4]; // 2-5 multiplier for armor types (cloth...plate) +; }; + +; // ItemClass.dbc +; struct ItemClassEntry +; { +; // uint32 ID; // 0 +; uint32 ClassID; // 1 item class id +; //uint32 SubclassMapID; // 2 +; //uint32 Flags; // 3 1 for weapon, 0 for everything else +; float PriceModifier; // 4 used to calculate certain prices +; //char* ClassName; // 5 class name +; }; + +; struct ItemBagFamilyEntry +; { +; uint32 ID; // 0 +; //char* Name; // 1 +; }; + +; struct ItemDisplayInfoEntry +; { +; uint32 ID; // 0 +; // char* ModelName[2]; // 1 - 2 +; // char* ModelTexture[2]; // 3 - 4 +; // char* InventoryIcon[2]; // 5 - 6 +; // uint32 GeosetGroup[2]; // 7 - 8 +; // uint32 Flags; // 9 +; // uint32 SpellVisualID; // 10 +; // uint32 GroupSoundIndex; // 11 +; // uint32 HelmetGeosetVisID[2]; // 12 - 13 +; // char* Texture[8] // 14 - 21 +; // uint32 ItemVisual; // 22 +; // uint32 ParticleColorID; // 23 +; }; + +; struct ItemDisenchantLootEntry +; { +; uint32 ID; // 0 +; uint32 Class; // 1 +; int32 Subclass; // 2 +; uint32 Quality; // 3 +; uint32 MinLevel; // 4 +; uint32 MaxLevel; // 5 +; uint32 SkillRequired; // 6 +; }; + +; struct ItemLimitCategoryEntry +; { +; uint32 ID; // 0 +; //char* Name; // 1 +; uint32 Quantity; // 2 max allowed equipped as item or in gem slot +; uint32 Flags; // 3 0 = have, 1 = equip (enum ItemLimitCategoryMode) +; }; + +; struct ItemRandomPropertiesEntry +; { +; uint32 ID; // 0 +; //char* Name // 1 +; uint32 Enchantment[5]; // 2 - 6 +; char* Name; // 7 +; }; + +; struct ItemRandomSuffixEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; // char* InternalName // 2 +; uint32 Enchantment[5]; // 3 - 7 +; uint32 AllocationPct[5]; // 8 - 12 +; }; + +; struct ItemSetEntry +; { +; //uint32 ID // 0 +; char* Name; // 1 +; uint32 ItemID[17]; // 2-18 +; uint32 SetSpellID[8]; // 19-26 +; uint32 SetThreshold[8]; // 27-34 +; uint32 RequiredSkill; // 35 +; uint32 RequiredSkillRank; // 36 +; }; + +; struct LFGDungeonEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; uint32 MinLevel; // 2 +; uint32 Maxlevel; // 3 +; uint32 Target_level; // 4 +; uint32 Target_level_min; // 5 +; uint32 Target_level_max; // 6 +; int32 MapID; // 7 +; uint32 DifficultyID; // 8 +; uint32 Flags; // 9 +; uint32 TypeID; // 10 +; //uint32 Faction; // 11 +; //char* TextureFilename; // 12 +; uint32 ExpansionLevel; // 13 +; //uint32 Order_index; // 14 +; uint32 Group_ID; // 15 +; //char* Description; // 16 Description +; uint32 Random_ID; // 17 RandomDungeonID assigned for this dungeon +; uint32 Count_tank; // 18 +; uint32 Count_healer; // 19 +; uint32 Count_damage; // 20 +; }; + +; struct LFGDungeonsGroupingMapEntry +; { +; uint32 ID; // 0 +; uint32 LfgDungeonsID; // 1 +; uint32 Random_lfgDungeonsID; // 2 +; uint32 Group_ID; // 3 +; }; + +; struct LightEntry +; { +; uint32 ID; // 0 +; uint32 ContinentID; // 1 +; float X; // 2 +; float Y; // 3 +; float Z; // 4 +; // float FalloffStart; // 5 +; // float FalloffEnd; // 6 +; // uint32 LightParamsID[8]; // 7 - 14 +; }; + +; struct LiquidTypeEntry +; { +; uint32 ID; // 1 +; //char* Name; // 2 +; //uint32 Flags; // 3 +; uint32 SoundBank; // 4 +; //uint32 SoundID; // 5 +; uint32 SpellID; // 6 +; //float MaxDarkenDepth; // 7 +; //float FogDarkenIntensity; // 8 +; //float AmbDarkenIntensity; // 9 +; //float DirDarkenIntensity; // 10 +; //uint32 LightID; // 11 +; //float ParticleScale; // 12 +; //uint32 ParticleMovement; // 13 +; //uint32 ParticleTexSlots; // 14 +; //uint32 MaterialID; // 15 +; //char* Texture[6]; // 16 - 20 +; //uint32 Color[2]; // 21 - 22 +; //float Float[18]; // 23 - 40 +; //uint32 Int[4]; // 41 - 44 +; }; + +; struct LockEntry +; { +; uint32 ID; // 0 +; uint32 Type[8]; // 1-8 +; uint32 Index[8]; // 9-16 +; uint32 Skill[8]; // 17-24 +; //uint32 Action[8]; // 25-32 +; }; + +; struct PhaseEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; uint32 Flags; // 2 +; }; + +; struct PhaseGroupEntry +; { +; uint32 ID; // 1 +; uint32 PhaseID; // 2 +; uint32 PhaseGroupID; // 3 +; }; + +; struct MailTemplateEntry +; { +; uint32 ID; // 0 +; //char* Subject; // 1 +; char* Body; // 2 +; }; + +; struct MapEntry +; { +; uint32 ID; // 0 +; char const* Directory; // 1 +; uint32 MapType; // 2 +; uint32 Flags; // 3 +; uint32 InstanceType; // 4 +; uint32 PVP; // 5 0 or 1 for battlegrounds (not arenas) +; char const* MapName; // 6 +; uint32 AreaTableID; // 7 +; char const* MapDescription0; // 8 Horde +; char const* MapDescription1; // 9 Alliance +; uint32 LoadingScreenID; // 10 (LoadingScreens.dbc) +; float MinimapIconScale; // 11 +; int32 CorpseMapID; // 12 map_id of entrance map in ghost mode (continent always and in most cases = normal entrance) +; DBCPosition2D Corpse; // 13 - 14 entrance coordinates in ghost mode (in most cases = normal entrance) +; uint32 TimeOfDayOverride; // 15 +; uint32 ExpansionID; // 16 +; uint32 RaidOffset; // 17 +; uint32 MaxPlayers; // 18 +; int32 ParentMapID; // 19 +; }; + +; struct MapDifficultyEntry +; { +; //uint32 ID; // 0 +; uint32 MapID; // 1 +; uint32 Difficulty; // 2 (for arenas: arena slot) +; char* Message; // 3 (text showed when transfer to map failed) +; uint32 RaidDuration; // 4 in secs, 0 if no fixed reset time +; uint32 MaxPlayers; // 5 some heroic versions have 0 when expected same amount as in normal version +; //char* Difficultystring; // 6 +; }; + +; struct MountCapabilityEntry +; { +; uint32 ID; // 1 +; uint32 Flags; // 2 +; uint32 ReqRidingSkill; // 3 +; uint32 ReqAreaID; // 4 +; uint32 ReqSpellAuraID; // 5 +; uint32 ReqSpellKnownID; // 6 +; uint32 ModSpellAuraID; // 7 +; int32 ReqMapID; // 8 +; }; + +; struct MountTypeEntry +; { +; uint32 ID; +; uint32 Capability[24]; +; }; + +; struct MovieEntry +; { +; uint32 ID; // 0 index +; //char* Filename; // 1 +; //uint32 Volume; // 2 +; //uint32 KeyID; // 3 +; }; + +; struct NameGenEntry +; { +; //uint32 ID; // 1 +; char* Name; // 2 +; uint32 RaceID; // 3 +; uint32 Sex; // 4 +; }; + +; struct NumTalentsAtLevelEntry +; { +; //uint32 Level; // 0 index +; float NumberOfTalents; // 1 talent count +; }; + +; struct NamesProfanityEntry +; { +; // uint32 ID; // 0 +; char const* Name; // 1 +; int32 Language; // 2 +; }; + +; struct NamesReservedEntry +; { +; // uint32 ID; // 0 +; char const* Name; // 1 +; int32 Language; // 2 +; }; + +; struct OverrideSpellDataEntry +; { +; uint32 ID; // 0 +; uint32 Spells[10]; // 1-10 +; // uint32 Flags; // 11 +; // char* PlayerActionbar; // 12 +; }; + +; struct PlayerConditionEntry +; { +; uint32 ID; // 0 +; char* FailureDescription; // 1 +; }; + +; struct PowerDisplayEntry +; { +; uint32 ID; // 0 +; uint32 ActualType; // 1 +; // char* GlobalStringBaseTag; // 2 +; // uint8 Red; // 3 +; // uint8 Green; // 4 +; // uint8 Blue; // 5 +; // uint8 Padding // 6 +; }; + +; struct PvPDifficultyEntry +; { +; //uint32 ID; // 0 +; uint32 MapID; // 1 +; uint32 RangeIndex; // 2 +; uint32 MinLevel; // 3 +; uint32 MaxLevel; // 4 +; uint32 Difficulty; // 5 +; }; + +; struct QuestSortEntry +; { +; uint32 ID; // 0 +; //char* SortName; // 1 +; }; + +; struct QuestXPEntry +; { +; uint32 ID; // 0 +; uint32 Difficulty[10]; // 1 - 10 +; }; + +; struct QuestFactionRewEntry +; { +; uint32 ID; // 0 +; int32 Difficulty[10]; // 1 - 11 +; }; + +; struct QuestPOIBlobEntry +; { +; uint32 ID; // 0 +; uint32 NumPoints; // 1 +; uint32 MapID; // 2 +; uint32 WorldMapAreaID; // 3 +; }; + +; struct QuestPOIPointEntry +; { +; uint32 ID; // 0 +; int32 X; // 1 +; int32 Y; // 2 +; uint32 QuestPOIBlobID; // 3 +; }; + +; struct RandomPropertiesPointsEntry +; { +; //uint32 Id; // 0 hidden key +; uint32 itemLevel; // 1 +; uint32 EpicPropertiesPoints[5]; // 2-6 +; uint32 RarePropertiesPoints[5]; // 7-11 +; uint32 UncommonPropertiesPoints[5]; // 12-16 +; }; + +; // ResearchBranch.dbc +; struct ResearchBranchEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; uint32 ResearchFieldID; // 2 +; uint32 CurrencyID; // 3 +; char* Texture; // 4 +; uint32 ItemID; // 5 +; }; + +; // ResearchField.dbc +; struct ResearchFieldEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; uint32 Slot; // 2 +; }; + +; // ResearchProject.dbc +; struct ResearchProjectEntry +; { +; uint32 ID; // 0 +; char* Name; // 1 +; char* Description; // 2 +; uint32 Rarity; // 3 +; uint32 ResearchBranchID; // 4 +; uint32 SpellID; // 5 +; uint32 NumSockets; // 6 +; char* Texture; // 7 +; uint32 RequiredWeight; // 8 +; }; + +; // ResearchSite.dbc +; struct ResearchSiteEntry +; { +; uint32 ID; // 1 +; uint32 MapID; // 2 +; uint32 QuestPOIBlobID; // 3 +; char* Name; // 4 +; char* AreaPOIIconEnum; // 5 +; }; + +; struct ScalingStatDistributionEntry +; { +; uint32 ID; // 0 +; int32 StatID[10]; // 1 - 10 +; uint32 Bonus[10]; // 11 - 20 +; uint32 Minlevel; // 21 +; uint32 Maxlevel; // 22 +; }; + +; struct ScalingStatValuesEntry +; { +; uint32 ID; // 0 +; uint32 Charlevel; // 1 +; uint32 dpsMod[6]; // 2 - 7 DPS mod for level +; uint32 Spellpower; // 8 spell power for level +; uint32 StatMultiplier[5]; // 9 - 13 Multiplier for ScalingStatDistribution +; uint32 Armor[8][4]; // 14 - 46 Armor for level +; uint32 CloakArmor; // 47 armor for cloak +; }; + +; struct SkillLineCategoryEntry +; { +; uint32 id; // 0 +; char* name; // 1 +; uint32 displayOrder; // 2 +; }; + +; struct SkillLineEntry +; { +; uint32 ID; // 0 +; int32 CategoryID; // 1 +; char* DisplayName; // 3 +; //char* Description; // 4 +; uint32 SpellIconID; // 5 +; //char* AlternateVerb; // 6 +; uint32 CanLink; // 7 (prof. with recipe) +; }; + +; struct SkillLineAbilityEntry +; { +; uint32 ID; // 0 +; uint32 SkillLine; // 1 +; uint32 Spell; // 2 +; uint32 RaceMask; // 3 +; uint32 ClassMask; // 4 +; //uint32 ExcludeRace; // 5 +; //uint32 ExcludeClass; // 6 +; uint32 MinSkillLineRank; // 7 +; uint32 SupercededBySpell; // 8 +; uint32 AcquireMethod; // 9 +; uint32 TrivialSkillLineRankHigh; // 10 +; uint32 TrivialSkillLineRankLow; // 11 +; uint32 NumSkillUps; // 12 +; uint32 UniqueBit; // 13 +; }; + +; struct SkillRaceClassInfoEntry +; { +; //uint32 ID; // 0 +; uint32 SkillID; // 1 +; uint32 RaceMask; // 2 +; uint32 ClassMask; // 3 +; uint32 Flags; // 4 +; uint32 Availability; // 5 +; //uint32 MinLevel; // 6 +; uint32 SkillTierID; // 7 +; //uint32 SkillCostIndex; // 8 +; }; + +; struct SkillTiersEntry +; { +; uint32 ID; // 0 +; //uint32 Cost[16]; // 1-16 +; uint32 Value[16]; // 17-32 +; }; + +; struct SoundEntriesEntry +; { +; uint32 ID; // 0 +; //uint32 SoundType; // 1 +; //char* Name; // 2 +; //char* File[10]; // 3 - 12 +; //uint32 Freq[10]; // 13 - 22 +; //char* DirectoryBase; // 23 +; //float VolumeFloat; // 24 +; //uint32 Flags; // 25 +; //float MinDistance; // 26 +; //float DistanceCutoff; // 27 +; //uint32 EAXDef; // 28 +; //uint32 SoundEntriesAdvancedID; // 29 +; //float Volumevariationplus; // 30 +; //float Volumevariationminus; // 31 +; //float Pitchvariationplus; // 32 +; //float Pitchvariationminus; // 33 +; //float PitchAdjust; // 34 +; }; + +; // SpellEffect.dbc +; struct SpellEffectEntry +; { +; uint32 ID; // 0 +; uint32 Effect; // 1 +; float EffectAmplitude; // 2 +; uint32 EffectAura; // 3 +; uint32 EffectAuraPeriod; // 4 +; int32 EffectBasePoints; // 5 +; float EffectBonusCoefficient; // 6 +; float EffectChainAmplitude; // 7 +; uint32 EffectChainTargets; // 8 +; int32 EffectDieSides; // 9 +; uint32 EffectItemType; // 10 +; uint32 EffectMechanic; // 11 +; int32 EffectMiscValue; // 12 +; int32 EffectMiscValueB; // 13 +; float EffectPointsPerResource; // 14 +; uint32 EffectRadiusIndex; // 15 +; uint32 EffectRadiusMaxIndex; // 16 +; float EffectRealPointsPerLevel; // 17 +; flag96 EffectSpellClassMask; // 18 - 20 +; uint32 EffectTriggerSpell; // 21 +; uint32 EffectImplicitTargetA; // 22 +; uint32 EffectImplicitTargetB; // 23 +; uint32 SpellID; // 24 +; uint32 EffectIndex; // 25 +; //uint32 EffectAttributes // 26 +; }; + +; // SpellAuraOptions.dbc +; struct SpellAuraOptionsEntry +; { +; uint32 ID; // 0 +; uint32 CumulativeAura; // 1 +; uint32 ProcChance; // 2 +; uint32 ProcCharges; // 3 +; uint32 ProcTypeMask; // 4 +; }; + +; // SpellAuraRestrictions.dbc/ +; struct SpellAuraRestrictionsEntry +; { +; //uint32 ID; // 0 +; uint32 CasterAuraState; // 1 +; uint32 TargetAuraState; // 2 +; uint32 ExcludeCasterAuraState; // 3 +; uint32 ExcludeTargetAuraState; // 4 +; uint32 CasterAuraSpell; // 5 +; uint32 TargetAuraSpell; // 6 +; uint32 ExcludeCasterAuraSpell; // 7 +; uint32 ExcludeTargetAuraSpell; // 8 +; }; + +; // SpellCastingRequirements.dbc +; struct SpellCastingRequirementsEntry +; { +; uint32 ID; // 0 +; uint32 FacingCasterFlags; // 1 +; uint32 MinFactionID; // 2 +; uint32 MinReputation; // 3 +; int32 RequiredAreasID; // 4 +; uint32 RequiredAuraVision; // 5 +; uint32 RequiresSpellFocus; // 6 +; }; + +; // SpellTotems.dbc +; struct SpellTotemsEntry +; { +; uint32 ID; // 0 +; uint32 RequiredTotemCategoryID[2]; // 1 +; uint32 Totem[2]; // 2 +; }; + +; // Spell.dbc +; struct SpellEntry +; { +; uint32 ID; // 0 +; uint32 Attributes; // 1 +; uint32 AttributesEx; // 2 +; uint32 AttributesEx2; // 3 +; uint32 AttributesEx3; // 4 +; uint32 AttributesEx4; // 5 +; uint32 AttributesEx5; // 6 +; uint32 AttributesEx6; // 7 +; uint32 AttributesEx7; // 8 +; uint32 AttributesEx8; // 9 +; uint32 AttributesEx9; // 1 +; uint32 AttributesEx10; // 1 +; uint32 CastingTimeIndex; // 1 +; uint32 DurationIndex; // 1 +; uint32 PowerType; // 1 +; uint32 RangeIndex; // 1 +; float Speed; // 1 +; uint32 SpellVisualID[2]; // 17 - 18 +; uint32 SpellIconID; // 19 +; uint32 ActiveIconID; // 20 +; char* Name; // 21 +; char* NameSubtext; // 22 +; //char* Description; // 23 +; //char* AuraDescription; // 24 +; uint32 SchoolMask; // 25 +; uint32 RuneCostID; // 26 +; //uint32 SpellMissileID; // 27 +; //uint32 DescriptionVariablesID; // 28 +; uint32 Difficulty; // 29 +; float BonusCoefficient; // 30 +; uint32 ScalingID; // 31 +; uint32 AuraOptionsID; // 32 +; uint32 AuraRestrictionsID; // 33 +; uint32 CastingRequirementsID; // 34 +; uint32 CategoriesID; // 35 +; uint32 ClassOptionsID; // 36 +; uint32 CooldownsID; // 37 +; //uint32 unkIndex7; // 38 +; uint32 EquippedItemsID; // 39 +; uint32 InterruptsID; // 40 +; uint32 LevelsID; // 41 +; uint32 PowerDisplayID; // 42 +; uint32 ReagentsID; // 43 +; uint32 ShapeshiftID; // 44 +; uint32 TargetRestrictionsID; // 45 +; uint32 TotemsID; // 46 +; uint32 RequiredProjectID; // 47 +; }; + +; // SpellCategories.dbc +; struct SpellCategoriesEntry +; { +; //uint32 ID; // 0 +; uint32 Category; // 1 +; uint32 DefenseType; // 2 +; uint32 DispelType; // 3 +; uint32 Mechanic; // 4 +; uint32 PreventionType; // 5 +; uint32 StartRecoveryCategory; // 6 +; }; + +; struct SpellCastTimesEntry +; { +; uint32 ID; // 0 +; int32 Base; // 1 +; //int32 PerLevel; // 2 +; //int32 Minimum; // 3 +; }; + +; struct SpellCategoryEntry +; { +; uint32 ID; // 0 +; uint32 Flags; // 1 +; uint32 UsesPerWeek; // 2 +; // char* Name; // 3 +; }; + +; struct SpellDifficultyEntry +; { +; uint32 ID; // 0 +; int32 DifficultySpellID[4]; // 1 - 4 instance modes: 10N, 25N, 10H, 25H or Normal/Heroic if only 1-2 is set, if 3-4 is 0 then Mode-2 +; }; + +; struct SpellFocusObjectEntry +; { +; uint32 ID; // 0 +; //char* Name; // 1 +; }; + +; struct SpellRadiusEntry +; { +; uint32 ID; // 0 +; float RadiusMin; // 1 +; float RadiusPerLevel; // 2 +; float RadiusMax; // 3 +; }; + +; struct SpellRangeEntry +; { +; uint32 ID; // 1 +; float RangeMin[2]; // 2 - 3 +; float RangeMax[2]; // 4 - 5 +; uint32 Flags; // 6 +; //char* DisplayName; // 7 +; //char* DisplayNameShort; // 8 +; }; + +; // SpellEquippedItems.dbc +; struct SpellEquippedItemsEntry +; { +; //uint32 ID; // 1 +; int32 EquippedItemClass; // 2 +; int32 EquippedItemInvTypes; // 3 +; int32 EquippedItemSubclass; // 4 +; }; + +; // SpellCooldowns.dbc +; struct SpellCooldownsEntry +; { +; //uint32 ID; // 0 +; uint32 CategoryRecoveryTime; // 1 +; uint32 RecoveryTime; // 2 +; uint32 StartRecoveryTime; // 3 +; }; + +; // SpellClassOptions.dbc +; struct SpellClassOptionsEntry +; { +; //uint32 ID; // 0 +; //uint32 ModalNextSpell; // 1 +; flag96 SpellFamilyMask; // 2-4 +; uint32 SpellClassSet; // 5 +; //char* Description; // 6 +; }; + +; // SpellInterrupts.dbc +; struct SpellInterruptsEntry +; { +; //uint32 ID; // 0 +; uint32 AuraInterruptFlags[2]; // 1 - 2 +; uint32 ChannelInterruptFlags[2]; // 3 - 4 +; uint32 InterruptFlags; // 5 +; }; + +; // SpellLevels.dbc +; struct SpellLevelsEntry +; { +; //uint32 ID; // 0 +; uint32 BaseLevel; // 1 +; uint32 MaxLevel; // 2 +; uint32 SpellLevel; // 3 +; }; + +; // SpellPower.dbc +; struct SpellPowerEntry +; { +; //uint32 ID; // 0 +; uint32 ManaCost; // 1 +; uint32 ManaCostPerLevel; // 2 +; uint32 PowerCostPct; // 3 +; uint32 ManaPerSecond; // 4 +; //uint32 PowerDisplayID; // 5 +; //uint32 AltPowerBarID; // 6 +; float PowerCostPct2; // 7 +; }; + +; struct SpellRuneCostEntry +; { +; uint32 ID; // 0 +; uint32 RuneCost[3]; // 1 - 3 (0 = blood, 1 = frost, 2 = unholy) +; uint32 RunicPower; // 4 +; }; + +; struct SpellShapeshiftFormEntry +; { +; uint32 ID; // 0 +; //uint32 BonusActionBar; // 1 unused +; //char* Name; // 2 unused +; uint32 Flags; // 3 +; int32 CreatureType; // 4 <= 0 humanoid, other normal creature types +; //uint32 AttackIconID; // 5 unused, related to next field +; uint32 CombatRoundTime; // 6 +; uint32 CreatureDisplayID[4]; // 7 - 10 +; uint32 PresetSpellID[8]; // 11 - 18 spells which appear in the bar after shapeshifting +; uint32 MountTypeID; // 19 +; //uint32 ExitSoundEntriesID; // 20 +; }; + +; // SpellShapeshift.dbc +; struct SpellShapeshiftEntry +; { +; uint32 ID; // 0 +; uint32 ShapeshiftExclude[2]; // 1 +; uint32 ShapeshiftMask[2]; // 3 +; // uint32 StanceBarOrder; // 5 +; }; + +; // SpellTargetRestrictions.dbc +; struct SpellTargetRestrictionsEntry +; { +; uint32 ID; // 0 +; float ConeAngle; // 1 +; uint32 MaxTargets; // 2 +; uint32 MaxTargetLevel; // 3 +; uint32 TargetCreatureType; // 4 +; uint32 Targets; // 5 +; }; + +; // SpellReagents.dbc +; struct SpellReagentsEntry +; { +; //uint32 ID; // 0 +; int32 Reagents[8]; // 1 - 8 +; uint32 ReagentCount[8]; // 9 - 16 +; }; + +; // SpellScaling.dbc +; struct SpellScalingEntry +; { +; //uint32 ID; // 0 m_ID +; int32 CastTimeMin; // 1 +; int32 CastTimeMax; // 2 +; int32 CastTimeMaxLevel; // 3 +; int32 Class; // 4 (index * 100) + charLevel - 1 => gtSpellScaling.dbc +; float Coefficient[3]; // 5 - 7 +; float Variance[3]; // 8 - 10 +; float ComboPointsCoefficient[3]; // 11 - 13 +; float NerfFactor; // 14 some coefficient, mostly 1.0f +; int32 NerfMaxLevel; // 15 some level +; }; + +; struct SpellDurationEntry +; { +; uint32 ID; // 0 +; int32 Duration; // 1 +; int32 DurationPerLevel; // 2 +; int32 MaxDuration; // 3 +; }; + +; struct SpellItemEnchantmentEntry +; { +; uint32 ID; // 0 +; //uint32 Charges; // 1 +; uint32 Effect[3]; // 2 - 4 +; uint32 EffectPointsMin[3]; // 5 - 7 +; //uint32 EffectPointsMax[3];// 8 - 10 +; uint32 EffectArg[3]; // 11 - 13 +; char* Name; // 14 +; uint32 ItemVisual; // 15 +; uint32 Flags; // 16 +; uint32 Src_itemID; // 17 +; uint32 Condition_ID; // 18 +; uint32 RequiredSkillID; // 19 +; uint32 RequiredSkillRank; // 20 +; uint32 MinLevel; // 21 +; //uint32 ItemLevel; // 22 +; }; + +; struct SpellItemEnchantmentConditionEntry +; { +; uint32 ID; // 0 m_ID +; uint8 Color[3]; // 1-3 m_lt_operandType[5] +; //uint8 unk1; // 4 +; //uint32 unk2[6]; // 5-10 +; uint8 Comparator[3]; // 11-13 m_operator[5] +; //uint8 unk3[2]; // 14-15 +; uint8 CompareColor[3]; // 16-18 m_rt_operandType[5] +; //uint32 unk4; // 19 +; uint32 Value[3]; // 20-22 m_rt_operand[5] +; //uint32 unk5[2]; // 23-24 +; //uint8 unk6[6]; // 25-30 +; }; + +; struct SpellVisualEntry +; { +; //uint32 ID; +; //uint32 PrecastKit; +; //uint32 CastKit; +; //uint32 ImpactKit; +; //uint32 StateKit; +; //uint32 StateDoneKit; +; //uint32 ChannelKit; +; uint32 HasMissile; +; int32 MissileModel; +; //uint32 MissilePathType; +; //uint32 MissileDestinationAttachment; +; //uint32 MissileSound; +; //uint32 AnimEventSoundID; +; //uint32 Flags; +; //uint32 CasterImpactKit; +; //uint32 TargetImpactKit; +; //int32 MissileAttachment; +; //uint32 MissileFollowGroundHeight; +; //uint32 MissileFollowGroundDropSpeed; +; //uint32 MissileFollowGroundApprach; +; //uint32 MissileFollowGroundFlags; +; //uint32 MissileMotionId; +; //uint32 MissileTargetingKit; +; //uint32 InstantAreaKit; +; //uint32 ImpactAreaKit; +; //uint32 PersistentAreaKit; +; //DBCPosition3D MissileCastOffset; +; //DBCPosition3D MissileImpactOffset; +; uint32 AlternativeVisualID; +; }; + +; struct SpellVisualKitEntry +; { +; uint32 ID; +; uint32 StartAnimID; +; uint32 AnimID; +; uint32 AnimKitID; +; uint32 HeadEffect; +; uint32 ChestEffect; +; uint32 BaseEffect; +; uint32 LeftHandEffect; +; uint32 RightHandEffect; +; uint32 BreathEffect; +; uint32 LeftWeaponEffect; +; uint32 RightWeaponEffect; +; uint32 SpecialEffect[3]; +; uint32 WorldEffect; +; uint32 SoundID; +; uint32 ShakeID; +; uint32 CharProc[4]; +; uint32 CharParamZero[4]; +; uint32 CharParamOne[4]; +; uint32 CharParamTwo[4]; +; uint32 CharParamThree[4]; +; uint32 Flags; +; }; + +; struct SummonPropertiesEntry +; { +; uint32 ID; // 0 +; uint32 Control; // 1, 0 - can't be controlled?, 1 - something guardian?, 2 - pet?, 3 - something controllable?, 4 - taxi/mount? +; uint32 Faction; // 2, 14 rows > 0 +; int32 Title; // 3, see enum +; int32 Slot; // 4, 0-6 +; uint32 Flags; // 5 +; }; + +; struct TalentEntry +; { +; uint32 ID; // 0 +; uint32 TabID; // 1 index in TalentTab.dbc (TalentTabEntry) +; uint32 TierID; // 2 +; uint32 ColumnIndex; // 3 +; uint32 SpellRank[MAX_TALENT_RANK]; // 4-8 +; uint32 PrereqTalent[3]; // 9 - 11 (Talent.dbc) +; uint32 PrereqRank[3]; // 12 - 14 part of prev field +; //uint32 Flags; // 15 also need disable higest ranks on reset talent tree +; //uint32 RequiredSpellID; // 16 +; //uint64 CategoryMask[2]; // 17 - 18 its a 64 bit mask for pet 1 << m_categoryEnumID in CreatureFamily.dbc +; }; + +; struct TalentTabEntry +; { +; uint32 ID; // 0 +; //char* Name; // 1 +; //unit32 SpellIconID; // 2 +; uint32 ClassMask; // 3 +; uint32 CategoryEnumID; // 4 +; uint32 OrderIndex; // 5 +; //char* BackgroundFile; // 6 +; //char* Description; // 7 +; //uint32 RoleMask; // 8 +; uint32 MasterySpellID[2]; // 9 - 10 passive mastery bonus spells +; }; + +; struct TalentTreePrimarySpellsEntry +; { +; //uint32 ID; // 0 index +; uint32 TalentTabID; // 1 entry from TalentTab.dbc +; uint32 SpellID; // 2 spell id to learn +; //uint32 Flags; // 3 some kind of flags +; }; + +; struct TaxiNodesEntry +; { +; uint32 ID; // 0 +; uint32 ContinentID; // 1 +; DBCPosition3D Pos; // 2 - 4 +; char* Name; // 5 +; uint32 MountCreatureID[2]; // 6 - 7 +; uint32 Flags; // 8 +; DBCPosition2D MapOffset; // 9 - 10 +; }; + +; struct TaxiPathEntry +; { +; uint32 ID; // 0 +; uint32 FromTaxiNode; // 1 +; uint32 ToTaxiNode; // 2 +; uint32 Cost; // 3 +; }; + +; struct TaxiPathNodeEntry +; { +; //uint32 ID; // 0 +; uint32 PathID; // 1 +; uint32 NodeIndex; // 2 +; uint32 ContinentID; // 3 +; DBCPosition3D Loc; // 4 - 6 +; uint32 Flags; // 7 +; uint32 Delay; // 8 +; uint32 ArrivalEventID; // 9 +; uint32 DepartureEventID; // 10 +; }; + +; struct TotemCategoryEntry +; { +; uint32 ID; // 0 +; //char* Name; // 1 +; uint32 TotemCategoryType; // 2 (one for specialization) +; uint32 TotemCategoryMask; // 3 (compatibility mask for same type: different for totems, compatible from high to low for rods) +; }; + +; struct UnitPowerBarEntry +; { +; uint32 ID; // 1 +; uint32 MinPower; // 2 +; uint32 MaxPower; // 3 +; uint32 StartPower; // 4 +; //uint32 CenterPower; // 5 +; float RegenerationPeace; // 6 +; float RegenerationCombat; // 7 +; //uint32 BarType; // 8 +; //uint32 FileDataID[6]; // 9 - 14 +; //uint32 Color[6]; // 15 - 20 +; //uint32 Flags; // 21 +; //char* Name; // 22 +; //char* Cost; // 23 +; //char* OutOfError; // 24 +; //char* ToolTip; // 25 +; //float StartInset; // 26 +; //float EndInset; // 27 +; }; + +; struct TransportAnimationEntry +; { +; //uint32 ID; // 1 +; uint32 TransportID; // 2 +; uint32 TimeIndex; // 3 +; DBCPosition3D Pos; // 4 - 6 +; //uint32 SequenceID; // 7 +; }; + +; struct TransportRotationEntry +; { +; //uint32 ID; // 1 +; uint32 GameObjectsID; // 2 +; uint32 TimeIndex; // 3 +; float X; // 4 +; float Y; // 5 +; float Z; // 6 +; float W; // 7 +; }; + +; struct VehicleEntry +; { +; uint32 ID; // 0 +; uint32 Flags; // 1 +; float TurnSpeed; // 2 +; float PitchSpeed; // 3 +; float PitchMin; // 4 +; float PitchMax; // 5 +; uint32 SeatID[8]; // 6 - 13 +; float MouseLookOffsetPitch; // 14 +; float CameraFadeDistScalarMin; // 15 +; float CameraFadeDistScalarMax; // 16 +; float CameraPitchOffset; // 17 +; float FacingLimitRight; // 18 +; float FacingLimitLeft; // 19 +; float MsslTrgtTurnLingering; // 20 +; float MsslTrgtPitchLingering; // 21 +; float MsslTrgtMouseLingering; // 22 +; float MsslTrgtEndOpacity; // 23 +; float MsslTrgtArcSpeed; // 24 +; float MsslTrgtArcRepeat; // 25 +; float MsslTrgtArcWidth; // 26 +; float MsslTrgtImpactRadius[2]; // 27 - 28 +; char* MsslTrgtArcTexture; // 29 +; char* MsslTrgtImpactTexture; // 30 +; char* MsslTrgtImpactModel[2]; // 31 - 32 +; float CameraYawOffset; // 33 +; uint32 UiLocomotionType; // 34 +; float MsslTrgtImpactTexRadius; // 35 +; uint32 VehicleUIIndicatorID; // 36 +; uint32 PowerDisplayID[3]; // 37 +; }; + +; struct VehicleSeatEntry +; { +; uint32 ID; // 0 +; uint32 Flags; // 1 +; int32 AttachmentID; // 2 +; DBCPosition3D AttachmentOffset; // 3 - 5 +; float EnterPreDelay; // 6 +; float EnterSpeed; // 7 +; float EnterGravity; // 8 +; float EnterMinDuration; // 9 +; float EnterMaxDuration; // 10 +; float EnterMinArcHeight; // 11 +; float EnterMaxArcHeight; // 12 +; int32 EnterAnimStart; // 13 +; int32 EnterAnimLoop; // 14 +; int32 RideAnimStart; // 15 +; int32 RideAnimLoop; // 16 +; int32 RideUpperAnimStart; // 17 +; int32 RideUpperAnimLoop; // 18 +; float ExitPreDelay; // 19 +; float ExitSpeed; // 20 +; float ExitGravity; // 21 +; float ExitMinDuration; // 22 +; float ExitMaxDuration; // 23 +; float ExitMinArcHeight; // 24 +; float ExitMaxArcHeight; // 25 +; int32 ExitAnimStart; // 26 +; int32 ExitAnimLoop; // 27 +; int32 ExitAnimEnd; // 28 +; float PassengerYaw; // 29 +; float PassengerPitch; // 30 +; float PassengerRoll; // 31 +; int32 PassengerAttachmentID; // 32 +; int32 VehicleEnterAnim; // 33 +; int32 VehicleExitAnim; // 34 +; int32 VehicleRideAnimLoop; // 35 +; int32 VehicleEnterAnimBone; // 36 +; int32 VehicleExitAnimBone; // 37 +; int32 VehicleRideAnimLoopBone; // 38 +; float VehicleEnterAnimDelay; // 39 +; float VehicleExitAnimDelay; // 40 +; uint32 VehicleAbilityDisplay; // 41 +; uint32 EnterUISoundID; // 42 +; uint32 ExitUISoundID; // 43 +; int32 UISkin; // 44 +; uint32 FlagsB; // 45 +; float CameraEnteringDelay; // 46 +; float CameraEnteringDuration; // 47 +; float CameraExitingDelay; // 48 +; float CameraExitingDuration; // 49 +; DBCPosition3D CameraOffset; // 50 - 52 +; float CameraPosChaseRate; // 53 +; float CameraFacingChaseRate; // 54 +; float CameraEnteringZoom; // 55 +; float CameraSeatZoomMin; // 56 +; float CameraSeatZoomMax; // 57 +; uint32 EnterAnimKitID; // 58 +; uint32 RideAnimKitID; // 59 +; uint32 ExitAnimKitID; // 60 +; uint32 VehicleEnterAnimKitID; // 61 +; uint32 VehicleRideAnimKitID; // 62 +; uint32 VehicleExitAnimKitID; // 63 +; uint32 CameraModeID; // 64 +; uint32 FlagsC; // 65 +; }; + +; struct WMOAreaTableEntry +; { +; uint32 ID; // 0 index +; int32 WMOID; // 1 used in root WMO +; int32 NameSetID; // 2 used in adt file +; int32 WMOGroupID; // 3 used in group WMO +; //uint32 SoundProviderPref; // 4 +; //uint32 SoundProviderPrefUnderwater; // 5 +; //uint32 AmbienceID; // 6 +; //uint32 ZoneMusic; // 7 +; //uint32 IntroSound; // 8 +; uint32 Flags; // 9 used for indoor/outdoor determination +; uint32 AreaTableID; // 10 link to AreaTableEntry.ID +; //char* AreaName; // 11 +; //uint32 UwIntroSound; // 12 +; //uint32 UwZoneMusic; // 13 +; //uint32 UwAmbience; // 14 +; }; + +; struct WorldSafeLocsEntry +; { +; uint32 ID; // 0 +; uint32 Continent; // 1 +; DBCPosition3D Loc; // 2 - 4 +; //char* AreaName; // 5 +; }; + +; struct WorldStateSounds +; { +; uint32 ID; // 0 Worldstate +; uint32 unk; // 1 +; uint32 areaTable; // 2 +; uint32 WMOAreaTable; // 3 +; uint32 zoneIntroMusicTable; // 4 +; uint32 zoneIntroMusic; // 5 +; uint32 zoneMusic; // 6 +; uint32 soundAmbience; // 7 +; uint32 soundProviderPreferences; // 8 +; }; + +; struct WorldStateUI +; { +; uint32 ID; // 0 +; uint32 map_id; // 1 Can be -1 to show up everywhere. +; uint32 zone; // 2 Can be zero for "everywhere". +; uint32 phaseMask; // 3 Phase this WorldState is avaliable in +; uint32 icon; // 4 The icon that is used in the interface. +; char* textureFilename; // 5 +; char* text; // 6-21 The worldstate text +; char* description; // 22-38 Text shown when hovering mouse on icon +; uint32 worldstateID; // 39 This is the actual ID used +; uint32 type; // 40 0 = unknown, 1 = unknown, 2 = not shown in ui, 3 = wintergrasp +; uint32 unk1; // 41 +; uint32 unk2; // 43 +; uint32 unk3; // 44-58 +; uint32 unk4; // 59-61 Used for some progress bars. +; uint32 unk7; // 62 Unused in 3.3.5a +; };