Fix realm-gate disable for book/options, pet-rank learning, unique beasts

- Hunter's Book and options window now show a full 'DISABLED.' overlay on realm-gated realms instead of rendering content
- Pet training: new rank of an already-known ability is now recognised, announced, and reflected in tooltips
- Restore curated 'unique appearance' beast allowlist (34 beasts) in data/init.lua
- CHANGELOG updated
This commit is contained in:
DuvelCorp
2026-09-08 01:25:51 +02:00
parent 38e080261c
commit c55cd66ffc
19 changed files with 996 additions and 698 deletions
+77 -16
View File
@@ -212,7 +212,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(growlSpells, row)
@@ -262,7 +262,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(staminaSpells, row)
@@ -312,7 +312,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(armorSpells, row)
@@ -356,7 +356,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(fireResSpells, row)
@@ -400,7 +400,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(frostResSpells, row)
@@ -444,7 +444,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(arcaneResSpells, row)
@@ -488,7 +488,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(natureResSpells, row)
@@ -532,7 +532,7 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
rank = src.rank,
rankNumber = src.rankNumber,
school = "Physical",
sourceUrl = "https://database.turtlecraft.gg/?spell=" .. tostring(src.id),
sourceUrl = "https://octowow.st/db/?spell=" .. tostring(src.id),
trainLevel = src.trainLevel,
}
table.insert(shadowResSpells, row)
@@ -556,56 +556,56 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
MTH_DS_PetSpells.byAbility["Growl"] = {
ability = "Growl",
searchUrl = "https://database.turtlecraft.gg/?search=Growl",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?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",
searchUrl = "https://octowow.st/db/?search=Shadow+Resistance",
spellCount = table.getn(shadowResSpells),
spells = shadowResSpells,
}
@@ -613,6 +613,66 @@ local function MTH_DS_EnsurePetSpellsTrainerGrowl()
MTH_DS_PetSpells.totalSpellRows = table.getn(MTH_DS_PetSpells.allSpells)
end
-- Restore the "unique appearance" flag on beasts.
-- This is a curated allowlist of beasts whose look is genuinely one-of-a-kind
-- (named individuals / distinctive rares that a collector prizes). We do NOT derive
-- this from the skin datastore's unique flag: that flag only means "this texture
-- appears once in the DBC", which over-marks whole color-variant families (e.g. every
-- Moth and Fox colour) and would wrongly flag common mobs like Frenzied Dustwing.
-- Keyed by NPC id (names such as "Crimson Lynx" repeat across entries). Hand-maintained.
local MTH_DS_UniqueBeastIds = {
[5828] = true, -- Humar the Pridelord (Cats)
[61599] = true, -- Darksaber (Cats)
[61699] = true, -- Shar'lan (Cats)
[7434] = true, -- Frostsaber Pride Watcher (Cats)
[3068] = true, -- Mazzranache (Tallstriders)
[61789] = true, -- Moonfeather (Tallstriders)
[61488] = true, -- Azurebeak (Owls)
[59998] = true, -- Blue Owl (Owls)
[59997] = true, -- Red Owl (Owls)
[63147] = true, -- Withered Companion (Owls)
[62778] = true, -- Ahgk'tos the Pure (Spiders)
[8211] = true, -- Old Cliff Jumper (Wolves)
[4512] = true, -- Rotting Agam'ar (Boars)
[62750] = true, -- Magmalash Scorpid (Scorpids)
[11371] = true, -- Razzashi Serpent (Serpents)
[80260] = true, -- Spirit Fox (Foxes)
[61716] = true, -- Crimson Hawkstrider (Tallstriders)
[61691] = true, -- Forest Hawkstrider (Tallstriders)
[61695] = true, -- Ivory Hawkstrider (Tallstriders)
[62817] = true, -- Moonstrider Matriarch (Tallstriders)
[62818] = true, -- Moonstrider Rooster (Tallstriders)
[61774] = true, -- Brilliant Mana Wyrm (Wind Serpents)
[61775] = true, -- Emerald Mana Wyrm (Wind Serpents)
[61776] = true, -- Lavender Mana Wyrm (Wind Serpents)
[61480] = true, -- Brilliant Wind Serpent (Wind Serpents)
[1815] = true, -- Diseased Black Bear (Bears)
[80466] = true, -- Tirisfal Plagued Bear (Bears)
[62820] = true, -- Nightpelt Grizzly (Bears)
[62821] = true, -- Nightpelt Ursa (Bears)
[80816] = true, -- Hinterlands Eagle (Owls)
[61697] = true, -- Bright Lynx (Cats)
[61698] = true, -- Bright Lynx Matriarch (Cats)
[62338] = true, -- Stormwing Buzzard (Carrion Birds)
[62339] = true, -- Stormwing Vulture (Carrion Birds)
}
local function MTH_DS_DeriveBeastUnique()
if type(MTH_DS_Beasts) ~= "table" then
return
end
for npcId, beast in pairs(MTH_DS_Beasts) do
if type(beast) == "table" then
if MTH_DS_UniqueBeastIds[npcId] then
beast.unique = true
else
beast.unique = nil
end
end
end
end
function MTH_DS_OnLoad()
if MTH_DS.loaded then
return
@@ -623,6 +683,7 @@ function MTH_DS_OnLoad()
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_DeriveBeastUnique()
MTH_DS.loaded = true
-- Count entries