First version

This commit is contained in:
DuvelCorp
2026-02-24 23:00:59 +01:00
commit ee8328e903
125 changed files with 140652 additions and 0 deletions
File diff suppressed because it is too large Load Diff
+250
View File
@@ -0,0 +1,250 @@
-- MetaHunt Beast Families Database
-- Food map sourced from Turtle WoW Hunter Pets wiki
-- Total: 19 families
if not MTH_DS then MTH_DS = {} end
MTH_DS_Families = {
["Bats"] = {
["named"] = 20,
["coords"] = 18,
["food"] = {
"fruit",
"fungus",
},
["abilities"] = {
"Cower",
"Dive",
"Screech",
},
},
["Bears"] = {
["named"] = 45,
["coords"] = 45,
["food"] = {
"meat",
"fruit",
"fish",
"fungus",
"cheese",
"bread",
},
["abilities"] = {
"Claw",
"Roar of Fortitude",
},
},
["Boars"] = {
["named"] = 45,
["coords"] = 87,
["food"] = {
"meat",
"fruit",
"fish",
"fungus",
"cheese",
"bread",
},
["abilities"] = {
"Charge",
"Dash",
},
},
["Carrion Birds"] = {
["named"] = 36,
["coords"] = 101,
["food"] = {
"meat",
},
["abilities"] = {
"Dive",
"Screech",
},
},
["Cats"] = {
["named"] = 85,
["coords"] = 88,
["food"] = {
"meat",
"fish",
},
["abilities"] = {
"Claw",
"Cower",
"Dash",
"Prowl",
},
},
["Crabs"] = {
["named"] = 32,
["coords"] = 74,
["food"] = {
"fruit",
"fish",
"fungus",
"bread",
},
["abilities"] = {
"Bubble Barrier",
"Claw",
},
},
["Crocolisks"] = {
["named"] = 27,
["coords"] = 71,
["food"] = {
"meat",
"fish",
},
["abilities"] = {
"BIte",
"Bite",
"Claw",
"Death Roll",
},
},
["Foxes"] = {
["named"] = 9,
["coords"] = 51,
["food"] = {
"meat",
"fruit",
},
["abilities"] = {
"Bite",
"Grace",
},
},
["Gorillas"] = {
["named"] = 24,
["coords"] = 117,
["food"] = {
"fruit",
"fungus",
},
["abilities"] = {
"Thunderstomp",
},
},
["Hyenas"] = {
["named"] = 26,
["coords"] = 36,
["food"] = {
"meat",
"fruit",
},
["abilities"] = {
"Bite",
"Dash",
"Packleader",
},
},
["Owls"] = {
["named"] = 16,
["coords"] = 59,
["food"] = {
"meat",
},
["abilities"] = {
"Claw",
"Dive",
"Screech",
},
},
["Raptors"] = {
["named"] = 51,
["coords"] = 115,
["food"] = {
"meat",
},
["abilities"] = {
"Savage Rend",
},
},
["Scorpids"] = {
["named"] = 38,
["coords"] = 36,
["food"] = {
"meat",
},
["abilities"] = {
"Claw",
"Scorpid Poison",
},
},
["Serpents (Cobra)"] = {
["named"] = 10,
["coords"] = 13,
["food"] = {
"meat",
"fish",
},
["abilities"] = {
"Bite",
"Poison Spit",
},
},
["Spiders"] = {
["named"] = 91,
["coords"] = 213,
["food"] = {
"meat",
},
["abilities"] = {
"Bite",
"Web",
},
},
["Tallstriders"] = {
["named"] = 15,
["coords"] = 112,
["food"] = {
"fruit",
"fungus",
"bread",
},
["abilities"] = {
"Bite",
"Cower",
"Strider Presence",
},
},
["Turtles"] = {
["named"] = 25,
["coords"] = 42,
["food"] = {
"fruit",
"fish",
"fungus",
},
["abilities"] = {
"Bite",
"Shell Shield",
},
},
["Wind Serpents"] = {
["named"] = 27,
["coords"] = 42,
["food"] = {
"fish",
"cheese",
"bread",
},
["abilities"] = {
"Dive",
"Lightning Breath",
},
},
["Wolves"] = {
["named"] = 81,
["coords"] = 99,
["food"] = {
"meat",
},
["abilities"] = {
"Bite",
"Dash",
"Furious Howl",
},
},
}
File diff suppressed because it is too large Load Diff
+8840
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+150
View File
@@ -0,0 +1,150 @@
-- MetaHunt Atlas Source Enrichment
-- Adds Atlas-derived source category hints to existing ranged/ammo item entries
if not MTH_DS then MTH_DS = {} end
if not MTH_DS_AmmoItems then MTH_DS_AmmoItems = {} end
local MTH_DS_AtlasSources = {
[10567] = {["boss"] = true, },
[10624] = {["boss"] = true, },
[11628] = {["boss"] = true, },
[11629] = {["boss"] = true, },
[11630] = {["boss"] = true, },
[12651] = {["boss"] = true, },
[12653] = {["boss"] = true, },
[12654] = {["boss"] = true, },
[13019] = {["worlddrop"] = true, },
[13020] = {["worlddrop"] = true, },
[13021] = {["worlddrop"] = true, },
[13022] = {["worlddrop"] = true, },
[13023] = {["worlddrop"] = true, },
[13037] = {["worlddrop"] = true, },
[13038] = {["worlddrop"] = true, },
[13039] = {["worlddrop"] = true, },
[13040] = {["worlddrop"] = true, },
[13136] = {["worlddrop"] = true, },
[13137] = {["worlddrop"] = true, },
[13138] = {["worlddrop"] = true, },
[13139] = {["worlddrop"] = true, },
[13146] = {["worlddrop"] = true, },
[13248] = {["boss"] = true, },
[13377] = {["boss"] = true, },
[13380] = {["boss"] = true, ["crafted"] = true, },
[15294] = {["crafted"] = true, },
[15295] = {["crafted"] = true, },
[15296] = {["crafted"] = true, },
[16992] = {["crafted"] = true, },
[17042] = {["quest"] = true, },
[17069] = {["boss"] = true, },
[17072] = {["boss"] = true, },
[17717] = {["boss"] = true, },
[17753] = {["quest"] = true, },
[18282] = {["worlddrop"] = true, },
[18323] = {["boss"] = true, },
[18388] = {["boss"] = true, },
[18460] = {["boss"] = true, },
[18482] = {["boss"] = true, },
[18680] = {["boss"] = true, },
[18729] = {["boss"] = true, },
[18738] = {["boss"] = true, },
[18755] = {["boss"] = true, },
[18833] = {["pvp"] = true, },
[18835] = {["pvp"] = true, },
[18836] = {["pvp"] = true, },
[18837] = {["pvp"] = true, },
[18855] = {["pvp"] = true, },
[18860] = {["pvp"] = true, },
[19082] = {["crafted"] = true, },
[19107] = {["crafted"] = true, ["quest"] = true, },
[19316] = {["vendor"] = true, },
[19317] = {["vendor"] = true, },
[19350] = {["boss"] = true, },
[19361] = {["boss"] = true, },
[19368] = {["boss"] = true, },
[19558] = {["vendor"] = true, },
[19559] = {["vendor"] = true, },
[19560] = {["vendor"] = true, },
[19561] = {["vendor"] = true, },
[19562] = {["vendor"] = true, },
[19563] = {["vendor"] = true, },
[19564] = {["vendor"] = true, },
[19565] = {["vendor"] = true, },
[19853] = {["boss"] = true, },
[19993] = {["boss"] = true, },
[20038] = {["boss"] = true, },
[20437] = {["vendor"] = true, },
[20438] = {["vendor"] = true, },
[20599] = {["world"] = true, },
[20663] = {["event"] = true, },
[20722] = {["worlddrop"] = true, },
[2098] = {["worlddrop"] = true, },
[2099] = {["worlddrop"] = true, },
[2100] = {["worlddrop"] = true, },
[21459] = {["boss"] = true, },
[21478] = {["boss"] = true, },
[21616] = {["boss"] = true, },
[21800] = {["boss"] = true, },
[22318] = {["boss"] = true, },
[22347] = {["quest"] = true, },
[22656] = {["vendor"] = true, },
[22810] = {["boss"] = true, },
[22811] = {["boss"] = true, },
[22812] = {["boss"] = true, },
[23557] = {["boss"] = true, },
[2824] = {["worlddrop"] = true, },
[2825] = {["worlddrop"] = true, },
[3021] = {["worlddrop"] = true, },
[3078] = {["boss"] = true, },
[3493] = {["crafted"] = true, },
[3778] = {["crafted"] = true, },
[3780] = {["crafted"] = true, },
[41023] = {["crafted"] = true, },
[41725] = {["boss"] = true, },
[51780] = {["world"] = true, },
[55096] = {["boss"] = true, },
[55346] = {["boss"] = true, },
[55379] = {["boss"] = true, },
[5748] = {["vendor"] = true, },
[58083] = {["quest"] = true, },
[58193] = {["boss"] = true, },
[60440] = {["world"] = true, },
[60506] = {["boss"] = true, },
[60545] = {["boss"] = true, },
[60624] = {["quest"] = true, },
[60882] = {["vendor"] = true, },
[61011] = {["vendor"] = true, },
[61068] = {["quest"] = true, },
[61248] = {["boss"] = true, },
[61307] = {["boss"] = true, },
[61383] = {["quest"] = true, },
[61525] = {["boss"] = true, },
[61569] = {["boss"] = true, },
[61629] = {["quest"] = true, },
[6469] = {["boss"] = true, },
[6696] = {["boss"] = true, },
[7729] = {["boss"] = true, },
[80503] = {["vendor"] = true, },
[80546] = {["vendor"] = true, },
[80603] = {["vendor"] = true, },
[80646] = {["vendor"] = true, },
[80745] = {["boss"] = true, },
[83225] = {["boss"] = true, },
[83257] = {["world"] = true, },
[83452] = {["boss"] = true, },
[9399] = {["boss"] = true, },
[9400] = {["boss"] = true, },
[9412] = {["boss"] = true, },
[9422] = {["boss"] = true, },
[9426] = {["boss"] = true, },
[9456] = {["boss"] = true, },
[9487] = {["boss"] = true, },
}
for itemId, sourceMap in pairs(MTH_DS_AtlasSources) do
local item = MTH_DS_AmmoItems[itemId]
if item then
if not item["atlas_sources"] then item["atlas_sources"] = {} end
for sourceType, enabled in pairs(sourceMap) do
if enabled then item["atlas_sources"][sourceType] = true end
end
end
end
File diff suppressed because it is too large Load Diff
+1133
View File
File diff suppressed because it is too large Load Diff
+121
View File
@@ -0,0 +1,121 @@
if not MTH_DS then MTH_DS = {} end
MTH_DS_MinimapSizes = {
[0] = { 0, 0 },
[1] = { 4925, 3283.34 },
[3] = { 2487.5, 1658.34 },
[4] = { 3350, 2233.3 },
[8] = { 2293.75, 1529.17 },
[10] = { 2700, 1800.03 },
[11] = { 4135.42, 2756.25 },
[12] = { 3470.84, 2314.62 },
[14] = { 5287.5, 3525 },
[15] = { 5250, 3500 },
[16] = { 5070.84, 3381.25 },
[17] = { 10133.34, 6756.25 },
[25] = { 711.56, 468.68 },
[28] = { 4300, 2866.67 },
[33] = { 6381.25, 4254.1 },
[36] = { 2800, 1866.67 },
[38] = { 2758.33, 1839.58 },
[40] = { 3500, 2333.3 },
[41] = { 2500, 1666.63 },
[44] = { 2170.84, 1447.9 },
[45] = { 3600, 2400 },
[46] = { 2929.16, 1952.08 },
[47] = { 3850, 2566.67 },
[51] = { 2231.25, 1487.5 },
[85] = { 4518.75, 3012.5 },
[130] = { 4200, 2800 },
[139] = { 3870.83, 2581.25 },
[141] = { 5091.66, 3393.7 },
[148] = { 6550, 4366.66 },
[209] = { 381, 254 },
[215] = { 5137.5, 3425 },
[267] = { 3200, 2133.33 },
[331] = { 5766.67, 3843.75 },
[357] = { 6950, 4633.33 },
[361] = { 5750, 3833.33 },
[400] = { 4400, 2933.33 },
[405] = { 4495.83, 2997.91 },
[406] = { 6018, 4010 },
[408] = { 3092.1, 2047 },
[409] = { 2901.45, 1915.9 },
[440] = { 6900, 4600 },
[490] = { 3700, 2466.66 },
[491] = { 736.45, 490.96 },
[493] = { 2308.33, 1539.59 },
[616] = { 3206, 2142 },
[618] = { 7100, 4733.33 },
[717] = { 378.15, 252.1 },
[718] = { 572.78, 381.85 },
[719] = { 1221.87, 806.42 },
[721] = { 769.67, 513.11 },
[722] = { 881, 589 },
[796] = { 203.66, 135.04 },
[876] = { 828, 541 },
[1176] = { 1383.33, 922.91 },
[1337] = { 893.67, 595.78 },
[1377] = { 3483.33, 2322.92 },
[1477] = { 695.03, 463.35 },
[1497] = { 959.37, 640.11 },
[1519] = { 1737.5, 1158.34 },
[1537] = { 790.63, 527.61 },
[1581] = { 449.89, 300 },
[1583] = { 886.84, 591.23 },
[1584] = { 1985, 1268 },
[1637] = { 1402.61, 935.42 },
[1638] = { 1043.75, 695.83 },
[1657] = { 1058.33, 705.71 },
[1941] = { 1348.24, 888.09 },
[1977] = { 2120.83, 1414.6 },
[2017] = { 1185.35, 789.86 },
[2040] = { 1468, 976 },
[2057] = { 320.05, 213.37 },
[2100] = { 2112.09, 1410.89 },
[2159] = { 483.11, 322.08 },
[2257] = { 312, 208 },
[2366] = { 1085.86, 726.61 },
[2437] = { 738.86, 492.57 },
[2557] = { 1324, 869 },
[2597] = { 4237.5, 2825 },
[2677] = { 499.43, 332.95 },
[2717] = { 1495, 983 },
[3277] = { 1145.84, 764.58 },
[3358] = { 1756.25, 1170.83 },
[3428] = { 977.56, 651.7 },
[3429] = { 2512.5, 1675 },
[3456] = { 1991.69, 1318.42 },
[3457] = { 823, 549 },
[3478] = { 4139.02, 2946 },
[4012] = { 3159, 2108 },
[5023] = { 988.63, 1393.17 },
[5024] = { 1608, 1075 },
[5053] = { 1007.7, 671.8 },
[5077] = { 2643.21, 1751.16 },
[5086] = { 546.75, 391.9 },
[5087] = { 354.5, 234.74 },
[5097] = { 1273.1, 853.72 },
[5103] = { 752.12, 510.33 },
[5121] = { 3227, 2187 },
[5130] = { 1432, 977 },
[5135] = { 320.19, 213.46 },
[5136] = { 619.98, 413.32 },
[5138] = { 656.59, 434.97 },
[5144] = { 309, 208 },
[5147] = { 2777.54, 1851.69 },
[5148] = { 652.1, 439.67 },
[5153] = { 612.69, 408.46 },
[5163] = { 703.3, 468.87 },
[5179] = { 3666, 2442 },
[5204] = { 1271.99, 845.48 },
[5208] = { 1250.18, 837.44 },
[5225] = { 3082, 2061 },
[5536] = { 2472, 1665 },
[5557] = { 2800, 1868 },
[5561] = { 3098, 2068 },
[5581] = { 3241, 2157 },
[5601] = { 1634, 1073 },
[5602] = { 5387, 3584 },
[5628] = { 1980, 1350 },
}
+236
View File
@@ -0,0 +1,236 @@
-- MetaHunt Pet Spells Trainer Overlay
-- Adds trainer-learned pet abilities and normalizes learn method metadata.
if not MTH_DS_PetSpells then
return
end
local function MTH_DSPS_EnsureArray(tbl)
if type(tbl) ~= "table" then
return {}
end
return tbl
end
MTH_DS_PetSpells.abilitiesDiscovered = MTH_DSPS_EnsureArray(MTH_DS_PetSpells.abilitiesDiscovered)
MTH_DS_PetSpells.allSpells = MTH_DSPS_EnsureArray(MTH_DS_PetSpells.allSpells)
MTH_DS_PetSpells.byAbility = MTH_DSPS_EnsureArray(MTH_DS_PetSpells.byAbility)
for _, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and not row.learnMethod then
row.learnMethod = "beast"
end
end
for _, bundle in pairs(MTH_DS_PetSpells.byAbility) do
if type(bundle) == "table" and type(bundle.spells) == "table" then
for _, row in ipairs(bundle.spells) do
if type(row) == "table" and not row.learnMethod then
row.learnMethod = "beast"
end
end
end
end
local growlTrainerRows = {
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 50",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 2649,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 1",
["rankNumber"] = 1,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=2649",
["trainLevel"] = 1,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 65",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14916,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 2",
["rankNumber"] = 2,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14916",
["trainLevel"] = 10,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 110",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14917,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 3",
["rankNumber"] = 3,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14917",
["trainLevel"] = 20,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 170",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14918,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 4",
["rankNumber"] = 4,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14918",
["trainLevel"] = 30,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 240",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14919,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 5",
["rankNumber"] = 5,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14919",
["trainLevel"] = 40,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 320",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14920,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 6",
["rankNumber"] = 6,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14920",
["trainLevel"] = 50,
},
{
["ability"] = "Growl",
["castTime"] = "Instant",
["categoryCooldown"] = "5 seconds",
["cooldown"] = "n/a",
["cost"] = "10 mana",
["description"] = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
["effects"] = {
"(63) Threat Value: 415",
},
["icon"] = "Ability_Physical_Taunt",
["id"] = 14921,
["learnMethod"] = "trainer",
["name"] = "Growl",
["range"] = "5 yards (Combat Range)",
["rank"] = "Rank 7",
["rankNumber"] = 7,
["school"] = "Physical",
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14921",
["trainLevel"] = 60,
},
}
local function MTH_DSPS_Contains(array, value)
for _, item in ipairs(array) do
if item == value then
return true
end
end
return false
end
if not MTH_DSPS_Contains(MTH_DS_PetSpells.abilitiesDiscovered, "Growl") then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Growl")
table.sort(MTH_DS_PetSpells.abilitiesDiscovered)
end
local allById = {}
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
for _, row in ipairs(growlTrainerRows) do
local idx = allById[row.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
table.sort(MTH_DS_PetSpells.allSpells, function(a, b)
local aa = (a and a.ability) or ""
local bb = (b and b.ability) or ""
if aa ~= bb then
return aa < bb
end
local ar = (a and a.rankNumber) or 0
local br = (b and b.rankNumber) or 0
if ar ~= br then
return ar < br
end
return ((a and a.id) or 0) < ((b and b.id) or 0)
end)
MTH_DS_PetSpells.byAbility["Growl"] = {
["ability"] = "Growl",
["searchUrl"] = "https://database.turtlecraft.gg/?search=Growl",
["spellCount"] = table.getn(growlTrainerRows),
["spells"] = growlTrainerRows,
}
MTH_DS_PetSpells.totalSpellRows = table.getn(MTH_DS_PetSpells.allSpells)
File diff suppressed because it is too large Load Diff
+70
View File
@@ -0,0 +1,70 @@
if not MTH_DS_Racial then
MTH_DS_Racial = {}
end
MTH_DS_Racial = {
version = "1.0",
generatedAtUTC = "2026-02-20T00:00:00Z",
source = {
site = "https://database.turtlecraft.gg",
runRoot = ".TurtleDBparsing/racial-audit/runs/20260220-164554Z",
selection = "user-curated-approved",
},
stats = {
raceCount = 9,
spellCount = 41,
},
byRace = {
["Tauren"] = { 20549, 20550, 20552, 20551 },
["Orc"] = { 20572, 20573, 20574, 20575, 20576, 21563 },
["Troll"] = { 20554, 26296, 26297, 20555, 20557, 20558, 26290 },
["Undead"] = { 7744, 20577, 20579, 5227, 52522 },
["Night Elf"] = { 20580, 21009, 20582, 20585, 20583 },
["Gnome"] = { 20589, 20591, 20592, 20593, 7340 },
["Dwarf"] = { 2481, 20596, 20595, 20594 },
["Human"] = { 20599, 20600, 20597, 20864, 20598 },
},
spellsById = {
[2481] = { id = 2481, name = "Find Treasure", rank = "Racial", level = 1, school = 0, race = "Dwarf", sourceUrl = "https://database.turtlecraft.gg/?spell=2481" },
[5227] = { id = 5227, name = "Underwater Breathing", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://database.turtlecraft.gg/?spell=5227" },
[7340] = { id = 7340, name = "Language Gnomish", rank = "", level = 1, school = 0, race = "Gnome", sourceUrl = "https://database.turtlecraft.gg/?spell=7340" },
[7744] = { id = 7744, name = "Will of the Forsaken", rank = "Racial", level = 0, school = 0, race = "Undead", sourceUrl = "https://database.turtlecraft.gg/?spell=7744" },
[20549] = { id = 20549, name = "War Stomp", rank = "Racial", level = 0, school = 0, race = "Tauren", sourceUrl = "https://database.turtlecraft.gg/?spell=20549" },
[20550] = { id = 20550, name = "Endurance", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", sourceUrl = "https://database.turtlecraft.gg/?spell=20550" },
[20551] = { id = 20551, name = "Nature Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", raceGuess = true, sourceUrl = "https://database.turtlecraft.gg/?spell=20551" },
[20552] = { id = 20552, name = "Cultivation", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", sourceUrl = "https://database.turtlecraft.gg/?spell=20552" },
[20554] = { id = 20554, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=20554" },
[20555] = { id = 20555, name = "Regeneration", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=20555" },
[20557] = { id = 20557, name = "Beast Slaying", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=20557" },
[20558] = { id = 20558, name = "Throwing Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=20558" },
[20572] = { id = 20572, name = "Blood Fury", rank = "Racial", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=20572" },
[20573] = { id = 20573, name = "Hardiness", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=20573" },
[20574] = { id = 20574, name = "Axe Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=20574" },
[20575] = { id = 20575, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=20575" },
[20576] = { id = 20576, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=20576" },
[20577] = { id = 20577, name = "Cannibalize", rank = "Racial", level = 0, school = 0, race = "Undead", sourceUrl = "https://database.turtlecraft.gg/?spell=20577" },
[20579] = { id = 20579, name = "Shadow Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://database.turtlecraft.gg/?spell=20579" },
[20580] = { id = 20580, name = "Shadowmeld", rank = "Racial", level = 1, school = 0, race = "Night Elf", sourceUrl = "https://database.turtlecraft.gg/?spell=20580" },
[20582] = { id = 20582, name = "Quickness", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://database.turtlecraft.gg/?spell=20582" },
[20583] = { id = 20583, name = "Nature Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", raceGuess = true, sourceUrl = "https://database.turtlecraft.gg/?spell=20583" },
[20585] = { id = 20585, name = "Wisp Spirit", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://database.turtlecraft.gg/?spell=20585" },
[20589] = { id = 20589, name = "Escape Artist", rank = "Racial", level = 0, school = 0, race = "Gnome", sourceUrl = "https://database.turtlecraft.gg/?spell=20589" },
[20591] = { id = 20591, name = "Expansive Mind", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://database.turtlecraft.gg/?spell=20591" },
[20592] = { id = 20592, name = "Arcane Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://database.turtlecraft.gg/?spell=20592" },
[20593] = { id = 20593, name = "Engineering Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://database.turtlecraft.gg/?spell=20593" },
[20594] = { id = 20594, name = "Stoneform", rank = "Racial", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://database.turtlecraft.gg/?spell=20594" },
[20595] = { id = 20595, name = "Gun Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://database.turtlecraft.gg/?spell=20595" },
[20596] = { id = 20596, name = "Frost Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://database.turtlecraft.gg/?spell=20596" },
[20597] = { id = 20597, name = "Sword Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://database.turtlecraft.gg/?spell=20597" },
[20598] = { id = 20598, name = "The Human Spirit", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://database.turtlecraft.gg/?spell=20598" },
[20599] = { id = 20599, name = "Diplomacy", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://database.turtlecraft.gg/?spell=20599" },
[20600] = { id = 20600, name = "Perception", rank = "Racial", level = 0, school = 0, race = "Human", sourceUrl = "https://database.turtlecraft.gg/?spell=20600" },
[20864] = { id = 20864, name = "Mace Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://database.turtlecraft.gg/?spell=20864" },
[21009] = { id = 21009, name = "Shadowmeld Passive", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://database.turtlecraft.gg/?spell=21009" },
[21563] = { id = 21563, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://database.turtlecraft.gg/?spell=21563" },
[26290] = { id = 26290, name = "Bow Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=26290" },
[26296] = { id = 26296, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=26296" },
[26297] = { id = 26297, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://database.turtlecraft.gg/?spell=26297" },
[52522] = { id = 52522, name = "Vengeance", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://database.turtlecraft.gg/?spell=52522" },
},
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+2229
View File
File diff suppressed because it is too large Load Diff
+75
View File
@@ -0,0 +1,75 @@
-- Auto-generated fallback zone names for beast/vendor coordinate zone IDs
MTH_DS_ZoneNamesFallback = {
[1] = "Dun Morogh",
[3] = "Badlands",
[4] = "Blasted Lands",
[8] = "Swamp of Sorrows",
[10] = "Duskwood",
[11] = "Wetlands",
[12] = "Elwynn Forest",
[14] = "Durotar",
[15] = "Dustwallow Marsh",
[16] = "Azshara",
[17] = "The Barrens",
[28] = "Western Plaguelands",
[33] = "Stranglethorn Vale",
[36] = "Alterac Mountains",
[38] = "Loch Modan",
[40] = "Westfall",
[41] = "Deadwind Pass",
[44] = "Redridge Mountains",
[45] = "Arathi Highlands",
[46] = "Burning Steppes",
[47] = "The Hinterlands",
[51] = "Searing Gorge",
[85] = "Tirisfal Glades",
[130] = "Silverpine Forest",
[139] = "Eastern Plaguelands",
[141] = "Teldrassil",
[148] = "Darkshore",
[209] = "Shadowfang Keep",
[215] = "Mulgore",
[267] = "Hillsbrad Foothills",
[331] = "Ashenvale",
[357] = "Feralas",
[361] = "Felwood",
[400] = "Thousand Needles",
[405] = "Desolace",
[406] = "Stonetalon Mountains",
[408] = "Gillijim's Isle",
[409] = "Lapidis Isle",
[440] = "Tanaris",
[490] = "Un'Goro Crater",
[491] = "Razorfen Kraul",
[493] = "Moonglade",
[616] = "Hyjal",
[618] = "Winterspring",
[718] = "Wailing Caverns",
[719] = "Blackfathom Deeps",
[721] = "Gnomeregan",
[1176] = "Zul'Farrak",
[1337] = "Uldaman",
[1377] = "Silithus",
[1477] = "The Temple of Atal'Hakkar",
[1519] = "Stormwind City",
[1537] = "Ironforge",
[1583] = "Blackrock Spire",
[1941] = "Caverns of Time",
[1977] = "Zul'Gurub",
[2040] = "Alah'Thalas",
[2100] = "Maraudon",
[2597] = "Alterac Valley",
[3456] = "Naxxramas",
[3457] = "Tower of Karazhan",
[4012] = "Scarlet Enclave",
[5077] = "Crescent Grove",
[5121] = "Tel'Abim",
[5135] = "Scarlet Monastery Library",
[5179] = "Gilneas",
[5225] = "Thalassian Highlands",
[5536] = "Blackstone Island",
[5561] = "Balor",
[5581] = "Northwind",
[5601] = "Dragonmaw Retreat",
[5602] = "Grim Reaches",
}
+12054
View File
File diff suppressed because it is too large Load Diff
+598
View File
@@ -0,0 +1,598 @@
if not MTH_DS then
MTH_DS = {}
end
MTH_DS.version = "1.0"
MTH_DS.loaded = false
local function MTH_DS_MarkNotInGameRangedWeapons()
if not MTH_DS_AmmoItems then return end
for _, item in pairs(MTH_DS_AmmoItems) do
if type(item) == "table" then
local name = string.lower(tostring(item.name or ""))
if string.find(name, "monster - ", 1, true) == 1 or string.find(name, "90 green", 1, true) == 1 then
local subtype = string.lower(tostring(item.subtype or ""))
if subtype == "bow" or subtype == "bows"
or subtype == "gun" or subtype == "rifle" or subtype == "rifles"
or subtype == "crossbow" or subtype == "crossbows" or subtype == "cross bow" or subtype == "cross-bow"
then
item.notingame = true
end
end
end
end
end
MTH_DS_MarkNotInGameRangedWeapons()
local function MTH_DS_EnsurePetSpellsTrainerGrowl()
if not MTH_DS_PetSpells then return end
if type(MTH_DS_PetSpells.allSpells) ~= "table" then MTH_DS_PetSpells.allSpells = {} end
if type(MTH_DS_PetSpells.byAbility) ~= "table" then MTH_DS_PetSpells.byAbility = {} end
if type(MTH_DS_PetSpells.abilitiesDiscovered) ~= "table" then MTH_DS_PetSpells.abilitiesDiscovered = {} end
for _, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and not row.learnMethod then
row.learnMethod = "beast"
end
end
local hasGrowlAbility = false
local hasGreatStaminaAbility = false
local hasNaturalArmorAbility = false
local hasFireResistanceAbility = false
local hasFrostResistanceAbility = false
local hasArcaneResistanceAbility = false
local hasNatureResistanceAbility = false
local hasShadowResistanceAbility = false
for i = 1, table.getn(MTH_DS_PetSpells.abilitiesDiscovered) do
if MTH_DS_PetSpells.abilitiesDiscovered[i] == "Growl" then
hasGrowlAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Great Stamina" then
hasGreatStaminaAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Natural Armor" then
hasNaturalArmorAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Fire Resistance" then
hasFireResistanceAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Frost Resistance" then
hasFrostResistanceAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Arcane Resistance" then
hasArcaneResistanceAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Nature Resistance" then
hasNatureResistanceAbility = true
elseif MTH_DS_PetSpells.abilitiesDiscovered[i] == "Shadow Resistance" then
hasShadowResistanceAbility = true
end
if hasGrowlAbility and hasGreatStaminaAbility and hasNaturalArmorAbility and hasFireResistanceAbility and hasFrostResistanceAbility and hasArcaneResistanceAbility and hasNatureResistanceAbility and hasShadowResistanceAbility then break end
end
if not hasGrowlAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Growl")
end
if not hasGreatStaminaAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Great Stamina")
end
if not hasNaturalArmorAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Natural Armor")
end
if not hasFireResistanceAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Fire Resistance")
end
if not hasFrostResistanceAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Frost Resistance")
end
if not hasArcaneResistanceAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Arcane Resistance")
end
if not hasNatureResistanceAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Nature Resistance")
end
if not hasShadowResistanceAbility then
table.insert(MTH_DS_PetSpells.abilitiesDiscovered, "Shadow Resistance")
end
table.sort(MTH_DS_PetSpells.abilitiesDiscovered)
local growlRows = {
{ id = 2649, rank = "Rank 1", rankNumber = 1, trainLevel = 1, effect = "(63) Threat Value: 50" },
{ id = 14916, rank = "Rank 2", rankNumber = 2, trainLevel = 10, effect = "(63) Threat Value: 65" },
{ id = 14917, rank = "Rank 3", rankNumber = 3, trainLevel = 20, effect = "(63) Threat Value: 110" },
{ id = 14918, rank = "Rank 4", rankNumber = 4, trainLevel = 30, effect = "(63) Threat Value: 170" },
{ id = 14919, rank = "Rank 5", rankNumber = 5, trainLevel = 40, effect = "(63) Threat Value: 240" },
{ id = 14920, rank = "Rank 6", rankNumber = 6, trainLevel = 50, effect = "(63) Threat Value: 320" },
{ id = 14921, rank = "Rank 7", rankNumber = 7, trainLevel = 60, effect = "(63) Threat Value: 415" },
}
local allById = {}
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local growlSpells = {}
for i = 1, table.getn(growlRows) do
local src = growlRows[i]
local row = {
ability = "Growl",
castTime = "Instant",
categoryCooldown = "5 seconds",
cooldown = "n/a",
cost = "10 mana",
description = "Taunt the target, increasing the likelihood the creature will focus attacks on you.",
effects = { src.effect },
icon = "Ability_Physical_Taunt",
id = src.id,
learnMethod = "trainer",
name = "Growl",
range = "5 yards (Combat Range)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(growlSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
local staminaRows = {
{ id = 4187, rank = "Rank 1", rankNumber = 1, trainLevel = 10, description = "Stamina increased by 3.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 3" },
{ id = 4188, rank = "Rank 2", rankNumber = 2, trainLevel = 12, description = "Stamina increased by 5.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 5" },
{ id = 4189, rank = "Rank 3", rankNumber = 3, trainLevel = 18, description = "Stamina increased by 7.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 7" },
{ id = 4190, rank = "Rank 4", rankNumber = 4, trainLevel = 24, description = "Stamina increased by 10.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 10" },
{ id = 4191, rank = "Rank 5", rankNumber = 5, trainLevel = 30, description = "Stamina increased by 13.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 13" },
{ id = 4192, rank = "Rank 6", rankNumber = 6, trainLevel = 36, description = "Stamina increased by 17.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 17" },
{ id = 4193, rank = "Rank 7", rankNumber = 7, trainLevel = 42, description = "Stamina increased by 21.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 21" },
{ id = 4194, rank = "Rank 8", rankNumber = 8, trainLevel = 48, description = "Stamina increased by 26.", effect = "(6) Apply Aura #29: Mod Stat (2) Value: 26" },
{ id = 5048, rank = "Rank 9", rankNumber = 9, trainLevel = 54, description = "Stamina increased by 32.", effect = "(36) Learn Spell Great Stamina" },
{ id = 5049, rank = "Rank 10", rankNumber = 10, trainLevel = 60, description = "Stamina increased by 40.", effect = "(36) Learn Spell Great Stamina" },
}
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local staminaSpells = {}
for i = 1, table.getn(staminaRows) do
local src = staminaRows[i]
local row = {
ability = "Great Stamina",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Nature_UnyeildingStamina",
id = src.id,
learnMethod = "trainer",
name = "Great Stamina",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(staminaSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local armorRows = {
{ id = 24545, rank = "Rank 1", rankNumber = 1, trainLevel = 10, description = "Armor increased by 50.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 50" },
{ id = 24549, rank = "Rank 2", rankNumber = 2, trainLevel = 12, description = "Armor increased by 100.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 100" },
{ id = 24550, rank = "Rank 3", rankNumber = 3, trainLevel = 18, description = "Armor increased by 160.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 160" },
{ id = 24551, rank = "Rank 4", rankNumber = 4, trainLevel = 24, description = "Armor increased by 240.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 240" },
{ id = 24552, rank = "Rank 5", rankNumber = 5, trainLevel = 30, description = "Armor increased by 330.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 330" },
{ id = 24553, rank = "Rank 6", rankNumber = 6, trainLevel = 36, description = "Armor increased by 430.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 430" },
{ id = 24554, rank = "Rank 7", rankNumber = 7, trainLevel = 42, description = "Armor increased by 550.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 550" },
{ id = 24555, rank = "Rank 8", rankNumber = 8, trainLevel = 48, description = "Armor increased by 675.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 675" },
{ id = 24629, rank = "Rank 9", rankNumber = 9, trainLevel = 54, description = "Armor increased by 810.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 810" },
{ id = 24630, rank = "Rank 10", rankNumber = 10, trainLevel = 60, description = "Armor increased by 1000.", effect = "(6) Apply Aura #22: Mod Resistance (1) Value: 1000" },
}
local armorSpells = {}
for i = 1, table.getn(armorRows) do
local src = armorRows[i]
local row = {
ability = "Natural Armor",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Nature_SpiritArmor",
id = src.id,
learnMethod = "trainer",
name = "Natural Armor",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(armorSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local fireResRows = {
{ id = 23992, rank = "Rank 1", rankNumber = 1, trainLevel = 20, description = "Increases Fire resistance by 30.", effect = "(6) Apply Aura #22: Mod Resistance (4) Value: 30" },
{ id = 24439, rank = "Rank 2", rankNumber = 2, trainLevel = 30, description = "Increases Fire resistance by 60.", effect = "(6) Apply Aura #22: Mod Resistance (4) Value: 60" },
{ id = 24444, rank = "Rank 3", rankNumber = 3, trainLevel = 40, description = "Increases Fire resistance by 90.", effect = "(6) Apply Aura #22: Mod Resistance (4) Value: 90" },
{ id = 24445, rank = "Rank 4", rankNumber = 4, trainLevel = 50, description = "Increases Fire resistance by 120.", effect = "(6) Apply Aura #22: Mod Resistance (4) Value: 120" },
}
local fireResSpells = {}
for i = 1, table.getn(fireResRows) do
local src = fireResRows[i]
local row = {
ability = "Fire Resistance",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Fire_FireArmor",
id = src.id,
learnMethod = "trainer",
name = "Fire Resistance",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(fireResSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local frostResRows = {
{ id = 24446, rank = "Rank 1", rankNumber = 1, trainLevel = 20, description = "Increases Frost resistance by 30.", effect = "(6) Apply Aura #22: Mod Resistance (16) Value: 30" },
{ id = 24447, rank = "Rank 2", rankNumber = 2, trainLevel = 30, description = "Increases Frost resistance by 60.", effect = "(6) Apply Aura #22: Mod Resistance (16) Value: 60" },
{ id = 24448, rank = "Rank 3", rankNumber = 3, trainLevel = 40, description = "Increases Frost resistance by 90.", effect = "(6) Apply Aura #22: Mod Resistance (16) Value: 90" },
{ id = 24449, rank = "Rank 4", rankNumber = 4, trainLevel = 50, description = "Increases Frost resistance by 120.", effect = "(6) Apply Aura #22: Mod Resistance (16) Value: 120" },
}
local frostResSpells = {}
for i = 1, table.getn(frostResRows) do
local src = frostResRows[i]
local row = {
ability = "Frost Resistance",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Frost_FrostWard",
id = src.id,
learnMethod = "trainer",
name = "Frost Resistance",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(frostResSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local arcaneResRows = {
{ id = 24493, rank = "Rank 1", rankNumber = 1, trainLevel = 20, description = "Increases Arcane resistance by 30.", effect = "(6) Apply Aura #22: Mod Resistance (64) Value: 30" },
{ id = 24497, rank = "Rank 2", rankNumber = 2, trainLevel = 30, description = "Increases Arcane resistance by 60.", effect = "(6) Apply Aura #22: Mod Resistance (64) Value: 60" },
{ id = 24500, rank = "Rank 3", rankNumber = 3, trainLevel = 40, description = "Increases Arcane resistance by 90.", effect = "(6) Apply Aura #22: Mod Resistance (64) Value: 90" },
{ id = 24501, rank = "Rank 4", rankNumber = 4, trainLevel = 50, description = "Increases Arcane resistance by 120.", effect = "(6) Apply Aura #22: Mod Resistance (64) Value: 120" },
}
local arcaneResSpells = {}
for i = 1, table.getn(arcaneResRows) do
local src = arcaneResRows[i]
local row = {
ability = "Arcane Resistance",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Nature_StarFall",
id = src.id,
learnMethod = "trainer",
name = "Arcane Resistance",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(arcaneResSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local natureResRows = {
{ id = 24492, rank = "Rank 1", rankNumber = 1, trainLevel = 20, description = "Increases Nature resistance by 30.", effect = "(6) Apply Aura #22: Mod Resistance (8) Value: 30" },
{ id = 24502, rank = "Rank 2", rankNumber = 2, trainLevel = 30, description = "Increases Nature resistance by 60.", effect = "(6) Apply Aura #22: Mod Resistance (8) Value: 60" },
{ id = 24503, rank = "Rank 3", rankNumber = 3, trainLevel = 40, description = "Increases Nature resistance by 90.", effect = "(6) Apply Aura #22: Mod Resistance (8) Value: 90" },
{ id = 24504, rank = "Rank 4", rankNumber = 4, trainLevel = 50, description = "Increases Nature resistance by 120.", effect = "(6) Apply Aura #22: Mod Resistance (8) Value: 120" },
}
local natureResSpells = {}
for i = 1, table.getn(natureResRows) do
local src = natureResRows[i]
local row = {
ability = "Nature Resistance",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Nature_ResistNature",
id = src.id,
learnMethod = "trainer",
name = "Nature Resistance",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(natureResSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
for i, row in ipairs(MTH_DS_PetSpells.allSpells) do
if type(row) == "table" and row.id then
allById[row.id] = i
end
end
local shadowResRows = {
{ id = 24488, rank = "Rank 1", rankNumber = 1, trainLevel = 20, description = "Increases Shadow resistance by 30.", effect = "(6) Apply Aura #22: Mod Resistance (32) Value: 30" },
{ id = 24505, rank = "Rank 2", rankNumber = 2, trainLevel = 30, description = "Increases Shadow resistance by 60.", effect = "(6) Apply Aura #22: Mod Resistance (32) Value: 60" },
{ id = 24506, rank = "Rank 3", rankNumber = 3, trainLevel = 40, description = "Increases Shadow resistance by 90.", effect = "(6) Apply Aura #22: Mod Resistance (32) Value: 90" },
{ id = 24507, rank = "Rank 4", rankNumber = 4, trainLevel = 50, description = "Increases Shadow resistance by 120.", effect = "(6) Apply Aura #22: Mod Resistance (32) Value: 120" },
}
local shadowResSpells = {}
for i = 1, table.getn(shadowResRows) do
local src = shadowResRows[i]
local row = {
ability = "Shadow Resistance",
castTime = "Passive",
categoryCooldown = "n/a",
cooldown = "n/a",
cost = "None",
description = src.description,
effects = { src.effect },
icon = "Spell_Shadow_AntiShadow",
id = src.id,
learnMethod = "trainer",
name = "Shadow Resistance",
range = "0 yards (Self Only)",
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(shadowResSpells, row)
local idx = allById[src.id]
if idx then
MTH_DS_PetSpells.allSpells[idx] = row
else
table.insert(MTH_DS_PetSpells.allSpells, row)
end
end
table.sort(MTH_DS_PetSpells.allSpells, function(a, b)
local aa = (a and a.ability) or ""
local bb = (b and b.ability) or ""
if aa ~= bb then return aa < bb end
local ar = (a and a.rankNumber) or 0
local br = (b and b.rankNumber) or 0
if ar ~= br then return ar < br end
return ((a and a.id) or 0) < ((b and b.id) or 0)
end)
MTH_DS_PetSpells.byAbility["Growl"] = {
ability = "Growl",
searchUrl = "https://database.turtlecraft.gg/?search=Growl",
spellCount = table.getn(growlSpells),
spells = growlSpells,
}
MTH_DS_PetSpells.byAbility["Great Stamina"] = {
ability = "Great Stamina",
searchUrl = "https://database.turtlecraft.gg/?search=Great+Stamina",
spellCount = table.getn(staminaSpells),
spells = staminaSpells,
}
MTH_DS_PetSpells.byAbility["Natural Armor"] = {
ability = "Natural Armor",
searchUrl = "https://database.turtlecraft.gg/?search=Natural+Armor",
spellCount = table.getn(armorSpells),
spells = armorSpells,
}
MTH_DS_PetSpells.byAbility["Fire Resistance"] = {
ability = "Fire Resistance",
searchUrl = "https://database.turtlecraft.gg/?search=Fire+Resistance",
spellCount = table.getn(fireResSpells),
spells = fireResSpells,
}
MTH_DS_PetSpells.byAbility["Frost Resistance"] = {
ability = "Frost Resistance",
searchUrl = "https://database.turtlecraft.gg/?search=Frost+Resistance",
spellCount = table.getn(frostResSpells),
spells = frostResSpells,
}
MTH_DS_PetSpells.byAbility["Arcane Resistance"] = {
ability = "Arcane Resistance",
searchUrl = "https://database.turtlecraft.gg/?search=Arcane+Resistance",
spellCount = table.getn(arcaneResSpells),
spells = arcaneResSpells,
}
MTH_DS_PetSpells.byAbility["Nature Resistance"] = {
ability = "Nature Resistance",
searchUrl = "https://database.turtlecraft.gg/?search=Nature+Resistance",
spellCount = table.getn(natureResSpells),
spells = natureResSpells,
}
MTH_DS_PetSpells.byAbility["Shadow Resistance"] = {
ability = "Shadow Resistance",
searchUrl = "https://database.turtlecraft.gg/?search=Shadow+Resistance",
spellCount = table.getn(shadowResSpells),
spells = shadowResSpells,
}
MTH_DS_PetSpells.totalSpellRows = table.getn(MTH_DS_PetSpells.allSpells)
end
function MTH_DS_OnLoad()
if MTH_DS.loaded then
return
end
-- Database files loaded via TOC
-- Check if all tables are present
if MTH_DS_Beasts and MTH_DS_Vendors and MTH_DS_AmmoItems and MTH_DS_Zones and MTH_DS_Families then
MTH_DS_EnsurePetSpellsTrainerGrowl()
MTH_DS.loaded = true
-- Count entries
MTH_DS.beastCount = 0
for _ in pairs(MTH_DS_Beasts) do
MTH_DS.beastCount = MTH_DS.beastCount + 1
end
MTH_DS.vendorCount = 0
for _ in pairs(MTH_DS_Vendors) do
MTH_DS.vendorCount = MTH_DS.vendorCount + 1
end
MTH_DS.ammoItemCount = 0
for _ in pairs(MTH_DS_AmmoItems) do
MTH_DS.ammoItemCount = MTH_DS.ammoItemCount + 1
end
MTH_DS.zoneCount = 0
for _ in pairs(MTH_DS_Zones) do
MTH_DS.zoneCount = MTH_DS.zoneCount + 1
end
MTH_DS.familyCount = 0
for _ in pairs(MTH_DS_Families) do
MTH_DS.familyCount = MTH_DS.familyCount + 1
end
MTH_DS.petSpellRowCount = 0
if MTH_DS_PetSpells and MTH_DS_PetSpells.allSpells then
for _ in pairs(MTH_DS_PetSpells.allSpells) do
MTH_DS.petSpellRowCount = MTH_DS.petSpellRowCount + 1
end
end
-- Delayed message to ensure chat frame is ready
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
this:UnregisterAllEvents()
end)
else
local missing = {}
if not MTH_DS_Beasts then table.insert(missing, "MTH_DS_Beasts") end
if not MTH_DS_Vendors then table.insert(missing, "MTH_DS_Vendors") end
if not MTH_DS_AmmoItems then table.insert(missing, "MTH_DS_AmmoItems") end
if not MTH_DS_Zones then table.insert(missing, "MTH_DS_Zones") end
if not MTH_DS_Families then table.insert(missing, "MTH_DS_Families") end
local msg = "|cFFFF3333[MTH] ERROR:|r Database failed to load! Missing: " .. table.concat(missing, ", ")
local frame = CreateFrame("Frame")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
frame:SetScript("OnEvent", function()
this:UnregisterAllEvents()
MTH:Print(msg, "error")
end)
end
end