From 9046baeb3ac65c94badf59fb2aa6672b6d892bae Mon Sep 17 00:00:00 2001 From: "James D. Callahan III" Date: Fri, 2 Apr 2010 21:12:44 -0400 Subject: [PATCH] Renamed Datamine.lua to Scanner.lua --- AckisRecipeList.toc | 2 +- Datamine.lua | 2505 --------------------------------------------------- Scanner.lua | 2505 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 2506 insertions(+), 2506 deletions(-) delete mode 100644 Datamine.lua create mode 100644 Scanner.lua diff --git a/AckisRecipeList.toc b/AckisRecipeList.toc index b70adc5..a73fcfb 100644 --- a/AckisRecipeList.toc +++ b/AckisRecipeList.toc @@ -67,7 +67,7 @@ ARL.lua Config.lua Waypoint.lua Frame.lua -Datamine.lua +Scanner.lua Player.lua # Database files diff --git a/Datamine.lua b/Datamine.lua deleted file mode 100644 index 16452a4..0000000 --- a/Datamine.lua +++ /dev/null @@ -1,2505 +0,0 @@ ---[[ -************************************************************************ -Datamine.lua -In-game datamining functions for ARL -************************************************************************ -File date: @file-date-iso@ -File revision: @file-revision@ -Project revision: @project-revision@ -Project version: @project-version@ -************************************************************************ -Please see http://www.wowace.com/addons/arl/ for more information. -************************************************************************ -This source code is released under All Rights Reserved. -************************************************************************ -]]-- - -------------------------------------------------------------------------------- --- Upvalues globals. -------------------------------------------------------------------------------- -local _G = getfenv(0) - -local table = _G.table -local tconcat, tinsert, tsort, twipe = table.concat, table.insert, table.sort, table.wipe - -local string = _G.string - -local tonumber, tostring = _G.tonumber, _G.tostring - -local ipairs, pairs = _G.ipairs, _G.pairs - -------------------------------------------------------------------------------- --- Upvalued Blizzard API. -------------------------------------------------------------------------------- -local UnitName = UnitName -local UnitGUID = UnitGUID -local UnitExists = UnitExists -local UnitIsPlayer = UnitIsPlayer -local UnitIsEnemy = UnitIsEnemy -local GetNumTrainerServices = GetNumTrainerServices -local GetTrainerServiceInfo = GetTrainerServiceInfo -local IsTradeskillTrainer = IsTradeskillTrainer -local SetTrainerServiceTypeFilter = SetTrainerServiceTypeFilter -local GetTrainerServiceTypeFilter = GetTrainerServiceTypeFilter -local GetTrainerServiceSkillReq = GetTrainerServiceSkillReq -local GetMerchantNumItems = GetMerchantNumItems -local GetMerchantItemLink = GetMerchantItemLink -local GetMerchantItemInfo = GetMerchantItemInfo -local GetSpellInfo = GetSpellInfo - -------------------------------------------------------------------------------- --- AddOn namespace. -------------------------------------------------------------------------------- -local MODNAME = "Ackis Recipe List" -local addon = LibStub("AceAddon-3.0"):GetAddon(MODNAME) - -local L = LibStub("AceLocale-3.0"):GetLocale(MODNAME) - --- Set up the private intra-file namespace. -local private = select(2, ...) - -------------------------------------------------------------------------------- --- Constants -------------------------------------------------------------------------------- -local F = private.filter_flags -local A = private.acquire_types - -local PROFESSIONS = private.professions - -------------------------------------------------------------------------------- --- Mined via Data-tools --- Table is Public Domain now --- Look up table of Spell IDs to the recipe which trains them. -------------------------------------------------------------------------------- -local SPELL_TO_RECIPE_MAP = { - ------------------------------------------------------------------------------- - -- First Aid - ------------------------------------------------------------------------------- - [7929] = 16112, [7935] = 6454, [10840] = 16113, [23787] = 19442, - [27032] = 21992, [27033] = 21993, [45546] = 39152, - - ------------------------------------------------------------------------------- - -- Alchemy - ------------------------------------------------------------------------------- - [2333] = 3396, [2335] = 2555, [3172] = 3393, [3174] = 3394, - [3175] = 3395, [3188] = 6211, [3230] = 2553, [3449] = 6068, - [3450] = 3830, [3451] = 3831, [3453] = 3832, [3454] = 14634, - [4508] = 4597, [4942] = 4624, [6617] = 5640, [6618] = 5643, - [6624] = 5642, [7255] = 6053, [7256] = 6054, [7257] = 6055, - [7258] = 6056, [7259] = 6057, [8240] = 6663, [11453] = 9293, - [11456] = 10644, [11458] = 9294, [11459] = 9303, [11464] = 9295, - [11466] = 9296, [11468] = 9297, [11472] = 9298, [11473] = 9302, - [11476] = 9301, [11477] = 9300, [11479] = 9304, [11480] = 9305, - [17187] = 12958, [17552] = 13476, [17553] = 13477, [17554] = 13478, - [17555] = 13479, [17556] = 13480, [17557] = 13481, [17559] = 13482, - [17560] = 13483, [17561] = 13484, [17562] = 13485, [17563] = 13486, - [17564] = 13487, [17565] = 13488, [17566] = 13489, [17570] = 13490, - [17571] = 13491, [17572] = 13492, [17573] = 13493, [17574] = 13494, - [17575] = 13495, [17576] = 13496, [17577] = 13497, [17578] = 13499, - [17580] = 13501, [17632] = 13517, [17634] = 13518, [17635] = 31354, - [17636] = 31356, [17637] = 31355, [17638] = 31357, [21923] = 17709, - [22732] = 18257, [24365] = 20011, [24366] = 20012, [24367] = 20013, - [24368] = 20014, [25146] = 20761, [26277] = 21547, [28543] = 22900, - [28546] = 22901, [28549] = 22902, [28550] = 22903, [28552] = 22904, - [28553] = 24001, [28554] = 22906, [28555] = 22907, [28556] = 22908, - [28557] = 22909, [28558] = 22910, [28562] = 22911, [28563] = 22912, - [28564] = 35295, [28565] = 22914, [28566] = 22915, [28567] = 22916, - [28568] = 30443, [28569] = 22918, [28570] = 22919, [28571] = 22920, - [28572] = 22921, [28573] = 22922, [28575] = 22923, [28576] = 22924, - [28577] = 22925, [28578] = 35294, [28579] = 22927, [29688] = 23574, - [32765] = 25869, [32766] = 29232, [38960] = 31680, [38961] = 31682, - [38962] = 31681, [39637] = 32070, [39639] = 32071, [42736] = 33209, - [47046] = 35752, [47048] = 35753, [47049] = 35754, [47050] = 35755, - [53936] = 44564, [53937] = 44566, [53938] = 44568, [53939] = 44565, - [53942] = 44567, - - ------------------------------------------------------------------------------- - -- Blacksmithing - ------------------------------------------------------------------------------- - [2667] = 2881, [2673] = 5578, [3295] = 2883, [3297] = 3608, - [3321] = 3609, [3325] = 3610, [3330] = 2882, [3334] = 3611, - [3336] = 3612, [3492] = 12162, [3493] = 3866, [3494] = 10858, - [3495] = 3867, [3496] = 12163, [3497] = 3868, [3498] = 12164, - [3500] = 3869, [3503] = 6047, [3504] = 3870, [3505] = 3871, - [3507] = 3872, [3511] = 3873, [3513] = 3874, [3515] = 3875, - [6518] = 5543, [7221] = 6044, [7222] = 6045, [7224] = 6046, - [8367] = 6735, [9811] = 7978, [9813] = 7979, [9814] = 7980, - [9818] = 7981, [9820] = 7982, [9933] = 7975, [9937] = 7995, - [9939] = 7976, [9945] = 7983, [9950] = 7984, [9952] = 7985, - [9964] = 7989, [9966] = 7991, [9970] = 7990, [9995] = 7992, - [9997] = 8029, [10005] = 7993, [10009] = 8028, [10013] = 8030, - [11454] = 10713, [11643] = 9367, [12259] = 10424, [15292] = 11610, - [15293] = 11614, [15294] = 11611, [15295] = 11615, [15296] = 11612, - [15973] = 12261, [16642] = 12682, [16643] = 12683, [16644] = 12684, - [16645] = 12685, [16646] = 12687, [16647] = 12688, [16648] = 12689, - [16649] = 12690, [16650] = 12691, [16651] = 12692, [16652] = 12693, - [16653] = 12694, [16654] = 12695, [16655] = 12699, [16656] = 12697, - [16657] = 12700, [16658] = 12701, [16659] = 12702, [16660] = 12698, - [16661] = 12703, [16662] = 12704, [16663] = 12705, [16664] = 12706, - [16665] = 12707, [16667] = 12696, [16724] = 12711, [16725] = 12713, - [16726] = 12714, [16728] = 12716, [16729] = 12717, [16730] = 12715, - [16731] = 12718, [16732] = 12719, [16741] = 12720, [16742] = 12725, - [16744] = 12726, [16745] = 12727, [16746] = 12728, [16969] = 12819, - [16970] = 12821, [16971] = 12823, [16973] = 12824, [16978] = 12825, - [16983] = 12827, [16984] = 12828, [16985] = 12830, [16988] = 12833, - [16990] = 12834, [16991] = 12835, [16992] = 12836, [16993] = 12837, - [16994] = 12838, [16995] = 12839, [20872] = 17049, [20873] = 17053, - [20874] = 17051, [20876] = 17052, [20890] = 17059, [20897] = 17060, - [21161] = 18592, [21913] = 17706, [22757] = 18264, [23628] = 19202, - [23629] = 19204, [23632] = 19203, [23633] = 19205, [23636] = 19206, - [23637] = 19207, [23638] = 19208, [23639] = 19209, [23650] = 19210, - [23652] = 19211, [23653] = 19212, [24136] = 19776, [24137] = 19777, - [24138] = 19778, [24139] = 19779, [24140] = 19780, [24141] = 19781, - [24399] = 20040, [24912] = 20553, [24913] = 20555, [24914] = 20554, - [27585] = 22209, [27586] = 22219, [27587] = 22222, [27588] = 22214, - [27589] = 22220, [27590] = 22221, [27829] = 22388, [27830] = 22390, - [27832] = 22389, [28461] = 22766, [28462] = 22767, [28463] = 22768, - [29566] = 23590, [29568] = 23591, [29569] = 23592, [29571] = 23593, - [29603] = 23594, [29605] = 23595, [29606] = 23596, [29608] = 23597, - [29610] = 23599, [29611] = 23598, [29613] = 23600, [29614] = 23601, - [29615] = 23602, [29616] = 23603, [29617] = 23604, [29619] = 23605, - [29620] = 23606, [29621] = 23607, [29622] = 23621, [29628] = 23608, - [29629] = 23609, [29630] = 23610, [29642] = 23611, [29643] = 23612, - [29645] = 23613, [29648] = 23615, [29649] = 23617, [29656] = 23618, - [29657] = 24002, [29658] = 23620, [29662] = 23622, [29663] = 23623, - [29664] = 23624, [29668] = 23625, [29669] = 23626, [29671] = 23627, - [29672] = 23628, [29692] = 23629, [29693] = 23630, [29694] = 23631, - [29695] = 23632, [29696] = 23633, [29697] = 23634, [29698] = 23635, - [29699] = 23636, [29700] = 23637, [29728] = 23638, [29729] = 23639, - [32285] = 25526, [32656] = 25846, [32657] = 25847, [34608] = 28632, - [36389] = 30321, [36390] = 30322, [36391] = 30323, [36392] = 30324, - [38473] = 31390, [38475] = 31391, [38476] = 31392, [38477] = 31393, - [38478] = 31394, [38479] = 31395, [40033] = 32441, [40034] = 32442, - [40035] = 32443, [40036] = 32444, [41132] = 32736, [41133] = 32737, - [41134] = 32738, [41135] = 32739, [42688] = 35296, [43549] = 33792, - [43846] = 33954, [46140] = 35208, [46141] = 35209, [46142] = 35210, - [46144] = 35211, [54978] = 41124, [54979] = 41123, [54980] = 41120, - [54981] = 41122, [62202] = 44938, [63187] = 45088, [63188] = 45089, - [63189] = 45090, [63190] = 45091, [63191] = 45092, [63192] = 45093, - [67091] = 47622, [67130] = 47640, [67092] = 47623, [67131] = 47641, - [67096] = 47627, [67135] = 47642, [67095] = 47626, [67134] = 47643, - [67093] = 47624, [67132] = 47644, [67094] = 47625, [67133] = 47645, - [70563] = 49970, [70567] = 49973, [70565] = 49971, [70566] = 49972, - [70568] = 49974, [70562] = 49969, - - ------------------------------------------------------------------------------- - -- Cooking - ------------------------------------------------------------------------------- - [2542] = 2697, [2543] = 728, [2545] = 2698, [2547] = 2699, - [2548] = 2700, [2549] = 2701, [2795] = 2889, [3370] = 3678, - [3371] = 3679, [3372] = 3680, [3373] = 3681, [3376] = 3682, - [3377] = 3683, [3397] = 3734, [3398] = 3735, [3399] = 3736, - [3400] = 3737, [4094] = 4609, [6412] = 5482, [6413] = 5483, - [6414] = 5484, [6415] = 5485, [6416] = 5486, [6417] = 44977, - [6418] = 5488, [6419] = 5489, [6501] = 5528, [7213] = 6039, - [7751] = 6325, [7752] = 6326, [7753] = 6328, [7754] = 6329, - [7755] = 6330, [7827] = 6368, [7828] = 6369, [8238] = 6661, - [8607] = 6892, [9513] = 18160, [15853] = 12227, [15855] = 12228, - [15856] = 12229, [15861] = 12231, [15863] = 12232, [15865] = 12233, - [15906] = 12239, [15910] = 12240, [15915] = 16111, [15933] = 16110, - [15935] = 12226, [18238] = 13939, [18239] = 13940, [18240] = 13942, - [18241] = 13941, [18242] = 13943, [18243] = 13945, [18244] = 13946, - [18245] = 13947, [18246] = 13948, [18247] = 13949, [20626] = 16767, - [20916] = 17062, [21143] = 17200, [21144] = 17201, [22480] = 18046, - [22761] = 18267, [24418] = 20075, [25659] = 21025, [25704] = 21099, - [25954] = 21219, [28267] = 22647, [33276] = 27685, [33277] = 27686, - [33278] = 27687, [33279] = 27684, [33284] = 27688, [33285] = 27689, - [33286] = 27690, [33287] = 27691, [33288] = 27692, [33289] = 27693, - [33290] = 27694, [33291] = 27695, [33292] = 27696, [33293] = 27697, - [33294] = 27698, [33295] = 27699, [33296] = 27700, [36210] = 30156, - [38867] = 31675, [38868] = 31674, [43707] = 33870, [43758] = 33871, - [43761] = 33869, [43765] = 33873, [43772] = 33875, [43779] = 33925, - [45022] = 34413, [45555] = 43018, [45556] = 43019, [45557] = 43020, - [45558] = 43021, [45559] = 43022, [45567] = 43023, [45568] = 43024, - [45570] = 43026, [45571] = 43025, [45695] = 34834, [46684] = 35564, - [46688] = 35566, [53056] = 39644, [57423] = 43017, [57433] = 43027, - [57434] = 43028, [57435] = 43029, [57436] = 43030, [57437] = 43031, - [57438] = 43032, [57439] = 43033, [57440] = 43034, [57441] = 43035, - [57442] = 43036, [57443] = 43037, [58512] = 43507, [58521] = 43508, - [58523] = 43509, [58525] = 43510, [58527] = 43505, [58528] = 43506, - [62350] = 44954, - - ------------------------------------------------------------------------------- - -- Enchanting - ------------------------------------------------------------------------------- - [7443] = 6342, [7766] = 6344, [7776] = 6346, [7782] = 6347, - [7786] = 6348, [7793] = 6349, [7859] = 6375, [7867] = 6377, - [13380] = 11038, [13419] = 11039, [13464] = 11081, [13522] = 11098, - [13536] = 11101, [13612] = 11150, [13617] = 11151, [13620] = 11152, - [13646] = 11163, [13653] = 11164, [13655] = 11165, [13687] = 11167, - [13689] = 11168, [13698] = 11166, [13817] = 11202, [13841] = 11203, - [13846] = 11204, [13868] = 11205, [13882] = 11206, [13898] = 11207, - [13915] = 11208, [13931] = 11223, [13933] = 11224, [13945] = 11225, - [13947] = 11226, [15596] = 11813, [15596] = 45050, [20009] = 16218, - [20010] = 16246, [20011] = 16251, [20012] = 16219, [20014] = 16216, - [20015] = 16224, [20016] = 16222, [20017] = 16217, [20020] = 16215, - [20023] = 16245, [20024] = 16220, [20025] = 16253, [20026] = 16221, - [20028] = 16242, [20029] = 16223, [20030] = 16247, [20031] = 16250, - [20032] = 16254, [20033] = 16248, [20034] = 16252, [20035] = 16255, - [20036] = 16249, [20051] = 16243, [21931] = 17725, [22749] = 18259, - [22750] = 18260, [23799] = 19444, [23800] = 19445, [23801] = 19446, - [23802] = 19447, [23803] = 19448, [23804] = 19449, [25072] = 33153, - [25072] = 20726, [25073] = 20727, [25074] = 20728, [25078] = 20729, - [25079] = 20730, [25080] = 33152, [25080] = 20731, [25081] = 20732, - [25082] = 20733, [25083] = 33149, [25083] = 20734, [25084] = 20735, - [25084] = 33150, [25084] = 33151, [25086] = 20736, [25086] = 33148, - [25124] = 20758, [25125] = 20752, [25126] = 20753, [25127] = 20754, - [25128] = 20755, [25129] = 20756, [25130] = 20757, [27837] = 22392, - [27906] = 22530, [27911] = 22531, [27911] = 24000, [27913] = 22532, - [27914] = 22533, [27917] = 22534, [27920] = 22535, [27924] = 22536, - [27926] = 22537, [27927] = 22538, [27945] = 22539, [27946] = 22540, - [27947] = 22541, [27948] = 35298, [27948] = 22542, [27950] = 22543, - [27951] = 22544, [27954] = 22545, [27960] = 24003, [27960] = 22547, - [27962] = 22548, [27967] = 22552, [27968] = 22551, [27971] = 22554, - [27972] = 22553, [27975] = 22555, [27977] = 22556, [27981] = 22560, - [27982] = 22561, [27984] = 22559, [28003] = 22558, [28004] = 22557, - [28016] = 22562, [28019] = 22563, [28022] = 22565, [32665] = 25848, - [32667] = 25849, [33992] = 28270, [33994] = 28271, [33997] = 28272, - [33999] = 28273, [34003] = 28274, [34005] = 28276, [34006] = 28277, - [34007] = 35299, [34007] = 28279, [34008] = 35297, [34008] = 28280, - [34009] = 28282, [34010] = 28281, [42620] = 33165, [42974] = 33307, - [44483] = 37332, [44494] = 37333, [44524] = 37344, [44556] = 37331, - [44575] = 44484, [44576] = 44494, [44588] = 37340, [44590] = 37334, - [44591] = 37347, [44595] = 44473, [44596] = 37330, [44621] = 37339, - [44625] = 44485, [44631] = 37349, [45765] = 34872, [46578] = 35498, - [46594] = 35500, [47051] = 35756, [47672] = 44471, [47898] = 44472, - [47899] = 44488, [47901] = 44491, [59619] = 44496, [59621] = 44492, - [59625] = 44495, [60691] = 44483, [60692] = 44489, [60707] = 44486, - [60714] = 44487, [60763] = 44490, [60767] = 44498, [62256] = 44944, - [62257] = 44945, [62948] = 45059, [64441] = 46027, [64579] = 46348, - - ------------------------------------------------------------------------------- - --Engineering - ------------------------------------------------------------------------------- - [3928] = 4408, [3933] = 4409, [3939] = 13309, [3940] = 4410, - [3944] = 4411, [3952] = 14639, [3954] = 4412, [3957] = 13308, - [3959] = 4413, [3960] = 4414, [3966] = 4415, [3968] = 4416, - [3969] = 13311, [3971] = 7742, [3972] = 4417, [3979] = 13310, - [8243] = 6672, [8339] = 6716, [9269] = 7560, [9273] = 7561, - [12587] = 10601, [12597] = 10602, [12607] = 10603, [12614] = 10604, - [12615] = 10605, [12616] = 10606, [12617] = 10607, [12620] = 10608, - [12624] = 10609, [15628] = 11828, [15633] = 11827, [19790] = 16041, - [19791] = 16042, [19792] = 16043, [19793] = 16044, [19794] = 16045, - [19795] = 16047, [19796] = 16048, [19799] = 16049, [19800] = 16051, - [19814] = 16046, [19815] = 16050, [19819] = 16052, [19825] = 16053, - [19830] = 16054, [19831] = 16055, [19833] = 16056, [21940] = 17720, - [22793] = 18290, [22795] = 18292, [22797] = 18291, [23066] = 18647, - [23067] = 18649, [23068] = 18648, [23069] = 18650, [23071] = 18651, - [23077] = 18652, [23078] = 18653, [23079] = 18655, [23080] = 18656, - [23081] = 18657, [23082] = 18658, [23096] = 18654, [23129] = 18661, - [23507] = 19027, [24356] = 20000, [24357] = 20001, [26416] = 21724, - [26417] = 21725, [26418] = 21726, [26420] = 21727, [26421] = 21728, - [26422] = 21729, [26423] = 21730, [26424] = 21731, [26425] = 21732, - [26426] = 21733, [26427] = 21734, [26428] = 21735, [26442] = 44919, - [26443] = 44918, [28327] = 22729, [30313] = 23799, [30314] = 23800, - [30315] = 23802, [30316] = 23803, [30317] = 23804, [30318] = 23805, - [30325] = 23806, [30329] = 23807, [30332] = 23808, [30334] = 23809, - [30337] = 23810, [30341] = 23811, [30344] = 23814, [30347] = 23815, - [30348] = 23816, [30349] = 23817, [30547] = 23874, [30548] = 23888, - [30551] = 35310, [30552] = 35311, [30556] = 23887, [32814] = 25887, - [39895] = 32381, [43676] = 33804, [44391] = 34114, [46106] = 35191, - [46107] = 35187, [46108] = 35189, [46109] = 35190, [46110] = 35192, - [46111] = 35186, [46112] = 35193, [46113] = 35194, [46114] = 35195, - [46115] = 35196, [46116] = 35197, [46697] = 35582, [60866] = 44502, - [60867] = 44503, [72952] = 52022, [72953] = 52023, - - ------------------------------------------------------------------------------- - --Inscription - ------------------------------------------------------------------------------- - [71101] = 50166, [71102] = 50168, [71015] = 50167, - - ------------------------------------------------------------------------------- - --Jewelcrafting - ------------------------------------------------------------------------------- - [25320] = 20856, [25323] = 20855, [25339] = 20854, [25610] = 20970, - [25612] = 20971, [25617] = 20973, [25618] = 20974, [25619] = 20975, - [25622] = 20976, [26873] = 21940, [26875] = 21941, [26878] = 21942, - [26881] = 21943, [26882] = 21944, [26887] = 21945, [26896] = 21947, - [26897] = 21948, [26900] = 21949, [26906] = 21952, [26909] = 21953, - [26910] = 21954, [26912] = 21955, [26914] = 21956, [26915] = 21957, - [28903] = 23130, [28905] = 23131, [28906] = 23133, [28907] = 23134, - [28910] = 23135, [28912] = 23136, [28914] = 23137, [28915] = 23138, - [28916] = 23140, [28917] = 23141, [28918] = 31359, [28924] = 23143, - [28927] = 23145, [28933] = 23146, [28936] = 23147, - [28938] = 23148, [28944] = 23149, [28947] = 23150, [28948] = 23151, - [28950] = 23152, [28953] = 23153, [28955] = 23154, [28957] = 23155, - [31053] = 24158, [31054] = 24159, [31055] = 24160, [31056] = 24161, - [31057] = 24162, [31058] = 24163, [31060] = 24164, [31061] = 24165, - [31062] = 24174, [31063] = 24175, [31064] = 24176, [31065] = 24177, - [31066] = 24178, [31067] = 24166, [31068] = 24167, [31070] = 24168, - [31071] = 24169, [31072] = 24170, [31076] = 24171, [31077] = 24172, - [31078] = 24173, [31079] = 24179, [31080] = 31358, [31081] = 24181, - [31082] = 24182, [31083] = 24183, [31084] = 24193, [31085] = 24194, - [31087] = 24195, [31088] = 35305, [31089] = 35306, [31090] = 24197, - [31091] = 24198, [31092] = 35304, [31094] = 24201, [31095] = 24202, - [31096] = 24203, [31097] = 24204, [31098] = 35307, [31099] = 24206, - [31100] = 24207, [31101] = 24208, [31102] = 24209, [31103] = 24210, - [31104] = 24211, [31105] = 24212, [31106] = 24213, [31107] = 24214, - [31108] = 24215, [31109] = 24216, [31110] = 24217, [31111] = 24218, - [31112] = 24219, [31113] = 24220, [31149] = 24200, [32866] = 25902, - [32867] = 25903, [32868] = 25905, [32869] = 25906, [32870] = 25904, - [32871] = 25907, [32872] = 25909, [32873] = 25908, [32874] = 25910, - [34069] = 28291, [34590] = 28596, [37855] = 30826, [38503] = 31401, - [38504] = 31402, [39451] = 31870, [39452] = 31875, [39455] = 31871, - [39458] = 31872, [39462] = 31877, [39463] = 31876, [39466] = 31873, - [39467] = 31874, [39470] = 31878, [39471] = 31879, [39705] = 35244, - [39706] = 35246, [39710] = 35250, [39711] = 35248, [39712] = 35245, - [39713] = 35249, [39714] = 35247, [39715] = 35263, [39716] = 35264, - [39717] = 35262, [39718] = 35265, [39719] = 35255, [39720] = 35260, - [39721] = 35259, [39722] = 35256, [39723] = 35261, [39724] = 35258, - [39725] = 35257, [39727] = 35243, [39728] = 35242, [39729] = 35238, - [39730] = 35240, [39731] = 35239, [39732] = 35241, [39733] = 35267, - [39734] = 35269, [39735] = 35268, [39736] = 35266, [39737] = 35270, - [39738] = 35271, [39739] = 35252, [39740] = 35254, [39741] = 35251, - [39742] = 35253, [39961] = 33622, [39963] = 32411, [42558] = 33305, - [42588] = 33155, [42589] = 33156, [42590] = 33157, [42591] = 33158, - [42592] = 33159, [42593] = 33160, [43493] = 33783, [44794] = 34689, - [46122] = 35198, [46123] = 35538, [46124] = 35200, [46125] = 35201, - [46126] = 35533, [46127] = 35203, [46403] = 35322, [46404] = 35323, - [46405] = 35325, [46597] = 35502, [46601] = 35505, [46775] = 35695, - [46776] = 35696, [46777] = 35697, [46778] = 35698, [46779] = 35699, - [46803] = 35708, [47053] = 35769, [47054] = 35766, [47055] = 35767, - [47056] = 35768, [48789] = 37504, [53830] = 41576, [53857] = 41559, - [53865] = 41575, [53869] = 41574, [53875] = 41566, [53877] = 41562, - [53879] = 41565, [53884] = 41563, [53885] = 41561, [53888] = 41564, - [53917] = 41567, [53919] = 41572, [53921] = 41568, [53924] = 41571, - [53929] = 41573, [53932] = 41570, [53933] = 41569, [53943] = 41560, - [53945] = 41577, [53946] = 41718, [53948] = 41719, [53949] = 41578, - [53950] = 41817, [53951] = 41790, [53952] = 42138, [53954] = 41581, - [53955] = 41728, [53957] = 41720, [53958] = 41580, [53959] = 41791, - [53960] = 41727, [53961] = 41579, [53962] = 41784, [53963] = 41747, - [53964] = 41785, [53965] = 41725, [53966] = 41783, [53967] = 41701, - [53968] = 41740, [53970] = 41796, [53971] = 41703, [53972] = 41820, - [53973] = 41702, [53974] = 41726, [53975] = 41789, [53976] = 41777, - [53977] = 41780, [53978] = 41734, [53979] = 41794, [53980] = 41582, - [53981] = 41733, [53982] = 41792, [53983] = 41689, [53984] = 41686, - [53985] = 41688, [53986] = 41730, [53987] = 41690, [53988] = 41721, - [53990] = 41732, [53991] = 41687, [53992] = 41779, [53993] = 41722, - [53994] = 41818, [53995] = 41795, [53996] = 41723, [53997] = 41698, - [53998] = 41697, [54000] = 41738, [54001] = 41693, [54002] = 41699, - [54003] = 41781, [54004] = 41782, [54005] = 41737, [54006] = 41694, - [54008] = 41724, [54009] = 41696, [54010] = 41739, [54011] = 41692, - [54012] = 41819, [54013] = 41736, [54014] = 41735, [54019] = 41793, - [54023] = 41778, [55384] = 41705, [55387] = 41743, [55388] = 41744, - [55389] = 41704, [55390] = 41786, [55392] = 41706, [55393] = 41742, - [55395] = 41787, [55396] = 41708, [55397] = 41798, [55398] = 41799, - [55400] = 41710, [55401] = 41797, [55403] = 41711, [55404] = 41709, - [55405] = 41788, [55407] = 41707, [56049] = 42298, [56052] = 42301, - [56053] = 42309, [56054] = 42299, [56055] = 42314, [56056] = 42302, - [56074] = 42300, [56076] = 42303, [56077] = 42304, [56079] = 42305, - [56081] = 42306, [56083] = 42307, [56084] = 42308, [56085] = 42310, - [56086] = 42311, [56087] = 42312, [56088] = 42313, [56089] = 42315, - [56496] = 42648, [56497] = 42649, [56498] = 42650, [56499] = 42651, - [56500] = 42652, [56501] = 42653, [58147] = 43317, [58148] = 43318, - [58149] = 43319, [58150] = 43320, [58492] = 43485, [58507] = 43497, - [58954] = 43597, [66556] = 46937, [66447] = 46917, [66429] = 46899, - [66557] = 46938, [66430] = 46900, [66432] = 46902, [66433] = 46903, - [66497] = 46924, [66561] = 46942, [66434] = 46904, [66498] = 46925, - [66499] = 46926, [66436] = 46906, [66500] = 46927, [66437] = 46907, - [66501] = 46928, [66565] = 46946, [66438] = 46908, [66502] = 46929, - [66566] = 46947, [66439] = 46909, [66503] = 46930, [66567] = 46948, - [66440] = 46910, [66504] = 46931, [66441] = 46911, [66505] = 46932, - [66569] = 46950, [66442] = 46912, [66506] = 46933, [66570] = 46951, - [66443] = 46913, [66444] = 46914, [66572] = 46953, [66445] = 46915, - [66573] = 46956, [66446] = 46916, [66574] = 47007, [66575] = 47008, - [66448] = 46918, [66576] = 47010, [66449] = 46919, [66577] = 47011, - [66450] = 46920, [66578] = 47012, [66451] = 46921, [66579] = 47015, - [66452] = 46922, [66580] = 47016, [66453] = 46923, [66581] = 47017, - [66582] = 47018, [66583] = 47019, [66584] = 47020, [66586] = 47022, - [68253] = 49112, [66338] = 46897, [66571] = 46952, [66564] = 46945, - [66562] = 46943, [66560] = 46941, [66558] = 46939, [66554] = 46935, - [66559] = 46940, [66585] = 47021, [66555] = 46936, [66587] = 47023, - [66431] = 46901, [66428] = 46898, [66435] = 46905, [66563] = 46944, - [66553] = 46934, [66568] = 46949, - - ------------------------------------------------------------------------------- - --Leatherworking - ------------------------------------------------------------------------------- - [2158] = 2406, [2163] = 2407, [2164] = 2408, [2169] = 2409, - [3762] = 4293, [3765] = 7360, [3767] = 4294, [3769] = 4296, - [3771] = 4297, [3772] = 7613, [3773] = 4299, [3775] = 4298, - [3777] = 4300, [3778] = 14635, [3779] = 4301, [4096] = 13287, - [4097] = 13288, [5244] = 5083, [6702] = 5786, [6703] = 5787, - [6704] = 5788, [6705] = 5789, [7133] = 5972, [7149] = 5973, - [7153] = 5974, [7953] = 6474, [7954] = 6475, [7955] = 6476, - [8322] = 6710, [9064] = 7288, [9070] = 7289, [9072] = 7290, - [9146] = 7361, [9147] = 7362, [9148] = 7363, [9149] = 7364, - [9195] = 7449, [9197] = 7450, [9202] = 7451, [9207] = 7452, - [9208] = 7453, [10490] = 8384, [10509] = 8385, [10516] = 8409, - [10520] = 8386, [10525] = 8395, [10529] = 8403, [10531] = 8387, - [10533] = 8397, [10542] = 8398, [10544] = 8404, [10546] = 8405, - [10554] = 8399, [10560] = 8389, [10562] = 8390, [10564] = 8400, - [10566] = 8406, [10568] = 8401, [10570] = 8402, [10572] = 8407, - [10574] = 8408, [19048] = 15724, [19049] = 15725, [19050] = 15726, - [19051] = 15727, [19052] = 15728, [19053] = 15729, [19054] = 15730, - [19055] = 15731, [19059] = 15732, [19060] = 15733, [19061] = 15734, - [19062] = 15735, [19063] = 15737, [19064] = 15738, [19065] = 15739, - [19066] = 15740, [19067] = 15741, [19068] = 20253, [19070] = 15743, - [19071] = 15744, [19072] = 15745, [19073] = 15746, [19074] = 15747, - [19075] = 15748, [19076] = 15749, [19077] = 15751, [19078] = 15752, - [19079] = 15753, [19080] = 20254, [19081] = 15755, [19082] = 15756, - [19083] = 15757, [19084] = 15758, [19085] = 15759, [19086] = 15760, - [19087] = 15761, [19088] = 15762, [19089] = 15763, [19090] = 15764, - [19091] = 15765, [19092] = 15768, [19093] = 15769, [19094] = 15770, - [19095] = 15771, [19097] = 15772, [19098] = 15773, [19100] = 15774, - [19101] = 15775, [19102] = 15776, [19103] = 15777, [19104] = 15779, - [19107] = 15781, [20853] = 17022, [20854] = 17023, [20855] = 17025, - [21943] = 17722, [22711] = 18239, [22727] = 18252, [22921] = 18514, - [22922] = 18515, [22923] = 18516, [22926] = 18517, [22927] = 18518, - [22928] = 18519, [23190] = 18731, [23399] = 18949, [23703] = 19326, - [23704] = 19327, [23705] = 19328, [23706] = 19329, [23707] = 19330, - [23708] = 19331, [23709] = 19332, [23710] = 19333, [24121] = 19769, - [24122] = 19770, [24123] = 19771, [24124] = 19772, [24125] = 19773, - [24703] = 20382, [24846] = 20506, [24847] = 20507, [24848] = 20508, - [24849] = 20509, [24850] = 20510, [24851] = 20511, [24940] = 20576, - [26279] = 21548, [28472] = 22771, [28473] = 22770, [28474] = 22769, - [32455] = 25720, [32457] = 25721, [32458] = 25722, [32461] = 25725, - [32482] = 25726, [32485] = 25728, [32487] = 25729, [32488] = 25731, - [32489] = 25730, [32490] = 25732, [32493] = 25733, [32494] = 25734, - [32495] = 25735, [32496] = 25736, [32497] = 25737, [32498] = 29213, - [32499] = 29214, [32500] = 29215, [32501] = 29217, [32502] = 29219, - [32503] = 29218, [35520] = 29669, [35521] = 29672, [35522] = 29673, - [35523] = 29674, [35524] = 29675, [35525] = 29677, [35526] = 29682, - [35527] = 29684, [35528] = 29691, [35529] = 29689, [35530] = 30444, - [35531] = 29693, [35532] = 29698, [35533] = 29700, [35534] = 29701, - [35535] = 29702, [35536] = 29703, [35537] = 29704, [35538] = 29713, - [35539] = 34175, [35543] = 29717, [35544] = 34173, [35549] = 31361, - [35554] = 31362, [35555] = 29720, [35557] = 29721, [35558] = 29723, - [35559] = 35302, [35560] = 29725, [35561] = 29726, [35562] = 35303, - [35563] = 29728, [35564] = 29729, [35567] = 29730, [35568] = 35300, - [35572] = 29732, [35573] = 35301, [35574] = 29734, [36349] = 30301, - [36351] = 30302, [36352] = 30303, [36353] = 30304, [36355] = 30305, - [36357] = 30306, [36358] = 30307, [36359] = 30308, [39997] = 32429, - [40001] = 32431, [40002] = 32432, [40003] = 32433, [40004] = 32434, - [40005] = 32435, [40006] = 32436, [41156] = 32744, [41157] = 35523, - [41158] = 35527, [41160] = 35528, [41161] = 35517, [41162] = 35524, - [41163] = 35520, [41164] = 35521, [42546] = 33124, [42731] = 33205, - [44359] = 34200, [44768] = 34218, [44953] = 34262, [45117] = 34491, - [46132] = 35546, [46133] = 35541, [46134] = 35214, [46135] = 35215, - [46136] = 35216, [46137] = 35217, [46138] = 35218, [46139] = 35549, - [50970] = 44509, [50971] = 44510, [52733] = 32430, - [57692] = 44559, [57694] = 44560, [57696] = 44561, [57699] = 44562, - [57701] = 44563, [60645] = 44511, [60647] = 44512, [60697] = 44513, - [60702] = 44514, [60703] = 44515, [60704] = 44516, [60705] = 44517, - [60706] = 44518, [60711] = 44519, [60712] = 44520, [60715] = 44521, - [60716] = 44522, [60718] = 44523, [60720] = 44524, [60721] = 44525, - [60723] = 44526, [60725] = 44527, [60727] = 44528, [60728] = 44530, - [60729] = 44531, [60730] = 44532, [60731] = 44533, [60732] = 44534, - [60734] = 44535, [60735] = 44536, [60737] = 44537, [60743] = 44538, - [60746] = 44539, [60747] = 44540, [60748] = 44541, [60749] = 44542, - [60750] = 44543, [60751] = 44544, [60752] = 44545, [60754] = 44546, - [60755] = 44547, [60756] = 44548, [60757] = 44549, [60758] = 44550, - [60759] = 44551, [60760] = 44552, [60761] = 44553, [60996] = 44584, - [60997] = 44585, [60998] = 44586, [60999] = 44587, [61000] = 44588, - [61002] = 44589, [62176] = 44932, [62177] = 44933, [63194] = 45094, - [63195] = 45095, [63196] = 45096, [63197] = 45097, [63198] = 45098, - [63199] = 45099, [63200] = 45100, [63201] = 45101, [70554] = 49957, - [70555] = 49958, [70556] = 49959, [70557] = 49961, [70558] = 49962, - [70559] = 49963, [70560] = 49965, [70561] = 49966, [67136] = 47650, - [67137] = 47646, [67138] = 47649, [67139] = 47647, [67141] = 47653, - [67142] = 47651, [67143] = 47648, [67140] = 47652, - - ------------------------------------------------------------------------------- - --Smelting - ------------------------------------------------------------------------------- - [22967] = 44956, [46353] = 35273, - - ------------------------------------------------------------------------------- - --Tailoring - ------------------------------------------------------------------------------- - [2389] = 2598, [2403] = 2601, [3758] = 4292, [3844] = 4346, - [3847] = 4345, [3849] = 4347, [3851] = 4349, [3854] = 7114, - [3856] = 4350, [3857] = 14630, [3858] = 4351, [3860] = 4352, - [3862] = 4355, [3863] = 4353, [3864] = 4356, [3868] = 4348, - [3869] = 14627, [3870] = 6401, [3872] = 4354, [3873] = 10728, - [6686] = 5771, [6688] = 5772, [6692] = 5773, [6693] = 5774, - [6695] = 5775, [7629] = 6271, [7630] = 6270, [7633] = 6272, - [7639] = 6274, [7643] = 6275, [7892] = 6390, [7893] = 6391, - [8780] = 7092, [8782] = 7091, [8784] = 7090, [8786] = 7089, - [8789] = 7087, [8793] = 7084, [8795] = 7085, [8797] = 7086, - [8802] = 7088, [12047] = 10316, [12056] = 10300, [12059] = 10301, - [12060] = 10302, [12064] = 10311, [12066] = 10312, [12075] = 10314, - [12078] = 10315, [12080] = 10317, [12081] = 10318, [12084] = 10320, - [12085] = 10321, [12086] = 10463, [12089] = 10323, [12091] = 10325, - [12093] = 10326, [18403] = 14466, [18404] = 14467, [18405] = 14468, - [18406] = 14469, [18407] = 14470, [18408] = 14471, [18409] = 14472, - [18410] = 14473, [18411] = 14474, [18412] = 14476, [18413] = 14477, - [18414] = 14478, [18415] = 14479, [18416] = 14480, [18417] = 14481, - [18418] = 14482, [18419] = 14483, [18420] = 14484, [18421] = 14485, - [18422] = 14486, [18423] = 14488, [18424] = 14489, [18434] = 14490, - [18436] = 14493, [18437] = 14492, [18438] = 14491, [18439] = 14494, - [18440] = 14497, [18441] = 14495, [18442] = 14496, [18444] = 14498, - [18445] = 14499, [18446] = 14500, [18447] = 14501, [18448] = 14507, - [18449] = 14504, [18450] = 14505, [18451] = 14506, [18452] = 14509, - [18453] = 14508, [18454] = 14511, [18455] = 14510, [18456] = 14512, - [18457] = 14513, [18458] = 14514, [18560] = 14526, [20848] = 17017, - [20849] = 17018, [21945] = 17724, [22759] = 18265, [22866] = 18414, - [22867] = 18415, [22868] = 18416, [22869] = 18417, [22870] = 18418, - [22902] = 18487, [23662] = 19215, [23663] = 19218, [23664] = 19216, - [23665] = 19217, [23666] = 19219, [23667] = 19220, [24091] = 19764, - [24092] = 19765, [24093] = 19766, [24901] = 20546, [24902] = 20548, - [24903] = 20547, [26085] = 21358, [26087] = 21371, [26403] = 44916, - [26407] = 44917, [26747] = 21892, [26749] = 21893, [26750] = 21894, - [26751] = 21895, [26752] = 21908, [26753] = 21909, [26754] = 21910, - [26755] = 21911, [26756] = 21912, [26757] = 21914, [26758] = 21913, - [26759] = 21915, [26760] = 21916, [26761] = 21918, [26762] = 21917, - [26763] = 21919, [26773] = 21896, [26774] = 21897, [26775] = 21898, - [26776] = 21899, [26777] = 21900, [26778] = 21901, [26779] = 21902, - [26780] = 21903, [26781] = 21904, [26782] = 21905, [26783] = 21906, - [26784] = 21907, [27658] = 22307, [27659] = 22308, [27660] = 22309, - [27724] = 22310, [27725] = 22312, [28210] = 22683, [28480] = 22774, - [28481] = 22773, [28482] = 22772, [31373] = 24316, [31430] = 24292, - [31431] = 24293, [31432] = 24294, [31433] = 24295, [31434] = 35308, - [31435] = 24297, [31437] = 24298, [31438] = 24299, [31440] = 24300, - [31441] = 24301, [31442] = 35309, [31443] = 24303, [31444] = 24304, - [31448] = 24305, [31449] = 24306, [31450] = 24307, [31451] = 24308, - [31452] = 24309, [31453] = 24310, [31454] = 24311, [31455] = 24312, - [31456] = 24313, [31459] = 24314, [36315] = 30280, [36316] = 30281, - [36317] = 30282, [36318] = 30283, [36686] = 30483, [37873] = 30833, - [37882] = 30842, [37883] = 30843, [37884] = 30844, [40020] = 32437, - [40021] = 32438, [40023] = 32439, [40024] = 32440, [40060] = 32447, - [41205] = 32754, [41206] = 32755, [41207] = 32752, [41208] = 32753, - [44950] = 34261, [44958] = 34319, [46128] = 35204, [46129] = 35205, - [46130] = 35206, [46131] = 35207, [49677] = 37915, [50194] = 38229, - [50644] = 38327, [50647] = 38328, [55993] = 42172, [55994] = 42173, - [55996] = 42175, [55997] = 42177, [55998] = 42176, [55999] = 42178, - [56004] = 42183, [56005] = 42184, [56006] = 42185, [56009] = 42187, - [56011] = 42188, [63924] = 45774, [70550] = 49953, [70551] = 49954, - [70552] = 49955, [70553] = 49956, [63203] = 45102, [63205] = 45104, - [63206] = 45105, [67145] = 47639, [67146] = 47638, [63204] = 45103, - [67144] = 47636, [67147] = 47637, -} - -local RECIPE_TO_SPELL_MAP = {} - -do - for spell_id, recipe_id in pairs(SPELL_TO_RECIPE_MAP) do - RECIPE_TO_SPELL_MAP[recipe_id] = spell_id - end -end - -------------------------------------------------------------------------------- --- Look up table of spell IDs for recipes which do not have a player flag --- BASICALLY A TEMPORARY STORAGE FOR IDS, SO WE CAN SEE CLEANER SCANS AND WHAT NOT, --- WE'LL GO BACK HERE LATER DOWN THE ROAD. -------------------------------------------------------------------------------- -local NO_ROLE_FLAG = { - - -------------------------------------------------------------------------------------------- - -----ASSORTED CRAP - -------------------------------------------------------------------------------------------- - [30344] = true, [30341] = true, [32814] = true, [23066] = true, - [26421] = true, [36955] = true, [19788] = true, [23129] = true, - [26422] = true, [12715] = true, [12899] = true, [56459] = true, - [30307] = true, [26423] = true, [3918] = true, [23067] = true, - [30308] = true, [3953] = true, [15255] = true, [26424] = true, - [30548] = true, [44157] = true, [56462] = true, [19567] = true, - [30552] = true, [23068] = true, [44155] = true, [28327] = true, - [26425] = true, [56461] = true, [68067] = true, [15633] = true, - [23096] = true, [12589] = true, [26442] = true, [26426] = true, - [67920] = true, [9273] = true, [3926] = true, [6458] = true, - [19793] = true, [55252] = true, [9271] = true, [26427] = true, - [26443] = true, [30551] = true, [23486] = true, [3922] = true, - [3924] = true, [12590] = true, [3928] = true, [3942] = true, - [26428] = true, [3952] = true, [22704] = true, [12902] = true, - [30569] = true, [15628] = true, [12895] = true, [21940] = true, - [56349] = true, [12584] = true, [56477] = true, [30348] = true, - [26416] = true, [53281] = true, [23507] = true, [12075] = true, - [12079] = true, [26746] = true, [56000] = true, - - ----------------------------------------------------------------------------------------- - ---JEWELCRAFTING - ----------------------------------------------------------------------------------------- - [55401] = true, [53995] = true, [66432] = true, [25255] = true, - [66497] = true, [53996] = true, [56074] = true, [56202] = true, - [66434] = true, [32801] = true, [28948] = true, [53997] = true, - [39963] = true, [32866] = true, [66501] = true, [39452] = true, - [53934] = true, [66502] = true, [55405] = true, [58954] = true, - [56205] = true, [37855] = true, [38175] = true, [25305] = true, - [25321] = true, [66505] = true, [54000] = true, [39742] = true, - [56206] = true, [66506] = true, [32869] = true, [54001] = true, - [56079] = true, [32259] = true, [32870] = true, [56208] = true, - [32807] = true, [32871] = true, [26873] = true, [31061] = true, - [32872] = true, [42591] = true, [46779] = true, [56530] = true, - [42592] = true, [31062] = true, [56083] = true, [32874] = true, - [56531] = true, [31063] = true, [56085] = true, [38503] = true, - [56086] = true, [28938] = true, [38504] = true, [31064] = true, - [31096] = true, [55384] = true, [25278] = true, [68253] = true, - [43493] = true, [26925] = true, [31065] = true, [46403] = true, - [53852] = true, [53916] = true, [39722] = true, [25615] = true, - [28924] = true, [26926] = true, [53853] = true, [36526] = true, - [31098] = true, [55388] = true, [46405] = true, [53854] = true, - [39724] = true, [55389] = true, [26927] = true, [31051] = true, - [53919] = true, [39725] = true, [55390] = true, [53856] = true, - [53920] = true, [53952] = true, [26880] = true, [53857] = true, - [31052] = true, [34069] = true, [25490] = true, [55393] = true, - [39451] = true, [53956] = true, [44794] = true, [36524] = true, - [55395] = true, [38068] = true, [28944] = true, [53957] = true, - [31066] = true, [31082] = true, [66428] = true, [26909] = true, - [55396] = true, [31097] = true, [25284] = true, [56084] = true, - [62941] = true, [66431] = true, [53894] = true, [53958] = true, - [58146] = true, [31099] = true, [47053] = true, [31067] = true, - [28917] = true, [26903] = true, [36525] = true, [66503] = true, - [56197] = true, [47054] = true, [53961] = true, [39715] = true, - [31092] = true, [53960] = true, [31077] = true, [31101] = true, - [39719] = true, [55399] = true, [31113] = true, [32808] = true, - [53917] = true, [63743] = true, [39720] = true, [39721] = true, - [42590] = true, [58149] = true, [56199] = true, [47056] = true, - [28950] = true, [47280] = true, [32809] = true, [31072] = true, - [25318] = true, [66429] = true, [62242] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ---COOKING - --------------------------------------------------------------------------------------- - [62050]= true, [22761]= true, [62051]= true, [8607]= true, - [18238]= true, [6413]= true, [6417]= true, [42296]= true, - [45557]= true, [6501]= true, [45558]= true, [18239]= true, - [7752]= true, [7828]= true, [45560]= true, [64358]= true, - [57421]= true, [45561]= true, [13028]= true, [2543]= true, - [2545]= true, [25659]= true, [58512]= true, [45565]= true, - [42305]= true, [45566]= true, [62350]= true, [7753]= true, - [45695]= true, [9513]= true, [18244]= true, [20626]= true, - [45569]= true, [43779]= true, [18245]= true, [45571]= true, - [18246]= true, [37836]= true, [57433]= true, [20916]= true, - [58521]= true, [18247]= true, [57435]= true, [7754]= true, - [53056]= true, [58523]= true, [57437]= true, [57438]= true, - [58525]= true, [45570]= true, [2538]= true, [2540]= true, - [2548]= true, [33290]= true, [45562]= true, [15906]= true, - [18241]= true, [45559]= true, [45551]= true, [57443]= true, - [58527]= true, [43758]= true, [58528]= true, [8238]= true, - [7751]= true, [7755]= true, [43761]= true, [7827]= true, - [45552]= true, [45553]= true, [66038] = true, [66034] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ---BLACKSMITHING - --------------------------------------------------------------------------------------- - [10015] = true, [55202] = true, [16726] = true, [24399] = true, - [15293] = true, [32655] = true, [3320] = true, [40033] = true, - [34545] = true, [61010] = true, [16639] = true, [3115] = true, - [3116] = true, [3117] = true, [16648] = true, [40034] = true, - [9920] = true, [9928] = true, [29558] = true, [55839] = true, - [9964] = true, [7818] = true, [55732] = true, [29694] = true, - [3326] = true, [9950] = true, [59405] = true, [12260] = true, - [16983] = true, [16991] = true, [23650] = true, [16640] = true, - [2741] = true, [3513] = true, [3497] = true, [8768] = true, - [19666] = true, [2662] = true, [2663] = true, [20201] = true, - [16664] = true, [15294] = true, [3496] = true, [16645] = true, - [29569] = true, [2737] = true, [14380] = true, [16992] = true, - [36125] = true, [19667] = true, [22757] = true, [16665] = true, - [59406] = true, [2738] = true, [2739] = true, [2740] = true, - [24913] = true, [9933] = true, [20873] = true, [36126] = true, - [40035] = true, [8880] = true, [23636] = true, [3292] = true, - [3293] = true, [21161] = true, [32656] = true, [19668] = true, - [9921] = true, [7222] = true, [3319] = true, [15295] = true, - [20874] = true, [20890] = true, [3337] = true, [34546] = true, - [16970] = true, [16978] = true, [61008] = true, [7224] = true, - [11454] = true, [19669] = true, [55656] = true, [16667] = true, - [16731] = true, [61009] = true, [9926] = true, [16984] = true, - [21913] = true, [40036] = true, [9974] = true, [32657] = true, - [32285] = true, [23638] = true, [10011] = true, [36131] = true, - [27830] = true, [32284] = true, [16732] = true, [15292] = true, - [15296] = true, [38478] = true, [20876] = true, [38475] = true, - [23653] = true, [3325] = true, [14379] = true, [29729] = true, - [2661] = true, [29728] = true, [16655] = true, [16993] = true, - [3491] = true, [3494] = true, [3501] = true, [9959] = true, - [9983] = true, [36262] = true, [10003] = true, [10007] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ----INSCRIPTION - --------------------------------------------------------------------------------------- - [58315] = true, [58331] = true, [58347] = true, [56974] = true, [56990] = true, - [64256] = true, [64304] = true, [57166] = true, [57709] = true, [57214] = true, - [57230] = true, [50603] = true, [57262] = true, [59338] = true, [58332] = true, - [56959] = true, [56975] = true, [56991] = true, [57007] = true, [57023] = true, - [53462] = true, [64257] = true, [64273] = true, [64289] = true, [57151] = true, - [57167] = true, [57183] = true, [57710] = true, [57215] = true, [57247] = true, - [50620] = true, [58301] = true, [59339] = true, [58333] = true, [59387] = true, - [52840] = true, [59499] = true, [56960] = true, [56976] = true, [57008] = true, - [57024] = true, [64258] = true, [64274] = true, [57168] = true, [57184] = true, - [61288] = true, [57216] = true, [57232] = true, [58286] = true, [58302] = true, - [59340] = true, [48114] = true, [64051] = true, [59484] = true, [59500] = true, - [56961] = true, [56977] = true, [57009] = true, [57025] = true, [61177] = true, - [64259] = true, [57121] = true, [64291] = true, [57153] = true, [57169] = true, - [57185] = true, [57712] = true, [57217] = true, [57233] = true, [58287] = true, - [58303] = true, [58319] = true, [56946] = true, [56978] = true, [56994] = true, - [57010] = true, [57026] = true, [64260] = true, [57122] = true, [57154] = true, - [57170] = true, [57186] = true, [57713] = true, [57218] = true, [57234] = true, - [57266] = true, [59326] = true, [58320] = true, [58336] = true, [59486] = true, - [59502] = true, [56963] = true, [56995] = true, [57011] = true, [57027] = true, - [64261] = true, [64277] = true, [57155] = true, [57187] = true, [57714] = true, - [57219] = true, [57235] = true, [58289] = true, [58305] = true, [58321] = true, - [58337] = true, [69385] = true, [57243] = true, [64314] = true, [64313] = true, - [56958] = true, [59487] = true, [59503] = true, [58288] = true, [56980] = true, - [56996] = true, [57012] = true, [57028] = true, [59501] = true, [56948] = true, - [57264] = true, [64246] = true, [64262] = true, [57124] = true, [64294] = true, - [57156] = true, [57172] = true, [57188] = true, [57715] = true, [57220] = true, - [57236] = true, [57268] = true, [58306] = true, [58322] = true, [58338] = true, - [48247] = true, [57133] = true, [57270] = true, [57131] = true, [57129] = true, - [50604] = true, [59488] = true, [59504] = true, [56965] = true, [56981] = true, - [56997] = true, [57013] = true, [57029] = true, [64280] = true, [57114] = true, - [64286] = true, [58299] = true, [57125] = true, [64295] = true, [64311] = true, - [57164] = true, [57189] = true, [57716] = true, [57221] = true, [57237] = true, - [57269] = true, [58307] = true, [58323] = true, [58339] = true, [64307] = true, - [57119] = true, [57246] = true, [68166] = true, [64282] = true, [57250] = true, - [59489] = true, [56957] = true, [56982] = true, [56998] = true, [57014] = true, - [57117] = true, [64305] = true, [61677] = true, [52843] = true, [57126] = true, - [64296] = true, [57158] = true, [64310] = true, [57190] = true, [56956] = true, - [57238] = true, [60336] = true, [58308] = true, [58324] = true, [58340] = true, - [64315] = true, [56949] = true, [56950] = true, [64308] = true, [56955] = true, - [59490] = true, [59315] = true, [56983] = true, [56999] = true, [64267] = true, - [57031] = true, [56954] = true, [64276] = true, [57249] = true, [64249] = true, - [56953] = true, [57127] = true, [64297] = true, [57159] = true, [64275] = true, - [57191] = true, [57207] = true, [57223] = true, [57239] = true, [50612] = true, - [60337] = true, [57208] = true, [58325] = true, [48121] = true, [56952] = true, - [56947] = true, [56951] = true, [64268] = true, [57123] = true, [59475] = true, - [59491] = true, [56968] = true, [56984] = true, [57000] = true, [48248] = true, - [58565] = true, [58317] = true, [64266] = true, [57252] = true, [64250] = true, - [57112] = true, [57128] = true, [64298] = true, [57160] = true, [58316] = true, - [57703] = true, [57719] = true, [57224] = true, [57240] = true, [57272] = true, - [58310] = true, [58326] = true, [58342] = true, [57201] = true, [56945] = true, - [57200] = true, [56944] = true, [57711] = true, [56985] = true, [57001] = true, - [57199] = true, [57033] = true, [56943] = true, [57198] = true, [64251] = true, - [57113] = true, [64283] = true, [64299] = true, [57161] = true, [57197] = true, - [57704] = true, [57209] = true, [57225] = true, [57241] = true, [50614] = true, - [57273] = true, [58311] = true, [58327] = true, [58343] = true, [52738] = true, - [57196] = true, [64278] = true, [57195] = true, [58318] = true, [64284] = true, - [57006] = true, [64316] = true, [56986] = true, [57002] = true, [59560] = true, - [57034] = true, [58341] = true, [57192] = true, [64252] = true, [67600] = true, - [57130] = true, [64300] = true, [57162] = true, [57244] = true, [57194] = true, - [57210] = true, [57226] = true, [50599] = true, [57258] = true, [58296] = true, - [58312] = true, [58328] = true, [58344] = true, [52739] = true, [58298] = true, - [57274] = true, [57265] = true, [57251] = true, [59478] = true, [56971] = true, - [56987] = true, [57003] = true, [57019] = true, [57035] = true, [57259] = true, - [57263] = true, [57271] = true, [64253] = true, [57115] = true, [64285] = true, - [57242] = true, [57163] = true, [57120] = true, [57706] = true, [57211] = true, - [57227] = true, [50600] = true, [50616] = true, [58297] = true, [58313] = true, - [58329] = true, [58345] = true, [50602] = true, [57248] = true, [59559] = true, - [57157] = true, [57257] = true, [64309] = true, [64317] = true, [56972] = true, - [56988] = true, [57004] = true, [57020] = true, [57036] = true, [62162] = true, - [57030] = true, [64254] = true, [57116] = true, [57132] = true, [64302] = true, - [64318] = true, [64270] = true, [57707] = true, [57212] = true, [57228] = true, - [50601] = true, [57260] = true, [57276] = true, [58314] = true, [58330] = true, - [58346] = true, [45382] = true, [57267] = true, [57275] = true, [64312] = true, - [64279] = true, [50598] = true, [59480] = true, [59496] = true, [56973] = true, - [56989] = true, [57005] = true, [57021] = true, [50619] = true, [50618] = true, - [65245] = true, [50617] = true, [64255] = true, [64271] = true, [64287] = true, - [64303] = true, [57165] = true, [57181] = true, [57708] = true, [57213] = true, - [57229] = true, [57245] = true, [57261] = true, [57277] = true, [57253] = true, - [71015] = true, [71101] = true, [71102] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ----ENCHANTING - --------------------------------------------------------------------------------------- - [46578] = true, [25125] = true, [13612] = true, [13620] = true, [13628] = true, - [13640] = true, [13644] = true, [13648] = true, [59625] = true, [13700] = true, - [17181] = true, [27920] = true, [27960] = true, [28016] = true, [45765] = true, - [14810] = true, [63746] = true, [13836] = true, [20008] = true, [20032] = true, - [13868] = true, [13421] = true, [13948] = true, [27905] = true, [27945] = true, - [13501] = true, [7786] = true, [7788] = true, [13529] = true, [32664] = true, - [44506] = true, [25127] = true, [20025] = true, [20033] = true, [13617] = true, - [64579] = true, [60619] = true, [13657] = true, [13693] = true, [27914] = true, - [44555] = true, [27954] = true, [27962] = true, [14807] = true, [32665] = true, - [7421] = true, [13817] = true, [25072] = true, [44492] = true, [44524] = true, - [7443] = true, [44556] = true, [25128] = true, [20026] = true, [7457] = true, - [13378] = true, [34001] = true, [13917] = true, [13933] = true, [13937] = true, - [13941] = true, [44621] = true, [28003] = true, [28027] = true, [13522] = true, - [13538] = true, [25081] = true, [44494] = true, [20011] = true, [25129] = true, - [44590] = true, [47672] = true, [20051] = true, [13622] = true, [13626] = true, - [69412] = true, [60623] = true, [44383] = true, [13698] = true, [13702] = true, - [23804] = true, [44623] = true, [28004] = true, [28028] = true, [14293] = true, - [32667] = true, [13822] = true, [25082] = true, [44576] = true, [20028] = true, - [20036] = true, [13890] = true, [13898] = true, [60609] = true, [59619] = true, - [47898] = true, [7745] = true, [27957] = true, [13503] = true, [34006] = true, - [7793] = true, [7795] = true, [59636] = true, [25083] = true, [20029] = true, - [13631] = true, [13655] = true, [7861] = true, [7863] = true, [62256] = true, - [13695] = true, [13858] = true, [44483] = true, [27968] = true, [7857] = true, - [27967] = true, [42615] = true, [27958] = true, [42613] = true, [25084] = true, - [20017] = true, [33992] = true, [34008] = true, [13663] = true, [60653] = true, - [44528] = true, [14809] = true, [27961] = true, [47901] = true, [7418] = true, - [7420] = true, [44488] = true, [7426] = true, [44616] = true, [13841] = true, - [44596] = true, [17180] = true, [7454] = true, [33993] = true, [34009] = true, - [27950] = true, [20031] = true, [13915] = true, [47900] = true, [13943] = true, - [13947] = true, [13945] = true, [13464] = true, [27927] = true, [7771] = true, - [20014] = true, [20030] = true, [27947] = true, [33994] = true, [28022] = true, - [60692] = true, [25130] = true, [34005] = true, [13794] = true, [7748] = true, - [44588] = true, [15596] = true, [7776] = true, [44584] = true, [13607] = true, - [13653] = true, [20020] = true, [70524] = true, [71692] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ---TAILORING - --------------------------------------------------------------------------------------- - [12055] = true, [12059] = true, [12071] = true, [46131] = true, [23664] = true, - [31433] = true, [31441] = true, [7624] = true, [26403] = true, [24902] = true, - [22866] = true, [56001] = true, [18411] = true, [18419] = true, [18451] = true, - [28208] = true, [6686] = true, [8766] = true, [23665] = true, [8786] = true, - [26747] = true, [56002] = true, [26763] = true, [26779] = true, [31434] = true, - [31450] = true, [60969] = true, [28480] = true, [22867] = true, [56003] = true, - [18404] = true, [18412] = true, [18420] = true, [12044] = true, [63924] = true, - [12056] = true, [12064] = true, [12080] = true, [12084] = true, [23666] = true, - [56004] = true, [26780] = true, [31459] = true, [7892] = true, [60971] = true, - [28481] = true, [22868] = true, [20848] = true, [56005] = true, [18405] = true, - [19435] = true, [26086] = true, [18437] = true, [18453] = true, [27659] = true, - [28210] = true, [40021] = true, [23667] = true, [26773] = true, [26781] = true, - [26759] = true, [8774] = true, [31460] = true, [24903] = true, [3755] = true, - [37882] = true, [3757] = true, [3758] = true, [50194] = true, [18446] = true, - [6692] = true, [28482] = true, [22869] = true, [18439] = true, [20849] = true, - [18440] = true, [2389] = true, [56007] = true, [18455] = true, [6521] = true, - [18445] = true, [18406] = true, [18414] = true, [18422] = true, [12045] = true, - [36318] = true, [18454] = true, [27660] = true, [24091] = true, [12065] = true, - [12069] = true, [12077] = true, [12081] = true, [12085] = true, [27724] = true, - [12093] = true, [40060] = true, [26087] = true, [26749] = true, [31373] = true, - [26750] = true, [26782] = true, [28205] = true, [28209] = true, [36686] = true, - [3813] = true, [2394] = true, [7629] = true, [18438] = true, [7633] = true, - [40023] = true, [49677] = true, [26407] = true, [18452] = true, [7643] = true, - [22870] = true, [26755] = true, [22902] = true, [3869] = true, [55993] = true, - [8789] = true, [3839] = true, [3841] = true, [3844] = true, [18407] = true, - [18415] = true, [3847] = true, [3848] = true, [3851] = true, [3852] = true, - [24092] = true, [3854] = true, [3856] = true, [3857] = true, [8760] = true, - [27725] = true, [8776] = true, [8780] = true, [8784] = true, [3865] = true, - [55994] = true, [3868] = true, [26783] = true, [3871] = true, [3872] = true, - [3873] = true, [31438] = true, [22759] = true, [12091] = true, [8804] = true, - [8772] = true, [18560] = true, [18447] = true, [44950] = true, [60993] = true, - [55899] = true, [55898] = true, [55995] = true, [2385] = true, [21945] = true, - [6688] = true, [12066] = true, [18416] = true, [8465] = true, [12046] = true, - [18448] = true, [3915] = true, [24093] = true, [8489] = true, [2386] = true, - [12078] = true, [12082] = true, [60994] = true, [55900] = true, [2392] = true, - [2393] = true, [23662] = true, [2396] = true, [55996] = true, [2399] = true, - [26784] = true, [2402] = true, [2403] = true, [2406] = true, [31431] = true, - [3864] = true, [8782] = true, [37884] = true, [37883] = true, [26751] = true, - [50647] = true, [8802] = true, [8467] = true, [7893] = true, [40020] = true, - [41208] = true, [22813] = true, [41207] = true, [37873] = true, [2387] = true, - [55997] = true, [26085] = true, [8799] = true, [27658] = true, [8483] = true, - [3914] = true, [18401] = true, [56006] = true, [18441] = true, [18449] = true, - [28207] = true, [55769] = true, [18413] = true, [18421] = true, [46129] = true, - [2963] = true, [2964] = true, [12061] = true, [12086] = true, [23663] = true, - [26745] = true, [55998] = true, [3863] = true, [8764] = true, [31440] = true, - [31448] = true, [12089] = true, [6695] = true, [40024] = true, [60990] = true, - [50644] = true, [8793] = true, [46130] = true, [24901] = true, [3870] = true, - [31437] = true, [44958] = true, [55999] = true, [3845] = true, [6693] = true, - [3866] = true, [18456] = true, [18410] = true, [18418] = true, [2397] = true, - [18434] = true, [18450] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ----LEATHERWORKING - --------------------------------------------------------------------------------------- - [9198] = true, [23704] = true, [60996] = true, [35549] = true, [22921] = true, - [50958] = true, [10509] = true, [10525] = true, [19053] = true, [19085] = true, - [19101] = true, [2149] = true, [36349] = true, [2153] = true, [60997] = true, - [2159] = true, [2163] = true, [2165] = true, [35582] = true, [50959] = true, - [46132] = true, [23705] = true, [60998] = true, [22922] = true, [46133] = true, - [24121] = true, [19054] = true, [19070] = true, [19086] = true, [19102] = true, - [32465] = true, [32481] = true, [22331] = true, [35520] = true, [35584] = true, - [9207] = true, [6661] = true, [46134] = true, [23706] = true, [61000] = true, - [35521] = true, [35585] = true, [50962] = true, [10518] = true, [39997] = true, - [24122] = true, [19055] = true, [19087] = true, [19103] = true, [32466] = true, - [32482] = true, [36353] = true, [35522] = true, [35554] = true, [50963] = true, - [44953] = true, [46136] = true, [23707] = true, [61002] = true, [35523] = true, - [35555] = true, [35587] = true, [50964] = true, [46137] = true, [24123] = true, - [19072] = true, [19104] = true, [9064] = true, [9072] = true, [69386] = true, - [32499] = true, [36355] = true, [7133] = true, [35524] = true, [35588] = true, - [7153] = true, [9208] = true, [46138] = true, [23708] = true, [69388] = true, - [35525] = true, [35557] = true, [10487] = true, [10511] = true, [46139] = true, - [24124] = true, [19073] = true, [19089] = true, [32468] = true, [32500] = true, - [10647] = true, [28472] = true, [35526] = true, [35558] = true, [45117] = true, - [60622] = true, [23709] = true, [35527] = true, [3774] = true, [3778] = true, - [3780] = true, [40003] = true, [24125] = true, [19058] = true, [19074] = true, - [32485] = true, [32501] = true, [36359] = true, [3816] = true, [3818] = true, - [28473] = true, [35528] = true, [35560] = true, [9193] = true, [40004] = true, - [23710] = true, [8322] = true, [35529] = true, [35561] = true, [50970] = true, - [2881] = true, [10520] = true, [40005] = true, [10544] = true, [10552] = true, - [10560] = true, [19091] = true, [19107] = true, [32454] = true, [32502] = true, - [28474] = true, [35530] = true, [50971] = true, [62448] = true, [7953] = true, - [41157] = true, [36074] = true, [24846] = true, [35531] = true, [22928] = true, - [28219] = true, [41158] = true, [36075] = true, [32487] = true, [32503] = true, - [7126] = true, [9146] = true, [35532] = true, [35564] = true, [9194] = true, - [9202] = true, [24655] = true, [36076] = true, [24847] = true, [35533] = true, - [5244] = true, [10529] = true, [28220] = true, [19093] = true, [32456] = true, - [52733] = true, [2158] = true, [2160] = true, [2162] = true, [2166] = true, - [24848] = true, [35535] = true, [35567] = true, [28221] = true, [19094] = true, - [44359] = true, [57690] = true, [32457] = true, [32473] = true, [32489] = true, - [9147] = true, [35536] = true, [35568] = true, [9195] = true, [41163] = true, - [6703] = true, [24849] = true, [20853] = true, [10482] = true, [10490] = true, - [28222] = true, [10546] = true, [10554] = true, [41164] = true, [10570] = true, - [19095] = true, [57692] = true, [32458] = true, [10650] = true, [35538] = true, - [42731] = true, [24850] = true, [20854] = true, [44970] = true, [28223] = true, - [19048] = true, [19064] = true, [19080] = true, [57694] = true, [9148] = true, - [35540] = true, [35572] = true, [24851] = true, [20855] = true, [45100] = true, - [10531] = true, [28224] = true, [57696] = true, [10619] = true, [19081] = true, - [22727] = true, [35539] = true, [19079] = true, [10566] = true, [19065] = true, - [10574] = true, [19097] = true, [60647] = true, [3753] = true, [9065] = true, - [44343] = true, [3763] = true, [3767] = true, [3773] = true, [3775] = true, - [3777] = true, [3779] = true, [32455] = true, [24940] = true, [19050] = true, - [19082] = true, [23190] = true, [32461] = true, [60999] = true, [3817] = true, - [44344] = true, [9149] = true, [35544] = true, [9197] = true, [19077] = true, - [9060] = true, [19076] = true, [35573] = true, [40001] = true, [19066] = true, - [19090] = true, [19098] = true, [22711] = true, [57699] = true, [9059] = true, - [32480] = true, [64661] = true, [10562] = true, [40002] = true, [50936] = true, - [6705] = true, [9058] = true, [24703] = true, [22923] = true, [60645] = true, - [35577] = true, [2152] = true, [10556] = true, [10572] = true, [44770] = true, - [36077] = true, [19059] = true, [19075] = true, [35580] = true, [20648] = true, - [2169] = true, [60643] = true, [19088] = true, [6702] = true, [6704] = true, - [35543] = true, [7149] = true, [36078] = true, [36079] = true, [23703] = true, - [35534] = true, [57701] = true, [46135] = true, [19047] = true, [20649] = true, - [40006] = true, [3765] = true, [41156] = true, [3771] = true, [50956] = true, - [19061] = true, [20650] = true, [32467] = true, [35537] = true, [22926] = true, - [4096] = true, [19062] = true, [44768] = true, [35576] = true, [19063] = true, - [9062] = true, [9070] = true, [32495] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - -----ALCHEMY - --------------------------------------------------------------------------------------- - [53898] = true, [28579] = true, [17566] = true, [53771] = true, [7256] = true, - [53899] = true, [11452] = true, [11460] = true, [11468] = true, [3170] = true, - [3172] = true, [3174] = true, [3176] = true, [53836] = true, [53900] = true, - [28564] = true, [28580] = true, [54220] = true, [17551] = true, [53773] = true, - [53837] = true, [62213] = true, [54221] = true, [53774] = true, [53838] = true, - [6617] = true, [53902] = true, [28581] = true, [2331] = true, [2335] = true, - [2337] = true, [53775] = true, [53839] = true, [11453] = true, [7836] = true, - [24266] = true, [41500] = true, [53904] = true, [53936] = true, [28566] = true, - [28582] = true, [3452] = true, [3454] = true, [33732] = true, [17553] = true, - [22732] = true, [53777] = true, [53905] = true, [53937] = true, [33733] = true, - [62409] = true, [25146] = true, [41502] = true, [53938] = true, [28551] = true, - [28567] = true, [28583] = true, [62410] = true, [7181] = true, [17570] = true, - [17634] = true, [53779] = true, [7257] = true, [53939] = true, [11478] = true, - [17187] = true, [53812] = true, [28552] = true, [28568] = true, [28584] = true, - [60366] = true, [57425] = true, [17635] = true, [53781] = true, [60367] = true, - [4508] = true, [53782] = true, [24365] = true, [6618] = true, [53942] = true, - [28569] = true, [28585] = true, [29688] = true, [57427] = true, [17556] = true, - [17572] = true, [17636] = true, [53783] = true, [11479] = true, [7837] = true, - [7841] = true, [53784] = true, [24366] = true, [53848] = true, [28554] = true, - [28570] = true, [28586] = true, [58868] = true, [33741] = true, [24367] = true, - [28555] = true, [28571] = true, [17574] = true, [17638] = true, [7258] = true, - [11448] = true, [11456] = true, [11464] = true, [11480] = true, [3171] = true, - [3173] = true, [3175] = true, [24368] = true, [28572] = true, [28588] = true, - [45061] = true, [66658] = true, [17559] = true, [17575] = true, [66659] = true, - [66660] = true, [63732] = true, [28573] = true, [66662] = true, [17560] = true, - [2330] = true, [2332] = true, [2334] = true, [66663] = true, [11457] = true, - [11465] = true, [11473] = true, [66664] = true, [3449] = true, [3451] = true, - [3453] = true, [17561] = true, [17577] = true, [28543] = true, [28575] = true, - [7179] = true, [17562] = true, [17578] = true, [7255] = true, [7259] = true, - [11458] = true, [11466] = true, [38962] = true, [53776] = true, [12609] = true, - [53780] = true, [60893] = true, [58871] = true, [3448] = true, [3450] = true, - [3447] = true, [4942] = true, [28576] = true, [15833] = true, [17576] = true, - [41503] = true, [60350] = true, [41501] = true, [17563] = true, [42736] = true, - [54213] = true, [41458] = true, [6624] = true, [39636] = true, [28577] = true, - [32765] = true, [38070] = true, [17564] = true, [17580] = true, [53895] = true, - [11451] = true, [39637] = true, [28546] = true, [28562] = true, [28578] = true, - [60354] = true, [32766] = true, [17565] = true, [22808] = true, [39639] = true, - [60355] = true, [56519] = true, - --------------------------------------------------------------------------------------- - - --------------------------------------------------------------------------------------- - ----ENGINEERING - --------------------------------------------------------------------------------------- - [23081] = true, [12586] = true, [12594] = true, [12622] = true, [30347] = true, - [44391] = true, [30547] = true, [56464] = true, [12754] = true, [12758] = true, - [23489] = true, [23082] = true, [8243] = true, [9269] = true, [30316] = true, - [30332] = true, [12906] = true, [8339] = true, [26420] = true, [56514] = true, - [39971] = true, [12599] = true, [12603] = true, [12607] = true, [43676] = true, - [12619] = true, [54998] = true, [30349] = true, [56468] = true, [12755] = true, - [12759] = true, [63750] = true, [39973] = true, [56465] = true, [56469] = true, - [30318] = true, [30334] = true, [55016] = true, [12903] = true, [54793] = true, - [19795] = true, [8895] = true, [19819] = true, [30558] = true, [39895] = true, - [23069] = true, [23077] = true, [12596] = true, [30303] = true, [56471] = true, - [12624] = true, [19796] = true, [56472] = true, [12760] = true, [63770] = true, - [23070] = true, [23078] = true, [61471] = true, [30304] = true, [30312] = true, - [12908] = true, [12597] = true, [3930] = true, [24356] = true, [67839] = true, - [67326] = true, [56474] = true, [30560] = true, [30568] = true, [30314] = true, - [3929] = true, [56475] = true, [19830] = true, [3946] = true, [54736] = true, - [30563] = true, [24357] = true, [30337] = true, [12591] = true, [19814] = true, - [60866] = true, [12716] = true, [23071] = true, [23079] = true, [12585] = true, - [3923] = true, [3925] = true, [30305] = true, [12621] = true, [30329] = true, - [3931] = true, [3932] = true, [3933] = true, [3936] = true, [3937] = true, - [3938] = true, [3939] = true, [3941] = true, [56473] = true, [3944] = true, - [3945] = true, [3947] = true, [54999] = true, [3949] = true, [3950] = true, - [26417] = true, [12717] = true, [3954] = true, [3955] = true, [3957] = true, - [3958] = true, [3961] = true, [3962] = true, [3963] = true, [3965] = true, - [3966] = true, [3967] = true, [3968] = true, [3969] = true, [3971] = true, - [3972] = true, [3973] = true, [7430] = true, [3977] = true, [3978] = true, - [3979] = true, [19790] = true, [23080] = true, [12620] = true, [30309] = true, - [30346] = true, [12905] = true, [41307] = true, [8334] = true, [56460] = true, - [56476] = true, [12718] = true, [26418] = true, [19791] = true, [3960] = true, - [19815] = true, [13240] = true, [19831] = true, [30570] = true, [19799] = true, - [30306] = true, [30310] = true, [26011] = true, [36954] = true, [3919] = true, - [3920] = true, [19800] = true, [12617] = true, [30311] = true, [56463] = true, - [72952] = true, [72953] = true, - --------------------------------------------------------------------------------------- -} - -local function ItemLinkToID(link) - if not link then - return - end - local _, _, id_num = string.find(link,"item:(%d+):") - - if id_num then - return tonumber(id_num) - end -end - - -local function LoadRecipe() - local recipe_list = private.recipe_list - - if addon.db.profile.autoloaddb then - for idx, prof in pairs(PROFESSIONS) do - addon:InitializeRecipe(prof) - end - end - return recipe_list - -end - -------------------------------------------------------------------------------- --- Creates a reverse lookup for a recipe list -------------------------------------------------------------------------------- -local GetReverseLookup -do - local reverse_lookup = {} - - function GetReverseLookup(recipe_list) - if not recipe_list then - addon:Print(L["DATAMINER_NODB_ERROR"]) - return - end - twipe(reverse_lookup) - - for i in pairs(recipe_list) do - --if t[recipe_list[i].name] then addon:Print("Dupe: " .. i) end - reverse_lookup[recipe_list[i].name] = i - end - return reverse_lookup - end - -end - -------------------------------------------------------------------------------- --- Tooltip for data-mining. -------------------------------------------------------------------------------- -local ARLDatamineTT = CreateFrame("GameTooltip", "ARLDatamineTT", UIParent, "GameTooltipTemplate") - -do - -- Tables used in all the Scan functions within this do block. -Torhal - local info, output = {}, {} - - --- Function to compare the skill levels of a trainers recipes with those in the ARL database. - -- @name AckisRecipeList:ScanSkillLevelData - -- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured. - -- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer. Compares the skill levels between the two. - function addon:ScanSkillLevelData(autoscan) - if not IsTradeskillTrainer() then - if not autoscan then - self:Print(L["DATAMINER_SKILLLEVEL_ERROR"]) - end - return - end - local recipe_list = LoadRecipe() -- Get internal database - - if not recipe_list then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - -- Get the initial trainer filters - local avail = GetTrainerServiceTypeFilter("available") - local unavail = GetTrainerServiceTypeFilter("unavailable") - local used = GetTrainerServiceTypeFilter("used") - - -- Clear the trainer filters - SetTrainerServiceTypeFilter("available", 1) - SetTrainerServiceTypeFilter("unavailable", 1) - SetTrainerServiceTypeFilter("used", 1) - - twipe(info) - - -- Get the skill levels from the trainer - for i = 1, GetNumTrainerServices(), 1 do - local name = GetTrainerServiceInfo(i) - local _, skilllevel = GetTrainerServiceSkillReq(i) - - if not skilllevel then - skilllevel = 0 - end - info[name] = skilllevel - end - local found = false - - twipe(output) - - for i in pairs(recipe_list) do - local i_name = recipe_list[i].name - - if info[i_name] and info[i_name] ~= recipe_list[i].skill_level then - found = true - tinsert(output, L["DATAMINER_SKILLELVEL"]:format(i_name, recipe_list[i].skill_level, info[i_name])) - end - end - tinsert(output, "Trainer Skill Level Scan Complete.") - - if found then - self:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end - -- Reset the filters to what they were before - SetTrainerServiceTypeFilter("available", avail or 0) - SetTrainerServiceTypeFilter("unavailable", unavail or 0) - SetTrainerServiceTypeFilter("used", used or 0) - end - - local teach, noteach = {}, {} - - --- Function to compare which recipes are available from a trainer and compare with the internal ARL database. - -- @name AckisRecipeList:ScanTrainerData - -- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured. - -- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer. - -- Compares the acquire information of the ARL database with what is available on the trainer. - function addon:ScanTrainerData(autoscan) - if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then -- Make sure the target exists and is a NPC - if not autoscan then - self:Print(L["DATAMINER_TRAINER_NOTTARGETTED"]) - end - return - end - local targetname = UnitName("target") -- Get its name - local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16) -- Get the NPC ID - - if not IsTradeskillTrainer() then -- Are we at a trade skill trainer? - if not autoscan then - self:Print(L["DATAMINER_SKILLLEVEL_ERROR"]) - end - return - end - local recipe_list = LoadRecipe() -- Get internal database - - if not recipe_list then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - - -- Get the initial trainer filters - local avail = GetTrainerServiceTypeFilter("available") - local unavail = GetTrainerServiceTypeFilter("unavailable") - local used = GetTrainerServiceTypeFilter("used") - - -- Clear the trainer filters - SetTrainerServiceTypeFilter("available", 1) - SetTrainerServiceTypeFilter("unavailable", 1) - SetTrainerServiceTypeFilter("used", 1) - - if GetNumTrainerServices() == 0 then - self:Print("Warning: Trainer is bugged, reporting 0 trainer items.") - end - twipe(info) - - -- Get all the names of recipes from the trainer - for i = 1, GetNumTrainerServices(), 1 do - local name = GetTrainerServiceInfo(i) - info[name] = true - end - twipe(teach) - twipe(noteach) - twipe(output) - - -- Dump out trainer info - tinsert(output, L["DATAMINER_TRAINER_INFO"]:format(targetname, targetID)) - - local teachflag = false - local noteachflag = false - - for i in pairs(recipe_list) do - local recipe = recipe_list[i] - local i_name = recipe.name - local acquire = recipe["acquire_data"] - - local train_data = acquire[A.TRAINER] - - if info[i_name] then - local found = false - - if train_data then - for id_num in pairs(train_data) do - if id_num == targetID then - found = true - break - end - end - end - - if not found then - tinsert(teach, i) - teachflag = true - - if not recipe:IsFlagged("common1", "TRAINER") then - tinsert(output, ": Trainer flag needs to be set.") - end - end - -- Trainer does not teach this recipe - else - local found = false - - if train_data then - for id_num in pairs(train_data) do - if id_num == targetID then - found = true - break - end - end - end - - if found then - noteachflag = true - tinsert(noteach, i) - end - end - end - - if teachflag then - tinsert(output, "Missing entries (need to be added):") - tsort(teach) - - for i in ipairs(teach) do - tinsert(output, L["DATAMINER_TRAINER_TEACH"]:format(teach[i], recipe_list[teach[i]].name)) - end - end - - if noteachflag then - tinsert(output, "Extra entries (need to be removed):") - tsort(noteach) - - for i in ipairs(noteach) do - tinsert(output, L["DATAMINER_TRAINER_NOTTEACH"]:format(noteach[i], recipe_list[noteach[i]].name)) - end - end - tinsert(output, "Trainer Acquire Scan Complete.") - tinsert(output, "If you're doing an engineering scan, there may be some goggles listed as extra. These goggles ONLY show up for those classes who can make them, so they may be false positives.") - - if teachflag or noteachflag then - self:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end - -- Reset the filters to what they were before - SetTrainerServiceTypeFilter("available", avail or 0) - SetTrainerServiceTypeFilter("unavailable", unavail or 0) - SetTrainerServiceTypeFilter("used", used or 0) - end -end -- do - ---- Generates tradeskill links for all professions so you can scan them for completeness. --- @name AckisRecipeList:GenerateLinks --- @return Generates tradeskill links with all recipes. Used for testing to see if a recipe is missing from the database or not. -function addon:GenerateLinks() - -- This code adopted from Gnomish Yellow Pages with permission - - local guid = UnitGUID("player") - local playerGUID = string.gsub(guid, "0x0+", "") - - -- Listing of all tradeskill professions - local tradelist = {51304, 51300, 51313, 51306, 45363, 51311, 51302, 51309, 51296, 45542} - ---[[ - local encodingLength = floor((#recipeList+5) / 6) - - local encodedString = string.rep("/", encodingLength) -]]-- - local bitmap = {} - bitmap[45542] = "8bffAA" -- First Aid 100% 17/17 recipes - bitmap[51296] = "2/6///7///9f///7//////////g///B" -- Cooking 98.2% 166/169 recipes - --bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/TolD" -- Engineering (53) - bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/Tol3B" -- Engineering - bitmap[51302] = "e+//ff////d//u//v//n+vv7/+ujr7/9////bg/+////f344//dA4I8j/X//B4/vu5/////////////////nvA8/M8/D" -- Leatherworking 85.4% 451/528 recipes - bitmap[51304] = "2//v//////f////3//v///////5//////////9/////v" -- Alchemy 100% 251/251 recipes - bitmap[51300] = "2//////f7fM//f/f53/+//7///ze8c6q/f9///P2/////m4BAA2XIG+dFA8//PC////4//z//////////Pwvy//H" -- Blacksmithing 82.9% 413/498 recipes - bitmap[51309] = "4//+/+5a79rv7/vx2/65t3nZ3f33N33LJq/z54Hx//mK7w1GQgFA+AQ4/////7//7//9//2wD" -- Tailoring 74.3% 303/408 recipes - bitmap[51311] = "8//3////fzj//u//////v/7///9///33////////Pw////////////////////////3///////////////////////////D" -- Jewelcrafting 97.5% 540/554 recipes - bitmap[45363] = "g////7////3///////////////////////////////////////////////////fHM+3dqhGYa0f" --Inscription 92.5% 407/440 recipes - bitmap[51313] = "4//////////7///////////w//+//9/n7///////3f//////ZsD" -- Enchanting 94.3% 279/296 recipes - - for i in pairs(tradelist) do - - local tradeName = GetSpellInfo(tradelist[i]) - local tradelink = {} - tradelink[1] = "|cffffd000|Htrade:" - tradelink[2] = tradelist[i] - tradelink[3] = ":450:450:" - tradelink[4] = playerGUID - tradelink[5] = ":" - tradelink[6] = bitmap[tradelist[i]] - tradelink[7] = "|h[" - tradelink[8] = tradeName - tradelink[9] = "]|h|r" - - if (bitmap[tradelist[i]]) then - self:Print(tconcat(tradelink, "")) - else - self:Print("There currently is not a generated tradeskill link for: " .. tradeName) - end - -- /script DEFAULT_CHAT_FRAME:AddMessage(string.gsub(GetTradeSkillListLink(), "\124", "\124\124")) - end - -end - -------------------------------------------------------------------------------- ---- Scans the items in the specified profession -------------------------------------------------------------------------------- -do - local ORDERED_PROFESSIONS = private.ordered_professions - - local recipe_list = {} - local output = {} - - local function Sort_AscID(a, b) - local reca, recb = private.recipe_list[a], private.recipe_list[b] - - return reca.spell_id < recb.spell_id - end - - local function SortRecipeList() - local sorted_recipes = addon.sorted_recipes - twipe(sorted_recipes) - - for n, v in pairs(recipe_list) do - tinsert(sorted_recipes, n) - end - table.sort(sorted_recipes, Sort_AscID) - end - - local function ProfessionScan(prof_name) - local master_list = LoadRecipe() - - if not master_list then - addon:Print(L["DATAMINER_NODB_ERROR"]) - return - end - twipe(recipe_list) - - if prof_name == private.professions["Smelting"]:lower() then - prof_name = private.mining_name:lower() - end - - for i in pairs(master_list) do - local prof = string.lower(master_list[i].profession) - - if prof and prof == prof_name then - recipe_list[i] = master_list[i] - end - end - SortRecipeList() - twipe(output) - - -- Parse the entire recipe database - for index, id in ipairs(addon.sorted_recipes) do - local ttscantext = addon:TooltipScanRecipe(id, false, true) - - if ttscantext and ttscantext ~= "" then - tinsert(output, ttscantext) - end - end - - if #output == 0 then - addon:Debug("ProfessionScan(): output is empty.") - end - addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) - ARLDatamineTT:Hide() - end - - --- Parses all recipes for a specified profession, scanning their tool tips. - -- @name AckisRecipeList:ScanProfession - -- @usage AckisRecipeList:ScanProfession("first aid") - -- @param prof_name The profession name or the spell ID of it, which you wish to scan. - -- @return Recipes in the given profession have their tooltips scanned. - function addon:ScanProfession(prof_name) - if type(prof_name) == "number" then - prof_name = GetSpellInfo(prof_name) - end - - local found = false - prof_name = string.lower(prof_name) - - local scan_all = prof_name == "all" - - if not scan_all then - for idx, name in ipairs(ORDERED_PROFESSIONS) do - if prof_name == name:lower() then - found = true - break - end - end - - if not found then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - - ProfessionScan(prof_name) - else - for idx, name in ipairs(ORDERED_PROFESSIONS) do - ProfessionScan(name:lower()) - end - end - end - - local FILTER_STRINGS = private.filter_strings - local ACQUIRE_STRINGS = private.acquire_strings - local REP_LEVELS = private.rep_level_strings - local FACTION_NAMES = private.faction_strings - local Q = private.item_quality_names - local V = private.game_version_names - - local NUM_FILTER_FLAGS = 128 - - local FUNCTION_FORMATS = { - [A.TRAINER] = "self:AddRecipeTrainer(%d, %s)", - [A.VENDOR] = "self:AddRecipeVendor(%d, %s)", - [A.MOB_DROP] = "self:AddRecipeMobDrop(%d, %s)", - [A.WORLD_DROP] = "self:AddRecipeWorldDrop(%d, %s)", - [A.QUEST] = "self:AddRecipeQuest(%d, %s)", - } - - local function RecipeDump(id, single) - local recipe = private.recipe_list[id or 1] - - if single and not recipe then - addon:Print("Invalid recipe ID.") - return - end - local flag_string - local specialty = not recipe.specialty and "" or (", "..recipe.specialty) - - tinsert(output, string.format("-- %s -- %d", recipe.name, recipe.spell_id)) - tinsert(output, string.format("AddRecipe(%d, %d, %s, Q.%s, V.%s, %d, %d, %d, %d%s)", - recipe.spell_id, recipe.skill_level, tostring(recipe.item_id), Q[recipe.quality], V[recipe.genesis], - recipe.optimal_level, recipe.medium_level, recipe.easy_level, recipe.trivial_level, specialty)) - - for table_index, bits in ipairs(private.bit_flags) do - for flag_name, flag in pairs(bits) do - local bitfield = recipe.flags[private.flag_members[table_index]] - - if bitfield and bit.band(bitfield, flag) == flag then - if not flag_string then - flag_string = "F."..FILTER_STRINGS[private.filter_flags[flag_name]] - else - flag_string = flag_string..", ".."F."..FILTER_STRINGS[private.filter_flags[flag_name]] - end - end - end - end - tinsert(output, string.format("self:AddRecipeFlags(%d, %s)", recipe.spell_id, flag_string)) - - flag_string = nil - - for acquire_type, acquire_info in pairs(recipe.acquire_data) do - if acquire_type == A.REPUTATION then - for rep_id, rep_info in pairs(acquire_info) do - local faction_string = FACTION_NAMES[rep_id] - - if not faction_string then - faction_string = rep_id - addon:Printf("Recipe %d (%s) - no string for faction %d", recipe.spell_id, recipe.name, rep_id) - else - faction_string = "FAC."..faction_string - end - - for rep_level, level_info in pairs(rep_info) do - local rep_string = "REP."..REP_LEVELS[rep_level or 1] - local values - - for vendor_id in pairs(level_info) do - values = values and (values..", "..vendor_id) or vendor_id - end - tinsert(output, string.format("self:AddRecipeRepVendor(%d, %s, %s, %s)", recipe.spell_id, faction_string, rep_string, values)) - end - end - elseif FUNCTION_FORMATS[acquire_type] then - local values - - for id_num in pairs(acquire_info) do - local saved_id = (type(id_num) == "string" and ("\""..id_num.."\"") or id_num) - values = values and (values..", "..saved_id) or saved_id - end - tinsert(output, string.format(FUNCTION_FORMATS[acquire_type], recipe.spell_id, values)) - else - for id_num in pairs(acquire_info) do - if not flag_string then - flag_string = "A."..ACQUIRE_STRINGS[acquire_type]..", "..(type(id_num) == "string" and ("\""..id_num.."\"") or id_num) - else - flag_string = flag_string..", ".."A."..ACQUIRE_STRINGS[acquire_type]..", "..(type(id_num) == "string" and ("\""..id_num.."\"") or id_num) - end - end - end - end - - if flag_string then - tinsert(output, string.format("self:AddRecipeAcquire(%d, %s)", recipe.spell_id, flag_string)) - end - tinsert(output, "") - end - - local function ProfessionDump(prof_name) - local master_list = LoadRecipe() - - if not master_list then - addon:Print(L["DATAMINE_NODB_ERROR"]) - return - end - twipe(recipe_list) - - if prof_name == private.professions["Smelting"]:lower() then - prof_name = private.mining_name:lower() - end - for i in pairs(master_list) do - local prof = string.lower(master_list[i].profession) - - if prof and prof == prof_name then - recipe_list[i] = master_list[i] - end - end - SortRecipeList() - twipe(output) - - for index, id in ipairs(addon.sorted_recipes) do - RecipeDump(id, false) - end - addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end - - function addon:DumpRecipe(id_num) - twipe(output) - RecipeDump(id_num, true) - addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end - - function addon:DumpProfession(prof_name) - if type(prof_name) == "number" then - prof_name = GetSpellInfo(prof_name) - end - - local found = false - prof_name = string.lower(prof_name) - - local scan_all = prof_name == "all" - - if not scan_all then - for idx, name in ipairs(ORDERED_PROFESSIONS) do - if prof_name == name:lower() then - found = true - break - end - end - - if not found then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - ProfessionDump(prof_name) - else - for idx, name in ipairs(ORDERED_PROFESSIONS) do - ProfessionDump(name:lower()) - end - end - end -end -- do - -local RECIPE_TYPES = { - -- JC - ["design: "] = true, - -- LW or Tailoring - ["pattern: "] = true, - -- Alchemy or Cooking - ["recipe: "] = true, - -- BS - ["plans: "] = true, - -- Enchanting - ["formula: "] = true, - -- Engineering - ["schematic: "] = true, - -- First Aid - ["manual: "] = true, - - ["alchemy: "] = true, - ["blacksmithing: "] = true, - ["cooking: "] = true, - ["enchanting: "] = true, - ["engineering: "] = true, - ["first aid: "] = true, - ["inscription: "] = true, - ["jewelcrafting: "] = true, - ["leatherworking: "] = true, - ["tailoring: "] = true, -} - ---- Scans the items on a vendor, determining which recipes are available if any and compares it with the database entries --- @name AckisRecipeList:ScanVendor --- @usage AckisRecipeList:ScanVendor() --- @return Obtains all the vendor information on tradeskill recipes and attempts to compare the current vendor with the internal database -do - local output = {} - - function addon:ScanVendor() - if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then -- Make sure the target exists and is a NPC - self:Print(L["DATAMINER_VENDOR_NOTTARGETTED"]) - return - end - local recipe_list = LoadRecipe() -- Get internal database - - if not recipe_list then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - local targetname = UnitName("target") -- Get its name - local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16) -- Get the NPC ID - local added = false - - twipe(output) - - tinsert(output, "Vendor Name: "..targetname.." NPC ID: "..targetID) - -- Parse all the items on the merchant - for i = 1, GetMerchantNumItems(), 1 do - local name, _, _, _, numAvailable = GetMerchantItemInfo(i) - - if name then - -- Lets scan recipes only on vendors - local matchtext = string.match(name, "%a+: ") - - -- Check to see if we're dealing with a recipe - if matchtext and RECIPE_TYPES[string.lower(matchtext)] then - local item_link = GetMerchantItemLink(i) - local item_id = ItemLinkToID(item_link) - local spell_id = RECIPE_TO_SPELL_MAP[item_id] - - if spell_id then - local ttscantext = addon:TooltipScanRecipe(spell_id, true, true) - - if ttscantext and ttscantext ~= "" then - added = true - tinsert(output, ttscantext) - end - - -- Check the database to see if the vendor is listed as an acquire method. - local acquire = recipe_list[spell_id]["acquire_data"] - local vendor_data = acquire[A.VENDOR] - local rep_data = acquire[A.REPUTATION] - local found = false - - if vendor_data then - for id_num in pairs(vendor_data) do - if id_num == targetID then - found = true - break - end - end - elseif rep_data then - for id_num in pairs(rep_data) do - if id_num == targetID then - found = true - break - end - end - end - - if not found then - added = true - tinsert(output, string.format("Vendor ID missing from \"%s\" %d.", recipe_list[spell_id].name, spell_id)) - end - else - --@debug@ - added = true - tinsert(output, "Spell ID not found for: " .. name) - --@end-debug@ - end - end - end - end - - if added then - self:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end - ARLDatamineTT:Hide() - end -end -- do - ---- Parses all the recipes in the database, and scanning their tooltips. --- @name AckisRecipeList:TooltipScanDatabase --- @usage AckisRecipeList:TooltipScanDatabase() --- @return Entire recipe database has its tooltips scanned. -do - local output = {} - - function addon:TooltipScanDatabase() - -- Get internal database - local recipe_list = LoadRecipe() - - if (not recipe_list) then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - twipe(output) - - -- Parse the entire recipe database - for i in pairs(recipe_list) do - - local ttscantext = addon:TooltipScanRecipe(i, false, true) - if (ttscantext) then - tinsert(output, ttscantext) - end - end - self:DisplayTextDump(nil, nil, tconcat(output, "\n")) - end -end -- do ---- Parses a specific recipe in the database, and scanning its tooltip --- @name AckisRecipeList:TooltipScanRecipe --- @param spell_id The [[[http://www.wowwiki.com/SpellLink|Spell ID]]] of the recipe being added to the database --- @param is_vendor Boolean to determine if we're viewing a vendor or not --- @param is_largescan Boolean to determine if we're doing a large scan --- @return Recipe has its tooltips scanned - - --- Table to store scanned information. Wiped and re-used every scan. -local scan_data = {} - -do - --------------------------------------------------------------------------------------------------------- - ----This table, DO_NOT_SCAN, contains itemid's that will not cache on the servers - --------------------------------------------------------------------------------------------------------- - - local DO_NOT_SCAN = { - ------------------------------------------------------------------------------- - --Leatherworking - ------------------------------------------------------------------------------- - [35214] = true, [32434] = true, [15769] = true, - [32431] = true, [32432] = true, [35215] = true, [35521] = true, - [35520] = true, [35524] = true, [35517] = true, [35528] = true, - [35527] = true, [35523] = true, [35549] = true, [35218] = true, - [35217] = true, [35216] = true, [35546] = true, [35541] = true, [15756] = true, - [15777] = true, [32433] = true, [29729] = true, [29732] = true, [32744] = true, - [15773] = true, [30301] = true, [15745] = true, [35302] = true, [15774] = true, - - ------------------------------------------------------------------------------- - --Tailoring - ------------------------------------------------------------------------------- - [14477] = true, [14485] = true, [30281] = true, [14478] = true, [14500] = true, - [32439] = true, [14479] = true, [32447] = true, [14480] = true, [32437] = true, - [14495] = true, [14505] = true, [35204] = true, [35205] = true, [35206] = true, - [14473] = true, [14488] = true, [14481] = true, - [35309] = true, [30280] = true, [14492] = true, [14491] = true, - - ------------------------------------------------------------------------------- - --Jewelcrafting - ------------------------------------------------------------------------------- - [23130] = true, [23140] = true, [23137] = true, [23131] = true, [23148] = true, - [35538] = true, [35201] = true, [35533] = true, [35200] = true, [23147] = true, - [23135] = true, [35203] = true, [35198] = true, [23152] = true, [23151] = true, - [23141] = true, [28596] = true, [28291] = true, [23153] = true, - - ------------------------------------------------------------------------------- - --Alchemy - ------------------------------------------------------------------------------- - [22925] = true, [13480] = true, [13481] = true, [13493] = true, [35295] = true, - [44568] = true, - - ------------------------------------------------------------------------------- - --Cooking - ------------------------------------------------------------------------------- - [39644] = true, - - ------------------------------------------------------------------------------- - --Blacksmithing - ------------------------------------------------------------------------------- - [32441] = true, [32443] = true, [12687] = true, [12714] = true, [12688 ] = true, - [35211] = true, [35209] = true, [35210] = true, [12706] = true, [7982] = true, - [12718] = true, [23621] = true, [35208] = true, [12716] = true, [23632] = true, - [23633] = true, [30324] = true, [23637] = true, [31393] = true,[22221] = true, - [12690] = true, [31394] = true,[31395] = true,[23630] = true,[23629] = true,[7978] = true, - [41120] = true, [12717] = true,[22219] = true,[23627] = true, - - ------------------------------------------------------------------------------- - --Engineering - ------------------------------------------------------------------------------- - [35196] = true, [21734] = true, [18292] = true, [21727] = true, [21735] = true, [16053] = true, [21729] = true, - [16047] = true,[21730] = true,[21731] = true,[21732] = true,[4411] = true, [21733] = true, [21728] = true, - [35186] = true, [18655] = true, - - ------------------------------------------------------------------------------- - --Enchanting - ------------------------------------------------------------------------------- - [16222] = true, [20734] = true, [20729] = true, [20731] = true, [16246] = true, - } - - local output = {} - - function addon:TooltipScanRecipe(spell_id, is_vendor, is_largescan) - local recipe_list = LoadRecipe() - - if not recipe_list then - self:Print(L["DATAMINER_NODB_ERROR"]) - return - end - local recipe = recipe_list[spell_id] - - if not recipe then - self:Debug("Spell ID %d does not exist in the database.", tonumber(spell_id)) - return - end - local recipe_name = recipe.name - local game_vers = recipe.genesis - - twipe(output) - - if not game_vers then - tinsert(output, "No expansion information: " .. tostring(spell_id) .. " " .. recipe_name) - elseif game_vers > private.game_versions.WOTLK then - tinsert(output, "Expansion information too high: " .. tostring(spell_id) .. " " .. recipe_name) - end - local optimal = recipe.optimal_level - local medium = recipe.medium_level - local easy = recipe.easy_level - local trivial = recipe.trivial_level - local skill_level = recipe.skill_level - - if not optimal then - tinsert(output, "No skill level information: " .. tostring(spell_id) .. " " .. recipe_name) - else - -- Highest level is greater than the skill of the recipe - if optimal > skill_level then - tinsert(output, "Skill Level Error (optimal_level > skill_level): " .. tostring(spell_id) .. " " .. recipe_name) - elseif optimal < skill_level then - tinsert(output, "Skill Level Error (optimal_level < skill_level): " .. tostring(spell_id) .. " " .. recipe_name) - end - - -- Level info is messed up - if optimal > medium or optimal > easy or optimal > trivial or medium > easy or medium > trivial or easy > trivial then - tinsert(output, "Skill Level Error: " .. tostring(spell_id) .. " " .. recipe_name) - end - end - local recipe_link = recipe.spell_link - - if not recipe_link then - if recipe.profession ~= GetSpellInfo(53428) then -- Lets hide this output for runeforging. - self:Printf("Missing spell_link for ID %d (%s).", spell_id, recipe_name) - end - return - end - ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE") - GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent) - - ARLDatamineTT:SetHyperlink(recipe_link) - - -- Check to see if this is a recipe tooltip. - local text = string.lower(_G["ARLDatamineTTTextLeft1"]:GetText()) - local match_text = string.match(text, "%a+: ") - - if not RECIPE_TYPES[match_text] and not (string.find(text, "smelt") or string.find(text, "sunder") or string.find(text, "shatter")) then - ARLDatamineTT:Hide() - return - end - local reverse_lookup = GetReverseLookup(recipe_list) - - local item_id = SPELL_TO_RECIPE_MAP[spell_id] - - wipe(scan_data) - - if item_id and not DO_NOT_SCAN[item_id] then - local item_name, item_link, item_quality = GetItemInfo(item_id) - - if item_name then - scan_data.quality = item_quality - - ARLDatamineTT:SetHyperlink(item_link) - self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor) - else - local querier_string = _G.Querier and string.format(" To fix: /iq %d", item_id) or "" - - tinsert(output, string.format("%s: %d", recipe.name, spell_id)) - tinsert(output, string.format(" Recipe item not in cache.%s", querier_string)) - end - elseif not item_id then - -- We are dealing with a recipe that does not have an item to learn it from. - -- Lets check the recipe flags to see if we have a data error and the item should exist - if not recipe:IsFlagged("common1", "RETIRED") - and (recipe:IsFlagged("common1", "VENDOR") or recipe:IsFlagged("common1", "INSTANCE") or recipe:IsFlagged("common1", "RAID")) then - tinsert(output, string.format("%s: %d", recipe.name, spell_id)) - tinsert(output, " No match found in the SPELL_TO_RECIPE_MAP table.") - end - end - ARLDatamineTT:Hide() - - -- Add the flag scan to the table if it's not nil - local results = self:PrintScanResults() - - if results then - tinsert(output, results) - end - - if is_largescan then - return tconcat(output, "\n") - else - self:Print(tconcat(output, "\n")) - end - end -end -- do - -------------------------------------------------------------------------------- --- Tooltip-scanning code -------------------------------------------------------------------------------- -do - local SPECIALTY_TEXT = { - ["requires spellfire tailoring"] = 26797, - ["requires mooncloth tailoring"] = 26798, - ["requires shadoweave tailoring"] = 26801, - ["requires dragonscale leatherworking"] = 10657, - ["requires elemental leatherworking"] = 10659, - ["requires tribal leatherworking"] = 10661, - ["requires gnomish engineer"] = 20219, - ["requires goblin engineer"] = 20222, - ["requires armorsmith"] = 9788, - ["requires master axesmith"] = 17041, - ["requires master hammersmith"] = 17040, - ["requires master swordsmith"] = 17039, - ["requires weaponsmith"] = 9787, - } - - local FACTION_TEXT = { - ["thorium brotherhood"] = 98, - ["zandalar tribe"] = 100, - ["argent dawn"] = 96, - ["timbermaw hold"] = 99, - ["cenarion circle"] = 97, - ["the aldor"] = 101, - ["the consortium"] = 105, - ["the scryers"] = 110, - ["the sha'tar"] = 111, - ["the mag'har"] = 108, - ["cenarion expedition"] = 103, - ["honor hold"] = 104, - ["thrallmar"] = 104, - ["the violet eye"] = 114, - ["sporeggar"] = 113, - ["kurenai"] = 108, - ["keepers of time"] = 106, - ["the scale of the sands"] = 109, - ["lower city"] = 107, - ["ashtongue deathsworn"] = 102, - ["alliance vanguard"] = 131, - ["valiance expedition"] = 126, - ["horde expedition"] = 130, - ["the taunka"] = 128, - ["the hand of vengeance"] = 127, - ["explorers' league"] = 125, - ["the kalu'ak"] = 120, - ["shattered sun offensive"] = 112, - ["warsong offensive"] = 129, - ["kirin tor"] = 118, - ["the wyrmrest accord"] = 122, - ["knights of the ebon blade"] = 117, - ["frenzyheart tribe"] = 116, - ["the oracles"] = 121, - ["argent crusade"] = 115, - ["the sons of hodir"] = 119, - } - - local FACTION_LEVELS = { - ["neutral"] = 0, - ["friendly"] = 1, - ["honored"] = 2, - ["revered"] = 3, - ["exalted"] = 4, - } - - local CLASS_TYPES = { - ["Death Knight"] = 21, ["Druid"] = 22, ["Hunter"] = 23, - ["Mage"] = 24, ["Paladin"] = 25, ["Priest"] = 26, - ["Shaman"] = 27, ["Rogue"] = 28, ["Warlock"] = 29, - ["Warrior"] = 30, - } - - local ORDERED_CLASS_TYPES = { - [1] = "Death Knight", [2] = "Druid", [3] = "Hunter", - [4] = "Mage", [5] = "Paladin", [6] = "Priest", - [7] = "Shaman", [8] = "Rogue", [9] = "Warlock", - [10] = "Warrior", - } - - local ROLE_TYPES = { - ["dps"] = 51, ["tank"] = 52, ["healer"] = 53, - ["caster"] = 54, - } - - local ORDERED_ROLE_TYPES = { - [1] = "dps", [2] = "tank", [3] = "healer", - [4] = "caster", - } - - local ENCHANT_TO_ITEM = { - ["Cloak"] = "Back", - ["Ring"] = "Finger", - ["2H Weapon"] = "Two-Hand", - } - - local ITEM_TYPES = { - -- Armor types - ["Cloth"] = 56, ["Leather"] = 57, ["Mail"] = 58, - ["Plate"] = 59, ["Back"] = 60, ["Trinket"] = 61, - ["Finger"] = 62, ["Neck"] = 63, ["Shield"] = 64, - - -- Weapon types - ["One-Hand"] = 66, ["Two-Hand"] = 67, ["Axe"] = 68, - ["Sword"] = 69, ["Mace"] = 70, ["Polearm"] = 71, - ["Dagger"] = 72, ["Staff"] = 73, ["Wand"] = 74, - ["Thrown"] = 75, ["Bow"] = 76, ["CrossBow"] = 77, - ["Ammo"] = 78, ["Fist Weapon"] = 79, ["Gun"] = 80, - } - - local ORDERED_ITEM_TYPES = { - -- Armor types - [1] = "Cloth", [2] = "Leather", [3] = "Mail", - [4] = "Plate", [5] = "Back", [6] = "Trinket", - [7] = "Finger", [8] = "Neck", [9] = "Shield", - - -- Weapon types - [11] = "One-Hand", [12] = "Two-Hand", [13] = "Axe", - [14] = "Sword", [15] = "Mace", [16] = "Polearm", - [17] = "Dagger", [18] = "Staff", [19] = "Wand", - [20] = "Thrown", [21] = "Bow", [22] = "CrossBow", - [23] = "Ammo", [24] = "Fist Weapon", [25] = "Gun", - } - - --- Parses the mining tooltip for certain keywords, comparing them with the database flags - -- @name AckisRecipeList:ScanToolTip - -- @param name The name of the recipe - -- @param recipe_list Recipe database - -- @param reverse_lookup Reverse lookup database - -- @param is_vendor Boolean to indicate if we're scanning a vendor - -- @return Scans a tooltip, and outputs the missing or extra filter flags - function addon:ScanToolTip(name, recipe_list, reverse_lookup, is_vendor) - scan_data.match_name = name - scan_data.recipe_list = recipe_list - scan_data.reverse_lookup = reverse_lookup - scan_data.is_vendor = is_vendor - - -- Parse all the lines of the tooltip - for i = 1, ARLDatamineTT:NumLines(), 1 do - local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText() - local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText() - local text - - if text_r then - text = text_l .. " " .. text_r - else - text = text_l - end - - local text = string.lower(text) - - -- Check for recipe/item binding - -- The recipe binding is within the first few lines of the tooltip always - if string.match(text, "binds when picked up") then - if (i < 3) then - scan_data.recipe_bop = true - else - scan_data.item_bop = true - end - end - - -- Recipe Specialities - if SPECIALTY_TEXT[text] then - scan_data.specialty = SPECIALTY_TEXT[text] - end - - -- Recipe Reputations - local rep, replevel = string.match(text_l, "Requires (.+) %- (.+)") - - if rep and replevel and FACTION_TEXT[rep] then - scan_data.repid = FACTION_TEXT[rep] - scan_data.repidlevel = FACTION_LEVELS[replevel] - end - - -- Flag so that we don't bother checking for classes if we're sure of the class - -- AKA +spell hit == caster DPS only no matter what other stats are on it - -- Saves processing cycles and it won't cause the flags to be overwritten if a non-specific stat is found after - scan_data.verifiedclass = false - - if not scan_data.verifiedclass then - -- Certain stats can be considered for a specific role (aka spell hit == caster dps). - if string.match(text, "strength") and not string.match(text, "strength of the clefthoof") and not string.match(text, "set:") then - scan_data.dps = true - elseif string.match(text, "agility") then - scan_data.dps = true - elseif string.match(text, "spirit") then - scan_data.caster = true - scan_data.healer = true - elseif string.match(text, "spell power") then - scan_data.caster = true - scan_data.healer = true - elseif string.match(text, "spell crit") then - scan_data.caster = true - scan_data.healer = true - elseif string.match(text, "spell hit") then - scan_data.caster = true - scan_data.verifiedclass = true - elseif string.match(text, "spell penetration") then - scan_data.caster = true - scan_data.verifiedclass = true - elseif string.match(text, "mana per 5 sec.") or string.match(text, "mana every 5 seconds") then - scan_data.caster = true - scan_data.healer = true - elseif string.match(text, "attack power") then - scan_data.dps = true - elseif string.match(text, "expertise") then - scan_data.dps = true - scan_data.tank = true - elseif string.match(text, "melee crit") then - scan_data.dps = true - elseif string.match(text, "critical hit") then - scan_data.dps = true - elseif string.match(text, "weapon damage") then - scan_data.dps = true - elseif string.match(text, "ranged crit") then - scan_data.dps = true - scan_data.verifiedclass = true - elseif string.match(text, "melee haste") then - scan_data.dps = true - elseif string.match(text, "ranged haste") then - scan_data.dps = true - scan_data.verifiedclass = true - elseif string.match(text, "melee hit") then - scan_data.dps = true - elseif string.match(text, "ranged hit") then - scan_data.dps = true - scan_data.verifiedclass = true - elseif string.match(text, "armor pen") then - scan_data.dps = true - elseif string.match(text, "feral attack power") then - scan_data.tank = true - scan_data.dps = true - elseif string.match(text, "defense") and not string.match(text, "defenseless") then - scan_data.tank = true - scan_data.verifiedclass = true - elseif string.match(text, "block") then - scan_data.tank = true - scan_data.verifiedclass = true - elseif string.match(text, "parry") then - scan_data.tank = true - scan_data.verifiedclass = true - elseif string.match(text, "dodge") and not string.match(text, "set:") then - scan_data.tank = true - scan_data.verifiedclass = true - end - end - - -- Classes - local class_type = string.match(text_l, "Classes: (.+)") - - if class_type then - for idx, class in ipairs(ORDERED_CLASS_TYPES) do - if string.match(class_type, class) then - scan_data[class] = true - scan_data.found_class = true - end - end - end - - -- Armor types - if ITEM_TYPES[text_l] then - scan_data[text_l] = true - elseif text_l == "Held In Off-hand" or text_l == "Off Hand" or text_l == "Main Hand" then -- Special cases. - scan_data["One-Hand"] = true - elseif text_l == "Projectile" then - scan_data["Ammo"] = true - end - - if text_r and ITEM_TYPES[text_r] then - scan_data[text_r] = true - end - - -- Enchantment voodoo - local ench_type, _ = string.match(text_l, "Enchant (.+) %- (.+)") - - if ench_type then - if ITEM_TYPES[ench_type] then - scan_data[ench_type] = true - elseif ITEM_TYPES[ENCHANT_TO_ITEM[ench_type]] then - scan_data[ENCHANT_TO_ITEM[ench_type]] = true - elseif ench_type == "Weapon" then -- Special case. - scan_data["One-Hand"] = true - scan_data["Two-Hand"] = true - end - end - end -- for - end - - -- Flag data for printing. Wiped and re-used. - local missing_flags = {} - local extra_flags = {} - local output = {} - - local ACQUIRE_TO_FILTER_MAP = { - [A.MOB_DROP] = F.MOB_DROP, - [A.QUEST] = F.QUEST, - [A.SEASONAL] = F.SEASONAL, - [A.WORLD_DROP] = F.WORLD_DROP, - } - local FILTER_TO_ACQUIRE_MAP - - --- Prints out the results of the tooltip scan. - -- @name AckisRecipeList:PrintScanResults - function addon:PrintScanResults() - if not scan_data.match_name then - return - end - - -- Parse the recipe database until we get a match on the name - local recipe_name = string.gsub(scan_data.match_name, "%a+%?: ", "") - local spell_id = scan_data.reverse_lookup[recipe_name] - - if not spell_id then - self:Print(recipe_name .. " has no reverse lookup") - return - end - local recipe = scan_data.recipe_list[spell_id] - local acquire_data = recipe["acquire_data"] - - local FS = private.filter_strings - local flag_format = "F.%s" - - twipe(missing_flags) - twipe(extra_flags) - twipe(output) - - -- If we're a vendor scan, do some extra checks - if scan_data.is_vendor then - -- Check to see if the vendor flag is set - if not recipe:IsFlagged("common1", "VENDOR") then - tinsert(missing_flags, string.format(flag_format, FS[F.VENDOR])) - end - - -- Check to see if we're in a PVP zone - if (GetSubZoneText() == "Wintergrasp Fortress" or GetSubZoneText() == "Halaa") and not recipe:IsFlagged("common1", "PVP") then - tinsert(missing_flags, string.format(flag_format, FS[F.PVP])) - elseif recipe:IsFlagged("common1", "PVP") and not (GetSubZoneText() == "Wintergrasp Fortress" or GetSubZoneText() == "Halaa") then - tinsert(extra_flags, string.format(flag_format, FS[F.PVP])) - end - end - - -- -- If we've picked up at least one class flag - if scan_data.found_class then - for k, v in ipairs(ORDERED_CLASS_TYPES) do - if scan_data[v] and not recipe:IsFlagged("class1", FS[CLASS_TYPES[v]]) then - tinsert(missing_flags, string.format(flag_format, FS[CLASS_TYPES[v]])) - elseif not scan_data[v] and recipe:IsFlagged("class1", FS[CLASS_TYPES[v]]) then - tinsert(extra_flags, string.format(flag_format, FS[CLASS_TYPES[v]])) - end - end - end - - if scan_data.item_bop and not recipe:IsFlagged("common1", "IBOP") then - tinsert(missing_flags, string.format(flag_format, FS[F.IBOP])) - - if recipe:IsFlagged("common1", "IBOE") then - tinsert(extra_flags, string.format(flag_format, FS[F.IBOE])) - end - - if recipe:IsFlagged("common1", "IBOA") then - tinsert(extra_flags, string.format(flag_format, FS[F.IBOA])) - end - elseif not recipe:IsFlagged("common1", "IBOE") and not scan_data.item_bop then - tinsert(missing_flags, string.format(flag_format, FS[F.IBOE])) - - if recipe:IsFlagged("common1", "IBOP") then - tinsert(extra_flags, string.format(flag_format, FS[F.IBOP])) - end - - if recipe:IsFlagged("common1", "IBOA") then - tinsert(extra_flags, string.format(flag_format, FS[F.IBOA])) - end - end - - if scan_data.recipe_bop and not recipe:IsFlagged("common1", "RBOP") then - tinsert(missing_flags, string.format(flag_format, FS[F.RBOP])) - - if recipe:IsFlagged("common1", "RBOE") then - tinsert(extra_flags, string.format(flag_format, FS[F.RBOE])) - end - - if recipe:IsFlagged("common1", "RBOA") then - tinsert(extra_flags, string.format(flag_format, FS[F.RBOA])) - end - - elseif not recipe:IsFlagged("common1", "TRAINER") and not recipe:IsFlagged("common1", "RBOE") and not scan_data.recipe_bop then - tinsert(missing_flags, string.format(flag_format, FS[F.RBOE])) - - if recipe:IsFlagged("common1", "RBOP") then - tinsert(extra_flags, string.format(flag_format, FS[F.RBOP])) - end - - if recipe:IsFlagged("common1", "RBOA") then - tinsert(extra_flags, string.format(flag_format, FS[F.RBOA])) - end - end - - for k, v in ipairs(ORDERED_ROLE_TYPES) do - local role_string = FS[ROLE_TYPES[v]] - - if scan_data[v] and not recipe:IsFlagged("common1", role_string) then - tinsert(missing_flags, string.format(flag_format, role_string)) - elseif not scan_data[v] and recipe:IsFlagged("common1", role_string) then - tinsert(extra_flags, string.format(flag_format, role_string)) - end - end - - for k, v in ipairs(ORDERED_ITEM_TYPES) do - if scan_data[v] and not recipe:IsFlagged("item1", FS[ITEM_TYPES[v]]) then - tinsert(missing_flags, string.format(flag_format, FS[ITEM_TYPES[v]])) - elseif not scan_data[v] and recipe:IsFlagged("item1", FS[ITEM_TYPES[v]]) then - tinsert(extra_flags, string.format(flag_format, FS[ITEM_TYPES[v]])) - end - end - - -- Reputations - local repid = scan_data.repid - local found_problem = false - - if repid and not recipe:IsFlagged("reputation1", FS[repid]) and not recipe:IsFlagged("reputation2", FS[repid]) then - tinsert(missing_flags, repid) - - local rep_data = acquire_data[A.REPUTATION] - - if rep_data then - for rep_id, rep_info in pairs(acquire_info) do - for rep_level, level_info in pairs(rep_info) do - if rep_level ~= scan_data.repidlevel then - tinsert(output, " Wrong reputation level.") - end - end - end - end - end - - -- Make sure the recipe's filter flags match with its acquire types. - if not FILTER_TO_ACQUIRE_MAP then - FILTER_TO_ACQUIRE_MAP = {} - - for k, v in pairs(ACQUIRE_TO_FILTER_MAP) do - FILTER_TO_ACQUIRE_MAP[v] = k - end - end - - for acquire_type in pairs(acquire_data) do - local flag = ACQUIRE_TO_FILTER_MAP[acquire_type] - - if flag and not recipe:IsFlagged("common1", FS[flag]) then - tinsert(missing_flags, string.format(flag_format, FS[flag])) - end - end - - if (acquire_data[A.VENDOR] or acquire_data[A.REPUTATION]) and not recipe:IsFlagged("common1", "VENDOR") then - tinsert(missing_flags, string.format(flag_format, FS[F.VENDOR])) - end - - if recipe:IsFlagged("common1", "VENDOR") and not (acquire_data[A.VENDOR] or acquire_data[A.REPUTATION]) then - tinsert(extra_flags, string.format(flag_format, FS[F.VENDOR])) - end - - if acquire_data[A.TRAINER] and not recipe:IsFlagged("common1", "TRAINER") then - tinsert(missing_flags, string.format(flag_format, FS[F.TRAINER])) - end - - if recipe:IsFlagged("common1", "TRAINER") and not acquire_data[A.TRAINER] then - if not acquire_data[A.CUSTOM] then - tinsert(extra_flags, string.format(flag_format, FS[F.TRAINER])) - end - end - - for flag, acquire_type in pairs(FILTER_TO_ACQUIRE_MAP) do - if recipe:IsFlagged("common1", FS[flag]) and not acquire_data[acquire_type] then - tinsert(extra_flags, string.format(flag_format, FS[flag])) - end - end - - if #missing_flags > 0 or #extra_flags > 0 then - found_problem = true - - -- Add a string of the missing flag numbers - if #missing_flags > 0 then - tinsert(output, " Missing flags: " .. tconcat(missing_flags, ", ")) - end - - -- Add a string of the extra flag numbers - if #extra_flags > 0 then - tinsert(output, " Extra flags: " .. tconcat(extra_flags, ", ")) - end - local found_type = false - - for k, v in ipairs(ORDERED_ITEM_TYPES) do - if scan_data[v] then - found_type = true - break - end - end - - if not found_type then - tinsert(output, " Missing: item type flag") - end - end - - -- Check to see if we have a horde/alliance flag, all recipes must have one of these - if not recipe:IsFlagged("common1", "ALLIANCE") and not recipe:IsFlagged("common1", "HORDE") then - found_problem = true - tinsert(output, " Horde or Alliance not selected.") - end - - -- Check to see if we have an obtain method flag, all recipes must have at least one of these - if (not recipe:IsFlagged("common1", "TRAINER") and not recipe:IsFlagged("common1", "VENDOR") and not recipe:IsFlagged("common1", "INSTANCE") and not recipe:IsFlagged("common1", "RAID") - and not recipe:IsFlagged("common1", "SEASONAL") and not recipe:IsFlagged("common1", "QUEST") and not recipe:IsFlagged("common1", "PVP") and not recipe:IsFlagged("common1", "WORLD_DROP") - and not recipe:IsFlagged("common1", "MOB_DROP") and not recipe:IsFlagged("common1", "DISC")) then - found_problem = true - tinsert(output, " No obtain flag.") - end - - -- Check for recipe binding information, all recipes must have one of these - if not recipe:IsFlagged("common1", "RBOE") and not recipe:IsFlagged("common1", "RBOP") and not recipe:IsFlagged("common1", "RBOA") then - found_problem = true - tinsert(output, " No recipe binding information.") - end - - -- Check for item binding information, all recipes must have one of these - if not recipe:IsFlagged("common1", "IBOE") and not recipe:IsFlagged("common1", "IBOP") and not recipe:IsFlagged("common1", "IBOA") then - found_problem = true - tinsert(output, " No item binding information.") - end - - -- We need to code this better. Some items (aka bags) won't have a role at all. - -- Check for player role flags - if not scan_data.tank and not scan_data.healer and not scan_data.caster and not scan_data.dps and not NO_ROLE_FLAG[spell_id] then - found_problem = true - tinsert(output, " No player role flag.") - end - - if scan_data.specialty then - if not recipe.specialty then - found_problem = true - tinsert(output, string.format(" Missing Specialty: %s", scan_data.specialty)) - elseif recipe.specialty ~= scan_data.specialty then - tinsert(output, string.format(" Wrong Specialty: %s - should be %s ", recipe.specialty, scan_data.specialty)) - end - elseif recipe.specialty then - found_problem = true - tinsert(output, string.format(" Extra Specialty: %s", recipe.specialty)) - end - - if scan_data.quality ~= recipe.quality then - local QS = private.item_quality_names - - found_problem = true - tinsert(output, string.format(" Wrong quality: Q.%s - should be Q.%s.", QS[recipe.quality], QS[scan_data.quality])) - end - if found_problem then - tinsert(output, 1, string.format("%s: %d", recipe_name, spell_id, spell_id)) - return tconcat(output, "\n") - else - return - end - end -end \ No newline at end of file diff --git a/Scanner.lua b/Scanner.lua new file mode 100644 index 0000000..bccb69b --- /dev/null +++ b/Scanner.lua @@ -0,0 +1,2505 @@ +--[[ +************************************************************************ +Scanner.lua +In-game tooltip-scanner for datamining. +************************************************************************ +File date: @file-date-iso@ +File revision: @file-revision@ +Project revision: @project-revision@ +Project version: @project-version@ +************************************************************************ +Please see http://www.wowace.com/addons/arl/ for more information. +************************************************************************ +This source code is released under All Rights Reserved. +************************************************************************ +]]-- + +------------------------------------------------------------------------------- +-- Upvalues globals. +------------------------------------------------------------------------------- +local _G = getfenv(0) + +local table = _G.table +local tconcat, tinsert, tsort, twipe = table.concat, table.insert, table.sort, table.wipe + +local string = _G.string + +local tonumber, tostring = _G.tonumber, _G.tostring + +local ipairs, pairs = _G.ipairs, _G.pairs + +------------------------------------------------------------------------------- +-- Upvalued Blizzard API. +------------------------------------------------------------------------------- +local UnitName = UnitName +local UnitGUID = UnitGUID +local UnitExists = UnitExists +local UnitIsPlayer = UnitIsPlayer +local UnitIsEnemy = UnitIsEnemy +local GetNumTrainerServices = GetNumTrainerServices +local GetTrainerServiceInfo = GetTrainerServiceInfo +local IsTradeskillTrainer = IsTradeskillTrainer +local SetTrainerServiceTypeFilter = SetTrainerServiceTypeFilter +local GetTrainerServiceTypeFilter = GetTrainerServiceTypeFilter +local GetTrainerServiceSkillReq = GetTrainerServiceSkillReq +local GetMerchantNumItems = GetMerchantNumItems +local GetMerchantItemLink = GetMerchantItemLink +local GetMerchantItemInfo = GetMerchantItemInfo +local GetSpellInfo = GetSpellInfo + +------------------------------------------------------------------------------- +-- AddOn namespace. +------------------------------------------------------------------------------- +local MODNAME = "Ackis Recipe List" +local addon = LibStub("AceAddon-3.0"):GetAddon(MODNAME) + +local L = LibStub("AceLocale-3.0"):GetLocale(MODNAME) + +-- Set up the private intra-file namespace. +local private = select(2, ...) + +------------------------------------------------------------------------------- +-- Constants +------------------------------------------------------------------------------- +local F = private.filter_flags +local A = private.acquire_types + +local PROFESSIONS = private.professions + +------------------------------------------------------------------------------- +-- Mined via Data-tools +-- Table is Public Domain now +-- Look up table of Spell IDs to the recipe which trains them. +------------------------------------------------------------------------------- +local SPELL_TO_RECIPE_MAP = { + ------------------------------------------------------------------------------- + -- First Aid + ------------------------------------------------------------------------------- + [7929] = 16112, [7935] = 6454, [10840] = 16113, [23787] = 19442, + [27032] = 21992, [27033] = 21993, [45546] = 39152, + + ------------------------------------------------------------------------------- + -- Alchemy + ------------------------------------------------------------------------------- + [2333] = 3396, [2335] = 2555, [3172] = 3393, [3174] = 3394, + [3175] = 3395, [3188] = 6211, [3230] = 2553, [3449] = 6068, + [3450] = 3830, [3451] = 3831, [3453] = 3832, [3454] = 14634, + [4508] = 4597, [4942] = 4624, [6617] = 5640, [6618] = 5643, + [6624] = 5642, [7255] = 6053, [7256] = 6054, [7257] = 6055, + [7258] = 6056, [7259] = 6057, [8240] = 6663, [11453] = 9293, + [11456] = 10644, [11458] = 9294, [11459] = 9303, [11464] = 9295, + [11466] = 9296, [11468] = 9297, [11472] = 9298, [11473] = 9302, + [11476] = 9301, [11477] = 9300, [11479] = 9304, [11480] = 9305, + [17187] = 12958, [17552] = 13476, [17553] = 13477, [17554] = 13478, + [17555] = 13479, [17556] = 13480, [17557] = 13481, [17559] = 13482, + [17560] = 13483, [17561] = 13484, [17562] = 13485, [17563] = 13486, + [17564] = 13487, [17565] = 13488, [17566] = 13489, [17570] = 13490, + [17571] = 13491, [17572] = 13492, [17573] = 13493, [17574] = 13494, + [17575] = 13495, [17576] = 13496, [17577] = 13497, [17578] = 13499, + [17580] = 13501, [17632] = 13517, [17634] = 13518, [17635] = 31354, + [17636] = 31356, [17637] = 31355, [17638] = 31357, [21923] = 17709, + [22732] = 18257, [24365] = 20011, [24366] = 20012, [24367] = 20013, + [24368] = 20014, [25146] = 20761, [26277] = 21547, [28543] = 22900, + [28546] = 22901, [28549] = 22902, [28550] = 22903, [28552] = 22904, + [28553] = 24001, [28554] = 22906, [28555] = 22907, [28556] = 22908, + [28557] = 22909, [28558] = 22910, [28562] = 22911, [28563] = 22912, + [28564] = 35295, [28565] = 22914, [28566] = 22915, [28567] = 22916, + [28568] = 30443, [28569] = 22918, [28570] = 22919, [28571] = 22920, + [28572] = 22921, [28573] = 22922, [28575] = 22923, [28576] = 22924, + [28577] = 22925, [28578] = 35294, [28579] = 22927, [29688] = 23574, + [32765] = 25869, [32766] = 29232, [38960] = 31680, [38961] = 31682, + [38962] = 31681, [39637] = 32070, [39639] = 32071, [42736] = 33209, + [47046] = 35752, [47048] = 35753, [47049] = 35754, [47050] = 35755, + [53936] = 44564, [53937] = 44566, [53938] = 44568, [53939] = 44565, + [53942] = 44567, + + ------------------------------------------------------------------------------- + -- Blacksmithing + ------------------------------------------------------------------------------- + [2667] = 2881, [2673] = 5578, [3295] = 2883, [3297] = 3608, + [3321] = 3609, [3325] = 3610, [3330] = 2882, [3334] = 3611, + [3336] = 3612, [3492] = 12162, [3493] = 3866, [3494] = 10858, + [3495] = 3867, [3496] = 12163, [3497] = 3868, [3498] = 12164, + [3500] = 3869, [3503] = 6047, [3504] = 3870, [3505] = 3871, + [3507] = 3872, [3511] = 3873, [3513] = 3874, [3515] = 3875, + [6518] = 5543, [7221] = 6044, [7222] = 6045, [7224] = 6046, + [8367] = 6735, [9811] = 7978, [9813] = 7979, [9814] = 7980, + [9818] = 7981, [9820] = 7982, [9933] = 7975, [9937] = 7995, + [9939] = 7976, [9945] = 7983, [9950] = 7984, [9952] = 7985, + [9964] = 7989, [9966] = 7991, [9970] = 7990, [9995] = 7992, + [9997] = 8029, [10005] = 7993, [10009] = 8028, [10013] = 8030, + [11454] = 10713, [11643] = 9367, [12259] = 10424, [15292] = 11610, + [15293] = 11614, [15294] = 11611, [15295] = 11615, [15296] = 11612, + [15973] = 12261, [16642] = 12682, [16643] = 12683, [16644] = 12684, + [16645] = 12685, [16646] = 12687, [16647] = 12688, [16648] = 12689, + [16649] = 12690, [16650] = 12691, [16651] = 12692, [16652] = 12693, + [16653] = 12694, [16654] = 12695, [16655] = 12699, [16656] = 12697, + [16657] = 12700, [16658] = 12701, [16659] = 12702, [16660] = 12698, + [16661] = 12703, [16662] = 12704, [16663] = 12705, [16664] = 12706, + [16665] = 12707, [16667] = 12696, [16724] = 12711, [16725] = 12713, + [16726] = 12714, [16728] = 12716, [16729] = 12717, [16730] = 12715, + [16731] = 12718, [16732] = 12719, [16741] = 12720, [16742] = 12725, + [16744] = 12726, [16745] = 12727, [16746] = 12728, [16969] = 12819, + [16970] = 12821, [16971] = 12823, [16973] = 12824, [16978] = 12825, + [16983] = 12827, [16984] = 12828, [16985] = 12830, [16988] = 12833, + [16990] = 12834, [16991] = 12835, [16992] = 12836, [16993] = 12837, + [16994] = 12838, [16995] = 12839, [20872] = 17049, [20873] = 17053, + [20874] = 17051, [20876] = 17052, [20890] = 17059, [20897] = 17060, + [21161] = 18592, [21913] = 17706, [22757] = 18264, [23628] = 19202, + [23629] = 19204, [23632] = 19203, [23633] = 19205, [23636] = 19206, + [23637] = 19207, [23638] = 19208, [23639] = 19209, [23650] = 19210, + [23652] = 19211, [23653] = 19212, [24136] = 19776, [24137] = 19777, + [24138] = 19778, [24139] = 19779, [24140] = 19780, [24141] = 19781, + [24399] = 20040, [24912] = 20553, [24913] = 20555, [24914] = 20554, + [27585] = 22209, [27586] = 22219, [27587] = 22222, [27588] = 22214, + [27589] = 22220, [27590] = 22221, [27829] = 22388, [27830] = 22390, + [27832] = 22389, [28461] = 22766, [28462] = 22767, [28463] = 22768, + [29566] = 23590, [29568] = 23591, [29569] = 23592, [29571] = 23593, + [29603] = 23594, [29605] = 23595, [29606] = 23596, [29608] = 23597, + [29610] = 23599, [29611] = 23598, [29613] = 23600, [29614] = 23601, + [29615] = 23602, [29616] = 23603, [29617] = 23604, [29619] = 23605, + [29620] = 23606, [29621] = 23607, [29622] = 23621, [29628] = 23608, + [29629] = 23609, [29630] = 23610, [29642] = 23611, [29643] = 23612, + [29645] = 23613, [29648] = 23615, [29649] = 23617, [29656] = 23618, + [29657] = 24002, [29658] = 23620, [29662] = 23622, [29663] = 23623, + [29664] = 23624, [29668] = 23625, [29669] = 23626, [29671] = 23627, + [29672] = 23628, [29692] = 23629, [29693] = 23630, [29694] = 23631, + [29695] = 23632, [29696] = 23633, [29697] = 23634, [29698] = 23635, + [29699] = 23636, [29700] = 23637, [29728] = 23638, [29729] = 23639, + [32285] = 25526, [32656] = 25846, [32657] = 25847, [34608] = 28632, + [36389] = 30321, [36390] = 30322, [36391] = 30323, [36392] = 30324, + [38473] = 31390, [38475] = 31391, [38476] = 31392, [38477] = 31393, + [38478] = 31394, [38479] = 31395, [40033] = 32441, [40034] = 32442, + [40035] = 32443, [40036] = 32444, [41132] = 32736, [41133] = 32737, + [41134] = 32738, [41135] = 32739, [42688] = 35296, [43549] = 33792, + [43846] = 33954, [46140] = 35208, [46141] = 35209, [46142] = 35210, + [46144] = 35211, [54978] = 41124, [54979] = 41123, [54980] = 41120, + [54981] = 41122, [62202] = 44938, [63187] = 45088, [63188] = 45089, + [63189] = 45090, [63190] = 45091, [63191] = 45092, [63192] = 45093, + [67091] = 47622, [67130] = 47640, [67092] = 47623, [67131] = 47641, + [67096] = 47627, [67135] = 47642, [67095] = 47626, [67134] = 47643, + [67093] = 47624, [67132] = 47644, [67094] = 47625, [67133] = 47645, + [70563] = 49970, [70567] = 49973, [70565] = 49971, [70566] = 49972, + [70568] = 49974, [70562] = 49969, + + ------------------------------------------------------------------------------- + -- Cooking + ------------------------------------------------------------------------------- + [2542] = 2697, [2543] = 728, [2545] = 2698, [2547] = 2699, + [2548] = 2700, [2549] = 2701, [2795] = 2889, [3370] = 3678, + [3371] = 3679, [3372] = 3680, [3373] = 3681, [3376] = 3682, + [3377] = 3683, [3397] = 3734, [3398] = 3735, [3399] = 3736, + [3400] = 3737, [4094] = 4609, [6412] = 5482, [6413] = 5483, + [6414] = 5484, [6415] = 5485, [6416] = 5486, [6417] = 44977, + [6418] = 5488, [6419] = 5489, [6501] = 5528, [7213] = 6039, + [7751] = 6325, [7752] = 6326, [7753] = 6328, [7754] = 6329, + [7755] = 6330, [7827] = 6368, [7828] = 6369, [8238] = 6661, + [8607] = 6892, [9513] = 18160, [15853] = 12227, [15855] = 12228, + [15856] = 12229, [15861] = 12231, [15863] = 12232, [15865] = 12233, + [15906] = 12239, [15910] = 12240, [15915] = 16111, [15933] = 16110, + [15935] = 12226, [18238] = 13939, [18239] = 13940, [18240] = 13942, + [18241] = 13941, [18242] = 13943, [18243] = 13945, [18244] = 13946, + [18245] = 13947, [18246] = 13948, [18247] = 13949, [20626] = 16767, + [20916] = 17062, [21143] = 17200, [21144] = 17201, [22480] = 18046, + [22761] = 18267, [24418] = 20075, [25659] = 21025, [25704] = 21099, + [25954] = 21219, [28267] = 22647, [33276] = 27685, [33277] = 27686, + [33278] = 27687, [33279] = 27684, [33284] = 27688, [33285] = 27689, + [33286] = 27690, [33287] = 27691, [33288] = 27692, [33289] = 27693, + [33290] = 27694, [33291] = 27695, [33292] = 27696, [33293] = 27697, + [33294] = 27698, [33295] = 27699, [33296] = 27700, [36210] = 30156, + [38867] = 31675, [38868] = 31674, [43707] = 33870, [43758] = 33871, + [43761] = 33869, [43765] = 33873, [43772] = 33875, [43779] = 33925, + [45022] = 34413, [45555] = 43018, [45556] = 43019, [45557] = 43020, + [45558] = 43021, [45559] = 43022, [45567] = 43023, [45568] = 43024, + [45570] = 43026, [45571] = 43025, [45695] = 34834, [46684] = 35564, + [46688] = 35566, [53056] = 39644, [57423] = 43017, [57433] = 43027, + [57434] = 43028, [57435] = 43029, [57436] = 43030, [57437] = 43031, + [57438] = 43032, [57439] = 43033, [57440] = 43034, [57441] = 43035, + [57442] = 43036, [57443] = 43037, [58512] = 43507, [58521] = 43508, + [58523] = 43509, [58525] = 43510, [58527] = 43505, [58528] = 43506, + [62350] = 44954, + + ------------------------------------------------------------------------------- + -- Enchanting + ------------------------------------------------------------------------------- + [7443] = 6342, [7766] = 6344, [7776] = 6346, [7782] = 6347, + [7786] = 6348, [7793] = 6349, [7859] = 6375, [7867] = 6377, + [13380] = 11038, [13419] = 11039, [13464] = 11081, [13522] = 11098, + [13536] = 11101, [13612] = 11150, [13617] = 11151, [13620] = 11152, + [13646] = 11163, [13653] = 11164, [13655] = 11165, [13687] = 11167, + [13689] = 11168, [13698] = 11166, [13817] = 11202, [13841] = 11203, + [13846] = 11204, [13868] = 11205, [13882] = 11206, [13898] = 11207, + [13915] = 11208, [13931] = 11223, [13933] = 11224, [13945] = 11225, + [13947] = 11226, [15596] = 11813, [15596] = 45050, [20009] = 16218, + [20010] = 16246, [20011] = 16251, [20012] = 16219, [20014] = 16216, + [20015] = 16224, [20016] = 16222, [20017] = 16217, [20020] = 16215, + [20023] = 16245, [20024] = 16220, [20025] = 16253, [20026] = 16221, + [20028] = 16242, [20029] = 16223, [20030] = 16247, [20031] = 16250, + [20032] = 16254, [20033] = 16248, [20034] = 16252, [20035] = 16255, + [20036] = 16249, [20051] = 16243, [21931] = 17725, [22749] = 18259, + [22750] = 18260, [23799] = 19444, [23800] = 19445, [23801] = 19446, + [23802] = 19447, [23803] = 19448, [23804] = 19449, [25072] = 33153, + [25072] = 20726, [25073] = 20727, [25074] = 20728, [25078] = 20729, + [25079] = 20730, [25080] = 33152, [25080] = 20731, [25081] = 20732, + [25082] = 20733, [25083] = 33149, [25083] = 20734, [25084] = 20735, + [25084] = 33150, [25084] = 33151, [25086] = 20736, [25086] = 33148, + [25124] = 20758, [25125] = 20752, [25126] = 20753, [25127] = 20754, + [25128] = 20755, [25129] = 20756, [25130] = 20757, [27837] = 22392, + [27906] = 22530, [27911] = 22531, [27911] = 24000, [27913] = 22532, + [27914] = 22533, [27917] = 22534, [27920] = 22535, [27924] = 22536, + [27926] = 22537, [27927] = 22538, [27945] = 22539, [27946] = 22540, + [27947] = 22541, [27948] = 35298, [27948] = 22542, [27950] = 22543, + [27951] = 22544, [27954] = 22545, [27960] = 24003, [27960] = 22547, + [27962] = 22548, [27967] = 22552, [27968] = 22551, [27971] = 22554, + [27972] = 22553, [27975] = 22555, [27977] = 22556, [27981] = 22560, + [27982] = 22561, [27984] = 22559, [28003] = 22558, [28004] = 22557, + [28016] = 22562, [28019] = 22563, [28022] = 22565, [32665] = 25848, + [32667] = 25849, [33992] = 28270, [33994] = 28271, [33997] = 28272, + [33999] = 28273, [34003] = 28274, [34005] = 28276, [34006] = 28277, + [34007] = 35299, [34007] = 28279, [34008] = 35297, [34008] = 28280, + [34009] = 28282, [34010] = 28281, [42620] = 33165, [42974] = 33307, + [44483] = 37332, [44494] = 37333, [44524] = 37344, [44556] = 37331, + [44575] = 44484, [44576] = 44494, [44588] = 37340, [44590] = 37334, + [44591] = 37347, [44595] = 44473, [44596] = 37330, [44621] = 37339, + [44625] = 44485, [44631] = 37349, [45765] = 34872, [46578] = 35498, + [46594] = 35500, [47051] = 35756, [47672] = 44471, [47898] = 44472, + [47899] = 44488, [47901] = 44491, [59619] = 44496, [59621] = 44492, + [59625] = 44495, [60691] = 44483, [60692] = 44489, [60707] = 44486, + [60714] = 44487, [60763] = 44490, [60767] = 44498, [62256] = 44944, + [62257] = 44945, [62948] = 45059, [64441] = 46027, [64579] = 46348, + + ------------------------------------------------------------------------------- + --Engineering + ------------------------------------------------------------------------------- + [3928] = 4408, [3933] = 4409, [3939] = 13309, [3940] = 4410, + [3944] = 4411, [3952] = 14639, [3954] = 4412, [3957] = 13308, + [3959] = 4413, [3960] = 4414, [3966] = 4415, [3968] = 4416, + [3969] = 13311, [3971] = 7742, [3972] = 4417, [3979] = 13310, + [8243] = 6672, [8339] = 6716, [9269] = 7560, [9273] = 7561, + [12587] = 10601, [12597] = 10602, [12607] = 10603, [12614] = 10604, + [12615] = 10605, [12616] = 10606, [12617] = 10607, [12620] = 10608, + [12624] = 10609, [15628] = 11828, [15633] = 11827, [19790] = 16041, + [19791] = 16042, [19792] = 16043, [19793] = 16044, [19794] = 16045, + [19795] = 16047, [19796] = 16048, [19799] = 16049, [19800] = 16051, + [19814] = 16046, [19815] = 16050, [19819] = 16052, [19825] = 16053, + [19830] = 16054, [19831] = 16055, [19833] = 16056, [21940] = 17720, + [22793] = 18290, [22795] = 18292, [22797] = 18291, [23066] = 18647, + [23067] = 18649, [23068] = 18648, [23069] = 18650, [23071] = 18651, + [23077] = 18652, [23078] = 18653, [23079] = 18655, [23080] = 18656, + [23081] = 18657, [23082] = 18658, [23096] = 18654, [23129] = 18661, + [23507] = 19027, [24356] = 20000, [24357] = 20001, [26416] = 21724, + [26417] = 21725, [26418] = 21726, [26420] = 21727, [26421] = 21728, + [26422] = 21729, [26423] = 21730, [26424] = 21731, [26425] = 21732, + [26426] = 21733, [26427] = 21734, [26428] = 21735, [26442] = 44919, + [26443] = 44918, [28327] = 22729, [30313] = 23799, [30314] = 23800, + [30315] = 23802, [30316] = 23803, [30317] = 23804, [30318] = 23805, + [30325] = 23806, [30329] = 23807, [30332] = 23808, [30334] = 23809, + [30337] = 23810, [30341] = 23811, [30344] = 23814, [30347] = 23815, + [30348] = 23816, [30349] = 23817, [30547] = 23874, [30548] = 23888, + [30551] = 35310, [30552] = 35311, [30556] = 23887, [32814] = 25887, + [39895] = 32381, [43676] = 33804, [44391] = 34114, [46106] = 35191, + [46107] = 35187, [46108] = 35189, [46109] = 35190, [46110] = 35192, + [46111] = 35186, [46112] = 35193, [46113] = 35194, [46114] = 35195, + [46115] = 35196, [46116] = 35197, [46697] = 35582, [60866] = 44502, + [60867] = 44503, [72952] = 52022, [72953] = 52023, + + ------------------------------------------------------------------------------- + --Inscription + ------------------------------------------------------------------------------- + [71101] = 50166, [71102] = 50168, [71015] = 50167, + + ------------------------------------------------------------------------------- + --Jewelcrafting + ------------------------------------------------------------------------------- + [25320] = 20856, [25323] = 20855, [25339] = 20854, [25610] = 20970, + [25612] = 20971, [25617] = 20973, [25618] = 20974, [25619] = 20975, + [25622] = 20976, [26873] = 21940, [26875] = 21941, [26878] = 21942, + [26881] = 21943, [26882] = 21944, [26887] = 21945, [26896] = 21947, + [26897] = 21948, [26900] = 21949, [26906] = 21952, [26909] = 21953, + [26910] = 21954, [26912] = 21955, [26914] = 21956, [26915] = 21957, + [28903] = 23130, [28905] = 23131, [28906] = 23133, [28907] = 23134, + [28910] = 23135, [28912] = 23136, [28914] = 23137, [28915] = 23138, + [28916] = 23140, [28917] = 23141, [28918] = 31359, [28924] = 23143, + [28927] = 23145, [28933] = 23146, [28936] = 23147, + [28938] = 23148, [28944] = 23149, [28947] = 23150, [28948] = 23151, + [28950] = 23152, [28953] = 23153, [28955] = 23154, [28957] = 23155, + [31053] = 24158, [31054] = 24159, [31055] = 24160, [31056] = 24161, + [31057] = 24162, [31058] = 24163, [31060] = 24164, [31061] = 24165, + [31062] = 24174, [31063] = 24175, [31064] = 24176, [31065] = 24177, + [31066] = 24178, [31067] = 24166, [31068] = 24167, [31070] = 24168, + [31071] = 24169, [31072] = 24170, [31076] = 24171, [31077] = 24172, + [31078] = 24173, [31079] = 24179, [31080] = 31358, [31081] = 24181, + [31082] = 24182, [31083] = 24183, [31084] = 24193, [31085] = 24194, + [31087] = 24195, [31088] = 35305, [31089] = 35306, [31090] = 24197, + [31091] = 24198, [31092] = 35304, [31094] = 24201, [31095] = 24202, + [31096] = 24203, [31097] = 24204, [31098] = 35307, [31099] = 24206, + [31100] = 24207, [31101] = 24208, [31102] = 24209, [31103] = 24210, + [31104] = 24211, [31105] = 24212, [31106] = 24213, [31107] = 24214, + [31108] = 24215, [31109] = 24216, [31110] = 24217, [31111] = 24218, + [31112] = 24219, [31113] = 24220, [31149] = 24200, [32866] = 25902, + [32867] = 25903, [32868] = 25905, [32869] = 25906, [32870] = 25904, + [32871] = 25907, [32872] = 25909, [32873] = 25908, [32874] = 25910, + [34069] = 28291, [34590] = 28596, [37855] = 30826, [38503] = 31401, + [38504] = 31402, [39451] = 31870, [39452] = 31875, [39455] = 31871, + [39458] = 31872, [39462] = 31877, [39463] = 31876, [39466] = 31873, + [39467] = 31874, [39470] = 31878, [39471] = 31879, [39705] = 35244, + [39706] = 35246, [39710] = 35250, [39711] = 35248, [39712] = 35245, + [39713] = 35249, [39714] = 35247, [39715] = 35263, [39716] = 35264, + [39717] = 35262, [39718] = 35265, [39719] = 35255, [39720] = 35260, + [39721] = 35259, [39722] = 35256, [39723] = 35261, [39724] = 35258, + [39725] = 35257, [39727] = 35243, [39728] = 35242, [39729] = 35238, + [39730] = 35240, [39731] = 35239, [39732] = 35241, [39733] = 35267, + [39734] = 35269, [39735] = 35268, [39736] = 35266, [39737] = 35270, + [39738] = 35271, [39739] = 35252, [39740] = 35254, [39741] = 35251, + [39742] = 35253, [39961] = 33622, [39963] = 32411, [42558] = 33305, + [42588] = 33155, [42589] = 33156, [42590] = 33157, [42591] = 33158, + [42592] = 33159, [42593] = 33160, [43493] = 33783, [44794] = 34689, + [46122] = 35198, [46123] = 35538, [46124] = 35200, [46125] = 35201, + [46126] = 35533, [46127] = 35203, [46403] = 35322, [46404] = 35323, + [46405] = 35325, [46597] = 35502, [46601] = 35505, [46775] = 35695, + [46776] = 35696, [46777] = 35697, [46778] = 35698, [46779] = 35699, + [46803] = 35708, [47053] = 35769, [47054] = 35766, [47055] = 35767, + [47056] = 35768, [48789] = 37504, [53830] = 41576, [53857] = 41559, + [53865] = 41575, [53869] = 41574, [53875] = 41566, [53877] = 41562, + [53879] = 41565, [53884] = 41563, [53885] = 41561, [53888] = 41564, + [53917] = 41567, [53919] = 41572, [53921] = 41568, [53924] = 41571, + [53929] = 41573, [53932] = 41570, [53933] = 41569, [53943] = 41560, + [53945] = 41577, [53946] = 41718, [53948] = 41719, [53949] = 41578, + [53950] = 41817, [53951] = 41790, [53952] = 42138, [53954] = 41581, + [53955] = 41728, [53957] = 41720, [53958] = 41580, [53959] = 41791, + [53960] = 41727, [53961] = 41579, [53962] = 41784, [53963] = 41747, + [53964] = 41785, [53965] = 41725, [53966] = 41783, [53967] = 41701, + [53968] = 41740, [53970] = 41796, [53971] = 41703, [53972] = 41820, + [53973] = 41702, [53974] = 41726, [53975] = 41789, [53976] = 41777, + [53977] = 41780, [53978] = 41734, [53979] = 41794, [53980] = 41582, + [53981] = 41733, [53982] = 41792, [53983] = 41689, [53984] = 41686, + [53985] = 41688, [53986] = 41730, [53987] = 41690, [53988] = 41721, + [53990] = 41732, [53991] = 41687, [53992] = 41779, [53993] = 41722, + [53994] = 41818, [53995] = 41795, [53996] = 41723, [53997] = 41698, + [53998] = 41697, [54000] = 41738, [54001] = 41693, [54002] = 41699, + [54003] = 41781, [54004] = 41782, [54005] = 41737, [54006] = 41694, + [54008] = 41724, [54009] = 41696, [54010] = 41739, [54011] = 41692, + [54012] = 41819, [54013] = 41736, [54014] = 41735, [54019] = 41793, + [54023] = 41778, [55384] = 41705, [55387] = 41743, [55388] = 41744, + [55389] = 41704, [55390] = 41786, [55392] = 41706, [55393] = 41742, + [55395] = 41787, [55396] = 41708, [55397] = 41798, [55398] = 41799, + [55400] = 41710, [55401] = 41797, [55403] = 41711, [55404] = 41709, + [55405] = 41788, [55407] = 41707, [56049] = 42298, [56052] = 42301, + [56053] = 42309, [56054] = 42299, [56055] = 42314, [56056] = 42302, + [56074] = 42300, [56076] = 42303, [56077] = 42304, [56079] = 42305, + [56081] = 42306, [56083] = 42307, [56084] = 42308, [56085] = 42310, + [56086] = 42311, [56087] = 42312, [56088] = 42313, [56089] = 42315, + [56496] = 42648, [56497] = 42649, [56498] = 42650, [56499] = 42651, + [56500] = 42652, [56501] = 42653, [58147] = 43317, [58148] = 43318, + [58149] = 43319, [58150] = 43320, [58492] = 43485, [58507] = 43497, + [58954] = 43597, [66556] = 46937, [66447] = 46917, [66429] = 46899, + [66557] = 46938, [66430] = 46900, [66432] = 46902, [66433] = 46903, + [66497] = 46924, [66561] = 46942, [66434] = 46904, [66498] = 46925, + [66499] = 46926, [66436] = 46906, [66500] = 46927, [66437] = 46907, + [66501] = 46928, [66565] = 46946, [66438] = 46908, [66502] = 46929, + [66566] = 46947, [66439] = 46909, [66503] = 46930, [66567] = 46948, + [66440] = 46910, [66504] = 46931, [66441] = 46911, [66505] = 46932, + [66569] = 46950, [66442] = 46912, [66506] = 46933, [66570] = 46951, + [66443] = 46913, [66444] = 46914, [66572] = 46953, [66445] = 46915, + [66573] = 46956, [66446] = 46916, [66574] = 47007, [66575] = 47008, + [66448] = 46918, [66576] = 47010, [66449] = 46919, [66577] = 47011, + [66450] = 46920, [66578] = 47012, [66451] = 46921, [66579] = 47015, + [66452] = 46922, [66580] = 47016, [66453] = 46923, [66581] = 47017, + [66582] = 47018, [66583] = 47019, [66584] = 47020, [66586] = 47022, + [68253] = 49112, [66338] = 46897, [66571] = 46952, [66564] = 46945, + [66562] = 46943, [66560] = 46941, [66558] = 46939, [66554] = 46935, + [66559] = 46940, [66585] = 47021, [66555] = 46936, [66587] = 47023, + [66431] = 46901, [66428] = 46898, [66435] = 46905, [66563] = 46944, + [66553] = 46934, [66568] = 46949, + + ------------------------------------------------------------------------------- + --Leatherworking + ------------------------------------------------------------------------------- + [2158] = 2406, [2163] = 2407, [2164] = 2408, [2169] = 2409, + [3762] = 4293, [3765] = 7360, [3767] = 4294, [3769] = 4296, + [3771] = 4297, [3772] = 7613, [3773] = 4299, [3775] = 4298, + [3777] = 4300, [3778] = 14635, [3779] = 4301, [4096] = 13287, + [4097] = 13288, [5244] = 5083, [6702] = 5786, [6703] = 5787, + [6704] = 5788, [6705] = 5789, [7133] = 5972, [7149] = 5973, + [7153] = 5974, [7953] = 6474, [7954] = 6475, [7955] = 6476, + [8322] = 6710, [9064] = 7288, [9070] = 7289, [9072] = 7290, + [9146] = 7361, [9147] = 7362, [9148] = 7363, [9149] = 7364, + [9195] = 7449, [9197] = 7450, [9202] = 7451, [9207] = 7452, + [9208] = 7453, [10490] = 8384, [10509] = 8385, [10516] = 8409, + [10520] = 8386, [10525] = 8395, [10529] = 8403, [10531] = 8387, + [10533] = 8397, [10542] = 8398, [10544] = 8404, [10546] = 8405, + [10554] = 8399, [10560] = 8389, [10562] = 8390, [10564] = 8400, + [10566] = 8406, [10568] = 8401, [10570] = 8402, [10572] = 8407, + [10574] = 8408, [19048] = 15724, [19049] = 15725, [19050] = 15726, + [19051] = 15727, [19052] = 15728, [19053] = 15729, [19054] = 15730, + [19055] = 15731, [19059] = 15732, [19060] = 15733, [19061] = 15734, + [19062] = 15735, [19063] = 15737, [19064] = 15738, [19065] = 15739, + [19066] = 15740, [19067] = 15741, [19068] = 20253, [19070] = 15743, + [19071] = 15744, [19072] = 15745, [19073] = 15746, [19074] = 15747, + [19075] = 15748, [19076] = 15749, [19077] = 15751, [19078] = 15752, + [19079] = 15753, [19080] = 20254, [19081] = 15755, [19082] = 15756, + [19083] = 15757, [19084] = 15758, [19085] = 15759, [19086] = 15760, + [19087] = 15761, [19088] = 15762, [19089] = 15763, [19090] = 15764, + [19091] = 15765, [19092] = 15768, [19093] = 15769, [19094] = 15770, + [19095] = 15771, [19097] = 15772, [19098] = 15773, [19100] = 15774, + [19101] = 15775, [19102] = 15776, [19103] = 15777, [19104] = 15779, + [19107] = 15781, [20853] = 17022, [20854] = 17023, [20855] = 17025, + [21943] = 17722, [22711] = 18239, [22727] = 18252, [22921] = 18514, + [22922] = 18515, [22923] = 18516, [22926] = 18517, [22927] = 18518, + [22928] = 18519, [23190] = 18731, [23399] = 18949, [23703] = 19326, + [23704] = 19327, [23705] = 19328, [23706] = 19329, [23707] = 19330, + [23708] = 19331, [23709] = 19332, [23710] = 19333, [24121] = 19769, + [24122] = 19770, [24123] = 19771, [24124] = 19772, [24125] = 19773, + [24703] = 20382, [24846] = 20506, [24847] = 20507, [24848] = 20508, + [24849] = 20509, [24850] = 20510, [24851] = 20511, [24940] = 20576, + [26279] = 21548, [28472] = 22771, [28473] = 22770, [28474] = 22769, + [32455] = 25720, [32457] = 25721, [32458] = 25722, [32461] = 25725, + [32482] = 25726, [32485] = 25728, [32487] = 25729, [32488] = 25731, + [32489] = 25730, [32490] = 25732, [32493] = 25733, [32494] = 25734, + [32495] = 25735, [32496] = 25736, [32497] = 25737, [32498] = 29213, + [32499] = 29214, [32500] = 29215, [32501] = 29217, [32502] = 29219, + [32503] = 29218, [35520] = 29669, [35521] = 29672, [35522] = 29673, + [35523] = 29674, [35524] = 29675, [35525] = 29677, [35526] = 29682, + [35527] = 29684, [35528] = 29691, [35529] = 29689, [35530] = 30444, + [35531] = 29693, [35532] = 29698, [35533] = 29700, [35534] = 29701, + [35535] = 29702, [35536] = 29703, [35537] = 29704, [35538] = 29713, + [35539] = 34175, [35543] = 29717, [35544] = 34173, [35549] = 31361, + [35554] = 31362, [35555] = 29720, [35557] = 29721, [35558] = 29723, + [35559] = 35302, [35560] = 29725, [35561] = 29726, [35562] = 35303, + [35563] = 29728, [35564] = 29729, [35567] = 29730, [35568] = 35300, + [35572] = 29732, [35573] = 35301, [35574] = 29734, [36349] = 30301, + [36351] = 30302, [36352] = 30303, [36353] = 30304, [36355] = 30305, + [36357] = 30306, [36358] = 30307, [36359] = 30308, [39997] = 32429, + [40001] = 32431, [40002] = 32432, [40003] = 32433, [40004] = 32434, + [40005] = 32435, [40006] = 32436, [41156] = 32744, [41157] = 35523, + [41158] = 35527, [41160] = 35528, [41161] = 35517, [41162] = 35524, + [41163] = 35520, [41164] = 35521, [42546] = 33124, [42731] = 33205, + [44359] = 34200, [44768] = 34218, [44953] = 34262, [45117] = 34491, + [46132] = 35546, [46133] = 35541, [46134] = 35214, [46135] = 35215, + [46136] = 35216, [46137] = 35217, [46138] = 35218, [46139] = 35549, + [50970] = 44509, [50971] = 44510, [52733] = 32430, + [57692] = 44559, [57694] = 44560, [57696] = 44561, [57699] = 44562, + [57701] = 44563, [60645] = 44511, [60647] = 44512, [60697] = 44513, + [60702] = 44514, [60703] = 44515, [60704] = 44516, [60705] = 44517, + [60706] = 44518, [60711] = 44519, [60712] = 44520, [60715] = 44521, + [60716] = 44522, [60718] = 44523, [60720] = 44524, [60721] = 44525, + [60723] = 44526, [60725] = 44527, [60727] = 44528, [60728] = 44530, + [60729] = 44531, [60730] = 44532, [60731] = 44533, [60732] = 44534, + [60734] = 44535, [60735] = 44536, [60737] = 44537, [60743] = 44538, + [60746] = 44539, [60747] = 44540, [60748] = 44541, [60749] = 44542, + [60750] = 44543, [60751] = 44544, [60752] = 44545, [60754] = 44546, + [60755] = 44547, [60756] = 44548, [60757] = 44549, [60758] = 44550, + [60759] = 44551, [60760] = 44552, [60761] = 44553, [60996] = 44584, + [60997] = 44585, [60998] = 44586, [60999] = 44587, [61000] = 44588, + [61002] = 44589, [62176] = 44932, [62177] = 44933, [63194] = 45094, + [63195] = 45095, [63196] = 45096, [63197] = 45097, [63198] = 45098, + [63199] = 45099, [63200] = 45100, [63201] = 45101, [70554] = 49957, + [70555] = 49958, [70556] = 49959, [70557] = 49961, [70558] = 49962, + [70559] = 49963, [70560] = 49965, [70561] = 49966, [67136] = 47650, + [67137] = 47646, [67138] = 47649, [67139] = 47647, [67141] = 47653, + [67142] = 47651, [67143] = 47648, [67140] = 47652, + + ------------------------------------------------------------------------------- + --Smelting + ------------------------------------------------------------------------------- + [22967] = 44956, [46353] = 35273, + + ------------------------------------------------------------------------------- + --Tailoring + ------------------------------------------------------------------------------- + [2389] = 2598, [2403] = 2601, [3758] = 4292, [3844] = 4346, + [3847] = 4345, [3849] = 4347, [3851] = 4349, [3854] = 7114, + [3856] = 4350, [3857] = 14630, [3858] = 4351, [3860] = 4352, + [3862] = 4355, [3863] = 4353, [3864] = 4356, [3868] = 4348, + [3869] = 14627, [3870] = 6401, [3872] = 4354, [3873] = 10728, + [6686] = 5771, [6688] = 5772, [6692] = 5773, [6693] = 5774, + [6695] = 5775, [7629] = 6271, [7630] = 6270, [7633] = 6272, + [7639] = 6274, [7643] = 6275, [7892] = 6390, [7893] = 6391, + [8780] = 7092, [8782] = 7091, [8784] = 7090, [8786] = 7089, + [8789] = 7087, [8793] = 7084, [8795] = 7085, [8797] = 7086, + [8802] = 7088, [12047] = 10316, [12056] = 10300, [12059] = 10301, + [12060] = 10302, [12064] = 10311, [12066] = 10312, [12075] = 10314, + [12078] = 10315, [12080] = 10317, [12081] = 10318, [12084] = 10320, + [12085] = 10321, [12086] = 10463, [12089] = 10323, [12091] = 10325, + [12093] = 10326, [18403] = 14466, [18404] = 14467, [18405] = 14468, + [18406] = 14469, [18407] = 14470, [18408] = 14471, [18409] = 14472, + [18410] = 14473, [18411] = 14474, [18412] = 14476, [18413] = 14477, + [18414] = 14478, [18415] = 14479, [18416] = 14480, [18417] = 14481, + [18418] = 14482, [18419] = 14483, [18420] = 14484, [18421] = 14485, + [18422] = 14486, [18423] = 14488, [18424] = 14489, [18434] = 14490, + [18436] = 14493, [18437] = 14492, [18438] = 14491, [18439] = 14494, + [18440] = 14497, [18441] = 14495, [18442] = 14496, [18444] = 14498, + [18445] = 14499, [18446] = 14500, [18447] = 14501, [18448] = 14507, + [18449] = 14504, [18450] = 14505, [18451] = 14506, [18452] = 14509, + [18453] = 14508, [18454] = 14511, [18455] = 14510, [18456] = 14512, + [18457] = 14513, [18458] = 14514, [18560] = 14526, [20848] = 17017, + [20849] = 17018, [21945] = 17724, [22759] = 18265, [22866] = 18414, + [22867] = 18415, [22868] = 18416, [22869] = 18417, [22870] = 18418, + [22902] = 18487, [23662] = 19215, [23663] = 19218, [23664] = 19216, + [23665] = 19217, [23666] = 19219, [23667] = 19220, [24091] = 19764, + [24092] = 19765, [24093] = 19766, [24901] = 20546, [24902] = 20548, + [24903] = 20547, [26085] = 21358, [26087] = 21371, [26403] = 44916, + [26407] = 44917, [26747] = 21892, [26749] = 21893, [26750] = 21894, + [26751] = 21895, [26752] = 21908, [26753] = 21909, [26754] = 21910, + [26755] = 21911, [26756] = 21912, [26757] = 21914, [26758] = 21913, + [26759] = 21915, [26760] = 21916, [26761] = 21918, [26762] = 21917, + [26763] = 21919, [26773] = 21896, [26774] = 21897, [26775] = 21898, + [26776] = 21899, [26777] = 21900, [26778] = 21901, [26779] = 21902, + [26780] = 21903, [26781] = 21904, [26782] = 21905, [26783] = 21906, + [26784] = 21907, [27658] = 22307, [27659] = 22308, [27660] = 22309, + [27724] = 22310, [27725] = 22312, [28210] = 22683, [28480] = 22774, + [28481] = 22773, [28482] = 22772, [31373] = 24316, [31430] = 24292, + [31431] = 24293, [31432] = 24294, [31433] = 24295, [31434] = 35308, + [31435] = 24297, [31437] = 24298, [31438] = 24299, [31440] = 24300, + [31441] = 24301, [31442] = 35309, [31443] = 24303, [31444] = 24304, + [31448] = 24305, [31449] = 24306, [31450] = 24307, [31451] = 24308, + [31452] = 24309, [31453] = 24310, [31454] = 24311, [31455] = 24312, + [31456] = 24313, [31459] = 24314, [36315] = 30280, [36316] = 30281, + [36317] = 30282, [36318] = 30283, [36686] = 30483, [37873] = 30833, + [37882] = 30842, [37883] = 30843, [37884] = 30844, [40020] = 32437, + [40021] = 32438, [40023] = 32439, [40024] = 32440, [40060] = 32447, + [41205] = 32754, [41206] = 32755, [41207] = 32752, [41208] = 32753, + [44950] = 34261, [44958] = 34319, [46128] = 35204, [46129] = 35205, + [46130] = 35206, [46131] = 35207, [49677] = 37915, [50194] = 38229, + [50644] = 38327, [50647] = 38328, [55993] = 42172, [55994] = 42173, + [55996] = 42175, [55997] = 42177, [55998] = 42176, [55999] = 42178, + [56004] = 42183, [56005] = 42184, [56006] = 42185, [56009] = 42187, + [56011] = 42188, [63924] = 45774, [70550] = 49953, [70551] = 49954, + [70552] = 49955, [70553] = 49956, [63203] = 45102, [63205] = 45104, + [63206] = 45105, [67145] = 47639, [67146] = 47638, [63204] = 45103, + [67144] = 47636, [67147] = 47637, +} + +local RECIPE_TO_SPELL_MAP = {} + +do + for spell_id, recipe_id in pairs(SPELL_TO_RECIPE_MAP) do + RECIPE_TO_SPELL_MAP[recipe_id] = spell_id + end +end + +------------------------------------------------------------------------------- +-- Look up table of spell IDs for recipes which do not have a player flag +-- BASICALLY A TEMPORARY STORAGE FOR IDS, SO WE CAN SEE CLEANER SCANS AND WHAT NOT, +-- WE'LL GO BACK HERE LATER DOWN THE ROAD. +------------------------------------------------------------------------------- +local NO_ROLE_FLAG = { + + -------------------------------------------------------------------------------------------- + -----ASSORTED CRAP + -------------------------------------------------------------------------------------------- + [30344] = true, [30341] = true, [32814] = true, [23066] = true, + [26421] = true, [36955] = true, [19788] = true, [23129] = true, + [26422] = true, [12715] = true, [12899] = true, [56459] = true, + [30307] = true, [26423] = true, [3918] = true, [23067] = true, + [30308] = true, [3953] = true, [15255] = true, [26424] = true, + [30548] = true, [44157] = true, [56462] = true, [19567] = true, + [30552] = true, [23068] = true, [44155] = true, [28327] = true, + [26425] = true, [56461] = true, [68067] = true, [15633] = true, + [23096] = true, [12589] = true, [26442] = true, [26426] = true, + [67920] = true, [9273] = true, [3926] = true, [6458] = true, + [19793] = true, [55252] = true, [9271] = true, [26427] = true, + [26443] = true, [30551] = true, [23486] = true, [3922] = true, + [3924] = true, [12590] = true, [3928] = true, [3942] = true, + [26428] = true, [3952] = true, [22704] = true, [12902] = true, + [30569] = true, [15628] = true, [12895] = true, [21940] = true, + [56349] = true, [12584] = true, [56477] = true, [30348] = true, + [26416] = true, [53281] = true, [23507] = true, [12075] = true, + [12079] = true, [26746] = true, [56000] = true, + + ----------------------------------------------------------------------------------------- + ---JEWELCRAFTING + ----------------------------------------------------------------------------------------- + [55401] = true, [53995] = true, [66432] = true, [25255] = true, + [66497] = true, [53996] = true, [56074] = true, [56202] = true, + [66434] = true, [32801] = true, [28948] = true, [53997] = true, + [39963] = true, [32866] = true, [66501] = true, [39452] = true, + [53934] = true, [66502] = true, [55405] = true, [58954] = true, + [56205] = true, [37855] = true, [38175] = true, [25305] = true, + [25321] = true, [66505] = true, [54000] = true, [39742] = true, + [56206] = true, [66506] = true, [32869] = true, [54001] = true, + [56079] = true, [32259] = true, [32870] = true, [56208] = true, + [32807] = true, [32871] = true, [26873] = true, [31061] = true, + [32872] = true, [42591] = true, [46779] = true, [56530] = true, + [42592] = true, [31062] = true, [56083] = true, [32874] = true, + [56531] = true, [31063] = true, [56085] = true, [38503] = true, + [56086] = true, [28938] = true, [38504] = true, [31064] = true, + [31096] = true, [55384] = true, [25278] = true, [68253] = true, + [43493] = true, [26925] = true, [31065] = true, [46403] = true, + [53852] = true, [53916] = true, [39722] = true, [25615] = true, + [28924] = true, [26926] = true, [53853] = true, [36526] = true, + [31098] = true, [55388] = true, [46405] = true, [53854] = true, + [39724] = true, [55389] = true, [26927] = true, [31051] = true, + [53919] = true, [39725] = true, [55390] = true, [53856] = true, + [53920] = true, [53952] = true, [26880] = true, [53857] = true, + [31052] = true, [34069] = true, [25490] = true, [55393] = true, + [39451] = true, [53956] = true, [44794] = true, [36524] = true, + [55395] = true, [38068] = true, [28944] = true, [53957] = true, + [31066] = true, [31082] = true, [66428] = true, [26909] = true, + [55396] = true, [31097] = true, [25284] = true, [56084] = true, + [62941] = true, [66431] = true, [53894] = true, [53958] = true, + [58146] = true, [31099] = true, [47053] = true, [31067] = true, + [28917] = true, [26903] = true, [36525] = true, [66503] = true, + [56197] = true, [47054] = true, [53961] = true, [39715] = true, + [31092] = true, [53960] = true, [31077] = true, [31101] = true, + [39719] = true, [55399] = true, [31113] = true, [32808] = true, + [53917] = true, [63743] = true, [39720] = true, [39721] = true, + [42590] = true, [58149] = true, [56199] = true, [47056] = true, + [28950] = true, [47280] = true, [32809] = true, [31072] = true, + [25318] = true, [66429] = true, [62242] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ---COOKING + --------------------------------------------------------------------------------------- + [62050]= true, [22761]= true, [62051]= true, [8607]= true, + [18238]= true, [6413]= true, [6417]= true, [42296]= true, + [45557]= true, [6501]= true, [45558]= true, [18239]= true, + [7752]= true, [7828]= true, [45560]= true, [64358]= true, + [57421]= true, [45561]= true, [13028]= true, [2543]= true, + [2545]= true, [25659]= true, [58512]= true, [45565]= true, + [42305]= true, [45566]= true, [62350]= true, [7753]= true, + [45695]= true, [9513]= true, [18244]= true, [20626]= true, + [45569]= true, [43779]= true, [18245]= true, [45571]= true, + [18246]= true, [37836]= true, [57433]= true, [20916]= true, + [58521]= true, [18247]= true, [57435]= true, [7754]= true, + [53056]= true, [58523]= true, [57437]= true, [57438]= true, + [58525]= true, [45570]= true, [2538]= true, [2540]= true, + [2548]= true, [33290]= true, [45562]= true, [15906]= true, + [18241]= true, [45559]= true, [45551]= true, [57443]= true, + [58527]= true, [43758]= true, [58528]= true, [8238]= true, + [7751]= true, [7755]= true, [43761]= true, [7827]= true, + [45552]= true, [45553]= true, [66038] = true, [66034] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ---BLACKSMITHING + --------------------------------------------------------------------------------------- + [10015] = true, [55202] = true, [16726] = true, [24399] = true, + [15293] = true, [32655] = true, [3320] = true, [40033] = true, + [34545] = true, [61010] = true, [16639] = true, [3115] = true, + [3116] = true, [3117] = true, [16648] = true, [40034] = true, + [9920] = true, [9928] = true, [29558] = true, [55839] = true, + [9964] = true, [7818] = true, [55732] = true, [29694] = true, + [3326] = true, [9950] = true, [59405] = true, [12260] = true, + [16983] = true, [16991] = true, [23650] = true, [16640] = true, + [2741] = true, [3513] = true, [3497] = true, [8768] = true, + [19666] = true, [2662] = true, [2663] = true, [20201] = true, + [16664] = true, [15294] = true, [3496] = true, [16645] = true, + [29569] = true, [2737] = true, [14380] = true, [16992] = true, + [36125] = true, [19667] = true, [22757] = true, [16665] = true, + [59406] = true, [2738] = true, [2739] = true, [2740] = true, + [24913] = true, [9933] = true, [20873] = true, [36126] = true, + [40035] = true, [8880] = true, [23636] = true, [3292] = true, + [3293] = true, [21161] = true, [32656] = true, [19668] = true, + [9921] = true, [7222] = true, [3319] = true, [15295] = true, + [20874] = true, [20890] = true, [3337] = true, [34546] = true, + [16970] = true, [16978] = true, [61008] = true, [7224] = true, + [11454] = true, [19669] = true, [55656] = true, [16667] = true, + [16731] = true, [61009] = true, [9926] = true, [16984] = true, + [21913] = true, [40036] = true, [9974] = true, [32657] = true, + [32285] = true, [23638] = true, [10011] = true, [36131] = true, + [27830] = true, [32284] = true, [16732] = true, [15292] = true, + [15296] = true, [38478] = true, [20876] = true, [38475] = true, + [23653] = true, [3325] = true, [14379] = true, [29729] = true, + [2661] = true, [29728] = true, [16655] = true, [16993] = true, + [3491] = true, [3494] = true, [3501] = true, [9959] = true, + [9983] = true, [36262] = true, [10003] = true, [10007] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ----INSCRIPTION + --------------------------------------------------------------------------------------- + [58315] = true, [58331] = true, [58347] = true, [56974] = true, [56990] = true, + [64256] = true, [64304] = true, [57166] = true, [57709] = true, [57214] = true, + [57230] = true, [50603] = true, [57262] = true, [59338] = true, [58332] = true, + [56959] = true, [56975] = true, [56991] = true, [57007] = true, [57023] = true, + [53462] = true, [64257] = true, [64273] = true, [64289] = true, [57151] = true, + [57167] = true, [57183] = true, [57710] = true, [57215] = true, [57247] = true, + [50620] = true, [58301] = true, [59339] = true, [58333] = true, [59387] = true, + [52840] = true, [59499] = true, [56960] = true, [56976] = true, [57008] = true, + [57024] = true, [64258] = true, [64274] = true, [57168] = true, [57184] = true, + [61288] = true, [57216] = true, [57232] = true, [58286] = true, [58302] = true, + [59340] = true, [48114] = true, [64051] = true, [59484] = true, [59500] = true, + [56961] = true, [56977] = true, [57009] = true, [57025] = true, [61177] = true, + [64259] = true, [57121] = true, [64291] = true, [57153] = true, [57169] = true, + [57185] = true, [57712] = true, [57217] = true, [57233] = true, [58287] = true, + [58303] = true, [58319] = true, [56946] = true, [56978] = true, [56994] = true, + [57010] = true, [57026] = true, [64260] = true, [57122] = true, [57154] = true, + [57170] = true, [57186] = true, [57713] = true, [57218] = true, [57234] = true, + [57266] = true, [59326] = true, [58320] = true, [58336] = true, [59486] = true, + [59502] = true, [56963] = true, [56995] = true, [57011] = true, [57027] = true, + [64261] = true, [64277] = true, [57155] = true, [57187] = true, [57714] = true, + [57219] = true, [57235] = true, [58289] = true, [58305] = true, [58321] = true, + [58337] = true, [69385] = true, [57243] = true, [64314] = true, [64313] = true, + [56958] = true, [59487] = true, [59503] = true, [58288] = true, [56980] = true, + [56996] = true, [57012] = true, [57028] = true, [59501] = true, [56948] = true, + [57264] = true, [64246] = true, [64262] = true, [57124] = true, [64294] = true, + [57156] = true, [57172] = true, [57188] = true, [57715] = true, [57220] = true, + [57236] = true, [57268] = true, [58306] = true, [58322] = true, [58338] = true, + [48247] = true, [57133] = true, [57270] = true, [57131] = true, [57129] = true, + [50604] = true, [59488] = true, [59504] = true, [56965] = true, [56981] = true, + [56997] = true, [57013] = true, [57029] = true, [64280] = true, [57114] = true, + [64286] = true, [58299] = true, [57125] = true, [64295] = true, [64311] = true, + [57164] = true, [57189] = true, [57716] = true, [57221] = true, [57237] = true, + [57269] = true, [58307] = true, [58323] = true, [58339] = true, [64307] = true, + [57119] = true, [57246] = true, [68166] = true, [64282] = true, [57250] = true, + [59489] = true, [56957] = true, [56982] = true, [56998] = true, [57014] = true, + [57117] = true, [64305] = true, [61677] = true, [52843] = true, [57126] = true, + [64296] = true, [57158] = true, [64310] = true, [57190] = true, [56956] = true, + [57238] = true, [60336] = true, [58308] = true, [58324] = true, [58340] = true, + [64315] = true, [56949] = true, [56950] = true, [64308] = true, [56955] = true, + [59490] = true, [59315] = true, [56983] = true, [56999] = true, [64267] = true, + [57031] = true, [56954] = true, [64276] = true, [57249] = true, [64249] = true, + [56953] = true, [57127] = true, [64297] = true, [57159] = true, [64275] = true, + [57191] = true, [57207] = true, [57223] = true, [57239] = true, [50612] = true, + [60337] = true, [57208] = true, [58325] = true, [48121] = true, [56952] = true, + [56947] = true, [56951] = true, [64268] = true, [57123] = true, [59475] = true, + [59491] = true, [56968] = true, [56984] = true, [57000] = true, [48248] = true, + [58565] = true, [58317] = true, [64266] = true, [57252] = true, [64250] = true, + [57112] = true, [57128] = true, [64298] = true, [57160] = true, [58316] = true, + [57703] = true, [57719] = true, [57224] = true, [57240] = true, [57272] = true, + [58310] = true, [58326] = true, [58342] = true, [57201] = true, [56945] = true, + [57200] = true, [56944] = true, [57711] = true, [56985] = true, [57001] = true, + [57199] = true, [57033] = true, [56943] = true, [57198] = true, [64251] = true, + [57113] = true, [64283] = true, [64299] = true, [57161] = true, [57197] = true, + [57704] = true, [57209] = true, [57225] = true, [57241] = true, [50614] = true, + [57273] = true, [58311] = true, [58327] = true, [58343] = true, [52738] = true, + [57196] = true, [64278] = true, [57195] = true, [58318] = true, [64284] = true, + [57006] = true, [64316] = true, [56986] = true, [57002] = true, [59560] = true, + [57034] = true, [58341] = true, [57192] = true, [64252] = true, [67600] = true, + [57130] = true, [64300] = true, [57162] = true, [57244] = true, [57194] = true, + [57210] = true, [57226] = true, [50599] = true, [57258] = true, [58296] = true, + [58312] = true, [58328] = true, [58344] = true, [52739] = true, [58298] = true, + [57274] = true, [57265] = true, [57251] = true, [59478] = true, [56971] = true, + [56987] = true, [57003] = true, [57019] = true, [57035] = true, [57259] = true, + [57263] = true, [57271] = true, [64253] = true, [57115] = true, [64285] = true, + [57242] = true, [57163] = true, [57120] = true, [57706] = true, [57211] = true, + [57227] = true, [50600] = true, [50616] = true, [58297] = true, [58313] = true, + [58329] = true, [58345] = true, [50602] = true, [57248] = true, [59559] = true, + [57157] = true, [57257] = true, [64309] = true, [64317] = true, [56972] = true, + [56988] = true, [57004] = true, [57020] = true, [57036] = true, [62162] = true, + [57030] = true, [64254] = true, [57116] = true, [57132] = true, [64302] = true, + [64318] = true, [64270] = true, [57707] = true, [57212] = true, [57228] = true, + [50601] = true, [57260] = true, [57276] = true, [58314] = true, [58330] = true, + [58346] = true, [45382] = true, [57267] = true, [57275] = true, [64312] = true, + [64279] = true, [50598] = true, [59480] = true, [59496] = true, [56973] = true, + [56989] = true, [57005] = true, [57021] = true, [50619] = true, [50618] = true, + [65245] = true, [50617] = true, [64255] = true, [64271] = true, [64287] = true, + [64303] = true, [57165] = true, [57181] = true, [57708] = true, [57213] = true, + [57229] = true, [57245] = true, [57261] = true, [57277] = true, [57253] = true, + [71015] = true, [71101] = true, [71102] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ----ENCHANTING + --------------------------------------------------------------------------------------- + [46578] = true, [25125] = true, [13612] = true, [13620] = true, [13628] = true, + [13640] = true, [13644] = true, [13648] = true, [59625] = true, [13700] = true, + [17181] = true, [27920] = true, [27960] = true, [28016] = true, [45765] = true, + [14810] = true, [63746] = true, [13836] = true, [20008] = true, [20032] = true, + [13868] = true, [13421] = true, [13948] = true, [27905] = true, [27945] = true, + [13501] = true, [7786] = true, [7788] = true, [13529] = true, [32664] = true, + [44506] = true, [25127] = true, [20025] = true, [20033] = true, [13617] = true, + [64579] = true, [60619] = true, [13657] = true, [13693] = true, [27914] = true, + [44555] = true, [27954] = true, [27962] = true, [14807] = true, [32665] = true, + [7421] = true, [13817] = true, [25072] = true, [44492] = true, [44524] = true, + [7443] = true, [44556] = true, [25128] = true, [20026] = true, [7457] = true, + [13378] = true, [34001] = true, [13917] = true, [13933] = true, [13937] = true, + [13941] = true, [44621] = true, [28003] = true, [28027] = true, [13522] = true, + [13538] = true, [25081] = true, [44494] = true, [20011] = true, [25129] = true, + [44590] = true, [47672] = true, [20051] = true, [13622] = true, [13626] = true, + [69412] = true, [60623] = true, [44383] = true, [13698] = true, [13702] = true, + [23804] = true, [44623] = true, [28004] = true, [28028] = true, [14293] = true, + [32667] = true, [13822] = true, [25082] = true, [44576] = true, [20028] = true, + [20036] = true, [13890] = true, [13898] = true, [60609] = true, [59619] = true, + [47898] = true, [7745] = true, [27957] = true, [13503] = true, [34006] = true, + [7793] = true, [7795] = true, [59636] = true, [25083] = true, [20029] = true, + [13631] = true, [13655] = true, [7861] = true, [7863] = true, [62256] = true, + [13695] = true, [13858] = true, [44483] = true, [27968] = true, [7857] = true, + [27967] = true, [42615] = true, [27958] = true, [42613] = true, [25084] = true, + [20017] = true, [33992] = true, [34008] = true, [13663] = true, [60653] = true, + [44528] = true, [14809] = true, [27961] = true, [47901] = true, [7418] = true, + [7420] = true, [44488] = true, [7426] = true, [44616] = true, [13841] = true, + [44596] = true, [17180] = true, [7454] = true, [33993] = true, [34009] = true, + [27950] = true, [20031] = true, [13915] = true, [47900] = true, [13943] = true, + [13947] = true, [13945] = true, [13464] = true, [27927] = true, [7771] = true, + [20014] = true, [20030] = true, [27947] = true, [33994] = true, [28022] = true, + [60692] = true, [25130] = true, [34005] = true, [13794] = true, [7748] = true, + [44588] = true, [15596] = true, [7776] = true, [44584] = true, [13607] = true, + [13653] = true, [20020] = true, [70524] = true, [71692] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ---TAILORING + --------------------------------------------------------------------------------------- + [12055] = true, [12059] = true, [12071] = true, [46131] = true, [23664] = true, + [31433] = true, [31441] = true, [7624] = true, [26403] = true, [24902] = true, + [22866] = true, [56001] = true, [18411] = true, [18419] = true, [18451] = true, + [28208] = true, [6686] = true, [8766] = true, [23665] = true, [8786] = true, + [26747] = true, [56002] = true, [26763] = true, [26779] = true, [31434] = true, + [31450] = true, [60969] = true, [28480] = true, [22867] = true, [56003] = true, + [18404] = true, [18412] = true, [18420] = true, [12044] = true, [63924] = true, + [12056] = true, [12064] = true, [12080] = true, [12084] = true, [23666] = true, + [56004] = true, [26780] = true, [31459] = true, [7892] = true, [60971] = true, + [28481] = true, [22868] = true, [20848] = true, [56005] = true, [18405] = true, + [19435] = true, [26086] = true, [18437] = true, [18453] = true, [27659] = true, + [28210] = true, [40021] = true, [23667] = true, [26773] = true, [26781] = true, + [26759] = true, [8774] = true, [31460] = true, [24903] = true, [3755] = true, + [37882] = true, [3757] = true, [3758] = true, [50194] = true, [18446] = true, + [6692] = true, [28482] = true, [22869] = true, [18439] = true, [20849] = true, + [18440] = true, [2389] = true, [56007] = true, [18455] = true, [6521] = true, + [18445] = true, [18406] = true, [18414] = true, [18422] = true, [12045] = true, + [36318] = true, [18454] = true, [27660] = true, [24091] = true, [12065] = true, + [12069] = true, [12077] = true, [12081] = true, [12085] = true, [27724] = true, + [12093] = true, [40060] = true, [26087] = true, [26749] = true, [31373] = true, + [26750] = true, [26782] = true, [28205] = true, [28209] = true, [36686] = true, + [3813] = true, [2394] = true, [7629] = true, [18438] = true, [7633] = true, + [40023] = true, [49677] = true, [26407] = true, [18452] = true, [7643] = true, + [22870] = true, [26755] = true, [22902] = true, [3869] = true, [55993] = true, + [8789] = true, [3839] = true, [3841] = true, [3844] = true, [18407] = true, + [18415] = true, [3847] = true, [3848] = true, [3851] = true, [3852] = true, + [24092] = true, [3854] = true, [3856] = true, [3857] = true, [8760] = true, + [27725] = true, [8776] = true, [8780] = true, [8784] = true, [3865] = true, + [55994] = true, [3868] = true, [26783] = true, [3871] = true, [3872] = true, + [3873] = true, [31438] = true, [22759] = true, [12091] = true, [8804] = true, + [8772] = true, [18560] = true, [18447] = true, [44950] = true, [60993] = true, + [55899] = true, [55898] = true, [55995] = true, [2385] = true, [21945] = true, + [6688] = true, [12066] = true, [18416] = true, [8465] = true, [12046] = true, + [18448] = true, [3915] = true, [24093] = true, [8489] = true, [2386] = true, + [12078] = true, [12082] = true, [60994] = true, [55900] = true, [2392] = true, + [2393] = true, [23662] = true, [2396] = true, [55996] = true, [2399] = true, + [26784] = true, [2402] = true, [2403] = true, [2406] = true, [31431] = true, + [3864] = true, [8782] = true, [37884] = true, [37883] = true, [26751] = true, + [50647] = true, [8802] = true, [8467] = true, [7893] = true, [40020] = true, + [41208] = true, [22813] = true, [41207] = true, [37873] = true, [2387] = true, + [55997] = true, [26085] = true, [8799] = true, [27658] = true, [8483] = true, + [3914] = true, [18401] = true, [56006] = true, [18441] = true, [18449] = true, + [28207] = true, [55769] = true, [18413] = true, [18421] = true, [46129] = true, + [2963] = true, [2964] = true, [12061] = true, [12086] = true, [23663] = true, + [26745] = true, [55998] = true, [3863] = true, [8764] = true, [31440] = true, + [31448] = true, [12089] = true, [6695] = true, [40024] = true, [60990] = true, + [50644] = true, [8793] = true, [46130] = true, [24901] = true, [3870] = true, + [31437] = true, [44958] = true, [55999] = true, [3845] = true, [6693] = true, + [3866] = true, [18456] = true, [18410] = true, [18418] = true, [2397] = true, + [18434] = true, [18450] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ----LEATHERWORKING + --------------------------------------------------------------------------------------- + [9198] = true, [23704] = true, [60996] = true, [35549] = true, [22921] = true, + [50958] = true, [10509] = true, [10525] = true, [19053] = true, [19085] = true, + [19101] = true, [2149] = true, [36349] = true, [2153] = true, [60997] = true, + [2159] = true, [2163] = true, [2165] = true, [35582] = true, [50959] = true, + [46132] = true, [23705] = true, [60998] = true, [22922] = true, [46133] = true, + [24121] = true, [19054] = true, [19070] = true, [19086] = true, [19102] = true, + [32465] = true, [32481] = true, [22331] = true, [35520] = true, [35584] = true, + [9207] = true, [6661] = true, [46134] = true, [23706] = true, [61000] = true, + [35521] = true, [35585] = true, [50962] = true, [10518] = true, [39997] = true, + [24122] = true, [19055] = true, [19087] = true, [19103] = true, [32466] = true, + [32482] = true, [36353] = true, [35522] = true, [35554] = true, [50963] = true, + [44953] = true, [46136] = true, [23707] = true, [61002] = true, [35523] = true, + [35555] = true, [35587] = true, [50964] = true, [46137] = true, [24123] = true, + [19072] = true, [19104] = true, [9064] = true, [9072] = true, [69386] = true, + [32499] = true, [36355] = true, [7133] = true, [35524] = true, [35588] = true, + [7153] = true, [9208] = true, [46138] = true, [23708] = true, [69388] = true, + [35525] = true, [35557] = true, [10487] = true, [10511] = true, [46139] = true, + [24124] = true, [19073] = true, [19089] = true, [32468] = true, [32500] = true, + [10647] = true, [28472] = true, [35526] = true, [35558] = true, [45117] = true, + [60622] = true, [23709] = true, [35527] = true, [3774] = true, [3778] = true, + [3780] = true, [40003] = true, [24125] = true, [19058] = true, [19074] = true, + [32485] = true, [32501] = true, [36359] = true, [3816] = true, [3818] = true, + [28473] = true, [35528] = true, [35560] = true, [9193] = true, [40004] = true, + [23710] = true, [8322] = true, [35529] = true, [35561] = true, [50970] = true, + [2881] = true, [10520] = true, [40005] = true, [10544] = true, [10552] = true, + [10560] = true, [19091] = true, [19107] = true, [32454] = true, [32502] = true, + [28474] = true, [35530] = true, [50971] = true, [62448] = true, [7953] = true, + [41157] = true, [36074] = true, [24846] = true, [35531] = true, [22928] = true, + [28219] = true, [41158] = true, [36075] = true, [32487] = true, [32503] = true, + [7126] = true, [9146] = true, [35532] = true, [35564] = true, [9194] = true, + [9202] = true, [24655] = true, [36076] = true, [24847] = true, [35533] = true, + [5244] = true, [10529] = true, [28220] = true, [19093] = true, [32456] = true, + [52733] = true, [2158] = true, [2160] = true, [2162] = true, [2166] = true, + [24848] = true, [35535] = true, [35567] = true, [28221] = true, [19094] = true, + [44359] = true, [57690] = true, [32457] = true, [32473] = true, [32489] = true, + [9147] = true, [35536] = true, [35568] = true, [9195] = true, [41163] = true, + [6703] = true, [24849] = true, [20853] = true, [10482] = true, [10490] = true, + [28222] = true, [10546] = true, [10554] = true, [41164] = true, [10570] = true, + [19095] = true, [57692] = true, [32458] = true, [10650] = true, [35538] = true, + [42731] = true, [24850] = true, [20854] = true, [44970] = true, [28223] = true, + [19048] = true, [19064] = true, [19080] = true, [57694] = true, [9148] = true, + [35540] = true, [35572] = true, [24851] = true, [20855] = true, [45100] = true, + [10531] = true, [28224] = true, [57696] = true, [10619] = true, [19081] = true, + [22727] = true, [35539] = true, [19079] = true, [10566] = true, [19065] = true, + [10574] = true, [19097] = true, [60647] = true, [3753] = true, [9065] = true, + [44343] = true, [3763] = true, [3767] = true, [3773] = true, [3775] = true, + [3777] = true, [3779] = true, [32455] = true, [24940] = true, [19050] = true, + [19082] = true, [23190] = true, [32461] = true, [60999] = true, [3817] = true, + [44344] = true, [9149] = true, [35544] = true, [9197] = true, [19077] = true, + [9060] = true, [19076] = true, [35573] = true, [40001] = true, [19066] = true, + [19090] = true, [19098] = true, [22711] = true, [57699] = true, [9059] = true, + [32480] = true, [64661] = true, [10562] = true, [40002] = true, [50936] = true, + [6705] = true, [9058] = true, [24703] = true, [22923] = true, [60645] = true, + [35577] = true, [2152] = true, [10556] = true, [10572] = true, [44770] = true, + [36077] = true, [19059] = true, [19075] = true, [35580] = true, [20648] = true, + [2169] = true, [60643] = true, [19088] = true, [6702] = true, [6704] = true, + [35543] = true, [7149] = true, [36078] = true, [36079] = true, [23703] = true, + [35534] = true, [57701] = true, [46135] = true, [19047] = true, [20649] = true, + [40006] = true, [3765] = true, [41156] = true, [3771] = true, [50956] = true, + [19061] = true, [20650] = true, [32467] = true, [35537] = true, [22926] = true, + [4096] = true, [19062] = true, [44768] = true, [35576] = true, [19063] = true, + [9062] = true, [9070] = true, [32495] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + -----ALCHEMY + --------------------------------------------------------------------------------------- + [53898] = true, [28579] = true, [17566] = true, [53771] = true, [7256] = true, + [53899] = true, [11452] = true, [11460] = true, [11468] = true, [3170] = true, + [3172] = true, [3174] = true, [3176] = true, [53836] = true, [53900] = true, + [28564] = true, [28580] = true, [54220] = true, [17551] = true, [53773] = true, + [53837] = true, [62213] = true, [54221] = true, [53774] = true, [53838] = true, + [6617] = true, [53902] = true, [28581] = true, [2331] = true, [2335] = true, + [2337] = true, [53775] = true, [53839] = true, [11453] = true, [7836] = true, + [24266] = true, [41500] = true, [53904] = true, [53936] = true, [28566] = true, + [28582] = true, [3452] = true, [3454] = true, [33732] = true, [17553] = true, + [22732] = true, [53777] = true, [53905] = true, [53937] = true, [33733] = true, + [62409] = true, [25146] = true, [41502] = true, [53938] = true, [28551] = true, + [28567] = true, [28583] = true, [62410] = true, [7181] = true, [17570] = true, + [17634] = true, [53779] = true, [7257] = true, [53939] = true, [11478] = true, + [17187] = true, [53812] = true, [28552] = true, [28568] = true, [28584] = true, + [60366] = true, [57425] = true, [17635] = true, [53781] = true, [60367] = true, + [4508] = true, [53782] = true, [24365] = true, [6618] = true, [53942] = true, + [28569] = true, [28585] = true, [29688] = true, [57427] = true, [17556] = true, + [17572] = true, [17636] = true, [53783] = true, [11479] = true, [7837] = true, + [7841] = true, [53784] = true, [24366] = true, [53848] = true, [28554] = true, + [28570] = true, [28586] = true, [58868] = true, [33741] = true, [24367] = true, + [28555] = true, [28571] = true, [17574] = true, [17638] = true, [7258] = true, + [11448] = true, [11456] = true, [11464] = true, [11480] = true, [3171] = true, + [3173] = true, [3175] = true, [24368] = true, [28572] = true, [28588] = true, + [45061] = true, [66658] = true, [17559] = true, [17575] = true, [66659] = true, + [66660] = true, [63732] = true, [28573] = true, [66662] = true, [17560] = true, + [2330] = true, [2332] = true, [2334] = true, [66663] = true, [11457] = true, + [11465] = true, [11473] = true, [66664] = true, [3449] = true, [3451] = true, + [3453] = true, [17561] = true, [17577] = true, [28543] = true, [28575] = true, + [7179] = true, [17562] = true, [17578] = true, [7255] = true, [7259] = true, + [11458] = true, [11466] = true, [38962] = true, [53776] = true, [12609] = true, + [53780] = true, [60893] = true, [58871] = true, [3448] = true, [3450] = true, + [3447] = true, [4942] = true, [28576] = true, [15833] = true, [17576] = true, + [41503] = true, [60350] = true, [41501] = true, [17563] = true, [42736] = true, + [54213] = true, [41458] = true, [6624] = true, [39636] = true, [28577] = true, + [32765] = true, [38070] = true, [17564] = true, [17580] = true, [53895] = true, + [11451] = true, [39637] = true, [28546] = true, [28562] = true, [28578] = true, + [60354] = true, [32766] = true, [17565] = true, [22808] = true, [39639] = true, + [60355] = true, [56519] = true, + --------------------------------------------------------------------------------------- + + --------------------------------------------------------------------------------------- + ----ENGINEERING + --------------------------------------------------------------------------------------- + [23081] = true, [12586] = true, [12594] = true, [12622] = true, [30347] = true, + [44391] = true, [30547] = true, [56464] = true, [12754] = true, [12758] = true, + [23489] = true, [23082] = true, [8243] = true, [9269] = true, [30316] = true, + [30332] = true, [12906] = true, [8339] = true, [26420] = true, [56514] = true, + [39971] = true, [12599] = true, [12603] = true, [12607] = true, [43676] = true, + [12619] = true, [54998] = true, [30349] = true, [56468] = true, [12755] = true, + [12759] = true, [63750] = true, [39973] = true, [56465] = true, [56469] = true, + [30318] = true, [30334] = true, [55016] = true, [12903] = true, [54793] = true, + [19795] = true, [8895] = true, [19819] = true, [30558] = true, [39895] = true, + [23069] = true, [23077] = true, [12596] = true, [30303] = true, [56471] = true, + [12624] = true, [19796] = true, [56472] = true, [12760] = true, [63770] = true, + [23070] = true, [23078] = true, [61471] = true, [30304] = true, [30312] = true, + [12908] = true, [12597] = true, [3930] = true, [24356] = true, [67839] = true, + [67326] = true, [56474] = true, [30560] = true, [30568] = true, [30314] = true, + [3929] = true, [56475] = true, [19830] = true, [3946] = true, [54736] = true, + [30563] = true, [24357] = true, [30337] = true, [12591] = true, [19814] = true, + [60866] = true, [12716] = true, [23071] = true, [23079] = true, [12585] = true, + [3923] = true, [3925] = true, [30305] = true, [12621] = true, [30329] = true, + [3931] = true, [3932] = true, [3933] = true, [3936] = true, [3937] = true, + [3938] = true, [3939] = true, [3941] = true, [56473] = true, [3944] = true, + [3945] = true, [3947] = true, [54999] = true, [3949] = true, [3950] = true, + [26417] = true, [12717] = true, [3954] = true, [3955] = true, [3957] = true, + [3958] = true, [3961] = true, [3962] = true, [3963] = true, [3965] = true, + [3966] = true, [3967] = true, [3968] = true, [3969] = true, [3971] = true, + [3972] = true, [3973] = true, [7430] = true, [3977] = true, [3978] = true, + [3979] = true, [19790] = true, [23080] = true, [12620] = true, [30309] = true, + [30346] = true, [12905] = true, [41307] = true, [8334] = true, [56460] = true, + [56476] = true, [12718] = true, [26418] = true, [19791] = true, [3960] = true, + [19815] = true, [13240] = true, [19831] = true, [30570] = true, [19799] = true, + [30306] = true, [30310] = true, [26011] = true, [36954] = true, [3919] = true, + [3920] = true, [19800] = true, [12617] = true, [30311] = true, [56463] = true, + [72952] = true, [72953] = true, + --------------------------------------------------------------------------------------- +} + +local function ItemLinkToID(link) + if not link then + return + end + local _, _, id_num = string.find(link,"item:(%d+):") + + if id_num then + return tonumber(id_num) + end +end + + +local function LoadRecipe() + local recipe_list = private.recipe_list + + if addon.db.profile.autoloaddb then + for idx, prof in pairs(PROFESSIONS) do + addon:InitializeRecipe(prof) + end + end + return recipe_list + +end + +------------------------------------------------------------------------------- +-- Creates a reverse lookup for a recipe list +------------------------------------------------------------------------------- +local GetReverseLookup +do + local reverse_lookup = {} + + function GetReverseLookup(recipe_list) + if not recipe_list then + addon:Print(L["DATAMINER_NODB_ERROR"]) + return + end + twipe(reverse_lookup) + + for i in pairs(recipe_list) do + --if t[recipe_list[i].name] then addon:Print("Dupe: " .. i) end + reverse_lookup[recipe_list[i].name] = i + end + return reverse_lookup + end + +end + +------------------------------------------------------------------------------- +-- Tooltip for data-mining. +------------------------------------------------------------------------------- +local ARLDatamineTT = CreateFrame("GameTooltip", "ARLDatamineTT", UIParent, "GameTooltipTemplate") + +do + -- Tables used in all the Scan functions within this do block. -Torhal + local info, output = {}, {} + + --- Function to compare the skill levels of a trainers recipes with those in the ARL database. + -- @name AckisRecipeList:ScanSkillLevelData + -- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured. + -- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer. Compares the skill levels between the two. + function addon:ScanSkillLevelData(autoscan) + if not IsTradeskillTrainer() then + if not autoscan then + self:Print(L["DATAMINER_SKILLLEVEL_ERROR"]) + end + return + end + local recipe_list = LoadRecipe() -- Get internal database + + if not recipe_list then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + -- Get the initial trainer filters + local avail = GetTrainerServiceTypeFilter("available") + local unavail = GetTrainerServiceTypeFilter("unavailable") + local used = GetTrainerServiceTypeFilter("used") + + -- Clear the trainer filters + SetTrainerServiceTypeFilter("available", 1) + SetTrainerServiceTypeFilter("unavailable", 1) + SetTrainerServiceTypeFilter("used", 1) + + twipe(info) + + -- Get the skill levels from the trainer + for i = 1, GetNumTrainerServices(), 1 do + local name = GetTrainerServiceInfo(i) + local _, skilllevel = GetTrainerServiceSkillReq(i) + + if not skilllevel then + skilllevel = 0 + end + info[name] = skilllevel + end + local found = false + + twipe(output) + + for i in pairs(recipe_list) do + local i_name = recipe_list[i].name + + if info[i_name] and info[i_name] ~= recipe_list[i].skill_level then + found = true + tinsert(output, L["DATAMINER_SKILLELVEL"]:format(i_name, recipe_list[i].skill_level, info[i_name])) + end + end + tinsert(output, "Trainer Skill Level Scan Complete.") + + if found then + self:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end + -- Reset the filters to what they were before + SetTrainerServiceTypeFilter("available", avail or 0) + SetTrainerServiceTypeFilter("unavailable", unavail or 0) + SetTrainerServiceTypeFilter("used", used or 0) + end + + local teach, noteach = {}, {} + + --- Function to compare which recipes are available from a trainer and compare with the internal ARL database. + -- @name AckisRecipeList:ScanTrainerData + -- @param autoscan True when autoscan is enabled in preferences, it will surpress output letting you know when a scan has occured. + -- @return Does a comparison of the information in your internal ARL database, and those items which are available on the trainer. + -- Compares the acquire information of the ARL database with what is available on the trainer. + function addon:ScanTrainerData(autoscan) + if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then -- Make sure the target exists and is a NPC + if not autoscan then + self:Print(L["DATAMINER_TRAINER_NOTTARGETTED"]) + end + return + end + local targetname = UnitName("target") -- Get its name + local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16) -- Get the NPC ID + + if not IsTradeskillTrainer() then -- Are we at a trade skill trainer? + if not autoscan then + self:Print(L["DATAMINER_SKILLLEVEL_ERROR"]) + end + return + end + local recipe_list = LoadRecipe() -- Get internal database + + if not recipe_list then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + + -- Get the initial trainer filters + local avail = GetTrainerServiceTypeFilter("available") + local unavail = GetTrainerServiceTypeFilter("unavailable") + local used = GetTrainerServiceTypeFilter("used") + + -- Clear the trainer filters + SetTrainerServiceTypeFilter("available", 1) + SetTrainerServiceTypeFilter("unavailable", 1) + SetTrainerServiceTypeFilter("used", 1) + + if GetNumTrainerServices() == 0 then + self:Print("Warning: Trainer is bugged, reporting 0 trainer items.") + end + twipe(info) + + -- Get all the names of recipes from the trainer + for i = 1, GetNumTrainerServices(), 1 do + local name = GetTrainerServiceInfo(i) + info[name] = true + end + twipe(teach) + twipe(noteach) + twipe(output) + + -- Dump out trainer info + tinsert(output, L["DATAMINER_TRAINER_INFO"]:format(targetname, targetID)) + + local teachflag = false + local noteachflag = false + + for i in pairs(recipe_list) do + local recipe = recipe_list[i] + local i_name = recipe.name + local acquire = recipe["acquire_data"] + + local train_data = acquire[A.TRAINER] + + if info[i_name] then + local found = false + + if train_data then + for id_num in pairs(train_data) do + if id_num == targetID then + found = true + break + end + end + end + + if not found then + tinsert(teach, i) + teachflag = true + + if not recipe:IsFlagged("common1", "TRAINER") then + tinsert(output, ": Trainer flag needs to be set.") + end + end + -- Trainer does not teach this recipe + else + local found = false + + if train_data then + for id_num in pairs(train_data) do + if id_num == targetID then + found = true + break + end + end + end + + if found then + noteachflag = true + tinsert(noteach, i) + end + end + end + + if teachflag then + tinsert(output, "Missing entries (need to be added):") + tsort(teach) + + for i in ipairs(teach) do + tinsert(output, L["DATAMINER_TRAINER_TEACH"]:format(teach[i], recipe_list[teach[i]].name)) + end + end + + if noteachflag then + tinsert(output, "Extra entries (need to be removed):") + tsort(noteach) + + for i in ipairs(noteach) do + tinsert(output, L["DATAMINER_TRAINER_NOTTEACH"]:format(noteach[i], recipe_list[noteach[i]].name)) + end + end + tinsert(output, "Trainer Acquire Scan Complete.") + tinsert(output, "If you're doing an engineering scan, there may be some goggles listed as extra. These goggles ONLY show up for those classes who can make them, so they may be false positives.") + + if teachflag or noteachflag then + self:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end + -- Reset the filters to what they were before + SetTrainerServiceTypeFilter("available", avail or 0) + SetTrainerServiceTypeFilter("unavailable", unavail or 0) + SetTrainerServiceTypeFilter("used", used or 0) + end +end -- do + +--- Generates tradeskill links for all professions so you can scan them for completeness. +-- @name AckisRecipeList:GenerateLinks +-- @return Generates tradeskill links with all recipes. Used for testing to see if a recipe is missing from the database or not. +function addon:GenerateLinks() + -- This code adopted from Gnomish Yellow Pages with permission + + local guid = UnitGUID("player") + local playerGUID = string.gsub(guid, "0x0+", "") + + -- Listing of all tradeskill professions + local tradelist = {51304, 51300, 51313, 51306, 45363, 51311, 51302, 51309, 51296, 45542} + +--[[ + local encodingLength = floor((#recipeList+5) / 6) + + local encodedString = string.rep("/", encodingLength) +]]-- + local bitmap = {} + bitmap[45542] = "8bffAA" -- First Aid 100% 17/17 recipes + bitmap[51296] = "2/6///7///9f///7//////////g///B" -- Cooking 98.2% 166/169 recipes + --bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/TolD" -- Engineering (53) + bitmap[51306] = "4/////////////3nFA+///9+/P7//f//n//9dgdJgHA87/3f/Tol3B" -- Engineering + bitmap[51302] = "e+//ff////d//u//v//n+vv7/+ujr7/9////bg/+////f344//dA4I8j/X//B4/vu5/////////////////nvA8/M8/D" -- Leatherworking 85.4% 451/528 recipes + bitmap[51304] = "2//v//////f////3//v///////5//////////9/////v" -- Alchemy 100% 251/251 recipes + bitmap[51300] = "2//////f7fM//f/f53/+//7///ze8c6q/f9///P2/////m4BAA2XIG+dFA8//PC////4//z//////////Pwvy//H" -- Blacksmithing 82.9% 413/498 recipes + bitmap[51309] = "4//+/+5a79rv7/vx2/65t3nZ3f33N33LJq/z54Hx//mK7w1GQgFA+AQ4/////7//7//9//2wD" -- Tailoring 74.3% 303/408 recipes + bitmap[51311] = "8//3////fzj//u//////v/7///9///33////////Pw////////////////////////3///////////////////////////D" -- Jewelcrafting 97.5% 540/554 recipes + bitmap[45363] = "g////7////3///////////////////////////////////////////////////fHM+3dqhGYa0f" --Inscription 92.5% 407/440 recipes + bitmap[51313] = "4//////////7///////////w//+//9/n7///////3f//////ZsD" -- Enchanting 94.3% 279/296 recipes + + for i in pairs(tradelist) do + + local tradeName = GetSpellInfo(tradelist[i]) + local tradelink = {} + tradelink[1] = "|cffffd000|Htrade:" + tradelink[2] = tradelist[i] + tradelink[3] = ":450:450:" + tradelink[4] = playerGUID + tradelink[5] = ":" + tradelink[6] = bitmap[tradelist[i]] + tradelink[7] = "|h[" + tradelink[8] = tradeName + tradelink[9] = "]|h|r" + + if (bitmap[tradelist[i]]) then + self:Print(tconcat(tradelink, "")) + else + self:Print("There currently is not a generated tradeskill link for: " .. tradeName) + end + -- /script DEFAULT_CHAT_FRAME:AddMessage(string.gsub(GetTradeSkillListLink(), "\124", "\124\124")) + end + +end + +------------------------------------------------------------------------------- +--- Scans the items in the specified profession +------------------------------------------------------------------------------- +do + local ORDERED_PROFESSIONS = private.ordered_professions + + local recipe_list = {} + local output = {} + + local function Sort_AscID(a, b) + local reca, recb = private.recipe_list[a], private.recipe_list[b] + + return reca.spell_id < recb.spell_id + end + + local function SortRecipeList() + local sorted_recipes = addon.sorted_recipes + twipe(sorted_recipes) + + for n, v in pairs(recipe_list) do + tinsert(sorted_recipes, n) + end + table.sort(sorted_recipes, Sort_AscID) + end + + local function ProfessionScan(prof_name) + local master_list = LoadRecipe() + + if not master_list then + addon:Print(L["DATAMINER_NODB_ERROR"]) + return + end + twipe(recipe_list) + + if prof_name == private.professions["Smelting"]:lower() then + prof_name = private.mining_name:lower() + end + + for i in pairs(master_list) do + local prof = string.lower(master_list[i].profession) + + if prof and prof == prof_name then + recipe_list[i] = master_list[i] + end + end + SortRecipeList() + twipe(output) + + -- Parse the entire recipe database + for index, id in ipairs(addon.sorted_recipes) do + local ttscantext = addon:TooltipScanRecipe(id, false, true) + + if ttscantext and ttscantext ~= "" then + tinsert(output, ttscantext) + end + end + + if #output == 0 then + addon:Debug("ProfessionScan(): output is empty.") + end + addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) + ARLDatamineTT:Hide() + end + + --- Parses all recipes for a specified profession, scanning their tool tips. + -- @name AckisRecipeList:ScanProfession + -- @usage AckisRecipeList:ScanProfession("first aid") + -- @param prof_name The profession name or the spell ID of it, which you wish to scan. + -- @return Recipes in the given profession have their tooltips scanned. + function addon:ScanProfession(prof_name) + if type(prof_name) == "number" then + prof_name = GetSpellInfo(prof_name) + end + + local found = false + prof_name = string.lower(prof_name) + + local scan_all = prof_name == "all" + + if not scan_all then + for idx, name in ipairs(ORDERED_PROFESSIONS) do + if prof_name == name:lower() then + found = true + break + end + end + + if not found then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + + ProfessionScan(prof_name) + else + for idx, name in ipairs(ORDERED_PROFESSIONS) do + ProfessionScan(name:lower()) + end + end + end + + local FILTER_STRINGS = private.filter_strings + local ACQUIRE_STRINGS = private.acquire_strings + local REP_LEVELS = private.rep_level_strings + local FACTION_NAMES = private.faction_strings + local Q = private.item_quality_names + local V = private.game_version_names + + local NUM_FILTER_FLAGS = 128 + + local FUNCTION_FORMATS = { + [A.TRAINER] = "self:AddRecipeTrainer(%d, %s)", + [A.VENDOR] = "self:AddRecipeVendor(%d, %s)", + [A.MOB_DROP] = "self:AddRecipeMobDrop(%d, %s)", + [A.WORLD_DROP] = "self:AddRecipeWorldDrop(%d, %s)", + [A.QUEST] = "self:AddRecipeQuest(%d, %s)", + } + + local function RecipeDump(id, single) + local recipe = private.recipe_list[id or 1] + + if single and not recipe then + addon:Print("Invalid recipe ID.") + return + end + local flag_string + local specialty = not recipe.specialty and "" or (", "..recipe.specialty) + + tinsert(output, string.format("-- %s -- %d", recipe.name, recipe.spell_id)) + tinsert(output, string.format("AddRecipe(%d, %d, %s, Q.%s, V.%s, %d, %d, %d, %d%s)", + recipe.spell_id, recipe.skill_level, tostring(recipe.item_id), Q[recipe.quality], V[recipe.genesis], + recipe.optimal_level, recipe.medium_level, recipe.easy_level, recipe.trivial_level, specialty)) + + for table_index, bits in ipairs(private.bit_flags) do + for flag_name, flag in pairs(bits) do + local bitfield = recipe.flags[private.flag_members[table_index]] + + if bitfield and bit.band(bitfield, flag) == flag then + if not flag_string then + flag_string = "F."..FILTER_STRINGS[private.filter_flags[flag_name]] + else + flag_string = flag_string..", ".."F."..FILTER_STRINGS[private.filter_flags[flag_name]] + end + end + end + end + tinsert(output, string.format("self:AddRecipeFlags(%d, %s)", recipe.spell_id, flag_string)) + + flag_string = nil + + for acquire_type, acquire_info in pairs(recipe.acquire_data) do + if acquire_type == A.REPUTATION then + for rep_id, rep_info in pairs(acquire_info) do + local faction_string = FACTION_NAMES[rep_id] + + if not faction_string then + faction_string = rep_id + addon:Printf("Recipe %d (%s) - no string for faction %d", recipe.spell_id, recipe.name, rep_id) + else + faction_string = "FAC."..faction_string + end + + for rep_level, level_info in pairs(rep_info) do + local rep_string = "REP."..REP_LEVELS[rep_level or 1] + local values + + for vendor_id in pairs(level_info) do + values = values and (values..", "..vendor_id) or vendor_id + end + tinsert(output, string.format("self:AddRecipeRepVendor(%d, %s, %s, %s)", recipe.spell_id, faction_string, rep_string, values)) + end + end + elseif FUNCTION_FORMATS[acquire_type] then + local values + + for id_num in pairs(acquire_info) do + local saved_id = (type(id_num) == "string" and ("\""..id_num.."\"") or id_num) + values = values and (values..", "..saved_id) or saved_id + end + tinsert(output, string.format(FUNCTION_FORMATS[acquire_type], recipe.spell_id, values)) + else + for id_num in pairs(acquire_info) do + if not flag_string then + flag_string = "A."..ACQUIRE_STRINGS[acquire_type]..", "..(type(id_num) == "string" and ("\""..id_num.."\"") or id_num) + else + flag_string = flag_string..", ".."A."..ACQUIRE_STRINGS[acquire_type]..", "..(type(id_num) == "string" and ("\""..id_num.."\"") or id_num) + end + end + end + end + + if flag_string then + tinsert(output, string.format("self:AddRecipeAcquire(%d, %s)", recipe.spell_id, flag_string)) + end + tinsert(output, "") + end + + local function ProfessionDump(prof_name) + local master_list = LoadRecipe() + + if not master_list then + addon:Print(L["DATAMINE_NODB_ERROR"]) + return + end + twipe(recipe_list) + + if prof_name == private.professions["Smelting"]:lower() then + prof_name = private.mining_name:lower() + end + for i in pairs(master_list) do + local prof = string.lower(master_list[i].profession) + + if prof and prof == prof_name then + recipe_list[i] = master_list[i] + end + end + SortRecipeList() + twipe(output) + + for index, id in ipairs(addon.sorted_recipes) do + RecipeDump(id, false) + end + addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end + + function addon:DumpRecipe(id_num) + twipe(output) + RecipeDump(id_num, true) + addon:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end + + function addon:DumpProfession(prof_name) + if type(prof_name) == "number" then + prof_name = GetSpellInfo(prof_name) + end + + local found = false + prof_name = string.lower(prof_name) + + local scan_all = prof_name == "all" + + if not scan_all then + for idx, name in ipairs(ORDERED_PROFESSIONS) do + if prof_name == name:lower() then + found = true + break + end + end + + if not found then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + ProfessionDump(prof_name) + else + for idx, name in ipairs(ORDERED_PROFESSIONS) do + ProfessionDump(name:lower()) + end + end + end +end -- do + +local RECIPE_TYPES = { + -- JC + ["design: "] = true, + -- LW or Tailoring + ["pattern: "] = true, + -- Alchemy or Cooking + ["recipe: "] = true, + -- BS + ["plans: "] = true, + -- Enchanting + ["formula: "] = true, + -- Engineering + ["schematic: "] = true, + -- First Aid + ["manual: "] = true, + + ["alchemy: "] = true, + ["blacksmithing: "] = true, + ["cooking: "] = true, + ["enchanting: "] = true, + ["engineering: "] = true, + ["first aid: "] = true, + ["inscription: "] = true, + ["jewelcrafting: "] = true, + ["leatherworking: "] = true, + ["tailoring: "] = true, +} + +--- Scans the items on a vendor, determining which recipes are available if any and compares it with the database entries +-- @name AckisRecipeList:ScanVendor +-- @usage AckisRecipeList:ScanVendor() +-- @return Obtains all the vendor information on tradeskill recipes and attempts to compare the current vendor with the internal database +do + local output = {} + + function addon:ScanVendor() + if not (UnitExists("target") and (not UnitIsPlayer("target")) and (not UnitIsEnemy("player", "target"))) then -- Make sure the target exists and is a NPC + self:Print(L["DATAMINER_VENDOR_NOTTARGETTED"]) + return + end + local recipe_list = LoadRecipe() -- Get internal database + + if not recipe_list then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + local targetname = UnitName("target") -- Get its name + local targetID = tonumber(string.sub(UnitGUID("target"), -12, -7), 16) -- Get the NPC ID + local added = false + + twipe(output) + + tinsert(output, "Vendor Name: "..targetname.." NPC ID: "..targetID) + -- Parse all the items on the merchant + for i = 1, GetMerchantNumItems(), 1 do + local name, _, _, _, numAvailable = GetMerchantItemInfo(i) + + if name then + -- Lets scan recipes only on vendors + local matchtext = string.match(name, "%a+: ") + + -- Check to see if we're dealing with a recipe + if matchtext and RECIPE_TYPES[string.lower(matchtext)] then + local item_link = GetMerchantItemLink(i) + local item_id = ItemLinkToID(item_link) + local spell_id = RECIPE_TO_SPELL_MAP[item_id] + + if spell_id then + local ttscantext = addon:TooltipScanRecipe(spell_id, true, true) + + if ttscantext and ttscantext ~= "" then + added = true + tinsert(output, ttscantext) + end + + -- Check the database to see if the vendor is listed as an acquire method. + local acquire = recipe_list[spell_id]["acquire_data"] + local vendor_data = acquire[A.VENDOR] + local rep_data = acquire[A.REPUTATION] + local found = false + + if vendor_data then + for id_num in pairs(vendor_data) do + if id_num == targetID then + found = true + break + end + end + elseif rep_data then + for id_num in pairs(rep_data) do + if id_num == targetID then + found = true + break + end + end + end + + if not found then + added = true + tinsert(output, string.format("Vendor ID missing from \"%s\" %d.", recipe_list[spell_id].name, spell_id)) + end + else + --@debug@ + added = true + tinsert(output, "Spell ID not found for: " .. name) + --@end-debug@ + end + end + end + end + + if added then + self:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end + ARLDatamineTT:Hide() + end +end -- do + +--- Parses all the recipes in the database, and scanning their tooltips. +-- @name AckisRecipeList:TooltipScanDatabase +-- @usage AckisRecipeList:TooltipScanDatabase() +-- @return Entire recipe database has its tooltips scanned. +do + local output = {} + + function addon:TooltipScanDatabase() + -- Get internal database + local recipe_list = LoadRecipe() + + if (not recipe_list) then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + twipe(output) + + -- Parse the entire recipe database + for i in pairs(recipe_list) do + + local ttscantext = addon:TooltipScanRecipe(i, false, true) + if (ttscantext) then + tinsert(output, ttscantext) + end + end + self:DisplayTextDump(nil, nil, tconcat(output, "\n")) + end +end -- do +--- Parses a specific recipe in the database, and scanning its tooltip +-- @name AckisRecipeList:TooltipScanRecipe +-- @param spell_id The [[[http://www.wowwiki.com/SpellLink|Spell ID]]] of the recipe being added to the database +-- @param is_vendor Boolean to determine if we're viewing a vendor or not +-- @param is_largescan Boolean to determine if we're doing a large scan +-- @return Recipe has its tooltips scanned + + +-- Table to store scanned information. Wiped and re-used every scan. +local scan_data = {} + +do + --------------------------------------------------------------------------------------------------------- + ----This table, DO_NOT_SCAN, contains itemid's that will not cache on the servers + --------------------------------------------------------------------------------------------------------- + + local DO_NOT_SCAN = { + ------------------------------------------------------------------------------- + --Leatherworking + ------------------------------------------------------------------------------- + [35214] = true, [32434] = true, [15769] = true, + [32431] = true, [32432] = true, [35215] = true, [35521] = true, + [35520] = true, [35524] = true, [35517] = true, [35528] = true, + [35527] = true, [35523] = true, [35549] = true, [35218] = true, + [35217] = true, [35216] = true, [35546] = true, [35541] = true, [15756] = true, + [15777] = true, [32433] = true, [29729] = true, [29732] = true, [32744] = true, + [15773] = true, [30301] = true, [15745] = true, [35302] = true, [15774] = true, + + ------------------------------------------------------------------------------- + --Tailoring + ------------------------------------------------------------------------------- + [14477] = true, [14485] = true, [30281] = true, [14478] = true, [14500] = true, + [32439] = true, [14479] = true, [32447] = true, [14480] = true, [32437] = true, + [14495] = true, [14505] = true, [35204] = true, [35205] = true, [35206] = true, + [14473] = true, [14488] = true, [14481] = true, + [35309] = true, [30280] = true, [14492] = true, [14491] = true, + + ------------------------------------------------------------------------------- + --Jewelcrafting + ------------------------------------------------------------------------------- + [23130] = true, [23140] = true, [23137] = true, [23131] = true, [23148] = true, + [35538] = true, [35201] = true, [35533] = true, [35200] = true, [23147] = true, + [23135] = true, [35203] = true, [35198] = true, [23152] = true, [23151] = true, + [23141] = true, [28596] = true, [28291] = true, [23153] = true, + + ------------------------------------------------------------------------------- + --Alchemy + ------------------------------------------------------------------------------- + [22925] = true, [13480] = true, [13481] = true, [13493] = true, [35295] = true, + [44568] = true, + + ------------------------------------------------------------------------------- + --Cooking + ------------------------------------------------------------------------------- + [39644] = true, + + ------------------------------------------------------------------------------- + --Blacksmithing + ------------------------------------------------------------------------------- + [32441] = true, [32443] = true, [12687] = true, [12714] = true, [12688 ] = true, + [35211] = true, [35209] = true, [35210] = true, [12706] = true, [7982] = true, + [12718] = true, [23621] = true, [35208] = true, [12716] = true, [23632] = true, + [23633] = true, [30324] = true, [23637] = true, [31393] = true,[22221] = true, + [12690] = true, [31394] = true,[31395] = true,[23630] = true,[23629] = true,[7978] = true, + [41120] = true, [12717] = true,[22219] = true,[23627] = true, + + ------------------------------------------------------------------------------- + --Engineering + ------------------------------------------------------------------------------- + [35196] = true, [21734] = true, [18292] = true, [21727] = true, [21735] = true, [16053] = true, [21729] = true, + [16047] = true,[21730] = true,[21731] = true,[21732] = true,[4411] = true, [21733] = true, [21728] = true, + [35186] = true, [18655] = true, + + ------------------------------------------------------------------------------- + --Enchanting + ------------------------------------------------------------------------------- + [16222] = true, [20734] = true, [20729] = true, [20731] = true, [16246] = true, + } + + local output = {} + + function addon:TooltipScanRecipe(spell_id, is_vendor, is_largescan) + local recipe_list = LoadRecipe() + + if not recipe_list then + self:Print(L["DATAMINER_NODB_ERROR"]) + return + end + local recipe = recipe_list[spell_id] + + if not recipe then + self:Debug("Spell ID %d does not exist in the database.", tonumber(spell_id)) + return + end + local recipe_name = recipe.name + local game_vers = recipe.genesis + + twipe(output) + + if not game_vers then + tinsert(output, "No expansion information: " .. tostring(spell_id) .. " " .. recipe_name) + elseif game_vers > private.game_versions.WOTLK then + tinsert(output, "Expansion information too high: " .. tostring(spell_id) .. " " .. recipe_name) + end + local optimal = recipe.optimal_level + local medium = recipe.medium_level + local easy = recipe.easy_level + local trivial = recipe.trivial_level + local skill_level = recipe.skill_level + + if not optimal then + tinsert(output, "No skill level information: " .. tostring(spell_id) .. " " .. recipe_name) + else + -- Highest level is greater than the skill of the recipe + if optimal > skill_level then + tinsert(output, "Skill Level Error (optimal_level > skill_level): " .. tostring(spell_id) .. " " .. recipe_name) + elseif optimal < skill_level then + tinsert(output, "Skill Level Error (optimal_level < skill_level): " .. tostring(spell_id) .. " " .. recipe_name) + end + + -- Level info is messed up + if optimal > medium or optimal > easy or optimal > trivial or medium > easy or medium > trivial or easy > trivial then + tinsert(output, "Skill Level Error: " .. tostring(spell_id) .. " " .. recipe_name) + end + end + local recipe_link = recipe.spell_link + + if not recipe_link then + if recipe.profession ~= GetSpellInfo(53428) then -- Lets hide this output for runeforging. + self:Printf("Missing spell_link for ID %d (%s).", spell_id, recipe_name) + end + return + end + ARLDatamineTT:SetOwner(WorldFrame, "ANCHOR_NONE") + GameTooltip_SetDefaultAnchor(ARLDatamineTT, UIParent) + + ARLDatamineTT:SetHyperlink(recipe_link) + + -- Check to see if this is a recipe tooltip. + local text = string.lower(_G["ARLDatamineTTTextLeft1"]:GetText()) + local match_text = string.match(text, "%a+: ") + + if not RECIPE_TYPES[match_text] and not (string.find(text, "smelt") or string.find(text, "sunder") or string.find(text, "shatter")) then + ARLDatamineTT:Hide() + return + end + local reverse_lookup = GetReverseLookup(recipe_list) + + local item_id = SPELL_TO_RECIPE_MAP[spell_id] + + wipe(scan_data) + + if item_id and not DO_NOT_SCAN[item_id] then + local item_name, item_link, item_quality = GetItemInfo(item_id) + + if item_name then + scan_data.quality = item_quality + + ARLDatamineTT:SetHyperlink(item_link) + self:ScanToolTip(recipe_name, recipe_list, reverse_lookup, is_vendor) + else + local querier_string = _G.Querier and string.format(" To fix: /iq %d", item_id) or "" + + tinsert(output, string.format("%s: %d", recipe.name, spell_id)) + tinsert(output, string.format(" Recipe item not in cache.%s", querier_string)) + end + elseif not item_id then + -- We are dealing with a recipe that does not have an item to learn it from. + -- Lets check the recipe flags to see if we have a data error and the item should exist + if not recipe:IsFlagged("common1", "RETIRED") + and (recipe:IsFlagged("common1", "VENDOR") or recipe:IsFlagged("common1", "INSTANCE") or recipe:IsFlagged("common1", "RAID")) then + tinsert(output, string.format("%s: %d", recipe.name, spell_id)) + tinsert(output, " No match found in the SPELL_TO_RECIPE_MAP table.") + end + end + ARLDatamineTT:Hide() + + -- Add the flag scan to the table if it's not nil + local results = self:PrintScanResults() + + if results then + tinsert(output, results) + end + + if is_largescan then + return tconcat(output, "\n") + else + self:Print(tconcat(output, "\n")) + end + end +end -- do + +------------------------------------------------------------------------------- +-- Tooltip-scanning code +------------------------------------------------------------------------------- +do + local SPECIALTY_TEXT = { + ["requires spellfire tailoring"] = 26797, + ["requires mooncloth tailoring"] = 26798, + ["requires shadoweave tailoring"] = 26801, + ["requires dragonscale leatherworking"] = 10657, + ["requires elemental leatherworking"] = 10659, + ["requires tribal leatherworking"] = 10661, + ["requires gnomish engineer"] = 20219, + ["requires goblin engineer"] = 20222, + ["requires armorsmith"] = 9788, + ["requires master axesmith"] = 17041, + ["requires master hammersmith"] = 17040, + ["requires master swordsmith"] = 17039, + ["requires weaponsmith"] = 9787, + } + + local FACTION_TEXT = { + ["thorium brotherhood"] = 98, + ["zandalar tribe"] = 100, + ["argent dawn"] = 96, + ["timbermaw hold"] = 99, + ["cenarion circle"] = 97, + ["the aldor"] = 101, + ["the consortium"] = 105, + ["the scryers"] = 110, + ["the sha'tar"] = 111, + ["the mag'har"] = 108, + ["cenarion expedition"] = 103, + ["honor hold"] = 104, + ["thrallmar"] = 104, + ["the violet eye"] = 114, + ["sporeggar"] = 113, + ["kurenai"] = 108, + ["keepers of time"] = 106, + ["the scale of the sands"] = 109, + ["lower city"] = 107, + ["ashtongue deathsworn"] = 102, + ["alliance vanguard"] = 131, + ["valiance expedition"] = 126, + ["horde expedition"] = 130, + ["the taunka"] = 128, + ["the hand of vengeance"] = 127, + ["explorers' league"] = 125, + ["the kalu'ak"] = 120, + ["shattered sun offensive"] = 112, + ["warsong offensive"] = 129, + ["kirin tor"] = 118, + ["the wyrmrest accord"] = 122, + ["knights of the ebon blade"] = 117, + ["frenzyheart tribe"] = 116, + ["the oracles"] = 121, + ["argent crusade"] = 115, + ["the sons of hodir"] = 119, + } + + local FACTION_LEVELS = { + ["neutral"] = 0, + ["friendly"] = 1, + ["honored"] = 2, + ["revered"] = 3, + ["exalted"] = 4, + } + + local CLASS_TYPES = { + ["Death Knight"] = 21, ["Druid"] = 22, ["Hunter"] = 23, + ["Mage"] = 24, ["Paladin"] = 25, ["Priest"] = 26, + ["Shaman"] = 27, ["Rogue"] = 28, ["Warlock"] = 29, + ["Warrior"] = 30, + } + + local ORDERED_CLASS_TYPES = { + [1] = "Death Knight", [2] = "Druid", [3] = "Hunter", + [4] = "Mage", [5] = "Paladin", [6] = "Priest", + [7] = "Shaman", [8] = "Rogue", [9] = "Warlock", + [10] = "Warrior", + } + + local ROLE_TYPES = { + ["dps"] = 51, ["tank"] = 52, ["healer"] = 53, + ["caster"] = 54, + } + + local ORDERED_ROLE_TYPES = { + [1] = "dps", [2] = "tank", [3] = "healer", + [4] = "caster", + } + + local ENCHANT_TO_ITEM = { + ["Cloak"] = "Back", + ["Ring"] = "Finger", + ["2H Weapon"] = "Two-Hand", + } + + local ITEM_TYPES = { + -- Armor types + ["Cloth"] = 56, ["Leather"] = 57, ["Mail"] = 58, + ["Plate"] = 59, ["Back"] = 60, ["Trinket"] = 61, + ["Finger"] = 62, ["Neck"] = 63, ["Shield"] = 64, + + -- Weapon types + ["One-Hand"] = 66, ["Two-Hand"] = 67, ["Axe"] = 68, + ["Sword"] = 69, ["Mace"] = 70, ["Polearm"] = 71, + ["Dagger"] = 72, ["Staff"] = 73, ["Wand"] = 74, + ["Thrown"] = 75, ["Bow"] = 76, ["CrossBow"] = 77, + ["Ammo"] = 78, ["Fist Weapon"] = 79, ["Gun"] = 80, + } + + local ORDERED_ITEM_TYPES = { + -- Armor types + [1] = "Cloth", [2] = "Leather", [3] = "Mail", + [4] = "Plate", [5] = "Back", [6] = "Trinket", + [7] = "Finger", [8] = "Neck", [9] = "Shield", + + -- Weapon types + [11] = "One-Hand", [12] = "Two-Hand", [13] = "Axe", + [14] = "Sword", [15] = "Mace", [16] = "Polearm", + [17] = "Dagger", [18] = "Staff", [19] = "Wand", + [20] = "Thrown", [21] = "Bow", [22] = "CrossBow", + [23] = "Ammo", [24] = "Fist Weapon", [25] = "Gun", + } + + --- Parses the mining tooltip for certain keywords, comparing them with the database flags + -- @name AckisRecipeList:ScanToolTip + -- @param name The name of the recipe + -- @param recipe_list Recipe database + -- @param reverse_lookup Reverse lookup database + -- @param is_vendor Boolean to indicate if we're scanning a vendor + -- @return Scans a tooltip, and outputs the missing or extra filter flags + function addon:ScanToolTip(name, recipe_list, reverse_lookup, is_vendor) + scan_data.match_name = name + scan_data.recipe_list = recipe_list + scan_data.reverse_lookup = reverse_lookup + scan_data.is_vendor = is_vendor + + -- Parse all the lines of the tooltip + for i = 1, ARLDatamineTT:NumLines(), 1 do + local text_l = _G["ARLDatamineTTTextLeft" .. i]:GetText() + local text_r = _G["ARLDatamineTTTextRight" .. i]:GetText() + local text + + if text_r then + text = text_l .. " " .. text_r + else + text = text_l + end + + local text = string.lower(text) + + -- Check for recipe/item binding + -- The recipe binding is within the first few lines of the tooltip always + if string.match(text, "binds when picked up") then + if (i < 3) then + scan_data.recipe_bop = true + else + scan_data.item_bop = true + end + end + + -- Recipe Specialities + if SPECIALTY_TEXT[text] then + scan_data.specialty = SPECIALTY_TEXT[text] + end + + -- Recipe Reputations + local rep, replevel = string.match(text_l, "Requires (.+) %- (.+)") + + if rep and replevel and FACTION_TEXT[rep] then + scan_data.repid = FACTION_TEXT[rep] + scan_data.repidlevel = FACTION_LEVELS[replevel] + end + + -- Flag so that we don't bother checking for classes if we're sure of the class + -- AKA +spell hit == caster DPS only no matter what other stats are on it + -- Saves processing cycles and it won't cause the flags to be overwritten if a non-specific stat is found after + scan_data.verifiedclass = false + + if not scan_data.verifiedclass then + -- Certain stats can be considered for a specific role (aka spell hit == caster dps). + if string.match(text, "strength") and not string.match(text, "strength of the clefthoof") and not string.match(text, "set:") then + scan_data.dps = true + elseif string.match(text, "agility") then + scan_data.dps = true + elseif string.match(text, "spirit") then + scan_data.caster = true + scan_data.healer = true + elseif string.match(text, "spell power") then + scan_data.caster = true + scan_data.healer = true + elseif string.match(text, "spell crit") then + scan_data.caster = true + scan_data.healer = true + elseif string.match(text, "spell hit") then + scan_data.caster = true + scan_data.verifiedclass = true + elseif string.match(text, "spell penetration") then + scan_data.caster = true + scan_data.verifiedclass = true + elseif string.match(text, "mana per 5 sec.") or string.match(text, "mana every 5 seconds") then + scan_data.caster = true + scan_data.healer = true + elseif string.match(text, "attack power") then + scan_data.dps = true + elseif string.match(text, "expertise") then + scan_data.dps = true + scan_data.tank = true + elseif string.match(text, "melee crit") then + scan_data.dps = true + elseif string.match(text, "critical hit") then + scan_data.dps = true + elseif string.match(text, "weapon damage") then + scan_data.dps = true + elseif string.match(text, "ranged crit") then + scan_data.dps = true + scan_data.verifiedclass = true + elseif string.match(text, "melee haste") then + scan_data.dps = true + elseif string.match(text, "ranged haste") then + scan_data.dps = true + scan_data.verifiedclass = true + elseif string.match(text, "melee hit") then + scan_data.dps = true + elseif string.match(text, "ranged hit") then + scan_data.dps = true + scan_data.verifiedclass = true + elseif string.match(text, "armor pen") then + scan_data.dps = true + elseif string.match(text, "feral attack power") then + scan_data.tank = true + scan_data.dps = true + elseif string.match(text, "defense") and not string.match(text, "defenseless") then + scan_data.tank = true + scan_data.verifiedclass = true + elseif string.match(text, "block") then + scan_data.tank = true + scan_data.verifiedclass = true + elseif string.match(text, "parry") then + scan_data.tank = true + scan_data.verifiedclass = true + elseif string.match(text, "dodge") and not string.match(text, "set:") then + scan_data.tank = true + scan_data.verifiedclass = true + end + end + + -- Classes + local class_type = string.match(text_l, "Classes: (.+)") + + if class_type then + for idx, class in ipairs(ORDERED_CLASS_TYPES) do + if string.match(class_type, class) then + scan_data[class] = true + scan_data.found_class = true + end + end + end + + -- Armor types + if ITEM_TYPES[text_l] then + scan_data[text_l] = true + elseif text_l == "Held In Off-hand" or text_l == "Off Hand" or text_l == "Main Hand" then -- Special cases. + scan_data["One-Hand"] = true + elseif text_l == "Projectile" then + scan_data["Ammo"] = true + end + + if text_r and ITEM_TYPES[text_r] then + scan_data[text_r] = true + end + + -- Enchantment voodoo + local ench_type, _ = string.match(text_l, "Enchant (.+) %- (.+)") + + if ench_type then + if ITEM_TYPES[ench_type] then + scan_data[ench_type] = true + elseif ITEM_TYPES[ENCHANT_TO_ITEM[ench_type]] then + scan_data[ENCHANT_TO_ITEM[ench_type]] = true + elseif ench_type == "Weapon" then -- Special case. + scan_data["One-Hand"] = true + scan_data["Two-Hand"] = true + end + end + end -- for + end + + -- Flag data for printing. Wiped and re-used. + local missing_flags = {} + local extra_flags = {} + local output = {} + + local ACQUIRE_TO_FILTER_MAP = { + [A.MOB_DROP] = F.MOB_DROP, + [A.QUEST] = F.QUEST, + [A.SEASONAL] = F.SEASONAL, + [A.WORLD_DROP] = F.WORLD_DROP, + } + local FILTER_TO_ACQUIRE_MAP + + --- Prints out the results of the tooltip scan. + -- @name AckisRecipeList:PrintScanResults + function addon:PrintScanResults() + if not scan_data.match_name then + return + end + + -- Parse the recipe database until we get a match on the name + local recipe_name = string.gsub(scan_data.match_name, "%a+%?: ", "") + local spell_id = scan_data.reverse_lookup[recipe_name] + + if not spell_id then + self:Print(recipe_name .. " has no reverse lookup") + return + end + local recipe = scan_data.recipe_list[spell_id] + local acquire_data = recipe["acquire_data"] + + local FS = private.filter_strings + local flag_format = "F.%s" + + twipe(missing_flags) + twipe(extra_flags) + twipe(output) + + -- If we're a vendor scan, do some extra checks + if scan_data.is_vendor then + -- Check to see if the vendor flag is set + if not recipe:IsFlagged("common1", "VENDOR") then + tinsert(missing_flags, string.format(flag_format, FS[F.VENDOR])) + end + + -- Check to see if we're in a PVP zone + if (GetSubZoneText() == "Wintergrasp Fortress" or GetSubZoneText() == "Halaa") and not recipe:IsFlagged("common1", "PVP") then + tinsert(missing_flags, string.format(flag_format, FS[F.PVP])) + elseif recipe:IsFlagged("common1", "PVP") and not (GetSubZoneText() == "Wintergrasp Fortress" or GetSubZoneText() == "Halaa") then + tinsert(extra_flags, string.format(flag_format, FS[F.PVP])) + end + end + + -- -- If we've picked up at least one class flag + if scan_data.found_class then + for k, v in ipairs(ORDERED_CLASS_TYPES) do + if scan_data[v] and not recipe:IsFlagged("class1", FS[CLASS_TYPES[v]]) then + tinsert(missing_flags, string.format(flag_format, FS[CLASS_TYPES[v]])) + elseif not scan_data[v] and recipe:IsFlagged("class1", FS[CLASS_TYPES[v]]) then + tinsert(extra_flags, string.format(flag_format, FS[CLASS_TYPES[v]])) + end + end + end + + if scan_data.item_bop and not recipe:IsFlagged("common1", "IBOP") then + tinsert(missing_flags, string.format(flag_format, FS[F.IBOP])) + + if recipe:IsFlagged("common1", "IBOE") then + tinsert(extra_flags, string.format(flag_format, FS[F.IBOE])) + end + + if recipe:IsFlagged("common1", "IBOA") then + tinsert(extra_flags, string.format(flag_format, FS[F.IBOA])) + end + elseif not recipe:IsFlagged("common1", "IBOE") and not scan_data.item_bop then + tinsert(missing_flags, string.format(flag_format, FS[F.IBOE])) + + if recipe:IsFlagged("common1", "IBOP") then + tinsert(extra_flags, string.format(flag_format, FS[F.IBOP])) + end + + if recipe:IsFlagged("common1", "IBOA") then + tinsert(extra_flags, string.format(flag_format, FS[F.IBOA])) + end + end + + if scan_data.recipe_bop and not recipe:IsFlagged("common1", "RBOP") then + tinsert(missing_flags, string.format(flag_format, FS[F.RBOP])) + + if recipe:IsFlagged("common1", "RBOE") then + tinsert(extra_flags, string.format(flag_format, FS[F.RBOE])) + end + + if recipe:IsFlagged("common1", "RBOA") then + tinsert(extra_flags, string.format(flag_format, FS[F.RBOA])) + end + + elseif not recipe:IsFlagged("common1", "TRAINER") and not recipe:IsFlagged("common1", "RBOE") and not scan_data.recipe_bop then + tinsert(missing_flags, string.format(flag_format, FS[F.RBOE])) + + if recipe:IsFlagged("common1", "RBOP") then + tinsert(extra_flags, string.format(flag_format, FS[F.RBOP])) + end + + if recipe:IsFlagged("common1", "RBOA") then + tinsert(extra_flags, string.format(flag_format, FS[F.RBOA])) + end + end + + for k, v in ipairs(ORDERED_ROLE_TYPES) do + local role_string = FS[ROLE_TYPES[v]] + + if scan_data[v] and not recipe:IsFlagged("common1", role_string) then + tinsert(missing_flags, string.format(flag_format, role_string)) + elseif not scan_data[v] and recipe:IsFlagged("common1", role_string) then + tinsert(extra_flags, string.format(flag_format, role_string)) + end + end + + for k, v in ipairs(ORDERED_ITEM_TYPES) do + if scan_data[v] and not recipe:IsFlagged("item1", FS[ITEM_TYPES[v]]) then + tinsert(missing_flags, string.format(flag_format, FS[ITEM_TYPES[v]])) + elseif not scan_data[v] and recipe:IsFlagged("item1", FS[ITEM_TYPES[v]]) then + tinsert(extra_flags, string.format(flag_format, FS[ITEM_TYPES[v]])) + end + end + + -- Reputations + local repid = scan_data.repid + local found_problem = false + + if repid and not recipe:IsFlagged("reputation1", FS[repid]) and not recipe:IsFlagged("reputation2", FS[repid]) then + tinsert(missing_flags, repid) + + local rep_data = acquire_data[A.REPUTATION] + + if rep_data then + for rep_id, rep_info in pairs(acquire_info) do + for rep_level, level_info in pairs(rep_info) do + if rep_level ~= scan_data.repidlevel then + tinsert(output, " Wrong reputation level.") + end + end + end + end + end + + -- Make sure the recipe's filter flags match with its acquire types. + if not FILTER_TO_ACQUIRE_MAP then + FILTER_TO_ACQUIRE_MAP = {} + + for k, v in pairs(ACQUIRE_TO_FILTER_MAP) do + FILTER_TO_ACQUIRE_MAP[v] = k + end + end + + for acquire_type in pairs(acquire_data) do + local flag = ACQUIRE_TO_FILTER_MAP[acquire_type] + + if flag and not recipe:IsFlagged("common1", FS[flag]) then + tinsert(missing_flags, string.format(flag_format, FS[flag])) + end + end + + if (acquire_data[A.VENDOR] or acquire_data[A.REPUTATION]) and not recipe:IsFlagged("common1", "VENDOR") then + tinsert(missing_flags, string.format(flag_format, FS[F.VENDOR])) + end + + if recipe:IsFlagged("common1", "VENDOR") and not (acquire_data[A.VENDOR] or acquire_data[A.REPUTATION]) then + tinsert(extra_flags, string.format(flag_format, FS[F.VENDOR])) + end + + if acquire_data[A.TRAINER] and not recipe:IsFlagged("common1", "TRAINER") then + tinsert(missing_flags, string.format(flag_format, FS[F.TRAINER])) + end + + if recipe:IsFlagged("common1", "TRAINER") and not acquire_data[A.TRAINER] then + if not acquire_data[A.CUSTOM] then + tinsert(extra_flags, string.format(flag_format, FS[F.TRAINER])) + end + end + + for flag, acquire_type in pairs(FILTER_TO_ACQUIRE_MAP) do + if recipe:IsFlagged("common1", FS[flag]) and not acquire_data[acquire_type] then + tinsert(extra_flags, string.format(flag_format, FS[flag])) + end + end + + if #missing_flags > 0 or #extra_flags > 0 then + found_problem = true + + -- Add a string of the missing flag numbers + if #missing_flags > 0 then + tinsert(output, " Missing flags: " .. tconcat(missing_flags, ", ")) + end + + -- Add a string of the extra flag numbers + if #extra_flags > 0 then + tinsert(output, " Extra flags: " .. tconcat(extra_flags, ", ")) + end + local found_type = false + + for k, v in ipairs(ORDERED_ITEM_TYPES) do + if scan_data[v] then + found_type = true + break + end + end + + if not found_type then + tinsert(output, " Missing: item type flag") + end + end + + -- Check to see if we have a horde/alliance flag, all recipes must have one of these + if not recipe:IsFlagged("common1", "ALLIANCE") and not recipe:IsFlagged("common1", "HORDE") then + found_problem = true + tinsert(output, " Horde or Alliance not selected.") + end + + -- Check to see if we have an obtain method flag, all recipes must have at least one of these + if (not recipe:IsFlagged("common1", "TRAINER") and not recipe:IsFlagged("common1", "VENDOR") and not recipe:IsFlagged("common1", "INSTANCE") and not recipe:IsFlagged("common1", "RAID") + and not recipe:IsFlagged("common1", "SEASONAL") and not recipe:IsFlagged("common1", "QUEST") and not recipe:IsFlagged("common1", "PVP") and not recipe:IsFlagged("common1", "WORLD_DROP") + and not recipe:IsFlagged("common1", "MOB_DROP") and not recipe:IsFlagged("common1", "DISC")) then + found_problem = true + tinsert(output, " No obtain flag.") + end + + -- Check for recipe binding information, all recipes must have one of these + if not recipe:IsFlagged("common1", "RBOE") and not recipe:IsFlagged("common1", "RBOP") and not recipe:IsFlagged("common1", "RBOA") then + found_problem = true + tinsert(output, " No recipe binding information.") + end + + -- Check for item binding information, all recipes must have one of these + if not recipe:IsFlagged("common1", "IBOE") and not recipe:IsFlagged("common1", "IBOP") and not recipe:IsFlagged("common1", "IBOA") then + found_problem = true + tinsert(output, " No item binding information.") + end + + -- We need to code this better. Some items (aka bags) won't have a role at all. + -- Check for player role flags + if not scan_data.tank and not scan_data.healer and not scan_data.caster and not scan_data.dps and not NO_ROLE_FLAG[spell_id] then + found_problem = true + tinsert(output, " No player role flag.") + end + + if scan_data.specialty then + if not recipe.specialty then + found_problem = true + tinsert(output, string.format(" Missing Specialty: %s", scan_data.specialty)) + elseif recipe.specialty ~= scan_data.specialty then + tinsert(output, string.format(" Wrong Specialty: %s - should be %s ", recipe.specialty, scan_data.specialty)) + end + elseif recipe.specialty then + found_problem = true + tinsert(output, string.format(" Extra Specialty: %s", recipe.specialty)) + end + + if scan_data.quality ~= recipe.quality then + local QS = private.item_quality_names + + found_problem = true + tinsert(output, string.format(" Wrong quality: Q.%s - should be Q.%s.", QS[recipe.quality], QS[scan_data.quality])) + end + if found_problem then + tinsert(output, 1, string.format("%s: %d", recipe_name, spell_id, spell_id)) + return tconcat(output, "\n") + else + return + end + end +end \ No newline at end of file -- 1.7.9.5