mirror of
https://codeberg.org/Duvelcorp/MetaHunt.git
synced 2026-09-21 23:26:57 +00:00
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:
+15
-2
@@ -3,8 +3,9 @@
|
||||
All notable changes to MetaHunt will be documented in this file.
|
||||
|
||||
|
||||
## [1.5.2] - 2026-04-08
|
||||
## [1.5.2] - 2026-09-08
|
||||
|
||||
Res on Octowow server.
|
||||
|
||||
### Added
|
||||
|
||||
@@ -12,9 +13,21 @@ All notable changes to MetaHunt will be documented in this file.
|
||||
|
||||
### Fixed
|
||||
|
||||
- **FeedOMatic — "Set Key" button error**: Clicking **Set Key** in Options → Feed-o-Matic threw an error and wouldn't let you bind a feed key. It now works again.
|
||||
|
||||
- **FeedOMatic — pet left hungry when bags were full**: When your bags were full, FeedOMatic could grab a random tiny stack (like a single meat your pet won't eat) to free a bag slot, so your pet stayed hungry. It now always picks food your pet can actually eat.
|
||||
|
||||
- **Tooltips — "Not learned yet" hint missing on pet abilities**: When you tamed a new beast, hovering one of its abilities on your pet bar no longer showed the red "Not learned yet, keep going !" reminder, even for abilities you hadn't learned. The hint is back and now correctly shows for any ability rank your hunter hasn't learned yet.
|
||||
|
||||
- **Pet training — new rank of a known ability not registered**: When you trained a higher rank of an ability you already had (e.g. learning Charge Rank 2 after Rank 1), MetaHunt treated it as already known — so the "Pet ability learned and recorded" message never appeared and the pet-bar tooltip kept saying "Not learned yet" for the new rank. Learning a new rank is now recognised on its own, announces correctly, and the tooltip immediately reflects the rank you just learned.
|
||||
|
||||
- **Hunter's Book — missing "Unique Appearance" beasts**: The unique-appearance flag had gone missing from the beast database, so the "Unique" badge and filter in the Hunter's Book came up empty. Restored a curated list of the genuinely one-of-a-kind beasts a collector hunts for (Humar the Pridelord, Darksaber, Shar'lan, Frostsaber Pride Watcher, Mazzranache, Moonfeather, Azurebeak, Old Cliff Jumper, Rotting Agam'ar, Razzashi Serpent, Magmalash Scorpid, Spirit Fox and more), so the Unique badge and filter work again without wrongly flagging common colour-variant mobs.
|
||||
|
||||
- **ds-pet-spells — wrong rank 0 icons**: Rank 0 (triggered/sub-spell) entries for Bubble Barrier and Charge had incorrect icons (`Spell_Frost_FrostNova` and `Ability_Warrior_Charge` respectively) instead of matching their ranked ability icons (`spell_bubl1` and `Ability_Hunter_Pet_Boar`). Fixed in both `allSpells` and `byAbility` sections.
|
||||
|
||||
- **zCraft — Smelting**: Smeling was previously not appearing in zCraft because incorrectly hardcoded as "Mining", this is fixed.
|
||||
- **zCraft — Smelting**: Smelting was previously not appearing in zCraft because incorrectly hardcoded as "Mining", this is fixed.
|
||||
|
||||
- **Realm Blocking**: The Addon will auto-disable itself on all Mafia's realms.
|
||||
|
||||
|
||||
## [1.5.1] - 2026-04-01
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@
|
||||
-- Modern modular architecture with legacy addon support
|
||||
--
|
||||
-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
||||
-- TARGET RUNTIME: LUA 5.0 (WoW 1.12 / Turtle-WoW)
|
||||
-- TARGET RUNTIME: LUA 5.0 (WoW 1.12 / Twow 1.18)
|
||||
-- - Max 32 upvalues per function
|
||||
-- - No # operator (use table.getn)
|
||||
-- - No string.gmatch (use string.gfind)
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@
|
||||
## Version: 1.5.1
|
||||
## Title: MetaHunt - |cff00ff00Hunter
|
||||
## Author: Metasploit and his Copilot ;)
|
||||
## Notes: Unified addon suite for huntards making old addons compatible with TurtleWoW, and adding an arsenal of never seen Hunter's utilities.
|
||||
## Notes: Unified addon suite for huntards making old addons compatible with Twow, and adding an arsenal of never seen Hunter's utilities.
|
||||
## SavedVariables: MTH_SavedVariables, FOM_Config, FOM_FoodQuality, FOM_AddedFoods, FOM_RemovedFoods, FOM_Cooking, FOM_QuestFood, FOM_LocaleInfo
|
||||
## SavedVariablesPerCharacter: ZHunterMod_Saved, MTH_CharSavedVariables
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# MetaHunt
|
||||
|
||||
MetaHunt is a Turtle WoW Hunter toolkit.
|
||||
MetaHunt is a Twow Hunter toolkit.
|
||||
It is a modern modular addon compiling brand new features, and improving a few old hunter add-ons that were broken on Twow.
|
||||
It provides a bunch of useful tools for all huntards, wheter they are still levelling, lone-wolf, or HL raider.
|
||||
|
||||
@@ -8,11 +8,11 @@ It provides a bunch of useful tools for all huntards, wheter they are still leve
|
||||
- Altough Nampower isn't mandatory for most of the features, it is a must-have for some.
|
||||
- If you were using old versions of Feed-O-Matic, ICU, zHunterMod and HunterHelper, you dont need those with MetaHunt and you should disable them to avoid conflicts.
|
||||
- MetaHunt is fully compatible with Quiver and is not a replacement for it.
|
||||
|
||||
- Zero support for Capycraft and Ravencraft mafia.
|
||||
|
||||
## Twow Data
|
||||
|
||||
MetaHunt ships with large Turtle WOW datastores :
|
||||
MetaHunt ships with large Twow datastores :
|
||||
|
||||
- 100% accurate beasts' data, their locations, and the abilities they can learn you
|
||||
- All Pet families, their abilities and their diet
|
||||
@@ -21,6 +21,9 @@ MetaHunt ships with large Turtle WOW datastores :
|
||||
- All Stable, Hunter and Pet Masters
|
||||
- All Ammo vendors
|
||||
|
||||
You can browse all the beasts in game within the Book of Huntards, but also on the github site : https://DuvelCorp.github.io/MetaHunt-Web/
|
||||
|
||||
|
||||
## Smart Ammo
|
||||
|
||||
- Auto swap your main ammo to junk ammo for shots that doesn't scale on damage, and re-equip you main ammo right away. Don't waste your Doomshots on nothing anymore, save money !
|
||||
@@ -50,7 +53,7 @@ Old zHunterMod addon on steroids. Fully compatible with Twow, and enhanced with
|
||||
|
||||
## Feed-O-Matic
|
||||
|
||||
Now compatible with Turtle, feed your pet with one key bind, it will always pickup the best food for your pet.
|
||||
Now compatible with Twow, feed your pet with one key bind, it will always pickup the best food for your pet.
|
||||
|
||||
## Chronometer
|
||||
|
||||
|
||||
+68
-1
@@ -7,7 +7,18 @@ MTH = MTH or {
|
||||
}
|
||||
|
||||
local MTH_CHAT_PREFIX = "|cFFFFFFFF[|r|cFFD14A4AMeta|r|cFFABD473Hunt|r|cFFFFFFFF]|r "
|
||||
local MTH_NON_HUNTER_BLOCK_MESSAGE = "You are not a hunter and you are not allowed here. Disable the add-on for this character."
|
||||
local MTH_NON_HUNTER_BLOCK_MESSAGE = "You are not a hunter. Disable the add-on for this character."
|
||||
local MTH_REALM_BLOCK_MESSAGE = "Zero support for Ravencraft/Capybara mafia's realms. Consider joining Octowow."
|
||||
local MTH_BLOCKED_REALMS = {
|
||||
["Medivh"] = true,
|
||||
["\230\176\184\230\173\140\232\141\146\233\135\142"] = true,
|
||||
["\211\192\184\232\187\196\210\176"] = true,
|
||||
["\229\159\186\232\181\171\231\186\179\230\150\175"] = true,
|
||||
["\187\249\186\213\196\201\203\185"] = true,
|
||||
["\231\190\164\230\152\159\231\155\134\229\156\176"] = true,
|
||||
["\200\186\208\199\197\232\181\216"] = true,
|
||||
}
|
||||
|
||||
local MTH_MESSAGE_DEFAULTS = {
|
||||
initModulesLoaded = false,
|
||||
initSarcasticWelcome = true,
|
||||
@@ -189,6 +200,57 @@ function MTH:ApplyClassGate(_source)
|
||||
return blocked
|
||||
end
|
||||
|
||||
function MTH:GetCurrentRealmName()
|
||||
local realm = nil
|
||||
if type(GetRealmName) == "function" then
|
||||
realm = GetRealmName()
|
||||
end
|
||||
if (realm == nil or realm == "") and type(GetCVar) == "function" then
|
||||
realm = GetCVar("realmName")
|
||||
end
|
||||
return realm
|
||||
end
|
||||
|
||||
function MTH:IsRealmGateBlocked()
|
||||
return self and self._realmGateBlocked and true or false
|
||||
end
|
||||
|
||||
function MTH:CheckRealmGate()
|
||||
-- Realm name is only reliable once logged in; an empty result never blocks.
|
||||
local realm = self:GetCurrentRealmName()
|
||||
if type(realm) == "string" and realm ~= "" then
|
||||
self._currentRealm = realm
|
||||
if MTH_BLOCKED_REALMS[realm] then
|
||||
self._realmGateBlocked = true
|
||||
end
|
||||
end
|
||||
return self:IsRealmGateBlocked()
|
||||
end
|
||||
|
||||
function MTH:AnnounceRealmGateBlocked()
|
||||
if self._realmGateAnnounced then
|
||||
return
|
||||
end
|
||||
local sink = MTH_TryOutputClassGateMessage(MTH_REALM_BLOCK_MESSAGE)
|
||||
if sink == "chat" or sink == "uierrors" or sink == "print" then
|
||||
self._realmGateAnnounced = true
|
||||
end
|
||||
end
|
||||
|
||||
function MTH:ApplyRealmGate(_source)
|
||||
if self:IsHardBlocked() then
|
||||
return true
|
||||
end
|
||||
if self:CheckRealmGate() then
|
||||
self:AnnounceRealmGateBlocked()
|
||||
if self.ShutdownForNonHunter then
|
||||
self:ShutdownForNonHunter(_source or "realm-gate")
|
||||
end
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
MTH:ApplyClassGate("startup")
|
||||
|
||||
if not MTH._classGateLifecycleFrame then
|
||||
@@ -202,6 +264,11 @@ if not MTH._classGateLifecycleFrame then
|
||||
MTH._classGateAnnounced = nil
|
||||
MTH._classGateAnnouncePending = nil
|
||||
end
|
||||
if MTH and MTH.ApplyRealmGate and MTH:ApplyRealmGate(event) then
|
||||
this:UnregisterAllEvents()
|
||||
this:SetScript("OnEvent", nil)
|
||||
return
|
||||
end
|
||||
if MTH and MTH.ApplyClassGate and MTH:ApplyClassGate(event) and MTH._classGateAnnouncedChat then
|
||||
this:UnregisterAllEvents()
|
||||
this:SetScript("OnEvent", nil)
|
||||
|
||||
@@ -335,6 +335,39 @@ local function MTH_PT_IsHunterTokenKnown(token)
|
||||
return false
|
||||
end
|
||||
|
||||
-- Rank-strict variant of MTH_PT_IsHunterTokenKnown: only the EXACT token counts, with
|
||||
-- no fall back to the base ability. Knowing Charge (Rank 1) must NOT make Charge (Rank 2)
|
||||
-- look already-learned, otherwise learning a new rank is never recorded or announced.
|
||||
local function MTH_PT_IsExactTokenKnown(token)
|
||||
if token == nil or token == "" then
|
||||
return false
|
||||
end
|
||||
|
||||
local store = MTH_PT_GetStore()
|
||||
if store.hunterKnownMap and store.hunterKnownMap[token] == true then
|
||||
return true
|
||||
end
|
||||
if store.spellMap and store.spellMap[token] and store.spellMap[token].isKnown == true then
|
||||
return true
|
||||
end
|
||||
return false
|
||||
end
|
||||
|
||||
-- Authoritative, rank-strict check for whether the HUNTER has learned a pet ability at a
|
||||
-- given rank. Consults both hunterKnownMap and spellMap, so callers (e.g. the tooltip hint)
|
||||
-- stay correct even when a full Beast Training rescan has not yet rebuilt spellMap rows.
|
||||
function MTH_IsPetAbilityKnownByHunter(abilityName, rankNumber)
|
||||
local ability = MTH_PT_NormalizeName(abilityName)
|
||||
if ability == "" then
|
||||
return false
|
||||
end
|
||||
local token = MTH_PT_MakeTokenFromAbilityRank(ability, rankNumber)
|
||||
if token == "" then
|
||||
return false
|
||||
end
|
||||
return MTH_PT_IsExactTokenKnown(token)
|
||||
end
|
||||
|
||||
local function MTH_PT_ProcessLearnSystemMessage(rawMessage)
|
||||
local message = tostring(rawMessage or "")
|
||||
if message == "" then return false end
|
||||
@@ -368,7 +401,7 @@ local function MTH_PT_ProcessLearnSystemMessage(rawMessage)
|
||||
local token = MTH_PT_MakeTokenFromAbilityRank(abilityName, rankNumber)
|
||||
if token == "" then return false end
|
||||
|
||||
local alreadyKnown = MTH_PT_IsHunterTokenKnown(token)
|
||||
local alreadyKnown = MTH_PT_IsExactTokenKnown(token)
|
||||
local changed = false
|
||||
if not alreadyKnown then
|
||||
changed = MTH_PT_MarkHunterKnownToken(token)
|
||||
|
||||
+73
-25
@@ -20,34 +20,34 @@ local MTH_BOOK_GetZoneName
|
||||
local MTH_BOOK_GetPlayerLevelValue
|
||||
local MTH_BOOK_IsSpellInLevelScope
|
||||
local MTH_BOOK_GetScopedRankSummary
|
||||
local MTH_BOOK_BEAST_DATABASE_URL = "https://database.turtlecraft.gg/?npc=%d"
|
||||
local MTH_BOOK_NPC_DATABASE_URL = "https://database.turtlecraft.gg/?npc=%d"
|
||||
local MTH_BOOK_ITEM_DATABASE_URL = "https://database.turtlecraft.gg/?item=%d"
|
||||
local MTH_BOOK_BEAST_DATABASE_URL = "https://octowow.st/db/?npc=%d"
|
||||
local MTH_BOOK_NPC_DATABASE_URL = "https://octowow.st/db/?npc=%d"
|
||||
local MTH_BOOK_ITEM_DATABASE_URL = "https://octowow.st/db/?item=%d"
|
||||
local MTH_BOOK_STABLE_CURRENT_ID_CACHE = nil
|
||||
|
||||
local MTH_BOOK_FALLBACK_BAG_ITEMS = {
|
||||
[2101] = { name = "Light Quiver", subtype = "quiver", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=2101" },
|
||||
[2102] = { name = "Small Ammo Pouch", subtype = "ammo pouch", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=2102" },
|
||||
[2662] = { name = "Ribbly's Quiver", subtype = "quiver", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=2662" },
|
||||
[2663] = { name = "Ribbly's Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=2663" },
|
||||
[3573] = { name = "Hunting Quiver", subtype = "quiver", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=3573" },
|
||||
[3574] = { name = "Hunting Ammo Sack", subtype = "ammo pouch", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=3574" },
|
||||
[3604] = { name = "Bandolier of the Night Watch", subtype = "ammo pouch", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=3604" },
|
||||
[3605] = { name = "Quiver of the Night Watch", subtype = "quiver", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=3605" },
|
||||
[5439] = { name = "Small Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=5439" },
|
||||
[5441] = { name = "Small Shot Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=5441" },
|
||||
[7278] = { name = "Light Leather Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=7278" },
|
||||
[7279] = { name = "Small Leather Ammo Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=7279" },
|
||||
[7371] = { name = "Heavy Quiver", subtype = "quiver", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=7371" },
|
||||
[7372] = { name = "Heavy Leather Ammo Pouch", subtype = "ammo pouch", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=7372" },
|
||||
[8217] = { name = "Quickdraw Quiver", subtype = "quiver", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=8217" },
|
||||
[8218] = { name = "Thick Leather Ammo Pouch", subtype = "ammo pouch", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=8218" },
|
||||
[11362] = { name = "Medium Quiver", subtype = "quiver", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=11362" },
|
||||
[11363] = { name = "Medium Shot Pouch", subtype = "ammo pouch", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=11363" },
|
||||
[18714] = { name = "Ancient Sinew Wrapped Lamina", subtype = "quiver", slots = 18, reqlevel = 60, quality = 4, sourceUrl = "https://database.turtlecraft.gg/?item=18714" },
|
||||
[19319] = { name = "Harpy Hide Quiver", subtype = "quiver", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=19319" },
|
||||
[19320] = { name = "Gnoll Skin Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=19320" },
|
||||
[61549] = { name = "Swiftfeather Quiver", subtype = "quiver", slots = 16, reqlevel = 57, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=61549" },
|
||||
[2101] = { name = "Light Quiver", subtype = "quiver", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=2101" },
|
||||
[2102] = { name = "Small Ammo Pouch", subtype = "ammo pouch", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=2102" },
|
||||
[2662] = { name = "Ribbly's Quiver", subtype = "quiver", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://octowow.st/db/?item=2662" },
|
||||
[2663] = { name = "Ribbly's Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://octowow.st/db/?item=2663" },
|
||||
[3573] = { name = "Hunting Quiver", subtype = "quiver", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=3573" },
|
||||
[3574] = { name = "Hunting Ammo Sack", subtype = "ammo pouch", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=3574" },
|
||||
[3604] = { name = "Bandolier of the Night Watch", subtype = "ammo pouch", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://octowow.st/db/?item=3604" },
|
||||
[3605] = { name = "Quiver of the Night Watch", subtype = "quiver", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://octowow.st/db/?item=3605" },
|
||||
[5439] = { name = "Small Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=5439" },
|
||||
[5441] = { name = "Small Shot Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=5441" },
|
||||
[7278] = { name = "Light Leather Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=7278" },
|
||||
[7279] = { name = "Small Leather Ammo Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://octowow.st/db/?item=7279" },
|
||||
[7371] = { name = "Heavy Quiver", subtype = "quiver", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://octowow.st/db/?item=7371" },
|
||||
[7372] = { name = "Heavy Leather Ammo Pouch", subtype = "ammo pouch", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://octowow.st/db/?item=7372" },
|
||||
[8217] = { name = "Quickdraw Quiver", subtype = "quiver", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://octowow.st/db/?item=8217" },
|
||||
[8218] = { name = "Thick Leather Ammo Pouch", subtype = "ammo pouch", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://octowow.st/db/?item=8218" },
|
||||
[11362] = { name = "Medium Quiver", subtype = "quiver", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://octowow.st/db/?item=11362" },
|
||||
[11363] = { name = "Medium Shot Pouch", subtype = "ammo pouch", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://octowow.st/db/?item=11363" },
|
||||
[18714] = { name = "Ancient Sinew Wrapped Lamina", subtype = "quiver", slots = 18, reqlevel = 60, quality = 4, sourceUrl = "https://octowow.st/db/?item=18714" },
|
||||
[19319] = { name = "Harpy Hide Quiver", subtype = "quiver", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://octowow.st/db/?item=19319" },
|
||||
[19320] = { name = "Gnoll Skin Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://octowow.st/db/?item=19320" },
|
||||
[61549] = { name = "Swiftfeather Quiver", subtype = "quiver", slots = 16, reqlevel = 57, quality = 3, sourceUrl = "https://octowow.st/db/?item=61549" },
|
||||
}
|
||||
|
||||
local function MTH_BOOK_FamiliesTrace(message)
|
||||
@@ -5661,11 +5661,58 @@ _G.MTH_BOOK_GetScopedRankSummary = MTH_BOOK_GetScopedRankSummary
|
||||
_G.MTH_BOOK_UpdateResults = MTH_BOOK_UpdateResults
|
||||
_G.MTH_BOOK_RefreshFilter = MTH_BOOK_RefreshFilter
|
||||
|
||||
-- On a blocked realm the whole book must be inert. Rather than rendering any pages we
|
||||
-- drop an opaque "DISABLED." panel over the entire window (with its own close button so
|
||||
-- the frame can still be dismissed). Returns true when the realm gate is active.
|
||||
local function MTH_BOOK_UpdateRealmGateOverlay(frame)
|
||||
if not frame then return false end
|
||||
local blocked = (MTH and MTH.IsRealmGateBlocked and MTH:IsRealmGateBlocked()) and true or false
|
||||
|
||||
local overlay = frame.realmGateOverlay
|
||||
if not overlay then
|
||||
if not blocked then return false end
|
||||
|
||||
overlay = CreateFrame("Frame", "MTH_BOOK_RealmGateOverlay", frame)
|
||||
overlay:SetAllPoints(frame)
|
||||
overlay:EnableMouse(true)
|
||||
overlay:EnableMouseWheel(true)
|
||||
overlay:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
if overlay.SetFrameLevel and frame.GetFrameLevel then
|
||||
overlay:SetFrameLevel(frame:GetFrameLevel() + 50)
|
||||
end
|
||||
|
||||
local bg = overlay:CreateTexture(nil, "BACKGROUND")
|
||||
bg:SetAllPoints(overlay)
|
||||
bg:SetTexture("Interface\\Buttons\\WHITE8X8")
|
||||
if bg.SetVertexColor then bg:SetVertexColor(0, 0, 0, 1) end
|
||||
|
||||
local label = overlay:CreateFontString(nil, "OVERLAY")
|
||||
label:SetPoint("CENTER", overlay, "CENTER", 0, 0)
|
||||
if label.SetFont then label:SetFont("Fonts\\FRIZQT__.TTF", 48, "OUTLINE") end
|
||||
label:SetText("DISABLED.")
|
||||
label:SetTextColor(1.0, 0.1, 0.1)
|
||||
|
||||
local close = CreateFrame("Button", nil, overlay, "UIPanelCloseButton")
|
||||
close:SetPoint("TOPRIGHT", overlay, "TOPRIGHT", -4, -4)
|
||||
close:SetScript("OnClick", function() frame:Hide() end)
|
||||
|
||||
frame.realmGateOverlay = overlay
|
||||
end
|
||||
|
||||
if blocked then
|
||||
overlay:Show()
|
||||
else
|
||||
overlay:Hide()
|
||||
end
|
||||
return blocked
|
||||
end
|
||||
|
||||
function MTH_OpenHunterBook()
|
||||
if not MTH_HB_RequireOpenDeps() then return end
|
||||
local frame = MTH_BOOK_EnsureWindow()
|
||||
if not frame then return end
|
||||
frame:Show()
|
||||
if MTH_BOOK_UpdateRealmGateOverlay(frame) then return end
|
||||
MTH_BOOK_RefreshFilter()
|
||||
end
|
||||
|
||||
@@ -5677,6 +5724,7 @@ function MTH_ToggleHunterBook()
|
||||
frame:Hide()
|
||||
else
|
||||
frame:Show()
|
||||
if MTH_BOOK_UpdateRealmGateOverlay(frame) then return end
|
||||
MTH_BOOK_RefreshFilter()
|
||||
end
|
||||
end
|
||||
|
||||
+4
-17
@@ -142,7 +142,7 @@ function MTH_SetupCreditsOptions()
|
||||
-4)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_ABOUT_TOOLTIPS", "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Turtle wow data, and is now usable on other things than Beasts."),
|
||||
MTH_CR_L("CREDITS_ABOUT_TOOLTIPS", "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Twow data, and is now usable on other things than Beasts."),
|
||||
"GameFontNormalSmall", -10)
|
||||
cursor = MTH_CreditsCreateLink(content,
|
||||
"https://legacy-wow.com/vanilla-addons/fizzwidget-hunter-helper/",
|
||||
@@ -179,34 +179,21 @@ function MTH_SetupCreditsOptions()
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor, MTH_CR_L("CREDITS_ABOUT_DATA_TITLE", "About data sources"), "GameFontNormal", -14, 1.00, 0.82, 0.00)
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_ABOUT_DATA_INTRO", "Metahunt ships with its own Turtle-WoW datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\n"
|
||||
MTH_CR_L("CREDITS_ABOUT_DATA_INTRO", "Metahunt ships with its own Twow datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\n"
|
||||
.. "Sources used to build the data include:"),
|
||||
"GameFontNormalSmall", -10)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_DATA_PFQUEST", "- pfQuest for Beasts and Ammo vendors NPCs and their spawn points (and beasts respawn times if any). Thank you again Shagu."),
|
||||
"GameFontNormalSmall", -10)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_DATA_SHEET", "- This invaluable and very accurate spreadsheet for beasts having pet abilities. A big thanks to all twow players that crafted this! Now you dont need that sheet anymore, you have Metahunt! And the Great Book of Huntards is awesome and accurate also because of YOU."),
|
||||
"GameFontNormalSmall", -10)
|
||||
cursor = MTH_CreditsCreateLink(content,
|
||||
"https://docs.google.com/spreadsheets/d/1u33knqlYXvY-jR6pvTd58gyDg8OYEuwYsSoEnIjeA8k/edit?gid=4136205#gid=4136205",
|
||||
"https://docs.google.com/spreadsheets/d/1u33knqlYXvY-jR6pvTd58gyDg8OYEuwYsSoEnIjeA8k/edit?gid=4136205#gid=4136205",
|
||||
cursor,
|
||||
-4)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_DATA_OTHER", "- Atlas twow for ranged weapon sources\n\n"
|
||||
.. "- Twow wiki for pet diet (which was incomplete, missing Serpents and Foxes)"),
|
||||
"GameFontNormalSmall", -10)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_CLOSING", "With that being said, go back hunting fellas!"),
|
||||
MTH_CR_L("CREDITS_CLOSING", "With that being said, go back hunting fellas! Preferably on Octowow."),
|
||||
"GameFontNormalSmall", -10, 1.00, 0.82, 0.00)
|
||||
|
||||
cursor = MTH_CreditsCreateText(content, cursor,
|
||||
MTH_CR_L("CREDITS_SIGNATURE", "\n"
|
||||
.. "Metasploit <Atlantis>, of Nordaanar."),
|
||||
.. "Metasploit <Atlantis>, of Nordaanar, now N'Zoth"),
|
||||
"GameFontNormalSmall", -10)
|
||||
end
|
||||
|
||||
@@ -114,6 +114,10 @@ local function MTH_FOM_BuildBindingChord(key)
|
||||
key)
|
||||
end
|
||||
|
||||
-- Forward declaration: defined below but referenced by the capture-frame
|
||||
-- closures above it, so it must be an in-scope local upvalue (not a global).
|
||||
local MTH_FOM_SaveBinding
|
||||
|
||||
local function MTH_FOM_MakeCaptureFrame()
|
||||
local f = CreateFrame("Frame", "MTH_FOMBindCapture", UIParent)
|
||||
f:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
@@ -168,7 +172,7 @@ local function MTH_FOM_StartBindingCapture()
|
||||
end
|
||||
end
|
||||
|
||||
local function MTH_FOM_SaveBinding(key)
|
||||
function MTH_FOM_SaveBinding(key)
|
||||
if not SetBinding or not SaveBindings or not GetBindingKey then
|
||||
if MTH and MTH.Print then
|
||||
MTH:Print(MTH_FOM_L("FOM_ERROR_KEYBIND_API_UNAVAILABLE", "Keybinding APIs unavailable."))
|
||||
@@ -258,7 +262,7 @@ function MTH_SetupFeedOMaticOptions()
|
||||
statusNotice:SetJustifyH("LEFT")
|
||||
statusNotice:SetJustifyV("TOP")
|
||||
statusNotice:SetTextColor(0.35, 0.65, 1)
|
||||
statusNotice:SetText(MTH_FOM_L("FOM_STATUS_NOTICE", "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for TurtleWoW because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional."))
|
||||
statusNotice:SetText(MTH_FOM_L("FOM_STATUS_NOTICE", "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for Twow because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional."))
|
||||
|
||||
local moduleCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsFeedOMaticEnabled", MTH_FOM_L("FOM_ENABLE_MODULE", "Enable FeedOMatic module"), -32 + yAdjust)
|
||||
if moduleCheck then
|
||||
|
||||
@@ -271,6 +271,52 @@ function MTH_ResetAndSelectOptionsTab(tabKey)
|
||||
MTH_SelectOptionsTab(tabKey)
|
||||
end
|
||||
|
||||
-- On a blocked realm the options window must be inert too. Instead of drawing any tabs we
|
||||
-- drop an opaque "DISABLED." panel over the whole window (with its own close button so it can
|
||||
-- still be dismissed). Returns true when the realm gate is active.
|
||||
local function MTH_OPTIONS_UpdateRealmGateOverlay(frame)
|
||||
if not frame then return false end
|
||||
local blocked = (MTH and MTH.IsRealmGateBlocked and MTH:IsRealmGateBlocked()) and true or false
|
||||
|
||||
local overlay = frame.realmGateOverlay
|
||||
if not overlay then
|
||||
if not blocked then return false end
|
||||
|
||||
overlay = CreateFrame("Frame", "MetaHuntOptionsRealmGateOverlay", frame)
|
||||
overlay:SetAllPoints(frame)
|
||||
overlay:EnableMouse(true)
|
||||
overlay:EnableMouseWheel(true)
|
||||
overlay:SetFrameStrata("FULLSCREEN_DIALOG")
|
||||
if overlay.SetFrameLevel and frame.GetFrameLevel then
|
||||
overlay:SetFrameLevel(frame:GetFrameLevel() + 50)
|
||||
end
|
||||
|
||||
local bg = overlay:CreateTexture(nil, "BACKGROUND")
|
||||
bg:SetAllPoints(overlay)
|
||||
bg:SetTexture("Interface\\Buttons\\WHITE8X8")
|
||||
if bg.SetVertexColor then bg:SetVertexColor(0, 0, 0, 1) end
|
||||
|
||||
local label = overlay:CreateFontString(nil, "OVERLAY")
|
||||
label:SetPoint("CENTER", overlay, "CENTER", 0, 0)
|
||||
if label.SetFont then label:SetFont("Fonts\\FRIZQT__.TTF", 48, "OUTLINE") end
|
||||
label:SetText("DISABLED.")
|
||||
label:SetTextColor(1.0, 0.1, 0.1)
|
||||
|
||||
local close = CreateFrame("Button", nil, overlay, "UIPanelCloseButton")
|
||||
close:SetPoint("TOPRIGHT", overlay, "TOPRIGHT", -4, -4)
|
||||
close:SetScript("OnClick", function() frame:Hide() end)
|
||||
|
||||
frame.realmGateOverlay = overlay
|
||||
end
|
||||
|
||||
if blocked then
|
||||
overlay:Show()
|
||||
else
|
||||
overlay:Hide()
|
||||
end
|
||||
return blocked
|
||||
end
|
||||
|
||||
function MTH_OpenOptions(tabKey)
|
||||
if not MTH_OPTIONS_SHELL_READY then return end
|
||||
local optionsFrame = MTH_EnsureOptionsFrame()
|
||||
@@ -278,5 +324,6 @@ function MTH_OpenOptions(tabKey)
|
||||
return
|
||||
end
|
||||
optionsFrame:Show()
|
||||
if MTH_OPTIONS_UpdateRealmGateOverlay(optionsFrame) then return end
|
||||
MTH_SelectOptionsTab(tabKey or "General")
|
||||
end
|
||||
|
||||
+23
-23
@@ -1,5 +1,5 @@
|
||||
-- MetaHunt Bags Database (Quivers + Ammo Pouches)
|
||||
-- Source: https://database.turtlecraft.gg/?items=11
|
||||
-- Source: https://octowow.st/db/?items=11
|
||||
-- Auto-generated extraction with source recursion.
|
||||
|
||||
if not MTH_DS then MTH_DS = {} end
|
||||
@@ -14,7 +14,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Light Quiver\n6 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=2101",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=2101",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -89,7 +89,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Small Ammo Pouch\n6 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=2102",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=2102",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -144,7 +144,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Ribbly's Quiver\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 50\nEquip: Increases ranged attack speed by 14%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=2662",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=2662",
|
||||
["sources"] = {
|
||||
["dropped-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -171,7 +171,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Ribbly's Bandolier\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 50\nEquip: Increases ranged attack speed by 14%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=2663",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=2663",
|
||||
["sources"] = {
|
||||
["dropped-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -197,7 +197,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Hunting Quiver\nBinds when picked up\nUnique\n10 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=3573",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=3573",
|
||||
["sources"] = {
|
||||
["reward-of"] = {
|
||||
["template"] = "quest",
|
||||
@@ -216,7 +216,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Hunting Ammo Sack\nBinds when picked up\n10 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=3574",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=3574",
|
||||
["sources"] = {
|
||||
["reward-of"] = {
|
||||
["template"] = "quest",
|
||||
@@ -235,7 +235,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Bandolier of the Night Watch\nBinds when picked up\nUnique\n12 Slot Bag\nEquip: Increases ranged attack speed by 11%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=3604",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=3604",
|
||||
["sources"] = {
|
||||
["reward-of"] = {
|
||||
["template"] = "quest",
|
||||
@@ -254,7 +254,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Quiver of the Night Watch\nBinds when picked up\nUnique\n12 Slot Bag\nEquip: Increases ranged attack speed by 11%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=3605",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=3605",
|
||||
["sources"] = {
|
||||
["reward-of"] = {
|
||||
["template"] = "quest",
|
||||
@@ -273,7 +273,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Small Quiver\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=5439",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=5439",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -621,7 +621,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Small Shot Pouch\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=5441",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=5441",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -773,7 +773,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Light Leather Quiver\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=7278",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=7278",
|
||||
["sources"] = {
|
||||
["created-by"] = {
|
||||
["template"] = "spell",
|
||||
@@ -796,7 +796,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Small Leather Ammo Pouch\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=7279",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=7279",
|
||||
["sources"] = {
|
||||
["created-by"] = {
|
||||
["template"] = "spell",
|
||||
@@ -820,7 +820,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Heavy Quiver\n14 Slot Bag\nRequires Level 30\nEquip: Increases ranged attack speed by 12%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=7371",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=7371",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -871,7 +871,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Heavy Leather Ammo Pouch\n14 Slot Bag\nRequires Level 30\nEquip: Increases ranged attack speed by 12%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=7372",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=7372",
|
||||
["sources"] = {
|
||||
["created-by"] = {
|
||||
["template"] = "spell",
|
||||
@@ -895,7 +895,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Quickdraw Quiver\n16 Slot Bag\nRequires Level 40\nEquip: Increases ranged attack speed by 13%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=8217",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=8217",
|
||||
["sources"] = {
|
||||
["created-by"] = {
|
||||
["template"] = "spell",
|
||||
@@ -919,7 +919,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Thick Leather Ammo Pouch\n16 Slot Bag\nRequires Level 40\nEquip: Increases ranged attack speed by 13%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=8218",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=8218",
|
||||
["sources"] = {
|
||||
["created-by"] = {
|
||||
["template"] = "spell",
|
||||
@@ -943,7 +943,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Medium Quiver\n10 Slot Bag\nRequires Level 10\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=11362",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=11362",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -1327,7 +1327,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Medium Shot Pouch\n10 Slot Bag\nRequires Level 10\nEquip: Increases ranged attack speed by 10%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=11363",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=11363",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -1368,7 +1368,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Ancient Sinew Wrapped Lamina\nBinds when picked up\nUnique\n18 Slot Bag\nClasses: Hunter\nRequires Level 60\nEquip: Increases ranged attack speed by 15%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=18714",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=18714",
|
||||
["sources"] = {
|
||||
["reward-of"] = {
|
||||
["template"] = "quest",
|
||||
@@ -1388,7 +1388,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Harpy Hide Quiver\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 55\nEquip: Increases ranged attack speed by 15%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=19319",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=19319",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -1440,7 +1440,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "ammo pouch",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Gnoll Skin Bandolier\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 55\nEquip: Increases ranged attack speed by 15%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=19320",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=19320",
|
||||
["sources"] = {
|
||||
["sold-by"] = {
|
||||
["template"] = "npc",
|
||||
@@ -1491,7 +1491,7 @@ MTH_DS_BagItems = {
|
||||
["subtype"] = "quiver",
|
||||
["description"] = "",
|
||||
["tooltip"] = "Swiftfeather Quiver\nBinds when equipped\nUnique\n16 Slot Bag\nRequires Level 57\nEquip: Increases ranged attack speed by 14%.",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?item=61549",
|
||||
["sourceUrl"] = "https://octowow.st/db/?item=61549",
|
||||
["sources"] = {
|
||||
["dropped-by"] = {
|
||||
["template"] = "npc",
|
||||
|
||||
+324
-324
File diff suppressed because it is too large
Load Diff
@@ -51,7 +51,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 1",
|
||||
["rankNumber"] = 1,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=2649",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=2649",
|
||||
["trainLevel"] = 1,
|
||||
},
|
||||
{
|
||||
@@ -72,7 +72,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 2",
|
||||
["rankNumber"] = 2,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14916",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14916",
|
||||
["trainLevel"] = 10,
|
||||
},
|
||||
{
|
||||
@@ -93,7 +93,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 3",
|
||||
["rankNumber"] = 3,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14917",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14917",
|
||||
["trainLevel"] = 20,
|
||||
},
|
||||
{
|
||||
@@ -114,7 +114,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 4",
|
||||
["rankNumber"] = 4,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14918",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14918",
|
||||
["trainLevel"] = 30,
|
||||
},
|
||||
{
|
||||
@@ -135,7 +135,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 5",
|
||||
["rankNumber"] = 5,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14919",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14919",
|
||||
["trainLevel"] = 40,
|
||||
},
|
||||
{
|
||||
@@ -156,7 +156,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 6",
|
||||
["rankNumber"] = 6,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14920",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14920",
|
||||
["trainLevel"] = 50,
|
||||
},
|
||||
{
|
||||
@@ -177,7 +177,7 @@ local growlTrainerRows = {
|
||||
["rank"] = "Rank 7",
|
||||
["rankNumber"] = 7,
|
||||
["school"] = "Physical",
|
||||
["sourceUrl"] = "https://database.turtlecraft.gg/?spell=14921",
|
||||
["sourceUrl"] = "https://octowow.st/db/?spell=14921",
|
||||
["trainLevel"] = 60,
|
||||
},
|
||||
}
|
||||
@@ -228,7 +228,7 @@ end)
|
||||
|
||||
MTH_DS_PetSpells.byAbility["Growl"] = {
|
||||
["ability"] = "Growl",
|
||||
["searchUrl"] = "https://database.turtlecraft.gg/?search=Growl",
|
||||
["searchUrl"] = "https://octowow.st/db/?search=Growl",
|
||||
["spellCount"] = table.getn(growlTrainerRows),
|
||||
["spells"] = growlTrainerRows,
|
||||
}
|
||||
|
||||
+200
-200
File diff suppressed because it is too large
Load Diff
+42
-42
@@ -6,7 +6,7 @@ MTH_DS_Racial = {
|
||||
version = "1.0",
|
||||
generatedAtUTC = "2026-02-20T00:00:00Z",
|
||||
source = {
|
||||
site = "https://database.turtlecraft.gg",
|
||||
site = "https://octowow.st/db",
|
||||
runRoot = ".TurtleDBparsing/racial-audit/runs/20260220-164554Z",
|
||||
selection = "user-curated-approved",
|
||||
},
|
||||
@@ -25,46 +25,46 @@ MTH_DS_Racial = {
|
||||
["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" },
|
||||
[2481] = { id = 2481, name = "Find Treasure", rank = "Racial", level = 1, school = 0, race = "Dwarf", sourceUrl = "https://octowow.st/db/?spell=2481" },
|
||||
[5227] = { id = 5227, name = "Underwater Breathing", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://octowow.st/db/?spell=5227" },
|
||||
[7340] = { id = 7340, name = "Language Gnomish", rank = "", level = 1, school = 0, race = "Gnome", sourceUrl = "https://octowow.st/db/?spell=7340" },
|
||||
[7744] = { id = 7744, name = "Will of the Forsaken", rank = "Racial", level = 0, school = 0, race = "Undead", sourceUrl = "https://octowow.st/db/?spell=7744" },
|
||||
[20549] = { id = 20549, name = "War Stomp", rank = "Racial", level = 0, school = 0, race = "Tauren", sourceUrl = "https://octowow.st/db/?spell=20549" },
|
||||
[20550] = { id = 20550, name = "Endurance", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", sourceUrl = "https://octowow.st/db/?spell=20550" },
|
||||
[20551] = { id = 20551, name = "Nature Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", raceGuess = true, sourceUrl = "https://octowow.st/db/?spell=20551" },
|
||||
[20552] = { id = 20552, name = "Cultivation", rank = "Racial Passive", level = 0, school = 0, race = "Tauren", sourceUrl = "https://octowow.st/db/?spell=20552" },
|
||||
[20554] = { id = 20554, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=20554" },
|
||||
[20555] = { id = 20555, name = "Regeneration", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=20555" },
|
||||
[20557] = { id = 20557, name = "Beast Slaying", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=20557" },
|
||||
[20558] = { id = 20558, name = "Throwing Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=20558" },
|
||||
[20572] = { id = 20572, name = "Blood Fury", rank = "Racial", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=20572" },
|
||||
[20573] = { id = 20573, name = "Hardiness", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=20573" },
|
||||
[20574] = { id = 20574, name = "Axe Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=20574" },
|
||||
[20575] = { id = 20575, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=20575" },
|
||||
[20576] = { id = 20576, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=20576" },
|
||||
[20577] = { id = 20577, name = "Cannibalize", rank = "Racial", level = 0, school = 0, race = "Undead", sourceUrl = "https://octowow.st/db/?spell=20577" },
|
||||
[20579] = { id = 20579, name = "Shadow Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://octowow.st/db/?spell=20579" },
|
||||
[20580] = { id = 20580, name = "Shadowmeld", rank = "Racial", level = 1, school = 0, race = "Night Elf", sourceUrl = "https://octowow.st/db/?spell=20580" },
|
||||
[20582] = { id = 20582, name = "Quickness", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://octowow.st/db/?spell=20582" },
|
||||
[20583] = { id = 20583, name = "Nature Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", raceGuess = true, sourceUrl = "https://octowow.st/db/?spell=20583" },
|
||||
[20585] = { id = 20585, name = "Wisp Spirit", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://octowow.st/db/?spell=20585" },
|
||||
[20589] = { id = 20589, name = "Escape Artist", rank = "Racial", level = 0, school = 0, race = "Gnome", sourceUrl = "https://octowow.st/db/?spell=20589" },
|
||||
[20591] = { id = 20591, name = "Expansive Mind", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://octowow.st/db/?spell=20591" },
|
||||
[20592] = { id = 20592, name = "Arcane Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://octowow.st/db/?spell=20592" },
|
||||
[20593] = { id = 20593, name = "Engineering Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Gnome", sourceUrl = "https://octowow.st/db/?spell=20593" },
|
||||
[20594] = { id = 20594, name = "Stoneform", rank = "Racial", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://octowow.st/db/?spell=20594" },
|
||||
[20595] = { id = 20595, name = "Gun Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://octowow.st/db/?spell=20595" },
|
||||
[20596] = { id = 20596, name = "Frost Resistance", rank = "Racial Passive", level = 0, school = 0, race = "Dwarf", sourceUrl = "https://octowow.st/db/?spell=20596" },
|
||||
[20597] = { id = 20597, name = "Sword Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://octowow.st/db/?spell=20597" },
|
||||
[20598] = { id = 20598, name = "The Human Spirit", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://octowow.st/db/?spell=20598" },
|
||||
[20599] = { id = 20599, name = "Diplomacy", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://octowow.st/db/?spell=20599" },
|
||||
[20600] = { id = 20600, name = "Perception", rank = "Racial", level = 0, school = 0, race = "Human", sourceUrl = "https://octowow.st/db/?spell=20600" },
|
||||
[20864] = { id = 20864, name = "Mace Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Human", sourceUrl = "https://octowow.st/db/?spell=20864" },
|
||||
[21009] = { id = 21009, name = "Shadowmeld Passive", rank = "Racial Passive", level = 0, school = 0, race = "Night Elf", sourceUrl = "https://octowow.st/db/?spell=21009" },
|
||||
[21563] = { id = 21563, name = "Command", rank = "Racial Passive", level = 0, school = 0, race = "Orc", sourceUrl = "https://octowow.st/db/?spell=21563" },
|
||||
[26290] = { id = 26290, name = "Bow Specialization", rank = "Racial Passive", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=26290" },
|
||||
[26296] = { id = 26296, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=26296" },
|
||||
[26297] = { id = 26297, name = "Berserking", rank = "Racial", level = 0, school = 0, race = "Troll", sourceUrl = "https://octowow.st/db/?spell=26297" },
|
||||
[52522] = { id = 52522, name = "Vengeance", rank = "Racial Passive", level = 0, school = 0, race = "Undead", sourceUrl = "https://octowow.st/db/?spell=52522" },
|
||||
},
|
||||
}
|
||||
+77
-16
@@ -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
|
||||
|
||||
+3
-3
@@ -45,7 +45,7 @@ MTH_LocaleData.ui.enUS = {
|
||||
FOM_ERROR_TOGGLE_FAILED = "Failed to change FeedOMatic state: %s",
|
||||
|
||||
FOM_TITLE = "Feed-O-Matic",
|
||||
FOM_STATUS_NOTICE = "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for TurtleWoW because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional.",
|
||||
FOM_STATUS_NOTICE = "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for Twow because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional.",
|
||||
FOM_ENABLE_MODULE = "Enable FeedOMatic module",
|
||||
FOM_HEADER_GENERAL = "General",
|
||||
FOM_BIND_HINT = "You should assign a key bind for feed-o-matic,\nin order to feed your pet automatically.\nThe key \"P\" is an excellent candidate !",
|
||||
@@ -119,12 +119,12 @@ MTH_LocaleData.ui.enUS = {
|
||||
CREDITS_ABOUT_CODE_INTRO = "This addon is, in others, a compilation of old vanilla addons that I loved and played with during years. But most of them had become very buggy with TwoW as new contain was added to the server. \n I fixed, reworked, enhanced, and melted them within a modern modular framework that I created.\nI want to make it crystal clear about what work is mine, and what is not and respectfully credit the original authors for the great stuff I've taken from them:",
|
||||
CREDITS_ABOUT_ZHUNTER = "- zBars, Antidaze and Autostrip were core functionalities of Vanilla zHunterMod addon. And I kept the \"z\" naming of bars/buttons to always remember it. On top of this I have created myself zAmmo, zCompanions, zMount, zToys.\nAlso the SmartAmmo feature idea is coming from Zhuntermod: there was a file in it with that functionality, but was like a work-in-progress, totally unfunctional and even \"dangerous\" in its current state, and was not active in the addon. Since it was a fucking great idea, I recoded it mostly from scratch and made it work reliably and safely.",
|
||||
CREDITS_ABOUT_FEEDOMATIC = "- Feed-o-Matic was entirely the work of Fizzwidget. I made it work for Twow, by melting it as a module calling Metahunt core to get pet's state and up-to-date data for new pet families and their diet.",
|
||||
CREDITS_ABOUT_TOOLTIPS = "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Turtle wow data, and is now usable on other things than Beasts.",
|
||||
CREDITS_ABOUT_TOOLTIPS = "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Twow data, and is now usable on other things than Beasts.",
|
||||
CREDITS_ABOUT_CHRONOMETER = "- Chronometer was an old and very popular vanilla addon working with ACE2 libraries. It has known uncountable iterations by various people over the years, and I can't credit them all of them here. The current version used by Metahunt is based on this Twow conversion made by \"wigan91\". I have reworked it to have it Hunter-focused-only: removed the non-hunter/race stuff, improved the definition for spells/effects config that were not correct, added missing hunter spells (not many), and implemented my own bar color scheme fitting better the hunter spells.",
|
||||
CREDITS_ABOUT_MAP = "- The Map/Marker system is the one of pfQuest from Master Shagu. Unfortunately he is no more reachable for some months and I could not have some talk with him about this. I mostly let it untouched, I just made slight modifications so it can integrate better within Metahunt, and doesn't conflict with pfQuest.",
|
||||
CREDITS_ABOUT_ATLAS_LINKS = "- The system allowing to fetch itemlinks in game (In the Weapon tab of the Hunter Book notably) is the one of Atlas Twow.",
|
||||
CREDITS_ABOUT_DATA_TITLE = "About data sources",
|
||||
CREDITS_ABOUT_DATA_INTRO = "Metahunt ships with its own Turtle-WoW datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\nSources used to build the data include:",
|
||||
CREDITS_ABOUT_DATA_INTRO = "Metahunt ships with its own Twow datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\nSources used to build the data include:",
|
||||
CREDITS_DATA_PFQUEST = "- pfQuest for Beasts and Ammo vendors NPCs and their spawn points (and beasts respawn times if any). Thank you again Shagu.",
|
||||
CREDITS_DATA_SHEET = "- This invaluable and very accurate spreadsheet for beasts having pet abilities. A big thanks to all twow players that crafted this! Now you dont need that sheet anymore, you have Metahunt! And the Great Book of Huntards is awesome and accurate also because of YOU.",
|
||||
CREDITS_DATA_OTHER = "- Atlas twow for ranged weapon sources\n\n- Twow wiki for pet diet (which was incomplete, missing Serpents and Foxes)",
|
||||
|
||||
@@ -650,7 +650,24 @@ function MTH_GetMerchantFoodsByDiet()
|
||||
return result;
|
||||
end
|
||||
|
||||
local function FOM_ItemQuality(itemIdOrLink)
|
||||
if (type(GetItemInfo) ~= "function" or itemIdOrLink == nil) then
|
||||
return nil;
|
||||
end
|
||||
local _, _, quality = GetItemInfo(itemIdOrLink);
|
||||
return quality;
|
||||
end
|
||||
|
||||
local function FOM_DebugLog(message)
|
||||
if (not (FOM_Config and FOM_Config.Debug)) then
|
||||
return;
|
||||
end
|
||||
local text = "[FOM] " .. tostring(message);
|
||||
if (MTH and MTH.Print) then
|
||||
MTH:Print(text, "debug");
|
||||
elseif (DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.AddMessage) then
|
||||
DEFAULT_CHAT_FRAME:AddMessage(text);
|
||||
end
|
||||
return;
|
||||
end
|
||||
|
||||
@@ -1899,15 +1916,6 @@ end
|
||||
-- Add a food to a list
|
||||
function FOM_AddFood(diet, food)
|
||||
|
||||
if (FOM_Foods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_Foods[diet] == nil");
|
||||
end
|
||||
if (FOM_AddedFoods == nil or FOM_AddedFoods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_AddedFoods == nil or FOM_AddedFoods[diet] == nil");
|
||||
end
|
||||
if (FOM_RemovedFoods == nil or FOM_RemovedFoods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_RemovedFoods == nil or FOM_RemovedFoods[diet] == nil");
|
||||
end
|
||||
if ( GFWTable.IndexOf(FOM_Foods[diet], food) == 0 ) then
|
||||
if (FOM_AddedFoods == nil) then
|
||||
FOM_AddedFoods = {};
|
||||
@@ -1941,15 +1949,6 @@ end
|
||||
-- Remove a food from a list
|
||||
function FOM_RemoveFood(diet, food)
|
||||
|
||||
if (FOM_Foods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_Foods[diet] == nil");
|
||||
end
|
||||
if (FOM_AddedFoods == nil or FOM_AddedFoods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_AddedFoods == nil or FOM_AddedFoods[diet] == nil");
|
||||
end
|
||||
if (FOM_RemovedFoods == nil or FOM_RemovedFoods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_RemovedFoods == nil or FOM_RemovedFoods[diet] == nil");
|
||||
end
|
||||
if ( GFWTable.IndexOf(FOM_Foods[diet], food) ~= 0 ) then
|
||||
if (FOM_RemovedFoods == nil) then
|
||||
FOM_RemovedFoods = {};
|
||||
@@ -2388,7 +2387,12 @@ function FOM_Feed(aFood, options)
|
||||
foodLevel = selectedFoodLevel,
|
||||
})
|
||||
|
||||
FOM_DebugLog("Picked "..FOM_LastFood.." (bag "..foodBag..", slot "..foodItem..") for feeding.");
|
||||
FOM_DebugLog("Picked "..tostring(FOM_LastFood)
|
||||
.." id="..tostring(selectedId)
|
||||
.." foodLevel="..tostring(selectedFoodLevel)
|
||||
.." itemQuality="..tostring(FOM_ItemQuality(selectedId))
|
||||
.." (bag "..tostring(foodBag)..", slot "..tostring(foodItem)..")"
|
||||
.." reason="..tostring(FOM_LastChoiceReason));
|
||||
if (FOM_Config.Debug) then
|
||||
-- don't actually feed anything, just show what we would choose
|
||||
return false;
|
||||
@@ -2606,6 +2610,19 @@ function FOM_FlatFoodList()
|
||||
if (table.getn(foodList) == 0 and table.getn(overflowFoodList) > 0) then
|
||||
foodList = overflowFoodList;
|
||||
end
|
||||
if (FOM_Config and FOM_Config.Debug) then
|
||||
FOM_DebugLog("Candidate foods for pet level "..tostring(petLevel).." ("..tostring(table.getn(foodList)).." in diet):");
|
||||
for i = 1, table.getn(foodList) do
|
||||
local c = foodList[i];
|
||||
FOM_DebugLog(" ["..tostring(i).."] "..tostring(c.link)
|
||||
.." id="..tostring(c.itemId)
|
||||
.." qty="..tostring(c.count)
|
||||
.." foodLevel="..tostring(c.quality)
|
||||
.." itemQuality="..tostring(FOM_ItemQuality(c.itemId))
|
||||
.." known="..tostring(c.knownLevel)
|
||||
.." useful="..tostring(c.useful));
|
||||
end
|
||||
end
|
||||
return foodList;
|
||||
end
|
||||
|
||||
@@ -2689,6 +2706,11 @@ function FOM_NewFindFood(fallback, excludedItemIds, precomputedFoodList, openSlo
|
||||
table.insert(reasonParts, "lower quality preferred");
|
||||
end
|
||||
else
|
||||
-- Bags are full: free a slot by eating a small stack, but still prefer foods
|
||||
-- the pet can actually eat (known food level) so we don't pick an
|
||||
-- unknown-level food the pet will refuse. Falls back to smallest stack
|
||||
-- when nothing has a known level.
|
||||
table.sort(FlatFoodList, FOM_SortKnownThenCount);
|
||||
table.insert(reasonParts, "small stack to free bag space");
|
||||
end
|
||||
if (FOM_Config.AvoidUsefulFood and not fallback) then
|
||||
@@ -2730,6 +2752,15 @@ function FOM_SortCount(a, b)
|
||||
return a.count < b.count;
|
||||
end
|
||||
|
||||
function FOM_SortKnownThenCount(a, b)
|
||||
local aKnown = a.knownLevel and 1 or 0;
|
||||
local bKnown = b.knownLevel and 1 or 0;
|
||||
if (aKnown ~= bKnown) then
|
||||
return aKnown > bKnown; -- edible (known-level) foods first
|
||||
end
|
||||
return a.count < b.count; -- then smallest stack to free bag space
|
||||
end
|
||||
|
||||
function FOM_SortQualityDescending(a, b)
|
||||
return a.quality > b.quality;
|
||||
end
|
||||
@@ -2821,9 +2852,6 @@ function FOM_IsInDiet(food, dietList)
|
||||
if (diet == nil) then
|
||||
diet = "";
|
||||
end
|
||||
if (FOM_Foods[diet] == nil) then
|
||||
FOM_DebugLog("FOM_Foods[diet] == nil");
|
||||
end
|
||||
if (FOM_RemovedFoods ~= nil and FOM_RemovedFoods[diet] ~= nil and GFWTable.IndexOf(FOM_RemovedFoods[diet], food) ~= 0) then
|
||||
return false;
|
||||
end
|
||||
|
||||
@@ -1055,6 +1055,15 @@ end
|
||||
local function MTH_TT_HunterKnowsAbility(abilityLower, rankNumber)
|
||||
if abilityLower == "" then return false end
|
||||
|
||||
-- Prefer the authoritative pet-training check: it is rank-strict and also consults the
|
||||
-- hunter's learned-ability map, so a freshly learned rank counts even before a full
|
||||
-- Beast Training rescan has rebuilt the spell-map rows the fallback below relies on.
|
||||
if type(MTH_IsPetAbilityKnownByHunter) == "function" then
|
||||
if MTH_IsPetAbilityKnownByHunter(abilityLower, rankNumber) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
|
||||
local spellMap = MTH_TT_GetKnownSpellMap()
|
||||
if type(spellMap) ~= "table" then
|
||||
return false
|
||||
@@ -1405,12 +1414,10 @@ local function MTH_TT_AddPetActionNotLearnedHint()
|
||||
|
||||
local canonicalLower = MTH_TT_Lower(canonical)
|
||||
local hunterKnown = MTH_TT_HunterKnowsAbility(canonicalLower, rankNumber)
|
||||
-- Only fall back to petKnown for ranked abilities: rankless abilities have no rank
|
||||
-- filter in CurrentPetKnowsAbility, so they always match on name alone -> false positive.
|
||||
local petKnown = (not hunterKnown)
|
||||
and MTH_TT_AbilityHasPositiveRanks(canonical)
|
||||
and MTH_TT_CurrentPetKnowsAbility(canonicalLower, rankNumber)
|
||||
if hunterKnown or petKnown then
|
||||
-- The hint reflects whether the HUNTER has learned this ability rank. We must NOT
|
||||
-- suppress it just because the current pet knows it: taming a new beast is exactly
|
||||
-- when you want to see which of its abilities you still have to learn.
|
||||
if hunterKnown then
|
||||
return
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user