mirror of
https://codeberg.org/Duvelcorp/MetaHunt.git
synced 2026-09-21 23:26:57 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 23bb69d094 | |||
| b2060e0aab | |||
| 609a6bdd83 |
@@ -2,6 +2,29 @@
|
||||
|
||||
All notable changes to MetaHunt will be documented in this file.
|
||||
|
||||
## [1.3.0] - 2026-03-19
|
||||
|
||||
|
||||
### Added
|
||||
- Added a **3D Model Viewer** to the Hunter Book Beast Lore inspector panel. Clicking a beast in the list shows its in-game model.
|
||||
- Added a standalone **3D Model Viewer** that is shown when cliking the model of a beast in the Beast lore. The model is rotatable with the mouse, and you can browse all models of the same pet family and shows all other beasts that share the same skin, with one-click to jump to any of them in the Beast Lore.
|
||||
- Added a **Family icon** column to the Beast Lore list, replacing the text family name with the pet family icon for a more compact view.
|
||||
- Added an **Attack Speed (AS)** column to the Beast Lore list.
|
||||
- Added `displayId` and `skinId` fields to **all ~1000 beasts** in the MetaHunt datastore. `displayId` was scraped from the Turtle WoW DB, and `skinId` derived from it following an extraction on MPQ game files. This is what powers the model viewer and skin-grouping.
|
||||
- Added per-family icons to all 19 pet families in the family data table.
|
||||
- Added missing food types (`raw meat`, `raw fish`) to all pet families that accept `meat` or `fish` respectively (sourced from MPQ data).
|
||||
- Added **Profile Management** panel (Options → Profiles): save the current addon configuration as a named profile and instantly load it on any character. Profiles cover all module settings (ICU, Chronometer, AutoBuy, AutoQuest, SmartAmmo, Feed-O-Matic, zButtons layout) and per-character module enabled/disabled states.
|
||||
- Added automatic per-character **config snapshots** saved on every logout (`CharName-RealmName`), visible in the "Copy from Character" section — import any character's snapshot as a loadable profile in one click.
|
||||
|
||||
|
||||
### Fixed
|
||||
- Fixed the pet feeding counter never incrementing: `MTH_FEED_Trace` was a no-op stub and `FOM_CORE_ATTEMPT_TRACKING_ENABLED` was `false`; both are now active.
|
||||
- Fixed `FOM_AddFood` not clearing a food from `FOM_RemovedFoods` when the item belongs to the base diet list, which permanently banned it even after an explicit `/fom add`.
|
||||
- Wired `FOM_ClearItemBans` into the `/fom add` command path: explicitly re-adding a food now clears it from `FOM_RemovedFoods`, FOM quarantine, and core exceptions in one step.
|
||||
- Removed debug messages forgotten when releasing 1.2.
|
||||
- Fixed SmartAmmo + **Quiver castbar conflict**: Quiver's castbar was disappearing when both addons were active. Root cause: MetaHunt SmartAmmo was re-installing its hooks every 0.5 seconds, constantly bumping Quiver off the top of the hook chain. Fixed by removing the repeated re-hook and adding a guard that only installs once (or when no other addon is on top).
|
||||
|
||||
|
||||
## [1.2.0] - 2026-03-10
|
||||
|
||||
### Added
|
||||
|
||||
+3
-1
@@ -1,5 +1,5 @@
|
||||
## Interface: 11200
|
||||
## Version: 1.2.0
|
||||
## Version: 1.3.0
|
||||
## 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.
|
||||
@@ -35,6 +35,8 @@ data\ds-minimap-sizes.lua
|
||||
data\ds-unit-coords.lua
|
||||
data\ds-creature-coords.lua
|
||||
data\ds-beasts-families.lua
|
||||
data\ds-beasts-families-dbc.lua
|
||||
data\ds-beasts-skins.lua
|
||||
data\ds-pet-spells.lua
|
||||
data\ds-pet-spells-trainer.lua
|
||||
data\ds-racial.lua
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
MTH_CONST = MTH_CONST or {}
|
||||
MTH_CONST.version = MTH_CONST.version or "1.2.0"
|
||||
MTH_CONST.version = MTH_CONST.version or "1.3.0"
|
||||
|
||||
MTH_CONST.WEAPON_TYPES = {
|
||||
BOWS = "Bows",
|
||||
|
||||
@@ -15,6 +15,7 @@ local MTH_FEED_TrackerFrame = nil
|
||||
local MTH_FEED_ActiveCoreAttemptId = nil
|
||||
local MTH_FEED_BootstrapFrame = nil
|
||||
local MTH_FEED_NameToItemCache = {}
|
||||
local MTH_FEED_InvalidateDietMapCache
|
||||
|
||||
local MTH_FEED_HARDCODED_LEVEL_RULES = {
|
||||
{ minPetLevel = 1, minFoodLevel = 1 },
|
||||
@@ -28,7 +29,10 @@ local MTH_FEED_HARDCODED_LEVEL_RULES = {
|
||||
MTH_FEED_TRACE = false
|
||||
|
||||
local function MTH_FEED_Trace(message)
|
||||
return
|
||||
if not MTH_FEED_TRACE then return end
|
||||
if type(DEFAULT_CHAT_FRAME) == "table" and DEFAULT_CHAT_FRAME.AddMessage then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff88aaff[MTH-FeedTrack]|r " .. tostring(message))
|
||||
end
|
||||
end
|
||||
|
||||
local function MTH_FEED_Now()
|
||||
@@ -636,6 +640,7 @@ end
|
||||
|
||||
function MTH_FEED_ReinstallCoreTracking()
|
||||
local ok = MTH_FEED_InstallCoreHooks()
|
||||
MTH_FEED_EnsureTrackerFrame()
|
||||
return ok and true or false
|
||||
end
|
||||
|
||||
@@ -852,7 +857,7 @@ end
|
||||
|
||||
local MTH_FEED_DietMapCache = nil
|
||||
|
||||
local function MTH_FEED_InvalidateDietMapCache()
|
||||
MTH_FEED_InvalidateDietMapCache = function()
|
||||
MTH_FEED_DietMapCache = nil
|
||||
end
|
||||
|
||||
@@ -1457,6 +1462,30 @@ function MTH_FEED_GetSessionFeedCount(petId)
|
||||
return tonumber(MTH_FEED_Runtime.sessionFeedsByPetId[petKey]) or 0
|
||||
end
|
||||
|
||||
function MTH_FEED_DebugSessionFeeds()
|
||||
local pet = MTH_FEED_GetCurrentPetContext()
|
||||
local petId = pet and pet.petId or "(none)"
|
||||
local count = MTH_FEED_GetSessionFeedCount(petId)
|
||||
local hookOk = MTH_FEED_IsCoreHookInstalled()
|
||||
local frameOk = MTH_FEED_TrackerFrame ~= nil
|
||||
local activeId = tostring(MTH_FEED_ActiveCoreAttemptId or "nil")
|
||||
if type(DEFAULT_CHAT_FRAME) == "table" and DEFAULT_CHAT_FRAME.AddMessage then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff88aaff[MTH-FeedTrack]|r petId=" .. tostring(petId)
|
||||
.. " feeds=" .. tostring(count)
|
||||
.. " hookOk=" .. tostring(hookOk)
|
||||
.. " frameOk=" .. tostring(frameOk)
|
||||
.. " activeAttempt=" .. activeId)
|
||||
local anyFeeds = false
|
||||
for k, v in pairs(MTH_FEED_Runtime.sessionFeedsByPetId) do
|
||||
anyFeeds = true
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff88aaff[MTH-FeedTrack]|r session petId='" .. tostring(k) .. "' count=" .. tostring(v))
|
||||
end
|
||||
if not anyFeeds then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cff88aaff[MTH-FeedTrack]|r (no session feeds recorded)")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function MTH_FEED_RecordUnknownFoodCandidate(payload)
|
||||
local store = MTH_FEED_EnsureStore()
|
||||
local itemId = payload and tonumber(payload.itemId) or nil
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
MTH = MTH or {
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
name = "MetaHunt",
|
||||
modules = {},
|
||||
config = {},
|
||||
|
||||
+1
-4
@@ -373,9 +373,6 @@ eventFrame:SetScript("OnEvent", function()
|
||||
end
|
||||
MTH_DF_InstallHooks()
|
||||
MTH_DebugFrame:Initialize()
|
||||
if MTH and MTH.Print then
|
||||
local mode = MTH_DF_IsGlobalCaptureEnabled() and "legacy-global" or "safe-local"
|
||||
MTH:Print("=== MetaHunt Debug Frame Initialized (" .. mode .. ") ===", "debug")
|
||||
end
|
||||
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -0,0 +1,430 @@
|
||||
-- hunterbook-model-viewer.lua
|
||||
-- Embeds a small 3D creature skin preview at the bottom of the Beast Lore /
|
||||
-- Abilities inspector. Clicking it opens a larger draggable popup with
|
||||
-- < / > navigation through all skin variants of the selected family.
|
||||
--
|
||||
-- Uses MTH_DS_BeastSkins[familyName] generated by .tools/generators/gen_beast_skins.py
|
||||
-- Skin rendering: PlayerModel:SetUnit(CreatureDisplayInfo.ID)
|
||||
|
||||
local function mv_log(msg)
|
||||
if MTH_DebugFrame and type(MTH_DebugFrame.AddInfo) == "function" then
|
||||
MTH_DebugFrame:AddInfo("[MV] " .. tostring(msg))
|
||||
end
|
||||
end
|
||||
|
||||
local function mv_err(msg)
|
||||
if MTH_DebugFrame and type(MTH_DebugFrame.AddError) == "function" then
|
||||
MTH_DebugFrame:AddError("[MV] " .. tostring(msg))
|
||||
end
|
||||
end
|
||||
|
||||
local MTH_MV = {
|
||||
inited = false,
|
||||
family = nil,
|
||||
skins = {},
|
||||
index = 1,
|
||||
facing = 0.6,
|
||||
rotating = false,
|
||||
rotateLastX = 0,
|
||||
keepPopup = false,
|
||||
skinBeastRows = {},
|
||||
skinListEmpty = nil,
|
||||
-- small preview (parented to book frame, anchored below MTH_BOOK_DetailBackdrop)
|
||||
previewFrame = nil,
|
||||
previewModel = nil,
|
||||
-- popup
|
||||
popup = nil,
|
||||
popupModel = nil,
|
||||
popupTitle = nil,
|
||||
popupSkinLabel = nil,
|
||||
}
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Internal
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
local function MTH_MV_ApplyModel(model, skinId)
|
||||
if not model or not skinId then
|
||||
mv_err("ApplyModel: nil model or skinId model="..tostring(model).." id="..tostring(skinId))
|
||||
return
|
||||
end
|
||||
mv_log("ApplyModel id="..tostring(skinId))
|
||||
model:SetUnit(skinId)
|
||||
model:SetPosition(0, 0, 0)
|
||||
model:SetModelScale(1)
|
||||
local useFacing = (MTH_MV.popupModel ~= nil and model == MTH_MV.popupModel)
|
||||
model:SetFacing(useFacing and MTH_MV.facing or 0.6)
|
||||
end
|
||||
|
||||
local MTH_MV_BuildSkinBeastList -- forward declaration
|
||||
|
||||
local function MTH_MV_DisplayCurrent()
|
||||
local skin = MTH_MV.skins[MTH_MV.index]
|
||||
if not skin then return end
|
||||
local n = table.getn(MTH_MV.skins)
|
||||
|
||||
MTH_MV_ApplyModel(MTH_MV.previewModel, skin.id)
|
||||
MTH_MV_ApplyModel(MTH_MV.popupModel, skin.id)
|
||||
|
||||
local indexStr = tostring(MTH_MV.index) .. " / " .. tostring(n)
|
||||
if MTH_MV.popupSkinLabel then
|
||||
MTH_MV.popupSkinLabel:SetText(indexStr .. " · " .. tostring(skin.tex or ""))
|
||||
end
|
||||
MTH_MV_BuildSkinBeastList(skin.id)
|
||||
end
|
||||
|
||||
MTH_MV_BuildSkinBeastList = function(skinId)
|
||||
for i = 1, table.getn(MTH_MV.skinBeastRows) do
|
||||
MTH_MV.skinBeastRows[i]:Hide()
|
||||
end
|
||||
if MTH_MV.skinListEmpty then MTH_MV.skinListEmpty:Hide() end
|
||||
if not skinId or not MTH_DS_Beasts then return end
|
||||
|
||||
local matches = {}
|
||||
for npcId, beast in pairs(MTH_DS_Beasts) do
|
||||
if type(beast) == "table" and beast.skinId == skinId then
|
||||
local nm = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(npcId, beast.name)) or beast.name
|
||||
table.insert(matches, { id = npcId, name = nm or "?", lvl = tostring(beast.lvl or "?") })
|
||||
end
|
||||
end
|
||||
table.sort(matches, function(a, b) return (a.name or "") < (b.name or "") end)
|
||||
|
||||
local maxRows = table.getn(MTH_MV.skinBeastRows)
|
||||
local shown = 0
|
||||
for i = 1, table.getn(matches) do
|
||||
if shown >= maxRows then break end
|
||||
shown = shown + 1
|
||||
local row = MTH_MV.skinBeastRows[shown]
|
||||
row._npcId = matches[i].id
|
||||
row.nameText:SetText(matches[i].name)
|
||||
row.lvlText:SetText(matches[i].lvl)
|
||||
row:Show()
|
||||
end
|
||||
if shown == 0 and MTH_MV.skinListEmpty then
|
||||
MTH_MV.skinListEmpty:Show()
|
||||
end
|
||||
end
|
||||
|
||||
local function MTH_MV_Init()
|
||||
if MTH_MV.inited then mv_log("Init: already done") return end
|
||||
mv_log("Init: starting")
|
||||
local backdrop = getglobal("MTH_BOOK_DetailBackdrop")
|
||||
if not backdrop then
|
||||
mv_err("Init: MTH_BOOK_DetailBackdrop not found")
|
||||
return
|
||||
end
|
||||
mv_log("Init: backdrop found, creating previewFrame")
|
||||
MTH_MV.inited = true
|
||||
|
||||
-- ----------------------------------------------------------------
|
||||
-- Model preview container (sibling of inspector, full column width)
|
||||
-- Hardcoded offset from book frame TOPLEFT: x=608 (right column),
|
||||
-- y = -(166 inspector_top + 178 inspector_h + 6 gap) = -350
|
||||
-- ----------------------------------------------------------------
|
||||
local bookFrame = backdrop:GetParent()
|
||||
MTH_MV.previewFrame = CreateFrame("Frame", "MTH_BOOK_SkinPreview", bookFrame)
|
||||
MTH_MV.previewFrame:SetWidth(136)
|
||||
MTH_MV.previewFrame:SetHeight(136)
|
||||
MTH_MV.previewFrame:SetPoint("TOPLEFT", bookFrame, "TOPLEFT", 608, -384)
|
||||
MTH_MV.previewFrame:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8X8",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 12,
|
||||
insets = {left = 3, right = 3, top = 3, bottom = 3},
|
||||
})
|
||||
MTH_MV.previewFrame:SetBackdropColor(0, 0, 0, 0.7)
|
||||
MTH_MV.previewFrame:SetBackdropBorderColor(0.35, 0.35, 0.35, 0.8)
|
||||
MTH_MV.previewFrame:Hide()
|
||||
|
||||
mv_log("Init: previewFrame created, creating PlayerModel")
|
||||
-- PlayerModel fills the inner area
|
||||
MTH_MV.previewModel = CreateFrame("PlayerModel", nil, MTH_MV.previewFrame)
|
||||
MTH_MV.previewModel:SetPoint("TOPLEFT", MTH_MV.previewFrame, "TOPLEFT", 3, -3)
|
||||
MTH_MV.previewModel:SetPoint("BOTTOMRIGHT", MTH_MV.previewFrame, "BOTTOMRIGHT", -3, 3)
|
||||
|
||||
-- Invisible click overlay → opens popup
|
||||
local previewBtn = CreateFrame("Button", nil, MTH_MV.previewFrame)
|
||||
previewBtn:SetAllPoints(MTH_MV.previewFrame)
|
||||
previewBtn:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square")
|
||||
previewBtn:SetScript("OnClick", function()
|
||||
MTH_BOOK_ModelViewer_OpenPopup()
|
||||
end)
|
||||
previewBtn:SetScript("OnEnter", function()
|
||||
GameTooltip:SetOwner(MTH_MV.previewFrame, "ANCHOR_LEFT")
|
||||
GameTooltip:AddLine("Click to open skin viewer", 1, 1, 1)
|
||||
GameTooltip:Show()
|
||||
end)
|
||||
previewBtn:SetScript("OnLeave", function()
|
||||
GameTooltip:Hide()
|
||||
end)
|
||||
|
||||
mv_log("Init: previewModel created, creating popup")
|
||||
-- ----------------------------------------------------------------
|
||||
-- Popup frame (wider: left side = model viewer, right = beast list)
|
||||
-- ----------------------------------------------------------------
|
||||
local popup = CreateFrame("Frame", "MTH_BOOK_ModelPopup", UIParent)
|
||||
popup:SetWidth(490)
|
||||
popup:SetHeight(320)
|
||||
popup:SetPoint("CENTER", UIParent, "CENTER", 0, 0)
|
||||
popup:SetFrameStrata("TOOLTIP")
|
||||
popup:SetToplevel(true)
|
||||
popup:SetMovable(true)
|
||||
popup:EnableMouse(true)
|
||||
popup:RegisterForDrag("LeftButton")
|
||||
popup:SetScript("OnDragStart", function() this:StartMoving() end)
|
||||
popup:SetScript("OnDragStop", function() this:StopMovingOrSizing() end)
|
||||
popup:SetScript("OnHide", function() MTH_MV.rotating = false end)
|
||||
popup:Hide()
|
||||
popup:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8X8",
|
||||
edgeFile = "Interface\\DialogFrame\\UI-DialogBox-Border",
|
||||
tile = true, tileSize = 32, edgeSize = 32,
|
||||
insets = {left = 11, right = 12, top = 12, bottom = 11},
|
||||
})
|
||||
popup:SetBackdropColor(0.05, 0.05, 0.08, 0.95)
|
||||
|
||||
-- Large model background (left side, x=20)
|
||||
local modelBg = CreateFrame("Frame", nil, popup)
|
||||
modelBg:SetWidth(224)
|
||||
modelBg:SetHeight(226)
|
||||
modelBg:SetPoint("TOPLEFT", popup, "TOPLEFT", 20, -42)
|
||||
modelBg:SetBackdrop({
|
||||
bgFile = "Interface\\Buttons\\WHITE8X8",
|
||||
edgeFile = "Interface\\Tooltips\\UI-Tooltip-Border",
|
||||
tile = true, tileSize = 16, edgeSize = 12,
|
||||
insets = {left = 3, right = 3, top = 3, bottom = 3},
|
||||
})
|
||||
modelBg:SetBackdropColor(0, 0, 0, 0.85)
|
||||
modelBg:SetBackdropBorderColor(0.35, 0.35, 0.35, 0.9)
|
||||
|
||||
MTH_MV.popupModel = CreateFrame("PlayerModel", "MTH_BOOK_ModelPopupModel", modelBg)
|
||||
MTH_MV.popupModel:SetPoint("TOPLEFT", modelBg, "TOPLEFT", 3, -3)
|
||||
MTH_MV.popupModel:SetPoint("BOTTOMRIGHT", modelBg, "BOTTOMRIGHT", -3, 3)
|
||||
|
||||
-- Mouse rotation: drag on the black model area rotates; outside drags the popup
|
||||
MTH_MV.popupModel:EnableMouse(true)
|
||||
MTH_MV.popupModel:SetScript("OnMouseDown", function()
|
||||
MTH_MV.rotating = true
|
||||
MTH_MV.rotateLastX = GetCursorPosition()
|
||||
end)
|
||||
MTH_MV.popupModel:SetScript("OnMouseUp", function()
|
||||
MTH_MV.rotating = false
|
||||
end)
|
||||
MTH_MV.popupModel:SetScript("OnUpdate", function()
|
||||
if not MTH_MV.rotating then return end
|
||||
local cx = GetCursorPosition()
|
||||
local dx = cx - MTH_MV.rotateLastX
|
||||
MTH_MV.rotateLastX = cx
|
||||
if dx ~= 0 then
|
||||
MTH_MV.facing = MTH_MV.facing - dx * 0.03
|
||||
MTH_MV.popupModel:SetFacing(MTH_MV.facing)
|
||||
end
|
||||
end)
|
||||
|
||||
-- Title (family name) anchored above the model
|
||||
MTH_MV.popupTitle = popup:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
MTH_MV.popupTitle:SetPoint("TOP", modelBg, "TOP", 0, 18)
|
||||
MTH_MV.popupTitle:SetTextColor(1, 0.82, 0)
|
||||
MTH_MV.popupTitle:SetText("Skin Viewer")
|
||||
|
||||
-- Close [X] button
|
||||
local closeBtn = CreateFrame("Button", nil, popup)
|
||||
closeBtn:SetWidth(22)
|
||||
closeBtn:SetHeight(22)
|
||||
closeBtn:SetPoint("TOPRIGHT", popup, "TOPRIGHT", -10, -10)
|
||||
closeBtn:SetHighlightTexture("Interface\\Buttons\\ButtonHilight-Square")
|
||||
local closeLbl = closeBtn:CreateFontString(nil, "OVERLAY", "GameFontNormal")
|
||||
closeLbl:SetAllPoints(closeBtn)
|
||||
closeLbl:SetText("X")
|
||||
closeLbl:SetTextColor(0.9, 0.9, 0.9)
|
||||
closeBtn:SetScript("OnClick", function() this:GetParent():Hide() end)
|
||||
|
||||
-- "Unique Appearance" badge removed (inline texture syntax unsupported in this client)
|
||||
|
||||
-- Nav: ◀ label ▶ (kept within the left 264px area)
|
||||
local prevBtn = CreateFrame("Button", nil, popup, "UIPanelButtonTemplate")
|
||||
prevBtn:SetWidth(28)
|
||||
prevBtn:SetHeight(20)
|
||||
prevBtn:SetPoint("BOTTOMLEFT", popup, "BOTTOMLEFT", 14, 14)
|
||||
prevBtn:SetText("<")
|
||||
prevBtn:SetScript("OnClick", function()
|
||||
local n = table.getn(MTH_MV.skins)
|
||||
if n < 1 then return end
|
||||
MTH_MV.index = MTH_MV.index - 1
|
||||
if MTH_MV.index < 1 then MTH_MV.index = n end
|
||||
MTH_MV_DisplayCurrent()
|
||||
end)
|
||||
|
||||
local nextBtn = CreateFrame("Button", nil, popup, "UIPanelButtonTemplate")
|
||||
nextBtn:SetWidth(28)
|
||||
nextBtn:SetHeight(20)
|
||||
nextBtn:SetPoint("BOTTOMLEFT", popup, "BOTTOMLEFT", 222, 14)
|
||||
nextBtn:SetText(">")
|
||||
nextBtn:SetScript("OnClick", function()
|
||||
local n = table.getn(MTH_MV.skins)
|
||||
if n < 1 then return end
|
||||
MTH_MV.index = MTH_MV.index + 1
|
||||
if MTH_MV.index > n then MTH_MV.index = 1 end
|
||||
MTH_MV_DisplayCurrent()
|
||||
end)
|
||||
|
||||
MTH_MV.popupSkinLabel = popup:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
MTH_MV.popupSkinLabel:SetPoint("BOTTOMLEFT", prevBtn, "BOTTOMRIGHT", 4, 0)
|
||||
MTH_MV.popupSkinLabel:SetPoint("BOTTOMRIGHT", nextBtn, "BOTTOMLEFT", -4, 0)
|
||||
MTH_MV.popupSkinLabel:SetJustifyH("CENTER")
|
||||
MTH_MV.popupSkinLabel:SetTextColor(0.9, 0.9, 0.9)
|
||||
|
||||
-- ---------------------------------------------------------------
|
||||
-- Right panel: vertical divider + beast list
|
||||
-- ---------------------------------------------------------------
|
||||
local divider = popup:CreateTexture(nil, "ARTWORK")
|
||||
divider:SetTexture("Interface\\Buttons\\WHITE8X8")
|
||||
divider:SetVertexColor(0.35, 0.35, 0.35, 0.8)
|
||||
divider:SetPoint("TOPLEFT", popup, "TOPLEFT", 270, -36)
|
||||
divider:SetPoint("BOTTOMLEFT", popup, "BOTTOMLEFT", 270, 12)
|
||||
divider:SetWidth(1)
|
||||
|
||||
local listHeader = popup:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
listHeader:SetPoint("TOPLEFT", popup, "TOPLEFT", 278, -18)
|
||||
listHeader:SetTextColor(1, 0.82, 0)
|
||||
listHeader:SetText("Beasts with this skin")
|
||||
|
||||
local listSep = popup:CreateTexture(nil, "ARTWORK")
|
||||
listSep:SetTexture("Interface\\Buttons\\WHITE8X8")
|
||||
listSep:SetVertexColor(0.35, 0.35, 0.35, 0.6)
|
||||
listSep:SetPoint("TOPLEFT", popup, "TOPLEFT", 278, -30)
|
||||
listSep:SetPoint("TOPRIGHT", popup, "TOPRIGHT", -10, -30)
|
||||
listSep:SetHeight(1)
|
||||
|
||||
MTH_MV.skinListEmpty = popup:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
MTH_MV.skinListEmpty:SetPoint("TOPLEFT", popup, "TOPLEFT", 278, -38)
|
||||
MTH_MV.skinListEmpty:SetTextColor(0.5, 0.5, 0.5)
|
||||
MTH_MV.skinListEmpty:SetText("\226\128\148")
|
||||
MTH_MV.skinListEmpty:Hide()
|
||||
|
||||
-- Beast rows (14 max)
|
||||
local ROW_X = 278
|
||||
local ROW_START = -36
|
||||
local ROW_H = 17
|
||||
local MAX_ROWS = 14
|
||||
for i = 1, MAX_ROWS do
|
||||
local row = CreateFrame("Button", nil, popup)
|
||||
row:SetPoint("TOPLEFT", popup, "TOPLEFT", ROW_X, ROW_START - (i - 1) * ROW_H)
|
||||
row:SetWidth(200)
|
||||
row:SetHeight(ROW_H - 1)
|
||||
row._npcId = nil
|
||||
|
||||
local hl = row:CreateTexture(nil, "HIGHLIGHT")
|
||||
hl:SetAllPoints(row)
|
||||
hl:SetTexture("Interface\\QuestFrame\\UI-QuestTitleHighlight")
|
||||
hl:SetBlendMode("ADD")
|
||||
hl:SetAlpha(0.35)
|
||||
|
||||
row.nameText = row:CreateFontString(nil, "OVERLAY", "GameFontHighlightSmall")
|
||||
row.nameText:SetPoint("LEFT", row, "LEFT", 0, 0)
|
||||
row.nameText:SetWidth(158)
|
||||
row.nameText:SetJustifyH("LEFT")
|
||||
|
||||
row.lvlText = row:CreateFontString(nil, "OVERLAY", "GameFontNormalSmall")
|
||||
row.lvlText:SetPoint("LEFT", row, "LEFT", 160, 0)
|
||||
row.lvlText:SetWidth(38)
|
||||
row.lvlText:SetJustifyH("LEFT")
|
||||
row.lvlText:SetTextColor(0.7, 0.7, 0.7)
|
||||
|
||||
row:SetScript("OnClick", function()
|
||||
if this._npcId and type(MTH_BOOK_JumpToBeastById) == "function" then
|
||||
MTH_MV.keepPopup = true
|
||||
MTH_BOOK_JumpToBeastById(this._npcId)
|
||||
MTH_MV.keepPopup = false
|
||||
end
|
||||
end)
|
||||
row:Hide()
|
||||
MTH_MV.skinBeastRows[i] = row
|
||||
end
|
||||
|
||||
MTH_MV.popup = popup
|
||||
mv_log("Init: complete")
|
||||
end
|
||||
|
||||
-- ---------------------------------------------------------------------------
|
||||
-- Public API
|
||||
-- ---------------------------------------------------------------------------
|
||||
|
||||
function MTH_BOOK_ModelViewer_SetFamily(family, skinId)
|
||||
mv_log("SetFamily: "..tostring(family).." skinId="..tostring(skinId))
|
||||
MTH_MV_Init()
|
||||
if not MTH_MV.inited then mv_err("SetFamily: init failed") return end
|
||||
local skins = MTH_DS_BeastSkins and type(MTH_DS_BeastSkins) == "table" and MTH_DS_BeastSkins[family]
|
||||
if not skins or table.getn(skins) == 0 then
|
||||
mv_log("SetFamily: no skins for "..tostring(family).." DS type="..type(MTH_DS_BeastSkins or false))
|
||||
MTH_BOOK_ModelViewer_Clear()
|
||||
return
|
||||
end
|
||||
|
||||
-- Filter to only skins used by at least one tameable beast
|
||||
local usedSkinIds = {}
|
||||
if MTH_DS_Beasts then
|
||||
for _, beast in pairs(MTH_DS_Beasts) do
|
||||
if type(beast) == "table" and beast.skinId then
|
||||
usedSkinIds[beast.skinId] = true
|
||||
end
|
||||
end
|
||||
end
|
||||
local filteredSkins = {}
|
||||
for i = 1, table.getn(skins) do
|
||||
if usedSkinIds[skins[i].id] then
|
||||
table.insert(filteredSkins, skins[i])
|
||||
end
|
||||
end
|
||||
if table.getn(filteredSkins) == 0 then
|
||||
MTH_BOOK_ModelViewer_Clear()
|
||||
return
|
||||
end
|
||||
mv_log("SetFamily: "..table.getn(filteredSkins).." tameable skins (filtered from "..table.getn(skins)..")")
|
||||
|
||||
MTH_MV.family = family
|
||||
MTH_MV.skins = filteredSkins
|
||||
MTH_MV.facing = 0.6
|
||||
|
||||
-- If we have a specific skinId, jump to the matching skin entry.
|
||||
MTH_MV.index = 1
|
||||
if skinId then
|
||||
for i = 1, table.getn(filteredSkins) do
|
||||
if filteredSkins[i].id == skinId then
|
||||
MTH_MV.index = i
|
||||
mv_log("SetFamily: skinId "..skinId.." matched skin index "..i)
|
||||
break
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if MTH_MV.popupTitle then
|
||||
MTH_MV.popupTitle:SetText(tostring(family) .. " — Skins")
|
||||
end
|
||||
|
||||
MTH_MV_DisplayCurrent()
|
||||
|
||||
if MTH_MV.previewFrame then MTH_MV.previewFrame:Show() end
|
||||
MTH_MV_DisplayCurrent()
|
||||
end
|
||||
|
||||
function MTH_BOOK_ModelViewer_Clear()
|
||||
mv_log("Clear")
|
||||
if MTH_MV.previewFrame then MTH_MV.previewFrame:Hide() end
|
||||
if not MTH_MV.keepPopup then
|
||||
if MTH_MV.popup and MTH_MV.popup:IsShown() then MTH_MV.popup:Hide() end
|
||||
end
|
||||
MTH_MV.family = nil
|
||||
MTH_MV.skins = {}
|
||||
MTH_MV.index = 1
|
||||
end
|
||||
|
||||
function MTH_BOOK_ModelViewer_OpenPopup()
|
||||
mv_log("OpenPopup skins="..table.getn(MTH_MV.skins))
|
||||
MTH_MV_Init()
|
||||
if not MTH_MV.popup then mv_err("OpenPopup: no popup frame") return end
|
||||
if table.getn(MTH_MV.skins) == 0 then mv_log("OpenPopup: no skins") return end
|
||||
MTH_MV.popup:Show()
|
||||
MTH_MV.popup:Raise()
|
||||
MTH_MV_DisplayCurrent()
|
||||
end
|
||||
@@ -2,17 +2,18 @@ if type(MTH_HUNTERBOOK_TABS) ~= "table" then MTH_HUNTERBOOK_TABS = {} end
|
||||
|
||||
MTH_HUNTERBOOK_TABS.pets = {
|
||||
headerLabel = "Beasts",
|
||||
columnLabels = { "ID", "Lvl", "Family", "Name", "Abilities", "Zone", "R", "E", "U" },
|
||||
columnLabels = { "ID", "Lvl", "Fam", "Name", "Abilities", "Zone", "R", "E", "U", "AS" },
|
||||
columnLayout = {
|
||||
{ x = 8, width = 28, align = "LEFT" },
|
||||
{ x = 38, width = 30, align = "LEFT" },
|
||||
{ x = 68, width = 74, align = "LEFT" },
|
||||
{ x = 142, width = 130, align = "LEFT" },
|
||||
{ x = 272, width = 180, align = "LEFT" },
|
||||
{ x = 452, width = 68, align = "LEFT" },
|
||||
{ x = 520, width = 10, align = "CENTER" },
|
||||
{ x = 532, width = 10, align = "CENTER" },
|
||||
{ x = 544, width = 10, align = "CENTER" },
|
||||
{ x = 68, width = 18, align = "LEFT" },
|
||||
{ x = 88, width = 130, align = "LEFT" },
|
||||
{ x = 220, width = 148, align = "LEFT" },
|
||||
{ x = 370, width = 80, align = "LEFT" },
|
||||
{ x = 452, width = 14, align = "CENTER" },
|
||||
{ x = 468, width = 14, align = "CENTER" },
|
||||
{ x = 484, width = 14, align = "CENTER" },
|
||||
{ x = 500, width = 54, align = "LEFT" },
|
||||
},
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,6 @@ MTH_HUNTERBOOK_TABS.families = {
|
||||
}
|
||||
|
||||
local function MTH_BOOKTAB_FamiliesTrace(message)
|
||||
return
|
||||
end
|
||||
|
||||
local function MTH_BOOKTAB_FamiliesSafeLower(value)
|
||||
@@ -83,6 +82,7 @@ function MTH_BOOKTAB_BuildFamiliesRows()
|
||||
|
||||
for familyName, familyRow in pairs(families) do
|
||||
if type(familyRow) == "table" then
|
||||
MTH_BOOKTAB_FamiliesTrace("BUILD " .. tostring(familyName) .. " icon=" .. tostring(familyRow.icon))
|
||||
local abilities = {}
|
||||
local seen = {}
|
||||
|
||||
@@ -191,6 +191,7 @@ function MTH_BOOKTAB_BuildFamiliesRows()
|
||||
|
||||
table.insert(results, {
|
||||
family = tostring(familyName),
|
||||
icon = familyRow.icon or nil,
|
||||
named = tonumber(familyRow.named) or 0,
|
||||
coords = tonumber(familyRow.coords) or 0,
|
||||
abilities = abilities,
|
||||
@@ -289,9 +290,15 @@ function MTH_BOOKTAB_EnsureFamiliesUI()
|
||||
row:SetPoint("TOPRIGHT", ui.rows[i - 1], "BOTTOMRIGHT", 0, -1)
|
||||
end
|
||||
|
||||
row.familyIcon = row:CreateTexture(nil, "ARTWORK")
|
||||
row.familyIcon:SetPoint("LEFT", row, "LEFT", 4, 0)
|
||||
row.familyIcon:SetWidth(16)
|
||||
row.familyIcon:SetHeight(16)
|
||||
row.familyIcon:Hide()
|
||||
|
||||
row.family = row:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
row.family:SetPoint("LEFT", row, "LEFT", 4, 0)
|
||||
row.family:SetWidth(106)
|
||||
row.family:SetPoint("LEFT", row, "LEFT", 24, 0)
|
||||
row.family:SetWidth(88)
|
||||
row.family:SetJustifyH("LEFT")
|
||||
|
||||
row.named = row:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
@@ -393,6 +400,14 @@ function MTH_BOOKTAB_RenderFamiliesList()
|
||||
if row then
|
||||
rowFrame:Show()
|
||||
rowFrame.family:SetText(tostring(row.family or "-"))
|
||||
local familyIconPath = row.icon and MTH_BOOK_ResolveIconPath and MTH_BOOK_ResolveIconPath(row.icon) or nil
|
||||
MTH_BOOKTAB_FamiliesTrace("RENDER " .. tostring(row.family) .. " icon=" .. tostring(row.icon) .. " path=" .. tostring(familyIconPath))
|
||||
if familyIconPath then
|
||||
rowFrame.familyIcon:SetTexture(familyIconPath)
|
||||
rowFrame.familyIcon:Show()
|
||||
else
|
||||
rowFrame.familyIcon:Hide()
|
||||
end
|
||||
rowFrame.named:SetText(tostring(row.named or 0))
|
||||
rowFrame.coords:SetText(tostring(row.coords or 0))
|
||||
rowFrame.diet:SetText(tostring(row.dietText or "-"))
|
||||
|
||||
+64
-47
@@ -150,7 +150,7 @@ local function MTH_HB_RequireOpenDeps()
|
||||
return true
|
||||
end
|
||||
|
||||
local MTH_BOOK_MAX_COLS = 9
|
||||
local MTH_BOOK_MAX_COLS = 10
|
||||
local MTH_BOOK_MAX_ROWS = 20
|
||||
|
||||
local MTH_BOOK_PetFamilyOptions = {
|
||||
@@ -222,7 +222,8 @@ local MTH_BOOK_CONTENT_LAYOUT_DEFAULT = {
|
||||
detailX = 608,
|
||||
detailY = -166,
|
||||
detailW = 136,
|
||||
detailH = 324,
|
||||
detailH = 208,
|
||||
detailTextH = 192, -- inspector text only; model viewer sits below in its own frame
|
||||
}
|
||||
|
||||
local MTH_BOOK_CONTENT_LAYOUT_ITEMS = {
|
||||
@@ -328,7 +329,7 @@ local function MTH_BOOK_ApplyContentLayoutForMode()
|
||||
detailText:ClearAllPoints()
|
||||
detailText:SetPoint("TOPLEFT", detailParent, "TOPLEFT", 6, -6)
|
||||
detailText:SetWidth(layout.detailW - 12)
|
||||
detailText:SetHeight(layout.detailH - 12)
|
||||
detailText:SetHeight(layout.detailTextH or (layout.detailH - 12))
|
||||
end
|
||||
|
||||
local sliderHeight = layout.listH - 32
|
||||
@@ -1281,6 +1282,7 @@ local function MTH_BOOK_GetSortKey(entry, col)
|
||||
if col == 7 then return traits.rare and 1 or 0 end
|
||||
if col == 8 then return traits.elite and 1 or 0 end
|
||||
if col == 9 then return traits.unique and 1 or 0 end
|
||||
if col == 10 then return tonumber(beast.attackSpeed) or 0 end
|
||||
end
|
||||
|
||||
if MTH_BOOK_STATE.mode == "abilities" then
|
||||
@@ -2994,9 +2996,14 @@ end
|
||||
function MTH_BOOK_UpdateDetail()
|
||||
local detail = getglobal("MTH_BOOK_DetailBackdropDetailText")
|
||||
if not detail then return end
|
||||
-- Hide model skin preview when not in a beast-list mode
|
||||
if MTH_BOOK_STATE.mode ~= "pets" and MTH_BOOK_STATE.mode ~= "abilities" then
|
||||
if MTH_BOOK_ModelViewer_Clear then MTH_BOOK_ModelViewer_Clear() end
|
||||
end
|
||||
local petTop = MTH_BOOK_STATE.petUI and MTH_BOOK_STATE.petUI.detailTop
|
||||
local petBottom = MTH_BOOK_STATE.petUI and MTH_BOOK_STATE.petUI.detailBottom
|
||||
if not MTH_BOOK_STATE.selectedEntry then
|
||||
if MTH_BOOK_ModelViewer_Clear then MTH_BOOK_ModelViewer_Clear() end
|
||||
if MTH_BOOK_STATE.mode == "petabilities" then
|
||||
if petTop and petBottom then
|
||||
MTH_BOOK_SetDetailText(petTop, "|cFFFFD100Baseline|r\n\nSelect a spell baseline from the left list.")
|
||||
@@ -3090,26 +3097,7 @@ function MTH_BOOK_UpdateDetail()
|
||||
MTH_BOOK_AddDetailKV(lines, "Rare", beast.rare and "Yes" or "No")
|
||||
MTH_BOOK_AddDetailKV(lines, "Abilities", beast.abilities or "None")
|
||||
|
||||
local fam = MTH_DS_Families and beast.family and MTH_DS_Families[beast.family]
|
||||
if fam and fam.abilities and table.getn(fam.abilities) > 0 then
|
||||
MTH_BOOK_AddDetailSection(lines, "Family Pool")
|
||||
table.insert(lines, " " .. table.concat(fam.abilities, ", "))
|
||||
end
|
||||
|
||||
if beast.coords and table.getn(beast.coords) > 0 then
|
||||
MTH_BOOK_AddDetailSection(lines, "Locations")
|
||||
for i = 1, table.getn(beast.coords) do
|
||||
local c = beast.coords[i]
|
||||
if c then
|
||||
local x = tonumber(c[1] or 0) or 0
|
||||
local y = tonumber(c[2] or 0) or 0
|
||||
local zoneId = c[3]
|
||||
table.insert(lines, string.format(" - %s (%.1f, %.1f)", MTH_BOOK_GetZoneName(zoneId), x, y))
|
||||
end
|
||||
if i >= 8 then break end
|
||||
end
|
||||
end
|
||||
|
||||
if MTH_BOOK_ModelViewer_SetFamily then MTH_BOOK_ModelViewer_SetFamily(beast.family, beast.skinId) end
|
||||
MTH_BOOK_SetDetailText(detail, table.concat(lines, "\n"))
|
||||
MTH_BOOK_UpdateOpenMapButton()
|
||||
return
|
||||
@@ -3145,20 +3133,7 @@ function MTH_BOOK_UpdateDetail()
|
||||
end
|
||||
MTH_BOOK_AddDetailKV(lines, "Rare", beast.rare and "Yes" or "No")
|
||||
|
||||
if beast.coords and table.getn(beast.coords) > 0 then
|
||||
MTH_BOOK_AddDetailSection(lines, "Locations")
|
||||
for i = 1, table.getn(beast.coords) do
|
||||
local c = beast.coords[i]
|
||||
if c then
|
||||
local x = tonumber(c[1] or 0) or 0
|
||||
local y = tonumber(c[2] or 0) or 0
|
||||
local zoneId = c[3]
|
||||
table.insert(lines, string.format(" - %s (%.1f, %.1f)", MTH_BOOK_GetZoneName(zoneId), x, y))
|
||||
end
|
||||
if i >= 8 then break end
|
||||
end
|
||||
end
|
||||
|
||||
if MTH_BOOK_ModelViewer_SetFamily then MTH_BOOK_ModelViewer_SetFamily(beast.family, beast.skinId) end
|
||||
MTH_BOOK_SetDetailText(detail, table.concat(lines, "\n"))
|
||||
MTH_BOOK_UpdateOpenMapButton()
|
||||
return
|
||||
@@ -3467,7 +3442,7 @@ local function MTH_BOOK_GetColumnLabels()
|
||||
return tabDef.columnLabels
|
||||
end
|
||||
if MTH_BOOK_STATE.mode == "pets" then
|
||||
return { "ID", "Lvl", "Family", "Name", "Abilities", "Zone", "R", "E", "U" }
|
||||
return { "ID", "Lvl", "Fam", "Name", "Abilities", "Zone", "R", "E", "U", "AS" }
|
||||
elseif MTH_BOOK_STATE.mode == "petabilities" then
|
||||
return { "Ability Name", "Ranks", "Families" }
|
||||
elseif MTH_BOOK_STATE.mode == "stable" then
|
||||
@@ -3493,13 +3468,14 @@ local function MTH_BOOK_GetColumnLayout()
|
||||
return {
|
||||
{ x = 8, width = 28, align = "LEFT" },
|
||||
{ x = 38, width = 30, align = "LEFT" },
|
||||
{ x = 68, width = 74, align = "LEFT" },
|
||||
{ x = 142, width = 130, align = "LEFT" },
|
||||
{ x = 272, width = 180, align = "LEFT" },
|
||||
{ x = 452, width = 68, align = "LEFT" },
|
||||
{ x = 520, width = 10, align = "CENTER" },
|
||||
{ x = 532, width = 10, align = "CENTER" },
|
||||
{ x = 544, width = 10, align = "CENTER" },
|
||||
{ x = 68, width = 18, align = "LEFT" },
|
||||
{ x = 88, width = 130, align = "LEFT" },
|
||||
{ x = 220, width = 148, align = "LEFT" },
|
||||
{ x = 370, width = 80, align = "LEFT" },
|
||||
{ x = 452, width = 14, align = "CENTER" },
|
||||
{ x = 468, width = 14, align = "CENTER" },
|
||||
{ x = 484, width = 14, align = "CENTER" },
|
||||
{ x = 500, width = 54, align = "LEFT" },
|
||||
}
|
||||
elseif MTH_BOOK_STATE.mode == "petabilities" then
|
||||
return {
|
||||
@@ -3660,6 +3636,19 @@ local function MTH_BOOK_ApplyColumnLayout(parent)
|
||||
btn.cols[itemNameColumn]:SetPoint("LEFT", btn, "LEFT", itemNameLayout.x + 12, 0)
|
||||
btn.cols[itemNameColumn]:SetWidth(itemNameLayout.width - 16)
|
||||
end
|
||||
elseif MTH_BOOK_STATE.mode == "families" and layout[1] then
|
||||
local familyCol = layout[1]
|
||||
btn.itemIcon:ClearAllPoints()
|
||||
btn.itemIcon:SetPoint("LEFT", btn, "LEFT", familyCol.x, 0)
|
||||
if btn.cols and btn.cols[1] then
|
||||
btn.cols[1]:ClearAllPoints()
|
||||
btn.cols[1]:SetPoint("LEFT", btn, "LEFT", familyCol.x + 18, 0)
|
||||
btn.cols[1]:SetWidth(familyCol.width - 18)
|
||||
end
|
||||
elseif MTH_BOOK_STATE.mode == "pets" and layout[3] then
|
||||
local famCol = layout[3]
|
||||
btn.itemIcon:ClearAllPoints()
|
||||
btn.itemIcon:SetPoint("LEFT", btn, "LEFT", famCol.x, 0)
|
||||
else
|
||||
btn.itemIcon:Hide()
|
||||
end
|
||||
@@ -3671,7 +3660,7 @@ end
|
||||
local function MTH_BOOK_GetRowValues(entry)
|
||||
if MTH_BOOK_STATE.mode == "pets" then
|
||||
local beast = MTH_DS_Beasts and MTH_DS_Beasts[entry]
|
||||
if not beast then return { "", "", "", "", "", "", "", "", "" } end
|
||||
if not beast then return { "", "", "", "", "", "", "", "", "", "" } end
|
||||
local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(entry, beast.name)) or beast.name
|
||||
local traits = MTH_BOOK_ParseBeastTraits(beast)
|
||||
local abilities = MTH_BOOK_GetBeastAbilitiesSummary(beast)
|
||||
@@ -3679,13 +3668,14 @@ local function MTH_BOOK_GetRowValues(entry)
|
||||
return {
|
||||
"|cFF33CCFF" .. tostring(entry) .. "|r",
|
||||
tostring(beast.lvl or "?"),
|
||||
tostring(beast.family or "?"),
|
||||
"", -- family icon rendered separately
|
||||
tostring(beastDisplayName or "Unknown"),
|
||||
abilities,
|
||||
zone,
|
||||
(traits.rare and "R" or ""),
|
||||
(traits.elite and "E" or ""),
|
||||
(traits.unique and "U" or ""),
|
||||
tostring(beast.attackSpeed or ""),
|
||||
}
|
||||
end
|
||||
|
||||
@@ -4090,6 +4080,31 @@ MTH_BOOK_UpdateResults = function()
|
||||
btn.itemIcon:SetTexture(nil)
|
||||
btn.itemIcon:Hide()
|
||||
end
|
||||
elseif MTH_BOOK_STATE.mode == "families" and type(entry) == "table" and entry.icon then
|
||||
local iconPath = MTH_BOOK_ResolveIconPath(entry.icon)
|
||||
if iconPath then
|
||||
btn.itemIcon:SetTexture(iconPath)
|
||||
btn.itemIcon:Show()
|
||||
else
|
||||
btn.itemIcon:SetTexture(nil)
|
||||
btn.itemIcon:Hide()
|
||||
end
|
||||
elseif MTH_BOOK_STATE.mode == "pets" then
|
||||
local beast = MTH_DS_Beasts and MTH_DS_Beasts[entry]
|
||||
local famData = beast and beast.family and MTH_DS_Families and MTH_DS_Families[beast.family]
|
||||
if famData and famData.icon and famData.icon ~= "" then
|
||||
local iconPath = MTH_BOOK_ResolveIconPath(famData.icon)
|
||||
if iconPath then
|
||||
btn.itemIcon:SetTexture(iconPath)
|
||||
btn.itemIcon:Show()
|
||||
else
|
||||
btn.itemIcon:SetTexture(nil)
|
||||
btn.itemIcon:Hide()
|
||||
end
|
||||
else
|
||||
btn.itemIcon:SetTexture(nil)
|
||||
btn.itemIcon:Hide()
|
||||
end
|
||||
else
|
||||
btn.itemIcon:SetTexture(nil)
|
||||
btn.itemIcon:Hide()
|
||||
@@ -4614,6 +4629,8 @@ function MTH_BOOK_JumpToBeastById(beastId)
|
||||
MTH_BOOK_STATE.mode = "pets"
|
||||
local widgets = MTH_BOOK_GetFilterWidgets()
|
||||
MTH_BOOK_ResetStateForMode("pets")
|
||||
MTH_BOOK_STATE.petHideNoAbilities = false
|
||||
MTH_BOOK_STATE.petHideUnknown = false
|
||||
MTH_BOOK_STATE.search = tostring(id)
|
||||
MTH_BOOK_STATE.forcedBeastId = id
|
||||
MTH_BOOK_ApplyStateToWidgets(widgets)
|
||||
|
||||
+3
-3
@@ -74,7 +74,7 @@
|
||||
</Frame>
|
||||
|
||||
<Frame name="$parentDetailBackdrop">
|
||||
<Size><AbsDimension x="136" y="324"/></Size>
|
||||
<Size><AbsDimension x="136" y="155"/></Size>
|
||||
<Anchors>
|
||||
<Anchor point="TOPLEFT"><Offset><AbsDimension x="608" y="-166"/></Offset></Anchor>
|
||||
</Anchors>
|
||||
@@ -85,7 +85,7 @@
|
||||
</Backdrop>
|
||||
<Frames>
|
||||
<EditBox name="$parentDetailText" autoFocus="false" multiLine="true" text="Select an entry to view details.">
|
||||
<Size><AbsDimension x="120" y="306"/></Size>
|
||||
<Size><AbsDimension x="120" y="139"/></Size>
|
||||
<Anchors>
|
||||
<Anchor point="TOPLEFT"><Offset><AbsDimension x="8" y="-8"/></Offset></Anchor>
|
||||
</Anchors>
|
||||
@@ -96,7 +96,7 @@
|
||||
<Button name="$parentOpenMapButton" inherits="UIPanelButtonTemplate" text="Open Map" hidden="true">
|
||||
<Size><AbsDimension x="136" y="22"/></Size>
|
||||
<Anchors>
|
||||
<Anchor point="TOPLEFT"><Offset><AbsDimension x="608" y="-496"/></Offset></Anchor>
|
||||
<Anchor point="TOPLEFT"><Offset><AbsDimension x="608" y="-524"/></Offset></Anchor>
|
||||
</Anchors>
|
||||
</Button>
|
||||
|
||||
|
||||
@@ -0,0 +1,403 @@
|
||||
------------------------------------------------------
|
||||
-- MetaHunt Profile Management Options Panel
|
||||
------------------------------------------------------
|
||||
|
||||
local MAX_PROFILE_ROWS = 15
|
||||
local MAX_CHAR_ROWS = 10
|
||||
local ROW_H = 26
|
||||
|
||||
-- Row pools — anonymous frames created once against scroll content, reused each refresh
|
||||
local gProfileRows = {} -- [i] = { frame, nameText, infoText, loadBtn, delBtn }
|
||||
local gCharRows = {} -- [i] = { frame, nameText, infoText, copyBtn }
|
||||
|
||||
-- Static element refs created once
|
||||
local gActiveLabel = nil
|
||||
local gSetupDone = false
|
||||
|
||||
-- Pending confirmations — globals so StaticPopup OnAccept can read them
|
||||
MTH_PROFILE_PENDING_LOAD = nil
|
||||
MTH_PROFILE_PENDING_DELETE = nil
|
||||
MTH_PROFILE_PENDING_SAVE = nil
|
||||
|
||||
-- ── Static popup dialogs ───────────────────────────────────────────────────
|
||||
|
||||
StaticPopupDialogs["MTH_PROFILE_LOAD_CONFIRM"] = {
|
||||
text = "Load profile \"%s\"?\n\nCurrent settings will be replaced.\nThe UI will reload to apply all changes.",
|
||||
button1 = "Load & Reload",
|
||||
button2 = "Cancel",
|
||||
OnAccept = function()
|
||||
if MTH_PROFILE_PENDING_LOAD then
|
||||
local ok, err = MTH_Profile_Load(MTH_PROFILE_PENDING_LOAD)
|
||||
MTH_PROFILE_PENDING_LOAD = nil
|
||||
if ok then
|
||||
ReloadUI()
|
||||
elseif MTH and MTH.Print then
|
||||
MTH:Print("Profile load failed: " .. tostring(err), "error")
|
||||
end
|
||||
end
|
||||
end,
|
||||
timeout = 0, whileDead = 0, hideOnEscape = 1,
|
||||
}
|
||||
|
||||
StaticPopupDialogs["MTH_PROFILE_DELETE_CONFIRM"] = {
|
||||
text = "Delete profile \"%s\"?\n\nThis cannot be undone.",
|
||||
button1 = "Delete",
|
||||
button2 = "Cancel",
|
||||
OnAccept = function()
|
||||
if MTH_PROFILE_PENDING_DELETE then
|
||||
MTH_Profile_Delete(MTH_PROFILE_PENDING_DELETE)
|
||||
MTH_PROFILE_PENDING_DELETE = nil
|
||||
MTH_SetupProfilesOptions()
|
||||
end
|
||||
end,
|
||||
timeout = 0, whileDead = 0, hideOnEscape = 1,
|
||||
}
|
||||
|
||||
StaticPopupDialogs["MTH_PROFILE_SAVE_CONFIRM"] = {
|
||||
text = "Profile \"%s\" already exists.\nOverwrite with current settings?",
|
||||
button1 = "Overwrite",
|
||||
button2 = "Cancel",
|
||||
OnAccept = function()
|
||||
if MTH_PROFILE_PENDING_SAVE then
|
||||
MTH_Profile_Save(MTH_PROFILE_PENDING_SAVE)
|
||||
MTH_PROFILE_PENDING_SAVE = nil
|
||||
MTH_SetupProfilesOptions()
|
||||
end
|
||||
end,
|
||||
timeout = 0, whileDead = 0, hideOnEscape = 1,
|
||||
}
|
||||
|
||||
-- ── internal helpers ───────────────────────────────────────────────────────
|
||||
|
||||
local function PROF_TrimString(s)
|
||||
if type(s) ~= "string" then return "" end
|
||||
return string.gsub(s, "^%s*(.-)%s*$", "%1")
|
||||
end
|
||||
|
||||
local function PROF_DoSave(rawName)
|
||||
local name = PROF_TrimString(rawName)
|
||||
if string.len(name) == 0 then
|
||||
if MTH and MTH.Print then MTH:Print("Enter a profile name first.", "error") end
|
||||
return
|
||||
end
|
||||
if string.len(name) > 50 then
|
||||
if MTH and MTH.Print then MTH:Print("Profile name too long (50 chars max).", "error") end
|
||||
return
|
||||
end
|
||||
local existing = type(MTH_SavedVariables) == "table"
|
||||
and type(MTH_SavedVariables.profiles) == "table"
|
||||
and MTH_SavedVariables.profiles[name] ~= nil
|
||||
if existing then
|
||||
MTH_PROFILE_PENDING_SAVE = name
|
||||
StaticPopup_Show("MTH_PROFILE_SAVE_CONFIRM", name)
|
||||
else
|
||||
MTH_Profile_Save(name)
|
||||
if MTH and MTH.Print then MTH:Print("Profile saved: " .. name) end
|
||||
MTH_SetupProfilesOptions()
|
||||
end
|
||||
end
|
||||
|
||||
-- ── scroll frames + row pool creation (idempotent) ────────────────────────
|
||||
|
||||
local function PROF_EnsureScrollFrames(container)
|
||||
if not MTH_GetFrame("MetaHuntOptionsProfilesScroll") then
|
||||
local sf = CreateFrame("ScrollFrame", "MetaHuntOptionsProfilesScroll", container, "UIPanelScrollFrameTemplate")
|
||||
local sc = CreateFrame("Frame", "MetaHuntOptionsProfilesContent", sf)
|
||||
sc:SetWidth(510)
|
||||
sc:SetHeight(MAX_PROFILE_ROWS * ROW_H + 4)
|
||||
sf:SetScrollChild(sc)
|
||||
end
|
||||
if not MTH_GetFrame("MetaHuntOptionsCharScroll") then
|
||||
local csf = CreateFrame("ScrollFrame", "MetaHuntOptionsCharScroll", container, "UIPanelScrollFrameTemplate")
|
||||
local csc = CreateFrame("Frame", "MetaHuntOptionsCharContent", csf)
|
||||
csc:SetWidth(510)
|
||||
csc:SetHeight(MAX_CHAR_ROWS * ROW_H + 4)
|
||||
csf:SetScrollChild(csc)
|
||||
end
|
||||
end
|
||||
|
||||
local function PROF_EnsureProfileRows()
|
||||
local sc = MTH_GetFrame("MetaHuntOptionsProfilesContent")
|
||||
if not sc then return end
|
||||
for i = 1, MAX_PROFILE_ROWS do
|
||||
if not gProfileRows[i] then
|
||||
local row = CreateFrame("Frame", nil, sc)
|
||||
row:SetHeight(ROW_H)
|
||||
row:SetWidth(510)
|
||||
row:SetPoint("TOPLEFT", sc, "TOPLEFT", 0, -(i - 1) * ROW_H)
|
||||
|
||||
local nameText = row:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
nameText:SetPoint("LEFT", row, "LEFT", 4, 2)
|
||||
nameText:SetWidth(210)
|
||||
nameText:SetJustifyH("LEFT")
|
||||
|
||||
local infoText = row:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
|
||||
infoText:SetPoint("LEFT", row, "LEFT", 218, 2)
|
||||
infoText:SetWidth(155)
|
||||
infoText:SetJustifyH("LEFT")
|
||||
infoText:SetTextColor(0.55, 0.55, 0.55)
|
||||
|
||||
local loadBtn = CreateFrame("Button", nil, row, "UIPanelButtonTemplate")
|
||||
loadBtn:SetWidth(58)
|
||||
loadBtn:SetHeight(20)
|
||||
loadBtn:SetPoint("RIGHT", row, "RIGHT", -62, 0)
|
||||
loadBtn:SetText("Load")
|
||||
|
||||
local delBtn = CreateFrame("Button", nil, row, "UIPanelButtonTemplate")
|
||||
delBtn:SetWidth(58)
|
||||
delBtn:SetHeight(20)
|
||||
delBtn:SetPoint("RIGHT", row, "RIGHT", 0, 0)
|
||||
delBtn:SetText("Delete")
|
||||
|
||||
gProfileRows[i] = { frame = row, nameText = nameText, infoText = infoText, loadBtn = loadBtn, delBtn = delBtn }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function PROF_EnsureCharRows()
|
||||
local csc = MTH_GetFrame("MetaHuntOptionsCharContent")
|
||||
if not csc then return end
|
||||
for i = 1, MAX_CHAR_ROWS do
|
||||
if not gCharRows[i] then
|
||||
local row = CreateFrame("Frame", nil, csc)
|
||||
row:SetHeight(ROW_H)
|
||||
row:SetWidth(510)
|
||||
row:SetPoint("TOPLEFT", csc, "TOPLEFT", 0, -(i - 1) * ROW_H)
|
||||
|
||||
local nameText = row:CreateFontString(nil, "ARTWORK", "GameFontHighlightSmall")
|
||||
nameText:SetPoint("LEFT", row, "LEFT", 4, 2)
|
||||
nameText:SetWidth(250)
|
||||
nameText:SetJustifyH("LEFT")
|
||||
nameText:SetTextColor(0.70, 0.85, 1.00)
|
||||
|
||||
local infoText = row:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
|
||||
infoText:SetPoint("LEFT", row, "LEFT", 258, 2)
|
||||
infoText:SetWidth(120)
|
||||
infoText:SetJustifyH("LEFT")
|
||||
infoText:SetTextColor(0.55, 0.55, 0.55)
|
||||
|
||||
local copyBtn = CreateFrame("Button", nil, row, "UIPanelButtonTemplate")
|
||||
copyBtn:SetWidth(80)
|
||||
copyBtn:SetHeight(20)
|
||||
copyBtn:SetPoint("RIGHT", row, "RIGHT", 0, 0)
|
||||
copyBtn:SetText("Import")
|
||||
|
||||
gCharRows[i] = { frame = row, nameText = nameText, infoText = infoText, copyBtn = copyBtn }
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- ── dynamic refresh functions ──────────────────────────────────────────────
|
||||
|
||||
local function PROF_RefreshActive()
|
||||
if not gActiveLabel then return end
|
||||
local active = type(MTH_Profile_GetActive) == "function" and MTH_Profile_GetActive()
|
||||
if active then
|
||||
gActiveLabel:SetText("Active: |cffffd200" .. active .. "|r")
|
||||
gActiveLabel:SetTextColor(0.90, 0.90, 0.90)
|
||||
else
|
||||
gActiveLabel:SetText("Active: |cff888888Custom (unsaved)|r")
|
||||
gActiveLabel:SetTextColor(0.90, 0.90, 0.90)
|
||||
end
|
||||
gActiveLabel:Show()
|
||||
end
|
||||
|
||||
local function PROF_RefreshProfileList()
|
||||
PROF_EnsureProfileRows()
|
||||
local profiles = type(MTH_Profile_GetList) == "function" and MTH_Profile_GetList() or {}
|
||||
local active = type(MTH_Profile_GetActive) == "function" and MTH_Profile_GetActive()
|
||||
local n = table.getn(profiles)
|
||||
|
||||
local sc = MTH_GetFrame("MetaHuntOptionsProfilesContent")
|
||||
if sc then
|
||||
sc:SetHeight(math.max(n * ROW_H + 4, ROW_H))
|
||||
end
|
||||
|
||||
for i = 1, MAX_PROFILE_ROWS do
|
||||
local row = gProfileRows[i]
|
||||
if not row then break end
|
||||
local name = profiles[i]
|
||||
if name then
|
||||
-- Name (with active indicator)
|
||||
if name == active then
|
||||
row.nameText:SetText(name .. " |cff00cc44[active]|r")
|
||||
else
|
||||
row.nameText:SetText(name)
|
||||
end
|
||||
-- Info: date saved by who
|
||||
local p = type(MTH_SavedVariables) == "table"
|
||||
and type(MTH_SavedVariables.profiles) == "table"
|
||||
and MTH_SavedVariables.profiles[name]
|
||||
local info = ""
|
||||
if type(p) == "table" then
|
||||
if p.savedAt and p.savedAt ~= "" then
|
||||
info = p.savedAt
|
||||
end
|
||||
end
|
||||
row.infoText:SetText(info)
|
||||
-- Wire buttons (SetScript replaces previous handler each refresh)
|
||||
local rowName = name
|
||||
row.loadBtn:SetScript("OnClick", function()
|
||||
MTH_PROFILE_PENDING_LOAD = rowName
|
||||
StaticPopup_Show("MTH_PROFILE_LOAD_CONFIRM", rowName)
|
||||
end)
|
||||
row.delBtn:SetScript("OnClick", function()
|
||||
MTH_PROFILE_PENDING_DELETE = rowName
|
||||
StaticPopup_Show("MTH_PROFILE_DELETE_CONFIRM", rowName)
|
||||
end)
|
||||
row.frame:Show()
|
||||
row.loadBtn:Show()
|
||||
row.delBtn:Show()
|
||||
else
|
||||
row.frame:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function PROF_RefreshCharList()
|
||||
PROF_EnsureCharRows()
|
||||
local chars = type(MTH_Profile_GetCharList) == "function" and MTH_Profile_GetCharList() or {}
|
||||
local n = table.getn(chars)
|
||||
|
||||
local csc = MTH_GetFrame("MetaHuntOptionsCharContent")
|
||||
if csc then
|
||||
csc:SetHeight(math.max(n * ROW_H + 4, ROW_H))
|
||||
end
|
||||
|
||||
for i = 1, MAX_CHAR_ROWS do
|
||||
local row = gCharRows[i]
|
||||
if not row then break end
|
||||
local charKey = chars[i]
|
||||
if charKey then
|
||||
local snap = type(MTH_SavedVariables) == "table"
|
||||
and type(MTH_SavedVariables.charSnapshots) == "table"
|
||||
and MTH_SavedVariables.charSnapshots[charKey]
|
||||
local info = (type(snap) == "table" and snap.savedAt) and snap.savedAt or ""
|
||||
row.nameText:SetText(charKey)
|
||||
row.infoText:SetText(info)
|
||||
local ck = charKey
|
||||
row.copyBtn:SetScript("OnClick", function()
|
||||
local ok, pName = MTH_Profile_CopyFromChar(ck)
|
||||
if ok then
|
||||
MTH_SetupProfilesOptions()
|
||||
if MTH and MTH.Print then
|
||||
MTH:Print('Imported "' .. ck .. '" as profile "' .. tostring(pName) .. '".')
|
||||
end
|
||||
end
|
||||
end)
|
||||
row.frame:Show()
|
||||
row.copyBtn:Show()
|
||||
else
|
||||
row.frame:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- ── main setup (static elements created once, dynamic lists refreshed every call) ──
|
||||
|
||||
function MTH_SetupProfilesOptions()
|
||||
local container = MTH_GetFrame("MetaHuntOptionsProfiles")
|
||||
if not container then return end
|
||||
|
||||
if not gSetupDone then
|
||||
-- Title
|
||||
local title = container:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
||||
title:SetPoint("TOPLEFT", container, "TOPLEFT", 6, -6)
|
||||
title:SetText("Profiles")
|
||||
title:SetTextColor(1.00, 0.82, 0.00)
|
||||
|
||||
-- Active profile indicator
|
||||
gActiveLabel = container:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
|
||||
gActiveLabel:SetPoint("TOPLEFT", title, "BOTTOMLEFT", 0, -4)
|
||||
gActiveLabel:SetWidth(540)
|
||||
gActiveLabel:SetJustifyH("LEFT")
|
||||
|
||||
-- ── Save As section ───────────────────────────────────────────────
|
||||
local saveHdr = container:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
||||
saveHdr:SetPoint("TOPLEFT", gActiveLabel, "BOTTOMLEFT", 0, -10)
|
||||
saveHdr:SetText("Save current settings as:")
|
||||
saveHdr:SetTextColor(0.90, 0.90, 0.90)
|
||||
|
||||
local eb = CreateFrame("EditBox", "MTH_ProfileNameInput", container, "InputBoxTemplate")
|
||||
eb:SetWidth(240)
|
||||
eb:SetHeight(20)
|
||||
eb:SetMaxLetters(50)
|
||||
eb:SetAutoFocus(false)
|
||||
eb:SetPoint("TOPLEFT", saveHdr, "BOTTOMLEFT", 2, -6)
|
||||
eb:SetScript("OnEnterPressed", function()
|
||||
PROF_DoSave(this:GetText())
|
||||
this:SetText("")
|
||||
this:ClearFocus()
|
||||
end)
|
||||
eb:SetScript("OnEscapePressed", function()
|
||||
this:SetText("")
|
||||
this:ClearFocus()
|
||||
end)
|
||||
|
||||
local saveBtn = CreateFrame("Button", "MTH_ProfileSaveBtn", container, "UIPanelButtonTemplate")
|
||||
saveBtn:SetWidth(70)
|
||||
saveBtn:SetHeight(20)
|
||||
saveBtn:SetPoint("LEFT", eb, "RIGHT", 6, 0)
|
||||
saveBtn:SetText("Save")
|
||||
saveBtn:SetScript("OnClick", function()
|
||||
local box = MTH_GetFrame("MTH_ProfileNameInput")
|
||||
if box then
|
||||
PROF_DoSave(box:GetText())
|
||||
box:SetText("")
|
||||
box:ClearFocus()
|
||||
end
|
||||
end)
|
||||
|
||||
-- ── Saved Profiles section ────────────────────────────────────────
|
||||
local profHdr = container:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
||||
profHdr:SetPoint("TOPLEFT", eb, "BOTTOMLEFT", -2, -12)
|
||||
profHdr:SetText("Saved Profiles")
|
||||
profHdr:SetTextColor(1.00, 0.82, 0.00)
|
||||
|
||||
local rule1 = container:CreateTexture(nil, "ARTWORK")
|
||||
rule1:SetPoint("TOPLEFT", profHdr, "BOTTOMLEFT", 0, -3)
|
||||
rule1:SetWidth(540)
|
||||
rule1:SetHeight(1)
|
||||
rule1:SetTexture(0.30, 0.30, 0.30, 0.80)
|
||||
|
||||
PROF_EnsureScrollFrames(container)
|
||||
|
||||
local sf = MTH_GetFrame("MetaHuntOptionsProfilesScroll")
|
||||
sf:SetPoint("TOPLEFT", rule1, "BOTTOMLEFT", 0, -4)
|
||||
sf:SetWidth(530)
|
||||
sf:SetHeight(170)
|
||||
sf:Show()
|
||||
|
||||
-- ── Copy from Character section ───────────────────────────────────
|
||||
local charHdr = container:CreateFontString(nil, "ARTWORK", "GameFontNormal")
|
||||
charHdr:SetPoint("TOPLEFT", sf, "BOTTOMLEFT", 0, -10)
|
||||
charHdr:SetText("Copy from Character")
|
||||
charHdr:SetTextColor(1.00, 0.82, 0.00)
|
||||
|
||||
local charNote = container:CreateFontString(nil, "ARTWORK", "GameFontNormalSmall")
|
||||
charNote:SetPoint("TOPLEFT", charHdr, "BOTTOMLEFT", 0, -2)
|
||||
charNote:SetWidth(540)
|
||||
charNote:SetJustifyH("LEFT")
|
||||
charNote:SetText("Snapshots are saved automatically on logout. Click Import to create a profile from one.")
|
||||
charNote:SetTextColor(0.60, 0.60, 0.60)
|
||||
|
||||
local rule2 = container:CreateTexture(nil, "ARTWORK")
|
||||
rule2:SetPoint("TOPLEFT", charNote, "BOTTOMLEFT", 0, -3)
|
||||
rule2:SetWidth(540)
|
||||
rule2:SetHeight(1)
|
||||
rule2:SetTexture(0.30, 0.30, 0.30, 0.80)
|
||||
|
||||
local csf = MTH_GetFrame("MetaHuntOptionsCharScroll")
|
||||
csf:SetPoint("TOPLEFT", rule2, "BOTTOMLEFT", 0, -4)
|
||||
csf:SetWidth(530)
|
||||
csf:SetHeight(140)
|
||||
csf:Show()
|
||||
|
||||
gSetupDone = true
|
||||
end
|
||||
|
||||
-- Refresh dynamic content every time the panel is opened
|
||||
PROF_RefreshActive()
|
||||
PROF_RefreshProfileList()
|
||||
PROF_RefreshCharList()
|
||||
end
|
||||
@@ -117,6 +117,11 @@ function MTH_SelectOptionsTab(tabKey)
|
||||
MTH_SetupGeneralOptions()
|
||||
MTH_OPTIONS_SETUP["General"] = true
|
||||
end
|
||||
elseif tabKey == "Profiles" then
|
||||
if type(MTH_SetupProfilesOptions) == "function" then
|
||||
MTH_SetupProfilesOptions()
|
||||
MTH_OPTIONS_SETUP["Profiles"] = true
|
||||
end
|
||||
elseif tabKey == "Messages" then
|
||||
if not MTH_OPTIONS_SETUP["Messages"] then
|
||||
if type(MTH_SetupMessagesOptions) == "function" then
|
||||
|
||||
@@ -27,7 +27,8 @@ MTH_OPTIONS_CONST = MTH_OPTIONS_CONST or {
|
||||
}
|
||||
|
||||
MTH_OPTIONS_TABS = MTH_OPTIONS_TABS or {
|
||||
{ key = "General", label = "General", frame = "MetaHuntOptionsGeneral" },
|
||||
{ key = "General", label = "General", frame = "MetaHuntOptionsGeneral" },
|
||||
{ key = "Profiles", label = "Profiles", frame = "MetaHuntOptionsProfiles" },
|
||||
{ key = "Messages", label = "Messages", frame = "MetaHuntOptionsMessages" },
|
||||
{ key = "Pet", label = "ZPet", frame = "MetaHuntOptionsPet" },
|
||||
{ key = "Track", label = "ZTrack", frame = "MetaHuntOptionsTrack" },
|
||||
@@ -52,7 +53,8 @@ MTH_OPTIONS_TABS = MTH_OPTIONS_TABS or {
|
||||
}
|
||||
|
||||
MTH_OPTIONS_TREE = MTH_OPTIONS_TREE or {
|
||||
{ label = "General", key = "General" },
|
||||
{ label = "General", key = "General" },
|
||||
{ label = "Profiles", key = "Profiles" },
|
||||
{ label = "Messages", key = "Messages" },
|
||||
{ label = "Auto Buy", key = "AutoBuy" },
|
||||
{ label = "Auto Quest", key = "AutoQuest" },
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
|
||||
<!-- Content Areas -->
|
||||
<Frame name="$parentGeneral" hidden="true" enableMouse="true"/>
|
||||
<Frame name="$parentProfiles" hidden="true" enableMouse="true"/>
|
||||
<Frame name="$parentMessages" hidden="true" enableMouse="true"/>
|
||||
<Frame name="$parentPet" hidden="true" enableMouse="true"/>
|
||||
<Frame name="$parentTrack" hidden="true" enableMouse="true"/>
|
||||
|
||||
+202
@@ -0,0 +1,202 @@
|
||||
------------------------------------------------------
|
||||
-- MetaHunt Profile System
|
||||
-- Captures:
|
||||
-- MTH_SavedVariables.modules (account-wide option values, e.g. feedomatic)
|
||||
-- MTH_CharSavedVariables.modules (per-char option values: ICU, Chronometer,
|
||||
-- AutoBuy, AutoQuest, SmartAmmo, tooltips...)
|
||||
-- MTH_CharSavedVariables.moduleStates (enabled/disabled per char)
|
||||
-- ZHunterMod_Saved / MTH_CharSavedVariables.modules.zhunter (zButtons layout)
|
||||
-- Auto-snapshots current character on PLAYER_LOGOUT into
|
||||
-- MTH_SavedVariables.charSnapshots["CharName-RealmName"]
|
||||
------------------------------------------------------
|
||||
|
||||
local function MTH_Profile_DeepCopy(orig)
|
||||
if type(orig) ~= "table" then return orig end
|
||||
local copy = {}
|
||||
for k, v in orig do
|
||||
copy[MTH_Profile_DeepCopy(k)] = MTH_Profile_DeepCopy(v)
|
||||
end
|
||||
return copy
|
||||
end
|
||||
|
||||
local function MTH_Profile_EnsureStore()
|
||||
if type(MTH_SavedVariables) ~= "table" then
|
||||
MTH_SavedVariables = {}
|
||||
end
|
||||
if type(MTH_SavedVariables.profiles) ~= "table" then
|
||||
MTH_SavedVariables.profiles = {}
|
||||
end
|
||||
if type(MTH_SavedVariables.charSnapshots) ~= "table" then
|
||||
MTH_SavedVariables.charSnapshots = {}
|
||||
end
|
||||
end
|
||||
|
||||
local function MTH_Profile_GetCharKey()
|
||||
local name = (type(UnitName) == "function") and UnitName("player") or "Unknown"
|
||||
local realm = (type(GetRealmName) == "function") and GetRealmName() or "Unknown"
|
||||
name = (name and name ~= "") and name or "Unknown"
|
||||
realm = (realm and realm ~= "") and realm or "Unknown"
|
||||
return name .. "-" .. realm
|
||||
end
|
||||
|
||||
local function MTH_Profile_BuildSnapshot()
|
||||
local snap = {}
|
||||
snap.savedBy = MTH_Profile_GetCharKey()
|
||||
snap.savedAt = (type(date) == "function") and date("%Y-%m-%d %H:%M") or ""
|
||||
|
||||
-- Account-wide module option values (e.g. feedomatic)
|
||||
snap.config = (type(MTH_SavedVariables) == "table"
|
||||
and type(MTH_SavedVariables.modules) == "table")
|
||||
and MTH_Profile_DeepCopy(MTH_SavedVariables.modules)
|
||||
or {}
|
||||
|
||||
-- Per-character module option values (ICU, Chronometer, AutoBuy, SmartAmmo, etc.)
|
||||
snap.charConfig = (type(MTH_CharSavedVariables) == "table"
|
||||
and type(MTH_CharSavedVariables.modules) == "table")
|
||||
and MTH_Profile_DeepCopy(MTH_CharSavedVariables.modules)
|
||||
or {}
|
||||
|
||||
-- Per-character module enabled/disabled states
|
||||
snap.moduleStates = (type(MTH_CharSavedVariables) == "table"
|
||||
and type(MTH_CharSavedVariables.moduleStates) == "table")
|
||||
and MTH_Profile_DeepCopy(MTH_CharSavedVariables.moduleStates)
|
||||
or {}
|
||||
|
||||
-- zButtons config — kept as dedicated key for clarity
|
||||
-- (also lives in charConfig.zhunter but we keep it explicit)
|
||||
local zh = nil
|
||||
if type(MTH_CharSavedVariables) == "table"
|
||||
and type(MTH_CharSavedVariables.modules) == "table"
|
||||
and type(MTH_CharSavedVariables.modules.zhunter) == "table"
|
||||
then
|
||||
zh = MTH_CharSavedVariables.modules.zhunter
|
||||
elseif type(ZHunterMod_Saved) == "table" then
|
||||
zh = ZHunterMod_Saved
|
||||
end
|
||||
snap.zhunter = zh and MTH_Profile_DeepCopy(zh) or {}
|
||||
|
||||
return snap
|
||||
end
|
||||
|
||||
-- Save current settings as a named profile
|
||||
function MTH_Profile_Save(name)
|
||||
if type(name) ~= "string" or string.len(name) == 0 then
|
||||
return false, "invalid name"
|
||||
end
|
||||
MTH_Profile_EnsureStore()
|
||||
MTH_SavedVariables.profiles[name] = MTH_Profile_BuildSnapshot()
|
||||
return true
|
||||
end
|
||||
|
||||
-- Delete a named profile
|
||||
function MTH_Profile_Delete(name)
|
||||
MTH_Profile_EnsureStore()
|
||||
if MTH_SavedVariables.profiles[name] == nil then return false end
|
||||
MTH_SavedVariables.profiles[name] = nil
|
||||
if type(MTH_CharSavedVariables) == "table"
|
||||
and MTH_CharSavedVariables.activeProfile == name
|
||||
then
|
||||
MTH_CharSavedVariables.activeProfile = nil
|
||||
end
|
||||
return true
|
||||
end
|
||||
|
||||
-- Apply a profile to SavedVariables; a /reload is required for changes to take full effect
|
||||
function MTH_Profile_Load(name)
|
||||
MTH_Profile_EnsureStore()
|
||||
local p = MTH_SavedVariables.profiles[name]
|
||||
if type(p) ~= "table" then return false, "profile not found" end
|
||||
|
||||
if type(MTH_CharSavedVariables) ~= "table" then MTH_CharSavedVariables = {} end
|
||||
if type(MTH_CharSavedVariables.modules) ~= "table" then MTH_CharSavedVariables.modules = {} end
|
||||
|
||||
-- Apply account-wide module option values (e.g. feedomatic)
|
||||
if type(p.config) == "table" then
|
||||
if type(MTH_SavedVariables.modules) ~= "table" then
|
||||
MTH_SavedVariables.modules = {}
|
||||
end
|
||||
for modName, modData in p.config do
|
||||
MTH_SavedVariables.modules[modName] = MTH_Profile_DeepCopy(modData)
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply per-character module option values (ICU, Chronometer, AutoBuy, SmartAmmo, etc.)
|
||||
if type(p.charConfig) == "table" then
|
||||
for modName, modData in p.charConfig do
|
||||
MTH_CharSavedVariables.modules[modName] = MTH_Profile_DeepCopy(modData)
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply module enabled/disabled
|
||||
if type(p.moduleStates) == "table" then
|
||||
if type(MTH_CharSavedVariables.moduleStates) ~= "table" then
|
||||
MTH_CharSavedVariables.moduleStates = {}
|
||||
end
|
||||
for k, v in p.moduleStates do
|
||||
MTH_CharSavedVariables.moduleStates[k] = v
|
||||
end
|
||||
end
|
||||
|
||||
-- Apply zButtons (also written into charConfig.zhunter above, but keep explicit)
|
||||
if type(p.zhunter) == "table" then
|
||||
ZHunterMod_Saved = MTH_Profile_DeepCopy(p.zhunter)
|
||||
MTH_CharSavedVariables.modules.zhunter = ZHunterMod_Saved
|
||||
end
|
||||
|
||||
MTH_CharSavedVariables.activeProfile = name
|
||||
return true
|
||||
end
|
||||
|
||||
-- Create a named profile from another character's auto-snapshot
|
||||
-- profileName defaults to charKey if not provided
|
||||
function MTH_Profile_CopyFromChar(charKey, profileName)
|
||||
MTH_Profile_EnsureStore()
|
||||
local snap = MTH_SavedVariables.charSnapshots[charKey]
|
||||
if type(snap) ~= "table" then
|
||||
return false, "no snapshot for " .. tostring(charKey)
|
||||
end
|
||||
local name = (type(profileName) == "string" and string.len(profileName) > 0)
|
||||
and profileName or charKey
|
||||
MTH_SavedVariables.profiles[name] = MTH_Profile_DeepCopy(snap)
|
||||
return true, name
|
||||
end
|
||||
|
||||
-- Return sorted list of profile names
|
||||
function MTH_Profile_GetList()
|
||||
MTH_Profile_EnsureStore()
|
||||
local list = {}
|
||||
for name, _ in MTH_SavedVariables.profiles do
|
||||
table.insert(list, name)
|
||||
end
|
||||
table.sort(list)
|
||||
return list
|
||||
end
|
||||
|
||||
-- Return sorted list of character snapshot keys
|
||||
function MTH_Profile_GetCharList()
|
||||
MTH_Profile_EnsureStore()
|
||||
local list = {}
|
||||
for charKey, _ in MTH_SavedVariables.charSnapshots do
|
||||
table.insert(list, charKey)
|
||||
end
|
||||
table.sort(list)
|
||||
return list
|
||||
end
|
||||
|
||||
-- Return the active profile name for the current character, or nil
|
||||
function MTH_Profile_GetActive()
|
||||
if type(MTH_CharSavedVariables) == "table" then
|
||||
return MTH_CharSavedVariables.activeProfile
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Auto-snapshot on logout so other characters can import this config
|
||||
local MTH_ProfileEventFrame = CreateFrame("Frame", "MTH_ProfileEventFrame")
|
||||
MTH_ProfileEventFrame:RegisterEvent("PLAYER_LOGOUT")
|
||||
MTH_ProfileEventFrame:SetScript("OnEvent", function()
|
||||
if event == "PLAYER_LOGOUT" then
|
||||
MTH_Profile_EnsureStore()
|
||||
MTH_SavedVariables.charSnapshots[MTH_Profile_GetCharKey()] = MTH_Profile_BuildSnapshot()
|
||||
end
|
||||
end)
|
||||
+153
-91
@@ -19,6 +19,8 @@ if not MTH_DS_Beasts[521] then
|
||||
{32.6, 25.8, 10},
|
||||
{64.3, 24, 10},
|
||||
},
|
||||
["displayId"] = 11412,
|
||||
["skinId"] = 720,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -37,6 +39,8 @@ if not MTH_DS_Beasts[728] then
|
||||
["coords"] = {
|
||||
{49.6, 24, 33},
|
||||
},
|
||||
["displayId"] = 613,
|
||||
["skinId"] = 599,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -54,6 +58,8 @@ if not MTH_DS_Beasts[729] then
|
||||
["coords"] = {
|
||||
{32.2, 17.4, 33},
|
||||
},
|
||||
["displayId"] = 471,
|
||||
["skinId"] = 320,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -85,6 +91,8 @@ if not MTH_DS_Beasts[1199] then
|
||||
{42.4, 57.9, 1},
|
||||
{43, 56.5, 1},
|
||||
},
|
||||
["displayId"] = 748,
|
||||
["skinId"] = 748,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -104,6 +112,8 @@ if not MTH_DS_Beasts[1225] then
|
||||
{42.5, 64.7, 38},
|
||||
{20.3, 77.4, 5602},
|
||||
},
|
||||
["displayId"] = 706,
|
||||
["skinId"] = 706,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -119,6 +129,8 @@ if not MTH_DS_Beasts[1516] then
|
||||
["coords"] = {
|
||||
{36.3, 63.9, 33},
|
||||
},
|
||||
["displayId"] = 839,
|
||||
["skinId"] = 809,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -133,6 +145,8 @@ if not MTH_DS_Beasts[2275] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 11411,
|
||||
["skinId"] = 246,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -247,6 +261,8 @@ if not MTH_DS_Beasts[2321] then
|
||||
{45.9, 22.2, 148},
|
||||
{29.5, 31.1, 361},
|
||||
},
|
||||
["displayId"] = 1042,
|
||||
["skinId"] = 178,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -327,6 +343,8 @@ if not MTH_DS_Beasts[2560] then
|
||||
{37.1, 29.9, 45},
|
||||
{39.9, 29.9, 45},
|
||||
},
|
||||
["displayId"] = 180,
|
||||
["skinId"] = 180,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -457,6 +475,8 @@ if not MTH_DS_Beasts[2563] then
|
||||
{80.7, 83.8, 267},
|
||||
{79.9, 81, 267},
|
||||
},
|
||||
["displayId"] = 1103,
|
||||
["skinId"] = 1091,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -491,6 +511,8 @@ if not MTH_DS_Beasts[2578] then
|
||||
{26.7, 24.8, 45},
|
||||
{29.1, 19.8, 45},
|
||||
},
|
||||
["displayId"] = 10824,
|
||||
["skinId"] = 388,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -510,6 +532,8 @@ if not MTH_DS_Beasts[2931] then
|
||||
["coords"] = {
|
||||
{56.1, 61.7, 3},
|
||||
},
|
||||
["displayId"] = 1210,
|
||||
["skinId"] = 490,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -525,6 +549,8 @@ if not MTH_DS_Beasts[3257] then
|
||||
["coords"] = {
|
||||
{59.7, 30.3, 17},
|
||||
},
|
||||
["displayId"] = 2571,
|
||||
["skinId"] = 1959,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -540,6 +566,8 @@ if not MTH_DS_Beasts[3475] then
|
||||
["coords"] = {
|
||||
{56.1, 17.4, 17},
|
||||
},
|
||||
["displayId"] = 1934,
|
||||
["skinId"] = 1934,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -558,6 +586,8 @@ if not MTH_DS_Beasts[3503] then
|
||||
["coords"] = {
|
||||
{45.5, 72.5, 17},
|
||||
},
|
||||
["displayId"] = 1307,
|
||||
["skinId"] = 1307,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -572,6 +602,8 @@ if not MTH_DS_Beasts[3619] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 4472,
|
||||
["skinId"] = 748,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -631,6 +663,8 @@ if not MTH_DS_Beasts[3812] then
|
||||
{9.5, 13.7, 331},
|
||||
{6.7, 13, 331},
|
||||
},
|
||||
["displayId"] = 9566,
|
||||
["skinId"] = 979,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -662,6 +696,8 @@ if not MTH_DS_Beasts[4118] then
|
||||
{26.4, 25.6, 400},
|
||||
{22.7, 23.7, 400},
|
||||
},
|
||||
["displayId"] = 10991,
|
||||
["skinId"] = 2700,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -679,6 +715,8 @@ if not MTH_DS_Beasts[4250] then
|
||||
["coords"] = {
|
||||
{25.1, 37.2, 400},
|
||||
},
|
||||
["displayId"] = 2726,
|
||||
["skinId"] = 2726,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -698,6 +736,8 @@ if not MTH_DS_Beasts[4425] then
|
||||
["coords"] = {
|
||||
{11, 30.3, 491},
|
||||
},
|
||||
["displayId"] = 4735,
|
||||
["skinId"] = 4735,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -730,6 +770,8 @@ if not MTH_DS_Beasts[4511] then
|
||||
{50.6, 37.4, 491},
|
||||
{48.5, 37.2, 491},
|
||||
},
|
||||
["displayId"] = 4713,
|
||||
["skinId"] = 4713,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -750,6 +792,8 @@ if not MTH_DS_Beasts[4512] then
|
||||
{54.1, 57.3, 491},
|
||||
{48.5, 57.1, 491},
|
||||
},
|
||||
["displayId"] = 4714,
|
||||
["skinId"] = 4714,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -782,6 +826,8 @@ if not MTH_DS_Beasts[4514] then
|
||||
{52.3, 40.7, 491},
|
||||
{45.7, 40.1, 491},
|
||||
},
|
||||
["displayId"] = 2453,
|
||||
["skinId"] = 2450,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -796,6 +842,8 @@ if not MTH_DS_Beasts[4660] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 2710,
|
||||
["skinId"] = 2710,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -862,6 +910,8 @@ if not MTH_DS_Beasts[4693] then
|
||||
{73.8, 11.2, 405},
|
||||
{50.4, 82.9, 406},
|
||||
},
|
||||
["displayId"] = 10273,
|
||||
["skinId"] = 507,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -885,6 +935,8 @@ if not MTH_DS_Beasts[4824] then
|
||||
{20.6, 38.3, 719},
|
||||
{23, 38, 719},
|
||||
},
|
||||
["displayId"] = 1244,
|
||||
["skinId"] = 1244,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -909,6 +961,8 @@ if not MTH_DS_Beasts[4825] then
|
||||
{60.3, 85.5, 719},
|
||||
{57.3, 85.3, 719},
|
||||
},
|
||||
["displayId"] = 5026,
|
||||
["skinId"] = 5026,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -930,6 +984,8 @@ if not MTH_DS_Beasts[5224] then
|
||||
{73.8, 42.6, 8},
|
||||
{72, 41.9, 8},
|
||||
},
|
||||
["displayId"] = 4767,
|
||||
["skinId"] = 4317,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -972,6 +1028,8 @@ if not MTH_DS_Beasts[5260] then
|
||||
{68.3, 52.1, 357},
|
||||
{74.7, 51.4, 357},
|
||||
},
|
||||
["displayId"] = 3186,
|
||||
["skinId"] = 3186,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -989,6 +1047,8 @@ if not MTH_DS_Beasts[5432] then
|
||||
["coords"] = {
|
||||
{60.2, 81.6, 440},
|
||||
},
|
||||
["displayId"] = 5127,
|
||||
["skinId"] = 5126,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1008,6 +1068,8 @@ if not MTH_DS_Beasts[5842] then
|
||||
["coords"] = {
|
||||
{59.6, 8.3, 17},
|
||||
},
|
||||
["displayId"] = 1337,
|
||||
["skinId"] = 1337,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1032,6 +1094,8 @@ if not MTH_DS_Beasts[5984] then
|
||||
{48.3, 17.8, 4},
|
||||
{56, 17.6, 4},
|
||||
},
|
||||
["displayId"] = 8050,
|
||||
["skinId"] = 2714,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1074,6 +1138,8 @@ if not MTH_DS_Beasts[6513] then
|
||||
{67.7, 13.8, 490},
|
||||
{68.3, 13.1, 490},
|
||||
},
|
||||
["displayId"] = 5294,
|
||||
["skinId"] = 792,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1116,6 +1182,8 @@ if not MTH_DS_Beasts[6514] then
|
||||
{67.7, 13.8, 490},
|
||||
{68.3, 13.1, 490},
|
||||
},
|
||||
["displayId"] = 844,
|
||||
["skinId"] = 792,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1152,6 +1220,8 @@ if not MTH_DS_Beasts[6516] then
|
||||
{67.7, 13.8, 490},
|
||||
{68.3, 13.1, 490},
|
||||
},
|
||||
["displayId"] = 5244,
|
||||
["skinId"] = 792,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1170,6 +1240,8 @@ if not MTH_DS_Beasts[6585] then
|
||||
["coords"] = {
|
||||
{68.5, 12.7, 490},
|
||||
},
|
||||
["displayId"] = 8129,
|
||||
["skinId"] = 840,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1230,6 +1302,8 @@ if not MTH_DS_Beasts[7455] then
|
||||
{63.3, 27.2, 618},
|
||||
{65.5, 27, 618},
|
||||
},
|
||||
["displayId"] = 6212,
|
||||
["skinId"] = 6212,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1244,6 +1318,8 @@ if not MTH_DS_Beasts[7803] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 2414,
|
||||
["skinId"] = 2414,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1262,6 +1338,8 @@ if not MTH_DS_Beasts[8277] then
|
||||
["coords"] = {
|
||||
{61.9, 73.2, 51},
|
||||
},
|
||||
["displayId"] = 4458,
|
||||
["skinId"] = 4457,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1275,6 +1353,8 @@ if not MTH_DS_Beasts[8926] then
|
||||
["attackSpeed"] = "2.0",
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 7347,
|
||||
["skinId"] = 2489,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1288,6 +1368,8 @@ if not MTH_DS_Beasts[8927] then
|
||||
["attackSpeed"] = "2.0",
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 1955,
|
||||
["skinId"] = 1954,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1305,6 +1387,8 @@ if not MTH_DS_Beasts[9622] then
|
||||
["coords"] = {
|
||||
{68.1, 12.6, 490},
|
||||
},
|
||||
["displayId"] = 8844,
|
||||
["skinId"] = 3186,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1322,6 +1406,8 @@ if not MTH_DS_Beasts[9683] then
|
||||
["coords"] = {
|
||||
{66.3, 63.9, 490},
|
||||
},
|
||||
["displayId"] = 5242,
|
||||
["skinId"] = 960,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1337,6 +1423,8 @@ if not MTH_DS_Beasts[9684] then
|
||||
{31.7, 28.7, 440},
|
||||
{79.4, 49.9, 490},
|
||||
},
|
||||
["displayId"] = 11318,
|
||||
["skinId"] = 675,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1355,6 +1443,8 @@ if not MTH_DS_Beasts[10200] then
|
||||
["coords"] = {
|
||||
{51.1, 10.7, 618},
|
||||
},
|
||||
["displayId"] = 10054,
|
||||
["skinId"] = 10054,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1373,6 +1463,8 @@ if not MTH_DS_Beasts[10356] then
|
||||
["coords"] = {
|
||||
{45.6, 47.5, 85},
|
||||
},
|
||||
["displayId"] = 7892,
|
||||
["skinId"] = 7890,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1391,6 +1483,8 @@ if not MTH_DS_Beasts[10359] then
|
||||
["coords"] = {
|
||||
{88.2, 51.4, 85},
|
||||
},
|
||||
["displayId"] = 418,
|
||||
["skinId"] = 30,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1406,6 +1500,8 @@ if not MTH_DS_Beasts[10741] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 10114,
|
||||
["skinId"] = 1934,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1421,6 +1517,8 @@ if not MTH_DS_Beasts[10882] then
|
||||
["unique"] = true,
|
||||
["coords"] = {
|
||||
},
|
||||
["displayId"] = 10183,
|
||||
["skinId"] = 2699,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1456,6 +1554,8 @@ if not MTH_DS_Beasts[10981] then
|
||||
{45.2, 53.5, 2597},
|
||||
{44.9, 51.9, 2597},
|
||||
},
|
||||
["displayId"] = 10278,
|
||||
["skinId"] = 720,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1474,6 +1574,8 @@ if not MTH_DS_Beasts[12037] then
|
||||
["coords"] = {
|
||||
{83.4, 48.5, 331},
|
||||
},
|
||||
["displayId"] = 706,
|
||||
["skinId"] = 706,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1497,6 +1599,8 @@ if not MTH_DS_Beasts[14222] then
|
||||
{36, 23.7, 267},
|
||||
{35.3, 11.5, 267},
|
||||
},
|
||||
["displayId"] = 1933,
|
||||
["skinId"] = 1933,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1521,6 +1625,8 @@ if not MTH_DS_Beasts[14223] then
|
||||
{77.5, 38, 130},
|
||||
{82, 33.4, 130},
|
||||
},
|
||||
["displayId"] = 5026,
|
||||
["skinId"] = 5026,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1539,6 +1645,8 @@ if not MTH_DS_Beasts[14234] then
|
||||
["coords"] = {
|
||||
{52, 62.9, 15},
|
||||
},
|
||||
["displayId"] = 2703,
|
||||
["skinId"] = 2703,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1552,48 +1660,8 @@ if not MTH_DS_Beasts[15041] then
|
||||
["attackSpeed"] = "1.4",
|
||||
["coords"] = {
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[36507] then
|
||||
MTH_DS_Beasts[36507] = {
|
||||
["name"] = "Spot",
|
||||
["family"] = "Wolves",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "Dash 1",
|
||||
["attackSpeed"] = "2.0",
|
||||
["coords"] = {
|
||||
{68, 46.8, 15},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[36514] then
|
||||
MTH_DS_Beasts[36514] = {
|
||||
["name"] = "Frostsaber Cub",
|
||||
["family"] = "Cats",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "Cower 6",
|
||||
["attackSpeed"] = "1.5",
|
||||
["coords"] = {
|
||||
{48.9, 19, 618},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[37007] then
|
||||
MTH_DS_Beasts[37007] = {
|
||||
["name"] = "Black Widow Hatchling",
|
||||
["family"] = "Spiders",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "None",
|
||||
["attackSpeed"] = "2.0",
|
||||
["coords"] = {
|
||||
{80.7, 62.8, 10},
|
||||
},
|
||||
["displayId"] = 15136,
|
||||
["skinId"] = 711,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1608,6 +1676,8 @@ if not MTH_DS_Beasts[50624] then
|
||||
["coords"] = {
|
||||
{26.5, 30.9, 15},
|
||||
},
|
||||
["displayId"] = 11107,
|
||||
["skinId"] = 11107,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1622,6 +1692,8 @@ if not MTH_DS_Beasts[50627] then
|
||||
["coords"] = {
|
||||
{26.5, 30.9, 15},
|
||||
},
|
||||
["displayId"] = 11107,
|
||||
["skinId"] = 11107,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1636,6 +1708,8 @@ if not MTH_DS_Beasts[50630] then
|
||||
["coords"] = {
|
||||
{26.5, 30.9, 15},
|
||||
},
|
||||
["displayId"] = 11107,
|
||||
["skinId"] = 11107,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1658,6 +1732,8 @@ if not MTH_DS_Beasts[60697] then
|
||||
{93.7, 57.2, 46},
|
||||
{97.1, 51.2, 46},
|
||||
},
|
||||
["displayId"] = 8050,
|
||||
["skinId"] = 2714,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1692,6 +1768,8 @@ if not MTH_DS_Beasts[61096] then
|
||||
{47.3, 18.8, 5121},
|
||||
{49.4, 18.2, 5121},
|
||||
},
|
||||
["displayId"] = 10991,
|
||||
["skinId"] = 2700,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1710,6 +1788,8 @@ if not MTH_DS_Beasts[61500] then
|
||||
["coords"] = {
|
||||
{56.7, 48.3, 5121},
|
||||
},
|
||||
["displayId"] = 837,
|
||||
["skinId"] = 792,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1728,6 +1808,8 @@ if not MTH_DS_Beasts[61552] then
|
||||
["coords"] = {
|
||||
{45.6, 78, 5179},
|
||||
},
|
||||
["displayId"] = 18247,
|
||||
["skinId"] = 18247,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1747,6 +1829,8 @@ if not MTH_DS_Beasts[61554] then
|
||||
{47.4, 92.2, 130},
|
||||
{48.9, 22.7, 5179},
|
||||
},
|
||||
["displayId"] = 9568,
|
||||
["skinId"] = 9568,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1765,6 +1849,8 @@ if not MTH_DS_Beasts[61699] then
|
||||
{20.6, 8.9, 139},
|
||||
{64.2, 67, 5225},
|
||||
},
|
||||
["displayId"] = 18430,
|
||||
["skinId"] = 18430,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1794,13 +1880,15 @@ if not MTH_DS_Beasts[61975] then
|
||||
{20.1, 52.3, 45},
|
||||
{20.8, 52.2, 45},
|
||||
},
|
||||
["displayId"] = 20504,
|
||||
["skinId"] = 20504,
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[62066] then
|
||||
MTH_DS_Beasts[62066] = {
|
||||
["name"] = "Cavernweb Broodmother",
|
||||
["family"] = "Spider",
|
||||
["family"] = "Spiders",
|
||||
["lvl"] = "27",
|
||||
["fac"] = "Unknown",
|
||||
["abilities"] = "None",
|
||||
@@ -1811,13 +1899,15 @@ if not MTH_DS_Beasts[62066] then
|
||||
["coords"] = {
|
||||
{33.6, 44.3, 5601},
|
||||
},
|
||||
["displayId"] = 959,
|
||||
["skinId"] = 955,
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[62073] then
|
||||
MTH_DS_Beasts[62073] = {
|
||||
["name"] = "Cavernweb Spider",
|
||||
["family"] = "Spider",
|
||||
["family"] = "Spiders",
|
||||
["lvl"] = "26-27",
|
||||
["fac"] = "Unknown",
|
||||
["abilities"] = "None",
|
||||
@@ -1835,13 +1925,15 @@ if not MTH_DS_Beasts[62073] then
|
||||
{31.9, 50.2, 5601},
|
||||
{35.3, 47.3, 5601},
|
||||
},
|
||||
["displayId"] = 959,
|
||||
["skinId"] = 955,
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[62074] then
|
||||
MTH_DS_Beasts[62074] = {
|
||||
["name"] = "Cavernweb Creeper",
|
||||
["family"] = "Spider",
|
||||
["family"] = "Spiders",
|
||||
["lvl"] = "26-27",
|
||||
["fac"] = "Unknown",
|
||||
["abilities"] = "Web",
|
||||
@@ -1857,13 +1949,15 @@ if not MTH_DS_Beasts[62074] then
|
||||
{30.3, 48.6, 5601},
|
||||
{33.2, 47, 5601},
|
||||
},
|
||||
["displayId"] = 959,
|
||||
["skinId"] = 955,
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[62075] then
|
||||
MTH_DS_Beasts[62075] = {
|
||||
["name"] = "Cavernweb Venomspitter",
|
||||
["family"] = "Spider",
|
||||
["family"] = "Spiders",
|
||||
["lvl"] = "27-28",
|
||||
["fac"] = "Unknown",
|
||||
["abilities"] = "None",
|
||||
@@ -1876,6 +1970,8 @@ if not MTH_DS_Beasts[62075] then
|
||||
{30.3, 50.6, 5601},
|
||||
{36.3, 48.3, 5601},
|
||||
},
|
||||
["displayId"] = 711,
|
||||
["skinId"] = 711,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1937,6 +2033,8 @@ if not MTH_DS_Beasts[62345] then
|
||||
{40.9, 22.5, 5561},
|
||||
{41.5, 21.8, 5561},
|
||||
},
|
||||
["displayId"] = 833,
|
||||
["skinId"] = 833,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -1951,6 +2049,8 @@ if not MTH_DS_Beasts[80250] then
|
||||
["coords"] = {
|
||||
{9.7, 16.2, 139},
|
||||
},
|
||||
["displayId"] = 18027,
|
||||
["skinId"] = 18027,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -2009,6 +2109,8 @@ if not MTH_DS_Beasts[80257] then
|
||||
{15.2, 59.1, 5602},
|
||||
{16.7, 58.6, 5602},
|
||||
},
|
||||
["displayId"] = 18008,
|
||||
["skinId"] = 18008,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -2028,6 +2130,8 @@ if not MTH_DS_Beasts[80259] then
|
||||
{50, 77.8, 41},
|
||||
{52.4, 36.6, 41},
|
||||
},
|
||||
["displayId"] = 18004,
|
||||
["skinId"] = 18004,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -2046,50 +2150,8 @@ if not MTH_DS_Beasts[80260] then
|
||||
["coords"] = {
|
||||
{63.6, 15.8, 618},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[80920] then
|
||||
MTH_DS_Beasts[80920] = {
|
||||
["name"] = "Amani Eagle",
|
||||
["family"] = "Owls",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "Screech 1, Claw 2",
|
||||
["attackSpeed"] = "2.0",
|
||||
["coords"] = {
|
||||
{36.4, 18.3, 406},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[90980] then
|
||||
MTH_DS_Beasts[90980] = {
|
||||
["name"] = "Zulian Panther",
|
||||
["family"] = "Cats",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "Dash 3",
|
||||
["attackSpeed"] = "2.0",
|
||||
["elite"] = true,
|
||||
["coords"] = {
|
||||
{50.3, 28.9, 1977},
|
||||
},
|
||||
}
|
||||
end
|
||||
|
||||
if not MTH_DS_Beasts[90981] then
|
||||
MTH_DS_Beasts[90981] = {
|
||||
["name"] = "Zulian Panther",
|
||||
["family"] = "Cats",
|
||||
["lvl"] = "1",
|
||||
["fac"] = "AH",
|
||||
["abilities"] = "Dash 3",
|
||||
["attackSpeed"] = "2.0",
|
||||
["elite"] = true,
|
||||
["coords"] = {
|
||||
{50.3, 28.9, 1977},
|
||||
},
|
||||
["displayId"] = 18244,
|
||||
["skinId"] = 18244,
|
||||
}
|
||||
end
|
||||
|
||||
@@ -2097,5 +2159,5 @@ MTH_DS_BeastsExtraMeta = {
|
||||
generated = "2026-02-15",
|
||||
baseBeasts = 627,
|
||||
knownBeastNames = 710,
|
||||
addedIDs = 80,
|
||||
addedIDs = 74,
|
||||
}
|
||||
|
||||
@@ -0,0 +1,329 @@
|
||||
-- MetaHunt: Beast family DBC enrichment (scales, food validation)
|
||||
-- AUTO-GENERATED by .tools — do not edit by hand.
|
||||
-- Source DBC(s): CreatureFamily.dbc, ItemPetFood.dbc
|
||||
-- Generated: 2026-03-17 08:39 UTC
|
||||
|
||||
if not MTH_DS_Families then return end
|
||||
|
||||
-- DBC ID=1 PetFoodMask=208 scale=[0.70-1.00]
|
||||
if MTH_DS_Families["Wolves"] then
|
||||
MTH_DS_Families["Wolves"]["dbcId"] = 1
|
||||
MTH_DS_Families["Wolves"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Wolves"]["maxScale"] = 1.0
|
||||
MTH_DS_Families["Wolves"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Wolves"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Wolves"]["foodMask"] = 208
|
||||
MTH_DS_Families["Wolves"]["foodDbc"] = {
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=2 PetFoodMask=209 scale=[0.70-1.10]
|
||||
if MTH_DS_Families["Cats"] then
|
||||
MTH_DS_Families["Cats"]["dbcId"] = 2
|
||||
MTH_DS_Families["Cats"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Cats"]["maxScale"] = 1.1
|
||||
MTH_DS_Families["Cats"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Cats"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Cats"]["foodMask"] = 209
|
||||
MTH_DS_Families["Cats"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=3 PetFoodMask=203 scale=[0.40-0.60]
|
||||
if MTH_DS_Families["Spiders"] then
|
||||
MTH_DS_Families["Spiders"]["dbcId"] = 3
|
||||
MTH_DS_Families["Spiders"]["minScale"] = 0.4
|
||||
MTH_DS_Families["Spiders"]["maxScale"] = 0.6
|
||||
MTH_DS_Families["Spiders"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Spiders"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Spiders"]["foodMask"] = 203
|
||||
MTH_DS_Families["Spiders"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"bread",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=4 PetFoodMask=210 scale=[0.60-1.00]
|
||||
if MTH_DS_Families["Bears"] then
|
||||
MTH_DS_Families["Bears"]["dbcId"] = 4
|
||||
MTH_DS_Families["Bears"]["minScale"] = 0.6
|
||||
MTH_DS_Families["Bears"]["maxScale"] = 1.0
|
||||
MTH_DS_Families["Bears"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Bears"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Bears"]["foodMask"] = 210
|
||||
MTH_DS_Families["Bears"]["foodDbc"] = {
|
||||
"bread",
|
||||
"cheese",
|
||||
"fish",
|
||||
"fruit",
|
||||
"fungus",
|
||||
"meat",
|
||||
"raw fish",
|
||||
"raw meat",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=5 PetFoodMask=211 scale=[0.60-1.00]
|
||||
if MTH_DS_Families["Boars"] then
|
||||
MTH_DS_Families["Boars"]["dbcId"] = 5
|
||||
MTH_DS_Families["Boars"]["minScale"] = 0.6
|
||||
MTH_DS_Families["Boars"]["maxScale"] = 1.0
|
||||
MTH_DS_Families["Boars"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Boars"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Boars"]["foodMask"] = 211
|
||||
MTH_DS_Families["Boars"]["foodDbc"] = {
|
||||
"bread",
|
||||
"cheese",
|
||||
"fish",
|
||||
"fruit",
|
||||
"fungus",
|
||||
"meat",
|
||||
"raw fish",
|
||||
"raw meat",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=6 PetFoodMask=212 scale=[0.40-0.60]
|
||||
if MTH_DS_Families["Crocolisks"] then
|
||||
MTH_DS_Families["Crocolisks"]["dbcId"] = 6
|
||||
MTH_DS_Families["Crocolisks"]["minScale"] = 0.4
|
||||
MTH_DS_Families["Crocolisks"]["maxScale"] = 0.6
|
||||
MTH_DS_Families["Crocolisks"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Crocolisks"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Crocolisks"]["foodMask"] = 212
|
||||
MTH_DS_Families["Crocolisks"]["foodDbc"] = {
|
||||
"cheese",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=7 PetFoodMask=213 scale=[0.50-0.90]
|
||||
if MTH_DS_Families["Carrion Birds"] then
|
||||
MTH_DS_Families["Carrion Birds"]["dbcId"] = 7
|
||||
MTH_DS_Families["Carrion Birds"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Carrion Birds"]["maxScale"] = 0.9
|
||||
MTH_DS_Families["Carrion Birds"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Carrion Birds"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Carrion Birds"]["foodMask"] = 213
|
||||
MTH_DS_Families["Carrion Birds"]["foodDbc"] = {
|
||||
"meat",
|
||||
"cheese",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=8 PetFoodMask=214 scale=[0.70-1.40]
|
||||
if MTH_DS_Families["Crabs"] then
|
||||
MTH_DS_Families["Crabs"]["dbcId"] = 8
|
||||
MTH_DS_Families["Crabs"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Crabs"]["maxScale"] = 1.4
|
||||
MTH_DS_Families["Crabs"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Crabs"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Crabs"]["foodMask"] = 214
|
||||
MTH_DS_Families["Crabs"]["foodDbc"] = {
|
||||
"fish",
|
||||
"cheese",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=9 PetFoodMask=215 scale=[0.70-1.00]
|
||||
if MTH_DS_Families["Gorillas"] then
|
||||
MTH_DS_Families["Gorillas"]["dbcId"] = 9
|
||||
MTH_DS_Families["Gorillas"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Gorillas"]["maxScale"] = 1.0
|
||||
MTH_DS_Families["Gorillas"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Gorillas"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Gorillas"]["foodMask"] = 215
|
||||
MTH_DS_Families["Gorillas"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"cheese",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=11 PetFoodMask=217 scale=[0.50-0.80]
|
||||
if MTH_DS_Families["Raptors"] then
|
||||
MTH_DS_Families["Raptors"]["dbcId"] = 11
|
||||
MTH_DS_Families["Raptors"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Raptors"]["maxScale"] = 0.8
|
||||
MTH_DS_Families["Raptors"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Raptors"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Raptors"]["foodMask"] = 217
|
||||
MTH_DS_Families["Raptors"]["foodDbc"] = {
|
||||
"meat",
|
||||
"bread",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=12 PetFoodMask=218 scale=[0.50-0.80]
|
||||
if MTH_DS_Families["Tallstriders"] then
|
||||
MTH_DS_Families["Tallstriders"]["dbcId"] = 12
|
||||
MTH_DS_Families["Tallstriders"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Tallstriders"]["maxScale"] = 0.8
|
||||
MTH_DS_Families["Tallstriders"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Tallstriders"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Tallstriders"]["foodMask"] = 218
|
||||
MTH_DS_Families["Tallstriders"]["foodDbc"] = {
|
||||
"fish",
|
||||
"bread",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=20 PetFoodMask=236 scale=[0.70-1.00]
|
||||
if MTH_DS_Families["Scorpids"] then
|
||||
MTH_DS_Families["Scorpids"]["dbcId"] = 20
|
||||
MTH_DS_Families["Scorpids"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Scorpids"]["maxScale"] = 1.0
|
||||
MTH_DS_Families["Scorpids"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Scorpids"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Scorpids"]["foodMask"] = 236
|
||||
MTH_DS_Families["Scorpids"]["foodDbc"] = {
|
||||
"cheese",
|
||||
"bread",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=21 PetFoodMask=251 scale=[0.50-0.80]
|
||||
if MTH_DS_Families["Turtles"] then
|
||||
MTH_DS_Families["Turtles"]["dbcId"] = 21
|
||||
MTH_DS_Families["Turtles"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Turtles"]["maxScale"] = 0.8
|
||||
MTH_DS_Families["Turtles"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Turtles"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Turtles"]["foodMask"] = 251
|
||||
MTH_DS_Families["Turtles"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"bread",
|
||||
"fungus",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=24 PetFoodMask=653 scale=[0.40-0.70]
|
||||
if MTH_DS_Families["Bats"] then
|
||||
MTH_DS_Families["Bats"]["dbcId"] = 24
|
||||
MTH_DS_Families["Bats"]["minScale"] = 0.4
|
||||
MTH_DS_Families["Bats"]["maxScale"] = 0.7
|
||||
MTH_DS_Families["Bats"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Bats"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Bats"]["foodMask"] = 653
|
||||
MTH_DS_Families["Bats"]["foodDbc"] = {
|
||||
"meat",
|
||||
"cheese",
|
||||
"bread",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=25 PetFoodMask=654 scale=[0.70-0.90]
|
||||
if MTH_DS_Families["Hyenas"] then
|
||||
MTH_DS_Families["Hyenas"]["dbcId"] = 25
|
||||
MTH_DS_Families["Hyenas"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Hyenas"]["maxScale"] = 0.9
|
||||
MTH_DS_Families["Hyenas"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Hyenas"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Hyenas"]["foodMask"] = 654
|
||||
MTH_DS_Families["Hyenas"]["foodDbc"] = {
|
||||
"fish",
|
||||
"cheese",
|
||||
"bread",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=26 PetFoodMask=655 scale=[0.50-0.80]
|
||||
if MTH_DS_Families["Owls"] then
|
||||
MTH_DS_Families["Owls"]["dbcId"] = 26
|
||||
MTH_DS_Families["Owls"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Owls"]["maxScale"] = 0.8
|
||||
MTH_DS_Families["Owls"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Owls"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Owls"]["foodMask"] = 655
|
||||
MTH_DS_Families["Owls"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"cheese",
|
||||
"bread",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=27 PetFoodMask=656 scale=[0.50-0.70]
|
||||
if MTH_DS_Families["Wind Serpents"] then
|
||||
MTH_DS_Families["Wind Serpents"]["dbcId"] = 27
|
||||
MTH_DS_Families["Wind Serpents"]["minScale"] = 0.5
|
||||
MTH_DS_Families["Wind Serpents"]["maxScale"] = 0.7
|
||||
MTH_DS_Families["Wind Serpents"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Wind Serpents"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Wind Serpents"]["foodMask"] = 656
|
||||
MTH_DS_Families["Wind Serpents"]["foodDbc"] = {
|
||||
"fungus",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=35 PetFoodMask=1009 scale=[0.60-0.80]
|
||||
if MTH_DS_Families["Serpents (Cobra)"] then
|
||||
MTH_DS_Families["Serpents (Cobra)"]["dbcId"] = 35
|
||||
MTH_DS_Families["Serpents (Cobra)"]["minScale"] = 0.6
|
||||
MTH_DS_Families["Serpents (Cobra)"]["maxScale"] = 0.8
|
||||
MTH_DS_Families["Serpents (Cobra)"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Serpents (Cobra)"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Serpents (Cobra)"]["foodMask"] = 1009
|
||||
MTH_DS_Families["Serpents (Cobra)"]["foodDbc"] = {
|
||||
"meat",
|
||||
"fungus",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
|
||||
-- DBC ID=36 PetFoodMask=1010 scale=[0.70-0.90]
|
||||
if MTH_DS_Families["Foxes"] then
|
||||
MTH_DS_Families["Foxes"]["dbcId"] = 36
|
||||
MTH_DS_Families["Foxes"]["minScale"] = 0.7
|
||||
MTH_DS_Families["Foxes"]["maxScale"] = 0.9
|
||||
MTH_DS_Families["Foxes"]["minScaleLevel"] = 1
|
||||
MTH_DS_Families["Foxes"]["maxScaleLevel"] = 60
|
||||
MTH_DS_Families["Foxes"]["foodMask"] = 1010
|
||||
MTH_DS_Families["Foxes"]["foodDbc"] = {
|
||||
"fish",
|
||||
"fungus",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
}
|
||||
end
|
||||
@@ -6,6 +6,7 @@ if not MTH_DS then MTH_DS = {} end
|
||||
|
||||
MTH_DS_Families = {
|
||||
["Bats"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Bat",
|
||||
["named"] = 20,
|
||||
["coords"] = 18,
|
||||
["food"] = {
|
||||
@@ -21,6 +22,7 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Bears"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Bear",
|
||||
["named"] = 45,
|
||||
["coords"] = 45,
|
||||
["food"] = {
|
||||
@@ -30,6 +32,8 @@ MTH_DS_Families = {
|
||||
"cheese",
|
||||
"fruit",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -40,6 +44,7 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Boars"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Boar",
|
||||
["named"] = 45,
|
||||
["coords"] = 87,
|
||||
["food"] = {
|
||||
@@ -49,6 +54,8 @@ MTH_DS_Families = {
|
||||
"cheese",
|
||||
"fruit",
|
||||
"fungus",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -59,10 +66,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Carrion Birds"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Vulture",
|
||||
["named"] = 36,
|
||||
["coords"] = 101,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -74,11 +83,14 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Cats"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Cat",
|
||||
["named"] = 85,
|
||||
["coords"] = 88,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -90,6 +102,7 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Crabs"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Crab",
|
||||
["named"] = 32,
|
||||
["coords"] = 74,
|
||||
["food"] = {
|
||||
@@ -97,6 +110,7 @@ MTH_DS_Families = {
|
||||
"fish",
|
||||
"fungus",
|
||||
"bread",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bubble Barrier",
|
||||
@@ -106,11 +120,14 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Crocolisks"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Crocolisk",
|
||||
["named"] = 27,
|
||||
["coords"] = 71,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -120,11 +137,13 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Foxes"] = {
|
||||
["icon"] = "ability_hunter_aspectofthefox",
|
||||
["named"] = 9,
|
||||
["coords"] = 51,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -135,6 +154,7 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Gorillas"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Gorilla",
|
||||
["named"] = 24,
|
||||
["coords"] = 117,
|
||||
["food"] = {
|
||||
@@ -149,11 +169,13 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Hyenas"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Hyena",
|
||||
["named"] = 26,
|
||||
["coords"] = 36,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"fruit",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -164,10 +186,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Owls"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Owl",
|
||||
["named"] = 16,
|
||||
["coords"] = 59,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Claw",
|
||||
@@ -178,10 +202,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Raptors"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Raptor",
|
||||
["named"] = 51,
|
||||
["coords"] = 115,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -193,10 +219,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Scorpids"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Scorpid",
|
||||
["named"] = 38,
|
||||
["coords"] = 36,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Claw",
|
||||
@@ -206,11 +234,14 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Serpents (Cobra)"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Serpent1",
|
||||
["named"] = 10,
|
||||
["coords"] = 13,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"fish",
|
||||
"raw meat",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -220,10 +251,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Spiders"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Spider",
|
||||
["named"] = 91,
|
||||
["coords"] = 213,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -233,6 +266,7 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Tallstriders"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_TallStrider",
|
||||
["named"] = 15,
|
||||
["coords"] = 112,
|
||||
["food"] = {
|
||||
@@ -249,12 +283,14 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Turtles"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Turtle",
|
||||
["named"] = 25,
|
||||
["coords"] = 42,
|
||||
["food"] = {
|
||||
"fruit",
|
||||
"fish",
|
||||
"fungus",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -264,12 +300,14 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Wind Serpents"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_WindSerpent",
|
||||
["named"] = 27,
|
||||
["coords"] = 42,
|
||||
["food"] = {
|
||||
"fish",
|
||||
"cheese",
|
||||
"bread",
|
||||
"raw fish",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
@@ -280,10 +318,12 @@ MTH_DS_Families = {
|
||||
},
|
||||
},
|
||||
["Wolves"] = {
|
||||
["icon"] = "Ability_Hunter_Pet_Wolf",
|
||||
["named"] = 81,
|
||||
["coords"] = 99,
|
||||
["food"] = {
|
||||
"meat",
|
||||
"raw meat",
|
||||
},
|
||||
["abilities"] = {
|
||||
"Bite",
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,874 @@
|
||||
-- MetaHunt: Beast appearance skin variants per family
|
||||
-- AUTO-GENERATED by .tools — do not edit by hand.
|
||||
-- Source DBC(s): CreatureDisplayInfo.dbc, CreatureModelData.dbc
|
||||
-- Generated: 2026-03-17 14:49 UTC
|
||||
-- Total skins: 244 across 19 families
|
||||
|
||||
if not MTH_DS then MTH_DS = {} end
|
||||
|
||||
MTH_DS_BeastSkins = {
|
||||
["Bats"] = {
|
||||
{id=1954, tex="BatSkin01", unique=false, modelPath="Creature\\FelBat\\FelBat.mdx"},
|
||||
{id=3956, tex="BatSkinBrown01", unique=false, modelPath="Creature\\FelBat\\FelBat.mdx"},
|
||||
{id=4185, tex="BatSkinViolet01", unique=false, modelPath="Creature\\FelBat\\FelBat.mdx"},
|
||||
{id=4735, tex="BatSkinWhite01", unique=false, modelPath="Creature\\FelBat\\FelBat.mdx"},
|
||||
{id=15191, tex="MobatSkinBlue01", unique=true, modelPath="Creature\\mobat\\Mobat.mdx"},
|
||||
},
|
||||
["Bears"] = {
|
||||
{id=706, tex="BearSkinBlack", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=806, tex="BearSkinBlue", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=820, tex="BearSkinDrkBrown", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=822, tex="BearSkinBrown", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=865, tex="BearSkinWhite", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=1082, tex="BearSkinBlackDiseased", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=1083, tex="BearSkinDrkBrownDiseased", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=9492, tex="BearSkinrex2", unique=false, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=18352, tex="PolarBearCubSkin", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=19113, tex="FatherBear", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=20635, tex="BearSkinBrownDiseased", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=20636, tex="BearSkinBlueDiseased", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
{id=20637, tex="BearSkinWhiteDiseased", unique=true, modelPath="Creature\\bear\\Bear.mdx"},
|
||||
},
|
||||
["Boars"] = {
|
||||
{id=193, tex="BoarSkinIvory", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=377, tex="BoarSkinBrown", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=381, tex="BoarSkinBlue", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=2450, tex="BoarSkinIvoryArmored", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=3026, tex="BoarSkinCrimson", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=4713, tex="BoarSkinBrownArmored", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=4714, tex="BoarSkinBlueArmored", unique=true, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=6121, tex="BoarSkinUndead", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=8869, tex="BoarSkinYellow", unique=false, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=18729, tex="QuillBeastBlue", unique=true, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
{id=20504, tex="BoarSkinQuel", unique=true, modelPath="Creature\\Boar\\Boar.mdx"},
|
||||
},
|
||||
["Carrion Birds"] = {
|
||||
{id=388, tex="CarrionBirdSkin", unique=false, modelPath="Creature\\CarrionBird\\CarrionBird.mdx"},
|
||||
{id=410, tex="CarrionBirdSkinBrown", unique=false, modelPath="Creature\\CarrionBird\\CarrionBird.mdx"},
|
||||
{id=490, tex="CarrionBirdSkinRed", unique=false, modelPath="Creature\\CarrionBird\\CarrionBird.mdx"},
|
||||
{id=507, tex="CarrionBirdSkinBlue", unique=false, modelPath="Creature\\CarrionBird\\CarrionBird.mdx"},
|
||||
{id=18390, tex="CarrionBirdSkinWhite", unique=true, modelPath="Creature\\CarrionBird\\CarrionBird.mdx"},
|
||||
},
|
||||
["Cats"] = {
|
||||
{id=320, tex="TigerSkinRed", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=321, tex="TigerSkinBlackStriped", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=599, tex="TigerSkinBlack", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=616, tex="TigerSkinWhite", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=632, tex="TigerSkinYellow", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=748, tex="TigerSkinSnow", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=892, tex="DruidCatSkinBlack", unique=true, modelPath="Creature\\DruidCat\\DruidCat.mdx"},
|
||||
{id=1056, tex="TigerSkinBrown", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=1057, tex="LionSkinGold", unique=false, modelPath="Creature\\Lion\\Lion.mdx"},
|
||||
{id=1933, tex="LionessSkinGold", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=1934, tex="LionSkinWhite", unique=false, modelPath="Creature\\Lion\\Lion.mdx"},
|
||||
{id=3029, tex="TigerSkinDark", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=4424, tex="LionSkinBlack", unique=true, modelPath="Creature\\Lion\\Lion.mdx"},
|
||||
{id=5448, tex="MaineCoon", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=5554, tex="OrangeTabby", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=5555, tex="SilverTabby", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=5556, tex="Bombay", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=5585, tex="Birman", unique=false, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=5586, tex="CornishRex", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=9209, tex="Cringer", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=9230, tex="TigerSkinGreen", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=9949, tex="TigerSkinIce", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=9954, tex="RidingTigerSkinLavender", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=9956, tex="RidingTigerSkinWhitenosaddle", unique=false, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=9958, tex="TigerSkinNostripeWhite", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=9989, tex="White", unique=false, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=10054, tex="RidingTigerSkinAqua", unique=false, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=11448, tex="TigerSkinBlackSpotted", unique=false, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=11709, tex="Salome", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=18027, tex="LynxSkinRed", unique=true, modelPath="Creature\\DruidCat\\DruidCat.mdx"},
|
||||
{id=18028, tex="LynxSkinYellow", unique=true, modelPath="Creature\\DruidCat\\DruidCat.mdx"},
|
||||
{id=18389, tex="Boots", unique=true, modelPath="Creature\\Cat\\Cat.mdx"},
|
||||
{id=18426, tex="RidingTigerSkinYellownosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18427, tex="RidingTigerSkinIcenosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18428, tex="RidingTigerSkinRednosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18429, tex="RidingTigerSkinSnownosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18430, tex="RidingTigerSkinGoldnosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18431, tex="RidingTigerSkinBrownnosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18432, tex="RidingTigerSkinBlacknosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18433, tex="RidingTigerSkinDarknosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=18434, tex="RidingTigerSkinNostripeWhitenosaddle", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20388, tex="TIGERSKINBLACKGEM", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20389, tex="TigerSkinDiamond", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20390, tex="TigerSkinJade", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20391, tex="TigerSkinRuby", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20392, tex="TigerSkinSaphire", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20393, tex="TigerSkinTurquoise", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
{id=20410, tex="LionessSkinEmerald", unique=true, modelPath="Creature\\Tiger\\Tiger.mdx"},
|
||||
{id=20437, tex="RidingTigerSkinDarknosaddle.blp", unique=true, modelPath="Creature\\FrostSabre\\FrostSabre.mdx"},
|
||||
},
|
||||
["Crabs"] = {
|
||||
{id=342, tex="CrabSkinBronze", unique=false, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
{id=979, tex="CrabSkinSaphire", unique=false, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
{id=981, tex="CrabSkinIvory", unique=false, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
{id=1307, tex="CrabSkinVermillian", unique=false, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
{id=18757, tex="CrabSkinDarkDiamond", unique=true, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
{id=18758, tex="CrabSkinTrueSilver", unique=true, modelPath="Creature\\Crab\\Crab.mdx"},
|
||||
},
|
||||
["Crocolisks"] = {
|
||||
{id=807, tex="CrocodileSkinSwamp", unique=false, modelPath="Creature\\Crocodile\\Crocodile.mdx"},
|
||||
{id=833, tex="CrocodileSkinRiver", unique=false, modelPath="Creature\\Crocodile\\Crocodile.mdx"},
|
||||
{id=925, tex="CrocodileSkinMarsh", unique=false, modelPath="Creature\\Crocodile\\Crocodile.mdx"},
|
||||
{id=1609, tex="CrocodileSkinAlbino", unique=false, modelPath="Creature\\Crocodile\\Crocodile.mdx"},
|
||||
},
|
||||
["Foxes"] = {
|
||||
{id=18004, tex="MistFoxSkin", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18005, tex="MistFoxSkinArctic", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18006, tex="MistFoxSkinBlack", unique=false, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18007, tex="MistFoxSkinBrown", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18008, tex="MistFoxSkinRed", unique=false, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18244, tex="MistFoxSkinSpirit", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=18773, tex="MistFoxSkinPink", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=19105, tex="MistFoxSkinEvil", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=19106, tex="MistFoxSkinGolden", unique=true, modelPath="Creature\\Mistfox\\Mistfox.mdx"},
|
||||
{id=21282, tex="fox2_black", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21283, tex="fox2_blue", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21284, tex="fox2_darkred", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21285, tex="fox2_green", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21286, tex="fox2_orange", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21287, tex="fox2_purple", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21288, tex="fox2_red", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21289, tex="fox2_teal", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
{id=21290, tex="fox2_white", unique=true, modelPath="Creature\\fox2\\fox2.mdx"},
|
||||
},
|
||||
["Gorillas"] = {
|
||||
{id=792, tex="GorillaSkinSilver", unique=false, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
{id=809, tex="GorillaSkinBlack", unique=false, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
{id=838, tex="GorillaSkinGrey", unique=false, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
{id=840, tex="GorillaSkinWhite", unique=false, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
{id=3186, tex="GorillaSkinRed", unique=false, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
{id=8841, tex="GorillaSkinAmy", unique=true, modelPath="Creature\\Gorilla\\Gorilla.mdx"},
|
||||
},
|
||||
["Hyenas"] = {
|
||||
{id=1534, tex="HyenaSkinOarnge", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=1536, tex="HyenaSkin", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=2709, tex="HyenaSkinRed", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=2710, tex="HyenaSkinYellow", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=2713, tex="HyenaSkinBlue", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=2714, tex="HyenaSkinWhite", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
{id=2726, tex="HyenaSkinBlack", unique=false, modelPath="Creature\\Hyena\\Hyena.mdx"},
|
||||
},
|
||||
["Owls"] = {
|
||||
{id=4566, tex="OwlBrown", unique=false, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=4877, tex="OwlGrey", unique=false, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=6212, tex="OwlWhite", unique=false, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=6298, tex="OwlBlue", unique=true, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=6299, tex="OwlBlack", unique=true, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=18338, tex="Eagle", unique=false, modelPath="Creature\\Eagle\\Eagle.mdx"},
|
||||
{id=18339, tex="BrownEagle", unique=true, modelPath="Creature\\Eagle\\Eagle.mdx"},
|
||||
{id=18368, tex="OwlSpirit", unique=true, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=18746, tex="EagleRaven", unique=true, modelPath="Creature\\Eagle\\Eagle.mdx"},
|
||||
{id=21109, tex="OwlRuby", unique=true, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
{id=21110, tex="OwlSapphire", unique=true, modelPath="Creature\\Owl\\Owl.mdx"},
|
||||
},
|
||||
["Raptors"] = {
|
||||
{id=180, tex="RaptorSkinOrange", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=322, tex="RaptorSkinMottledDarkGreen", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=675, tex="RaptorSkinMottledBlueGreen", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=787, tex="RaptorSkinYellow", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=960, tex="RaptorSkinViolet", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=1337, tex="RaptorSkinGrey", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=1959, tex="RaptorSkinRed", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
{id=5291, tex="RidingRaptorSkinObsidian", unique=false, modelPath="Creature\\Raptor\\Raptor.mdx"},
|
||||
},
|
||||
["Scorpids"] = {
|
||||
{id=2414, tex="ScorpionskinPink", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2485, tex="ScorpionskinBeige", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2487, tex="ScorpionskinYellow", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2488, tex="ScorpionskinBlack", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2489, tex="ScorpionskinRed", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2729, tex="ScorpionskinGolden", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=2730, tex="ScorpionskinBlue", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=7469, tex="SilithidScarabSkinBlack", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=8971, tex="SilithidScarabSkinRed", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=9028, tex="SilithidScarabSkinWhite", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=9469, tex="SilithidScarabSkinYellow", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=10983, tex="ScorpionskinSilver", unique=false, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
{id=11093, tex="SilithidScarabSkinTeal", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=11104, tex="SilithidScarabSkinGold", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=11107, tex="SilithidScarabSkinPurple", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=11143, tex="SilithidScarabSkinTan", unique=false, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=18373, tex="SilithidScarabSkinGreen", unique=true, modelPath="Creature\\SILITHIDSCARAB\\SilithidScarab.mdx"},
|
||||
{id=21268, tex="ScorpionskinDarkIron", unique=true, modelPath="Creature\\Scorpion\\Scorpion.mdx"},
|
||||
},
|
||||
["Serpents (Cobra)"] = {
|
||||
{id=1206, tex="SnakeSkinBlack", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=1986, tex="SnakeSkinDarkGreenYellow", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=1987, tex="SnakeSkinYellowBlack", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=2954, tex="SnakeSkinRedWhiteBlack", unique=true, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=2955, tex="SnakeSkinWhite", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=2956, tex="SnakeSkinBlue", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=2957, tex="SnakeSkinBrown", unique=true, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=2958, tex="SnakeSkinGreen", unique=false, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=4305, tex="SerpantSkinWhite", unique=false, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=4312, tex="SerpantSkinPurple", unique=false, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=4317, tex="SerpantSkinBlue", unique=false, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=4435, tex="SerpantSkinGreen", unique=false, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=6303, tex="SnakeSkinRed", unique=true, modelPath="Creature\\snake\\snake.mdx"},
|
||||
{id=11034, tex="SerpantSkinOlive", unique=false, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=15182, tex="SerpantSkinBrown", unique=true, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=20633, tex="SerpantSkinViolet", unique=true, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=20634, tex="SerpantSkinRuby", unique=true, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
{id=21269, tex="SerpentSkinRuby", unique=true, modelPath="Creature\\Serpent\\Serpent.mdx"},
|
||||
},
|
||||
["Spiders"] = {
|
||||
{id=30, tex="MineSpiderSkinSteel", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=283, tex="MineSpiderSkinGreen", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=336, tex="TarantulaSkinGreen", unique=false, modelPath="Creature\\Tarantula\\Tarantula.mdx"},
|
||||
{id=366, tex="TarantulaSkinOrange", unique=false, modelPath="Creature\\Tarantula\\Tarantula.mdx"},
|
||||
{id=513, tex="MineSpiderSkinOlive", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=520, tex="TarantulaSkinBrown", unique=false, modelPath="Creature\\Tarantula\\Tarantula.mdx"},
|
||||
{id=711, tex="MineSpiderSkinWetLands", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=955, tex="MineSpiderSkinCave", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=963, tex="MineSpiderSkinBlood", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=1091, tex="TarantulaSkinGrey", unique=false, modelPath="Creature\\Tarantula\\Tarantula.mdx"},
|
||||
{id=2536, tex="MineSpiderSkinJungle", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=4456, tex="MineSpiderSkinCrystal", unique=false, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
{id=4457, tex="TarantulaSkinMagma", unique=false, modelPath="Creature\\Tarantula\\Tarantula.mdx"},
|
||||
{id=15937, tex="MineSpiderSkinViolet", unique=true, modelPath="Creature\\MineSpider\\MineSpider.mdx"},
|
||||
},
|
||||
["Tallstriders"] = {
|
||||
{id=38, tex="TallStriderSkinTurquoise", unique=false, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=178, tex="TallStriderSkinBrown", unique=false, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=1220, tex="TallStriderSkinGray", unique=false, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=1221, tex="TallStriderSkinIvory", unique=false, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=1281, tex="TallStriderSkinPurple", unique=true, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=1961, tex="TallStriderSkinPink", unique=true, modelPath="Creature\\Tallstrider\\TallStrider.mdx"},
|
||||
{id=20509, tex="HawkstriderBlue", unique=true, modelPath="Creature\\Hawkstrider\\Hawkstrider.mdx"},
|
||||
{id=20510, tex="HawkstriderGold", unique=true, modelPath="Creature\\Hawkstrider\\Hawkstrider.mdx"},
|
||||
{id=20511, tex="HawkstriderGreen", unique=true, modelPath="Creature\\Hawkstrider\\Hawkstrider.mdx"},
|
||||
{id=20512, tex="HawkstriderRed", unique=true, modelPath="Creature\\Hawkstrider\\Hawkstrider.mdx"},
|
||||
{id=20513, tex="HawkstriderWhite", unique=true, modelPath="Creature\\Hawkstrider\\Hawkstrider.mdx"},
|
||||
},
|
||||
["Turtles"] = {
|
||||
{id=1244, tex="SeaTurtleSkin", unique=false, modelPath="Creature\\SeaTurtle\\SeaTurtle.mdx"},
|
||||
{id=2307, tex="SeaTurtleSkinWhite", unique=false, modelPath="Creature\\SeaTurtle\\SeaTurtle.mdx"},
|
||||
{id=4829, tex="SeaTurtleSkinGrey", unique=false, modelPath="Creature\\SeaTurtle\\SeaTurtle.mdx"},
|
||||
{id=5026, tex="SeaTurtleSkinRed", unique=false, modelPath="Creature\\SeaTurtle\\SeaTurtle.mdx"},
|
||||
{id=5126, tex="SeaTurtleSkinBlue", unique=false, modelPath="Creature\\SeaTurtle\\SeaTurtle.mdx"},
|
||||
{id=16259, tex="TurtleSkinGreen", unique=false, modelPath="Creature\\Turtle\\Turtle.mdx"},
|
||||
{id=16360, tex="TurtleSkinBrown", unique=true, modelPath="Creature\\Turtle\\Turtle.mdx"},
|
||||
{id=16361, tex="TurtleSkinBlack", unique=true, modelPath="Creature\\Turtle\\Turtle.mdx"},
|
||||
},
|
||||
["Wind Serpents"] = {
|
||||
{id=1336, tex="WindSerpentSkin", unique=false, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=2699, tex="WindSerpentSkinRed", unique=false, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=2700, tex="WindSerpentSkinGreen", unique=false, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=2703, tex="WindSerpentSkinWhite", unique=false, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=3006, tex="WindSerpentSkinBlack", unique=false, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=18386, tex="WindSerpentSkinOarnge", unique=true, modelPath="Creature\\WindSerpent\\WindSerpent.mdx"},
|
||||
{id=20514, tex="ManaWurmSkinBlack", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
{id=20515, tex="MANAWURMSKINGREEN", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
{id=20516, tex="ManaWurmSkinPurple", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
{id=20517, tex="ManaWurmSkinQuel", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
{id=20518, tex="ManaWurmSkinSilver1", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
{id=20519, tex="ManaWurmSkinWhite", unique=true, modelPath="Creature\\Manawurm\\manawurm.mdx"},
|
||||
},
|
||||
["Wolves"] = {
|
||||
{id=73, tex="Direwolfskinbrown", unique=true, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=161, tex="WolfSkinCoyote", unique=false, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=165, tex="WolfSkinTimber", unique=false, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=246, tex="DireWolfSkinDarkBlack", unique=false, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=644, tex="WolfSkinBlack", unique=false, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=720, tex="DireWolfSkinLightBlue", unique=false, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=776, tex="WolfSkinArctic", unique=false, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=868, tex="WolfSkinArcticAlpha", unique=true, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=1950, tex="WolfSkin_Ghost", unique=true, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=3916, tex="HoundSkinBlue", unique=false, modelPath="Creature\\DarkHound\\DarkHound.mdx"},
|
||||
{id=4124, tex="WolfSkinDiseased", unique=false, modelPath="Creature\\Wolf\\Wolf.mdx"},
|
||||
{id=6195, tex="HoundSkinGrey", unique=false, modelPath="Creature\\DarkHound\\DarkHound.mdx"},
|
||||
{id=7890, tex="HoundSkinPurple", unique=false, modelPath="Creature\\DarkHound\\DarkHound.mdx"},
|
||||
{id=8180, tex="HoundSkinRed", unique=false, modelPath="Creature\\DarkHound\\DarkHound.mdx"},
|
||||
{id=9369, tex="DireWolfSkinReddishBrown", unique=false, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=9564, tex="DireWolfSkinLightGrey", unique=false, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=9567, tex="DireWolfSkinBlueBrown", unique=true, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=9568, tex="DireWolfSkinDarkBrown", unique=false, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=11414, tex="DireWolfSkinDarkGrey", unique=true, modelPath="Creature\\DireWolf\\DireWolf.mdx"},
|
||||
{id=14312, tex="HoundSkinWhite", unique=false, modelPath="Creature\\DarkHound\\DarkHound.mdx"},
|
||||
},
|
||||
}
|
||||
|
||||
-- Maps any beast displayId to the canonical skin id used in MTH_DS_BeastSkins
|
||||
-- Total: 577 entries
|
||||
MTH_DS_DisplayToSkin = {
|
||||
[368] = 30,
|
||||
[372] = 165,
|
||||
[380] = 165,
|
||||
[382] = 366,
|
||||
[389] = 193,
|
||||
[418] = 30,
|
||||
[447] = 165,
|
||||
[471] = 320,
|
||||
[498] = 366,
|
||||
[499] = 193,
|
||||
[503] = 193,
|
||||
[538] = 513,
|
||||
[539] = 30,
|
||||
[545] = 283,
|
||||
[557] = 161,
|
||||
[566] = 520,
|
||||
[598] = 320,
|
||||
[604] = 165,
|
||||
[607] = 381,
|
||||
[613] = 599,
|
||||
[614] = 320,
|
||||
[615] = 322,
|
||||
[633] = 599,
|
||||
[641] = 342,
|
||||
[643] = 161,
|
||||
[647] = 165,
|
||||
[648] = 322,
|
||||
[649] = 180,
|
||||
[651] = 366,
|
||||
[659] = 513,
|
||||
[666] = 165,
|
||||
[670] = 180,
|
||||
[671] = 180,
|
||||
[672] = 180,
|
||||
[673] = 180,
|
||||
[674] = 322,
|
||||
[676] = 322,
|
||||
[677] = 675,
|
||||
[695] = 322,
|
||||
[698] = 320,
|
||||
[699] = 342,
|
||||
[703] = 377,
|
||||
[704] = 377,
|
||||
[707] = 706,
|
||||
[709] = 336,
|
||||
[719] = 706,
|
||||
[741] = 246,
|
||||
[744] = 381,
|
||||
[749] = 748,
|
||||
[755] = 675,
|
||||
[759] = 336,
|
||||
[760] = 336,
|
||||
[762] = 706,
|
||||
[768] = 283,
|
||||
[780] = 644,
|
||||
[781] = 644,
|
||||
[782] = 644,
|
||||
[783] = 165,
|
||||
[784] = 644,
|
||||
[785] = 776,
|
||||
[788] = 180,
|
||||
[801] = 776,
|
||||
[802] = 776,
|
||||
[814] = 807,
|
||||
[815] = 807,
|
||||
[821] = 520,
|
||||
[827] = 520,
|
||||
[831] = 807,
|
||||
[834] = 833,
|
||||
[835] = 807,
|
||||
[837] = 792,
|
||||
[839] = 809,
|
||||
[841] = 792,
|
||||
[842] = 838,
|
||||
[843] = 838,
|
||||
[844] = 792,
|
||||
[845] = 809,
|
||||
[855] = 776,
|
||||
[869] = 776,
|
||||
[902] = 822,
|
||||
[903] = 165,
|
||||
[909] = 520,
|
||||
[910] = 520,
|
||||
[913] = 865,
|
||||
[917] = 632,
|
||||
[918] = 632,
|
||||
[945] = 180,
|
||||
[948] = 180,
|
||||
[949] = 675,
|
||||
[954] = 748,
|
||||
[957] = 283,
|
||||
[958] = 955,
|
||||
[959] = 955,
|
||||
[961] = 787,
|
||||
[982] = 822,
|
||||
[996] = 979,
|
||||
[997] = 981,
|
||||
[998] = 979,
|
||||
[999] = 981,
|
||||
[1000] = 979,
|
||||
[1001] = 981,
|
||||
[1006] = 822,
|
||||
[1007] = 806,
|
||||
[1008] = 632,
|
||||
[1030] = 720,
|
||||
[1034] = 807,
|
||||
[1035] = 925,
|
||||
[1036] = 925,
|
||||
[1037] = 833,
|
||||
[1038] = 925,
|
||||
[1039] = 833,
|
||||
[1040] = 38,
|
||||
[1041] = 178,
|
||||
[1042] = 178,
|
||||
[1043] = 632,
|
||||
[1055] = 632,
|
||||
[1058] = 1056,
|
||||
[1059] = 1056,
|
||||
[1080] = 807,
|
||||
[1087] = 955,
|
||||
[1088] = 513,
|
||||
[1089] = 513,
|
||||
[1090] = 955,
|
||||
[1094] = 809,
|
||||
[1095] = 599,
|
||||
[1100] = 161,
|
||||
[1103] = 1091,
|
||||
[1104] = 1091,
|
||||
[1105] = 388,
|
||||
[1106] = 388,
|
||||
[1157] = 955,
|
||||
[1160] = 955,
|
||||
[1164] = 161,
|
||||
[1167] = 193,
|
||||
[1192] = 507,
|
||||
[1207] = 776,
|
||||
[1208] = 377,
|
||||
[1210] = 490,
|
||||
[1219] = 178,
|
||||
[1222] = 161,
|
||||
[1228] = 388,
|
||||
[1229] = 388,
|
||||
[1250] = 833,
|
||||
[1251] = 833,
|
||||
[1259] = 180,
|
||||
[1283] = 178,
|
||||
[1284] = 1221,
|
||||
[1338] = 960,
|
||||
[1339] = 1337,
|
||||
[1340] = 1337,
|
||||
[1535] = 1534,
|
||||
[1742] = 1336,
|
||||
[1744] = 960,
|
||||
[1746] = 1337,
|
||||
[1747] = 960,
|
||||
[1873] = 513,
|
||||
[1938] = 1307,
|
||||
[1939] = 1307,
|
||||
[1955] = 1954,
|
||||
[1960] = 1959,
|
||||
[1962] = 1959,
|
||||
[1971] = 1057,
|
||||
[1972] = 1057,
|
||||
[1973] = 1057,
|
||||
[1974] = 1336,
|
||||
[1975] = 1336,
|
||||
[1977] = 1057,
|
||||
[1978] = 1933,
|
||||
[1989] = 336,
|
||||
[1990] = 822,
|
||||
[2031] = 1056,
|
||||
[2239] = 979,
|
||||
[2278] = 1056,
|
||||
[2279] = 616,
|
||||
[2300] = 1056,
|
||||
[2301] = 1536,
|
||||
[2305] = 410,
|
||||
[2308] = 2307,
|
||||
[2352] = 246,
|
||||
[2378] = 822,
|
||||
[2424] = 366,
|
||||
[2433] = 30,
|
||||
[2437] = 599,
|
||||
[2453] = 2450,
|
||||
[2486] = 2485,
|
||||
[2491] = 2488,
|
||||
[2537] = 2536,
|
||||
[2538] = 2536,
|
||||
[2539] = 2536,
|
||||
[2540] = 283,
|
||||
[2541] = 283,
|
||||
[2542] = 366,
|
||||
[2543] = 366,
|
||||
[2544] = 366,
|
||||
[2545] = 366,
|
||||
[2546] = 366,
|
||||
[2548] = 925,
|
||||
[2549] = 925,
|
||||
[2550] = 807,
|
||||
[2570] = 1959,
|
||||
[2571] = 1959,
|
||||
[2573] = 1959,
|
||||
[2574] = 1959,
|
||||
[2609] = 1534,
|
||||
[2702] = 2699,
|
||||
[2705] = 2703,
|
||||
[2706] = 2700,
|
||||
[2707] = 2700,
|
||||
[2708] = 2700,
|
||||
[2711] = 2710,
|
||||
[2712] = 2710,
|
||||
[2715] = 2714,
|
||||
[2716] = 2714,
|
||||
[2731] = 2730,
|
||||
[2732] = 2487,
|
||||
[2741] = 1220,
|
||||
[2765] = 2729,
|
||||
[2766] = 2729,
|
||||
[2850] = 1609,
|
||||
[2864] = 2488,
|
||||
[2902] = 1244,
|
||||
[2995] = 2958,
|
||||
[2996] = 1609,
|
||||
[3027] = 3026,
|
||||
[3030] = 3029,
|
||||
[3031] = 3029,
|
||||
[3035] = 3026,
|
||||
[3126] = 1206,
|
||||
[3187] = 3186,
|
||||
[3188] = 3186,
|
||||
[3200] = 806,
|
||||
[3201] = 806,
|
||||
[3202] = 165,
|
||||
[3203] = 165,
|
||||
[3204] = 2699,
|
||||
[3205] = 2699,
|
||||
[3247] = 2489,
|
||||
[3248] = 490,
|
||||
[4065] = 2699,
|
||||
[4090] = 1609,
|
||||
[4091] = 2700,
|
||||
[4167] = 2956,
|
||||
[4268] = 1206,
|
||||
[4343] = 1986,
|
||||
[4440] = 1987,
|
||||
[4442] = 960,
|
||||
[4458] = 4457,
|
||||
[4472] = 748,
|
||||
[4480] = 4312,
|
||||
[4613] = 161,
|
||||
[4615] = 4566,
|
||||
[4636] = 2710,
|
||||
[4689] = 2709,
|
||||
[4716] = 4713,
|
||||
[4732] = 3956,
|
||||
[4733] = 4185,
|
||||
[4734] = 3956,
|
||||
[4767] = 4317,
|
||||
[4768] = 4435,
|
||||
[5027] = 5026,
|
||||
[5030] = 5026,
|
||||
[5052] = 2307,
|
||||
[5066] = 1933,
|
||||
[5067] = 599,
|
||||
[5068] = 3029,
|
||||
[5069] = 632,
|
||||
[5127] = 5126,
|
||||
[5242] = 960,
|
||||
[5244] = 792,
|
||||
[5245] = 838,
|
||||
[5290] = 675,
|
||||
[5292] = 960,
|
||||
[5294] = 792,
|
||||
[5295] = 838,
|
||||
[5296] = 838,
|
||||
[5510] = 822,
|
||||
[5557] = 342,
|
||||
[5558] = 981,
|
||||
[5559] = 979,
|
||||
[5560] = 1307,
|
||||
[5905] = 2488,
|
||||
[5966] = 4305,
|
||||
[5985] = 2489,
|
||||
[6068] = 2488,
|
||||
[6069] = 2488,
|
||||
[6070] = 2488,
|
||||
[6073] = 1091,
|
||||
[6076] = 1220,
|
||||
[6082] = 1056,
|
||||
[6122] = 6121,
|
||||
[6126] = 1244,
|
||||
[6196] = 6195,
|
||||
[6210] = 616,
|
||||
[6213] = 1091,
|
||||
[6214] = 1091,
|
||||
[6248] = 616,
|
||||
[6300] = 4877,
|
||||
[6368] = 5126,
|
||||
[6468] = 5291,
|
||||
[6805] = 3029,
|
||||
[6807] = 3026,
|
||||
[6808] = 336,
|
||||
[6942] = 1056,
|
||||
[6943] = 599,
|
||||
[7046] = 5126,
|
||||
[7114] = 5126,
|
||||
[7339] = 644,
|
||||
[7347] = 2489,
|
||||
[7348] = 490,
|
||||
[7349] = 490,
|
||||
[7409] = 1206,
|
||||
[7470] = 7469,
|
||||
[7510] = 4457,
|
||||
[7511] = 7469,
|
||||
[7569] = 2703,
|
||||
[7619] = 7469,
|
||||
[7691] = 2703,
|
||||
[7829] = 3006,
|
||||
[7836] = 4829,
|
||||
[7837] = 4829,
|
||||
[7839] = 4829,
|
||||
[7840] = 4829,
|
||||
[7891] = 7890,
|
||||
[7892] = 7890,
|
||||
[7893] = 7890,
|
||||
[7894] = 4185,
|
||||
[7896] = 1954,
|
||||
[7897] = 4185,
|
||||
[7906] = 2699,
|
||||
[8014] = 520,
|
||||
[8050] = 2714,
|
||||
[8129] = 840,
|
||||
[8173] = 2955,
|
||||
[8174] = 1987,
|
||||
[8181] = 8180,
|
||||
[8271] = 4456,
|
||||
[8472] = 675,
|
||||
[8473] = 960,
|
||||
[8808] = 4185,
|
||||
[8837] = 865,
|
||||
[8838] = 806,
|
||||
[8839] = 792,
|
||||
[8840] = 806,
|
||||
[8842] = 865,
|
||||
[8843] = 706,
|
||||
[8844] = 3186,
|
||||
[8870] = 381,
|
||||
[8871] = 8869,
|
||||
[8969] = 2487,
|
||||
[8970] = 2487,
|
||||
[9019] = 8180,
|
||||
[9020] = 3916,
|
||||
[9021] = 3916,
|
||||
[9022] = 7890,
|
||||
[9029] = 9028,
|
||||
[9050] = 675,
|
||||
[9074] = 1954,
|
||||
[9276] = 1083,
|
||||
[9277] = 1083,
|
||||
[9278] = 4124,
|
||||
[9280] = 4124,
|
||||
[9287] = 644,
|
||||
[9354] = 7469,
|
||||
[9370] = 9369,
|
||||
[9371] = 9369,
|
||||
[9372] = 9369,
|
||||
[9509] = 644,
|
||||
[9511] = 644,
|
||||
[9535] = 3956,
|
||||
[9558] = 644,
|
||||
[9562] = 246,
|
||||
[9563] = 246,
|
||||
[9565] = 981,
|
||||
[9566] = 979,
|
||||
[9569] = 9568,
|
||||
[9570] = 342,
|
||||
[9571] = 342,
|
||||
[9572] = 9568,
|
||||
[9573] = 979,
|
||||
[9749] = 2488,
|
||||
[9750] = 4735,
|
||||
[9755] = 4456,
|
||||
[9756] = 4456,
|
||||
[9829] = 513,
|
||||
[9910] = 30,
|
||||
[9913] = 2699,
|
||||
[9929] = 4456,
|
||||
[9934] = 336,
|
||||
[9950] = 9949,
|
||||
[9951] = 9949,
|
||||
[9953] = 616,
|
||||
[9955] = 9949,
|
||||
[9957] = 9949,
|
||||
[9990] = 9989,
|
||||
[9992] = 9230,
|
||||
[9993] = 9230,
|
||||
[9997] = 4456,
|
||||
[10015] = 193,
|
||||
[10031] = 8971,
|
||||
[10033] = 1954,
|
||||
[10055] = 1934,
|
||||
[10113] = 10054,
|
||||
[10114] = 1934,
|
||||
[10133] = 840,
|
||||
[10183] = 2699,
|
||||
[10209] = 246,
|
||||
[10270] = 2726,
|
||||
[10271] = 2726,
|
||||
[10273] = 507,
|
||||
[10274] = 776,
|
||||
[10278] = 720,
|
||||
[10618] = 865,
|
||||
[10824] = 388,
|
||||
[10825] = 410,
|
||||
[10826] = 507,
|
||||
[10827] = 490,
|
||||
[10828] = 6212,
|
||||
[10829] = 4877,
|
||||
[10830] = 4877,
|
||||
[10831] = 4877,
|
||||
[10832] = 4877,
|
||||
[10833] = 6212,
|
||||
[10902] = 2726,
|
||||
[10903] = 2713,
|
||||
[10904] = 2713,
|
||||
[10947] = 2307,
|
||||
[10984] = 2487,
|
||||
[10985] = 2487,
|
||||
[10986] = 2414,
|
||||
[10987] = 2414,
|
||||
[10988] = 10983,
|
||||
[10991] = 2700,
|
||||
[11029] = 320,
|
||||
[11031] = 320,
|
||||
[11032] = 3956,
|
||||
[11089] = 9469,
|
||||
[11094] = 11093,
|
||||
[11098] = 2485,
|
||||
[11105] = 11104,
|
||||
[11108] = 11107,
|
||||
[11144] = 11143,
|
||||
[11315] = 1959,
|
||||
[11316] = 787,
|
||||
[11317] = 960,
|
||||
[11318] = 675,
|
||||
[11319] = 322,
|
||||
[11348] = 366,
|
||||
[11411] = 246,
|
||||
[11412] = 720,
|
||||
[11413] = 9564,
|
||||
[11415] = 9564,
|
||||
[11416] = 776,
|
||||
[11417] = 9564,
|
||||
[11418] = 9564,
|
||||
[11419] = 9564,
|
||||
[11420] = 9369,
|
||||
[11421] = 246,
|
||||
[11422] = 720,
|
||||
[11444] = 9958,
|
||||
[11445] = 9958,
|
||||
[11446] = 616,
|
||||
[11447] = 320,
|
||||
[11449] = 321,
|
||||
[11450] = 321,
|
||||
[11451] = 1056,
|
||||
[11452] = 599,
|
||||
[11453] = 11448,
|
||||
[11454] = 3029,
|
||||
[11455] = 320,
|
||||
[11829] = 4735,
|
||||
[11908] = 820,
|
||||
[11909] = 820,
|
||||
[11910] = 599,
|
||||
[12151] = 11093,
|
||||
[12156] = 11107,
|
||||
[12157] = 11104,
|
||||
[12159] = 9469,
|
||||
[12433] = 410,
|
||||
[12966] = 2710,
|
||||
[13096] = 7469,
|
||||
[13097] = 10983,
|
||||
[13111] = 963,
|
||||
[13589] = 1609,
|
||||
[14256] = 925,
|
||||
[14313] = 490,
|
||||
[14315] = 822,
|
||||
[14316] = 822,
|
||||
[14318] = 11448,
|
||||
[14319] = 507,
|
||||
[14364] = 9956,
|
||||
[14557] = 11034,
|
||||
[14558] = 4435,
|
||||
[14559] = 4305,
|
||||
[14562] = 3956,
|
||||
[14572] = 599,
|
||||
[14657] = 5126,
|
||||
[14658] = 4829,
|
||||
[14659] = 1244,
|
||||
[14660] = 5026,
|
||||
[14661] = 2307,
|
||||
[14780] = 1954,
|
||||
[14853] = 711,
|
||||
[14935] = 599,
|
||||
[14950] = 955,
|
||||
[14952] = 955,
|
||||
[15072] = 711,
|
||||
[15132] = 4317,
|
||||
[15133] = 4435,
|
||||
[15135] = 4312,
|
||||
[15136] = 711,
|
||||
[15137] = 3006,
|
||||
[15138] = 320,
|
||||
[15145] = 833,
|
||||
[15150] = 4317,
|
||||
[15151] = 320,
|
||||
[15180] = 9369,
|
||||
[15181] = 14312,
|
||||
[15204] = 9369,
|
||||
[15227] = 4735,
|
||||
[15275] = 2699,
|
||||
[15302] = 3186,
|
||||
[15327] = 2489,
|
||||
[15336] = 2485,
|
||||
[15339] = 11104,
|
||||
[15383] = 10983,
|
||||
[15384] = 2729,
|
||||
[15385] = 10983,
|
||||
[15422] = 2730,
|
||||
[15423] = 2730,
|
||||
[15433] = 2488,
|
||||
[15464] = 9028,
|
||||
[15467] = 11104,
|
||||
[15468] = 11143,
|
||||
[15469] = 2485,
|
||||
[15470] = 2729,
|
||||
[15471] = 2489,
|
||||
[15533] = 2414,
|
||||
[15534] = 6212,
|
||||
[15682] = 11107,
|
||||
[15878] = 776,
|
||||
[15929] = 7469,
|
||||
[15938] = 513,
|
||||
[15939] = 2536,
|
||||
[15964] = 14312,
|
||||
[15969] = 3916,
|
||||
[16145] = 5126,
|
||||
[16359] = 16259,
|
||||
[16622] = 5585,
|
||||
[18115] = 9492,
|
||||
[18177] = 18008,
|
||||
[18353] = 18338,
|
||||
[18493] = 18006,
|
||||
[20369] = 18027,
|
||||
[20370] = 1933,
|
||||
[20371] = 11448,
|
||||
[20372] = 321,
|
||||
[20373] = 9230,
|
||||
[20374] = 18432,
|
||||
[20375] = 18431,
|
||||
[20376] = 18433,
|
||||
[20377] = 18430,
|
||||
[20378] = 18427,
|
||||
[20379] = 18434,
|
||||
[20380] = 18428,
|
||||
[20381] = 18429,
|
||||
[20382] = 9956,
|
||||
[20383] = 18426,
|
||||
[20384] = 11448,
|
||||
[20385] = 321,
|
||||
[20386] = 9230,
|
||||
[20387] = 1933,
|
||||
[20394] = 20388,
|
||||
[20395] = 20389,
|
||||
[20396] = 20390,
|
||||
[20397] = 20391,
|
||||
[20398] = 20392,
|
||||
[20399] = 20393,
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
+1264
-1
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,163 @@
|
||||
-- MetaHunt: Pet spell DBC acquire-method overlay (learnMethod, minRank, nextSpellId)
|
||||
-- AUTO-GENERATED by .tools — do not edit by hand.
|
||||
-- Source DBC(s): SkillLineAbility.dbc, SkillLine.dbc
|
||||
-- Generated: 2026-03-17 07:31 UTC
|
||||
|
||||
-- This file patches MTH_DS_PetSpells.allSpells entries with DBC-authoritative
|
||||
-- learnMethod, minRank, and nextSpellId values.
|
||||
-- Load order: after ds-pet-spells.lua and ds-pet-spells-trainer.lua
|
||||
|
||||
if not MTH_DS_PetSpells or not MTH_DS_PetSpells.allSpells then return end
|
||||
|
||||
local _acquire = {
|
||||
[1747] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[1748] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[1749] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[1750] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[1751] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[1853] = { learnMethod="unknown(1)", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2975] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2976] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2977] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2980] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2981] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[2982] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[3666] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[3667] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4195] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4196] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4197] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4198] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4199] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4200] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4201] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[4202] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[5048] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[5049] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[5149] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[7370] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14922] = { learnMethod="unknown(1)", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14923] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14924] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14925] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14926] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[14927] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[16698] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17254] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17262] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17263] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17264] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17265] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17266] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17267] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[17268] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23100] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23111] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23112] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23146] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23149] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23150] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23163] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23166] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[23167] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24424] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24440] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24441] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24451] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24454] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24455] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24463] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24464] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24475] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24476] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24477] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24478] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24490] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24494] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24495] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24508] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24509] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24510] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24511] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24512] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24513] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24514] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24515] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24516] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24547] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24556] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24557] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24558] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24559] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24560] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24561] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24562] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24580] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24581] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24582] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24584] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24588] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24589] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24599] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24607] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24608] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24609] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24631] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24632] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24641] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[24845] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25013] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25014] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25015] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25016] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25017] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[25077] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26065] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26094] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26184] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26185] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26186] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26189] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26190] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[26202] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[28343] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36554] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36555] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36556] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36557] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36558] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36559] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36560] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36561] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36563] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36564] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36565] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36566] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36567] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36568] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36569] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36570] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36571] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36572] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36573] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[36574] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[46023] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
[46276] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[46303] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
[46304] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[46307] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
[46310] = { learnMethod="trainer", minRank=1, nextSpellId=0, skillLineId=261 },
|
||||
[51154] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
[51155] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
[51157] = { learnMethod="trainer", minRank=0, nextSpellId=0, skillLineId=261 },
|
||||
}
|
||||
|
||||
for _, spell in ipairs(MTH_DS_PetSpells.allSpells) do
|
||||
local meta = _acquire[spell.id]
|
||||
if meta then
|
||||
spell.learnMethod = meta.learnMethod
|
||||
spell.minRank = meta.minRank
|
||||
spell.nextSpellId = meta.nextSpellId
|
||||
spell.skillLineId = meta.skillLineId
|
||||
end
|
||||
end
|
||||
@@ -0,0 +1,37 @@
|
||||
-- MetaHunt: Stable slot prices
|
||||
-- AUTO-GENERATED by .tools — do not edit by hand.
|
||||
-- Source DBC(s): StableSlotPrices.dbc
|
||||
-- Generated: 2026-03-17 07:31 UTC
|
||||
|
||||
if not MTH_DS then MTH_DS = {} end
|
||||
|
||||
MTH_DS_StableSlotPrices = {
|
||||
[1] = {
|
||||
["cost_copper"] = 500,
|
||||
["cost_gold"] = 0,
|
||||
["cost_silver"] = 5,
|
||||
["cost_copper_remainder"] = 0,
|
||||
["display"] = "0g 5s 0c",
|
||||
},
|
||||
[2] = {
|
||||
["cost_copper"] = 50000,
|
||||
["cost_gold"] = 5,
|
||||
["cost_silver"] = 0,
|
||||
["cost_copper_remainder"] = 0,
|
||||
["display"] = "5g 0s 0c",
|
||||
},
|
||||
[3] = {
|
||||
["cost_copper"] = 2500000,
|
||||
["cost_gold"] = 250,
|
||||
["cost_silver"] = 0,
|
||||
["cost_copper_remainder"] = 0,
|
||||
["display"] = "250g 0s 0c",
|
||||
},
|
||||
[4] = {
|
||||
["cost_copper"] = 1,
|
||||
["cost_gold"] = 0,
|
||||
["cost_silver"] = 0,
|
||||
["cost_copper_remainder"] = 1,
|
||||
["display"] = "0g 0s 1c",
|
||||
},
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
-- MetaHunt: Zone DBC enrichment (worldBounds, dbcAreaId, dbcMapId, dbcName)
|
||||
-- AUTO-GENERATED by .tools — do not edit by hand.
|
||||
-- Source DBC(s): WorldMapArea.dbc, AreaTable.dbc
|
||||
-- Generated: 2026-03-17 07:31 UTC
|
||||
|
||||
if not MTH_DS_Zones then return end
|
||||
|
||||
-- WMA ID=301 map=0 'Stormwind'
|
||||
if MTH_DS_Zones[1519] then
|
||||
MTH_DS_Zones[1519]["dbcAreaId"] = 1519
|
||||
MTH_DS_Zones[1519]["dbcMapId"] = 0
|
||||
MTH_DS_Zones[1519]["dbcName"] = "Stormwind"
|
||||
MTH_DS_Zones[1519]["worldBounds"] = {
|
||||
["left"] = 1722.92,
|
||||
["right"] = -14.58,
|
||||
["top"] = -7995.8301,
|
||||
["bottom"] = -9154.1699,
|
||||
}
|
||||
end
|
||||
|
||||
-- WMA ID=321 map=1 'Ogrimmar'
|
||||
if MTH_DS_Zones[1637] then
|
||||
MTH_DS_Zones[1637]["dbcAreaId"] = 1637
|
||||
MTH_DS_Zones[1637]["dbcMapId"] = 1
|
||||
MTH_DS_Zones[1637]["dbcName"] = "Ogrimmar"
|
||||
MTH_DS_Zones[1637]["worldBounds"] = {
|
||||
["left"] = -3680.6001,
|
||||
["right"] = -5083.21,
|
||||
["top"] = 2273.8799,
|
||||
["bottom"] = 1338.46,
|
||||
}
|
||||
end
|
||||
|
||||
-- WMA ID=362 map=1 'ThunderBluff'
|
||||
if MTH_DS_Zones[1638] then
|
||||
MTH_DS_Zones[1638]["dbcAreaId"] = 1638
|
||||
MTH_DS_Zones[1638]["dbcMapId"] = 1
|
||||
MTH_DS_Zones[1638]["dbcName"] = "ThunderBluff"
|
||||
MTH_DS_Zones[1638]["worldBounds"] = {
|
||||
["left"] = 516.67,
|
||||
["right"] = -527.08,
|
||||
["top"] = -850.0,
|
||||
["bottom"] = -1545.83,
|
||||
}
|
||||
end
|
||||
|
||||
-- WMA ID=381 map=1 'Darnassis'
|
||||
if MTH_DS_Zones[1657] then
|
||||
MTH_DS_Zones[1657]["dbcAreaId"] = 1657
|
||||
MTH_DS_Zones[1657]["dbcMapId"] = 1
|
||||
MTH_DS_Zones[1657]["dbcName"] = "Darnassis"
|
||||
MTH_DS_Zones[1657]["worldBounds"] = {
|
||||
["left"] = 2938.3601,
|
||||
["right"] = 1880.03,
|
||||
["top"] = 10238.3203,
|
||||
["bottom"] = 9532.5898,
|
||||
}
|
||||
end
|
||||
|
||||
-- WMA ID=382 map=0 'Undercity'
|
||||
if MTH_DS_Zones[1497] then
|
||||
MTH_DS_Zones[1497]["dbcAreaId"] = 1497
|
||||
MTH_DS_Zones[1497]["dbcMapId"] = 0
|
||||
MTH_DS_Zones[1497]["dbcName"] = "Undercity"
|
||||
MTH_DS_Zones[1497]["worldBounds"] = {
|
||||
["left"] = 873.19,
|
||||
["right"] = -86.18,
|
||||
["top"] = 1877.95,
|
||||
["bottom"] = 1237.84,
|
||||
}
|
||||
end
|
||||
|
||||
-- WMA ID=509 map=0 'AlahThalas'
|
||||
if MTH_DS_Zones[2040] then
|
||||
MTH_DS_Zones[2040]["dbcAreaId"] = 2040
|
||||
MTH_DS_Zones[2040]["dbcMapId"] = 0
|
||||
MTH_DS_Zones[2040]["dbcName"] = "AlahThalas"
|
||||
MTH_DS_Zones[2040]["worldBounds"] = {
|
||||
["left"] = -2169.0,
|
||||
["right"] = -3637.0,
|
||||
["top"] = 4907.0,
|
||||
["bottom"] = 3931.0,
|
||||
}
|
||||
end
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,8 @@
|
||||
<Include file="..\api\options-autobuy.lua"/>
|
||||
<Include file="..\api\options-autoquest.lua"/>
|
||||
<Include file="..\api\options-icu.lua"/>
|
||||
<Include file="..\api\profile.lua"/>
|
||||
<Include file="..\api\options-profiles.lua"/>
|
||||
<Include file="..\api\options-shell.lua"/>
|
||||
<Include file="..\api\options-zbuttons.lua"/>
|
||||
<Include file="..\api\options-feedomatic.lua"/>
|
||||
@@ -29,6 +31,7 @@
|
||||
<Include file="..\api\hunterbook-tab-npcfinder.lua"/>
|
||||
<Include file="..\api\hunterbook-tab-stable.lua"/>
|
||||
<Include file="..\api\hunterbook-tab-pethistory.lua"/>
|
||||
<Include file="..\api\hunterbook-model-viewer.lua"/>
|
||||
<Include file="..\api\map-markers.lua"/>
|
||||
<Include file="..\api\core-framework.lua"/>
|
||||
<Include file="..\api\core-scan-stablemaster.lua"/>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
local MTH_AutoBuy = {
|
||||
name = "autobuy",
|
||||
enabled = false,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"VARIABLES_LOADED",
|
||||
"MERCHANT_SHOW",
|
||||
@@ -140,12 +140,9 @@ function MTH_AutoBuy:onEvent(event)
|
||||
return
|
||||
end
|
||||
|
||||
AB_Log("onEvent event=" .. tostring(event) .. " module.enabled=" .. tostring(self.enabled), "debug")
|
||||
|
||||
if event == "VARIABLES_LOADED" then
|
||||
engine:Init()
|
||||
AB_SetBridgeActive(self.enabled and true or false)
|
||||
AB_Log("onEvent VARIABLES_LOADED -> engine init", "debug")
|
||||
local store = engine:EnsureDefaults()
|
||||
AB_Trace("VARIABLES_LOADED module.enabled=" .. tostring(self.enabled)
|
||||
.. " store.enabled=" .. tostring(store and store.enabled)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
local MTH_AutoQuest = {
|
||||
name = "autoquest",
|
||||
enabled = false,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"GOSSIP_SHOW",
|
||||
"QUEST_GREETING",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
local MTH_ChronometerModule = {
|
||||
name = "chronometer",
|
||||
enabled = true,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {},
|
||||
initialized = false,
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ FOM_RealmPlayer = nil;
|
||||
FOM_LastPetName = nil;
|
||||
FOM_LastFeedAttempt = nil;
|
||||
FOM_TRACE_ENABLED = false;
|
||||
local FOM_CORE_ATTEMPT_TRACKING_ENABLED = false;
|
||||
local FOM_CORE_ATTEMPT_TRACKING_ENABLED = true;
|
||||
local FOM_PERF_TRACE_ENABLED = false;
|
||||
local FOM_PERF_TRACE_HISTORY_LIMIT = 80;
|
||||
local FOM_PERF_TRACE_SPIKE_MS = 12;
|
||||
@@ -126,7 +126,10 @@ FOM_FamilyToLegacyMap = {
|
||||
};
|
||||
|
||||
local function FOM_Trace(message)
|
||||
return;
|
||||
if not FOM_TRACE_ENABLED then return; end
|
||||
if type(DEFAULT_CHAT_FRAME) == "table" and DEFAULT_CHAT_FRAME.AddMessage then
|
||||
DEFAULT_CHAT_FRAME:AddMessage("|cffffff00[FOM-Trace]|r " .. tostring(message));
|
||||
end
|
||||
end
|
||||
|
||||
local function FOM_PerfNowMs()
|
||||
@@ -1301,6 +1304,7 @@ function FOM_OnUpdate(elapsed)
|
||||
.. " pet='" .. tostring(FOM_LastFeedAttempt.petName or "")
|
||||
.. "' elapsed=" .. string.format("%.2f", elapsedSinceFeed));
|
||||
FOM_LastFeedAttempt = nil;
|
||||
FOM_LastFood = nil;
|
||||
elseif (elapsedSinceFeed >= 2.50) then
|
||||
local failedAttempt = FOM_LastFeedAttempt;
|
||||
if (FOM_LastFeedAttempt.coreAttemptId and type(MTH_FEED_RecordBuffOutcome) == "function") then
|
||||
@@ -1952,6 +1956,7 @@ function FOM_ChatCommandHandler(msg)
|
||||
if ( cmd == "add" ) then
|
||||
for _, food in inputFoods do
|
||||
local foodID = FOM_IDFromLink(food);
|
||||
FOM_ClearItemBans(foodID);
|
||||
if ( FOM_AddFood(diet, tonumber(foodID)) ) then
|
||||
GFWUtils.Print("Added "..food.." to "..GFWUtils.Hilite(capDiet).." list.");
|
||||
else
|
||||
@@ -2011,6 +2016,12 @@ function FOM_AddFood(diet, food)
|
||||
return false;
|
||||
end
|
||||
else
|
||||
-- Item is in the base list; clear it from RemovedFoods if present so it isn't banned
|
||||
if (FOM_RemovedFoods and FOM_RemovedFoods[diet] and GFWTable.IndexOf(FOM_RemovedFoods[diet], food) ~= 0) then
|
||||
table.remove( FOM_RemovedFoods[diet], GFWTable.IndexOf(FOM_RemovedFoods[diet], food) );
|
||||
table.sort( FOM_RemovedFoods[diet] );
|
||||
return true;
|
||||
end
|
||||
return false;
|
||||
end
|
||||
|
||||
@@ -2018,7 +2029,7 @@ end
|
||||
|
||||
-- Remove a food from a list
|
||||
function FOM_RemoveFood(diet, food)
|
||||
|
||||
|
||||
if (FOM_Foods[diet] == nil) then
|
||||
GFWUtils.DebugLog("FOM_Foods[diet] == nil");
|
||||
end
|
||||
@@ -2057,6 +2068,42 @@ function FOM_RemoveFood(diet, food)
|
||||
|
||||
end
|
||||
|
||||
-- Clear quarantine, core exception blocks, and RemovedFoods ban for a specific item (called when user explicitly re-adds via /fom add)
|
||||
local function FOM_ClearItemBans(itemID)
|
||||
local numericItem = tonumber(itemID);
|
||||
if (numericItem == nil) then return; end
|
||||
-- Clear from RemovedFoods across all diet lists
|
||||
if (type(FOM_RemovedFoods) == "table") then
|
||||
for diet, list in FOM_RemovedFoods do
|
||||
if (type(list) == "table") then
|
||||
local idx = GFWTable.IndexOf(list, numericItem);
|
||||
if (idx ~= 0) then
|
||||
table.remove(list, idx);
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Clear FOM quarantine (all families)
|
||||
local store = FOM_EnsureQuarantineStore();
|
||||
if (type(store) == "table" and type(store.byFamily) == "table") then
|
||||
for _, byItem in store.byFamily do
|
||||
if (type(byItem) == "table") then
|
||||
byItem[numericItem] = nil;
|
||||
end
|
||||
end
|
||||
end
|
||||
-- Clear core exception/block
|
||||
if (type(MTH_FEED_GetStore) == "function") then
|
||||
local coreStore = MTH_FEED_GetStore();
|
||||
if (coreStore and coreStore.exceptions and type(coreStore.exceptions.byItemId) == "table") then
|
||||
coreStore.exceptions.byItemId[numericItem] = nil;
|
||||
coreStore.exceptions.byItemId[tostring(numericItem)] = nil;
|
||||
end
|
||||
end
|
||||
-- Invalidate precompute cache so next feed re-scans
|
||||
FOM_FEED_SCAN_CACHE = nil;
|
||||
end
|
||||
|
||||
function FOM_IsBGActive()
|
||||
local bgNum = 1;
|
||||
local status;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
local MTH_FeedOMatic = {
|
||||
name = "feedomatic",
|
||||
enabled = false,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"VARIABLES_LOADED",
|
||||
"MERCHANT_SHOW",
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
local MTH_ICU = {
|
||||
name = "icu",
|
||||
enabled = false,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"VARIABLES_LOADED",
|
||||
},
|
||||
|
||||
@@ -137,17 +137,23 @@ end
|
||||
|
||||
local function MTHSmartAmmo_ForceHookGlobals()
|
||||
if type(MTHSmartAmmo_CastSpell_Hook) == "function" and CastSpell ~= MTHSmartAmmo_CastSpell_Hook then
|
||||
MTH_SA_CastSpell = CastSpell
|
||||
CastSpell = MTHSmartAmmo_CastSpell_Hook
|
||||
end
|
||||
if type(MTHSmartAmmo_UseAction_Hook) == "function" and UseAction ~= MTHSmartAmmo_UseAction_Hook then
|
||||
MTH_SA_UseAction = UseAction
|
||||
UseAction = MTHSmartAmmo_UseAction_Hook
|
||||
end
|
||||
if type(MTHSmartAmmo_CastSpellByName_Hook) == "function" and CastSpellByName ~= MTHSmartAmmo_CastSpellByName_Hook then
|
||||
MTH_SA_CastSpellByName = CastSpellByName
|
||||
CastSpellByName = MTHSmartAmmo_CastSpellByName_Hook
|
||||
end
|
||||
if CastSpell == MTHSmartAmmo_OriginalCastSpell or MTH_SA_CastSpell == nil then
|
||||
MTH_SA_CastSpell = CastSpell
|
||||
CastSpell = MTHSmartAmmo_CastSpell_Hook
|
||||
end
|
||||
end
|
||||
if type(MTHSmartAmmo_UseAction_Hook) == "function" and UseAction ~= MTHSmartAmmo_UseAction_Hook then
|
||||
if UseAction == MTHSmartAmmo_OriginalUseAction or MTH_SA_UseAction == nil then
|
||||
MTH_SA_UseAction = UseAction
|
||||
UseAction = MTHSmartAmmo_UseAction_Hook
|
||||
end
|
||||
end
|
||||
if type(MTHSmartAmmo_CastSpellByName_Hook) == "function" and CastSpellByName ~= MTHSmartAmmo_CastSpellByName_Hook then
|
||||
if CastSpellByName == MTHSmartAmmo_OriginalCastSpellByName or MTH_SA_CastSpellByName == nil then
|
||||
MTH_SA_CastSpellByName = CastSpellByName
|
||||
CastSpellByName = MTHSmartAmmo_CastSpellByName_Hook
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
MTH_SA = {}
|
||||
@@ -423,13 +429,6 @@ local MTH_SA_OnUpdateElapsed = 0
|
||||
frame:SetScript("OnUpdate", function()
|
||||
local dt = arg1 or 0
|
||||
MTHSmartAmmo_HookEnsureElapsed = MTHSmartAmmo_HookEnsureElapsed + dt
|
||||
if MTHSmartAmmo_HookEnsureElapsed >= 0.5 then
|
||||
MTHSmartAmmo_HookEnsureElapsed = 0
|
||||
if MTH_SA_IsModuleEnabled() then
|
||||
MTHSmartAmmo_InitializeHooks()
|
||||
end
|
||||
end
|
||||
|
||||
MTH_SA_OnUpdateElapsed = MTH_SA_OnUpdateElapsed + dt
|
||||
if MTH_SA_OnUpdateElapsed < 0.10 then
|
||||
return
|
||||
@@ -463,11 +462,10 @@ function MTH_SA_CountEquippedAmmo()
|
||||
local ammo = GetInventoryItemCount("player", 0)
|
||||
local equippedName = MTH_SA_GetEquippedAmmoName()
|
||||
if equippedName and equippedName ~= "" then
|
||||
MTH_SA_LastKnownEquippedName = equippedName
|
||||
end
|
||||
if not ammo then
|
||||
MTH_SA_Quantity=0
|
||||
return
|
||||
if equippedName ~= MTH_SA_LastKnownEquippedName then
|
||||
MTH_SA_LastKnownEquippedName = equippedName
|
||||
MTHSmartAmmo_RefreshAmmoButtonDisplay()
|
||||
end
|
||||
elseif ammo ~= MTH_SA_Quantity then
|
||||
MTH_SA_Quantity = ammo
|
||||
end
|
||||
@@ -663,12 +661,15 @@ MTHSmartAmmo_UseAction_Hook = function(slot, checkCursor, onSelf)
|
||||
end
|
||||
MTHSmartAmmo_InUseActionHook = true
|
||||
|
||||
if not GetActionText(slot) and MTHSmartAmmo_IsSmartEnabled() then
|
||||
local _actionText = GetActionText(slot)
|
||||
local _smart = MTHSmartAmmo_IsSmartEnabled()
|
||||
if not _actionText and _smart then
|
||||
MTH_SA_Tooltip:SetOwner(UIParent, "ANCHOR_NONE")
|
||||
MTH_SA_Tooltip:SetAction(slot)
|
||||
local name = MTH_SA_TooltipTextLeft1:GetText()
|
||||
MTH_SA_LastSpell = name
|
||||
if name and MTH_AMMO_JUNKSHOT_SET and MTH_AMMO_JUNKSHOT_SET[name] then
|
||||
local _inSet = name and MTH_AMMO_JUNKSHOT_SET and MTH_AMMO_JUNKSHOT_SET[name]
|
||||
if _inSet then
|
||||
if MTH_SA_Check() or MTH_SA_FindAmmo() then
|
||||
MTH_SA_EquipAmmo(1)
|
||||
end
|
||||
@@ -724,19 +725,29 @@ MTHSmartAmmo_InitializeHooks = function()
|
||||
return
|
||||
end
|
||||
|
||||
if CastSpell ~= MTHSmartAmmo_CastSpell_Hook then
|
||||
MTH_SA_CastSpell = CastSpell
|
||||
CastSpell = MTHSmartAmmo_CastSpell_Hook
|
||||
end
|
||||
-- Only install a hook if vanilla is on top (first-time install) or MetaHunt
|
||||
-- is already on top. If another addon (e.g. Quiver) is on top, it has already
|
||||
-- captured MetaHunt's hook as its super — reinstalling would create a double
|
||||
-- invocation and break addons that rely on IsCurrentAction after their super call.
|
||||
if CastSpell ~= MTHSmartAmmo_CastSpell_Hook then
|
||||
if CastSpell == MTHSmartAmmo_OriginalCastSpell or MTH_SA_CastSpell == nil then
|
||||
MTH_SA_CastSpell = CastSpell
|
||||
CastSpell = MTHSmartAmmo_CastSpell_Hook
|
||||
end
|
||||
end
|
||||
|
||||
if UseAction ~= MTHSmartAmmo_UseAction_Hook then
|
||||
MTH_SA_UseAction = UseAction
|
||||
UseAction = MTHSmartAmmo_UseAction_Hook
|
||||
end
|
||||
if UseAction ~= MTHSmartAmmo_UseAction_Hook then
|
||||
if UseAction == MTHSmartAmmo_OriginalUseAction or MTH_SA_UseAction == nil then
|
||||
MTH_SA_UseAction = UseAction
|
||||
UseAction = MTHSmartAmmo_UseAction_Hook
|
||||
end
|
||||
end
|
||||
|
||||
if CastSpellByName ~= MTHSmartAmmo_CastSpellByName_Hook then
|
||||
MTH_SA_CastSpellByName = CastSpellByName
|
||||
CastSpellByName = MTHSmartAmmo_CastSpellByName_Hook
|
||||
if CastSpellByName ~= MTHSmartAmmo_CastSpellByName_Hook then
|
||||
if CastSpellByName == MTHSmartAmmo_OriginalCastSpellByName or MTH_SA_CastSpellByName == nil then
|
||||
MTH_SA_CastSpellByName = CastSpellByName
|
||||
CastSpellByName = MTHSmartAmmo_CastSpellByName_Hook
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@ MTH_SA_MANAGED_HOOKS = true
|
||||
local MTH_SmartAmmo = {
|
||||
name = "smartammo",
|
||||
enabled = true,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"VARIABLES_LOADED",
|
||||
-- PLAYER_ENTERING_WORLD handled by engine's own frame
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
local MTH_Tooltips = {
|
||||
name = "tooltips",
|
||||
enabled = true,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"UPDATE_MOUSEOVER_UNIT",
|
||||
"UNIT_NAME_UPDATE",
|
||||
|
||||
@@ -8,7 +8,7 @@ MTH_ZH_MANAGED_HOOKS = true
|
||||
local MTH_ZHunter = {
|
||||
name = "zhunter",
|
||||
enabled = true,
|
||||
version = "1.2.0",
|
||||
version = "1.3.0",
|
||||
events = {
|
||||
"VARIABLES_LOADED",
|
||||
-- PLAYER_ENTERING_WORLD handled by bootstrap frame + adjustment frames
|
||||
|
||||
Reference in New Issue
Block a user