From c0c2c275eb9fb454eb6937d286336ff24aedece1 Mon Sep 17 00:00:00 2001 From: DuvelCorp Date: Wed, 11 Mar 2026 00:40:35 +0100 Subject: [PATCH] v1.2.0 --- CHANGELOG.md | 15 + MetaHunt.toc | 2 +- api/AntiDaze.lua | 6 +- api/AutoStrip.lua | 4 +- api/constants.lua | 2 +- api/core-feed-tracking.lua | 48 +- api/core-framework.lua | 107 +- api/core-scan-beasttraining.lua | 20 +- api/core-scan-spellbookpet.lua | 2 +- api/core-scan-stablemaster.lua | 110 +- api/core.lua | 66 +- api/debug-frame.lua | 12 +- api/hunterbook-tab-stable.lua | 2 +- api/hunterbook.lua | 36 +- api/localization.lua | 1 - api/map-markers.lua | 2 +- api/minimap-button.lua | 55 +- api/options-autobuy.lua | 70 +- api/options-autoquest.lua | 24 +- api/options-chronometer.lua | 67 +- api/options-feedomatic.lua | 38 +- api/options-icu.lua | 56 +- api/options-zbuttons.lua | 258 +- api/options.lua | 6 +- api/uirenderer.lua | 15 +- api/version-check.lua | 10 +- data/ds-zones.lua | 1052 -------- modules/autobuy/module.lua | 8 +- modules/autoquest/module.lua | 89 +- modules/chronometer/engine.lua | 54 +- .../libs/CandyBar-2.0/CandyBar-2.0.lua | 1 - modules/chronometer/module.lua | 2 +- modules/feedomatic/FeedOMatic.lua | 51 +- modules/feedomatic/localization.lua | 128 +- modules/feedomatic/module.lua | 34 +- modules/feedomatic/runtime.xml | 4 +- modules/icu/MTH_ICU.lua | 2254 ++++++++-------- modules/icu/module.lua | 2 +- modules/smartammo/engine.lua | 1564 ++++++------ modules/smartammo/module.lua | 4 +- modules/tooltips/module.lua | 29 +- modules/zhunter/ZHunterMod.lua | 434 ++-- modules/zhunter/ZSpellButtonTemplate.lua | 1580 ++++++------ modules/zhunter/module.lua | 56 +- modules/zhunter/zButtonAmmo.lua | 2262 +++++++++-------- modules/zhunter/zButtonAspect.lua | 782 +++--- modules/zhunter/zButtonCompanions.lua | 20 +- modules/zhunter/zButtonMounts.lua | 20 +- modules/zhunter/zButtonPet.lua | 1308 +++++----- modules/zhunter/zButtonRanged.lua | 22 +- modules/zhunter/zButtonToys.lua | 20 +- modules/zhunter/zButtonTrack.lua | 820 +++--- modules/zhunter/zButtonTrap.lua | 558 ++-- 53 files changed, 6668 insertions(+), 7524 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 95b95ee..7807422 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,21 @@ All notable changes to MetaHunt will be documented in this file. +## [1.2.0] - 2026-03-10 + +### Added +- Added keybinding text overlay on zButtons: parent and child buttons now display their bound key for the 5 bindable sets (Aspect, Track, Trap, Ammo, Pet). +- Added "Expand on Hover" option for zButton children: when enabled, hovering over the parent button automatically expands children (instead of requiring right-click). +- Added "Auto-Hide Timer" option for zButton children: a configurable 0–10 second timer that automatically collapses expanded children after the mouse leaves the button group. Timer resets while hovering any button in the group. + +### Fixed +- Fixed SavedVariables data loss on login caused by initialization race condition overwriting persisted data. +- Fixed SavedVariables bloat by adding a migration that strips redundant default-valued keys on first load. +- Fixed six performance issues including throttling high-frequency event handlers, caching repeated `getglobal` lookups, and reducing unnecessary table allocations in hot paths. +- Cleaned up ICU module global variable leaks by properly scoping locals. +- Standardized all remaining `SetScript` handler patterns to use the WoW 1.12 `this`-based convention consistently. + + ## [1.1.0] - 2026-03-09 ### Added diff --git a/MetaHunt.toc b/MetaHunt.toc index e20a2fe..cea76fc 100644 --- a/MetaHunt.toc +++ b/MetaHunt.toc @@ -1,5 +1,5 @@ ## Interface: 11200 -## Version: 1.1.0 +## Version: 1.2.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. diff --git a/api/AntiDaze.lua b/api/AntiDaze.lua index a8cd08a..5d62cd1 100644 --- a/api/AntiDaze.lua +++ b/api/AntiDaze.lua @@ -98,7 +98,7 @@ local function AntiDaze_CancelRelevantAspect(isSelfDazed) AntiDazeTooltip:SetOwner(UIParent, "ANCHOR_NONE") AntiDazeTooltip:SetPlayerBuff(i, "HELPFUL") - local text = AntiDazeTooltipTextLeft1 and AntiDazeTooltipTextLeft1:GetText() + local text = MTH_AntiDazeProbeTextLeft1 and MTH_AntiDazeProbeTextLeft1:GetText() if text == packName or (isSelfDazed and text == cheetahName) then CancelPlayerBuff(i) return 1 @@ -112,8 +112,8 @@ local function AntiDaze_HandleSlash() AntiDaze_SetEnabled(not AntiDaze_IsEnabled()) end -AntiDazeTooltip = CreateFrame("GameTooltip", "AntiDazeTooltip", nil, "GameTooltipTemplate") -AntiDazeFrame = CreateFrame("Frame", "AntiDazeFrame") +AntiDazeTooltip = CreateFrame("GameTooltip", "MTH_AntiDazeProbe", nil, "GameTooltipTemplate") +AntiDazeFrame = CreateFrame("Frame", "MTH_AntiDazeEvent") if AntiDazeFrame then AntiDazeFrame:RegisterEvent("VARIABLES_LOADED") AntiDazeFrame:SetScript("OnEvent", function() diff --git a/api/AutoStrip.lua b/api/AutoStrip.lua index 780d1f1..f0642d9 100644 --- a/api/AutoStrip.lua +++ b/api/AutoStrip.lua @@ -112,7 +112,7 @@ end local function AutoStrip_QueueDeferredRestore(reason) if not AutoStrip_RestoreFrame then - AutoStrip_RestoreFrame = CreateFrame("Frame", "AutoStripRestoreFrame") + AutoStrip_RestoreFrame = CreateFrame("Frame", "MTH_AutoStripRestore") if not AutoStrip_RestoreFrame then return end @@ -316,7 +316,7 @@ local function AutoStrip_HandleSlash(msg) end end -AutoStrip_Frame = CreateFrame("Frame", "AutoStripFrame") +AutoStrip_Frame = CreateFrame("Frame", "MTH_AutoStripEvent") if AutoStrip_Frame then AutoStrip_Frame:RegisterEvent("VARIABLES_LOADED") AutoStrip_Frame:RegisterEvent("PLAYER_REGEN_DISABLED") diff --git a/api/constants.lua b/api/constants.lua index fdf66ca..93da6aa 100644 --- a/api/constants.lua +++ b/api/constants.lua @@ -1,5 +1,5 @@ MTH_CONST = MTH_CONST or {} -MTH_CONST.version = MTH_CONST.version or "1.1.0" +MTH_CONST.version = MTH_CONST.version or "1.2.0" MTH_CONST.WEAPON_TYPES = { BOWS = "Bows", diff --git a/api/core-feed-tracking.lua b/api/core-feed-tracking.lua index f3feb06..f15689a 100644 --- a/api/core-feed-tracking.lua +++ b/api/core-feed-tracking.lua @@ -460,6 +460,7 @@ local function MTH_FEED_CoreTrackerOnEvent() end elseif evt == "BAG_UPDATE" then MTH_FEED_IndexBagFoods() + MTH_FEED_InvalidateDietMapCache() elseif evt == "CHAT_MSG_SPELL_PERIODIC_SELF_BUFFS" then if MTH_FEED_ActiveCoreAttemptId and MTH_FEED_HasPetFeedBuff() then MTH_FEED_Trace("Core tracker buff event confirms acceptance") @@ -468,7 +469,32 @@ local function MTH_FEED_CoreTrackerOnEvent() end end +local MTH_FEED_CoreTrackerUpdateElapsed = 0 +local MTH_FEED_LastStaleCleanupAt = 0 + local function MTH_FEED_CoreTrackerOnUpdate() + MTH_FEED_CoreTrackerUpdateElapsed = MTH_FEED_CoreTrackerUpdateElapsed + (arg1 or 0) + if MTH_FEED_CoreTrackerUpdateElapsed < 0.10 then + return + end + MTH_FEED_CoreTrackerUpdateElapsed = 0 + + -- Periodic stale attempt cleanup (every ~30 seconds) + local now = GetTime() or 0 + if (now - MTH_FEED_LastStaleCleanupAt) >= 30 then + MTH_FEED_LastStaleCleanupAt = now + if MTH_FEED_Runtime and type(MTH_FEED_Runtime.attempts) == "table" then + for id, row in pairs(MTH_FEED_Runtime.attempts) do + if type(row) == "table" then + local age = now - (tonumber(row.startedAt) or now) + if age > 10 then + MTH_FEED_Runtime.attempts[id] = nil + end + end + end + end + end + local attemptId = MTH_FEED_ActiveCoreAttemptId if attemptId == nil then return @@ -499,7 +525,7 @@ local function MTH_FEED_EnsureTrackerFrame() if MTH_FEED_TrackerFrame then return MTH_FEED_TrackerFrame end - local frame = CreateFrame("Frame", "MTH_FeedTrackingFrame") + local frame = CreateFrame("Frame", "MTH_FeedTracking") if not frame then return nil end @@ -617,19 +643,17 @@ local function MTH_FEED_EnsureBootstrapFrame() if MTH_FEED_BootstrapFrame ~= nil then return MTH_FEED_BootstrapFrame end - local frame = CreateFrame("Frame", "MTH_FeedTrackingBootstrapFrame") + local frame = CreateFrame("Frame", "MTH_FeedTrackingBoot") if not frame then return nil end frame:RegisterEvent("VARIABLES_LOADED") frame:RegisterEvent("PLAYER_LOGIN") frame:RegisterEvent("PLAYER_ENTERING_WORLD") - frame:SetScript("OnEvent", function(self) + frame:SetScript("OnEvent", function() MTH_FEED_ReinstallCoreTracking() - if self and self.UnregisterAllEvents then - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) - end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) end) MTH_FEED_BootstrapFrame = frame return frame @@ -826,7 +850,16 @@ local function MTH_FEED_NormalizeReason(reason, rawMessage) return "unknown" end +local MTH_FEED_DietMapCache = nil + +local function MTH_FEED_InvalidateDietMapCache() + MTH_FEED_DietMapCache = nil +end + local function MTH_FEED_GetDietByItemIdMap() + if MTH_FEED_DietMapCache then + return MTH_FEED_DietMapCache + end local map = {} if type(FOM_Foods) ~= "table" then return map @@ -841,6 +874,7 @@ local function MTH_FEED_GetDietByItemIdMap() end end end + MTH_FEED_DietMapCache = map return map end diff --git a/api/core-framework.lua b/api/core-framework.lua index 77275f1..b4a8cee 100644 --- a/api/core-framework.lua +++ b/api/core-framework.lua @@ -1,5 +1,5 @@ MTH = MTH or { - version = "1.1.0", + version = "1.2.0", name = "MetaHunt", modules = {}, config = {}, @@ -44,7 +44,7 @@ local function MTH_ClassGateEnsureAnnounceFrame(self) if not self or self._classGateAnnounceFrame then return end - local frame = CreateFrame("Frame", "MTH_ClassGateAnnounceFrame") + local frame = CreateFrame("Frame", "MTH_ClassGateAnnounce") if not frame then return end @@ -55,12 +55,12 @@ local function MTH_ClassGateEnsureAnnounceFrame(self) end end) frame._mthElapsed = 0 - frame:SetScript("OnUpdate", function(self, elapsed) - self._mthElapsed = (self._mthElapsed or 0) + (elapsed or arg1 or 0) - if self._mthElapsed < 0.5 then + frame:SetScript("OnUpdate", function() + this._mthElapsed = (this._mthElapsed or 0) + (arg1 or 0) + if this._mthElapsed < 0.5 then return end - self._mthElapsed = 0 + this._mthElapsed = 0 if MTH and MTH._classGateAnnouncedChat then MTH_ClassGateClearAnnounceFrame(MTH) return @@ -192,21 +192,19 @@ end MTH:ApplyClassGate("startup") if not MTH._classGateLifecycleFrame then - local classGateFrame = CreateFrame("Frame", "MTH_ClassGateLifecycleFrame") + local classGateFrame = CreateFrame("Frame", "MTH_ClassGateLifecycle") if classGateFrame then classGateFrame:RegisterEvent("PLAYER_LOGIN") classGateFrame:RegisterEvent("PLAYER_ENTERING_WORLD") - classGateFrame:SetScript("OnEvent", function(self, eventName) - self = self or this - eventName = eventName or event - if MTH and eventName == "PLAYER_LOGIN" then + classGateFrame:SetScript("OnEvent", function() + if MTH and event == "PLAYER_LOGIN" then MTH._classGateAnnouncedChat = nil MTH._classGateAnnounced = nil MTH._classGateAnnouncePending = nil end - if MTH and MTH.ApplyClassGate and MTH:ApplyClassGate(eventName) and MTH._classGateAnnouncedChat then - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) + if MTH and MTH.ApplyClassGate and MTH:ApplyClassGate(event) and MTH._classGateAnnouncedChat then + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) end end) MTH._classGateLifecycleFrame = classGateFrame @@ -565,10 +563,10 @@ function MTH:InitEventRouter() return self._eventRouter.frame end - local frame = CreateFrame("Frame", "MTH_EventRouterFrame") - frame:SetScript("OnEvent", function(self, evt, a1, a2, a3, a4, a5, a6, a7, a8, a9) + local frame = CreateFrame("Frame", "MTH_EventRouter") + frame:SetScript("OnEvent", function() if MTH and MTH.DispatchEvent then - MTH:DispatchEvent(evt, a1, a2, a3, a4, a5, a6, a7, a8, a9) + MTH:DispatchEvent(event, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) end end) @@ -628,7 +626,7 @@ function MTH:_SetModuleEventSubscriptions(name, enabled) end end -function MTH:DispatchEvent(evt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) +function MTH:DispatchEvent(evt, ea1, ea2, ea3, ea4, ea5, ea6, ea7, ea8, ea9) for name, module in pairs(self.modules) do if module.enabled and module.onEvent then local allow = true @@ -637,11 +635,10 @@ function MTH:DispatchEvent(evt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, end if allow then local ok, err = pcall(function() - module:onEvent(evt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) + module:onEvent(evt, ea1, ea2, ea3, ea4, ea5, ea6, ea7, ea8, ea9) end) if not ok then - self:Print("Module '" .. name .. "' event error on '" .. tostring(evt) .. "': " .. tostring(err)) - MTH:Print("[MTH] Module event error (" .. name .. ", " .. tostring(evt) .. "): " .. tostring(err), "error") + MTH:Print("Module '" .. name .. "' event error on '" .. tostring(evt) .. "': " .. tostring(err), "error") end end end @@ -1295,24 +1292,22 @@ function MTH:EnsureModuleStateBootstrap() return self._moduleStateBootstrapFrame end - local frame = CreateFrame("Frame", "MTH_ModuleStateBootstrapFrame") + local frame = CreateFrame("Frame", "MTH_ModuleBootstrap") if not frame then return nil end frame:RegisterEvent("VARIABLES_LOADED") - frame:SetScript("OnEvent", function(self, eventName) - self = self or this - eventName = eventName or event - if eventName ~= "VARIABLES_LOADED" then + frame:SetScript("OnEvent", function() + if event ~= "VARIABLES_LOADED" then return end if MTH and MTH.ApplyPersistedModuleStates then MTH:ApplyPersistedModuleStates("VARIABLES_LOADED") end - if not self then return end - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) + if not this then return end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) end) self._moduleStateBootstrapFrame = frame @@ -1490,6 +1485,46 @@ function MTH:AnnounceLoadComplete() "Addon synced. Your threat meter just sent a stress signal.", "Loaded cleanly. Reputation with healers currently in freefall.", "Mission start: hit things from far away and deny everything in chat.", + "Welcome back. Your pet missed you. Just kidding, it ran away.", + "MetaHunt loaded. You're still a Huntard, but now you're an organized one.", + "Aspects, traps, tracking... Don't worry, I'll handle the hard parts.", + "Oh good, another hunter who needs an addon to remember their own spells.", + "MetaHunt ready. Feign Death is not a personality trait.", + "Loaded successfully. No, I can't fix your DPS.", + "Welcome. Your pet's loyalty is higher than your raid attendance.", + "MetaHunt online. Please don't Multishot the sheep.", + "Greetings, hunter. I see you've chosen the 'easy' class and still need help.", + "All systems go. Try not to pull the entire dungeon this time.", + "MetaHunt activated. Reminder: Melee range is not your home.", + "Welcome back. Your ammo count is almost as low as your situational awareness.", + "Loaded. I'll manage your buttons since you clearly have too many.", + "MetaHunt ready. Aspect of the Cheetah in dungeons is a choice, not a strategy.", + "Oh look, a hunter that uses addons. There might be hope for you yet.", + "Welcome. No, you cannot tame that. Or that. Stop asking.", + "MetaHunt standing by. Unlike you during your last Feign Death.", + "Initialized. Fun fact: your pet has more utility than you do.", + "All buttons configured. Now if only I could configure your aim.", + "MetaHunt loaded. Growl is off, right? ...RIGHT?", + "MetaHunt loaded. Your Freezing Trap will still break early. That's on you.", + "Welcome. Aspect of the Pack is ready. Your group is not.", + "Initializing... unlike your pet, I actually come when called.", + "MetaHunt online. Remember: Hunter loot is everything. Everything.", + "Loaded. Concussive Shot the flag carrier, not the rogue vanishing.", + "Welcome back. Eyes of the Beast is not a valid boss strategy.", + "Ready. Your Aimed Shot takes longer to cast than this addon took to load.", + "MetaHunt armed. Scatter Shot into Freezing Trap — you'll get it right someday.", + "Online. Don't worry, I track your cooldowns since you clearly don't.", + "Welcome. Wing Clip and run. It's what you do best.", + "Loaded. Distracting Shot is for the boss, not for your ego.", + "MetaHunt ready. Your quiver is full but your skill bar is empty.", + "Initialized. Serpent Sting on every target doesn't make you a DoT class.", + "Welcome, hunter. Viper Sting the healer. No, the OTHER healer.", + "Ready to hunt. Mend Pet is not optional, it's a lifestyle.", + "MetaHunt loaded. Tranquilizing Shot the enrage, not the warrior.", + "Online. Rapid Fire is a cooldown, not your approach to pulling.", + "Welcome. You have 28 arrows left. Should've checked before the raid.", + "Loaded. Bestial Wrath does not make YOU immune. Learned that yet?", + "MetaHunt standing by. Dead zone? What dead zone? Oh... that dead zone.", } local welcomeIndex = 1 @@ -1520,24 +1555,22 @@ function MTH:EnsureLoadCompleteAnnouncement() return self._loadCompleteFrame end - local frame = CreateFrame("Frame", "MTH_LoadCompleteAnnounceFrame") + local frame = CreateFrame("Frame", "MTH_LoadAnnounce") if not frame then return nil end frame:RegisterEvent("PLAYER_ENTERING_WORLD") - frame:SetScript("OnEvent", function(self, eventName) - self = self or this - eventName = eventName or event - if eventName ~= "PLAYER_ENTERING_WORLD" then + frame:SetScript("OnEvent", function() + if event ~= "PLAYER_ENTERING_WORLD" then return end if MTH and MTH.AnnounceLoadComplete then MTH:AnnounceLoadComplete() end - if not self then return end - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) + if not this then return end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) end) self._loadCompleteFrame = frame diff --git a/api/core-scan-beasttraining.lua b/api/core-scan-beasttraining.lua index 63eb591..bae2bbd 100644 --- a/api/core-scan-beasttraining.lua +++ b/api/core-scan-beasttraining.lua @@ -802,7 +802,7 @@ function MTH_PT_InitService() if MTH_PetTrainingFrame then return end - MTH_PetTrainingFrame = CreateFrame("Frame", "MTHPetTrainingScanFrame") + MTH_PetTrainingFrame = CreateFrame("Frame", "MTH_PetTrainingScan") MTH_PetTrainingFrame:RegisterEvent("PLAYER_ENTERING_WORLD") MTH_PetTrainingFrame:RegisterEvent("LEARNED_SPELL_IN_TAB") MTH_PetTrainingFrame:RegisterEvent("PET_TRAINING_SHOW") @@ -813,9 +813,8 @@ function MTH_PT_InitService() MTH_PetTrainingFrame:RegisterEvent("CRAFT_SHOW") MTH_PetTrainingFrame:RegisterEvent("CRAFT_UPDATE") MTH_PetTrainingFrame:SetScript("OnEvent", MTH_PT_OnEvent) - MTH_PetTrainingFrame:SetScript("OnUpdate", function(_, elapsed) - elapsed = elapsed or arg1 - MTH_PT_PetBookPollElapsed = (MTH_PT_PetBookPollElapsed or 0) + (elapsed or 0) + MTH_PetTrainingFrame:SetScript("OnUpdate", function() + MTH_PT_PetBookPollElapsed = (MTH_PT_PetBookPollElapsed or 0) + (arg1 or 0) if MTH_PT_PetBookPollElapsed < 0.20 then return end @@ -861,19 +860,16 @@ function MTH_PT_InitBootstrap() end frame:RegisterEvent("PET_TRAINING_SHOW") frame:RegisterEvent("CRAFT_SHOW") - frame:SetScript("OnEvent", function(self, evt) - evt = evt or event - if evt ~= "PET_TRAINING_SHOW" and evt ~= "CRAFT_SHOW" then + frame:SetScript("OnEvent", function() + if event ~= "PET_TRAINING_SHOW" and event ~= "CRAFT_SHOW" then return end MTH_PT_InitService() if type(MTH_PT_OnEvent) == "function" then - MTH_PT_OnEvent(MTH_PetTrainingFrame, evt) - end - if self and self.UnregisterAllEvents then - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) + MTH_PT_OnEvent(MTH_PetTrainingFrame, event) end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) MTH_PT_BootstrapFrame = nil end) MTH_PT_BootstrapFrame = frame diff --git a/api/core-scan-spellbookpet.lua b/api/core-scan-spellbookpet.lua index e75a1be..3a4007d 100644 --- a/api/core-scan-spellbookpet.lua +++ b/api/core-scan-spellbookpet.lua @@ -331,7 +331,7 @@ function MTH_PS_InitService() return end - MTH_PS_Frame = CreateFrame("Frame", "MTHPetSpellbookEventFrame") + MTH_PS_Frame = CreateFrame("Frame", "MTH_PetSpellbookEvent") MTH_PS_Frame:RegisterEvent("PLAYER_ENTERING_WORLD") MTH_PS_Frame:RegisterEvent("UNIT_PET") MTH_PS_Frame:RegisterEvent("PET_BAR_UPDATE") diff --git a/api/core-scan-stablemaster.lua b/api/core-scan-stablemaster.lua index 8a8572f..00c50e5 100644 --- a/api/core-scan-stablemaster.lua +++ b/api/core-scan-stablemaster.lua @@ -179,7 +179,7 @@ local function MTH_ST_EnsureDiagCopyFrame() if MTH_ST_DiagCopyFrame then return MTH_ST_DiagCopyFrame end - local frame = CreateFrame("Frame", "MTHStableDiagCopyFrame", UIParent) + local frame = CreateFrame("Frame", "MTH_StableDiagCopy", UIParent) if not frame then return nil end @@ -219,11 +219,11 @@ local function MTH_ST_EnsureDiagCopyFrame() copyButton:SetHeight(24) copyButton:SetText("Select All") - local scrollFrame = CreateFrame("ScrollFrame", "MTHStableDiagCopyScroll", frame, "UIPanelScrollFrameTemplate") + local scrollFrame = CreateFrame("ScrollFrame", "MTH_StableDiagScroll", frame, "UIPanelScrollFrameTemplate") scrollFrame:SetPoint("TOPLEFT", frame, "TOPLEFT", 16, -48) scrollFrame:SetPoint("BOTTOMRIGHT", frame, "BOTTOMRIGHT", -36, 44) - local editBox = CreateFrame("EditBox", "MTHStableDiagCopyText", scrollFrame) + local editBox = CreateFrame("EditBox", "MTH_StableDiagText", scrollFrame) editBox:SetMultiLine(true) editBox:SetMaxLetters(999999) editBox:SetFont("Fonts\\FRIZQT__.TTF", 11, "") @@ -255,13 +255,13 @@ local function MTH_ST_EnsureDiagCopyFrame() if UISpecialFrames then local exists = false for i = 1, table.getn(UISpecialFrames) do - if UISpecialFrames[i] == "MTHStableDiagCopyFrame" then + if UISpecialFrames[i] == "MTH_StableDiagCopy" then exists = true break end end if not exists then - table.insert(UISpecialFrames, "MTHStableDiagCopyFrame") + table.insert(UISpecialFrames, "MTH_StableDiagCopy") end end return frame @@ -2494,15 +2494,6 @@ function MTH_PETS_GetRootStore() end local pets = MTH_CharSavedVariables.MTH_Pets - if pets._betaFreshStoreApplied ~= 1 then - pets.petTraining = {} - pets.trainScan = {} - pets.stableScan = {} - pets.currentPet = {} - pets.petStore = {} - pets._betaFreshStoreApplied = 1 - pets.updatedAt = time() - end if type(pets.petTraining) ~= "table" then pets.petTraining = {} end @@ -2519,14 +2510,53 @@ function MTH_PETS_GetRootStore() MTH_PETS_EnsureSchema(pets) MTH_PETS_EnsurePetTrainingCompatibility(pets) - MTH_CharSavedVariables.petTraining = pets.petTraining - MTH_CharSavedVariables.trainScan = pets.trainScan - MTH_CharSavedVariables.stableScan = pets.stableScan - MTH_CharSavedVariables.petStore = pets.petStore + -- Migration: remove root-level duplicates that bloated SavedVariables + if pets._migrationCleanup ~= 2 then + MTH_PETS_RunSavedVarCleanup(pets) + pets._migrationCleanup = 2 + end return pets end +function MTH_PETS_RunSavedVarCleanup(pets) + -- 1. Remove root-level duplicates (data lives inside MTH_Pets only) + if MTH_CharSavedVariables then + MTH_CharSavedVariables.petTraining = nil + MTH_CharSavedVariables.trainScan = nil + MTH_CharSavedVariables.stableScan = nil + MTH_CharSavedVariables.petStore = nil + end + + -- 2. Purge pet-updated events (unbounded bloat) + local purged = 0 + local stores = { pets.petStore and pets.petStore.activeById, pets.petStore and pets.petStore.historyById } + for _, index in ipairs(stores) do + if type(index) == "table" then + for petId, row in pairs(index) do + if type(row) == "table" and type(row.events) == "table" then + local kept = {} + for _, evt in ipairs(row.events) do + if type(evt) == "table" and evt.type ~= "pet-updated" then + table.insert(kept, evt) + else + purged = purged + 1 + end + end + row.events = kept + end + end + end + end + + -- 3. Remove stale _betaFreshStoreApplied flag + pets._betaFreshStoreApplied = nil + + if purged > 0 and MTH and MTH.Print then + MTH:Print("Cleaned up " .. tostring(purged) .. " stale pet-update records from SavedVariables.", "debug") + end +end + function MTH_PETS_RefreshCurrentPet() local pets = type(MTH_PETS_GetRootStore) == "function" and MTH_PETS_GetRootStore() or nil if type(pets) ~= "table" then @@ -2624,15 +2654,17 @@ function MTH_PETS_RefreshCurrentPet() row.events = {} end - local eventType = "pet-updated" - if created and (not hadPetBeforeRefresh) then - eventType = "pet-acquired" + local eventType = "pet-acquired" + if not (created and (not hadPetBeforeRefresh)) then + if cp.id ~= nil and previousCurrentId ~= nil and cp.id ~= previousCurrentId then + eventType = "pet-swapped" + else + eventType = nil -- routine update, don't record + end end - local shouldRecordLifecycleEvent = (eventType == "pet-acquired") - or (cp.id ~= nil and previousCurrentId ~= nil and cp.id ~= previousCurrentId) local eventContext = nil - if shouldRecordLifecycleEvent then + if eventType then eventContext = MTH_PETS_CaptureContext() table.insert(row.events, { type = eventType, @@ -3167,7 +3199,7 @@ end local function MTH_ST_QueueDeferredStableScan(reason, delaySeconds) if not MTH_ST_DeferredStableScanFrame then - MTH_ST_DeferredStableScanFrame = CreateFrame("Frame", "MTHDeferredStableScanFrame") + MTH_ST_DeferredStableScanFrame = CreateFrame("Frame", "MTH_DeferredStableScan") if not MTH_ST_DeferredStableScanFrame then MTH_ST_TraceRecord("MTH_ST_QueueDeferredStableScan", "scan", "frame-create-failed") return false @@ -3270,9 +3302,8 @@ local function MTH_PETS_HandleUnitPetTransition(source) row.events = {} end local eventType = (not hadPet) and "pet-acquired" or "pet-updated" - if eventType == "pet-updated" and source == "UNIT_PET" and MTH_ST_IsStableFrameOpen() then - MTH_ST_PrintStableDiag("swap history-skip reason=stable-open") - else + -- Only record lifecycle events (acquire, rename, abandon), not routine updates + if eventType ~= "pet-updated" then table.insert(row.events, { type = eventType, source = source or transitionSource, @@ -4120,7 +4151,7 @@ function MTH_ST_InitService() return end - MTH_PetLifecycleEventFrame = CreateFrame("Frame", "MTHPetLifecycleEventFrame") + MTH_PetLifecycleEventFrame = CreateFrame("Frame", "MTH_PetLifecycleEvent") MTH_PetLifecycleEventFrame:RegisterEvent("PLAYER_ENTERING_WORLD") MTH_PetLifecycleEventFrame:RegisterEvent("UNIT_PET") MTH_PetLifecycleEventFrame:RegisterEvent("PET_BAR_UPDATE") @@ -4153,29 +4184,26 @@ function MTH_ST_InitBootstrap() return end - local frame = CreateFrame("Frame", "MTHPetLifecycleBootstrapFrame") + local frame = CreateFrame("Frame", "MTH_PetLifecycleBoot") if not frame then return end frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:RegisterEvent("PET_STABLE_SHOW") frame:RegisterEvent("PET_STABLE_UPDATE") - frame:SetScript("OnEvent", function(self, evt) - evt = evt or event - if evt ~= "PLAYER_ENTERING_WORLD" and evt ~= "PET_STABLE_SHOW" and evt ~= "PET_STABLE_UPDATE" then + frame:SetScript("OnEvent", function() + if event ~= "PLAYER_ENTERING_WORLD" and event ~= "PET_STABLE_SHOW" and event ~= "PET_STABLE_UPDATE" then return end - if evt == "PET_STABLE_SHOW" or evt == "PET_STABLE_UPDATE" then - MTH_ST_PrintStableDiag("bootstrap evt=" .. tostring(evt) .. " phase=begin") + if event == "PET_STABLE_SHOW" or event == "PET_STABLE_UPDATE" then + MTH_ST_PrintStableDiag("bootstrap evt=" .. tostring(event) .. " phase=begin") end MTH_ST_InitService() - if evt == "PET_STABLE_SHOW" or evt == "PET_STABLE_UPDATE" then - MTH_ST_PrintStableDiag("bootstrap evt=" .. tostring(evt) .. " phase=end action=no-scan") - end - if self and self.UnregisterAllEvents then - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) + if event == "PET_STABLE_SHOW" or event == "PET_STABLE_UPDATE" then + MTH_ST_PrintStableDiag("bootstrap evt=" .. tostring(event) .. " phase=end action=no-scan") end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) MTH_PetLifecycleBootstrapFrame = nil end) MTH_PetLifecycleBootstrapFrame = frame diff --git a/api/core.lua b/api/core.lua index f077880..987f9b8 100644 --- a/api/core.lua +++ b/api/core.lua @@ -12,7 +12,7 @@ local function MTH_PT_GetGlobal(name) return nil end -local MTH_ItemLinkCacheTooltip = nil +local MTH_ItemLinkCache = nil local function MTH_GetQualityHexColor(quality) local q = tonumber(quality) @@ -34,14 +34,14 @@ function MTH_PrimeItemCache(itemId) if not id or id <= 0 then return false end if type(GetItemInfo) == "function" and GetItemInfo(id) then return true end - if not MTH_ItemLinkCacheTooltip then - MTH_ItemLinkCacheTooltip = CreateFrame("GameTooltip", "MTH_ItemLinkCacheTooltip", UIParent, "GameTooltipTemplate") - if not MTH_ItemLinkCacheTooltip then return false end - MTH_ItemLinkCacheTooltip:SetOwner(UIParent, "ANCHOR_NONE") + if not MTH_ItemLinkCache then + MTH_ItemLinkCache = CreateFrame("GameTooltip", "MTH_ItemLinkCache", UIParent, "GameTooltipTemplate") + if not MTH_ItemLinkCache then return false end + MTH_ItemLinkCache:SetOwner(UIParent, "ANCHOR_NONE") end - MTH_ItemLinkCacheTooltip:ClearLines() - MTH_ItemLinkCacheTooltip:SetHyperlink("item:" .. tostring(id) .. ":0:0:0") + MTH_ItemLinkCache:ClearLines() + MTH_ItemLinkCache:SetHyperlink("item:" .. tostring(id) .. ":0:0:0") return type(GetItemInfo) == "function" and (GetItemInfo(id) ~= nil) or false end @@ -301,6 +301,46 @@ if type(MTH_CommandPetSpellScan) ~= "function" then end end +------------------------------------------------------ +-- /mth diag — Runtime Diagnostics +------------------------------------------------------ +function MTH_CommandDiag() + MTH:Print("======= MetaHunt Diagnostics =======", "debug") + + -- 1. Lua version + local luaVer = _VERSION or "unknown" + MTH:Print("[DIAG] _VERSION = " .. tostring(luaVer), "debug") + MTH:Print("[DIAG] string.match = " .. tostring(type(string.match) == "function"), "debug") + MTH:Print("[DIAG] string.gfind = " .. tostring(type(string.gfind) == "function"), "debug") + + -- 2. Active modules + local moduleCount = 0 + local enabledModules = {} + if MTH.modules then + for name, mod in pairs(MTH.modules) do + moduleCount = moduleCount + 1 + if mod.enabled then + table.insert(enabledModules, name) + end + end + end + MTH:Print("[DIAG] Registered modules: " .. tostring(moduleCount), "debug") + MTH:Print("[DIAG] Enabled: " .. table.concat(enabledModules, ", "), "debug") + + -- 3. Event router state + local routerFrame = (MTH._eventRouter and MTH._eventRouter.frame) or nil + local routerEvents = (MTH._eventRouter and MTH._eventRouter.eventRefs) or {} + local eventCount = 0 + for _ in pairs(routerEvents) do eventCount = eventCount + 1 end + MTH:Print("[DIAG] EventRouter frame: " .. tostring(routerFrame ~= nil) .. ", events: " .. tostring(eventCount), "debug") + + -- 4. Debug frame initialized? + local dfInit = (MTH_DebugFrame and MTH_DebugFrame.initialized) and true or false + MTH:Print("[DIAG] DebugFrame initialized: " .. tostring(dfInit), "debug") + + MTH:Print("======= End Diagnostics =======", "debug") +end + function SlashCmdList.MTH(msg, editbox) if MTH and MTH.ApplyClassGate and MTH:ApplyClassGate("slash") then return @@ -312,16 +352,24 @@ function SlashCmdList.MTH(msg, editbox) local lowerMsg = string.lower(msg) local _, _, lowerCmd, lowerArg = string.find(lowerMsg, "^(%S+)%s*(.-)%s*$") if msg == "" then - MTH:Print("Available: /mth options, /mth book") + MTH:Print("Available: /mth options, /mth book, /mth diag, /mth err") elseif lowerMsg == "options" then MTH_CommandOptions() elseif lowerMsg == "book" or lowerMsg == "hunterbook" then MTH_CommandBook() elseif lowerMsg == "peers" or lowerMsg == "who" then MTH_CommandPeers() + elseif lowerMsg == "diag" then + MTH_CommandDiag() + elseif lowerMsg == "err" or lowerMsg == "errors" or lowerMsg == "debug" then + if MTH_DebugFrame and MTH_DebugFrame.Toggle then + MTH_DebugFrame:Toggle() + else + MTH:Print("Debug frame is not available.") + end else MTH:Print("Unknown command: " .. tostring(msg)) - MTH:Print("Available: /mth options, /mth book") + MTH:Print("Available: /mth options, /mth book, /mth diag, /mth err") end end diff --git a/api/debug-frame.lua b/api/debug-frame.lua index 63de1c7..42cbb51 100644 --- a/api/debug-frame.lua +++ b/api/debug-frame.lua @@ -29,7 +29,7 @@ function MTH_DebugFrame:Initialize() self.initialized = true -- Create main frame - self.frame = CreateFrame("Frame", "MTH_DebugFrameWindow", UIParent) + self.frame = CreateFrame("Frame", "MTH_DebugWindow", UIParent) self.frame:SetWidth(800) self.frame:SetHeight(400) self.frame:SetPoint("CENTER", UIParent, "CENTER") @@ -51,13 +51,13 @@ function MTH_DebugFrame:Initialize() if UISpecialFrames then local already = false for i = 1, table.getn(UISpecialFrames) do - if UISpecialFrames[i] == "MTH_DebugFrameWindow" then + if UISpecialFrames[i] == "MTH_DebugWindow" then already = true break end end if not already then - table.insert(UISpecialFrames, "MTH_DebugFrameWindow") + table.insert(UISpecialFrames, "MTH_DebugWindow") end end @@ -91,7 +91,7 @@ function MTH_DebugFrame:Initialize() copyButton:SetScript("OnClick", function() MTH_DebugFrame:SelectAllText() end) -- Scroll frame + text content with proper vertical scrollbar - self.scrollFrame = CreateFrame("ScrollFrame", "MTH_DebugScrollFrame", self.frame, "UIPanelScrollFrameTemplate") + self.scrollFrame = CreateFrame("ScrollFrame", "MTH_DebugScroll", self.frame, "UIPanelScrollFrameTemplate") self.scrollFrame:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 15, -50) self.scrollFrame:SetPoint("BOTTOMRIGHT", self.frame, "BOTTOMRIGHT", -35, 45) @@ -366,8 +366,8 @@ MTH_DebugFrame.UninstallHooks = MTH_DF_UninstallHooks -- Event listener for addon load local eventFrame = CreateFrame("Frame") eventFrame:RegisterEvent("ADDON_LOADED") -eventFrame:SetScript("OnEvent", function(self, event, addonName) - if event == "ADDON_LOADED" and addonName == "MetaHunt" then +eventFrame:SetScript("OnEvent", function() + if event == "ADDON_LOADED" and arg1 == "MetaHunt" then if MTH and MTH.GetConfig then MTH_DF_SetGlobalCaptureEnabled(MTH:GetConfig("debug", "globalErrorCapture", false)) end diff --git a/api/hunterbook-tab-stable.lua b/api/hunterbook-tab-stable.lua index 63aebd0..acc1299 100644 --- a/api/hunterbook-tab-stable.lua +++ b/api/hunterbook-tab-stable.lua @@ -140,7 +140,7 @@ function MTH_BOOK_GetResistanceShortName(nameText) if string.find(lowerName, "arcane", 1, true) then return "AR" end if string.find(lowerName, "nature", 1, true) then return "NR" end if string.find(lowerName, "fire", 1, true) then return "FR" end - if string.find(lowerName, "frost", 1, true) then return "FR" end + if string.find(lowerName, "frost", 1, true) then return "FrR" end if string.find(lowerName, "shadow", 1, true) then return "SR" end return tostring(nameText or "-") end diff --git a/api/hunterbook.lua b/api/hunterbook.lua index f91d069..94f1659 100644 --- a/api/hunterbook.lua +++ b/api/hunterbook.lua @@ -5066,19 +5066,19 @@ local function MTH_BOOK_WireUI(frame) listSlider:SetScript("OnMouseDown", function() MTH_BOOK_STATE.sliderDragging = true MTH_BOOK_SetSliderFromCursor(this) + this:SetScript("OnUpdate", function() + if IsMouseButtonDown and not IsMouseButtonDown("LeftButton") then + MTH_BOOK_STATE.sliderDragging = false + this:SetScript("OnUpdate", nil) + else + MTH_BOOK_SetSliderFromCursor(this) + end + end) end) listSlider:SetScript("OnMouseUp", function() MTH_BOOK_SetSliderFromCursor(this) MTH_BOOK_STATE.sliderDragging = false - end) - listSlider:SetScript("OnUpdate", function() - if MTH_BOOK_STATE.sliderDragging then - if IsMouseButtonDown and not IsMouseButtonDown("LeftButton") then - MTH_BOOK_STATE.sliderDragging = false - else - MTH_BOOK_SetSliderFromCursor(this) - end - end + this:SetScript("OnUpdate", nil) end) listSlider:SetScript("OnValueChanged", function() local value = this:GetValue() @@ -5181,19 +5181,19 @@ local function MTH_BOOK_WireUI(frame) sliderBackdrop:SetScript("OnMouseDown", function() MTH_BOOK_STATE.sliderDragging = true MTH_BOOK_SetSliderFromCursor(listSlider) + listSlider:SetScript("OnUpdate", function() + if IsMouseButtonDown and not IsMouseButtonDown("LeftButton") then + MTH_BOOK_STATE.sliderDragging = false + this:SetScript("OnUpdate", nil) + else + MTH_BOOK_SetSliderFromCursor(listSlider) + end + end) end) sliderBackdrop:SetScript("OnMouseUp", function() MTH_BOOK_SetSliderFromCursor(listSlider) MTH_BOOK_STATE.sliderDragging = false - end) - sliderBackdrop:SetScript("OnUpdate", function() - if MTH_BOOK_STATE.sliderDragging then - if IsMouseButtonDown and not IsMouseButtonDown("LeftButton") then - MTH_BOOK_STATE.sliderDragging = false - else - MTH_BOOK_SetSliderFromCursor(listSlider) - end - end + listSlider:SetScript("OnUpdate", nil) end) end end diff --git a/api/localization.lua b/api/localization.lua index a165f36..cc156ab 100644 --- a/api/localization.lua +++ b/api/localization.lua @@ -9,7 +9,6 @@ local MTH_LOCALE_ALIASES = { enGB = "enUS", esMX = "esES", zhTW = "zhCN", - frFR = "enUS", } local MTH_SUPPORTED_LOCALES = { diff --git a/api/map-markers.lua b/api/map-markers.lua index dd3b615..9eb5b84 100644 --- a/api/map-markers.lua +++ b/api/map-markers.lua @@ -1244,7 +1244,7 @@ function MTH_Map:Init() self.nodesByZone = self.nodesByZone or {} if not self.controller then - self.controller = CreateFrame("Frame", "MTHMapController", UIParent) + self.controller = CreateFrame("Frame", "MTH_MapController", UIParent) self.controller:RegisterEvent("PLAYER_ENTERING_WORLD") self.controller:RegisterEvent("ZONE_CHANGED") self.controller:RegisterEvent("ZONE_CHANGED_NEW_AREA") diff --git a/api/minimap-button.lua b/api/minimap-button.lua index f58092b..947bd89 100644 --- a/api/minimap-button.lua +++ b/api/minimap-button.lua @@ -1,5 +1,13 @@ ------------------------------------------------------ -- MetaHunt Minimap Button +-- +-- NOTE: The namespace table is MTH_MinimapButton (a plain Lua table). +-- The actual UI frame is named "MTH_MinimapBtn" to avoid a global +-- collision — CreateFrame("...", "MTH_MinimapButton", ...) would +-- OVERWRITE the namespace table with the frame object, orphaning +-- all methods and .frame/.icon references. pfUI iterates Minimap +-- children by name and calls _G[name]:GetHeight(); if the global is +-- a plain {} table instead of a frame, that call crashes. ------------------------------------------------------ if not MTH_MinimapButton then @@ -84,7 +92,9 @@ function MTH_MinimapButton:Initialize() return end - local button = CreateFrame("Button", "MTH_MinimapButtonFrame", Minimap) + -- Frame name is MTH_MinimapBtn (NOT "MTH_MinimapButton") to avoid + -- overwriting the namespace table in _G. + local button = CreateFrame("Button", "MTH_MinimapBtn", Minimap) if not button then return end @@ -114,10 +124,9 @@ function MTH_MinimapButton:Initialize() highlight:SetHeight(31) highlight:SetPoint("CENTER", button, "CENTER", 0, 0) - button:SetScript("OnEnter", function(self) - self = self or this - if not self then return end - GameTooltip:SetOwner(self, "ANCHOR_LEFT") + button:SetScript("OnEnter", function() + if not this then return end + GameTooltip:SetOwner(this, "ANCHOR_LEFT") GameTooltip:SetText(MTH_MB_L("MINIMAP_TITLE", "MetaHunt"), 1, 0.82, 0) GameTooltip:AddLine(MTH_MB_L("MINIMAP_HINT_LEFT_CLICK", "Left-Click: Open Hunter Book"), 1, 1, 1) GameTooltip:AddLine(MTH_MB_L("MINIMAP_HINT_RIGHT_CLICK", "Right-Click: Open MetaHunt Options"), 1, 1, 1) @@ -129,25 +138,23 @@ function MTH_MinimapButton:Initialize() GameTooltip:Hide() end) - button:SetScript("OnDragStart", function(self) - self = self or this - if not self then return end - self.dragging = 1 - self:SetScript("OnUpdate", function() + button:SetScript("OnDragStart", function() + if not this then return end + this.dragging = 1 + this:SetScript("OnUpdate", function() MTH_MB_UpdateDragPosition() end) end) - button:SetScript("OnDragStop", function(self) - self = self or this - if not self then return end - self.dragging = nil - self:SetScript("OnUpdate", nil) + button:SetScript("OnDragStop", function() + if not this then return end + this.dragging = nil + this:SetScript("OnUpdate", nil) MTH_MB_UpdateDragPosition() end) - button:SetScript("OnClick", function(_, mouseButton) - mouseButton = mouseButton or arg1 + button:SetScript("OnClick", function() + local mouseButton = arg1 if mouseButton == "RightButton" then if type(MTH_OpenOptions) == "function" then MTH_OpenOptions("General") @@ -167,16 +174,12 @@ function MTH_MinimapButton:Initialize() MTH_MB_UpdatePosition() end -local loader = CreateFrame("Frame", "MTH_MinimapButtonLoader") +local loader = CreateFrame("Frame", "MTH_MinimapLoader") loader:RegisterEvent("ADDON_LOADED") -loader:SetScript("OnEvent", function(self, eventName, addonName) - eventName = eventName or event - addonName = addonName or arg1 - if eventName == "ADDON_LOADED" and addonName == "MetaHunt" then +loader:SetScript("OnEvent", function() + if event == "ADDON_LOADED" and arg1 == "MetaHunt" then MTH_MinimapButton:Initialize() - if self and self.UnregisterAllEvents then - self:UnregisterAllEvents() - self:SetScript("OnEvent", nil) - end + this:UnregisterAllEvents() + this:SetScript("OnEvent", nil) end end) diff --git a/api/options-autobuy.lua b/api/options-autobuy.lua index 8f9eaf8..d95c5be 100644 --- a/api/options-autobuy.lua +++ b/api/options-autobuy.lua @@ -657,28 +657,25 @@ local function MTH_AB_CreateRow(container, subtype, index, xBase, yOffset) row.suffix:SetText("Stacks") if row.check then - row.check:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + row.check:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end local store = MTH_AB_EnsureConfig() - MTH_AB_SetRuleEnabled(store, subtype, index, MTH_AB_IsChecked(self)) + MTH_AB_SetRuleEnabled(store, subtype, index, MTH_AB_IsChecked(this)) MTH_AB_RefreshOptionsUI() end) end - row.qty:SetScript("OnEnterPressed", function(self) - self = self or this - if not self then return end + row.qty:SetScript("OnEnterPressed", function() + if not this then return end local store = MTH_AB_EnsureConfig() - MTH_AB_SetRuleStacks(store, subtype, index, self:GetText()) + MTH_AB_SetRuleStacks(store, subtype, index, this:GetText()) MTH_AB_RefreshOptionsUI() - self:ClearFocus() + this:ClearFocus() end) - row.qty:SetScript("OnEditFocusLost", function(self) - self = self or this - if not self then return end + row.qty:SetScript("OnEditFocusLost", function() + if not this then return end local store = MTH_AB_EnsureConfig() - MTH_AB_SetRuleStacks(store, subtype, index, self:GetText()) + MTH_AB_SetRuleStacks(store, subtype, index, this:GetText()) MTH_AB_RefreshOptionsUI() end) @@ -715,11 +712,10 @@ local function MTH_AB_BuildUI(container) controls.moduleEnabled = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoBuyModuleEnabled", "Enable Auto Buy module", -30) if controls.moduleEnabled then - controls.moduleEnabled:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + controls.moduleEnabled:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end if MTH and MTH.SetModuleEnabled then - local ok, err = MTH:SetModuleEnabled("autobuy", MTH_AB_IsChecked(self)) + local ok, err = MTH:SetModuleEnabled("autobuy", MTH_AB_IsChecked(this)) if not ok and MTH and MTH.Print then MTH:Print("Failed to change Auto Buy state: " .. tostring(err), "error") end @@ -730,11 +726,10 @@ local function MTH_AB_BuildUI(container) controls.projectilesEnabled = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoBuyProjectilesEnabled", "Enable for Projectiles", -74) if controls.projectilesEnabled then - controls.projectilesEnabled:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + controls.projectilesEnabled:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end local store = MTH_AB_EnsureConfig() - store.projectiles.enabled = MTH_AB_IsChecked(self) + store.projectiles.enabled = MTH_AB_IsChecked(this) MTH_AB_RefreshOptionsUI() end) end @@ -769,11 +764,10 @@ local function MTH_AB_BuildUI(container) controls.petFoodEnabled = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoBuyPetFoodEnabled", "Enable for Pet Food", -322, MTH_AB_LAYOUT.LEFT_SECTION_X) if controls.petFoodEnabled then - controls.petFoodEnabled:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + controls.petFoodEnabled:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end local store = MTH_AB_EnsureConfig() - store.petFood.enabled = MTH_AB_IsChecked(self) + store.petFood.enabled = MTH_AB_IsChecked(this) MTH_AB_RefreshOptionsUI() end) end @@ -791,19 +785,17 @@ local function MTH_AB_BuildUI(container) controls.petFoodQty:SetHeight(20) controls.petFoodQty:SetNumeric(true) controls.petFoodQty:SetAutoFocus(false) - controls.petFoodQty:SetScript("OnEnterPressed", function(self) - self = self or this - if not self then return end + controls.petFoodQty:SetScript("OnEnterPressed", function() + if not this then return end local store = MTH_AB_EnsureConfig() - MTH_AB_SetPetFoodStacks(store, self:GetText()) + MTH_AB_SetPetFoodStacks(store, this:GetText()) MTH_AB_RefreshOptionsUI() - self:ClearFocus() + this:ClearFocus() end) - controls.petFoodQty:SetScript("OnEditFocusLost", function(self) - self = self or this - if not self then return end + controls.petFoodQty:SetScript("OnEditFocusLost", function() + if not this then return end local store = MTH_AB_EnsureConfig() - MTH_AB_SetPetFoodStacks(store, self:GetText()) + MTH_AB_SetPetFoodStacks(store, this:GetText()) MTH_AB_RefreshOptionsUI() end) end @@ -816,9 +808,8 @@ local function MTH_AB_BuildUI(container) controls.petFoodScopeCurrent = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoBuyPetFoodScopeCurrent", "Buy only for my current pet", -376, MTH_AB_LAYOUT.LEFT_SECTION_X + 28) if controls.petFoodScopeCurrent then - controls.petFoodScopeCurrent:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + controls.petFoodScopeCurrent:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end local store = MTH_AB_EnsureConfig() store.petFood.scope = "current" MTH_AB_RefreshOptionsUI() @@ -827,9 +818,8 @@ local function MTH_AB_BuildUI(container) controls.petFoodScopeAll = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoBuyPetFoodScopeAll", "Buy for all my pets", -402, MTH_AB_LAYOUT.LEFT_SECTION_X + 28) if controls.petFoodScopeAll then - controls.petFoodScopeAll:SetScript("OnClick", function(self) - self = self or this - if not self or MTH_AB_STATE.syncing then return end + controls.petFoodScopeAll:SetScript("OnClick", function() + if not this or MTH_AB_STATE.syncing then return end local store = MTH_AB_EnsureConfig() store.petFood.scope = "all" MTH_AB_RefreshOptionsUI() diff --git a/api/options-autoquest.lua b/api/options-autoquest.lua index 7451b53..032ade4 100644 --- a/api/options-autoquest.lua +++ b/api/options-autoquest.lua @@ -72,10 +72,9 @@ function MTH_SetupAutoQuestOptions() local moduleToggle = MTH_CreateCheckbox(container, "MetaHuntOptionsAutoQuestModuleToggle", "Enable Auto Quest module", -70, 20) if moduleToggle then moduleToggle:SetChecked(moduleEnabled and true or false) - moduleToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local enabled = MTH_AQ_IsChecked(self) + moduleToggle:SetScript("OnClick", function() + if not this then return end + local enabled = MTH_AQ_IsChecked(this) if MTH and MTH.SetModuleEnabled then local ok, err = MTH:SetModuleEnabled("autoquest", enabled) if not ok and MTH and MTH.Print then @@ -84,7 +83,7 @@ function MTH_SetupAutoQuestOptions() end local module = MTH and MTH.GetModule and MTH:GetModule("autoquest") or nil local actual = (type(module) == "table" and module.enabled ~= nil) and (module.enabled and true or false) or enabled - self:SetChecked(actual and true or false) + this:SetChecked(actual and true or false) end) end @@ -151,9 +150,8 @@ function MTH_SetupAutoQuestOptions() store.scorpokDrazial and true or false ) if scorpokToggle then - scorpokToggle:SetScript("OnClick", function(self) - self = self or this - local enabled = MTH_AQ_IsChecked(self) + scorpokToggle:SetScript("OnClick", function() + local enabled = MTH_AQ_IsChecked(this) store.scorpokDrazial = enabled and true or false if MTH and MTH.GetModuleCharSavedVariables then local moduleStore = MTH:GetModuleCharSavedVariables("autoquest") @@ -176,9 +174,8 @@ function MTH_SetupAutoQuestOptions() store.scorpokTooltip and true or false ) if tooltipToggle then - tooltipToggle:SetScript("OnClick", function(self) - self = self or this - local enabled = MTH_AQ_IsChecked(self) + tooltipToggle:SetScript("OnClick", function() + local enabled = MTH_AQ_IsChecked(this) store.scorpokTooltip = enabled and true or false if MTH and MTH.GetModuleCharSavedVariables then local moduleStore = MTH:GetModuleCharSavedVariables("autoquest") @@ -212,9 +209,8 @@ function MTH_SetupAutoQuestOptions() store.arrowsForSissies and true or false ) if sissiesToggle then - sissiesToggle:SetScript("OnClick", function(self) - self = self or this - local enabled = MTH_AQ_IsChecked(self) + sissiesToggle:SetScript("OnClick", function() + local enabled = MTH_AQ_IsChecked(this) store.arrowsForSissies = enabled and true or false if MTH and MTH.GetModuleCharSavedVariables then local moduleStore = MTH:GetModuleCharSavedVariables("autoquest") diff --git a/api/options-chronometer.lua b/api/options-chronometer.lua index fcfaf00..a4de4eb 100644 --- a/api/options-chronometer.lua +++ b/api/options-chronometer.lua @@ -326,13 +326,12 @@ local function MTH_CHRON_MakeInput(parent, name, x, y, width, height, value, onA edit:SetHeight(height or 20) edit:SetAutoFocus(false) edit:SetText(tostring(value or "")) - edit:SetScript("OnEnterPressed", function(self) - self = self or this - if not self then return end + edit:SetScript("OnEnterPressed", function() + if not this then return end if type(onAccept) == "function" then - onAccept(self:GetText() or "") + onAccept(this:GetText() or "") end - self:ClearFocus() + this:ClearFocus() end) return edit end @@ -385,16 +384,15 @@ local function MTH_CHRON_RenderTimerSection(container, profile, title, items, bu local check = MTH_CreateCheckbox(container, controlName, label, timerY, timerX) if check then check:SetChecked(profile.disabledSpells[bucket][timerName] == nil and true or false) - check:SetScript("OnClick", function(self) - self = self or this - if not self then return end + check:SetScript("OnClick", function() + if not this then return end local currentlyDisabled = profile.disabledSpells[bucket][timerName] ~= nil if currentlyDisabled then profile.disabledSpells[bucket][timerName] = nil - self:SetChecked(true) + this:SetChecked(true) else profile.disabledSpells[bucket][timerName] = {} - self:SetChecked(nil) + this:SetChecked(nil) end MTH_CHRON_ApplyLiveProfile(profile) @@ -470,10 +468,9 @@ function MTH_SetupChronometerOptions(tabKey) if moduleCheck then local module = MTH and MTH:GetModule("chronometer") moduleCheck:SetChecked(module and module.enabled and true or false) - moduleCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local enabled = MTH_CHRON_IsChecked(self) + moduleCheck:SetScript("OnClick", function() + if not this then return end + local enabled = MTH_CHRON_IsChecked(this) if MTH and MTH.SetModuleEnabled then MTH:SetModuleEnabled("chronometer", enabled) end @@ -495,40 +492,36 @@ function MTH_SetupChronometerOptions(tabKey) local killCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerFadeOnKill", "Fade on kill", -154) if killCheck then killCheck:SetChecked(profile.fadeonkill and true or false) - killCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.fadeonkill = MTH_CHRON_IsChecked(self) + killCheck:SetScript("OnClick", function() + if not this then return end + profile.fadeonkill = MTH_CHRON_IsChecked(this) end) end local fadeCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerFadeOnFade", "Fade on aura fade", -179) if fadeCheck then fadeCheck:SetChecked(profile.fadeonfade and true or false) - fadeCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.fadeonfade = MTH_CHRON_IsChecked(self) + fadeCheck:SetScript("OnClick", function() + if not this then return end + profile.fadeonfade = MTH_CHRON_IsChecked(this) end) end local selfCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerSelfBars", "Show self bars", -204) if selfCheck then selfCheck:SetChecked(profile.selfbars and true or false) - selfCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.selfbars = MTH_CHRON_IsChecked(self) + selfCheck:SetScript("OnClick", function() + if not this then return end + profile.selfbars = MTH_CHRON_IsChecked(this) end) end local onlySelfCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerOnlySelf", "Only self target", -229) if onlySelfCheck then onlySelfCheck:SetChecked(profile.onlyself and true or false) - onlySelfCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.onlyself = MTH_CHRON_IsChecked(self) + onlySelfCheck:SetScript("OnClick", function() + if not this then return end + profile.onlyself = MTH_CHRON_IsChecked(this) end) end elseif section == "bar" then @@ -610,10 +603,9 @@ function MTH_SetupChronometerOptions(tabKey) local growCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerGrowUp", "Grow bars upward", -438) if growCheck then growCheck:SetChecked(profile.growup and true or false) - growCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.growup = MTH_CHRON_IsChecked(self) + growCheck:SetScript("OnClick", function() + if not this then return end + profile.growup = MTH_CHRON_IsChecked(this) MTH_CHRON_ApplyLiveProfile(profile) end) end @@ -621,10 +613,9 @@ function MTH_SetupChronometerOptions(tabKey) local reverseCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsChronometerReverse", "Reverse bars", -463) if reverseCheck then reverseCheck:SetChecked(profile.reverse and true or false) - reverseCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - profile.reverse = MTH_CHRON_IsChecked(self) + reverseCheck:SetScript("OnClick", function() + if not this then return end + profile.reverse = MTH_CHRON_IsChecked(this) MTH_CHRON_ApplyLiveProfile(profile) end) end diff --git a/api/options-feedomatic.lua b/api/options-feedomatic.lua index a6a7248..272f64a 100644 --- a/api/options-feedomatic.lua +++ b/api/options-feedomatic.lua @@ -226,10 +226,9 @@ function MTH_SetupFeedOMaticOptions() local moduleCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsFeedOMaticEnabled", MTH_FOM_L("FOM_ENABLE_MODULE", "Enable FeedOMatic module"), -32 + yAdjust) if moduleCheck then - moduleCheck:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local enabled = self:GetChecked() == 1 + moduleCheck:SetScript("OnClick", function() + if not this then return end + local enabled = this:GetChecked() == 1 if MTH and MTH.SetModuleEnabled then local ok, err = MTH:SetModuleEnabled("feedomatic", enabled) if not ok and MTH and MTH.Print then @@ -263,11 +262,11 @@ function MTH_SetupFeedOMaticOptions() MTH_FOM_StartBindingCapture() end end) - bindButton:SetScript("OnKeyDown", function(_, key) + bindButton:SetScript("OnKeyDown", function() if not MTH_FOM_STATE.bindingCapture then return end - key = key or arg1 + local key = arg1 if not key or key == "" then return end @@ -305,10 +304,10 @@ function MTH_SetupFeedOMaticOptions() MTH_FOM_STATE.ctrl.PreferHigherQuality = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMPreferQuality", FOM_OptionsButtonText and FOM_OptionsButtonText["PreferHigherQuality"] or MTH_FOM_L("FOM_LABEL_PREFER_HIGHER_QUALITY_FOOD", "Prefer higher quality food"), -220 + yAdjust) MTH_FOM_STATE.ctrl.Fallback = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMFallback", FOM_OptionsButtonText and FOM_OptionsButtonText["Fallback"] or MTH_FOM_L("FOM_LABEL_FALLBACK_TO_AVOIDED_FOODS", "Fallback to avoided foods"), -245 + yAdjust) - if MTH_FOM_STATE.ctrl.AvoidQuestFood then MTH_FOM_STATE.ctrl.AvoidQuestFood:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.AvoidQuestFood = self:GetChecked() == 1 end) end - if MTH_FOM_STATE.ctrl.AvoidBonusFood then MTH_FOM_STATE.ctrl.AvoidBonusFood:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.AvoidBonusFood = self:GetChecked() == 1 end) end - if MTH_FOM_STATE.ctrl.PreferHigherQuality then MTH_FOM_STATE.ctrl.PreferHigherQuality:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.PreferHigherQuality = self:GetChecked() == 1 end) end - if MTH_FOM_STATE.ctrl.Fallback then MTH_FOM_STATE.ctrl.Fallback:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.Fallback = self:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.AvoidQuestFood then MTH_FOM_STATE.ctrl.AvoidQuestFood:SetScript("OnClick", function() if not this then return end FOM_Config.AvoidQuestFood = this:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.AvoidBonusFood then MTH_FOM_STATE.ctrl.AvoidBonusFood:SetScript("OnClick", function() if not this then return end FOM_Config.AvoidBonusFood = this:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.PreferHigherQuality then MTH_FOM_STATE.ctrl.PreferHigherQuality:SetScript("OnClick", function() if not this then return end FOM_Config.PreferHigherQuality = this:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.Fallback then MTH_FOM_STATE.ctrl.Fallback:SetScript("OnClick", function() if not this then return end FOM_Config.Fallback = this:GetChecked() == 1 end) end local keepOpenLabel = container:CreateFontString("MetaHuntOptionsFOMKeepOpenLabel", "ARTWORK", "GameFontNormalSmall") keepOpenLabel:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -302 + yAdjust) @@ -320,14 +319,13 @@ function MTH_SetupFeedOMaticOptions() keepOpen:SetHeight(20) keepOpen:SetNumeric(true) keepOpen:SetAutoFocus(false) - keepOpen:SetScript("OnTextChanged", function(self) - self = self or this - if not self then return end - local value = tonumber(self:GetText()) or 0 + keepOpen:SetScript("OnTextChanged", function() + if not this then return end + local value = tonumber(this:GetText()) or 0 FOM_Config.KeepOpenSlots = value end) - keepOpen:SetScript("OnEnterPressed", function(self) self = self or this if self then self:ClearFocus() end end) - keepOpen:SetScript("OnEscapePressed", function(self) self = self or this if self then self:ClearFocus() end end) + keepOpen:SetScript("OnEnterPressed", function() if this then this:ClearFocus() end end) + keepOpen:SetScript("OnEscapePressed", function() if this then this:ClearFocus() end end) MTH_FOM_STATE.keepOpenEdit = keepOpen local notifyHeader = container:CreateFontString("MetaHuntOptionsFOMNotifyHeader", "ARTWORK", "GameFontHighlight") @@ -356,10 +354,10 @@ function MTH_SetupFeedOMaticOptions() MTH_FOM_STATE.ctrl.AudioWarningBell = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAudioWarningBell", FOM_OptionsButtonText and FOM_OptionsButtonText["AudioWarningBell"] or MTH_FOM_L("FOM_LABEL_USE_BELL_SOUND", "Use bell sound"), -403 + yAdjust, rightColumnX) MTH_FOM_STATE.ctrl.TextWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMTextWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["TextWarning"] or MTH_FOM_L("FOM_LABEL_SHOW_TEXT", "Show text"), -428 + yAdjust, rightColumnX) MTH_FOM_STATE.ctrl.IconWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMIconWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["IconWarning"] or MTH_FOM_L("FOM_LABEL_FLASH_ICON", "Flash icon"), -453 + yAdjust, rightColumnX) - if MTH_FOM_STATE.ctrl.AudioWarning then MTH_FOM_STATE.ctrl.AudioWarning:SetScript("OnClick", function(self) self = self or this if not self then return end if self:GetChecked() == 1 then if FOM_Config.AudioWarning ~= "bell" then FOM_Config.AudioWarning = true end else FOM_Config.AudioWarning = nil end MTH_RefreshFeedOMaticOptions() end) end - if MTH_FOM_STATE.ctrl.AudioWarningBell then MTH_FOM_STATE.ctrl.AudioWarningBell:SetScript("OnClick", function(self) self = self or this if not self then return end if self:GetChecked() == 1 then FOM_Config.AudioWarning = "bell" else FOM_Config.AudioWarning = true end MTH_RefreshFeedOMaticOptions() end) end - if MTH_FOM_STATE.ctrl.TextWarning then MTH_FOM_STATE.ctrl.TextWarning:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.TextWarning = self:GetChecked() == 1 end) end - if MTH_FOM_STATE.ctrl.IconWarning then MTH_FOM_STATE.ctrl.IconWarning:SetScript("OnClick", function(self) self = self or this if not self then return end FOM_Config.IconWarning = self:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.AudioWarning then MTH_FOM_STATE.ctrl.AudioWarning:SetScript("OnClick", function() if not this then return end if this:GetChecked() == 1 then if FOM_Config.AudioWarning ~= "bell" then FOM_Config.AudioWarning = true end else FOM_Config.AudioWarning = nil end MTH_RefreshFeedOMaticOptions() end) end + if MTH_FOM_STATE.ctrl.AudioWarningBell then MTH_FOM_STATE.ctrl.AudioWarningBell:SetScript("OnClick", function() if not this then return end if this:GetChecked() == 1 then FOM_Config.AudioWarning = "bell" else FOM_Config.AudioWarning = true end MTH_RefreshFeedOMaticOptions() end) end + if MTH_FOM_STATE.ctrl.TextWarning then MTH_FOM_STATE.ctrl.TextWarning:SetScript("OnClick", function() if not this then return end FOM_Config.TextWarning = this:GetChecked() == 1 end) end + if MTH_FOM_STATE.ctrl.IconWarning then MTH_FOM_STATE.ctrl.IconWarning:SetScript("OnClick", function() if not this then return end FOM_Config.IconWarning = this:GetChecked() == 1 end) end local cookHeader = container:CreateFontString("MetaHuntOptionsFOMCookingHeader", "ARTWORK", "GameFontHighlight") cookHeader:SetPoint("TOPLEFT", container, "TOPLEFT", rightColumnX, -62 + yAdjust) diff --git a/api/options-icu.lua b/api/options-icu.lua index 8ca2e26..aab7f9e 100644 --- a/api/options-icu.lua +++ b/api/options-icu.lua @@ -297,11 +297,10 @@ local function MTH_ICU_BuildUI(container) local moduleEnabled = MTH_CreateCheckbox(container, "MetaHuntOptionsICUModuleEnabled", "Enable ICU module", -72, MTH_ICU_LAYOUT.LEFT_X) if moduleEnabled then - moduleEnabled:SetScript("OnClick", function(self) - self = self or this - if not self then return end + moduleEnabled:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetModuleEnabled then - local ok, err = MTH:SetModuleEnabled("icu", self:GetChecked() == 1) + local ok, err = MTH:SetModuleEnabled("icu", this:GetChecked() == 1) if not ok and MTH and MTH.Print then MTH:Print("Failed to change ICU module state: " .. tostring(err), "error") end @@ -313,11 +312,10 @@ local function MTH_ICU_BuildUI(container) local mouseOver = MTH_CreateCheckbox(container, "MetaHuntOptionsICUMouseOver", "Enable CTRL mouseover scan", -98, MTH_ICU_LAYOUT.LEFT_X) if mouseOver then - mouseOver:SetScript("OnClick", function(self) - self = self or this - if not self then return end + mouseOver:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.mouseOver = self:GetChecked() == 1 and true or false + store.mouseOver = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.mouseOver = mouseOver end @@ -346,11 +344,10 @@ local function MTH_ICU_BuildUI(container) local expandUp = MTH_CreateCheckbox(container, "MetaHuntOptionsICUExpandUp", "Expand Up", -301, MTH_ICU_LAYOUT.LEFT_X + 132) if expandUp then - expandUp:SetScript("OnClick", function(self) - self = self or this - if not self then return end + expandUp:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.EXPAND_UP = self:GetChecked() == 1 and true or false + store.EXPAND_UP = this:GetChecked() == 1 and true or false if type(ICU_SetPoints) == "function" then ICU_SetPoints() end @@ -360,44 +357,40 @@ local function MTH_ICU_BuildUI(container) local showGuild = MTH_CreateCheckbox(container, "MetaHuntOptionsICUShowGuild", "Show player guild names", -344, MTH_ICU_LAYOUT.LEFT_X) if showGuild then - showGuild:SetScript("OnClick", function(self) - self = self or this - if not self then return end + showGuild:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.SHOW_GUILD_NAME = self:GetChecked() == 1 and true or false + store.SHOW_GUILD_NAME = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.showGuildName = showGuild end local showClass = MTH_CreateCheckbox(container, "MetaHuntOptionsICUShowClass", "Show player class", -368, MTH_ICU_LAYOUT.LEFT_X) if showClass then - showClass:SetScript("OnClick", function(self) - self = self or this - if not self then return end + showClass:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.SHOW_PLAYER_CLASS = self:GetChecked() == 1 and true or false + store.SHOW_PLAYER_CLASS = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.showPlayerClass = showClass end local showRace = MTH_CreateCheckbox(container, "MetaHuntOptionsICUShowRace", "Show player race", -392, MTH_ICU_LAYOUT.LEFT_X) if showRace then - showRace:SetScript("OnClick", function(self) - self = self or this - if not self then return end + showRace:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.SHOW_PLAYER_RACE = self:GetChecked() == 1 and true or false + store.SHOW_PLAYER_RACE = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.showPlayerRace = showRace end local showTitles = MTH_CreateCheckbox(container, "MetaHuntOptionsICUShowTitles", "Show custom titles in alerts", -416, MTH_ICU_LAYOUT.LEFT_X) if showTitles then - showTitles:SetScript("OnClick", function(self) - self = self or this - if not self then return end + showTitles:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.SHOW_CUSTOM_TITLES = self:GetChecked() == 1 and true or false + store.SHOW_CUSTOM_TITLES = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.showCustomTitles = showTitles end @@ -410,11 +403,10 @@ local function MTH_ICU_BuildUI(container) local reactionOnlyPvp = MTH_CreateCheckbox(container, "MetaHuntOptionsICUReactionOnlyPvp", "Reaction only when PvP-flagged", -200, MTH_ICU_LAYOUT.RIGHT_X) if reactionOnlyPvp then - reactionOnlyPvp:SetScript("OnClick", function(self) - self = self or this - if not self then return end + reactionOnlyPvp:SetScript("OnClick", function() + if not this then return end local store = MTH_ICU_GetStore() - store.REACTION_ONLY_PVP_PLAYERS = self:GetChecked() == 1 and true or false + store.REACTION_ONLY_PVP_PLAYERS = this:GetChecked() == 1 and true or false end) MTH_ICU_OPT_STATE.controls.reactionOnlyPvp = reactionOnlyPvp end diff --git a/api/options-zbuttons.lua b/api/options-zbuttons.lua index 529e511..aa0cb48 100644 --- a/api/options-zbuttons.lua +++ b/api/options-zbuttons.lua @@ -195,15 +195,15 @@ local function MTH_EnsureAmmoOptionsWatcher() if MTH_AmmoOptionsWatcher then return end - MTH_AmmoOptionsWatcher = CreateFrame("Frame", "MTHAmmoOptionsWatcherFrame") + MTH_AmmoOptionsWatcher = CreateFrame("Frame", "MTH_AmmoOptionsWatcher") if not MTH_AmmoOptionsWatcher then return end MTH_AmmoOptionsWatcher:RegisterEvent("UNIT_INVENTORY_CHANGED") MTH_AmmoOptionsWatcher:RegisterEvent("BAG_UPDATE") - MTH_AmmoOptionsWatcher:SetScript("OnEvent", function(_, eventName, unit) - eventName = eventName or event - unit = unit or arg1 + MTH_AmmoOptionsWatcher:SetScript("OnEvent", function() + local eventName = event + local unit = arg1 if eventName == "UNIT_INVENTORY_CHANGED" and unit and unit ~= "player" then return end @@ -247,6 +247,16 @@ local function MTH_ZB_EnsureButtonOptionDefaults(buttonName) end saved["children"]["hideonclick"] = saved["children"]["hideonclick"] and true or false + if saved["children"]["expandonhover"] == nil then + saved["children"]["expandonhover"] = false + end + saved["children"]["expandonhover"] = saved["children"]["expandonhover"] and true or false + + if saved["children"]["fadetimer"] == nil then + saved["children"]["fadetimer"] = 0 + end + saved["children"]["fadetimer"] = tonumber(saved["children"]["fadetimer"]) or 0 + if type(saved["parent"]) ~= "table" then saved["parent"] = {} end @@ -333,16 +343,15 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma enableButton:SetChecked(enabledValue and true or false) enableButton.buttonName = buttonName enableButton.buttonObj = buttonObj - enableButton:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = MTH_ZB_IsChecked(self) - MTH_SetButtonEnabledState(self.buttonName, self.buttonObj, checked) + enableButton:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + MTH_SetButtonEnabledState(this.buttonName, this.buttonObj, checked) end) end local parentSection = MTH_ZB_EnsureSection(containerName.."ParentSection", MTH_ZB_L("ZB_SECTION_PARENT_BUTTON", "Parent Button"), -52, 116) - local childrenSection = MTH_ZB_EnsureSection(containerName.."ChildrenSection", MTH_ZB_L("ZB_SECTION_CHILDREN_BUTTONS", "Children Buttons"), -184, 235) + local childrenSection = MTH_ZB_EnsureSection(containerName.."ChildrenSection", MTH_ZB_L("ZB_SECTION_CHILDREN_BUTTONS", "Children Buttons"), -184, 310) local parentYOffset = -18 local childrenYOffset = -18 @@ -392,16 +401,15 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma expandLeft:SetChecked(saved["firstbutton"] == "LEFT") expandLeft.buttonName = buttonName expandLeft.buttonObj = buttonObj - expandLeft:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = MTH_ZB_IsChecked(self) - local btnName = self.buttonName + expandLeft:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + local btnName = this.buttonName if not btnName or not (ZHunterMod_Saved and ZHunterMod_Saved[btnName]) then return end ZHunterMod_Saved[btnName]["firstbutton"] = checked and "LEFT" or "RIGHT" ZHunterMod_Saved[btnName]["horizontal"] = checked and 1 or nil ZHunterMod_Saved[btnName]["vertical"] = checked and 1 or nil - MTH_RefreshButtonGeometry(btnName, self.buttonObj) + MTH_RefreshButtonGeometry(btnName, this.buttonObj) end) end childrenYOffset = childrenYOffset - 30 @@ -414,17 +422,64 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma if hideClick.buttonObj then hideClick.buttonObj.hideonclick = saved["children"]["hideonclick"] and true or false end - hideClick:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = MTH_ZB_IsChecked(self) - ZHunterMod_Saved[self.buttonName]["children"]["hideonclick"] = checked - local btnObj = self.buttonObj or getglobal(self.buttonName) + hideClick:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + ZHunterMod_Saved[this.buttonName]["children"]["hideonclick"] = checked + local btnObj = this.buttonObj or getglobal(this.buttonName) if btnObj then btnObj.hideonclick = checked end end) end childrenYOffset = childrenYOffset - 25 + local expandOnHover = MTH_CreateCheckbox(childrenSection or container, containerName.."ExpandOnHover", MTH_ZB_L("ZB_LABEL_EXPAND_ON_HOVER", "Expand on Hover"), childrenYOffset) + if expandOnHover then + expandOnHover:SetChecked(saved["children"]["expandonhover"]) + expandOnHover.buttonName = buttonName + expandOnHover.buttonObj = buttonObj + expandOnHover:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + local btnName = this.buttonName + if not btnName or not (ZHunterMod_Saved and ZHunterMod_Saved[btnName]) then return end + if not ZHunterMod_Saved[btnName]["children"] then + ZHunterMod_Saved[btnName]["children"] = {} + end + ZHunterMod_Saved[btnName]["children"]["expandonhover"] = checked + local btnObj = this.buttonObj or getglobal(btnName) + if btnObj then btnObj.expandonhover = checked end + end) + end + childrenYOffset = childrenYOffset - 40 + + local fadeTimer = MTH_CreateSlider(childrenSection or container, containerName.."FadeTimer", MTH_ZB_L("ZB_LABEL_AUTO_HIDE_TIMER", "Auto-Hide Timer (seconds)"), 0, 10, 1, childrenYOffset) + if fadeTimer then + fadeTimer:SetWidth(leftWidth - 40) + fadeTimer:SetValue(saved["children"]["fadetimer"] or 0) + fadeTimer.buttonName = buttonName + fadeTimer.buttonObj = buttonObj + fadeTimer.onChange = function(val, slider) + local frame = slider or fadeTimer + local btnName = frame and frame.buttonName + if not btnName or not (ZHunterMod_Saved and ZHunterMod_Saved[btnName]) then return end + if not ZHunterMod_Saved[btnName]["children"] then + ZHunterMod_Saved[btnName]["children"] = {} + end + local secs = math.floor((val or 0) + 0.5) + ZHunterMod_Saved[btnName]["children"]["fadetimer"] = secs + local btnObj = frame.buttonObj or getglobal(btnName) + if btnObj then + btnObj.fadetimer = secs + if secs <= 0 then + ZSpellButton_StopFadeTimer(btnObj) + elseif btnObj.children and btnObj.children:IsVisible() then + ZSpellButton_StartFadeTimer(btnObj) + end + end + end + end + childrenYOffset = childrenYOffset - 50 + local showTooltip = MTH_CreateCheckbox(childrenSection or container, containerName.."ShowTooltip", MTH_ZB_L("ZB_LABEL_SHOW_TOOLTIP", "Show Tooltip"), childrenYOffset) if showTooltip then showTooltip:SetChecked(saved["tooltip"]) @@ -433,12 +488,11 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma if showTooltip.buttonObj then showTooltip.buttonObj.tooltip = saved["tooltip"] and true or false end - showTooltip:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = MTH_ZB_IsChecked(self) - ZHunterMod_Saved[self.buttonName]["tooltip"] = checked - local btnObj = self.buttonObj or getglobal(self.buttonName) + showTooltip:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + ZHunterMod_Saved[this.buttonName]["tooltip"] = checked + local btnObj = this.buttonObj or getglobal(this.buttonName) if btnObj then btnObj.tooltip = checked end end) end @@ -451,13 +505,12 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma showAmmoName.buttonName = buttonName showAmmoName.buttonObj = buttonObj showAmmoName.maxButtons = maxButtons - showAmmoName:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = MTH_ZB_IsChecked(self) - local btnName = self.buttonName + showAmmoName:SetScript("OnClick", function() + if not this then return end + local checked = MTH_ZB_IsChecked(this) + local btnName = this.buttonName ZHunterMod_Saved[btnName]["showammoname"] = checked - local btnObj = self.buttonObj or getglobal(btnName) + local btnObj = this.buttonObj or getglobal(btnName) if btnObj then for i = 1, (btnObj.count or 0) do local child = getglobal(btnName..i) @@ -506,13 +559,12 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma hideButton:SetChecked(saved["parent"]["hide"]) hideButton.buttonName = buttonName hideButton.buttonObj = buttonObj - hideButton:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = self:GetChecked() == 1 - ZHunterMod_Saved[self.buttonName]["parent"]["hide"] = checked - if self.buttonObj then - if checked then self.buttonObj:Hide() else self.buttonObj:Show() end + hideButton:SetScript("OnClick", function() + if not this then return end + local checked = this:GetChecked() == 1 + ZHunterMod_Saved[this.buttonName]["parent"]["hide"] = checked + if this.buttonObj then + if checked then this.buttonObj:Hide() else this.buttonObj:Show() end end end) end @@ -523,13 +575,12 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma useCircle:SetChecked(saved["parent"]["circle"]) useCircle.buttonName = buttonName useCircle.buttonObj = buttonObj - useCircle:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = self:GetChecked() == 1 - ZHunterMod_Saved[self.buttonName]["parent"]["circle"] = checked - if self.buttonObj and self.buttonObj.circle then - if checked then self.buttonObj.circle:Show() else self.buttonObj.circle:Hide() end + useCircle:SetScript("OnClick", function() + if not this then return end + local checked = this:GetChecked() == 1 + ZHunterMod_Saved[this.buttonName]["parent"]["circle"] = checked + if this.buttonObj and this.buttonObj.circle then + if checked then this.buttonObj.circle:Show() else this.buttonObj.circle:Hide() end end end) end @@ -587,17 +638,16 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma showText:SetText("") end showToggle:SetChecked(ZHunterMod_Saved[buttonName]["visible"][showToggle.spellIndex] ~= false) - showToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local checked = self:GetChecked() == 1 - local btnName = self.buttonName - local visibleIndex = self.spellIndex + showToggle:SetScript("OnClick", function() + if not this then return end + local checked = this:GetChecked() == 1 + local btnName = this.buttonName + local visibleIndex = this.spellIndex if not ZHunterMod_Saved[btnName]["visible"] then ZHunterMod_Saved[btnName]["visible"] = {} end ZHunterMod_Saved[btnName]["visible"][visibleIndex] = checked - MTH_RefreshButtonLayout(btnName, self.buttonObj, self.itemList, self.maxButtons) + MTH_RefreshButtonLayout(btnName, this.buttonObj, this.itemList, this.maxButtons) end) end @@ -612,18 +662,17 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma downBtn.buttonObj = buttonObj downBtn.itemList = itemList downBtn.maxButtons = maxButtons - downBtn:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local idx = self.spellIndex - local btnName = self.buttonName - local contName = self.containerName - local maxBtns = self.maxButtons + downBtn:SetScript("OnClick", function() + if not this then return end + local idx = this.spellIndex + local btnName = this.buttonName + local contName = this.containerName + local maxBtns = this.maxButtons if idx < maxBtns then local temp = ZHunterMod_Saved[btnName]["spells"][idx+1] ZHunterMod_Saved[btnName]["spells"][idx+1] = ZHunterMod_Saved[btnName]["spells"][idx] ZHunterMod_Saved[btnName]["spells"][idx] = temp - MTH_RebuildSpellOrder(btnName, self.buttonObj, self.itemList, self.maxButtons) + MTH_RebuildSpellOrder(btnName, this.buttonObj, this.itemList, this.maxButtons) local tabName = gsub(contName, "MetaHuntOptions", "") MTH_ZB_RefreshTab(tabName) end @@ -640,17 +689,16 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma upBtn.buttonObj = buttonObj upBtn.itemList = itemList upBtn.maxButtons = maxButtons - upBtn:SetScript("OnClick", function(self) - self = self or this - if not self then return end - local idx = self.spellIndex - local btnName = self.buttonName - local contName = self.containerName + upBtn:SetScript("OnClick", function() + if not this then return end + local idx = this.spellIndex + local btnName = this.buttonName + local contName = this.containerName if idx > 1 then local temp = ZHunterMod_Saved[btnName]["spells"][idx-1] ZHunterMod_Saved[btnName]["spells"][idx-1] = ZHunterMod_Saved[btnName]["spells"][idx] ZHunterMod_Saved[btnName]["spells"][idx] = temp - MTH_RebuildSpellOrder(btnName, self.buttonObj, self.itemList, self.maxButtons) + MTH_RebuildSpellOrder(btnName, this.buttonObj, this.itemList, this.maxButtons) local tabName = gsub(contName, "MetaHuntOptions", "") MTH_ZB_RefreshTab(tabName) end @@ -749,11 +797,10 @@ function MTH_SetupSmartAmmoOptions() end if moduleToggle then moduleToggle:SetChecked(moduleEnabled) - moduleToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + moduleToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetModuleEnabled then - MTH:SetModuleEnabled("smartammo", MTH_ZB_IsChecked(self)) + MTH:SetModuleEnabled("smartammo", MTH_ZB_IsChecked(this)) end MTH_SetupSmartAmmoOptions() end) @@ -766,11 +813,10 @@ function MTH_SetupSmartAmmoOptions() if not moduleEnabled then smartToggle:Disable() end - smartToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + smartToggle:SetScript("OnClick", function() + if not this then return end if type(MTHSmartAmmo_SetSmartEnabled) == "function" then - MTHSmartAmmo_SetSmartEnabled(MTH_ZB_IsChecked(self) and 1 or nil) + MTHSmartAmmo_SetSmartEnabled(MTH_ZB_IsChecked(this) and 1 or nil) end end) end @@ -785,11 +831,10 @@ function MTH_SetupSmartAmmoOptions() if not moduleEnabled then reloadToggle:Disable() end - reloadToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + reloadToggle:SetScript("OnClick", function() + if not this then return end if type(MTHSmartAmmo_SetReloadEnabled) == "function" then - MTHSmartAmmo_SetReloadEnabled(MTH_ZB_IsChecked(self) and 1 or nil) + MTHSmartAmmo_SetReloadEnabled(MTH_ZB_IsChecked(this) and 1 or nil) end end) end @@ -825,11 +870,10 @@ function MTH_SetupMessagesOptions() local initModulesToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesInitModules", "Init : modules loaded", -36) if initModulesToggle then initModulesToggle:SetChecked(msgSettings.initModulesLoaded and true or false) - initModulesToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + initModulesToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("initModulesLoaded", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("initModulesLoaded", MTH_ZB_IsChecked(this)) end end) end @@ -837,11 +881,10 @@ function MTH_SetupMessagesOptions() local initWelcomeToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesInitWelcome", "Init : Sarcastic welcome message", -64) if initWelcomeToggle then initWelcomeToggle:SetChecked(msgSettings.initSarcasticWelcome ~= false) - initWelcomeToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + initWelcomeToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("initSarcasticWelcome", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("initSarcasticWelcome", MTH_ZB_IsChecked(this)) end end) end @@ -849,11 +892,10 @@ function MTH_SetupMessagesOptions() local petHungryToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesPetHungry", "Pet is hungry (spam)", -92) if petHungryToggle then petHungryToggle:SetChecked(msgSettings.petHungry and true or false) - petHungryToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + petHungryToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("petHungry", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("petHungry", MTH_ZB_IsChecked(this)) end end) end @@ -861,11 +903,10 @@ function MTH_SetupMessagesOptions() local beastTrainingScanToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesBeastTrainingScan", "Beasttraining scan", -120) if beastTrainingScanToggle then beastTrainingScanToggle:SetChecked(msgSettings.beastTrainingScan ~= false) - beastTrainingScanToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + beastTrainingScanToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("beastTrainingScan", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("beastTrainingScan", MTH_ZB_IsChecked(this)) end end) end @@ -873,11 +914,10 @@ function MTH_SetupMessagesOptions() local spellbookScanToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesSpellbookScan", "Spellbook scan", -148) if spellbookScanToggle then spellbookScanToggle:SetChecked(msgSettings.spellbookScan and true or false) - spellbookScanToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + spellbookScanToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("spellbookScan", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("spellbookScan", MTH_ZB_IsChecked(this)) end end) end @@ -885,11 +925,10 @@ function MTH_SetupMessagesOptions() local petRanAwayToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesPetRanAway", "Pet ran away", -176) if petRanAwayToggle then petRanAwayToggle:SetChecked(msgSettings.petRanAway ~= false) - petRanAwayToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + petRanAwayToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("petRanAway", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("petRanAway", MTH_ZB_IsChecked(this)) end end) end @@ -897,11 +936,10 @@ function MTH_SetupMessagesOptions() local mapMarkersToggle = MTH_CreateCheckbox(section, "MetaHuntMessagesMapMarkers", "Map markers", -204) if mapMarkersToggle then mapMarkersToggle:SetChecked(msgSettings.mapMarkers ~= false) - mapMarkersToggle:SetScript("OnClick", function(self) - self = self or this - if not self then return end + mapMarkersToggle:SetScript("OnClick", function() + if not this then return end if MTH and MTH.SetMessageEnabled then - MTH:SetMessageEnabled("mapMarkers", MTH_ZB_IsChecked(self)) + MTH:SetMessageEnabled("mapMarkers", MTH_ZB_IsChecked(this)) end end) end diff --git a/api/options.lua b/api/options.lua index 58d2835..830796e 100644 --- a/api/options.lua +++ b/api/options.lua @@ -68,9 +68,9 @@ function MTH_CreateSlider(parent, name, label, minVal, maxVal, step, yOffset) if lowLabel then lowLabel:Hide() end if highLabel then highLabel:Hide() end - slider:SetScript("OnValueChanged", function(self, newValue) - local activeSlider = self or this or slider - local current = tonumber(newValue) + slider:SetScript("OnValueChanged", function() + local activeSlider = this or this or slider + local current = tonumber(arg1) if not current and activeSlider and activeSlider.GetValue then current = tonumber(activeSlider:GetValue()) end diff --git a/api/uirenderer.lua b/api/uirenderer.lua index 0e6d4bd..ba40eeb 100644 --- a/api/uirenderer.lua +++ b/api/uirenderer.lua @@ -65,11 +65,10 @@ local function MTH_UIR_CreateControl(frame, key, option, context, x, y, width) checkButton:SetPoint("TOPLEFT", frame, "TOPLEFT", x, y + 2) checkButton:SetChecked(MTH_UI.ResolveValue(option.get, context) and 1 or nil) MTH_UIR_SetCheckboxLabel(checkButton, optionName or "") - checkButton:SetScript("OnClick", function(self) - self = self or this - if not self then return end + checkButton:SetScript("OnClick", function() + if not this then return end if option.set then - option.set(context, self:GetChecked() == 1) + option.set(context, this:GetChecked() == 1) end end) if MTH_UI.ResolveValue(option.disabled, context) then @@ -100,8 +99,8 @@ local function MTH_UIR_CreateControl(frame, key, option, context, x, y, width) text:SetText(optionName or "Run") text:SetTextColor(1.00, 0.82, 0.00) - button:SetScript("OnEnter", function(self) self = self or this if self then self:SetBackdropBorderColor(0.6, 0.6, 0.6) end end) - button:SetScript("OnLeave", function(self) self = self or this if self then self:SetBackdropBorderColor(0.4, 0.4, 0.4) end end) + button:SetScript("OnEnter", function() if this then this:SetBackdropBorderColor(0.6, 0.6, 0.6) end end) + button:SetScript("OnLeave", function() if this then this:SetBackdropBorderColor(0.4, 0.4, 0.4) end end) button:SetScript("OnClick", function() if option.func then option.func(context) @@ -139,8 +138,8 @@ local function MTH_UIR_CreateControl(frame, key, option, context, x, y, width) text:SetText(tostring(currentValue or "Choose")) text:SetTextColor(0.90, 0.90, 0.90) - button:SetScript("OnEnter", function(self) self = self or this if self then self:SetBackdropBorderColor(0.6, 0.6, 0.6) end end) - button:SetScript("OnLeave", function(self) self = self or this if self then self:SetBackdropBorderColor(0.4, 0.4, 0.4) end end) + button:SetScript("OnEnter", function() if this then this:SetBackdropBorderColor(0.6, 0.6, 0.6) end end) + button:SetScript("OnLeave", function() if this then this:SetBackdropBorderColor(0.4, 0.4, 0.4) end end) button:SetScript("OnClick", function() if option.onClick then option.onClick(context, option) diff --git a/api/version-check.lua b/api/version-check.lua index 9f90ba6..804b5c0 100644 --- a/api/version-check.lua +++ b/api/version-check.lua @@ -6,6 +6,7 @@ VC.abbrev = "MTH" VC.channelName = "LFT" VC.updateUrl = "https://github.com/DuvelCorp/MetaHunt" VC.nextPublishAt = nil +VC.lastPublishedAt = nil VC.joinAt = nil VC.notified = false VC._invalidVersionWarned = false @@ -219,7 +220,11 @@ function VC:GetTrackedPeers() end function VC:ResetPublishDelay() - self.nextPublishAt = VC_GetTimeNow() + math.random(10, 20) + local now = VC_GetTimeNow() + if self.lastPublishedAt and (now - self.lastPublishedAt) < 600 then + return -- 10-minute cooldown between publishes + end + self.nextPublishAt = now + math.random(10, 20) end function VC:ShouldPublish() @@ -247,6 +252,7 @@ function VC:TryPublish() end local payload = self.abbrev .. ":" .. tostring(localVersionNumber) .. ":v" SendChatMessage(payload, "CHANNEL", nil, tostring(channelId)) + self.lastPublishedAt = VC_GetTimeNow() return true end @@ -305,7 +311,7 @@ function VC:HandleRemoteMessage(message, author, channelLabel) end if not VC.frame then - local frame = CreateFrame("Frame", "MTHVersionCheckFrame", UIParent) + local frame = CreateFrame("Frame", "MTH_VersionCheck", UIParent) if frame then VC.frame = frame frame:RegisterEvent("PLAYER_ENTERING_WORLD") diff --git a/data/ds-zones.lua b/data/ds-zones.lua index fa2ef50..56b92a0 100644 --- a/data/ds-zones.lua +++ b/data/ds-zones.lua @@ -16,8 +16,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordhaintal", ["enUS"] = "Northshire Valley", ["esES"] = "Valle de Villanorte", - ["frFR"] = "Vallée de Northshire", - ["koKR"] = "노스샤이어 계곡", ["ptBR"] = "Vale Northshire", ["ruRU"] = "Долина Североземья", ["zhCN"] = "北郡山谷", @@ -35,8 +33,6 @@ MTH_DS_Zones = { ["deDE"] = "Kristallsee", ["enUS"] = "Crystal Lake", ["esES"] = "Lago Cristal", - ["frFR"] = "Lac de Cristal", - ["koKR"] = "수정 호수", ["ptBR"] = "Lago Cristalino", ["ruRU"] = "Озеро Хрустальное", ["zhCN"] = "水晶湖", @@ -54,8 +50,6 @@ MTH_DS_Zones = { ["deDE"] = "Zul\'Gurub", ["enUS"] = "Zul\'Gurub", ["esES"] = "Zul\'Gurub", - ["frFR"] = "Zul\'Gurub", - ["koKR"] = "줄구룹", ["ptBR"] = "Zul\'Gurub", ["ruRU"] = "Зул\'Гуруб", ["zhCN"] = "祖尔格拉布", @@ -73,8 +67,6 @@ MTH_DS_Zones = { ["deDE"] = "Mondbruch", ["enUS"] = "Moonbrook", ["esES"] = "Arroyo de la Luna", - ["frFR"] = "Ruisselune", - ["koKR"] = "문브룩", ["ptBR"] = "Moonbrook", ["ruRU"] = "Луноречье", ["zhCN"] = "月溪镇", @@ -92,8 +84,6 @@ MTH_DS_Zones = { ["deDE"] = "Beutebucht", ["enUS"] = "Booty Bay", ["esES"] = "Bahía del Botín", - ["frFR"] = "Baie-du-Butin", - ["koKR"] = "무법항", ["ptBR"] = "Angra do Butim", ["ruRU"] = "Пиратская Бухта", ["zhCN"] = "藏宝海湾", @@ -111,8 +101,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Nazferitisee", ["enUS"] = "Lake Nazferiti", ["esES"] = "Lago Nazferiti", - ["frFR"] = "Lac Nazfériti", - ["koKR"] = "나즈페리티 호수", ["ptBR"] = "Lago Nazferiti", ["ruRU"] = "Озеро Назферити", ["zhCN"] = "纳菲瑞提湖", @@ -130,8 +118,6 @@ MTH_DS_Zones = { ["deDE"] = "Dunkelhain", ["enUS"] = "Darkshire", ["esES"] = "Villa Oscura", - ["frFR"] = "Darkshire", - ["koKR"] = "다크샤이어", ["ptBR"] = "Vila Sombria", ["ruRU"] = "Темнолесье", ["zhCN"] = "夜色镇", @@ -149,8 +135,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Wilden Ufer", ["enUS"] = "Wild Shore", ["esES"] = "Costa Salvaje", - ["frFR"] = "Le Rivage cruel", - ["koKR"] = "거친 해안", ["ptBR"] = "Costa Selvagem", ["ruRU"] = "Пустынный берег", ["zhCN"] = "蛮荒海岸", @@ -168,8 +152,6 @@ MTH_DS_Zones = { ["deDE"] = "Tiefenschachtmine", ["enUS"] = "Fargodeep Mine", ["esES"] = "Mina Abisal", - ["frFR"] = "Mine de Fargodeep", - ["koKR"] = "개미굴 광산", ["ptBR"] = "Mina Vistafunda", ["ruRU"] = "Рудник Подземных Глубин", ["zhCN"] = "法戈第矿洞", @@ -187,8 +169,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Waldrand", ["enUS"] = "Forest\'s Edge", ["esES"] = "Linde del Bosque", - ["frFR"] = "La Lisière", - ["koKR"] = "숲 가장자리", ["ptBR"] = "Margem da Floresta", ["ruRU"] = "Лесная опушка", ["zhCN"] = "林边空地", @@ -206,8 +186,6 @@ MTH_DS_Zones = { ["deDE"] = "Brackbrunns Kürbisbeet", ["enUS"] = "Brackwell Pumpkin Patch", ["esES"] = "Campo de Calabazas Brackwell", - ["frFR"] = "Champ de potirons des Brackwell", - ["koKR"] = "브랙웰 호박밭", ["ptBR"] = "Campo de Abóboras de Brackwell", ["ruRU"] = "Тыквенное поле Бреквеллов", ["zhCN"] = "布莱克威尔南瓜田", @@ -225,8 +203,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Immerruhsee", ["enUS"] = "Lake Everstill", ["esES"] = "Lago Siemprequieto", - ["frFR"] = "Lac placide", - ["koKR"] = "영원의 호수", ["ptBR"] = "Lago Everstill", ["ruRU"] = "Озеро Безмолвия", ["zhCN"] = "止水湖", @@ -244,8 +220,6 @@ MTH_DS_Zones = { ["deDE"] = "Seenhain", ["enUS"] = "Lakeshire", ["esES"] = "Villa del Lago", - ["frFR"] = "Lakeshire", - ["koKR"] = "레이크샤이어", ["ptBR"] = "Lakeshire", ["ruRU"] = "Приозерье", ["zhCN"] = "湖畔镇", @@ -263,8 +237,6 @@ MTH_DS_Zones = { ["deDE"] = "Steinwacht", ["enUS"] = "Stonewatch", ["esES"] = "Vigilancia de Piedra", - ["frFR"] = "Guet-de-pierre", - ["koKR"] = "돌망루 요새", ["ptBR"] = "Stonewatch", ["ruRU"] = "Крепость Каменной Стражи", ["zhCN"] = "石堡", @@ -282,8 +254,6 @@ MTH_DS_Zones = { ["deDE"] = "Steinwachtfälle", ["enUS"] = "Stonewatch Falls", ["esES"] = "Cataratas Vigilancia de Piedra", - ["frFR"] = "Chutes de Guet-de-pierre", - ["koKR"] = "함락된 돌망루 요새", ["ptBR"] = "Cataratas Stonewatch", ["ruRU"] = "Водопад Каменной Стражи", ["zhCN"] = "石堡瀑布", @@ -301,8 +271,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Dunkle Portal", ["enUS"] = "The Dark Portal", ["esES"] = "El Portal Oscuro", - ["frFR"] = "La Porte des ténèbres", - ["koKR"] = "어둠의 문", ["ptBR"] = "O Portal Negro", ["ruRU"] = "Темный портал", ["zhCN"] = "黑暗之门", @@ -320,8 +288,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Faulende Narbe", ["enUS"] = "The Tainted Scar", ["esES"] = "La Cicatriz Manchada", - ["frFR"] = "La Balafre impure", - ["koKR"] = "타락의 흉터", ["ptBR"] = "A Cicatriz Corrompida", ["ruRU"] = "Гниющий шрам", ["zhCN"] = "腐烂之痕", @@ -339,8 +305,6 @@ MTH_DS_Zones = { ["deDE"] = "Tränenteich", ["enUS"] = "Pool of Tears", ["esES"] = "Charca de Lágrimas", - ["frFR"] = "Bassin des larmes", - ["koKR"] = "눈물의 연못", ["ptBR"] = "Poço das Lágrimas", ["ruRU"] = "Озеро Слез", ["zhCN"] = "泪水之池", @@ -358,8 +322,6 @@ MTH_DS_Zones = { ["deDE"] = "Steinard", ["enUS"] = "Stonard", ["esES"] = "Rocal", - ["frFR"] = "Stonard", - ["koKR"] = "스토나드", ["ptBR"] = "Stonard", ["ruRU"] = "Каменор", ["zhCN"] = "斯通纳德", @@ -377,8 +339,6 @@ MTH_DS_Zones = { ["deDE"] = "Zuflucht der Verirrten", ["enUS"] = "Fallow Sanctuary", ["esES"] = "Santuario Baldío", - ["frFR"] = "Sanctuaire des friches", - ["koKR"] = "드레노어 성역", ["ptBR"] = "Santuário Esquecido", ["ruRU"] = "Болотное пристанище", ["zhCN"] = "农田避难所", @@ -396,8 +356,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Steinhügelsee", ["enUS"] = "Stone Cairn Lake", ["esES"] = "Lago del Hito", - ["frFR"] = "Lac du Cairn", - ["koKR"] = "돌무덤 호수", ["ptBR"] = "Lago Stone Cairn", ["ruRU"] = "Озеро Каменных Столбов", ["zhCN"] = "石碑湖", @@ -415,8 +373,6 @@ MTH_DS_Zones = { ["deDE"] = "Goldhain", ["enUS"] = "Goldshire", ["esES"] = "Villadorada", - ["frFR"] = "Goldshire", - ["koKR"] = "골드샤이어", ["ptBR"] = "Vila d\'Ouro", ["ruRU"] = "Златоземье", ["zhCN"] = "闪金镇", @@ -434,8 +390,6 @@ MTH_DS_Zones = { ["deDE"] = "Holzfällerlager des Osttals", ["enUS"] = "Eastvale Logging Camp", ["esES"] = "Aserradero de la Vega del Este", - ["frFR"] = "Camp de bûcherons du Val d\'est", - ["koKR"] = "동부 벌목지", ["ptBR"] = "Campo Lenhador do Vale do Leste", ["ruRU"] = "Лесопилка Восточной долины", ["zhCN"] = "东谷伐木场", @@ -453,8 +407,6 @@ MTH_DS_Zones = { ["deDE"] = "Turm von Azora", ["enUS"] = "Tower of Azora", ["esES"] = "Torre de Azora", - ["frFR"] = "Tour d\'Azora", - ["koKR"] = "아조라의 탑", ["ptBR"] = "A Torre de Azora", ["ruRU"] = "Башня Азоры", ["zhCN"] = "阿祖拉之塔", @@ -472,8 +424,6 @@ MTH_DS_Zones = { ["deDE"] = "Ogerhort Vul\'Gol", ["enUS"] = "Vul\'Gol Ogre Mound", ["esES"] = "Túmulo de Ogro de Vul\'Gol", - ["frFR"] = "Tertre des ogres Vul\'Gol", - ["koKR"] = "벌골 오우거 소굴", ["ptBR"] = "Montículo de Ogros Vul\'Gol", ["ruRU"] = "Лощина Вул\'Гол", ["zhCN"] = "沃古尔食人魔山", @@ -491,8 +441,6 @@ MTH_DS_Zones = { ["deDE"] = "Rabenflucht", ["enUS"] = "Raven Hill", ["esES"] = "Colina del Cuervo", - ["frFR"] = "Colline-aux-Corbeaux", - ["koKR"] = "까마귀 언덕", ["ptBR"] = "Colina do Corvo", ["ruRU"] = "Вороний Холм", ["zhCN"] = "乌鸦岭", @@ -510,8 +458,6 @@ MTH_DS_Zones = { ["deDE"] = "Rotkammschlucht", ["enUS"] = "Redridge Canyons", ["esES"] = "Montañas Crestagrana", - ["frFR"] = "Canyons des Carmines", - ["koKR"] = "붉은마루 협곡", ["ptBR"] = "Cânions Redridge", ["ruRU"] = "Каньоны Красногорья", ["zhCN"] = "赤脊峡谷", @@ -529,8 +475,6 @@ MTH_DS_Zones = { ["deDE"] = "Althers Mühle", ["enUS"] = "Alther\'s Mill", ["esES"] = "Molino de Alther", - ["frFR"] = "Scierie d\'Alther", - ["koKR"] = "앨더의 제재소", ["ptBR"] = "Serraria de Alther", ["ruRU"] = "Лесопилка Альтера", ["zhCN"] = "奥瑟尔伐木场", @@ -548,8 +492,6 @@ MTH_DS_Zones = { ["deDE"] = "Rebellenlager", ["enUS"] = "Rebel Camp", ["esES"] = "Campamento Rebelde", - ["frFR"] = "Camp rebelle", - ["koKR"] = "반란군 야영지", ["ptBR"] = "Acampamento Rebelde", ["ruRU"] = "Лагерь Повстанцев", ["zhCN"] = "反抗军营地", @@ -567,8 +509,6 @@ MTH_DS_Zones = { ["deDE"] = "Nesingwarys Expedition", ["enUS"] = "Nesingwary\'s Expedition", ["esES"] = "Expedición de Nesingwary", - ["frFR"] = "Expédition de Nesingwary", - ["koKR"] = "네싱워리 원정대", ["ptBR"] = "Expedição de Nesingwary", ["ruRU"] = "Экспедиция Эрнестуэя", ["zhCN"] = "奈辛瓦里远征队营地", @@ -586,8 +526,6 @@ MTH_DS_Zones = { ["deDE"] = "Kurzens Truppenlager", ["enUS"] = "Kurzen\'s Compound", ["esES"] = "Compuesto de Kurzen", - ["frFR"] = "Base de Kurzen", - ["koKR"] = "쿠르젠 주둔지", ["ptBR"] = "Complexo de Kurzen", ["ruRU"] = "Лагерь Курцена", ["zhCN"] = "库尔森的营地", @@ -605,8 +543,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Zul\'Kunda", ["enUS"] = "Ruins of Zul\'Kunda", ["esES"] = "Ruinas de Zul\'Kunda", - ["frFR"] = "Ruines de Zul\'Kunda", - ["koKR"] = "줄쿤다의 폐허", ["ptBR"] = "Ruínas de Zul\'Kunda", ["ruRU"] = "Руины Зул\'Кунды", ["zhCN"] = "祖昆达废墟", @@ -624,8 +560,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Zul\'Mamwe", ["enUS"] = "Ruins of Zul\'Mamwe", ["esES"] = "Ruinas de Zul\'Mamwe", - ["frFR"] = "Ruines de Zul\'Mamwe", - ["koKR"] = "줄맘웨의 폐허", ["ptBR"] = "Ruínas de Zul\'Mamwe", ["ruRU"] = "Руины Зул\'Мамве", ["zhCN"] = "祖玛维废墟", @@ -643,8 +577,6 @@ MTH_DS_Zones = { ["deDE"] = "Das finstere Riff", ["enUS"] = "The Vile Reef", ["esES"] = "El Arrecife Vil", - ["frFR"] = "Le Récif infâme", - ["koKR"] = "썩은내 산호초", ["ptBR"] = "O Arrecife Vil", ["ruRU"] = "Коварный риф", ["zhCN"] = "暗礁海", @@ -662,8 +594,6 @@ MTH_DS_Zones = { ["deDE"] = "Ogerhügel der Mosh\'Ogg", ["enUS"] = "Mosh\'Ogg Ogre Mound", ["esES"] = "Túmulo de Ogro Mosh\'Ogg", - ["frFR"] = "Tertre des ogres Mosh\'Ogg", - ["koKR"] = "모쉬오그 오우거 소굴", ["ptBR"] = "Monte dos Ogros Mosh\'Ogg", ["ruRU"] = "Холм Мош\'Огг", ["zhCN"] = "莫什奥格食人魔山", @@ -681,8 +611,6 @@ MTH_DS_Zones = { ["deDE"] = "Saldeans Hof", ["enUS"] = "Saldean\'s Farm", ["esES"] = "Granja de Saldean", - ["frFR"] = "Ferme des Saldean", - ["koKR"] = "살딘 농장", ["ptBR"] = "Fazenda Saldean", ["ruRU"] = "Ферма Сальдена", ["zhCN"] = "萨丁农场", @@ -700,8 +628,6 @@ MTH_DS_Zones = { ["deDE"] = "Späherkuppe", ["enUS"] = "Sentinel Hill", ["esES"] = "Colina del Centinela", - ["frFR"] = "Colline des sentinelles", - ["koKR"] = "감시의 언덕", ["ptBR"] = "Colina Sentinel", ["ruRU"] = "Сторожевой холм", ["zhCN"] = "哨兵岭", @@ -719,8 +645,6 @@ MTH_DS_Zones = { ["deDE"] = "Brauenwirbels Kürbishof", ["enUS"] = "Furlbrow\'s Pumpkin Farm", ["esES"] = "Granja de Calabazas Furlbrow", - ["frFR"] = "Ferme de potirons de Furlbrow", - ["koKR"] = "펄브로우 호박밭", ["ptBR"] = "Fazenda de Abóboras dos Monrabo", ["ruRU"] = "Тыквенная ферма Хмуроброва", ["zhCN"] = "法布隆南瓜农场", @@ -738,8 +662,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Jangoschacht", ["enUS"] = "Jangolode Mine", ["esES"] = "Mina Jangolode", - ["frFR"] = "Mine de Jangolode", - ["koKR"] = "장고로드 광산", ["ptBR"] = "Mina Jangolode", ["ruRU"] = "Рудник Янго", ["zhCN"] = "詹戈洛德矿洞", @@ -757,8 +679,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Goldküstensteinbruch", ["enUS"] = "Gold Coast Quarry", ["esES"] = "Mina de la Costa del Oro", - ["frFR"] = "Carrière de la côte de l\'Or", - ["koKR"] = "황금해안 채석장", ["ptBR"] = "Pedreira da Costa Dourada", ["ruRU"] = "Прииск на Золотом Берегу", ["zhCN"] = "金海岸矿洞", @@ -776,8 +696,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Leuchtturm von Westfall", ["enUS"] = "Westfall Lighthouse", ["esES"] = "Faro de Páramos de Poniente", - ["frFR"] = "Phare de l\'Ouest", - ["koKR"] = "서부 몰락지대 등대", ["ptBR"] = "Farol de Westfall", ["ruRU"] = "Маяк в Западном Крае", ["zhCN"] = "西部荒野灯塔", @@ -795,8 +713,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Neblige Tal", ["enUS"] = "Misty Valley", ["esES"] = "Valle Brumoso", - ["frFR"] = "Vallée des brumes", - ["koKR"] = "안개 골짜기", ["ptBR"] = "Valle Nebuloso", ["ruRU"] = "Туманная долина", ["zhCN"] = "迷雾谷", @@ -814,8 +730,6 @@ MTH_DS_Zones = { ["deDE"] = "Basislager Grom\'gol", ["enUS"] = "Grom\'gol Base Camp", ["esES"] = "Campamento Base Grom\'gol", - ["frFR"] = "Campement Grom\'gol", - ["koKR"] = "그롬골 주둔지", ["ptBR"] = "Acampamento Base de Grom\'gol", ["ruRU"] = "Лагерь Гром\'гол", ["zhCN"] = "格罗姆高营地", @@ -833,8 +747,6 @@ MTH_DS_Zones = { ["deDE"] = "Whelgars Ausgrabungsstätte", ["enUS"] = "Whelgar\'s Excavation Site", ["esES"] = "Sitio de Excavación de Whelgar", - ["frFR"] = "Excavations de Whelgar", - ["koKR"] = "웰가르의 발굴현장", ["ptBR"] = "Sítio de Escavação de Whelgar", ["ruRU"] = "Раскопки Вельгара", ["zhCN"] = "维尔加挖掘场", @@ -851,8 +763,6 @@ MTH_DS_Zones = { ["names"] = { ["enUS"] = "Tranquil Gardens Cemetery", ["esES"] = "Cementerio de los Jardines Tranquilos", - ["frFR"] = "Cimetière des jardins paisibles", - ["koKR"] = "고요의 정원 묘지", ["ptBR"] = "O Cemitério dos Jardins Tranquilos", ["ruRU"] = "Безмятежное кладбище", ["zhCN"] = "静谧花园墓场", @@ -870,8 +780,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Zuuldaia", ["enUS"] = "Zuuldaia Ruins", ["esES"] = "Ruinas de Zuuldaia", - ["frFR"] = "Ruines de Zuuldaia", - ["koKR"] = "줄다이아 폐허", ["ptBR"] = "Ruínas Zuuldaia", ["ruRU"] = "Руины Зуулдая", ["zhCN"] = "祖丹亚废墟", @@ -889,8 +797,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Bal\'lal", ["enUS"] = "Bal\'lal Ruins", ["esES"] = "Ruinas de Bal\'lal", - ["frFR"] = "Ruines de Bal\'lal", - ["koKR"] = "발랄 폐허", ["ptBR"] = "Ruínas de Bal\'lal", ["ruRU"] = "Руины Бал\'лал", ["zhCN"] = "巴拉尔废墟", @@ -908,8 +814,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Kal\'ai", ["enUS"] = "Kal\'ai Ruins", ["esES"] = "Ruinas de Kal\'ai", - ["frFR"] = "Ruines de Kal\'ai", - ["koKR"] = "칼아이 폐허", ["ptBR"] = "Ruínas Kal\'ai", ["ruRU"] = "Руины Кал\'аи", ["zhCN"] = "卡莱废墟", @@ -927,8 +831,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Balia\'mah", ["enUS"] = "Balia\'mah Ruins", ["esES"] = "Ruinas de Balia\'mah", - ["frFR"] = "Ruines de Balia\'mah", - ["koKR"] = "발리아마 폐허", ["ptBR"] = "Ruínas de Balia\'mah", ["ruRU"] = "Руины Балиа\'ма", ["zhCN"] = "巴里亚曼废墟", @@ -946,8 +848,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Ziata\'jai", ["enUS"] = "Ziata\'jai Ruins", ["esES"] = "Ruinas de Ziata\'jai", - ["frFR"] = "Ruines de Ziata\'jai", - ["koKR"] = "지아타자이 폐허", ["ptBR"] = "Ruínas Ziata\'jai", ["ruRU"] = "Руины Зиата\'джаи", ["zhCN"] = "赞塔加废墟", @@ -965,8 +865,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Mizjah", ["enUS"] = "Mizjah Ruins", ["esES"] = "Ruinas de Mizjah", - ["frFR"] = "Ruines de Mizjah", - ["koKR"] = "미즈자 폐허", ["ptBR"] = "Ruínas Mizjah", ["ruRU"] = "Руины Мизжа", ["zhCN"] = "米扎废墟", @@ -984,8 +882,6 @@ MTH_DS_Zones = { ["deDE"] = "Kharanos", ["enUS"] = "Kharanos", ["esES"] = "Kharanos", - ["frFR"] = "Kharanos", - ["koKR"] = "카라노스", ["ptBR"] = "Kharanos", ["ruRU"] = "Каранос", ["zhCN"] = "卡拉诺斯", @@ -1003,8 +899,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisklammtal", ["enUS"] = "Coldridge Valley", ["esES"] = "Valle de Crestanevada", - ["frFR"] = "Vallée des Frigères", - ["koKR"] = "눈마루 골짜기", ["ptBR"] = "Vale Crista Fria", ["ruRU"] = "Холодная долина", ["zhCN"] = "寒脊山谷", @@ -1022,8 +916,6 @@ MTH_DS_Zones = { ["deDE"] = "Gnomeregan", ["enUS"] = "Gnomeregan", ["esES"] = "Gnomeregan", - ["frFR"] = "Gnomeregan", - ["koKR"] = "놈리건", ["ptBR"] = "Gnomeregan", ["ruRU"] = "Гномреган", ["zhCN"] = "诺莫瑞根", @@ -1041,8 +933,6 @@ MTH_DS_Zones = { ["deDE"] = "Gol\'bolar Steinbruch", ["enUS"] = "Gol\'Bolar Quarry", ["esES"] = "Cantera Gol\'Bolar", - ["frFR"] = "Carrière de Gol\'Bolar", - ["koKR"] = "골볼라 채석장", ["ptBR"] = "Pedreira Gol\'Bolar", ["ruRU"] = "Карьер Гол\'Болар", ["zhCN"] = "古博拉采掘场", @@ -1060,8 +950,6 @@ MTH_DS_Zones = { ["deDE"] = "Höhle der Frostmähnen", ["enUS"] = "Frostmane Hold", ["esES"] = "Bastión Melena de Escarcha", - ["frFR"] = "Repaire des Frostmane", - ["koKR"] = "서리갈기 소굴", ["ptBR"] = "Refúgio dos Gelomane", ["ruRU"] = "Форт Мерзлогривов", ["zhCN"] = "霜鬃巨魔要塞", @@ -1079,8 +967,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Graufelsbau", ["enUS"] = "The Grizzled Den", ["esES"] = "El Cubil Pardo", - ["frFR"] = "L\'antre Gris", - ["koKR"] = "은빛 동굴", ["ptBR"] = "A Caverna Rugosa", ["ruRU"] = "Серая берлога", ["zhCN"] = "灰色洞穴", @@ -1098,8 +984,6 @@ MTH_DS_Zones = { ["deDE"] = "Bräuhall", ["enUS"] = "Brewnall Village", ["esES"] = "Aldea Brewnall", - ["frFR"] = "Brassetout", - ["koKR"] = "브루날 마을", ["ptBR"] = "Aldeia de Brewnall", ["ruRU"] = "Поселок Пивоваров", ["zhCN"] = "烈酒村", @@ -1117,8 +1001,6 @@ MTH_DS_Zones = { ["deDE"] = "Nebelfichtenzuflucht", ["enUS"] = "Misty Pine Refuge", ["esES"] = "Refugio de Pinos Brumosos", - ["frFR"] = "Refuge de Brumepins", - ["koKR"] = "안개소나무 은거처", ["ptBR"] = "Refugio Pino Nebuloso", ["ruRU"] = "Сторожка у заснеженной сосны", ["zhCN"] = "雾松避难所", @@ -1136,8 +1018,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisenbands Ausgrabungsstätte", ["enUS"] = "Ironband\'s Excavation Site", ["esES"] = "Sitio de Excavación de Ironband", - ["frFR"] = "Excavations d\'Ironband", - ["koKR"] = "아이언밴드의 발굴현장", ["ptBR"] = "Sítio de Escavação de Ironband", ["ruRU"] = "Раскопки Сталекрута", ["zhCN"] = "铁环挖掘场", @@ -1155,8 +1035,6 @@ MTH_DS_Zones = { ["deDE"] = "Festung Mo\'grosh", ["enUS"] = "Mo\'grosh Stronghold", ["esES"] = "Fortaleza Mo\'grosh", - ["frFR"] = "Bastion des Mo\'grosh", - ["koKR"] = "모그로쉬 소굴", ["ptBR"] = "Bastión Mo\'grosh", ["ruRU"] = "Оплот Мо\'грош", ["zhCN"] = "莫格罗什要塞", @@ -1174,8 +1052,6 @@ MTH_DS_Zones = { ["deDE"] = "Thelsamar", ["enUS"] = "Thelsamar", ["esES"] = "Thelsamar", - ["frFR"] = "Thelsamar", - ["koKR"] = "텔사마", ["ptBR"] = "Thelsamar", ["ruRU"] = "Телcамар", ["zhCN"] = "塞尔萨玛", @@ -1193,8 +1069,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Steinwerkdamm", ["enUS"] = "Stonewrought Dam", ["esES"] = "Presa de Piedra Labrada", - ["frFR"] = "Barrage de Formepierre", - ["koKR"] = "돌다지 댐", ["ptBR"] = "Represa Stonewrought", ["ruRU"] = "Каменная Плотина", ["zhCN"] = "巨石水坝", @@ -1212,8 +1086,6 @@ MTH_DS_Zones = { ["deDE"] = "Jagdhütte der Weltenwanderer", ["enUS"] = "The Farstrider Lodge", ["esES"] = "Logia del Caminante Lejano", - ["frFR"] = "Le pavillon des Pérégrins", - ["koKR"] = "순찰자의 오두막", ["ptBR"] = "A Aldeia Farstrider", ["ruRU"] = "Приют Странников", ["zhCN"] = "远行者小屋", @@ -1231,8 +1103,6 @@ MTH_DS_Zones = { ["deDE"] = "Silberbachmine", ["enUS"] = "Silver Stream Mine", ["esES"] = "Mina de Fuenteplata", - ["frFR"] = "Mine du Ru d\'argent", - ["koKR"] = "은여울 광산", ["ptBR"] = "Mina Silver Stream", ["ruRU"] = "Рудник у Серебряного ручейка", ["zhCN"] = "银泉矿洞", @@ -1250,8 +1120,6 @@ MTH_DS_Zones = { ["deDE"] = "Hafen von Menethil", ["enUS"] = "Menethil Harbor", ["esES"] = "Puerto Menethil", - ["frFR"] = "Port de Menethil", - ["koKR"] = "메네실 항구", ["ptBR"] = "Puerto Menethil", ["ruRU"] = "Гавань Менетилов", ["zhCN"] = "米奈希尔港", @@ -1269,8 +1137,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Bollwerk", ["enUS"] = "The Bulwark", ["esES"] = "El Baluarte", - ["frFR"] = "La Barricade", - ["koKR"] = "보루", ["ptBR"] = "A Muralha", ["ruRU"] = "Бастион", ["zhCN"] = "亡灵壁垒", @@ -1288,8 +1154,6 @@ MTH_DS_Zones = { ["deDE"] = "Todesend", ["enUS"] = "Deathknell", ["esES"] = "Toque de Muerte", - ["frFR"] = "Le Glas", - ["koKR"] = "데스넬", ["ptBR"] = "Necrotério", ["ruRU"] = "Могильник", ["zhCN"] = "丧钟镇", @@ -1307,8 +1171,6 @@ MTH_DS_Zones = { ["deDE"] = "Sollidens Bauernhof", ["enUS"] = "Solliden Farmstead", ["esES"] = "Granja Solliden", - ["frFR"] = "Ferme des Solliden", - ["koKR"] = "솔리덴 농장", ["ptBR"] = "Fazenda Solliden", ["ruRU"] = "Усадьба Соллиден", ["zhCN"] = "索利丹农场", @@ -1326,8 +1188,6 @@ MTH_DS_Zones = { ["deDE"] = "Agamands Mühlen", ["enUS"] = "Agamand Mills", ["esES"] = "Molinos Agamand", - ["frFR"] = "Moulins d\'Agamand", - ["koKR"] = "아가만드 밀농장", ["ptBR"] = "Moinhos Agamand", ["ruRU"] = "Мельницы Агамондов", ["zhCN"] = "阿加曼德磨坊", @@ -1345,8 +1205,6 @@ MTH_DS_Zones = { ["deDE"] = "Brill", ["enUS"] = "Brill", ["esES"] = "Brill", - ["frFR"] = "Brill", - ["koKR"] = "브릴", ["ptBR"] = "Brill", ["ruRU"] = "Брилл", ["zhCN"] = "布瑞尔", @@ -1364,8 +1222,6 @@ MTH_DS_Zones = { ["deDE"] = "Flüstergärten", ["enUS"] = "Whispering Gardens", ["esES"] = "Jardines Susurrantes", - ["frFR"] = "Jardins des murmures", - ["koKR"] = "속삭임의 정원", ["ptBR"] = "Jardins Sussurrantes", ["ruRU"] = "Шепчущие сады", ["zhCN"] = "耳语花园", @@ -1383,8 +1239,6 @@ MTH_DS_Zones = { ["deDE"] = "Blendwassersee", ["enUS"] = "Brightwater Lake", ["esES"] = "Lago Aguasclaras", - ["frFR"] = "Lac Etincelant", - ["koKR"] = "청명 호수", ["ptBR"] = "Lago Águas Claras", ["ruRU"] = "Озеро Ясноводное", ["zhCN"] = "澈水湖", @@ -1402,8 +1256,6 @@ MTH_DS_Zones = { ["deDE"] = "Garrens Schlupfwinkel", ["enUS"] = "Garren\'s Haunt", ["esES"] = "El Refugio de Garren", - ["frFR"] = "Antre de Garren", - ["koKR"] = "가렌의 흉가", ["ptBR"] = "Refúgio de Garren", ["ruRU"] = "Ферма Гаррена", ["zhCN"] = "加伦鬼屋", @@ -1421,8 +1273,6 @@ MTH_DS_Zones = { ["deDE"] = "Balnirs Bauernhof", ["enUS"] = "Balnir Farmstead", ["esES"] = "Granja Balnir", - ["frFR"] = "Ferme des Balnir", - ["koKR"] = "발니르 농장", ["ptBR"] = "Fazenda de Balnir", ["ruRU"] = "Усадьба Балнира", ["zhCN"] = "巴尼尔农场", @@ -1440,8 +1290,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Verlassene Anwesen", ["enUS"] = "Cold Hearth Manor", ["esES"] = "Mansión Fríogar", - ["frFR"] = "Manoir du Foyer froid", - ["koKR"] = "버려진 장원", ["ptBR"] = "Mansão do Fogo Frio", ["zhCN"] = "炉灰庄园", ["zhTW"] = "爐灰莊園", @@ -1458,8 +1306,6 @@ MTH_DS_Zones = { ["deDE"] = "Außenposten der Kreuzzügler", ["enUS"] = "Crusader Outpost", ["esES"] = "Puesto de los Cruzados", - ["frFR"] = "Avant-poste des Croisés", - ["koKR"] = "붉은십자군 전초기지", ["ptBR"] = "Posto dos Cruzados", ["ruRU"] = "Застава Алого Ордена", ["zhCN"] = "十字军前哨", @@ -1477,8 +1323,6 @@ MTH_DS_Zones = { ["deDE"] = "Insel Fenris", ["enUS"] = "Fenris Isle", ["esES"] = "Isla Fenris", - ["frFR"] = "Ile de Fenris", - ["koKR"] = "펜리스 섬", ["ptBR"] = "Ilha Fenris", ["ruRU"] = "Остров Фенриса", ["zhCN"] = "芬里斯岛", @@ -1496,8 +1340,6 @@ MTH_DS_Zones = { ["deDE"] = "Dolanaar", ["enUS"] = "Dolanaar", ["esES"] = "Dolanaar", - ["frFR"] = "Dolanaar", - ["koKR"] = "돌라나르", ["ptBR"] = "Dolanaar", ["ruRU"] = "Доланаар", ["zhCN"] = "多兰纳尔", @@ -1515,8 +1357,6 @@ MTH_DS_Zones = { ["deDE"] = "Laubschattental", ["enUS"] = "Shadowglen", ["esES"] = "Cañada Sombría", - ["frFR"] = "Sombrevallon", - ["koKR"] = "그늘 협곡", ["ptBR"] = "Shadowglen", ["ruRU"] = "Тенистая долина", ["zhCN"] = "幽影谷", @@ -1534,8 +1374,6 @@ MTH_DS_Zones = { ["deDE"] = "Herdweiler", ["enUS"] = "Hearthglen", ["esES"] = "Vega del Amparo", - ["frFR"] = "Hearthglen", - ["koKR"] = "하스글렌", ["ptBR"] = "Vila da Lareira", ["ruRU"] = "Дольный Очаг", ["zhCN"] = "壁炉谷", @@ -1553,8 +1391,6 @@ MTH_DS_Zones = { ["deDE"] = "Sägewerk des Nordkamms", ["enUS"] = "Northridge Lumber Camp", ["esES"] = "Campamento Maderero de Northridge", - ["frFR"] = "Camp de bûcherons de la Crête du nord", - ["koKR"] = "북마루 벌목지", ["ptBR"] = "Acampamento de Madeira de Northridge", ["ruRU"] = "Лесопилка Северного Кряжа", ["zhCN"] = "北山伐木场", @@ -1572,8 +1408,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ruinen von Andorhal", ["enUS"] = "Ruins of Andorhal", ["esES"] = "Ruinas de Andorhal", - ["frFR"] = "Ruines d\'Andorhal", - ["koKR"] = "안돌할 폐허", ["ptBR"] = "Ruínas de Andorhal", ["ruRU"] = "Руины Андорала", ["zhCN"] = "安多哈尔废墟", @@ -1591,8 +1425,6 @@ MTH_DS_Zones = { ["deDE"] = "Trauerhügel", ["enUS"] = "Sorrow Hill", ["esES"] = "Colina de la Tristeza", - ["frFR"] = "Colline des chagrins", - ["koKR"] = "슬픔의 언덕", ["ptBR"] = "Colina Sorrow", ["ruRU"] = "Холм Печали", ["zhCN"] = "悔恨岭", @@ -1610,8 +1442,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Weinende Höhle", ["enUS"] = "The Weeping Cave", ["esES"] = "La Cueva del LLanto", - ["frFR"] = "La grotte des Pleurs", - ["koKR"] = "진흙탕 동굴", ["ptBR"] = "A Caverna Llorosa", ["ruRU"] = "Грот Слез", ["zhCN"] = "哭泣洞穴", @@ -1629,8 +1459,6 @@ MTH_DS_Zones = { ["deDE"] = "Teufelssteinfeld", ["enUS"] = "Felstone Field", ["esES"] = "Campo de Piedra Vil", - ["frFR"] = "Champ de Felstone", - ["koKR"] = "펠스톤 농장", ["ptBR"] = "Campo da Pedra Vil", ["ruRU"] = "Поле Джанис", ["zhCN"] = "费尔斯通农场", @@ -1648,8 +1476,6 @@ MTH_DS_Zones = { ["deDE"] = "Dalsons Tränenfeld", ["enUS"] = "Dalson\'s Tears", ["esES"] = "Lágrimas de Dalson", - ["frFR"] = "Larmes de Dalson", - ["koKR"] = "달슨의 눈물", ["ptBR"] = "Lágrimas de Dalson", ["ruRU"] = "Слезы Далсона", ["zhCN"] = "达尔松之泪", @@ -1667,8 +1493,6 @@ MTH_DS_Zones = { ["deDE"] = "Gahrrons Trauerfeld", ["enUS"] = "Gahrron\'s Withering", ["esES"] = "Marchitamiento de Gahrron", - ["frFR"] = "La Flétrissure de Gahrron", - ["koKR"] = "가론의 흉가", ["ptBR"] = "Praga de Gahrron", ["ruRU"] = "Пустошь Гаррона", ["zhCN"] = "盖罗恩农场", @@ -1686,8 +1510,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Trostlose Feld", ["enUS"] = "The Writhing Haunt", ["esES"] = "El Refugio Retorcido", - ["frFR"] = "Le Repaire putride", - ["koKR"] = "고통의 흉가", ["ptBR"] = "O Embrujo Retorcido", ["ruRU"] = "Удел Страданий", ["zhCN"] = "嚎哭鬼屋", @@ -1705,8 +1527,6 @@ MTH_DS_Zones = { ["deDE"] = "Lohenscheit", ["enUS"] = "Pyrewood Village", ["esES"] = "Aldea Pyrewood", - ["frFR"] = "Bois-du-Bûcher", - ["koKR"] = "장작나무 마을", ["ptBR"] = "Aldeia de Pyrewood", ["ruRU"] = "Деревня Погребальных Костров", ["zhCN"] = "焚木村", @@ -1724,8 +1544,6 @@ MTH_DS_Zones = { ["deDE"] = "Dun Modr", ["enUS"] = "Dun Modr", ["esES"] = "Dun Modr", - ["frFR"] = "Dun Modr", - ["koKR"] = "던 모드르", ["ptBR"] = "Dun Modr", ["ruRU"] = "Дун Модр", ["zhCN"] = "丹莫德", @@ -1743,8 +1561,6 @@ MTH_DS_Zones = { ["deDE"] = "Eiswellensee", ["enUS"] = "Iceflow Lake", ["esES"] = "Lago del Flujo de Hielo", - ["frFR"] = "Lac glacial", - ["koKR"] = "얼음 호수", ["ptBR"] = "Lago Nevado", ["ruRU"] = "Заледеневшее озеро", ["zhCN"] = "涌冰湖", @@ -1762,8 +1578,6 @@ MTH_DS_Zones = { ["deDE"] = "Helmsbettsee", ["enUS"] = "Helm\'s Bed Lake", ["esES"] = "Lago del Lecho de Helm", - ["frFR"] = "Lac du Lit d\'Helm", - ["koKR"] = "투구바닥 호수", ["ptBR"] = "Lago da Cama do Elmo", ["ruRU"] = "Озеро Хельмово Ложе", ["zhCN"] = "盔枕湖", @@ -1781,8 +1595,6 @@ MTH_DS_Zones = { ["deDE"] = "Tiefenfelsmine", ["enUS"] = "Deep Elem Mine", ["esES"] = "Mina de Elementos Profundos", - ["frFR"] = "Mine du gouffre d\'Elem", - ["koKR"] = "심원 광산", ["ptBR"] = "Mina Profunda de Elem", ["ruRU"] = "Серебряный рудник", ["zhCN"] = "埃利姆矿洞", @@ -1800,8 +1612,6 @@ MTH_DS_Zones = { ["deDE"] = "Alexstons Bauernhof", ["enUS"] = "Alexston Farmstead", ["esES"] = "Granja Alexston", - ["frFR"] = "Ferme des Alexston", - ["koKR"] = "알렉스턴 농장", ["ptBR"] = "Fazenda de Alexston", ["ruRU"] = "Поместье Алекстона", ["zhCN"] = "阿历克斯顿农场", @@ -1819,8 +1629,6 @@ MTH_DS_Zones = { ["deDE"] = "Hochwolkenebene", ["enUS"] = "Red Cloud Mesa", ["esES"] = "Meseta Nube Roja", - ["frFR"] = "Mesa de Nuage rouge", - ["koKR"] = "붉은구름 고원", ["ptBR"] = "Mesa Nuvem Vermelha", ["ruRU"] = "Плато Красного Облака", ["zhCN"] = "红云台地", @@ -1838,8 +1646,6 @@ MTH_DS_Zones = { ["deDE"] = "Dorf der Bluthufe", ["enUS"] = "Bloodhoof Village", ["esES"] = "Aldea Pezuña de Sangre", - ["frFR"] = "Village Bloodhoof", - ["koKR"] = "블러드후프 마을", ["ptBR"] = "Aldeia Casco Sangrento", ["ruRU"] = "Деревня Кровавого Копыта", ["zhCN"] = "血蹄村", @@ -1857,8 +1663,6 @@ MTH_DS_Zones = { ["deDE"] = "Überfallene Karawane", ["enUS"] = "Ravaged Caravan", ["esES"] = "Caravana Devastada", - ["frFR"] = "Caravane dévastée", - ["koKR"] = "습격당한 짐마차 행렬", ["ptBR"] = "Caravana Destruída", ["ruRU"] = "Разграбленный караван", ["zhCN"] = "被破坏的货车", @@ -1876,8 +1680,6 @@ MTH_DS_Zones = { ["deDE"] = "Teufelsfelsen", ["enUS"] = "Red Rocks", ["esES"] = "Rocas Rojas", - ["frFR"] = "Rochers rouges", - ["koKR"] = "붉은 바위 언덕", ["ptBR"] = "Rochas Vermelhas", ["ruRU"] = "Красные скалы", ["zhCN"] = "赤色石", @@ -1895,8 +1697,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Huschdunkel", ["enUS"] = "The Skittering Dark", ["esES"] = "La Oscuridad Escurridiza", - ["frFR"] = "Le Grouillement", - ["koKR"] = "암흑 땅거미굴", ["ptBR"] = "A Escuridão Escorregadia", ["ruRU"] = "Струящаяся Тьма", ["zhCN"] = "粘丝洞", @@ -1914,8 +1714,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Grabmal", ["enUS"] = "The Sepulcher", ["esES"] = "El Sepulcro", - ["frFR"] = "Le Sépulcre", - ["koKR"] = "공동묘지", ["ptBR"] = "O Sepulcro", ["ruRU"] = "Гробница", ["zhCN"] = "瑟伯切尔", @@ -1933,8 +1731,6 @@ MTH_DS_Zones = { ["deDE"] = "Olsens Acker", ["enUS"] = "Olsen\'s Farthing", ["esES"] = "La Moneda de Olsen", - ["frFR"] = "Ferme des Olsen", - ["koKR"] = "올슨 농장", ["ptBR"] = "Fazenda de Olsen", ["ruRU"] = "Удел Ольсена", ["zhCN"] = "奥森农场", @@ -1952,8 +1748,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Graumähnenwall", ["enUS"] = "The Greymane Wall", ["esES"] = "La Muralla de Cringris", - ["frFR"] = "Le mur de Greymane", - ["koKR"] = "그레이메인 성벽", ["ptBR"] = "A Muralha Greymane", ["ruRU"] = "Стена Седогрива", ["zhCN"] = "格雷迈恩之墙", @@ -1971,8 +1765,6 @@ MTH_DS_Zones = { ["deDE"] = "Berens List", ["enUS"] = "Beren\'s Peril", ["esES"] = "El Peligro de Beren", - ["frFR"] = "Péril de Beren", - ["koKR"] = "베렌의 동굴", ["ptBR"] = "Perigo de Beren", ["ruRU"] = "Погибель Берена", ["zhCN"] = "博伦的巢穴", @@ -1990,8 +1782,6 @@ MTH_DS_Zones = { ["deDE"] = "Mühlenbern", ["enUS"] = "Ambermill", ["esES"] = "Molino de Ámbar", - ["frFR"] = "Moulin-de-l\'Ambre", - ["koKR"] = "앰버밀", ["ptBR"] = "Moinho Âmbar", ["ruRU"] = "Янтарная мельница", ["zhCN"] = "安伯米尔", @@ -2009,8 +1799,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Schattenfang", ["enUS"] = "Shadowfang Keep", ["esES"] = "Fortaleza Colmillo Oscuro", - ["frFR"] = "Donjon d\'Ombrecroc", - ["koKR"] = "그림자송곳니 성채", ["ptBR"] = "Fortaleza Shadowfang", ["ruRU"] = "Крепость Темного Клыка", ["zhCN"] = "影牙城堡", @@ -2028,8 +1816,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Verfallene Fähre", ["enUS"] = "The Decrepit Ferry", ["esES"] = "El Viejo Embarcadero", - ["frFR"] = "Le bac délabré", - ["koKR"] = "오래된 나루터", ["ptBR"] = "A Balsa Decrépita", ["ruRU"] = "Старая переправа", ["zhCN"] = "破旧渡口", @@ -2047,8 +1833,6 @@ MTH_DS_Zones = { ["deDE"] = "Maldens Obsthain", ["enUS"] = "Malden\'s Orchard", ["esES"] = "Huerto de Malden", - ["frFR"] = "Verger de Malden", - ["koKR"] = "말덴의 과수원", ["ptBR"] = "Huerta de Malden", ["ruRU"] = "Сад Мальдена", ["zhCN"] = "玛尔丁果园", @@ -2066,8 +1850,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Todesfeld", ["enUS"] = "The Dead Field", ["esES"] = "El Campo Muerto", - ["frFR"] = "Le Champ des morts", - ["koKR"] = "죽음의 농장", ["ptBR"] = "O Campo Morto", ["ruRU"] = "Мертвое поле", ["zhCN"] = "亡者农场", @@ -2085,8 +1867,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Verlassene Obstgarten", ["enUS"] = "The Rotting Orchard", ["esES"] = "El Huerto Podrido", - ["frFR"] = "Le verger pourrissant", - ["koKR"] = "오염된 과수원", ["ptBR"] = "O Pomar Podre", ["ruRU"] = "Гниющий сад", ["zhCN"] = "烂果园", @@ -2104,8 +1884,6 @@ MTH_DS_Zones = { ["deDE"] = "Schattenhain", ["enUS"] = "Brightwood Grove", ["esES"] = "Bosque del Ocaso", - ["frFR"] = "Bosquet de Clairbois", - ["koKR"] = "밝은숲", ["ptBR"] = "Bosque de Lenha Brilhante", ["ruRU"] = "Светлая роща", ["zhCN"] = "阳光树林", @@ -2123,8 +1901,6 @@ MTH_DS_Zones = { ["deDE"] = "Yorgens Bauernhof", ["enUS"] = "The Yorgen Farmstead", ["esES"] = "Granja Yorgen", - ["frFR"] = "La ferme des Yorgen", - ["koKR"] = "요르겐 농장", ["ptBR"] = "A Granja Yorgen", ["ruRU"] = "Усадьба Йоргена", ["zhCN"] = "约根农场", @@ -2142,8 +1918,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Kessel", ["enUS"] = "The Cauldron", ["esES"] = "El Caldero", - ["frFR"] = "Le Chaudron", - ["koKR"] = "용광로", ["ptBR"] = "O Caldeirão", ["ruRU"] = "Котлован", ["zhCN"] = "大熔炉", @@ -2161,8 +1935,6 @@ MTH_DS_Zones = { ["deDE"] = "Rußschlacks Grabungsstätte", ["enUS"] = "Grimesilt Dig Site", ["esES"] = "Sitio de Excavación Grimesilt", - ["frFR"] = "Site de fouilles de Grimesilt", - ["koKR"] = "검댕가루 발굴현장", ["ptBR"] = "Sítio de Escavação Fuliginosa", ["ruRU"] = "Карьер Грязнули", ["zhCN"] = "煤渣挖掘场", @@ -2180,8 +1952,6 @@ MTH_DS_Zones = { ["deDE"] = "Schreckensfels", ["enUS"] = "Dreadmaul Rock", ["esES"] = "Roca Dreadmaul", - ["frFR"] = "Rocher des Cognepeurs", - ["koKR"] = "우레망치 바위굴", ["ptBR"] = "Rochedo Muralha do Medo", ["ruRU"] = "Скала Молота Ужаса", ["zhCN"] = "巨槌石", @@ -2199,8 +1969,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ruinen von Thaurissan", ["enUS"] = "Ruins of Thaurissan", ["esES"] = "Ruinas de Thaurissan", - ["frFR"] = "Ruines de Thaurissan", - ["koKR"] = "타우릿산의 폐허", ["ptBR"] = "Ruínas de Thaurissan", ["ruRU"] = "Руины Тауриссана", ["zhCN"] = "索瑞森废墟", @@ -2218,8 +1986,6 @@ MTH_DS_Zones = { ["deDE"] = "Schwarzfelsfestung", ["enUS"] = "Blackrock Stronghold", ["esES"] = "Cumbre de Roca Negra", - ["frFR"] = "Bastion des Blackrock", - ["koKR"] = "검은바위 요새", ["ptBR"] = "Fortaleza Rocha Negra", ["ruRU"] = "Крепость Черной горы", ["zhCN"] = "黑石要塞", @@ -2237,8 +2003,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Aschensäule", ["enUS"] = "The Pillar of Ash", ["esES"] = "El Pilar de Ceniza", - ["frFR"] = "Le Pilier de cendres", - ["koKR"] = "잿빛 기둥", ["ptBR"] = "O Pilar de Cinzas", ["ruRU"] = "Башня Пепла", ["zhCN"] = "灰烬之柱", @@ -2256,8 +2020,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Schwarzfels", ["enUS"] = "Blackrock Mountain", ["esES"] = "Montaña Roca Negra", - ["frFR"] = "Mont Blackrock", - ["koKR"] = "검은바위 산", ["ptBR"] = "Montanha Rocha Negra", ["ruRU"] = "Черная гора", ["zhCN"] = "黑石山", @@ -2275,8 +2037,6 @@ MTH_DS_Zones = { ["deDE"] = "Altar der Stürme", ["enUS"] = "Altar of Storms", ["esES"] = "Altar de Tormentas", - ["frFR"] = "Autel des tempêtes", - ["koKR"] = "폭풍의 제단", ["ptBR"] = "Altar das Tempestades", ["ruRU"] = "Алтарь Бурь", ["zhCN"] = "风暴祭坛", @@ -2294,8 +2054,6 @@ MTH_DS_Zones = { ["deDE"] = "Al\'Amethsee", ["enUS"] = "Lake Al\'Ameth", ["esES"] = "Lago Al\'Ameth", - ["frFR"] = "Lac Al\'Ameth", - ["koKR"] = "알아메스 호수", ["ptBR"] = "Lago Al\'Ameth", ["ruRU"] = "Озеро Аль\'Амет", ["zhCN"] = "奥拉密斯湖", @@ -2313,8 +2071,6 @@ MTH_DS_Zones = { ["deDE"] = "Sternenhauch", ["enUS"] = "Starbreeze Village", ["esES"] = "Aldea Starbreeze", - ["frFR"] = "Brise-stellaire", - ["koKR"] = "별바람 마을", ["ptBR"] = "Aldeia Starbreeze", ["ruRU"] = "Деревня Звездного Ветра", ["zhCN"] = "星风村", @@ -2332,8 +2088,6 @@ MTH_DS_Zones = { ["deDE"] = "Höhle der Knarzklauen", ["enUS"] = "Gnarlpine Hold", ["esES"] = "Fuerte Gnarlpine", - ["frFR"] = "Camp des Pins-tordus", - ["koKR"] = "나무옹이 요새", ["ptBR"] = "Covil dos Narigudos", ["ruRU"] = "Лагерь у Кривой Сосны", ["zhCN"] = "脊骨堡", @@ -2351,8 +2105,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Lichtung des Orakels", ["enUS"] = "The Oracle Glade", ["esES"] = "El Claro del Oráculo", - ["frFR"] = "La Clairière de l\'Oracle", - ["koKR"] = "신탁의 숲", ["ptBR"] = "O Bosque do Oráculo", ["ruRU"] = "Поляна Оракула", ["zhCN"] = "神谕林地", @@ -2370,8 +2122,6 @@ MTH_DS_Zones = { ["deDE"] = "Quellsee", ["enUS"] = "Wellspring Lake", ["esES"] = "Lago Manantial", - ["frFR"] = "Lac d\'Aigue-vive", - ["koKR"] = "생명의 호수", ["ptBR"] = "Lago das Fontes", ["ruRU"] = "Родниковое озеро", ["zhCN"] = "涌泉湖", @@ -2389,8 +2139,6 @@ MTH_DS_Zones = { ["deDE"] = "Süderstade", ["enUS"] = "Southshore", ["esES"] = "Costa Sur", - ["frFR"] = "Southshore", - ["koKR"] = "사우스쇼어", ["ptBR"] = "Southshore", ["ruRU"] = "Южнобережье", ["zhCN"] = "南海镇", @@ -2408,8 +2156,6 @@ MTH_DS_Zones = { ["deDE"] = "Tarrens Mühle", ["enUS"] = "Tarren Mill", ["esES"] = "Molino Tarren", - ["frFR"] = "Moulin-de-Tarren", - ["koKR"] = "타렌 밀농장", ["ptBR"] = "Moinho Tarren", ["ruRU"] = "Мельница Таррен", ["zhCN"] = "塔伦米尔", @@ -2427,8 +2173,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Durnholde", ["enUS"] = "Durnholde Keep", ["esES"] = "Fortaleza Durnholde", - ["frFR"] = "Donjon de Durnholde", - ["koKR"] = "던홀드 요새", ["ptBR"] = "Bastilha de Durnholde", ["ruRU"] = "Крепость Дарнхольд", ["zhCN"] = "敦霍尔德城堡", @@ -2446,8 +2190,6 @@ MTH_DS_Zones = { ["deDE"] = "Lordamere-Internierungslager", ["enUS"] = "Lordamere Internment Camp", ["esES"] = "Campo de Internamiento Lordamere", - ["frFR"] = "Camp d\'internement de Lordamere", - ["koKR"] = "로다미어 포로수용소", ["ptBR"] = "Campo de Internamiento de Lordamere", ["ruRU"] = "Лордамерские выселки", ["zhCN"] = "洛丹米尔收容所", @@ -2465,8 +2207,6 @@ MTH_DS_Zones = { ["deDE"] = "Dalaran", ["enUS"] = "Dalaran", ["esES"] = "Dalaran", - ["frFR"] = "Dalaran", - ["koKR"] = "달라란", ["ptBR"] = "Dalaran", ["ruRU"] = "Даларан", ["zhCN"] = "达拉然", @@ -2484,8 +2224,6 @@ MTH_DS_Zones = { ["deDE"] = "Strahnbrad", ["enUS"] = "Strahnbrad", ["esES"] = "Strahnbrad", - ["frFR"] = "Strahnbrad", - ["koKR"] = "스트란브래드", ["ptBR"] = "Strahnbrad", ["ruRU"] = "Странбрад", ["zhCN"] = "斯坦恩布莱德", @@ -2503,8 +2241,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ruinen von Alterac", ["enUS"] = "Ruins of Alterac", ["esES"] = "Ruinas de Alterac", - ["frFR"] = "Ruines d\'Alterac", - ["koKR"] = "알터랙 폐허", ["ptBR"] = "Ruínas de Alterac", ["ruRU"] = "Руины Альтерака", ["zhCN"] = "奥特兰克废墟", @@ -2522,8 +2258,6 @@ MTH_DS_Zones = { ["deDE"] = "Trümmergrathöhle", ["enUS"] = "Crushridge Hold", ["esES"] = "Dominios de los Aplastacresta", - ["frFR"] = "Bastion Cassecrête", - ["koKR"] = "산사태 오우거 소굴", ["ptBR"] = "Fortaleza da Rocha Esmagadora", ["ruRU"] = "Логово Раздробленного Хребта", ["zhCN"] = "破碎岭城堡", @@ -2541,8 +2275,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Oberland", ["enUS"] = "The Uplands", ["esES"] = "Tierras Altas", - ["frFR"] = "Les Hauteurs", - ["koKR"] = "고원", ["ptBR"] = "As Terras Altas", ["ruRU"] = "Высокогорье", ["zhCN"] = "高地", @@ -2560,8 +2292,6 @@ MTH_DS_Zones = { ["deDE"] = "Südwacht", ["enUS"] = "Southpoint Tower", ["esES"] = "Torre Puntosur", - ["frFR"] = "Tour de la Pointe du Midi", - ["koKR"] = "남부 경비탑", ["ptBR"] = "Torre Southpoint", ["ruRU"] = "Южная башня", ["zhCN"] = "南点哨塔", @@ -2579,8 +2309,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Felder des Hügellands", ["enUS"] = "Hillsbrad Fields", ["esES"] = "Laderas de Trabalomas", - ["frFR"] = "Champs d\'Hillsbrad", - ["koKR"] = "힐스브래드 농장", ["ptBR"] = "Campos de Eira dos Montes", ["ruRU"] = "Хилсбрадские поля", ["zhCN"] = "希尔斯布莱德农场", @@ -2598,8 +2326,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Azurschacht", ["enUS"] = "Azurelode Mine", ["esES"] = "Mina Azurelode", - ["frFR"] = "Mine d\'Azurelode", - ["koKR"] = "청금석 광산", ["ptBR"] = "Mina Azurelode", ["ruRU"] = "Лазуритовый рудник", ["zhCN"] = "碧玉矿洞", @@ -2617,8 +2343,6 @@ MTH_DS_Zones = { ["deDE"] = "Nethandersiedlung", ["enUS"] = "Nethander Stead", ["esES"] = "Granja Nethander", - ["frFR"] = "Ferme des Nethander", - ["koKR"] = "네산더 농장", ["ptBR"] = "Fazenda de Nethander", ["ruRU"] = "Владение Нетандера", ["zhCN"] = "奈杉德哨岗", @@ -2636,8 +2360,6 @@ MTH_DS_Zones = { ["deDE"] = "Dun Garok", ["enUS"] = "Dun Garok", ["esES"] = "Dun Garok", - ["frFR"] = "Dun Garok", - ["koKR"] = "던 가록", ["ptBR"] = "Dun Garok", ["ruRU"] = "Дун Гарок", ["zhCN"] = "丹加洛克", @@ -2655,8 +2377,6 @@ MTH_DS_Zones = { ["deDE"] = "Oststrand", ["enUS"] = "Eastern Strand", ["esES"] = "Franja Este", - ["frFR"] = "Rivage oriental", - ["koKR"] = "동부 해안", ["ptBR"] = "Praia Oriental", ["ruRU"] = "Восточное побережье", ["zhCN"] = "东部海滩", @@ -2674,8 +2394,6 @@ MTH_DS_Zones = { ["deDE"] = "Weststrand", ["enUS"] = "Western Strand", ["esES"] = "Franja Oeste", - ["frFR"] = "Rivage occidental", - ["koKR"] = "서부 해안", ["ptBR"] = "Praia Ocidental", ["ruRU"] = "Западное побережье", ["zhCN"] = "西部海岸", @@ -2693,8 +2411,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Insel Jaguero", ["enUS"] = "Jaguero Isle", ["esES"] = "Isla Jaguero", - ["frFR"] = "Ile aux jagueros", - ["koKR"] = "자구에로 섬", ["ptBR"] = "Isla Jaguero", ["ruRU"] = "Остров Жагуаро", ["zhCN"] = "哈圭罗岛", @@ -2712,8 +2428,6 @@ MTH_DS_Zones = { ["deDE"] = "Nebelschilfstrand", ["enUS"] = "Misty Reed Strand", ["esES"] = "Playa de Misty Reed", - ["frFR"] = "Grève de Brumejonc", - ["koKR"] = "안개갈대 해안", ["ptBR"] = "Playa Cañas Nebulosas", ["ruRU"] = "Тростниковый берег", ["zhCN"] = "芦苇海滩", @@ -2731,8 +2445,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Aussichtsklippen", ["enUS"] = "The Overlook Cliffs", ["esES"] = "Los Acantilados del Mirador", - ["frFR"] = "Les Hauts-Surplombs", - ["koKR"] = "전망대 절벽", ["ptBR"] = "Os Penhascos do Mirante", ["ruRU"] = "Отвесные скалы", ["zhCN"] = "望海崖", @@ -2750,8 +2462,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisenbarts Grabmal", ["enUS"] = "Ironbeard\'s Tomb", ["esES"] = "Tumba de Ironbeard", - ["frFR"] = "Tombe d\'Ironbeard", - ["koKR"] = "아이언비어드의 고분", ["ptBR"] = "Tumba de Ironbeard", ["ruRU"] = "Гробница Железноборода", ["zhCN"] = "铁须之墓", @@ -2769,8 +2479,6 @@ MTH_DS_Zones = { ["deDE"] = "Kristalladermine", ["enUS"] = "Crystalvein Mine", ["esES"] = "Mina Crystalvein", - ["frFR"] = "Mine aux cristaux", - ["koKR"] = "수정 광산", ["ptBR"] = "Mina Veia Cristalina", ["ruRU"] = "Хрустальная шахта", ["zhCN"] = "水晶矿洞", @@ -2788,8 +2496,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Aboraz", ["enUS"] = "Ruins of Aboraz", ["esES"] = "Ruinas de Aboraz", - ["frFR"] = "Ruines d\'Aboraz", - ["koKR"] = "아보라즈의 폐허", ["ptBR"] = "Ruínas de Aboraz", ["ruRU"] = "Руины Абораза", ["zhCN"] = "阿博拉兹废墟", @@ -2807,8 +2513,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordhof", ["enUS"] = "Northfold Manor", ["esES"] = "Mansión Northfold", - ["frFR"] = "Manoir de Nordclos", - ["koKR"] = "북부습곡 장원", ["ptBR"] = "Mansão Northfold", ["ruRU"] = "Северное поместье", ["zhCN"] = "诺斯弗德农场", @@ -2826,8 +2530,6 @@ MTH_DS_Zones = { ["deDE"] = "Go\'Sheks Hof", ["enUS"] = "Go\'Shek Farm", ["esES"] = "Granja Go\'Shek", - ["frFR"] = "Ferme de Go\'Shek", - ["koKR"] = "고셰크 농장", ["ptBR"] = "Fazenda Go\'Shek", ["ruRU"] = "Ферма Го\'Шека", ["zhCN"] = "格沙克农场", @@ -2845,8 +2547,6 @@ MTH_DS_Zones = { ["deDE"] = "Bauernhof der Dabyries", ["enUS"] = "Dabyrie\'s Farmstead", ["esES"] = "Granja Dabyrie", - ["frFR"] = "Ferme des Dabyrie", - ["koKR"] = "다비리 농장", ["ptBR"] = "Fazenda Dabyrie", ["ruRU"] = "Усадьба Дабири", ["zhCN"] = "达比雷农场", @@ -2864,8 +2564,6 @@ MTH_DS_Zones = { ["deDE"] = "Halle der Felsfäuste", ["enUS"] = "Boulderfist Hall", ["esES"] = "Sala Puño de Roca", - ["frFR"] = "Hall Rochepoing", - ["koKR"] = "돌주먹일족 소굴", ["ptBR"] = "Salão dos Punhos de Pedra", ["ruRU"] = "Крепость Тяжелого Кулака", ["zhCN"] = "石拳大厅", @@ -2883,8 +2581,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Bleichborken", ["enUS"] = "Witherbark Village", ["esES"] = "Aldea Corteza Marchita", - ["frFR"] = "Village Witherbark", - ["koKR"] = "마른나무껍질 마을", ["ptBR"] = "Aldeia Witherbark", ["ruRU"] = "Деревня Сухокожих", ["zhCN"] = "枯木村", @@ -2902,8 +2598,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Zuflucht", ["enUS"] = "Refuge Pointe", ["esES"] = "Punta del Refugio", - ["frFR"] = "Refuge de l\'Ornière", - ["koKR"] = "임시 주둔지", ["ptBR"] = "Ponto de Refúgio", ["ruRU"] = "Опорный пункт", ["zhCN"] = "避难谷地", @@ -2921,8 +2615,6 @@ MTH_DS_Zones = { ["deDE"] = "Hammerfall", ["enUS"] = "Hammerfall", ["esES"] = "Caída de Martillo", - ["frFR"] = "Trépas-d\'Orgrim", - ["koKR"] = "해머폴", ["ptBR"] = "Queda do Martelo", ["ruRU"] = "Павший Молот", ["zhCN"] = "落锤镇", @@ -2940,8 +2632,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Stromgarde", ["enUS"] = "Stromgarde Keep", ["esES"] = "Fortaleza Stromgarde", - ["frFR"] = "Donjon de Stromgarde", - ["koKR"] = "스트롬가드 요새", ["ptBR"] = "Fortaleza Stromgarde", ["ruRU"] = "Крепость Стромгард", ["zhCN"] = "激流堡", @@ -2959,8 +2649,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Faldirbucht", ["enUS"] = "Faldir\'s Cove", ["esES"] = "La Ensenada de Faldir", - ["frFR"] = "La Crique de Faldir", - ["koKR"] = "팔디르의 만", ["ptBR"] = "Enseada de Faldir", ["ruRU"] = "Бухта Фальдира", ["zhCN"] = "法迪尔海湾", @@ -2978,8 +2666,6 @@ MTH_DS_Zones = { ["deDE"] = "Kreis der östlichen Bindung", ["enUS"] = "Circle of East Binding", ["esES"] = "Círculo del Vínculo Este", - ["frFR"] = "Cercle de lien oriental", - ["koKR"] = "동쪽 봉인의 마법진", ["ptBR"] = "Círculo da Ligação Oriental", ["ruRU"] = "Восточный круг Обуздания", ["zhCN"] = "东部禁锢法阵", @@ -2997,8 +2683,6 @@ MTH_DS_Zones = { ["deDE"] = "Kreis der westlichen Bindung", ["enUS"] = "Circle of West Binding", ["esES"] = "Círculo del Vínculo Oeste", - ["frFR"] = "Cercle de lien occidental", - ["koKR"] = "서쪽 봉인의 마법진", ["ptBR"] = "Círculo da Ligação Ocidental", ["ruRU"] = "Западный Круг Обуздания", ["zhCN"] = "西部禁锢法阵", @@ -3016,8 +2700,6 @@ MTH_DS_Zones = { ["deDE"] = "Kreis der inneren Bindung", ["enUS"] = "Circle of Inner Binding", ["esES"] = "Círculo del Vínculo Interior", - ["frFR"] = "Cercle de lien intérieur", - ["koKR"] = "내부 봉인의 마법진", ["ptBR"] = "Círculo da Ligação Interna", ["ruRU"] = "Внутренний Круг Обуздания", ["zhCN"] = "内禁锢法阵", @@ -3035,8 +2717,6 @@ MTH_DS_Zones = { ["deDE"] = "Kreis der äußeren Bindung", ["enUS"] = "Circle of Outer Binding", ["esES"] = "Círculo del Vínculo Exterior", - ["frFR"] = "Cercle de lien extérieur", - ["koKR"] = "외부 봉인의 마법진", ["ptBR"] = "Círculo da Ligação Externa", ["ruRU"] = "Внешний Круг Обуздания", ["zhCN"] = "外禁锢法阵", @@ -3054,8 +2734,6 @@ MTH_DS_Zones = { ["deDE"] = "Apocryphans Ruheplatz", ["enUS"] = "Apocryphan\'s Rest", ["esES"] = "Descanso de Apocryphan", - ["frFR"] = "Repos d\'Apocryphan", - ["koKR"] = "아포크리판의 안식처", ["ptBR"] = "Repouso do Apocryphan", ["ruRU"] = "Скелет Апокрифана", ["zhCN"] = "圣者之陵", @@ -3073,8 +2751,6 @@ MTH_DS_Zones = { ["deDE"] = "Festung Angor", ["enUS"] = "Angor Fortress", ["esES"] = "Fortaleza Angor", - ["frFR"] = "Forteresse d\'Angor", - ["koKR"] = "고통의 요새", ["ptBR"] = "Fortaleza de Angor", ["ruRU"] = "Крепость Ангор", ["zhCN"] = "苦痛堡垒", @@ -3092,8 +2768,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Lethlorklamm", ["enUS"] = "Lethlor Ravine", ["esES"] = "Barranco Lethlor", - ["frFR"] = "Ravin de Lethlor", - ["koKR"] = "레슬로 협곡", ["ptBR"] = "Desfiladeiro Lethlor", ["ruRU"] = "Долина Летлор", ["zhCN"] = "莱瑟罗峡谷", @@ -3111,8 +2785,6 @@ MTH_DS_Zones = { ["deDE"] = "Kargath", ["enUS"] = "Kargath", ["esES"] = "Kargath", - ["frFR"] = "Kargath", - ["koKR"] = "카르가스", ["ptBR"] = "Kargath", ["ruRU"] = "Каргат", ["zhCN"] = "卡加斯", @@ -3130,8 +2802,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Kosh", ["enUS"] = "Camp Kosh", ["esES"] = "Campamento Kosh", - ["frFR"] = "Camp Kosh", - ["koKR"] = "코쉬 야영지", ["ptBR"] = "Acampamento Kosh", ["ruRU"] = "Лагерь Кош", ["zhCN"] = "柯什营地", @@ -3149,8 +2819,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Boff", ["enUS"] = "Camp Boff", ["esES"] = "Campamento Boff", - ["frFR"] = "Camp Boff", - ["koKR"] = "보프 야영지", ["ptBR"] = "Acampamento Boff", ["ruRU"] = "Лагерь Бофф", ["zhCN"] = "博夫营地", @@ -3168,8 +2836,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Cagg", ["enUS"] = "Camp Cagg", ["esES"] = "Campamento Cagg", - ["frFR"] = "Camp Cagg", - ["koKR"] = "카그 야영지", ["ptBR"] = "Acampamento Cagg", ["ruRU"] = "Лагерь Кэгг", ["zhCN"] = "卡格营地", @@ -3187,8 +2853,6 @@ MTH_DS_Zones = { ["deDE"] = "Agmondkuppe", ["enUS"] = "Agmond\'s End", ["esES"] = "Fin de Agmond", - ["frFR"] = "Fin d\'Agmond", - ["koKR"] = "아그몬드의 최후", ["ptBR"] = "Fim de Agmond", ["ruRU"] = "Удел Эгмонда", ["zhCN"] = "阿戈莫德之末", @@ -3206,8 +2870,6 @@ MTH_DS_Zones = { ["deDE"] = "Hammerzehs Grabungsstätte", ["enUS"] = "Hammertoe\'s Digsite", ["esES"] = "Sitio de Excavación de Hammertoe", - ["frFR"] = "Site de fouilles d\'Hammertoe", - ["koKR"] = "해머토의 발굴현장", ["ptBR"] = "Sítio de Escavação de Martelo", ["ruRU"] = "Карьер Тяжелоступа", ["zhCN"] = "铁趾挖掘场", @@ -3225,8 +2887,6 @@ MTH_DS_Zones = { ["deDE"] = "Nistgipfel", ["enUS"] = "Aerie Peak", ["esES"] = "Pico Aerie", - ["frFR"] = "Nid-de-l\'Aigle", - ["koKR"] = "맹금의 봉우리", ["ptBR"] = "Ninho da Águia", ["ruRU"] = "Заоблачный пик", ["zhCN"] = "鹰巢山", @@ -3244,8 +2904,6 @@ MTH_DS_Zones = { ["deDE"] = "Quel\'Danil Jagdhütte", ["enUS"] = "Quel\'Danil Lodge", ["esES"] = "Cabaña Quel\'Danil", - ["frFR"] = "Gîte de Quel\'Danil", - ["koKR"] = "쿠엘다닐 오두막", ["ptBR"] = "Pousada de Quel\'Danil", ["ruRU"] = "Сторожка Кель\'Данил", ["zhCN"] = "奎尔丹尼小屋", @@ -3263,8 +2921,6 @@ MTH_DS_Zones = { ["deDE"] = "Lauerfels", ["enUS"] = "Skulk Rock", ["esES"] = "Roca Skulk", - ["frFR"] = "Rocher de l\'Affût", - ["koKR"] = "굼벵이 바위굴", ["ptBR"] = "Pedra Skulk", ["ruRU"] = "Осклизлая скала", ["zhCN"] = "隐匿石", @@ -3282,8 +2938,6 @@ MTH_DS_Zones = { ["deDE"] = "Shadra\'Alor", ["enUS"] = "Shadra\'Alor", ["esES"] = "Shadra\'Alor", - ["frFR"] = "Shadra\'Alor", - ["koKR"] = "샤드라알로", ["ptBR"] = "Shadra\'Alor", ["ruRU"] = "Шадра\'Алор", ["zhCN"] = "沙德拉洛", @@ -3301,8 +2955,6 @@ MTH_DS_Zones = { ["deDE"] = "Jintha\'Alor", ["enUS"] = "Jintha\'Alor", ["esES"] = "Jintha\'Alor", - ["frFR"] = "Jintha\'Alor", - ["koKR"] = "진타알로", ["ptBR"] = "Jintha\'Alor", ["ruRU"] = "Джинта\'Алор", ["zhCN"] = "辛萨罗", @@ -3320,8 +2972,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Altar von Zul", ["enUS"] = "The Altar of Zul", ["esES"] = "El Altar de Zul", - ["frFR"] = "L\'Autel de Zul", - ["koKR"] = "줄의 제단", ["ptBR"] = "O Altar de Zul", ["ruRU"] = "Алтарь Зула", ["zhCN"] = "祖尔祭坛", @@ -3339,8 +2989,6 @@ MTH_DS_Zones = { ["deDE"] = "Seradane", ["enUS"] = "Seradane", ["esES"] = "Seradane", - ["frFR"] = "Seradane", - ["koKR"] = "세라데인", ["ptBR"] = "Seradane", ["ruRU"] = "Серадан", ["zhCN"] = "瑟拉丹", @@ -3358,8 +3006,6 @@ MTH_DS_Zones = { ["deDE"] = "Bael Modan", ["enUS"] = "Bael Modan", ["esES"] = "Bael Modan", - ["frFR"] = "Bael Modan", - ["koKR"] = "바엘 모단", ["ptBR"] = "Bael Modan", ["ruRU"] = "Бейл Модан", ["zhCN"] = "巴尔莫丹", @@ -3377,8 +3023,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Mine der Venture Co.", ["enUS"] = "The Venture Co. Mine", ["esES"] = "Mina de la Venture Co.", - ["frFR"] = "Mine de la KapitalRisk", - ["koKR"] = "투자개발회사 광산", ["ptBR"] = "A Mina da Companhia Venture", ["ruRU"] = "Рудник Торговой Компании", ["zhCN"] = "风险投资公司矿洞", @@ -3396,8 +3040,6 @@ MTH_DS_Zones = { ["deDE"] = "Klingenhügel", ["enUS"] = "Razor Hill", ["esES"] = "Cerrotajo", - ["frFR"] = "Tranchecolline", - ["koKR"] = "칼바위 언덕", ["ptBR"] = "Colina Razor", ["ruRU"] = "Колючий Холм", ["zhCN"] = "剃刀岭", @@ -3415,8 +3057,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Tal der Prüfungen", ["enUS"] = "Valley of Trials", ["esES"] = "Valle de las Pruebas", - ["frFR"] = "Vallée des épreuves", - ["koKR"] = "시험의 골짜기", ["ptBR"] = "Vale das Provas", ["ruRU"] = "Долина Испытаний", ["zhCN"] = "试炼谷", @@ -3434,8 +3074,6 @@ MTH_DS_Zones = { ["deDE"] = "Kolkarklippe", ["enUS"] = "Kolkar Crag", ["esES"] = "Peñasco Kolkar", - ["frFR"] = "Combe des Kolkar", - ["koKR"] = "콜카르 바윗골", ["ptBR"] = "Cerro Kolkar", ["ruRU"] = "Утес Колкар", ["zhCN"] = "科卡尔峭壁", @@ -3453,8 +3091,6 @@ MTH_DS_Zones = { ["deDE"] = "Sen\'jin", ["enUS"] = "Sen\'jin Village", ["esES"] = "Aldea Sen\'jin", - ["frFR"] = "Village de Sen\'jin", - ["koKR"] = "센진 마을", ["ptBR"] = "Aldeia Sen\'jin", ["ruRU"] = "Деревня Сен\'джин", ["zhCN"] = "森金村", @@ -3472,8 +3108,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Echoinseln", ["enUS"] = "Echo Isles", ["esES"] = "Islas del Eco", - ["frFR"] = "Îles de l\'Écho", - ["koKR"] = "메아리 섬", ["ptBR"] = "Ilhas do Eco", ["ruRU"] = "Острова Эха", ["zhCN"] = "回音群岛", @@ -3491,8 +3125,6 @@ MTH_DS_Zones = { ["deDE"] = "Donnergrat", ["enUS"] = "Thunder Ridge", ["esES"] = "Cresta Trueno", - ["frFR"] = "Falaises du Tonnerre", - ["koKR"] = "천둥 골짜기", ["ptBR"] = "A Colina do Trovão", ["ruRU"] = "Громовой хребет", ["zhCN"] = "雷霆山", @@ -3510,8 +3142,6 @@ MTH_DS_Zones = { ["deDE"] = "Staubwindklamm", ["enUS"] = "Drygulch Ravine", ["esES"] = "Barranco Seco", - ["frFR"] = "Ravin asséché", - ["koKR"] = "모래바람 협곡", ["ptBR"] = "Ravina Rocha Seca", ["ruRU"] = "Сухая лощина", ["zhCN"] = "枯水谷", @@ -3529,8 +3159,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Tiragarde", ["enUS"] = "Tiragarde Keep", ["esES"] = "Fortaleza Tiragarde", - ["frFR"] = "Donjon de Tiragarde", - ["koKR"] = "타이라가드 요새", ["ptBR"] = "A Fortaleza de Tiragarde", ["ruRU"] = "Крепость Тирагард", ["zhCN"] = "提拉加德城堡", @@ -3548,8 +3176,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Taurajo", ["enUS"] = "Camp Taurajo", ["esES"] = "Campamento Taurajo", - ["frFR"] = "Camp Taurajo", - ["koKR"] = "타우라조 야영지", ["ptBR"] = "Acampamento Taurajo", ["ruRU"] = "Лагерь Таурахо", ["zhCN"] = "陶拉祖营地", @@ -3567,8 +3193,6 @@ MTH_DS_Zones = { ["deDE"] = "Fernwacht", ["enUS"] = "Far Watch Post", ["esES"] = "Puesto de Observación Lejana", - ["frFR"] = "Poste de garde extérieur", - ["koKR"] = "전초 기지", ["ptBR"] = "Posto Vigia do Farol", ["ruRU"] = "Дальняя застава", ["zhCN"] = "前沿哨所", @@ -3586,8 +3210,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Wegekreuz", ["enUS"] = "The Crossroads", ["esES"] = "Los Cruces", - ["frFR"] = "La Croisée", - ["koKR"] = "크로스로드", ["ptBR"] = "Os Cruzamentos", ["ruRU"] = "Перекресток", ["zhCN"] = "十字路口", @@ -3605,8 +3227,6 @@ MTH_DS_Zones = { ["deDE"] = "Felsadermine", ["enUS"] = "Boulder Lode Mine", ["esES"] = "Mina de Vetalita", - ["frFR"] = "Mine des Pierriers", - ["koKR"] = "돌무더기 광산", ["ptBR"] = "Mina Pedregulho", ["ruRU"] = "Каменный карьер", ["zhCN"] = "石矿洞", @@ -3624,8 +3244,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Schlickmoor", ["enUS"] = "The Sludge Fen", ["esES"] = "Pantano de Lodo", - ["frFR"] = "La Videfange", - ["koKR"] = "진흙늪", ["ptBR"] = "O Pântano de Lodo", ["ruRU"] = "Нефтяное болото", ["zhCN"] = "淤泥沼泽", @@ -3643,8 +3261,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Trockenen Hügel", ["enUS"] = "The Dry Hills", ["esES"] = "Las Colinas Secas", - ["frFR"] = "Les Collines arides", - ["koKR"] = "메마른 언덕", ["ptBR"] = "As Colinas Secas", ["ruRU"] = "Сухие холмы", ["zhCN"] = "无水岭", @@ -3662,8 +3278,6 @@ MTH_DS_Zones = { ["deDE"] = "Glutnebelgipfel", ["enUS"] = "Dreadmist Peak", ["esES"] = "Cima Niebla Mortal", - ["frFR"] = "Pic de Brume-funeste", - ["koKR"] = "공포의 안개봉우리", ["ptBR"] = "Pico Névoa do Medo", ["ruRU"] = "Вершина Багрового Тумана", ["zhCN"] = "鬼雾峰", @@ -3681,8 +3295,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Feste Nordwacht", ["enUS"] = "Northwatch Hold", ["esES"] = "Bastión de la Vigía del Norte", - ["frFR"] = "Fort du Nord", - ["koKR"] = "북부 전초기지", ["ptBR"] = "Fortaleza Northwatch", ["ruRU"] = "Крепость Северной Стражи", ["zhCN"] = "北方城堡", @@ -3700,8 +3312,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Vergessenen Teiche", ["enUS"] = "The Forgotten Pools", ["esES"] = "Las Piscinas Olvidadas", - ["frFR"] = "Les Bassins oubliés", - ["koKR"] = "잊혀진 웅덩이", ["ptBR"] = "As Piscinas Esquecidas", ["ruRU"] = "Забытые пруды", ["zhCN"] = "遗忘之池", @@ -3719,8 +3329,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Blühende Oase", ["enUS"] = "Lushwater Oasis", ["esES"] = "Oasis Agua Viva", - ["frFR"] = "Oasis luxuriante", - ["koKR"] = "푸른 오아시스", ["ptBR"] = "Oasis Agua Lujosa", ["ruRU"] = "Цветущий оазис", ["zhCN"] = "甜水绿洲", @@ -3738,8 +3346,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Brackige Oase", ["enUS"] = "The Stagnant Oasis", ["esES"] = "El Oasis Estancado", - ["frFR"] = "L\'oasis stagnante", - ["koKR"] = "죽은 오아시스", ["ptBR"] = "O Oasis Estagnado", ["ruRU"] = "Застывший оазис", ["zhCN"] = "死水绿洲", @@ -3757,8 +3363,6 @@ MTH_DS_Zones = { ["deDE"] = "Feld der Riesen", ["enUS"] = "Field of Giants", ["esES"] = "Campo de los Gigantes", - ["frFR"] = "Champ des Géants", - ["koKR"] = "거인의 들판", ["ptBR"] = "Campo dos Gigantes", ["ruRU"] = "Поля Великанов", ["zhCN"] = "巨人旷野", @@ -3776,8 +3380,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Händlerküste", ["enUS"] = "The Merchant Coast", ["esES"] = "La Costa del Mercader", - ["frFR"] = "La Côte des marchands", - ["koKR"] = "무역 해안", ["ptBR"] = "A Costa dos Comerciantes", ["ruRU"] = "Торговое побережье", ["zhCN"] = "商旅海岸", @@ -3795,8 +3397,6 @@ MTH_DS_Zones = { ["deDE"] = "Ratschet", ["enUS"] = "Ratchet", ["esES"] = "Ratchett", - ["frFR"] = "Ratchet", - ["koKR"] = "톱니항", ["ptBR"] = "Carroça", ["ruRU"] = "Кабестан", ["zhCN"] = "棘齿城", @@ -3814,8 +3414,6 @@ MTH_DS_Zones = { ["deDE"] = "Wasserbrunnen der Winterhufe", ["enUS"] = "Winterhoof Water Well", ["esES"] = "Pozo de Agua Winterhoof", - ["frFR"] = "Puits Winterhoof", - ["koKR"] = "윈터후프 우물", ["ptBR"] = "Poço de Água Winterhoof", ["ruRU"] = "Колодец Заиндевевшего Копыта", ["zhCN"] = "冰蹄水井", @@ -3833,8 +3431,6 @@ MTH_DS_Zones = { ["deDE"] = "Wasserbrunnen der Donnerhörner", ["enUS"] = "Thunderhorn Water Well", ["esES"] = "Pozo de Agua Thunderhorn", - ["frFR"] = "Puits Thunderhorn", - ["koKR"] = "썬더혼 우물", ["ptBR"] = "O Poço de Água Thunderhorn", ["ruRU"] = "Колодец Громового Рога", ["zhCN"] = "雷角水井", @@ -3852,8 +3448,6 @@ MTH_DS_Zones = { ["deDE"] = "Wasserbrunnen der Wildmähnen", ["enUS"] = "Wildmane Water Well", ["esES"] = "Pozo de Agua Wildmane", - ["frFR"] = "Puits Wildmane", - ["koKR"] = "와일드메인 우물", ["ptBR"] = "Poço de Água Wildmane", ["ruRU"] = "Колодец Буйногривых", ["zhCN"] = "蛮鬃水井", @@ -3871,8 +3465,6 @@ MTH_DS_Zones = { ["deDE"] = "Grabungsstätte von Bael\'dun", ["enUS"] = "Bael\'dun Digsite", ["esES"] = "Sitio de Excavación de Bael\'dun", - ["frFR"] = "Site de fouilles de Bael\'Dun", - ["koKR"] = "바엘던 발굴현장", ["ptBR"] = "Sítio de Escavação Bael\'dun", ["ruRU"] = "Раскопки Бейл\'дана", ["zhCN"] = "巴尔莫丹挖掘场", @@ -3890,8 +3482,6 @@ MTH_DS_Zones = { ["deDE"] = "Maestras Posten", ["enUS"] = "Maestra\'s Post", ["esES"] = "Puesto de Maestra", - ["frFR"] = "Poste de Maestra", - ["koKR"] = "마에스트라 주둔지", ["ptBR"] = "Posto de Maestra", ["ruRU"] = "Застава Мейстры", ["zhCN"] = "迈斯特拉岗哨", @@ -3909,8 +3499,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Zoramstrand", ["enUS"] = "The Zoram Strand", ["esES"] = "La Playa Zoram", - ["frFR"] = "La grève de Zoram", - ["koKR"] = "조람 해안", ["ptBR"] = "A Praia Zoram", ["ruRU"] = "Зорамское взморье", ["zhCN"] = "佐拉姆海岸", @@ -3928,8 +3516,6 @@ MTH_DS_Zones = { ["deDE"] = "Astranaar", ["enUS"] = "Astranaar", ["esES"] = "Astranaar", - ["frFR"] = "Astranaar", - ["koKR"] = "아스트라나르", ["ptBR"] = "Astranaar", ["ruRU"] = "Астранаар", ["zhCN"] = "阿斯特兰纳", @@ -3947,8 +3533,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Schrein von Aessina", ["enUS"] = "The Shrine of Aessina", ["esES"] = "El Santuario de Aessina", - ["frFR"] = "Le sanctuaire d\'Aessina", - ["koKR"] = "아에시나의 제단", ["ptBR"] = "O Santuário de Aessina", ["ruRU"] = "Святилище Эссины", ["zhCN"] = "艾森娜神殿", @@ -3966,8 +3550,6 @@ MTH_DS_Zones = { ["deDE"] = "Schrein des sengenden Feuers", ["enUS"] = "Fire Scar Shrine", ["esES"] = "Santuario Cicatriz de Fuego", - ["frFR"] = "Sanctuaire de Scarfeu", - ["koKR"] = "불타버린 신전", ["ptBR"] = "Santuário Cicatriz de Fogo", ["ruRU"] = "Святилище Огненной Расщелины", ["zhCN"] = "火痕神殿", @@ -3985,8 +3567,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Sternenstaubruinen", ["enUS"] = "The Ruins of Stardust", ["esES"] = "Ruinas de Stardust", - ["frFR"] = "Les ruines de Chimétoile", - ["koKR"] = "별가루의 폐허", ["ptBR"] = "As Ruínas de Stardust", ["ruRU"] = "Руины Звездной Пыли", ["zhCN"] = "星尘废墟", @@ -4004,8 +3584,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Heulende Tal", ["enUS"] = "The Howling Vale", ["esES"] = "El Valle Aullante", - ["frFR"] = "Le Val hurlant", - ["koKR"] = "울부짖는 골짜기", ["ptBR"] = "O Vale Uivante", ["ruRU"] = "Воющая долина", ["zhCN"] = "狼嚎谷", @@ -4023,8 +3601,6 @@ MTH_DS_Zones = { ["deDE"] = "Mystralsee", ["enUS"] = "Mystral Lake", ["esES"] = "Lago Mystral", - ["frFR"] = "Lac Mystral", - ["koKR"] = "미스트랄 호수", ["ptBR"] = "Lago Mystral", ["ruRU"] = "Озеро Мистраль", ["zhCN"] = "密斯特拉湖", @@ -4042,8 +3618,6 @@ MTH_DS_Zones = { ["deDE"] = "Himmelssturzsee", ["enUS"] = "Fallen Sky Lake", ["esES"] = "Lago del Cielo Caído", - ["frFR"] = "Lac Tombeciel", - ["koKR"] = "유성 호수", ["ptBR"] = "Lago Céu Caído", ["ruRU"] = "Зеркало Небес", ["zhCN"] = "坠星湖", @@ -4061,8 +3635,6 @@ MTH_DS_Zones = { ["deDE"] = "Irissee", ["enUS"] = "Iris Lake", ["esES"] = "Lago Iris", - ["frFR"] = "Lac Iris", - ["koKR"] = "아이리스 호수", ["ptBR"] = "Lago Iris", ["ruRU"] = "Озеро Ирис", ["zhCN"] = "伊瑞斯湖", @@ -4080,8 +3652,6 @@ MTH_DS_Zones = { ["deDE"] = "Rajenbaum", ["enUS"] = "Raynewood Retreat", ["esES"] = "Retiro Bosque Rayne", - ["frFR"] = "Retraite de Raynewood", - ["koKR"] = "라이네나무 은신처", ["ptBR"] = "Refúgio Raynewood", ["ruRU"] = "Приют в Ночных Лесах", ["zhCN"] = "林中树居", @@ -4099,8 +3669,6 @@ MTH_DS_Zones = { ["deDE"] = "Nachtflucht", ["enUS"] = "Night Run", ["esES"] = "Carrera Nocturna", - ["frFR"] = "Défilé de la nuit", - ["koKR"] = "어둠의 터", ["ptBR"] = "Corrida Noturna", ["ruRU"] = "Ночная поляна", ["zhCN"] = "夜道谷", @@ -4118,8 +3686,6 @@ MTH_DS_Zones = { ["deDE"] = "Satyrnaar", ["enUS"] = "Satyrnaar", ["esES"] = "Satyrnaar", - ["frFR"] = "Satyrnaar", - ["koKR"] = "사티르나르", ["ptBR"] = "Satyrnaar", ["ruRU"] = "Сатирнаар", ["zhCN"] = "萨提纳尔", @@ -4137,8 +3703,6 @@ MTH_DS_Zones = { ["deDE"] = "Dämonenhügel", ["enUS"] = "Felfire Hill", ["esES"] = "Colina Fuego Vil", - ["frFR"] = "Colline Gangrefeu", - ["koKR"] = "지옥불 언덕", ["ptBR"] = "Colina Fogo Vil", ["ruRU"] = "Холм Демонического Огня", ["zhCN"] = "冥火岭", @@ -4156,8 +3720,6 @@ MTH_DS_Zones = { ["deDE"] = "Holzfällerlager des Kriegshymnenklans", ["enUS"] = "Warsong Lumber Camp", ["esES"] = "Campo de Leña Canción de Guerra", - ["frFR"] = "Camp de bûcherons Warsong", - ["koKR"] = "전쟁노래부족 벌목기지", ["ptBR"] = "Acampamento de Madeira Grito de Guerra", ["ruRU"] = "Лесозаготовки Песни Войны", ["zhCN"] = "战歌伐木营地", @@ -4175,8 +3737,6 @@ MTH_DS_Zones = { ["deDE"] = "Schattengrün", ["enUS"] = "Bough Shadow", ["esES"] = "Sombra de Rama", - ["frFR"] = "L\'Ombrage", - ["koKR"] = "어둠의 나무", ["ptBR"] = "Sombra dos Ramos", ["ruRU"] = "Тенистая Крона", ["zhCN"] = "大树荫", @@ -4194,8 +3754,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Schimmernde Ebene", ["enUS"] = "The Shimmering Flats", ["esES"] = "Las Llanuras Brillantes", - ["frFR"] = "Les Salines", - ["koKR"] = "소금 평원", ["ptBR"] = "As Planícies Brilhantes", ["ruRU"] = "Мерцающая равнина", ["zhCN"] = "闪光平原", @@ -4213,8 +3771,6 @@ MTH_DS_Zones = { ["deDE"] = "Falathimsee", ["enUS"] = "Lake Falathim", ["esES"] = "Lago Falathim", - ["frFR"] = "Lac Falathim", - ["koKR"] = "팔라딤 호수", ["ptBR"] = "Lago Falathim", ["ruRU"] = "Озеро Фалатим", ["zhCN"] = "法拉希姆湖", @@ -4232,8 +3788,6 @@ MTH_DS_Zones = { ["deDE"] = "Auberdine", ["enUS"] = "Auberdine", ["esES"] = "Auberdine", - ["frFR"] = "Auberdine", - ["koKR"] = "아우버다인", ["ptBR"] = "Auberdine", ["ruRU"] = "Аубердин", ["zhCN"] = "奥伯丁", @@ -4251,8 +3805,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ruinen von Mathystra", ["enUS"] = "Ruins of Mathystra", ["esES"] = "Ruinas de Mathystra", - ["frFR"] = "Ruines de Mathystra", - ["koKR"] = "마시스트라의 폐허", ["ptBR"] = "Ruínas de Mathystra", ["ruRU"] = "Руины Матистры", ["zhCN"] = "玛塞斯特拉废墟", @@ -4270,8 +3822,6 @@ MTH_DS_Zones = { ["deDE"] = "Turm von Althalaxx", ["enUS"] = "Tower of Althalaxx", ["esES"] = "Torre de Althalaxx", - ["frFR"] = "Tour d\'Althalaxx", - ["koKR"] = "알살락스의 탑", ["ptBR"] = "A Torre de Althalaxx", ["ruRU"] = "Башня Алталакса", ["zhCN"] = "奥萨拉克斯之塔", @@ -4289,8 +3839,6 @@ MTH_DS_Zones = { ["deDE"] = "Bashal\'Aran", ["enUS"] = "Bashal\'Aran", ["esES"] = "Bashal\'Aran", - ["frFR"] = "Bashal\'Aran", - ["koKR"] = "바샬아란", ["ptBR"] = "Bashal\'Aran", ["ruRU"] = "Башал\'Аран", ["zhCN"] = "巴莎兰", @@ -4308,8 +3856,6 @@ MTH_DS_Zones = { ["deDE"] = "Ameth\'Aran", ["enUS"] = "Ameth\'Aran", ["esES"] = "Ameth\'Aran", - ["frFR"] = "Ameth\'Aran", - ["koKR"] = "아메스아란", ["ptBR"] = "Ameth\'Aran", ["ruRU"] = "Амет\'Аран", ["zhCN"] = "亚米萨兰", @@ -4327,8 +3873,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Hain der Uralten", ["enUS"] = "Grove of the Ancients", ["esES"] = "Arboleda de los Antiguos", - ["frFR"] = "Bosquet des Anciens", - ["koKR"] = "고대정령의 숲", ["ptBR"] = "Bosque dos Ancestrais", ["ruRU"] = "Роща Древних", ["zhCN"] = "古树之林", @@ -4346,8 +3890,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Meistergleve", ["enUS"] = "The Master\'s Glaive", ["esES"] = "La Hoja del Maestro", - ["frFR"] = "Le Glaive du Maître", - ["koKR"] = "지배자의 무덤", ["ptBR"] = "A Lâmina do Mestre", ["ruRU"] = "Меч Властителя", ["zhCN"] = "主宰之剑", @@ -4365,8 +3907,6 @@ MTH_DS_Zones = { ["deDE"] = "Wirrbarts Ausgrabung", ["enUS"] = "Remtravel\'s Excavation", ["esES"] = "Excavación de Remtravel", - ["frFR"] = "Excavations de Remtravel", - ["koKR"] = "렘트레블의 발굴현장", ["ptBR"] = "Escavação Remtravel", ["ruRU"] = "Раскопки рассеянного геолога", ["zhCN"] = "雷姆塔维尔挖掘场", @@ -4384,8 +3924,6 @@ MTH_DS_Zones = { ["deDE"] = "Klippenquell", ["enUS"] = "Cliffspring River", ["esES"] = "Río Fonroca", - ["frFR"] = "La Bondissante", - ["koKR"] = "폭포수 강", ["ptBR"] = "Rio da Fonte da Falésia", ["ruRU"] = "Река Скалистая", ["zhCN"] = "壁泉河", @@ -4403,8 +3941,6 @@ MTH_DS_Zones = { ["deDE"] = "Scharlachroter Wachposten", ["enUS"] = "Scarlet Watch Post", ["esES"] = "Puesto de Vigilancia Escarlata", - ["frFR"] = "Poste de garde de la Croisade", - ["koKR"] = "붉은십자군 경비초소", ["ptBR"] = "Posto de Vigia Scarlet", ["ruRU"] = "Сторожевой пост Алого ордена", ["zhCN"] = "血色十字军哨岗", @@ -4422,8 +3958,6 @@ MTH_DS_Zones = { ["deDE"] = "Sonnenfels", ["enUS"] = "Sun Rock Retreat", ["esES"] = "Refugio Roca del Sol", - ["frFR"] = "Retraite de Roche-Soleil", - ["koKR"] = "해바위 야영지", ["ptBR"] = "Retiro Sun Rock", ["ruRU"] = "Приют у Солнечного Камня", ["zhCN"] = "烈日石居", @@ -4441,8 +3975,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Scherwindklippe", ["enUS"] = "Windshear Crag", ["esES"] = "Peñasco Viento Cortante", - ["frFR"] = "Combe des Cisailles", - ["koKR"] = "칼바람 바위산", ["ptBR"] = "Cume Windshear", ["ruRU"] = "Утес Ветрорезов", ["zhCN"] = "狂风峭壁", @@ -4460,8 +3992,6 @@ MTH_DS_Zones = { ["deDE"] = "Mirkfallonsee", ["enUS"] = "Mirkfallon Lake", ["esES"] = "Lago Mirkfallon", - ["frFR"] = "Lac Mirkfallon", - ["koKR"] = "땅거미 호수", ["ptBR"] = "Lago Mirkfallon", ["ruRU"] = "Мутное озеро", ["zhCN"] = "暗色湖", @@ -4479,8 +4009,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Verbrannte Tal", ["enUS"] = "The Charred Vale", ["esES"] = "El Valle Carbonizado", - ["frFR"] = "Le Val calciné", - ["koKR"] = "잿더미 계곡", ["ptBR"] = "O Vale Queimado", ["ruRU"] = "Обугленная долина", ["zhCN"] = "焦炭谷", @@ -4498,8 +4026,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Steinkrallengipfel", ["enUS"] = "Stonetalon Peak", ["esES"] = "Cima Colina de Piedra", - ["frFR"] = "Pic des Serres-Rocheuses", - ["koKR"] = "돌발톱 봉우리", ["ptBR"] = "Pico Stonetalon", ["ruRU"] = "Пик Каменного Когтя", ["zhCN"] = "石爪峰", @@ -4517,8 +4043,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Jubuwal", ["enUS"] = "Ruins of Jubuwal", ["esES"] = "Ruinas de Jubuwal", - ["frFR"] = "Ruines de Jubuwal", - ["koKR"] = "주부왈의 폐허", ["ptBR"] = "Ruínas de Jubuwal", ["ruRU"] = "Руины Жубуваля", ["zhCN"] = "朱布瓦尔废墟", @@ -4536,8 +4060,6 @@ MTH_DS_Zones = { ["deDE"] = "Teiche von Arlithrien", ["enUS"] = "Pools of Arlithrien", ["esES"] = "Pozos de Arlithrien", - ["frFR"] = "Bassins d\'Arlithrien", - ["koKR"] = "아리스리엔 연못", ["ptBR"] = "Poços de Arlithrien", ["ruRU"] = "Пруды Арлитриэна", ["zhCN"] = "阿里斯瑞恩之池", @@ -4555,8 +4077,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp E\'thok", ["enUS"] = "Camp E\'thok", ["esES"] = "Campamento E\'thok", - ["frFR"] = "Camp E\'thok", - ["koKR"] = "에톡 야영지", ["ptBR"] = "Acampamento E\'thok", ["ruRU"] = "Лагерь Э\'Ток", ["zhCN"] = "伊索克营地", @@ -4574,8 +4094,6 @@ MTH_DS_Zones = { ["deDE"] = "Spalthufklippe", ["enUS"] = "Splithoof Crag", ["esES"] = "Peñasco Pezuña Rota", - ["frFR"] = "Combe du Sabot fendu", - ["koKR"] = "갈래발굽 바윗골", ["ptBR"] = "Cratera Splithoof", ["ruRU"] = "Утес Треснувшего Копыта", ["zhCN"] = "裂蹄峭壁", @@ -4593,8 +4111,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Steilhang", ["enUS"] = "Highperch", ["esES"] = "Altura Alta", - ["frFR"] = "Haut-perchoir", - ["koKR"] = "마루둥지", ["ptBR"] = "Alto do Penacho", ["ruRU"] = "Скальное гнездовье", ["zhCN"] = "风巢", @@ -4612,8 +4128,6 @@ MTH_DS_Zones = { ["deDE"] = "Der kreischende Canyon", ["enUS"] = "The Screeching Canyon", ["esES"] = "Cañón de los Gritos", - ["frFR"] = "Canyon des hurlements", - ["koKR"] = "회오리 협곡", ["ptBR"] = "O Desfiladeiro Uivante", ["ruRU"] = "Каньон Визга", ["zhCN"] = "尖啸峡谷", @@ -4631,8 +4145,6 @@ MTH_DS_Zones = { ["deDE"] = "Freiwindposten", ["enUS"] = "Freewind Post", ["esES"] = "Puesto Viento Libre", - ["frFR"] = "Poste de Librevent", - ["koKR"] = "높새바람 봉우리", ["ptBR"] = "Posto Ventos Livres", ["ruRU"] = "Застава Вольного Ветра", ["zhCN"] = "乱风岗", @@ -4650,8 +4162,6 @@ MTH_DS_Zones = { ["deDE"] = "Der große Aufzug", ["enUS"] = "The Great Lift", ["esES"] = "El Gran Ascensor", - ["frFR"] = "La Grande élévation", - ["koKR"] = "구름 승강장", ["ptBR"] = "O Grande Elevador", ["ruRU"] = "Великий Подъемник", ["zhCN"] = "升降梯", @@ -4669,8 +4179,6 @@ MTH_DS_Zones = { ["deDE"] = "Friedhof von Rabenflucht", ["enUS"] = "Raven Hill Cemetery", ["esES"] = "Cementerio de Colina del Cuervo", - ["frFR"] = "Cimetière de Colline-aux-Corbeaux", - ["koKR"] = "까마귀 언덕 묘지", ["ptBR"] = "Cemitério da Colina do Corvo", ["ruRU"] = "Кладбище Вороньего Холма", ["zhCN"] = "乌鸦岭墓地", @@ -4688,8 +4196,6 @@ MTH_DS_Zones = { ["deDE"] = "Brackenwall", ["enUS"] = "Brackenwall Village", ["esES"] = "Aldea Muro de Helechos", - ["frFR"] = "Mur-de-Fougères", - ["koKR"] = "담쟁이 마을", ["ptBR"] = "Aldeia de Parede de Samambaia", ["ruRU"] = "Деревня Гиблотопь", ["zhCN"] = "蕨墙村", @@ -4707,8 +4213,6 @@ MTH_DS_Zones = { ["deDE"] = "Hexenhügel", ["enUS"] = "Witch Hill", ["esES"] = "Colina de la Bruja", - ["frFR"] = "Colline des sorcières", - ["koKR"] = "마녀 언덕", ["ptBR"] = "Colina da Bruxa", ["ruRU"] = "Ведьмин холм", ["zhCN"] = "女巫岭", @@ -4726,8 +4230,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Flammenbau", ["enUS"] = "The Den of Flame", ["esES"] = "El Refugio de la Llama", - ["frFR"] = "L\'Antre des flammes", - ["koKR"] = "화염의 둥지", ["ptBR"] = "A Cova das Chamas", ["ruRU"] = "Огненное логово", ["zhCN"] = "火焰洞穴", @@ -4745,8 +4247,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Drachensumpf", ["enUS"] = "Wyrmbog", ["esES"] = "Foso del Dragón", - ["frFR"] = "Tourbière du Ver", - ["koKR"] = "용의 둥지", ["ptBR"] = "Pântano Wyrmbog", ["ruRU"] = "Драконьи топи", ["zhCN"] = "巨龙沼泽", @@ -4764,8 +4264,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Insel Theramore", ["enUS"] = "Theramore Isle", ["esES"] = "Isla Theramore", - ["frFR"] = "Ile de Theramore", - ["koKR"] = "테라모어 섬", ["ptBR"] = "A Ilha Theramore", ["ruRU"] = "Остров Терамор", ["zhCN"] = "塞拉摩岛", @@ -4783,8 +4281,6 @@ MTH_DS_Zones = { ["deDE"] = "Addles Siedlung", ["enUS"] = "Addle\'s Stead", ["esES"] = "Granja de Addle", - ["frFR"] = "Ferme des Addle", - ["koKR"] = "에이들의 은신처", ["ptBR"] = "Fazenda de Addle", ["ruRU"] = "Участок Эддла", ["zhCN"] = "腐草农场", @@ -4802,8 +4298,6 @@ MTH_DS_Zones = { ["deDE"] = "Feuersäulengrat", ["enUS"] = "Fire Plume Ridge", ["esES"] = "Cresta de la Pluma de Fuego", - ["frFR"] = "Crête de la Fournaise", - ["koKR"] = "불기둥 마루", ["ptBR"] = "Crista do Penacho de Fogo", ["ruRU"] = "Вулкан Огненного Венца", ["zhCN"] = "火羽山", @@ -4821,8 +4315,6 @@ MTH_DS_Zones = { ["deDE"] = "Teergruben von Lakkari", ["enUS"] = "Lakkari Tar Pits", ["esES"] = "Pozos de Alquimia Lakkari", - ["frFR"] = "Fosses de goudron de Lakkari", - ["koKR"] = "락카리 잿구덩이", ["ptBR"] = "Fosos de Alquitrán Lakkari", ["ruRU"] = "Смоляные ямы Лаккари", ["zhCN"] = "拉卡利油沼", @@ -4840,8 +4332,6 @@ MTH_DS_Zones = { ["deDE"] = "Terrorflucht", ["enUS"] = "Terror Run", ["esES"] = "Sendero del Terror", - ["frFR"] = "Coteaux de la terreur", - ["koKR"] = "공포의 터", ["ptBR"] = "Caminho do Terror", ["ruRU"] = "Путь Ужаса", ["zhCN"] = "恐惧小道", @@ -4859,8 +4349,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Wuchernde Narbe", ["enUS"] = "The Slithering Scar", ["esES"] = "La Cicatriz Serpenteante", - ["frFR"] = "La Balafre sinueuse", - ["koKR"] = "갈래굽이 구렁", ["ptBR"] = "A Cicatriz Serpenteante", ["ruRU"] = "Скользкий овраг", ["zhCN"] = "巨痕谷", @@ -4878,8 +4366,6 @@ MTH_DS_Zones = { ["deDE"] = "Die heißen Quellen von Golakka", ["enUS"] = "Golakka Hot Springs", ["esES"] = "Aguas Termales Golakka", - ["frFR"] = "Sources de Golakka", - ["koKR"] = "골락카 간헐천", ["ptBR"] = "Fontes Termais Golakka", ["ruRU"] = "Горячие источники Голакка", ["zhCN"] = "葛拉卡温泉", @@ -4897,8 +4383,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Loch", ["enUS"] = "The Loch", ["esES"] = "El Loch", - ["frFR"] = "Le Loch", - ["koKR"] = "대호수", ["ptBR"] = "O Lago", ["ruRU"] = "Озеро Лок", ["zhCN"] = "洛克湖", @@ -4916,8 +4400,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Kodofriedhof", ["enUS"] = "Kodo Graveyard", ["esES"] = "Cementerio de Kodo", - ["frFR"] = "Cimetière des kodos", - ["koKR"] = "코도 무덤", ["ptBR"] = "Cementerio Kodo", ["ruRU"] = "Кладбище кодо", ["zhCN"] = "科多兽坟场", @@ -4935,8 +4417,6 @@ MTH_DS_Zones = { ["deDE"] = "Festung Donneraxt", ["enUS"] = "Thunder Axe Fortress", ["esES"] = "Fortaleza Hacha Trueno", - ["frFR"] = "Forteresse de Hache-Tonnerre", - ["koKR"] = "천둥도끼 요새", ["ptBR"] = "A Fortaleza do Machado do Trovão", ["ruRU"] = "Крепость Громового Топора", ["zhCN"] = "雷斧堡垒", @@ -4954,8 +4434,6 @@ MTH_DS_Zones = { ["deDE"] = "Zirkel der Mannoroc", ["enUS"] = "Mannoroc Coven", ["esES"] = "Coven Mannoroc", - ["frFR"] = "Convent de Mannoroc", - ["koKR"] = "만노로크 소굴", ["ptBR"] = "Coven Mannoroc", ["ruRU"] = "Поле Маннорок", ["zhCN"] = "玛诺洛克集会所", @@ -4973,8 +4451,6 @@ MTH_DS_Zones = { ["deDE"] = "Sargeron", ["enUS"] = "Sargeron", ["esES"] = "Sargeron", - ["frFR"] = "Sargeron", - ["koKR"] = "살게론", ["ptBR"] = "Sargeron", ["ruRU"] = "Саргерон", ["zhCN"] = "萨格隆", @@ -4992,8 +4468,6 @@ MTH_DS_Zones = { ["deDE"] = "Magram", ["enUS"] = "Magram Village", ["esES"] = "Aldea Magram", - ["frFR"] = "Village des Magram", - ["koKR"] = "마그람 마을", ["ptBR"] = "Aldeia Magram", ["ruRU"] = "Деревня Маграм", ["zhCN"] = "玛格拉姆村", @@ -5011,8 +4485,6 @@ MTH_DS_Zones = { ["deDE"] = "Gelkis", ["enUS"] = "Gelkis Village", ["esES"] = "Aldea Gelkis", - ["frFR"] = "Village des Gelkis", - ["koKR"] = "겔키스 마을", ["ptBR"] = "Aldeia Gelkis", ["ruRU"] = "Деревня Гелкис", ["zhCN"] = "吉尔吉斯村", @@ -5030,8 +4502,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Tal der Speere", ["enUS"] = "Valley of Spears", ["esES"] = "Valle de las Lanzas", - ["frFR"] = "Vallée des Lances", - ["koKR"] = "뾰족바위 골짜기", ["ptBR"] = "Vale das Lanças", ["ruRU"] = "Долина Копий", ["zhCN"] = "长矛谷", @@ -5049,8 +4519,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Nijelspitze", ["enUS"] = "Nijel\'s Point", ["esES"] = "Punta de Nijel", - ["frFR"] = "Combe de Nijel", - ["koKR"] = "나이젤의 야영지", ["ptBR"] = "Ponto de Nijel", ["ruRU"] = "Высота Найджела", ["zhCN"] = "尼耶尔前哨站", @@ -5068,8 +4536,6 @@ MTH_DS_Zones = { ["deDE"] = "Kolkar", ["enUS"] = "Kolkar Village", ["esES"] = "Aldea Kolkar", - ["frFR"] = "Village des Kolkar", - ["koKR"] = "콜카르 마을", ["ptBR"] = "Aldeia Kolkar", ["ruRU"] = "Деревня Колкар", ["zhCN"] = "科尔卡村", @@ -5087,8 +4553,6 @@ MTH_DS_Zones = { ["deDE"] = "See von Elune\'ara", ["enUS"] = "Lake Elune\'ara", ["esES"] = "Lago Elune\'ara", - ["frFR"] = "Lac Elune\'ara", - ["koKR"] = "엘룬아라 호수", ["ptBR"] = "Lago Elune\'ara", ["ruRU"] = "Озеро Элуне\'ара", ["zhCN"] = "月神湖", @@ -5106,8 +4570,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Sichere Hafen", ["enUS"] = "The Harborage", ["esES"] = "El Refugio", - ["frFR"] = "Le Havre boueux", - ["koKR"] = "피난처", ["ptBR"] = "O Refúgio", ["ruRU"] = "Убежище", ["zhCN"] = "避难营", @@ -5125,8 +4587,6 @@ MTH_DS_Zones = { ["deDE"] = "Rut\'theran", ["enUS"] = "Rut\'theran Village", ["esES"] = "Aldea Rut\'theran", - ["frFR"] = "Rut\'theran", - ["koKR"] = "루테란 마을", ["ptBR"] = "Aldeia Rut\'theran", ["ruRU"] = "Деревня Рут\'теран", ["zhCN"] = "鲁瑟兰村", @@ -5144,8 +4604,6 @@ MTH_DS_Zones = { ["deDE"] = "Lichtung von Ban\'ethil", ["enUS"] = "Ban\'ethil Hollow", ["esES"] = "Hoya Ban\'ethil", - ["frFR"] = "Creux de Ban\'ethil", - ["koKR"] = "바네실 동굴", ["ptBR"] = "Clareira de Ban\'ethil", ["ruRU"] = "Лощина Бен\'этиль", ["zhCN"] = "班尼希尔山谷", @@ -5163,8 +4621,6 @@ MTH_DS_Zones = { ["deDE"] = "Jerods Anlegestelle", ["enUS"] = "Jerod\'s Landing", ["esES"] = "Desembarco de Jerod", - ["frFR"] = "Le Débarcadère de Jerod", - ["koKR"] = "제로드 선착장", ["ptBR"] = "Atracadero de Jerod", ["ruRU"] = "Лагерь Джерода", ["zhCN"] = "杰罗德码头", @@ -5182,8 +4638,6 @@ MTH_DS_Zones = { ["deDE"] = "Kammwacht", ["enUS"] = "Ridgepoint Tower", ["esES"] = "Torre de la Peña", - ["frFR"] = "Tour de la Crête", - ["koKR"] = "마루목 감시탑", ["ptBR"] = "Torre Ridgepoint", ["ruRU"] = "Дозорная башня", ["zhCN"] = "山巅之塔", @@ -5201,8 +4655,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Dunkle Ufer", ["enUS"] = "The Darkened Bank", ["esES"] = "El Banco Oscurecido", - ["frFR"] = "La Rive sombre", - ["koKR"] = "어스름 강둑", ["ptBR"] = "O Banco Escurecido", ["ruRU"] = "Темный берег", ["zhCN"] = "暗色河滩", @@ -5220,8 +4672,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisklamm", ["enUS"] = "Coldridge Pass", ["esES"] = "Paso Fríovelo", - ["frFR"] = "Passe des Frigères", - ["koKR"] = "눈마루 고개", ["ptBR"] = "Passagem Crista Fria", ["ruRU"] = "Туннель Холодной долины", ["zhCN"] = "寒脊山小径", @@ -5239,8 +4689,6 @@ MTH_DS_Zones = { ["deDE"] = "Frosthauchtal", ["enUS"] = "Chill Breeze Valley", ["esES"] = "Valle Brisa Gélida", - ["frFR"] = "Vallée de la bise", - ["koKR"] = "찬바람 골짜기", ["ptBR"] = "Vale Brisa Gelada", ["ruRU"] = "Долина Промозглого Ветра", ["zhCN"] = "寒风峡谷", @@ -5258,8 +4706,6 @@ MTH_DS_Zones = { ["deDE"] = "Schimmergrat", ["enUS"] = "Shimmer Ridge", ["esES"] = "Cresta Brillante", - ["frFR"] = "Crête scintillante", - ["koKR"] = "쉼머 마루", ["ptBR"] = "Pico Shimmer", ["ruRU"] = "Мерцающий хребет", ["zhCN"] = "闪光岭", @@ -5277,8 +4723,6 @@ MTH_DS_Zones = { ["deDE"] = "Gehöft Bernruh", ["enUS"] = "Amberstill Ranch", ["esES"] = "Rancho Amberstill", - ["frFR"] = "Ferme des Amberstill", - ["koKR"] = "앰버스틸 목장", ["ptBR"] = "Rancho Âmbar Silente", ["ruRU"] = "Ферма Янтарленов", ["zhCN"] = "冻石农场", @@ -5296,8 +4740,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Tundridhügel", ["enUS"] = "The Tundrid Hills", ["esES"] = "Las Colinas Tundridas", - ["frFR"] = "Les Collines de Tundrid", - ["koKR"] = "툰드리드 언덕", ["ptBR"] = "As Colinas Tundridas", ["ruRU"] = "Холмы Тандрид", ["zhCN"] = "冻土岭", @@ -5315,8 +4757,6 @@ MTH_DS_Zones = { ["deDE"] = "Südtoraußenposten", ["enUS"] = "South Gate Outpost", ["esES"] = "Puesto de la Puerta Sur", - ["frFR"] = "Avant-poste de la porte Sud", - ["koKR"] = "남부 관문 전초기지", ["ptBR"] = "Acampamento Avançado do Portão Sul", ["ruRU"] = "Застава у Южных врат", ["zhCN"] = "南门哨岗", @@ -5334,8 +4774,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordtoraußenposten", ["enUS"] = "North Gate Outpost", ["esES"] = "Puesto de la Puerta Norte", - ["frFR"] = "Avant-poste de la porte Nord", - ["koKR"] = "북부 관문 전초기지", ["ptBR"] = "Posto Avançado da Porta Norte", ["ruRU"] = "Застава у Северных врат", ["zhCN"] = "北门哨岗", @@ -5353,8 +4791,6 @@ MTH_DS_Zones = { ["deDE"] = "Tore von Eisenschmiede", ["enUS"] = "Gates of Ironforge", ["esES"] = "Puertas de Forjaz", - ["frFR"] = "Portes d\'Ironforge", - ["koKR"] = "아이언포지 성문", ["ptBR"] = "Portões de Altaforja", ["ruRU"] = "Врата Стальгорна", ["zhCN"] = "铁炉堡大门", @@ -5372,8 +4808,6 @@ MTH_DS_Zones = { ["deDE"] = "Stillwassertümpel", ["enUS"] = "Stillwater Pond", ["esES"] = "Estanque Aguaserena", - ["frFR"] = "Etang immobile", - ["koKR"] = "고요의 연못", ["ptBR"] = "Lago Stillwater", ["ruRU"] = "Тихий Омут", ["zhCN"] = "静水池", @@ -5391,8 +4825,6 @@ MTH_DS_Zones = { ["deDE"] = "Alptraumtal", ["enUS"] = "Nightmare Vale", ["esES"] = "Valle de la Pesadilla", - ["frFR"] = "Vallée des cauchemars", - ["koKR"] = "악몽의 골짜기", ["ptBR"] = "Vale do Pesadelo", ["ruRU"] = "Долина Кошмаров", ["zhCN"] = "噩梦谷", @@ -5410,8 +4842,6 @@ MTH_DS_Zones = { ["deDE"] = "Giftwebertal", ["enUS"] = "Venomweb Vale", ["esES"] = "Valle de la Telaraña Venenosa", - ["frFR"] = "Vallée de Tissevenin", - ["koKR"] = "독그물 골짜기", ["ptBR"] = "Vale Venomweb", ["ruRU"] = "Долина ядовитых пауков", ["zhCN"] = "毒蛛峡谷", @@ -5429,8 +4859,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Bollwerk", ["enUS"] = "The Bulwark", ["esES"] = "El Baluarte", - ["frFR"] = "La Barricade", - ["koKR"] = "보루", ["ptBR"] = "A Muralha", ["ruRU"] = "Бастион", ["zhCN"] = "亡灵壁垒", @@ -5448,8 +4876,6 @@ MTH_DS_Zones = { ["deDE"] = "Revier der Klingenmähnen", ["enUS"] = "Razormane Grounds", ["esES"] = "Llanuras de los Sable de Roca", - ["frFR"] = "Terres des Tranchecrins", - ["koKR"] = "서슬갈기일족 영토", ["ptBR"] = "Terrenos Razormane", ["ruRU"] = "Земли Иглогривых", ["zhCN"] = "钢鬃营地", @@ -5467,8 +4893,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Knochenhöhle", ["enUS"] = "Skull Rock", ["esES"] = "Roca Calavera", - ["frFR"] = "Rocher du crâne", - ["koKR"] = "해골 바위굴", ["ptBR"] = "Pedra Skull", ["ruRU"] = "Скала Черепа", ["zhCN"] = "骷髅石", @@ -5486,8 +4910,6 @@ MTH_DS_Zones = { ["deDE"] = "Bleichmähnenfels", ["enUS"] = "Palemane Rock", ["esES"] = "Roca de los Pelomalo", - ["frFR"] = "Rocher des crins-pâles", - ["koKR"] = "회색갈기일족 바위굴", ["ptBR"] = "Pedra Palemane", ["ruRU"] = "Утес Бледногривов", ["zhCN"] = "白鬃石", @@ -5505,8 +4927,6 @@ MTH_DS_Zones = { ["deDE"] = "Windfurienkamm", ["enUS"] = "Windfury Ridge", ["esES"] = "Cima del Viento Furioso", - ["frFR"] = "Crête des Furies-des-vents", - ["koKR"] = "성난바람 마루", ["ptBR"] = "Colina Windfury", ["ruRU"] = "Гряда Неистовства Ветра", ["zhCN"] = "狂风山", @@ -5524,8 +4944,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Goldenen Ebenen", ["enUS"] = "The Golden Plains", ["esES"] = "Llanuras Doradas", - ["frFR"] = "Les plaines dorées", - ["koKR"] = "황금 초원", ["ptBR"] = "As Planícies Douradas", ["ruRU"] = "Золотые равнины", ["zhCN"] = "金色平原", @@ -5543,8 +4961,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Wogenden Ebenen", ["enUS"] = "The Rolling Plains", ["esES"] = "Llanuras Onduladas", - ["frFR"] = "Les plaines vallonnées", - ["koKR"] = "구릉 초원", ["ptBR"] = "As Planícies Onduladas", ["ruRU"] = "Холмистые равнины", ["zhCN"] = "草海平原", @@ -5562,8 +4978,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordtorpass", ["enUS"] = "North Gate Pass", ["esES"] = "Paso de la Puerta Norte", - ["frFR"] = "Passage de la porte Nord", - ["koKR"] = "북부 관문 통행로", ["ptBR"] = "Passagem da Porta Norte", ["ruRU"] = "Северные врата", ["zhCN"] = "北门小径", @@ -5581,8 +4995,6 @@ MTH_DS_Zones = { ["deDE"] = "Zwielichtshain", ["enUS"] = "Twilight Grove", ["esES"] = "Arboleda Crepuscular", - ["frFR"] = "Bosquet du crépuscule", - ["koKR"] = "황혼의 숲", ["ptBR"] = "Bosque Crepúsculo", ["ruRU"] = "Мглистая роща", ["zhCN"] = "黎明森林", @@ -5600,8 +5012,6 @@ MTH_DS_Zones = { ["deDE"] = "Thandolübergang", ["enUS"] = "Thandol Span", ["esES"] = "Tramo Thandol", - ["frFR"] = "Viaduc de Thandol", - ["koKR"] = "탄돌 교각", ["ptBR"] = "Ponte Thandol", ["ruRU"] = "Мост Тандола", ["zhCN"] = "萨多尔大桥", @@ -5619,8 +5029,6 @@ MTH_DS_Zones = { ["deDE"] = "Fegefeuerinsel", ["enUS"] = "Purgation Isle", ["esES"] = "Isla de la Purga", - ["frFR"] = "Ile de la purification", - ["koKR"] = "속죄의 섬", ["ptBR"] = "Ilha da Purgatória", ["ruRU"] = "Остров Очищения", ["zhCN"] = "赎罪岛", @@ -5638,8 +5046,6 @@ MTH_DS_Zones = { ["deDE"] = "Jansens Hof", ["enUS"] = "The Jansen Stead", ["esES"] = "La Granja Jansen", - ["frFR"] = "La ferme des Jansen", - ["koKR"] = "얀센 농장", ["ptBR"] = "A Fazenda Jansen", ["ruRU"] = "Владение Янсена", ["zhCN"] = "贾森农场", @@ -5657,8 +5063,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Todesacker", ["enUS"] = "The Dead Acre", ["esES"] = "El Terreno Muerto", - ["frFR"] = "L\'acre mort", - ["koKR"] = "메마른 논밭", ["ptBR"] = "O Campo Morto", ["ruRU"] = "Мертвая пашня", ["zhCN"] = "死亡农地", @@ -5676,8 +5080,6 @@ MTH_DS_Zones = { ["deDE"] = "Molsens Hof", ["enUS"] = "The Molsen Farm", ["esES"] = "La Granja Molsen", - ["frFR"] = "La ferme des Molsen", - ["koKR"] = "몰센 농장", ["ptBR"] = "A Fazenda Molsen", ["ruRU"] = "Ферма Мольсена", ["zhCN"] = "摩尔森农场", @@ -5695,8 +5097,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Dolchhügel", ["enUS"] = "The Dagger Hills", ["esES"] = "Las Colinas de la Daga", - ["frFR"] = "Les collines de la Dague", - ["koKR"] = "비수 언덕", ["ptBR"] = "As Colinas Dagger", ["ruRU"] = "Холмы Разбойничьих Кинжалов", ["zhCN"] = "匕首岭", @@ -5714,8 +5114,6 @@ MTH_DS_Zones = { ["deDE"] = "Demonts Heim", ["enUS"] = "Demont\'s Place", ["esES"] = "El Lugar de Demont", - ["frFR"] = "Maison de Demont", - ["koKR"] = "데몬트의 집터", ["ptBR"] = "Lugar de Demont", ["ruRU"] = "Участок Демонта", ["zhCN"] = "迪蒙特荒野", @@ -5733,8 +5131,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Staubebenen", ["enUS"] = "The Dust Plains", ["esES"] = "Las Llanuras Polvorientas", - ["frFR"] = "Les Plaines de poussière", - ["koKR"] = "먼지 언덕", ["ptBR"] = "As Planícies de Poeira", ["ruRU"] = "Пыльные равнины", ["zhCN"] = "尘埃平原", @@ -5752,8 +5148,6 @@ MTH_DS_Zones = { ["deDE"] = "Splittersteintal", ["enUS"] = "Stonesplinter Valley", ["esES"] = "Valle Fragmentado", - ["frFR"] = "Vallée des Brisepierre", - ["koKR"] = "가루바위 골짜기", ["ptBR"] = "Vale Stonesplinter", ["ruRU"] = "Долина Камнедробов", ["zhCN"] = "碎石怪之谷", @@ -5771,8 +5165,6 @@ MTH_DS_Zones = { ["deDE"] = "Tal der Könige", ["enUS"] = "Valley of Kings", ["esES"] = "Valle de los Reyes", - ["frFR"] = "Vallée des rois", - ["koKR"] = "왕의 계곡", ["ptBR"] = "Vale dos Reis", ["ruRU"] = "Долина Королей", ["zhCN"] = "国王谷", @@ -5790,8 +5182,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Leuchtende Strand", ["enUS"] = "The Shining Strand", ["esES"] = "La Playa Resplandeciente", - ["frFR"] = "Le Rivage rayonnant", - ["koKR"] = "반짝이는 호숫가", ["ptBR"] = "A Praia Brilhante", ["ruRU"] = "Сияющий берег", ["zhCN"] = "闪光湖岸", @@ -5809,8 +5199,6 @@ MTH_DS_Zones = { ["deDE"] = "Nördliche Gezeitenlichtung", ["enUS"] = "North Tide\'s Hollow", ["esES"] = "El Refugio de la Marea del Norte", - ["frFR"] = "Creux de la côte nord", - ["koKR"] = "북부 해안 골짜기", ["ptBR"] = "Caverna da Maré do Norte", ["ruRU"] = "Северная приливная низина", ["zhCN"] = "北流谷", @@ -5828,8 +5216,6 @@ MTH_DS_Zones = { ["deDE"] = "Grautatzengrat", ["enUS"] = "Grizzlepaw Ridge", ["esES"] = "Cima Garra de Osos", - ["frFR"] = "Falaise de Vieillegriffe", - ["koKR"] = "곰발바닥 마루", ["ptBR"] = "Crista Garrabruta", ["ruRU"] = "Хребет Седых Лап", ["zhCN"] = "灰爪山", @@ -5847,8 +5233,6 @@ MTH_DS_Zones = { ["deDE"] = "Gadgetzan", ["enUS"] = "Gadgetzan", ["esES"] = "Gadgetzan", - ["frFR"] = "Gadgetzan", - ["koKR"] = "가젯잔", ["ptBR"] = "Geringontzan", ["ruRU"] = "Прибамбасск", ["zhCN"] = "加基森", @@ -5866,8 +5250,6 @@ MTH_DS_Zones = { ["deDE"] = "Dampfdruckpier", ["enUS"] = "Steamwheedle Port", ["esES"] = "Puerto Steamwheedle", - ["frFR"] = "Port Gentepression", - ["koKR"] = "스팀휘들 항구", ["ptBR"] = "Porto Steamwheedle", ["ruRU"] = "Порт Картеля", ["zhCN"] = "热砂港", @@ -5885,8 +5267,6 @@ MTH_DS_Zones = { ["deDE"] = "Zul\'Farrak", ["enUS"] = "Zul\'Farrak", ["esES"] = "Zul\'Farrak", - ["frFR"] = "Zul\'Farrak", - ["koKR"] = "줄파락", ["ptBR"] = "Zul\'Farrak", ["ruRU"] = "Зул\'Фаррак", ["zhCN"] = "祖尔法拉克", @@ -5904,8 +5284,6 @@ MTH_DS_Zones = { ["deDE"] = "Sandmarterwache", ["enUS"] = "Sandsorrow Watch", ["esES"] = "Mirador de la Pena Arenosa", - ["frFR"] = "Guet de Tristesable", - ["koKR"] = "슬픈모래 감시탑", ["ptBR"] = "Vigia Sandsorrow", ["ruRU"] = "Застава Скорбных Песков", ["zhCN"] = "流沙岗哨", @@ -5923,8 +5301,6 @@ MTH_DS_Zones = { ["deDE"] = "Disteltal", ["enUS"] = "Thistleshrub Valley", ["esES"] = "Valle Cardoespina", - ["frFR"] = "Vallée des Chardonniers", - ["koKR"] = "덤불나무 골짜기", ["ptBR"] = "O Vale Thistleshrub", ["ruRU"] = "Долина Кактусов", ["zhCN"] = "灌木谷", @@ -5942,8 +5318,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Klaffende Schlucht", ["enUS"] = "The Gaping Chasm", ["esES"] = "El Abismo Boquiabierto", - ["frFR"] = "Le Gouffre béant", - ["koKR"] = "모래지옥 협곡", ["ptBR"] = "O Abismo Gargante", ["ruRU"] = "Зияющая бездна", ["zhCN"] = "大裂口", @@ -5961,8 +5335,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Giftige Unterschlupf", ["enUS"] = "The Noxious Lair", ["esES"] = "El Refugio Nocivo", - ["frFR"] = "Le Repaire nuisible", - ["koKR"] = "맹독의 둥지", ["ptBR"] = "A Caverna Nociva", ["ruRU"] = "Ядовитый улей", ["zhCN"] = "腐化之巢", @@ -5980,8 +5352,6 @@ MTH_DS_Zones = { ["deDE"] = "Truppenlager der Dünenbrecher", ["enUS"] = "Dunemaul Compound", ["esES"] = "Complejo Dunemaul", - ["frFR"] = "Base des Cognedunes", - ["koKR"] = "모래망치 주둔지", ["ptBR"] = "Complexo Lançatroz", ["ruRU"] = "Поселение Песчаного Молота", ["zhCN"] = "砂槌营地", @@ -5999,8 +5369,6 @@ MTH_DS_Zones = { ["deDE"] = "Ostmondruinen", ["enUS"] = "Eastmoon Ruins", ["esES"] = "Ruinas de la Luna Este", - ["frFR"] = "Ruines d\'Estelune", - ["koKR"] = "동쪽 달의 폐허", ["ptBR"] = "Ruínas de Luar do Leste", ["ruRU"] = "Руины Восточной Луны", ["zhCN"] = "东月废墟", @@ -6018,8 +5386,6 @@ MTH_DS_Zones = { ["deDE"] = "Wasserfeld", ["enUS"] = "Waterspring Field", ["esES"] = "Campo Manantial", - ["frFR"] = "Champ des puisatiers", - ["koKR"] = "샘솟는 벌판", ["ptBR"] = "Campo das Fontes", ["ruRU"] = "Родниковое поле", ["zhCN"] = "清泉平原", @@ -6037,8 +5403,6 @@ MTH_DS_Zones = { ["deDE"] = "Zalashjis Bau", ["enUS"] = "Zalashji\'s Den", ["esES"] = "El Refugio de Zalashji", - ["frFR"] = "La tanière de Zalashji", - ["koKR"] = "잘라쉬지의 굴", ["ptBR"] = "Toca de Zalashji", ["ruRU"] = "Логово Залашьи", ["zhCN"] = "萨拉辛之穴", @@ -6056,8 +5420,6 @@ MTH_DS_Zones = { ["deDE"] = "Landendestrand", ["enUS"] = "Land\'s End Beach", ["esES"] = "Playa Fin de la Tierra", - ["frFR"] = "Plage du Bout-du-Monde", - ["koKR"] = "끝자락 해안", ["ptBR"] = "Playa del Fin del Mundo", ["ruRU"] = "Пляж на Краю Света", ["zhCN"] = "天涯海滩", @@ -6075,8 +5437,6 @@ MTH_DS_Zones = { ["deDE"] = "Tal der Behüter", ["enUS"] = "Valley of the Watchers", ["esES"] = "Valle de los Vigilantes", - ["frFR"] = "Vallée des guetteurs", - ["koKR"] = "감시자의 골짜기", ["ptBR"] = "Vale dos Observadores", ["ruRU"] = "Долина Стражей", ["zhCN"] = "守卫之谷", @@ -6094,8 +5454,6 @@ MTH_DS_Zones = { ["deDE"] = "Südmondruinen", ["enUS"] = "Southmoon Ruins", ["esES"] = "Ruinas de la Luna Sur", - ["frFR"] = "Ruines de Sudelune", - ["koKR"] = "서쪽 달의 폐허", ["ptBR"] = "Ruínas Southmoon", ["ruRU"] = "Руины Южной Луны", ["zhCN"] = "南月废墟", @@ -6113,8 +5471,6 @@ MTH_DS_Zones = { ["deDE"] = "Renders Lager", ["enUS"] = "Render\'s Camp", ["esES"] = "Campamento de Render", - ["frFR"] = "Camp des Etripeurs", - ["koKR"] = "약탈의 야영지", ["ptBR"] = "Acampamento Render", ["ruRU"] = "Лагерь Ренда", ["zhCN"] = "撕裂者营地", @@ -6132,8 +5488,6 @@ MTH_DS_Zones = { ["deDE"] = "Renders Tal", ["enUS"] = "Render\'s Valley", ["esES"] = "Valle de Render", - ["frFR"] = "Vallée des Etripeurs", - ["koKR"] = "약탈의 계곡", ["ptBR"] = "Vale de Render", ["ruRU"] = "Долина Ренда", ["zhCN"] = "撕裂者山谷", @@ -6151,8 +5505,6 @@ MTH_DS_Zones = { ["deDE"] = "Galardelltal", ["enUS"] = "Galardell Valley", ["esES"] = "Valle de Galardell", - ["frFR"] = "Vallée de Galardell", - ["koKR"] = "갈라델 골짜기", ["ptBR"] = "Vale Galardell", ["ruRU"] = "Долина Галарделл", ["zhCN"] = "加拉德尔山谷", @@ -6170,8 +5522,6 @@ MTH_DS_Zones = { ["deDE"] = "Uferpfad", ["enUS"] = "Lakeridge Highway", ["esES"] = "Autopista de la Cima del Lago", - ["frFR"] = "Grand-route de la Crête du lac", - ["koKR"] = "호수마루 오솔길", ["ptBR"] = "Carretera Lakeridge", ["ruRU"] = "Озерный тракт", ["zhCN"] = "湖边大道", @@ -6189,8 +5539,6 @@ MTH_DS_Zones = { ["deDE"] = "Drei Ecken", ["enUS"] = "Three Corners", ["esES"] = "Tres Esquinas", - ["frFR"] = "Trois chemins", - ["koKR"] = "붉은마루 삼거리", ["ptBR"] = "Os Três Cantos", ["ruRU"] = "Три Угла", ["zhCN"] = "三角路口", @@ -6208,8 +5556,6 @@ MTH_DS_Zones = { ["deDE"] = "Hügel der Düsterschmiede", ["enUS"] = "Direforge Hill", ["esES"] = "Colina de la Forja Oscura", - ["frFR"] = "Colline de Morneforge", - ["koKR"] = "불길한 언덕", ["ptBR"] = "Monte Umbraforja", ["ruRU"] = "Зловещий холм", ["zhCN"] = "恶铁岭", @@ -6227,8 +5573,6 @@ MTH_DS_Zones = { ["deDE"] = "Raptorgrat", ["enUS"] = "Raptor Ridge", ["esES"] = "Cima de los Raptadores", - ["frFR"] = "Crête des raptors", - ["koKR"] = "랩터 마루", ["ptBR"] = "Pico do Raptor", ["ruRU"] = "Гряда Ящеров", ["zhCN"] = "恐龙岭", @@ -6246,8 +5590,6 @@ MTH_DS_Zones = { ["deDE"] = "Schwarzkanalmarschen", ["enUS"] = "Black Channel Marsh", ["esES"] = "Marisma del Canal Negro", - ["frFR"] = "Marais des eaux-noires", - ["koKR"] = "검은바닥 습지대", ["ptBR"] = "Pântano do Canal Negro", ["ruRU"] = "Черная трясина", ["zhCN"] = "黑水沼泽", @@ -6265,8 +5607,6 @@ MTH_DS_Zones = { ["deDE"] = "Moosfellmoor", ["enUS"] = "Mosshide Fen", ["esES"] = "Ciénaga Pielmusgo", - ["frFR"] = "Marais des Poils-moussus", - ["koKR"] = "이끼가죽 수렁", ["ptBR"] = "Pântano Pele de Musgo", ["ruRU"] = "Болото Мохошкуров", ["zhCN"] = "藓皮沼泽", @@ -6284,8 +5624,6 @@ MTH_DS_Zones = { ["deDE"] = "Thelgenfelsen", ["enUS"] = "Thelgen Rock", ["esES"] = "Roca Thelgen", - ["frFR"] = "Rocher de Thelgen", - ["koKR"] = "텔겐 바위굴", ["ptBR"] = "A Rocha Thelgen", ["ruRU"] = "Пещера Тельгена", ["zhCN"] = "瑟根石", @@ -6303,8 +5641,6 @@ MTH_DS_Zones = { ["deDE"] = "Blaukiemenmarschen", ["enUS"] = "Bluegill Marsh", ["esES"] = "Marisma Branquiazules", - ["frFR"] = "Marais des Branchies-bleues", - ["koKR"] = "푸른아가미 습지대", ["ptBR"] = "Pântano dos Guelrazul", ["ruRU"] = "Болота Синежабрых", ["zhCN"] = "蓝腮沼泽", @@ -6322,8 +5658,6 @@ MTH_DS_Zones = { ["deDE"] = "Salzgischtschlucht", ["enUS"] = "Saltspray Glen", ["esES"] = "Valle Rocío Salado", - ["frFR"] = "Vallon des embruns", - ["koKR"] = "소금물 습지대", ["ptBR"] = "Bosque Saltspray", ["ruRU"] = "Долина Солевого Тумана", ["zhCN"] = "盐沫沼泽", @@ -6341,8 +5675,6 @@ MTH_DS_Zones = { ["deDE"] = "Sonnenwendmarschen", ["enUS"] = "Sundown Marsh", ["esES"] = "Marisma del Ocaso", - ["frFR"] = "Marais du couchant", - ["koKR"] = "해몰이 늪", ["ptBR"] = "Pantano Sundown", ["ruRU"] = "Закатное болото", ["zhCN"] = "日落沼泽", @@ -6360,8 +5692,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Grüne Gürtel", ["enUS"] = "The Green Belt", ["esES"] = "El Cinturón Verde", - ["frFR"] = "La Ceinture verte", - ["koKR"] = "녹지대", ["ptBR"] = "O Cinturão Verde", ["ruRU"] = "Зеленый Пояс", ["zhCN"] = "绿带草地", @@ -6379,8 +5709,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Grollhauer", ["enUS"] = "Angerfang Encampment", ["esES"] = "Campamento Colmillo Furioso", - ["frFR"] = "Campement de Hargnecroc", - ["koKR"] = "성난송곳니 야영지", ["ptBR"] = "Acampamento Presa-de-Fúria", ["ruRU"] = "Лагерь Злого Клыка", ["zhCN"] = "怒牙营地", @@ -6398,8 +5726,6 @@ MTH_DS_Zones = { ["deDE"] = "Tore des Drachenmals", ["enUS"] = "Dragonmaw Gates", ["esES"] = "Puertas de Garganta de Dragón", - ["frFR"] = "Portes des Dragonmaw", - ["koKR"] = "용아귀부족 관문", ["ptBR"] = "Portões Presa do Dragão", ["ruRU"] = "Врата Драконьей Пасти", ["zhCN"] = "龙喉大门", @@ -6417,8 +5743,6 @@ MTH_DS_Zones = { ["deDE"] = "Darrohügel", ["enUS"] = "Darrow Hill", ["esES"] = "Colina Darrow", - ["frFR"] = "Colline de Darrow", - ["koKR"] = "다로우 언덕", ["ptBR"] = "Colina de Darrow", ["ruRU"] = "Холм Дарроу", ["zhCN"] = "达隆山", @@ -6436,8 +5760,6 @@ MTH_DS_Zones = { ["deDE"] = "Weberpass", ["enUS"] = "Webwinder Path", ["esES"] = "Sendero Tejeweb", - ["frFR"] = "Sentier des Tisseuses", - ["koKR"] = "그물누비 고개", ["ptBR"] = "Caminho Webwinder", ["ruRU"] = "Паучий тракт", ["zhCN"] = "蛛网小径", @@ -6455,8 +5777,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Stille Ufer", ["enUS"] = "The Hushed Bank", ["esES"] = "El Banco Silente", - ["frFR"] = "La Rive silencieuse", - ["koKR"] = "고요의 강둑", ["ptBR"] = "A Margem Silenciosa", ["ruRU"] = "Затихший берег", ["zhCN"] = "寂静河岸", @@ -6474,8 +5794,6 @@ MTH_DS_Zones = { ["deDE"] = "Anwesen der Dunstmantels", ["enUS"] = "Manor Mistmantle", ["esES"] = "Mansión Mantovaho", - ["frFR"] = "Manoir Mistmantle", - ["koKR"] = "미스트맨틀 장원", ["ptBR"] = "Mansión Mistmantle", ["ruRU"] = "Поместье Мистмантла", ["zhCN"] = "密斯特曼托庄园", @@ -6493,8 +5811,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Mojache", ["enUS"] = "Camp Mojache", ["esES"] = "Campamento Mojache", - ["frFR"] = "Camp Mojache", - ["koKR"] = "모자케 야영지", ["ptBR"] = "Acampamento Mojache", ["ruRU"] = "Лагерь Мохаче", ["zhCN"] = "莫沙彻营地", @@ -6512,8 +5828,6 @@ MTH_DS_Zones = { ["deDE"] = "Truppenlager der Grimmtotem", ["enUS"] = "Grimtotem Compound", ["esES"] = "Compuesto Grimtotem", - ["frFR"] = "Base des Totem sinistre", - ["koKR"] = "그림토템 주둔지", ["ptBR"] = "Complexo Totem Vil", ["ruRU"] = "Лагерь Зловещего Тотема", ["zhCN"] = "恐怖图腾营地", @@ -6531,8 +5845,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Verwundene Tiefe", ["enUS"] = "The Writhing Deep", ["esES"] = "Las Profundidades Retorcidas", - ["frFR"] = "Gouffre grouillant", - ["koKR"] = "고통의 구덩이", ["ptBR"] = "O Profundo Retorcido", ["ruRU"] = "Гудящая Бездна", ["zhCN"] = "痛苦深渊", @@ -6550,8 +5862,6 @@ MTH_DS_Zones = { ["deDE"] = "Außenposten der Gordunni", ["enUS"] = "Gordunni Outpost", ["esES"] = "Avanzada Gordunni", - ["frFR"] = "Avant-poste des Gordunni", - ["koKR"] = "골두니 전초기지", ["ptBR"] = "Posto Gordunni", ["ruRU"] = "Поселение Гордунни", ["zhCN"] = "戈杜尼前哨站", @@ -6569,8 +5879,6 @@ MTH_DS_Zones = { ["deDE"] = "Wildschrammtal", ["enUS"] = "Feral Scar Vale", ["esES"] = "Valle Cicatriz Salvaje", - ["frFR"] = "Val des Griffes farouches", - ["koKR"] = "거친흉터 골짜기", ["ptBR"] = "Vale Cicatriz Feral", ["ruRU"] = "Долина Свирепого Утеса", ["zhCN"] = "深痕谷", @@ -6588,8 +5896,6 @@ MTH_DS_Zones = { ["deDE"] = "Fransenfederhochland", ["enUS"] = "Frayfeather Highlands", ["esES"] = "Tierras Altas Plumas de Pelea", - ["frFR"] = "Hautes-terres des Aigreplumes", - ["koKR"] = "공작날개 고원", ["ptBR"] = "Terras Altas Penaprateada", ["ruRU"] = "Высокогорье Блеклых Перьев", ["zhCN"] = "乱羽高地", @@ -6607,8 +5913,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Vergessene Küste", ["enUS"] = "The Forgotten Coast", ["esES"] = "La Costa Olvidada", - ["frFR"] = "La Côte oubliée", - ["koKR"] = "잊혀진 해안", ["ptBR"] = "A Costa Esquecida", ["ruRU"] = "Забытый берег", ["zhCN"] = "被遗忘的海岸", @@ -6626,8 +5930,6 @@ MTH_DS_Zones = { ["deDE"] = "Traumgeäst", ["enUS"] = "Dream Bough", ["esES"] = "Rama del Sueño", - ["frFR"] = "Bosquet du rêve", - ["koKR"] = "꿈나무", ["ptBR"] = "Ramo dos Sonhos", ["ruRU"] = "Сонные Ветви", ["zhCN"] = "梦境之树", @@ -6645,8 +5947,6 @@ MTH_DS_Zones = { ["deDE"] = "Oneiros", ["enUS"] = "Oneiros", ["esES"] = "Oneiros", - ["frFR"] = "Oneiros", - ["koKR"] = "오네이로스", ["ptBR"] = "Oneiros", ["ruRU"] = "Онейрос", ["zhCN"] = "奥奈罗斯", @@ -6664,8 +5964,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Rabenwind", ["enUS"] = "Ruins of Ravenwind", ["esES"] = "Ruinas de Viento de Cuervo", - ["frFR"] = "Ruines de Vent-du-Corbeau", - ["koKR"] = "까마귀바람 폐허", ["ptBR"] = "Ruínas de Ravenwind", ["ruRU"] = "Руины Яростного Ветра", ["zhCN"] = "鸦风废墟", @@ -6683,8 +5981,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Zwillingskolosse", ["enUS"] = "The Twin Colossals", ["esES"] = "Los Colosos Gemelos", - ["frFR"] = "Les Colosses jumeaux", - ["koKR"] = "쌍둥이 바위산", ["ptBR"] = "Os Colossos Gêmeos", ["ruRU"] = "Два Колосса", ["zhCN"] = "双塔山", @@ -6702,8 +5998,6 @@ MTH_DS_Zones = { ["deDE"] = "Insel Sardor", ["enUS"] = "Sardor Isle", ["esES"] = "Isla Sardor", - ["frFR"] = "Ile de Sardor", - ["koKR"] = "살도르 섬", ["ptBR"] = "Ilha Sardor", ["ruRU"] = "Остров Сардор", ["zhCN"] = "萨尔多岛", @@ -6721,8 +6015,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Insel des Schreckens", ["enUS"] = "Isle of Dread", ["esES"] = "Isla del Terror", - ["frFR"] = "lle de l\'effroi", - ["koKR"] = "공포의 터", ["ptBR"] = "Isla del Terror", ["ruRU"] = "Остров Ужаса", ["zhCN"] = "恐怖之岛", @@ -6740,8 +6032,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Untere Wildnis", ["enUS"] = "Lower Wilds", ["esES"] = "Tierras Salvajes Inferiores", - ["frFR"] = "Etendues sauvages", - ["koKR"] = "낮은벌", ["ptBR"] = "Territorios Inferiores", ["ruRU"] = "Низинные чащобы", ["zhCN"] = "低地荒野", @@ -6759,8 +6049,6 @@ MTH_DS_Zones = { ["deDE"] = "Holzschlundfeste", ["enUS"] = "Timbermaw Hold", ["esES"] = "Bastión de los Timbermaw", - ["frFR"] = "Repaire des Grumegueules", - ["koKR"] = "나무구렁 요새", ["ptBR"] = "O Refugio Timbermaw", ["ruRU"] = "Крепость Древобрюхов", ["zhCN"] = "木喉要塞", @@ -6778,8 +6066,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Legashi", ["enUS"] = "Legash Encampment", ["esES"] = "Campamento Legash", - ["frFR"] = "Campement Legashi", - ["koKR"] = "레가쉬 야영지", ["ptBR"] = "Acampamento Legash", ["ruRU"] = "Лагерь Легаш", ["zhCN"] = "雷加什营地", @@ -6797,8 +6083,6 @@ MTH_DS_Zones = { ["deDE"] = "Thalassischer Stützpunkt", ["enUS"] = "Thalassian Base Camp", ["esES"] = "Campamento Base Thalassiano", - ["frFR"] = "Camp de base thalassien", - ["koKR"] = "탈라시안 주둔지", ["ptBR"] = "Acampamento Base Thalassian", ["ruRU"] = "Талассийское поселение", ["zhCN"] = "萨拉斯营地", @@ -6816,8 +6100,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ruinen von Eldarath", ["enUS"] = "Ruins of Eldarath ", ["esES"] = "Ruinas de Eldarath", - ["frFR"] = "Ruines d\'Eldarath", - ["koKR"] = "엘다라스 폐허", ["ptBR"] = "Ruínas de Eldarath", ["ruRU"] = "Руины Эльдарата", ["zhCN"] = "埃达拉斯废墟", @@ -6835,8 +6117,6 @@ MTH_DS_Zones = { ["deDE"] = "Ursolan", ["enUS"] = "Ursolan", ["esES"] = "Ursolan", - ["frFR"] = "Ursolan", - ["koKR"] = "우르솔란", ["ptBR"] = "Ursolan", ["ruRU"] = "Урсолан", ["zhCN"] = "乌索兰", @@ -6854,8 +6134,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Tempel von Arkkoran", ["enUS"] = "Temple of Arkkoran", ["esES"] = "Templo de Arkkoran", - ["frFR"] = "Temple d\'Arkkoran", - ["koKR"] = "아크코란의 신전", ["ptBR"] = "Templo de Arkkoran", ["ruRU"] = "Храм Арккоран", ["zhCN"] = "亚考兰神殿", @@ -6873,8 +6151,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Bucht der Stürme", ["enUS"] = "Bay of Storms", ["esES"] = "Bahía de las Tormentas", - ["frFR"] = "Baie des tempêtes", - ["koKR"] = "폭풍의 만", ["ptBR"] = "Baía das Tempestades", ["ruRU"] = "Залив Бурь", ["zhCN"] = "风暴海湾", @@ -6892,8 +6168,6 @@ MTH_DS_Zones = { ["deDE"] = "Strand der Trümmer", ["enUS"] = "The Shattered Strand", ["esES"] = "La Franja Rota", - ["frFR"] = "La Grève fracassée", - ["koKR"] = "조각난 해안", ["ptBR"] = "A Praia Fragmentada", ["ruRU"] = "Разоренное побережье", ["zhCN"] = "破碎海岸", @@ -6911,8 +6185,6 @@ MTH_DS_Zones = { ["deDE"] = "Turm von Eldara", ["enUS"] = "Tower of Eldara", ["esES"] = "Torre de Eldara", - ["frFR"] = "Tour d\'Eldara", - ["koKR"] = "엘다라의 탑", ["ptBR"] = "A Torre de Eldara", ["ruRU"] = "Башня Эльдары", ["zhCN"] = "埃达拉之塔", @@ -6930,8 +6202,6 @@ MTH_DS_Zones = { ["deDE"] = "Gezacktes Riff", ["enUS"] = "Jagged Reef", ["esES"] = "Arrecife Afilado", - ["frFR"] = "Récif déchiqueté", - ["koKR"] = "톱니 산호초", ["ptBR"] = "Arrecife Serrado", ["ruRU"] = "Острые рифы", ["zhCN"] = "锯齿暗礁", @@ -6949,8 +6219,6 @@ MTH_DS_Zones = { ["deDE"] = "Südklippenufer", ["enUS"] = "Southridge Beach", ["esES"] = "Playa de la Cima Sur", - ["frFR"] = "Plage des Crêtes du sud", - ["koKR"] = "남녘마루 해안", ["ptBR"] = "Praia Southridge", ["ruRU"] = "Южный пляж", ["zhCN"] = "南山海滩", @@ -6968,8 +6236,6 @@ MTH_DS_Zones = { ["deDE"] = "Rabenkrones Monument", ["enUS"] = "Ravencrest Monument", ["esES"] = "Monumento Cuervo del Crestón", - ["frFR"] = "Colosse de Ravencrest", - ["koKR"] = "레이븐크레스트 기념비", ["ptBR"] = "Monumento Ravencrest", ["ruRU"] = "Памятник Гребню Ворона", ["zhCN"] = "拉文凯斯雕像", @@ -6987,8 +6253,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Einsame Grat", ["enUS"] = "Forlorn Ridge", ["esES"] = "Cima Desolada", - ["frFR"] = "La crête lugubre", - ["koKR"] = "쓸쓸한 마루", ["ptBR"] = "Crista dos Esquecidos", ["ruRU"] = "Одинокая вершина", ["zhCN"] = "凄凉山", @@ -7006,8 +6270,6 @@ MTH_DS_Zones = { ["deDE"] = "Mennarsee", ["enUS"] = "Lake Mennar", ["esES"] = "Lago Mennar", - ["frFR"] = "Lac Mennar", - ["koKR"] = "멘나르 호수", ["ptBR"] = "Lago Mennar", ["ruRU"] = "Озеро Меннар", ["zhCN"] = "门纳尔湖", @@ -7025,8 +6287,6 @@ MTH_DS_Zones = { ["deDE"] = "Schattensangschrein", ["enUS"] = "Shadowsong Shrine", ["esES"] = "Santuario Canción de las Sombras", - ["frFR"] = "Sanctuaire de Shadowsong", - ["koKR"] = "섀도송 제단", ["ptBR"] = "Santuário Shadowsong", ["ruRU"] = "Святилище Песни Теней", ["zhCN"] = "影歌神殿", @@ -7044,8 +6304,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Haldarr", ["enUS"] = "Haldarr Encampment", ["esES"] = "Campamento Haldarr", - ["frFR"] = "Campement des Haldarr", - ["koKR"] = "할다르 야영지", ["ptBR"] = "Acampamento Haldarr", ["ruRU"] = "Лагерь Халдарр", ["zhCN"] = "哈达尔营地", @@ -7063,8 +6321,6 @@ MTH_DS_Zones = { ["deDE"] = "Valormok", ["enUS"] = "Valormok", ["esES"] = "Valormok", - ["frFR"] = "Valormok", - ["koKR"] = "발로르모크", ["ptBR"] = "Valormok", ["ruRU"] = "Храбростан", ["zhCN"] = "瓦罗莫克", @@ -7082,8 +6338,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Verfallenen Gegenden", ["enUS"] = "The Ruined Reaches", ["esES"] = "Las Ensenadas Arruinadas", - ["frFR"] = "Les Confins dévastés", - ["koKR"] = "버려진 착륙장", ["ptBR"] = "Os Alcances Arruinados", ["ruRU"] = "Опустошенный берег", ["zhCN"] = "废墟海岸", @@ -7101,8 +6355,6 @@ MTH_DS_Zones = { ["deDE"] = "Hügel der Klingenhauer", ["enUS"] = "Razorfen Downs", ["esES"] = "Zahúrda Rajacieno", - ["frFR"] = "Souilles de Tranchebauge", - ["koKR"] = "가시덩굴 구릉", ["ptBR"] = "Urzal dos Mortos", ["ruRU"] = "Курганы Иглошкурых", ["zhCN"] = "剃刀高地", @@ -7120,8 +6372,6 @@ MTH_DS_Zones = { ["deDE"] = "Mast- und Schotbucht", ["enUS"] = "Lost Rigger Cove", ["esES"] = "Cueva del Rigger Perdido", - ["frFR"] = "Crique des Gréements", - ["koKR"] = "해적단 소굴", ["ptBR"] = "Cova Lost Rigger", ["ruRU"] = "Бухта Сорванных Парусов", ["zhCN"] = "落帆海湾", @@ -7139,8 +6389,6 @@ MTH_DS_Zones = { ["deDE"] = "Galgeneck", ["enUS"] = "Gallows\' Corner", ["esES"] = "Esquina de la Horca", - ["frFR"] = "Fourche du gibet", - ["koKR"] = "갤로우 삼거리", ["ptBR"] = "Esquina da Forca", ["ruRU"] = "Перекресток Висельников", ["zhCN"] = "绞刑场", @@ -7158,8 +6406,6 @@ MTH_DS_Zones = { ["deDE"] = "Feste Schreckensfels", ["enUS"] = "Dreadmaul Hold", ["esES"] = "Bastión Martillo Tenebroso", - ["frFR"] = "Bastion Cognepeur", - ["koKR"] = "우레망치 요새", ["ptBR"] = "Fortaleza Muralha do Medo", ["ruRU"] = "Форт Молота Ужаса", ["zhCN"] = "巨槌要塞", @@ -7177,8 +6423,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Nethergarde", ["enUS"] = "Nethergarde Keep", ["esES"] = "Fortaleza Nethergarde", - ["frFR"] = "Rempart-du-Néant", - ["koKR"] = "네더가드 요새", ["ptBR"] = "Fortaleza de Nethergarde", ["ruRU"] = "Крепость Стражей Пустоты", ["zhCN"] = "守望堡", @@ -7196,8 +6440,6 @@ MTH_DS_Zones = { ["deDE"] = "Schreckensfelsposten", ["enUS"] = "Dreadmaul Post", ["esES"] = "Puesto Martillo Tenebroso", - ["frFR"] = "Poste Cognepeur", - ["koKR"] = "우레망치 주둔지", ["ptBR"] = "Posto Muralha do Medo", ["ruRU"] = "Стоянка Молота Ужаса", ["zhCN"] = "巨槌岗哨", @@ -7215,8 +6457,6 @@ MTH_DS_Zones = { ["deDE"] = "Schlangenschlinge", ["enUS"] = "Serpent\'s Coil", ["esES"] = "Enredo de Serpiente", - ["frFR"] = "Anneaux du serpent", - ["koKR"] = "뱀의 보금자리", ["ptBR"] = "Caracol do Serpente", ["ruRU"] = "Змеиные Кольца", ["zhCN"] = "盘蛇谷", @@ -7234,8 +6474,6 @@ MTH_DS_Zones = { ["deDE"] = "Altar der Stürme", ["enUS"] = "Altar of Storms", ["esES"] = "Altar de Tormentas", - ["frFR"] = "Autel des tempêtes", - ["koKR"] = "폭풍의 제단", ["ptBR"] = "Altar das Tempestades", ["ruRU"] = "Алтарь Бурь", ["zhCN"] = "风暴祭坛", @@ -7253,8 +6491,6 @@ MTH_DS_Zones = { ["deDE"] = "Feuerwachtgrat", ["enUS"] = "Firewatch Ridge", ["esES"] = "Cima Vigía de Fuego", - ["frFR"] = "Crête de Guet-du-feu", - ["koKR"] = "불망루 마루", ["ptBR"] = "Crista Vigia do Fogo", ["ruRU"] = "Гряда Огненной стражи", ["zhCN"] = "观火岭", @@ -7272,8 +6508,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Meer der Asche", ["enUS"] = "The Sea of Cinders", ["esES"] = "El Mar de Cenizas", - ["frFR"] = "La Mer de braises", - ["koKR"] = "잿더미 바다", ["ptBR"] = "O Mar de Cinzas", ["ruRU"] = "Пепельное Море", ["zhCN"] = "灰烬之海", @@ -7291,8 +6525,6 @@ MTH_DS_Zones = { ["deDE"] = "Garnisonswaffenkammer", ["enUS"] = "Garrison Armory", ["esES"] = "Armería de la Guarnición", - ["frFR"] = "Armurerie de la garnison", - ["koKR"] = "요새 무기고", ["ptBR"] = "Arsenal da Guarnição", ["ruRU"] = "Мастерские Гарнизона", ["zhCN"] = "要塞军械库", @@ -7310,8 +6542,6 @@ MTH_DS_Zones = { ["deDE"] = "Unterstadt", ["enUS"] = "Undercity", ["esES"] = "Entrañas", - ["frFR"] = "Undercity", - ["koKR"] = "Undercity", ["ptBR"] = "Cidade Subterrânea", ["ruRU"] = "Подгород", ["zhCN"] = "幽暗城", @@ -7329,8 +6559,6 @@ MTH_DS_Zones = { ["deDE"] = "Sturmwind", ["enUS"] = "Stormwind City", ["esES"] = "Ciudad de Ventormenta", - ["frFR"] = "Cité de Stormwind", - ["koKR"] = "Stormwind City", ["ptBR"] = "Cidade Stormwind", ["ruRU"] = "Штормград", ["zhCN"] = "暴风城", @@ -7348,8 +6576,6 @@ MTH_DS_Zones = { ["deDE"] = "Orgrimmar", ["enUS"] = "Orgrimmar", ["esES"] = "Orgrimmar", - ["frFR"] = "Orgrimmar", - ["koKR"] = "Orgrimmar", ["ptBR"] = "Orgrimmar", ["ruRU"] = "Оргриммар", ["zhCN"] = "奥格瑞玛", @@ -7367,8 +6593,6 @@ MTH_DS_Zones = { ["deDE"] = "Donnerfels", ["enUS"] = "Thunder Bluff", ["esES"] = "Cima del Trueno", - ["frFR"] = "Thunder Bluff", - ["koKR"] = "Thunder Bluff", ["ptBR"] = "Thunder Bluff", ["ruRU"] = "Громовой Утес", ["zhCN"] = "雷霆崖", @@ -7386,8 +6610,6 @@ MTH_DS_Zones = { ["deDE"] = "Darnassus", ["enUS"] = "Darnassus", ["esES"] = "Darnassus", - ["frFR"] = "Darnassus", - ["koKR"] = "Darnassus", ["ptBR"] = "Darnassus", ["ruRU"] = "Дарнас", ["zhCN"] = "达纳苏斯", @@ -7405,8 +6627,6 @@ MTH_DS_Zones = { ["deDE"] = "Gavins Landspitze", ["enUS"] = "Gavin\'s Naze", ["esES"] = "Promontorio de Gavin", - ["frFR"] = "Promontoire de Gavin", - ["koKR"] = "가빈 절벽", ["ptBR"] = "Nazé de Gavin", ["ruRU"] = "Возвышенность Гэвина", ["zhCN"] = "加文高地", @@ -7424,8 +6644,6 @@ MTH_DS_Zones = { ["deDE"] = "Soferas Landspitze", ["enUS"] = "Sofera\'s Naze", ["esES"] = "Promontorio de Sofera", - ["frFR"] = "Promontoire de Sofera", - ["koKR"] = "소페라 절벽", ["ptBR"] = "Naze de Sofera", ["ruRU"] = "Возвышенность Соферы", ["zhCN"] = "索菲亚高地", @@ -7443,8 +6661,6 @@ MTH_DS_Zones = { ["deDE"] = "Corrahns Dolch", ["enUS"] = "Corrahn\'s Dagger", ["esES"] = "Daga de Corrahn", - ["frFR"] = "Dague de Corrahn", - ["koKR"] = "코란의 비수", ["ptBR"] = "Adaga de Corrahn", ["ruRU"] = "Уступ Коррана", ["zhCN"] = "考兰之匕", @@ -7462,8 +6678,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Landzunge", ["enUS"] = "The Headland", ["esES"] = "El Promontorio", - ["frFR"] = "L\'Avancée", - ["koKR"] = "마루터기", ["ptBR"] = "A Cabeceira", ["ruRU"] = "Высокий отрог", ["zhCN"] = "山头营地", @@ -7481,8 +6695,6 @@ MTH_DS_Zones = { ["deDE"] = "Nebelufer", ["enUS"] = "Misty Shore", ["esES"] = "Costa Brumosa", - ["frFR"] = "Rivage brumeux", - ["koKR"] = "물안개 호숫가", ["ptBR"] = "Costa Nebulosa", ["ruRU"] = "Мглистый берег", ["zhCN"] = "雾气湖岸", @@ -7500,8 +6712,6 @@ MTH_DS_Zones = { ["deDE"] = "Dandreds Senke", ["enUS"] = "Dandred\'s Fold", ["esES"] = "Pliegue de Dandred", - ["frFR"] = "Clos de Dandred", - ["koKR"] = "단드레드 장원", ["ptBR"] = "Vinhedo de Dandred", ["ruRU"] = "Овчарня Дандреда", ["zhCN"] = "达伦德农场", @@ -7519,8 +6729,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisfellhöhle", ["enUS"] = "Growless Cave", ["esES"] = "Cueva de Crestaferia", - ["frFR"] = "Caverne stérile", - ["koKR"] = "침묵의 동굴", ["ptBR"] = "Caverna Sem Crescimento", ["ruRU"] = "Промерзшая пещера", ["zhCN"] = "无草洞", @@ -7538,8 +6746,6 @@ MTH_DS_Zones = { ["deDE"] = "Zugwindspitze", ["enUS"] = "Chillwind Point", ["esES"] = "Punta Viento Gélido", - ["frFR"] = "Pointe du Noroît", - ["koKR"] = "서리바람 거점", ["ptBR"] = "Ponto Ventogelado", ["ruRU"] = "Берег Промозглого Ветра", ["zhCN"] = "冰风岗", @@ -7557,8 +6763,6 @@ MTH_DS_Zones = { ["deDE"] = "Raptorgründe", ["enUS"] = "Raptor Grounds", ["esES"] = "Terreno de los Raptadores", - ["frFR"] = "Terres des Raptors", - ["koKR"] = "랩터 서식지", ["ptBR"] = "Terrenos de Raptor", ["ruRU"] = "Земли Ящеров", ["zhCN"] = "迅猛龙巢穴", @@ -7576,8 +6780,6 @@ MTH_DS_Zones = { ["deDE"] = "Dornennarbe", ["enUS"] = "Bramblescar", ["esES"] = "Rasguño de Zarza", - ["frFR"] = "Ronceplaie", - ["koKR"] = "가시덩굴 벌판", ["ptBR"] = "Cicatriz dos Espinhos", ["ruRU"] = "Ежевичный овраг", ["zhCN"] = "迅猛龙平原", @@ -7595,8 +6797,6 @@ MTH_DS_Zones = { ["deDE"] = "Dornenhügel", ["enUS"] = "Thorn Hill", ["esES"] = "Colina Espinosa", - ["frFR"] = "Colline des épines", - ["koKR"] = "가시덩굴 언덕", ["ptBR"] = "A Colina das Espinhas", ["ruRU"] = "Тернистый холм", ["zhCN"] = "荆棘岭", @@ -7614,8 +6814,6 @@ MTH_DS_Zones = { ["deDE"] = "Agama\'gor", ["enUS"] = "Agama\'gor", ["esES"] = "Agama\'gor", - ["frFR"] = "Agama\'gor", - ["koKR"] = "아가마고르", ["ptBR"] = "Agama\'gor", ["ruRU"] = "Агама\'гор", ["zhCN"] = "阿迦玛戈", @@ -7633,8 +6831,6 @@ MTH_DS_Zones = { ["deDE"] = "Schwarzdorngrat", ["enUS"] = "Blackthorn Ridge", ["esES"] = "Cima Espina Negra", - ["frFR"] = "Crête de Noirépine", - ["koKR"] = "검은가시 마루", ["ptBR"] = "Cordilheira Espinho Negro", ["ruRU"] = "Хребет Черных Шипов", ["zhCN"] = "黑棘山", @@ -7652,8 +6848,6 @@ MTH_DS_Zones = { ["deDE"] = "Ehrenmal", ["enUS"] = "Honor\'s Stand", ["esES"] = "Bastión del Honor", - ["frFR"] = "Le lieu de l\'Honneur", - ["koKR"] = "명예의 감시탑", ["ptBR"] = "Posto do Valor", ["ruRU"] = "Застава Чести", ["zhCN"] = "荣耀岗哨", @@ -7671,8 +6865,6 @@ MTH_DS_Zones = { ["deDE"] = "Schutzwall von Mor\'shan", ["enUS"] = "The Mor\'shan Rampart", ["esES"] = "Murallas de Mor\'shan", - ["frFR"] = "Le Rempart de Mor\'shan", - ["koKR"] = "몰샨의 망루", ["ptBR"] = "A Muralha de Mor\'shan", ["ruRU"] = "Застава Мор\'шан", ["zhCN"] = "摩尔沙农场", @@ -7690,8 +6882,6 @@ MTH_DS_Zones = { ["deDE"] = "Grol\'doms Hof", ["enUS"] = "Grol\'dom Farm", ["esES"] = "Granja Grol\'dom", - ["frFR"] = "Ferme de Grol\'dom", - ["koKR"] = "그롤돔 농장", ["ptBR"] = "Fazenda Grol\'dom", ["ruRU"] = "Ферма Гроль\'дома", ["zhCN"] = "格罗多姆农场", @@ -7709,8 +6899,6 @@ MTH_DS_Zones = { ["deDE"] = "Kral der Klingenhauer", ["enUS"] = "Razorfen Kraul", ["esES"] = "Madriguera de Rajacieno", - ["frFR"] = "Kraal de Tranchebauge", - ["koKR"] = "가시덩굴 우리", ["ptBR"] = "Razorfen Kraul", ["ruRU"] = "Лабиринты Иглошкурых", ["zhCN"] = "剃刀沼泽", @@ -7728,8 +6916,6 @@ MTH_DS_Zones = { ["deDE"] = "Nebeltal", ["enUS"] = "Mistvale Valley", ["esES"] = "Valle de la Bruma", - ["frFR"] = "Valbrume", - ["koKR"] = "안개계곡 골짜기", ["ptBR"] = "Valle Mistvale", ["ruRU"] = "Мглистая долина", ["zhCN"] = "薄雾谷", @@ -7747,8 +6933,6 @@ MTH_DS_Zones = { ["deDE"] = "Nek\'maniquellbrunnen", ["enUS"] = "Nek\'mani Wellspring", ["esES"] = "Manantial Nek\'mani", - ["frFR"] = "Fontaine des Nek\'mani", - ["koKR"] = "네크마니 수원지", ["ptBR"] = "Fonte de Nek\'mani", ["ruRU"] = "Родник Нек\'Мани", ["zhCN"] = "纳克迈尼圣泉", @@ -7766,8 +6950,6 @@ MTH_DS_Zones = { ["deDE"] = "Truppenlager der Blutsegelbukaniere", ["enUS"] = "Bloodsail Compound", ["esES"] = "Complejo Velasangre", - ["frFR"] = "Base de la Voile sanglante", - ["koKR"] = "붉은해적단 주둔지", ["ptBR"] = "Complexo Velasangre", ["ruRU"] = "Лагерь Кровавого Паруса", ["zhCN"] = "血帆营地", @@ -7785,8 +6967,6 @@ MTH_DS_Zones = { ["deDE"] = "Stützpunkt der Venture Co.", ["enUS"] = "Venture Co. Base Camp", ["esES"] = "Campamento Base de Venture Co.", - ["frFR"] = "Campement de la KapitalRisk", - ["koKR"] = "투자개발회사 탐사기지", ["ptBR"] = "Acampamento Base da Companhia Venture", ["ruRU"] = "Главный лагерь Торговой Компании", ["zhCN"] = "风险投资公司营地", @@ -7804,8 +6984,6 @@ MTH_DS_Zones = { ["deDE"] = "Arena der Gurubashi", ["enUS"] = "Gurubashi Arena", ["esES"] = "Arena Gurubashi", - ["frFR"] = "Arène des Gurubashi", - ["koKR"] = "구루바시 투기장", ["ptBR"] = "Arena Gurubashi", ["ruRU"] = "Арена Гурубаши", ["zhCN"] = "古拉巴什竞技场", @@ -7823,8 +7001,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Totenwaldfelle", ["enUS"] = "Deadwood Village", ["esES"] = "Aldea Madera Muerta", - ["frFR"] = "Village des Mort-bois", - ["koKR"] = "마른가지 마을", ["ptBR"] = "Aldeia Lenha Morta", ["ruRU"] = "Деревня Мертвого Леса", ["zhCN"] = "死木村", @@ -7842,8 +7018,6 @@ MTH_DS_Zones = { ["deDE"] = "Revier der Teufelspfoten", ["enUS"] = "Felpaw Village", ["esES"] = "Aldea Garra Vil", - ["frFR"] = "Village de Gangrepatte", - ["koKR"] = "악령발 마을", ["ptBR"] = "Aldeia Patavil", ["ruRU"] = "Деревня Сквернолапов", ["zhCN"] = "魔爪村", @@ -7861,8 +7035,6 @@ MTH_DS_Zones = { ["deDE"] = "Jaedenar", ["enUS"] = "Jaedenar", ["esES"] = "Jaedenar", - ["frFR"] = "Jaedenar", - ["koKR"] = "자에데나르", ["ptBR"] = "Jaedenar", ["ruRU"] = "Джеденар", ["zhCN"] = "加德纳尔", @@ -7880,8 +7052,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Blutgiftfälle", ["enUS"] = "Bloodvenom Falls", ["esES"] = "Cascadas Veneno de Sangre", - ["frFR"] = "Chutes de la Vénéneuse", - ["koKR"] = "피멍울 폭포", ["ptBR"] = "Quedas do Sangue Venenoso", ["ruRU"] = "Водопад Отравленной Крови", ["zhCN"] = "血毒瀑布", @@ -7899,8 +7069,6 @@ MTH_DS_Zones = { ["deDE"] = "Narbengrund", ["enUS"] = "Shatter Scar Vale", ["esES"] = "Valle Cicatriz Rota", - ["frFR"] = "Val Grêlé", - ["koKR"] = "불벼락 골짜기", ["ptBR"] = "Vale Shatter Scar", ["ruRU"] = "Долина Рваных Ран", ["zhCN"] = "碎痕谷", @@ -7918,8 +7086,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Eisenwald", ["enUS"] = "Irontree Woods", ["esES"] = "Bosques Árbol de Hierro", - ["frFR"] = "Bois d\'Arbrefer", - ["koKR"] = "강철나무 숲", ["ptBR"] = "Bosques Irontree", ["ruRU"] = "Железнолесье", ["zhCN"] = "铁木森林", @@ -7937,8 +7103,6 @@ MTH_DS_Zones = { ["deDE"] = "Itharius\' Höhle", ["enUS"] = "Itharius\'s Cave", ["esES"] = "Cueva de Itharius", - ["frFR"] = "Caverne d\'Itharius", - ["koKR"] = "이타리우스의 동굴", ["ptBR"] = "Cueva de Itharius", ["ruRU"] = "Пещера Итара", ["zhCN"] = "伊萨里奥斯洞穴", @@ -7956,8 +7120,6 @@ MTH_DS_Zones = { ["deDE"] = "Sorgendunkel", ["enUS"] = "Sorrowmurk", ["esES"] = "Pantojo de la Pena", - ["frFR"] = "Noirchagrin", - ["koKR"] = "슬픔의 그늘", ["ptBR"] = "Sorrowmurk", ["ruRU"] = "Горемрак", ["zhCN"] = "忧伤湿地", @@ -7975,8 +7137,6 @@ MTH_DS_Zones = { ["deDE"] = "Splitterspeerkreuzung", ["enUS"] = "Splinterspear Junction", ["esES"] = "Encrucijada de Lanza Astillada", - ["frFR"] = "Croisement de Lance-brisée", - ["koKR"] = "부러진창 교차로", ["ptBR"] = "Encruzilhada Splinterspear", ["ruRU"] = "Развилка Расщепленного Копья", ["zhCN"] = "断矛路口", @@ -7994,8 +7154,6 @@ MTH_DS_Zones = { ["deDE"] = "Stagalsumpf", ["enUS"] = "Stagalbog", ["esES"] = "Pantano de los Ciervos", - ["frFR"] = "Stagalbog", - ["koKR"] = "진흙늪", ["ptBR"] = "Pântano Stagalbog", ["ruRU"] = "Вязкая топь", ["zhCN"] = "雄鹿沼泽", @@ -8013,8 +7171,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Wabersumpf", ["enUS"] = "The Shifting Mire", ["esES"] = "El Pantano Cambiante", - ["frFR"] = "Le Bourbier changeant", - ["koKR"] = "변화의 늪", ["ptBR"] = "O Pântano Mutante", ["ruRU"] = "Ползучая трясина", ["zhCN"] = "流沙泥潭", @@ -8032,8 +7188,6 @@ MTH_DS_Zones = { ["deDE"] = "Thoradinswall", ["enUS"] = "Thoradin\'s Wall", ["esES"] = "Murallas de Thoradin", - ["frFR"] = "Mur de Thoradin", - ["koKR"] = "소라딘의 성벽", ["ptBR"] = "A Muralha Thoradin", ["ruRU"] = "Стена Торадина", ["zhCN"] = "索拉丁之墙", @@ -8051,8 +7205,6 @@ MTH_DS_Zones = { ["deDE"] = "Fels\'gor", ["enUS"] = "Boulder\'gor", ["esES"] = "Roca\'gor", - ["frFR"] = "Boulder\'gor", - ["koKR"] = "돌주먹 언덕", ["ptBR"] = "Boulder\'gor", ["ruRU"] = "Камен\'гор", ["zhCN"] = "博德戈尔", @@ -8070,8 +7222,6 @@ MTH_DS_Zones = { ["deDE"] = "Fangzahntal", ["enUS"] = "Valley of Fangs", ["esES"] = "Valle de los Colmillos", - ["frFR"] = "Vallée des crocs", - ["koKR"] = "송곳니 골짜기", ["ptBR"] = "Vale das Presas", ["ruRU"] = "Долина Клыков", ["zhCN"] = "巨牙谷", @@ -8089,8 +7239,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Staubbecken", ["enUS"] = "The Dustbowl", ["esES"] = "El Torbellino de Polvo", - ["frFR"] = "Vallée de la poussière", - ["koKR"] = "먼지받이", ["ptBR"] = "O Buraco de Poeira", ["ruRU"] = "Знойные Пески", ["zhCN"] = "漫尘盆地", @@ -8108,8 +7256,6 @@ MTH_DS_Zones = { ["deDE"] = "Illusionenebene", ["enUS"] = "Mirage Flats", ["esES"] = "Llanuras del Espejismo", - ["frFR"] = "Vallée des mirages", - ["koKR"] = "신기루 벌판", ["ptBR"] = "Llanuras Mirage", ["ruRU"] = "Маревые равнины", ["zhCN"] = "雾气平原", @@ -8127,8 +7273,6 @@ MTH_DS_Zones = { ["deDE"] = "Seuchennebelklamm", ["enUS"] = "Plaguemist Ravine", ["esES"] = "Barranco Niebla Pestilente", - ["frFR"] = "Ravin de Pestebrume", - ["koKR"] = "역병안개 협곡", ["ptBR"] = "Ravina da Névoa Pestilenta", ["ruRU"] = "Чумная лощина", ["zhCN"] = "毒雾峡谷", @@ -8146,8 +7290,6 @@ MTH_DS_Zones = { ["deDE"] = "Ehrenwindsee", ["enUS"] = "Valorwind Lake", ["esES"] = "Lago Viento de Valor", - ["frFR"] = "Lac Vent-vaillant", - ["koKR"] = "돌개바람 호수", ["ptBR"] = "Lago Valorwind", ["ruRU"] = "Озеро Доблести", ["zhCN"] = "瓦罗温湖", @@ -8165,8 +7307,6 @@ MTH_DS_Zones = { ["deDE"] = "Agol\'watha", ["enUS"] = "Agol\'watha", ["esES"] = "Agol\'watha", - ["frFR"] = "Agol\'watha", - ["koKR"] = "아골와타", ["ptBR"] = "Agol\'watha", ["ruRU"] = "Агол\'вата", ["zhCN"] = "亚戈瓦萨", @@ -8184,8 +7324,6 @@ MTH_DS_Zones = { ["deDE"] = "Hiri\'watha", ["enUS"] = "Hiri\'watha", ["esES"] = "Hiri\'watha", - ["frFR"] = "Hiri\'watha", - ["koKR"] = "히리와타", ["ptBR"] = "Hiri\'watha", ["ruRU"] = "Хири\'вата", ["zhCN"] = "西利瓦萨", @@ -8203,8 +7341,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Gruselruinen", ["enUS"] = "The Creeping Ruin", ["esES"] = "La Ruina Acechante", - ["frFR"] = "La Ruine aux rampants", - ["koKR"] = "굼벵이 폐허", ["ptBR"] = "A Ruína Crescente", ["ruRU"] = "Ползучие руины", ["zhCN"] = "爬虫废墟", @@ -8222,8 +7358,6 @@ MTH_DS_Zones = { ["deDE"] = "Terrasse des Schöpfers", ["enUS"] = "The Maker\'s Terrace", ["esES"] = "Terraza del Creador", - ["frFR"] = "La Terrasse des faiseurs", - ["koKR"] = "창조주의 정원", ["ptBR"] = "A Terraço do Criador", ["ruRU"] = "Терраса Творца", ["zhCN"] = "造物者遗迹", @@ -8241,8 +7375,6 @@ MTH_DS_Zones = { ["deDE"] = "Staubwindschlucht", ["enUS"] = "Dustwind Gulch", ["esES"] = "Barranco Viento de Polvo", - ["frFR"] = "Goulet de la Bourrasque", - ["koKR"] = "먼지바람 협곡", ["ptBR"] = "Ravina Vento de Poeira", ["ruRU"] = "Лощина Суховея", ["zhCN"] = "尘风峡谷", @@ -8260,8 +7392,6 @@ MTH_DS_Zones = { ["deDE"] = "Shaol\'watha", ["enUS"] = "Shaol\'watha", ["esES"] = "Shaol\'watha", - ["frFR"] = "Shaol\'watha", - ["koKR"] = "샤올와타", ["ptBR"] = "Shaol\'watha", ["ruRU"] = "Шаол\'вата", ["zhCN"] = "沙尔瓦萨", @@ -8279,8 +7409,6 @@ MTH_DS_Zones = { ["deDE"] = "Tagschattenruinen", ["enUS"] = "Noonshade Ruins", ["esES"] = "Ruinas de Sombra del Mediodía", - ["frFR"] = "Ruines d\'Ombre-du-Zénith", - ["koKR"] = "해그늘 폐허", ["ptBR"] = "Ruínas de Meio-dia", ["ruRU"] = "Руины Полуденной Тени", ["zhCN"] = "热影废墟", @@ -8298,8 +7426,6 @@ MTH_DS_Zones = { ["deDE"] = "Zerbrochene Säule", ["enUS"] = "Broken Pillar", ["esES"] = "Pilar Roto", - ["frFR"] = "Pilier brisé", - ["koKR"] = "무너진 기둥", ["ptBR"] = "Pilar Quebrado", ["ruRU"] = "Разбитая Колонна", ["zhCN"] = "破碎石柱", @@ -8317,8 +7443,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Ewigen Sande", ["enUS"] = "Abyssal Sands", ["esES"] = "Arenas Abisales", - ["frFR"] = "Désert Abysséen", - ["koKR"] = "끝없는 사막", ["ptBR"] = "Areias Abissais", ["ruRU"] = "Безбрежные пески", ["zhCN"] = "深沙平原", @@ -8336,8 +7460,6 @@ MTH_DS_Zones = { ["deDE"] = "Südbrandung", ["enUS"] = "Southbreak Shore", ["esES"] = "Costa Rompe Sur", - ["frFR"] = "Rivage de Brisesud", - ["koKR"] = "거친파도 해안", ["ptBR"] = "Costa Southbreak", ["ruRU"] = "Берег за Южной грядой", ["zhCN"] = "南堤海岸", @@ -8355,8 +7477,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Marschen", ["enUS"] = "The Marshlands", ["esES"] = "Las Marismas", - ["frFR"] = "La Fondrière", - ["koKR"] = "늪지대", ["ptBR"] = "As Terras Pantanosas", ["ruRU"] = "Топи", ["zhCN"] = "沼泽地", @@ -8374,8 +7494,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisensteinplateau", ["enUS"] = "Ironstone Plateau", ["esES"] = "Meseta Piedranegra", - ["frFR"] = "Plateau de Rochefer", - ["koKR"] = "강철바위 고원", ["ptBR"] = "Planalto Ironstone", ["ruRU"] = "Плато Железного Камня", ["zhCN"] = "铁石高原", @@ -8393,8 +7511,6 @@ MTH_DS_Zones = { ["deDE"] = "Schwarzbrandhöhle", ["enUS"] = "Blackchar Cave", ["esES"] = "Cueva Carbón Negro", - ["frFR"] = "Caverne de Noircharbon", - ["koKR"] = "검은재 동굴", ["ptBR"] = "Caverna Brasão Negro", ["ruRU"] = "Обугленная пещера", ["zhCN"] = "黑炭谷", @@ -8412,8 +7528,6 @@ MTH_DS_Zones = { ["deDE"] = "Gerbers Lager", ["enUS"] = "Tanner Camp", ["esES"] = "Campamento de Curtidores", - ["frFR"] = "Camp de Tanner", - ["koKR"] = "무두장이 야영지", ["ptBR"] = "Acampamento Tanner", ["ruRU"] = "Палатка Дубильщицы", ["zhCN"] = "制皮匠营地", @@ -8431,8 +7545,6 @@ MTH_DS_Zones = { ["deDE"] = "Staubfeuertal", ["enUS"] = "Dustfire Valley", ["esES"] = "Valle Fuego Polvoriento", - ["frFR"] = "Vallée des Escarbilles", - ["koKR"] = "먼지불 골짜기", ["ptBR"] = "Vale de Poeira Ardente", ["ruRU"] = "Выжженная долина", ["zhCN"] = "尘火谷", @@ -8450,8 +7562,6 @@ MTH_DS_Zones = { ["deDE"] = "Nachtlaublichtung", ["enUS"] = "Talonbranch Glade ", ["esES"] = "Claro Rama Diente", - ["frFR"] = "Clairière de Griffebranche", - ["koKR"] = "갈퀴가지 숲", ["ptBR"] = "Clareira Talonbranch", ["ruRU"] = "Поляна Когтистых Ветвей", ["zhCN"] = "刺枝林地", @@ -8499,8 +7609,6 @@ MTH_DS_Zones = { ["deDE"] = "Insel Alcaz", ["enUS"] = "Alcaz Island", ["esES"] = "Isla Alcaz", - ["frFR"] = "Ile d\'Alcaz", - ["koKR"] = "알카즈 섬", ["ptBR"] = "Ilha de Alcaz", ["ruRU"] = "Остров Алькац", ["zhCN"] = "奥卡兹岛", @@ -8518,8 +7626,6 @@ MTH_DS_Zones = { ["deDE"] = "Düsterwolkengipfel", ["enUS"] = "Darkcloud Pinnacle", ["esES"] = "Cima Nube Oscura", - ["frFR"] = "Cime de Noir-nuage", - ["koKR"] = "먹구름 봉우리", ["ptBR"] = "Pináculo da Nuvem Negra", ["ruRU"] = "Пик Темного Облака", ["zhCN"] = "黑云峰", @@ -8537,8 +7643,6 @@ MTH_DS_Zones = { ["deDE"] = "Schattenklamm", ["enUS"] = "Shadowbreak Ravine", ["esES"] = "Barranco Ruptura de Sombra", - ["frFR"] = "Ravin de Brèche-de-l\'Ombre", - ["koKR"] = "동트는 협곡", ["ptBR"] = "Desfiladeiro Shadowbreak", ["ruRU"] = "Лощина Тьмы", ["zhCN"] = "破影峡谷", @@ -8556,8 +7660,6 @@ MTH_DS_Zones = { ["deDE"] = "Frostsäblerfelsen", ["enUS"] = "Frostsaber Rock", ["esES"] = "Roca Sable de Hielo", - ["frFR"] = "Roc des Sabres-de-Givre", - ["koKR"] = "눈호랑이 바위", ["ptBR"] = "Rochedo Sabre-de-Gelo", ["ruRU"] = "Уступ Ледопардов", ["zhCN"] = "霜刀石", @@ -8575,8 +7677,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Versteckte Hain", ["enUS"] = "The Hidden Grove", ["esES"] = "El Bosque Oculto", - ["frFR"] = "Le Bosquet caché", - ["koKR"] = "숨겨진 숲", ["ptBR"] = "O Bosque Oculto", ["ruRU"] = "Сокрытая роща", ["zhCN"] = "隐秘小林", @@ -8594,8 +7694,6 @@ MTH_DS_Zones = { ["deDE"] = "Holzschlundposten", ["enUS"] = "Timbermaw Post", ["esES"] = "Puesto de los Manos de Madera", - ["frFR"] = "Poste des Grumegueules", - ["koKR"] = "나무구렁 야영지", ["ptBR"] = "O Posto Timbermaw", ["ruRU"] = "Застава Древобрюхов", ["zhCN"] = "木喉岗哨", @@ -8613,8 +7711,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Winterfelle", ["enUS"] = "Winterfall Village", ["esES"] = "Villa Caída Invernal", - ["frFR"] = "Village Tombe-hiver", - ["koKR"] = "눈사태일족 마을", ["ptBR"] = "Aldeia Winterfall", ["ruRU"] = "Деревня Зимней Спячки", ["zhCN"] = "寒水村", @@ -8632,8 +7728,6 @@ MTH_DS_Zones = { ["deDE"] = "Mazthoril", ["enUS"] = "Mazthoril", ["esES"] = "Mazthoril", - ["frFR"] = "Mazthoril", - ["koKR"] = "마즈소릴", ["ptBR"] = "Mazthoril", ["ruRU"] = "Мазторил", ["zhCN"] = "麦索瑞尔", @@ -8651,8 +7745,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Frostfeuerquellen", ["enUS"] = "Frostfire Hot Springs", ["esES"] = "Aguas Termales Fuegohelado", - ["frFR"] = "Sources de Givrefeu", - ["koKR"] = "얼음불꽃 온천", ["ptBR"] = "Fontes Termais Fogofrio", ["ruRU"] = "Источники Ледяного огня", ["zhCN"] = "冰火温泉", @@ -8670,8 +7762,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisdistelberge", ["enUS"] = "Ice Thistle Hills", ["esES"] = "Colinas Cardo de Hielo", - ["frFR"] = "Collines des Chardons de glace", - ["koKR"] = "얼음엉겅퀴 언덕", ["ptBR"] = "Colinas Cardo de Gelo", ["ruRU"] = "Холмы Ледополоха", ["zhCN"] = "冰蓟岭", @@ -8689,8 +7779,6 @@ MTH_DS_Zones = { ["deDE"] = "Frosthauchschlucht", ["enUS"] = "Frostwhisper Gorge", ["esES"] = "Garganta Susurro de Hielo", - ["frFR"] = "Gorge du Blanc murmure", - ["koKR"] = "서리속삭임 골짜기", ["ptBR"] = "Garganta Sussurro Gelado", ["ruRU"] = "Теснина Ледяного Шепота", ["zhCN"] = "霜语峡谷", @@ -8708,8 +7796,6 @@ MTH_DS_Zones = { ["deDE"] = "Eulenflügeldickicht", ["enUS"] = "Owl Wing Thicket", ["esES"] = "Bosque Alasalvaje", - ["frFR"] = "Fourré de l\'Aile de la chouette", - ["koKR"] = "올빼미날개 숲", ["ptBR"] = "Matagal Asa de Coruja", ["ruRU"] = "Совиная чаща", ["zhCN"] = "枭翼树丛", @@ -8727,8 +7813,6 @@ MTH_DS_Zones = { ["deDE"] = "Kel\'Therilsee", ["enUS"] = "Lake Kel\'Theril", ["esES"] = "Lago Kel\'Theril", - ["frFR"] = "Lac Kel\'Theril", - ["koKR"] = "켈테릴 호수", ["ptBR"] = "Lago Kel\'Theril", ["ruRU"] = "Озеро Кел\'Терил", ["zhCN"] = "凯斯利尔湖", @@ -8746,8 +7830,6 @@ MTH_DS_Zones = { ["deDE"] = "Sternfall", ["enUS"] = "Starfall Village", ["esES"] = "Villa Caída de Estrellas", - ["frFR"] = "Pluie-d\'Etoiles", - ["koKR"] = "별똥별 마을", ["ptBR"] = "Aldeia Starfall", ["ruRU"] = "Деревня Звездопада", ["zhCN"] = "坠星村", @@ -8765,8 +7847,6 @@ MTH_DS_Zones = { ["deDE"] = "Ewige Warte", ["enUS"] = "Everlook", ["esES"] = "Mirada Eterna", - ["frFR"] = "Long-guet", - ["koKR"] = "눈망루 마을", ["ptBR"] = "Visteterna", ["ruRU"] = "Круговзор", ["zhCN"] = "永望镇", @@ -8784,8 +7864,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Flüsternde Schlucht", ["enUS"] = "Darkwhisper Gorge", ["esES"] = "Garganta Susurro Oscuro", - ["frFR"] = "Gorge du Sombre murmure", - ["koKR"] = "검은속삭임 협곡", ["ptBR"] = "Garganta do Sussurro Sombrio", ["ruRU"] = "Теснина Зловещего Шепота", ["zhCN"] = "暗语峡谷", @@ -8803,8 +7881,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Fungustal", ["enUS"] = "The Fungal Vale", ["esES"] = "Valle Fungoso", - ["frFR"] = "La Vallée des fongus", - ["koKR"] = "곰팡이 계곡", ["ptBR"] = "O Vale Fúngico", ["ruRU"] = "Грибная долина", ["zhCN"] = "蘑菇谷", @@ -8822,8 +7898,6 @@ MTH_DS_Zones = { ["deDE"] = "Marris\' Siedlung", ["enUS"] = "The Marris Stead", ["esES"] = "La Granja de Marris", - ["frFR"] = "La ferme des Marris", - ["koKR"] = "마리스 농장", ["ptBR"] = "A Fazenda Marris", ["ruRU"] = "Поместье Маррисов", ["zhCN"] = "玛瑞斯农场", @@ -8841,8 +7915,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Tiefgewölbe", ["enUS"] = "The Undercroft", ["esES"] = "La Cripta", - ["frFR"] = "Le caveau de Zaeldarr", - ["koKR"] = "지하 납골당", ["ptBR"] = "O Subterrâneo", ["ruRU"] = "Крипта", ["zhCN"] = "墓室", @@ -8860,8 +7932,6 @@ MTH_DS_Zones = { ["deDE"] = "Darroheim", ["enUS"] = "Darrowshire", ["esES"] = "Darrowshire", - ["frFR"] = "Darrowshire", - ["koKR"] = "다로우샤이어", ["ptBR"] = "Aldeia de Darrowshire", ["ruRU"] = "Дарроушир", ["zhCN"] = "达隆郡", @@ -8879,8 +7949,6 @@ MTH_DS_Zones = { ["deDE"] = "Turm der Kronenwache", ["enUS"] = "Crown Guard Tower", ["esES"] = "Torre de la Guardia de la Corona", - ["frFR"] = "Tour de garde de la couronne", - ["koKR"] = "산마루 경비탑", ["ptBR"] = "Torre da Guarda Real", ["ruRU"] = "Башня королевской стражи", ["zhCN"] = "皇冠哨塔", @@ -8898,8 +7966,6 @@ MTH_DS_Zones = { ["deDE"] = "Corins Kreuzung", ["enUS"] = "Corin\'s Crossing", ["esES"] = "Cruce de Corin", - ["frFR"] = "La Croisée de Corin", - ["koKR"] = "코린 삼거리", ["ptBR"] = "Travessia de Corin", ["ruRU"] = "Перекресток Корина", ["zhCN"] = "考林路口", @@ -8917,8 +7983,6 @@ MTH_DS_Zones = { ["deDE"] = "Tyrs Hand", ["enUS"] = "Tyr\'s Hand", ["esES"] = "Mano de Tyr", - ["frFR"] = "Main de Tyr", - ["koKR"] = "티르의 손 수도원", ["ptBR"] = "A Mão de Tyr", ["ruRU"] = "Длань Тира", ["zhCN"] = "提尔之手", @@ -8936,8 +8000,6 @@ MTH_DS_Zones = { ["deDE"] = "Kapelle des Hoffnungsvollen Lichts", ["enUS"] = "Light\'s Hope Chapel", ["esES"] = "Capilla de la Esperanza de la Luz", - ["frFR"] = "Chapelle de l\'Espoir de Lumière", - ["koKR"] = "희망의 빛 예배당", ["ptBR"] = "Capilla Esperanza de la Luz", ["ruRU"] = "Часовня Последней Надежды", ["zhCN"] = "圣光之愿礼拜堂", @@ -8955,8 +8017,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Giftige Tal", ["enUS"] = "The Noxious Glade", ["esES"] = "Claro Noxioso", - ["frFR"] = "La Clairière nocive", - ["koKR"] = "맹독의 숲", ["ptBR"] = "O Bosque Nocivo", ["ruRU"] = "Ядовитая поляна", ["zhCN"] = "剧毒林地", @@ -8974,8 +8034,6 @@ MTH_DS_Zones = { ["deDE"] = "Ostwallturm", ["enUS"] = "Eastwall Tower", ["esES"] = "Torre de la Muralla Este", - ["frFR"] = "Tour du Mur d\'est", - ["koKR"] = "동부방벽 경비탑", ["ptBR"] = "Torre do Muro Leste", ["ruRU"] = "Восточная башня", ["zhCN"] = "东墙哨塔", @@ -8993,8 +8051,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordtal", ["enUS"] = "Northdale", ["esES"] = "Nortevalle", - ["frFR"] = "Valnord", - ["koKR"] = "노스데일", ["ptBR"] = "Northdale", ["ruRU"] = "Северный Дол", ["zhCN"] = "北谷", @@ -9012,8 +8068,6 @@ MTH_DS_Zones = { ["deDE"] = "Zul\'Mashar", ["enUS"] = "Zul\'Mashar", ["esES"] = "Zul\'Mashar", - ["frFR"] = "Zul\'Mashar", - ["koKR"] = "줄마샤르", ["ptBR"] = "Zul\'Mashar", ["ruRU"] = "Зул\'Машар", ["zhCN"] = "祖玛沙尔", @@ -9031,8 +8085,6 @@ MTH_DS_Zones = { ["deDE"] = "Nordpassturm", ["enUS"] = "Northpass Tower", ["esES"] = "Torre del Paso Norte", - ["frFR"] = "Tour du Col du nord", - ["koKR"] = "북부관문 경비탑", ["ptBR"] = "Torre do Passo Norte", ["ruRU"] = "Башня Северного перевала", ["zhCN"] = "北地哨塔", @@ -9050,8 +8102,6 @@ MTH_DS_Zones = { ["deDE"] = "Jagdhütte von Quel\'Lithien", ["enUS"] = "Quel\'Lithien Lodge", ["esES"] = "Refugio Quel\'Lithien", - ["frFR"] = "Gîte de Quel\'Lithien", - ["koKR"] = "쿠엘리시엔 오두막", ["ptBR"] = "Pousada de Quel\'Lithien", ["ruRU"] = "Сторожка Кель\'Литиен", ["zhCN"] = "奎尔林斯小屋", @@ -9069,8 +8119,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Pestwald", ["enUS"] = "Plaguewood", ["esES"] = "Bosque de la Plaga", - ["frFR"] = "Pestebois", - ["koKR"] = "역병의 숲", ["ptBR"] = "Floresta Plaguewood", ["ruRU"] = "Проклятый лес", ["zhCN"] = "病木林", @@ -9088,8 +8136,6 @@ MTH_DS_Zones = { ["deDE"] = "Stratholme", ["enUS"] = "Stratholme", ["esES"] = "Stratholme", - ["frFR"] = "Stratholme", - ["koKR"] = "스트라솔름", ["ptBR"] = "Stratholme", ["ruRU"] = "Стратхольм", ["zhCN"] = "斯坦索姆", @@ -9107,8 +8153,6 @@ MTH_DS_Zones = { ["deDE"] = "Darromersee", ["enUS"] = "Darrowmere Lake", ["esES"] = "Lago Darrowmere", - ["frFR"] = "Lac Darrowmere", - ["koKR"] = "다로미어 호수", ["ptBR"] = "Lago Darrowmere", ["ruRU"] = "Озеро Дарроумир", ["zhCN"] = "达隆米尔湖", @@ -9126,8 +8170,6 @@ MTH_DS_Zones = { ["deDE"] = "Darrowehr", ["enUS"] = "Caer Darrow", ["esES"] = "Caer Darrow", - ["frFR"] = "Caer Darrow", - ["koKR"] = "카엘 다로우", ["ptBR"] = "Caer Darrow", ["ruRU"] = "Каэр Дарроу", ["zhCN"] = "凯尔达隆", @@ -9145,8 +8187,6 @@ MTH_DS_Zones = { ["deDE"] = "Höhlen der Zeit", ["enUS"] = "Caverns of Time", ["esES"] = "Cavernas del Tiempo", - ["frFR"] = "Grottes du temps", - ["koKR"] = "시간의 동굴", ["ptBR"] = "Cavernas do Tempo", ["ruRU"] = "Пещеры Времени", ["zhCN"] = "时光之穴", @@ -9164,8 +8204,6 @@ MTH_DS_Zones = { ["deDE"] = "Lager der Distelfelle", ["enUS"] = "Thistlefur Village", ["esES"] = "Villa Pelofrondoso", - ["frFR"] = "Village des Crins-de-Chardon", - ["koKR"] = "엉겅퀴 마을", ["ptBR"] = "A Aldeia Thistlefur", ["ruRU"] = "Деревня Колючего Меха", ["zhCN"] = "蓟皮村", @@ -9183,8 +8221,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Morast", ["enUS"] = "The Quagmire", ["esES"] = "El Pantano", - ["frFR"] = "Le Bourbier", - ["koKR"] = "먼지 수렁", ["ptBR"] = "O Pântano", ["ruRU"] = "Трясина", ["zhCN"] = "泥潭沼泽", @@ -9202,8 +8238,6 @@ MTH_DS_Zones = { ["deDE"] = "Schlucht der heulenden Winde", ["enUS"] = "Windbreak Canyon", ["esES"] = "Cañón Rompeviento", - ["frFR"] = "Canyon de Brisevent", - ["koKR"] = "갈기바람 협곡", ["ptBR"] = "Canyon Windbreak", ["ruRU"] = "Безветренный каньон", ["zhCN"] = "风裂峡谷", @@ -9221,8 +8255,6 @@ MTH_DS_Zones = { ["deDE"] = "Tethris Aran", ["enUS"] = "Tethris Aran", ["esES"] = "Tethris Aran", - ["frFR"] = "Tethris Aran", - ["koKR"] = "테드리스 아란", ["ptBR"] = "Tethris Aran", ["ruRU"] = "Тефрис-Аран", ["zhCN"] = "塔迪萨兰", @@ -9240,8 +8272,6 @@ MTH_DS_Zones = { ["deDE"] = "Ethel Rethor", ["enUS"] = "Ethel Rethor", ["esES"] = "Ethel Rethor", - ["frFR"] = "Ethel Rethor", - ["koKR"] = "에텔 레소르", ["ptBR"] = "Ethel Rethor", ["ruRU"] = "Этель-Ретор", ["zhCN"] = "艾瑟雷索", @@ -9259,8 +8289,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Insel Ranazjar", ["enUS"] = "Ranazjar Isle", ["esES"] = "Isla Ranazjar", - ["frFR"] = "Ile de Ranazjar", - ["koKR"] = "라나즈자르 섬", ["ptBR"] = "Ilha Ranazjar", ["ruRU"] = "Остров Раназьяр", ["zhCN"] = "拉纳加尔岛", @@ -9278,8 +8306,6 @@ MTH_DS_Zones = { ["deDE"] = "Kormeks Hütte", ["enUS"] = "Kormek\'s Hut", ["esES"] = "Cabaña de Kormek", - ["frFR"] = "Hutte de Kormek", - ["koKR"] = "코르메크의 오두막", ["ptBR"] = "Cabaña de Kormek", ["ruRU"] = "Хижина Кормека", ["zhCN"] = "考米克小屋", @@ -9297,8 +8323,6 @@ MTH_DS_Zones = { ["deDE"] = "Schattenflucht", ["enUS"] = "Shadowprey Village", ["esES"] = "Poblado Presacaz", - ["frFR"] = "Proie-de-l\'Ombre", - ["koKR"] = "그늘수렵 마을", ["ptBR"] = "Aldeia Shadowprey", ["ruRU"] = "Деревня Ночных Охотников", ["zhCN"] = "葬影村", @@ -9316,8 +8340,6 @@ MTH_DS_Zones = { ["deDE"] = "Schwarzfelspass", ["enUS"] = "Blackrock Pass", ["esES"] = "Paso de Roca Negra", - ["frFR"] = "Défilé des Blackrock", - ["koKR"] = "검은바위 고개", ["ptBR"] = "Passagem Rocha Negra", ["ruRU"] = "Перевал Черной горы", ["zhCN"] = "黑石小径", @@ -9335,8 +8357,6 @@ MTH_DS_Zones = { ["deDE"] = "Morgans Wacht", ["enUS"] = "Morgan\'s Vigil", ["esES"] = "Vigilancia de Morgan", - ["frFR"] = "Veille de Morgan", - ["koKR"] = "모건의 망루", ["ptBR"] = "Vigília de Morgan", ["ruRU"] = "Дозор Моргана", ["zhCN"] = "摩根的岗哨", @@ -9354,8 +8374,6 @@ MTH_DS_Zones = { ["deDE"] = "Schreckenspfad", ["enUS"] = "Terror Wing Path", ["esES"] = "Sendero Alas de Terror", - ["frFR"] = "Chemin de l\'Aile de la terreur", - ["koKR"] = "공포의 날개 골짜기", ["ptBR"] = "Caminho das Asas do Terror", ["ruRU"] = "Тропа Крылатого Ужаса", ["zhCN"] = "龙翼小径", @@ -9373,8 +8391,6 @@ MTH_DS_Zones = { ["deDE"] = "Draco\'dar", ["enUS"] = "Draco\'dar", ["esES"] = "Draco\'dar", - ["frFR"] = "Draco\'dar", - ["koKR"] = "드라코다르", ["ptBR"] = "Draco\'dar", ["ruRU"] = "Драко\'дар", ["zhCN"] = "德拉考达尔", @@ -9392,8 +8408,6 @@ MTH_DS_Zones = { ["deDE"] = "Morlos\'Aran", ["enUS"] = "Morlos\'Aran", ["esES"] = "Morlos\'Aran", - ["frFR"] = "Morlos\'Aran", - ["koKR"] = "모를로스아란", ["ptBR"] = "Morlos\'Aran", ["ruRU"] = "Морлос\'Аран", ["zhCN"] = "摩罗萨兰", @@ -9411,8 +8425,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Smaragdrefugium", ["enUS"] = "Emerald Sanctuary", ["esES"] = "Santuario Esmeralda", - ["frFR"] = "Sanctuaire d\'émeraude", - ["koKR"] = "에메랄드 성소", ["ptBR"] = "Santuário Esmeralda", ["ruRU"] = "Изумрудное святилище", ["zhCN"] = "翡翠圣地", @@ -9430,8 +8442,6 @@ MTH_DS_Zones = { ["deDE"] = "Jadefeuertal", ["enUS"] = "Jadefire Glen", ["esES"] = "Glen Jadefire", - ["frFR"] = "Vallon des Jadefeu", - ["koKR"] = "비취불꽃 숲", ["ptBR"] = "Bosque Jadefuego", ["ruRU"] = "Долина Нефритового Пламени", ["zhCN"] = "碧火谷", @@ -9449,8 +8459,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Constellas", ["enUS"] = "Ruins of Constellas", ["esES"] = "Ruinas de Constellas", - ["frFR"] = "Ruines de Constellas", - ["koKR"] = "콘스텔라스 폐허", ["ptBR"] = "Ruínas de Constellas", ["ruRU"] = "Руины Констелласа", ["zhCN"] = "克斯特拉斯废墟", @@ -9468,8 +8476,6 @@ MTH_DS_Zones = { ["deDE"] = "Bittere Landzunge", ["enUS"] = "Bitter Reaches", ["esES"] = "Alcázares Amargos", - ["frFR"] = "Confins amers", - ["koKR"] = "시련의 산마루", ["ptBR"] = "Línguas Amargas", ["ruRU"] = "Горькие плесы", ["zhCN"] = "痛苦海岸", @@ -9487,8 +8493,6 @@ MTH_DS_Zones = { ["deDE"] = "Anhöhe des Entweihers", ["enUS"] = "Rise of the Defiler", ["esES"] = "La Subida del Corruptor", - ["frFR"] = "Cime du Souilleur", - ["koKR"] = "파멸자의 봉우리", ["ptBR"] = "Ascensão do Defiler", ["ruRU"] = "Утес Осквернителя", ["zhCN"] = "污染者高地", @@ -9506,8 +8510,6 @@ MTH_DS_Zones = { ["deDE"] = "Ruinen von Isildien", ["enUS"] = "Ruins of Isildien", ["esES"] = "Ruinas de Isildien", - ["frFR"] = "Ruines d\'Isildien", - ["koKR"] = "이실디엔 폐허", ["ptBR"] = "Ruínas de Isildien", ["ruRU"] = "Руины Исильдиэна", ["zhCN"] = "伊斯迪尔废墟", @@ -9525,8 +8527,6 @@ MTH_DS_Zones = { ["deDE"] = "Posten der Grimmtotem", ["enUS"] = "Grimtotem Post", ["esES"] = "Puesto Totem Siniestro", - ["frFR"] = "Poste Totem sinistre", - ["koKR"] = "그림토템 초소", ["ptBR"] = "Posto Totem Vil", ["ruRU"] = "Застава Зловещего Тотема", ["zhCN"] = "恐怖图腾岗哨", @@ -9544,8 +8544,6 @@ MTH_DS_Zones = { ["deDE"] = "Camp Aparaje", ["enUS"] = "Camp Aparaje", ["esES"] = "Campamento Aparaje", - ["frFR"] = "Camp Aparaje", - ["koKR"] = "아파라제 야영지", ["ptBR"] = "Acampamento Aparaje", ["ruRU"] = "Лагерь Апарахе", ["zhCN"] = "阿帕拉耶营地", @@ -9563,8 +8561,6 @@ MTH_DS_Zones = { ["deDE"] = "Malaka\'jin", ["enUS"] = "Malaka\'jin", ["esES"] = "Malaka\'jin", - ["frFR"] = "Malaka\'jin", - ["koKR"] = "말라카진", ["ptBR"] = "Malaka\'jin", ["ruRU"] = "Малака\'джин", ["zhCN"] = "玛拉卡金", @@ -9582,8 +8578,6 @@ MTH_DS_Zones = { ["deDE"] = "Steinschlagklamm", ["enUS"] = "Boulderslide Ravine", ["esES"] = "Barranco de Boulderslide", - ["frFR"] = "Ravin des Eboulis", - ["koKR"] = "구릉바위 협곡", ["ptBR"] = "Ravina Deslizapedra", ["ruRU"] = "Ущелье Камнепадов", ["zhCN"] = "滚岩峡谷", @@ -9601,8 +8595,6 @@ MTH_DS_Zones = { ["deDE"] = "Sishircanyon", ["enUS"] = "Sishir Canyon", ["esES"] = "Cañón Sishir", - ["frFR"] = "Canyon de Sishir", - ["koKR"] = "시쉬르 협곡", ["ptBR"] = "Desfiladeiro Sishir", ["ruRU"] = "Сиширский каньон", ["zhCN"] = "希塞尔山谷", @@ -9620,8 +8612,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Joch", ["enUS"] = "The Vice", ["esES"] = "El Torniquete", - ["frFR"] = "L\'Etau", - ["koKR"] = "악의 소굴", ["ptBR"] = "O Vício", ["ruRU"] = "Погань", ["zhCN"] = "罪恶谷", @@ -9639,8 +8629,6 @@ MTH_DS_Zones = { ["deDE"] = "Karazhan", ["enUS"] = "Karazhan", ["esES"] = "Karazhan", - ["frFR"] = "Karazhan", - ["koKR"] = "카라잔", ["ptBR"] = "Karazhan", ["ruRU"] = "Каражан", ["zhCN"] = "卡拉赞", @@ -9658,8 +8646,6 @@ MTH_DS_Zones = { ["deDE"] = "Düsterbruch", ["enUS"] = "Dire Maul", ["esES"] = "La Masacre", - ["frFR"] = "Hache-tripes", - ["koKR"] = "혈투의 전장", ["ptBR"] = "Gládio Cruel", ["ruRU"] = "Забытый Город", ["zhCN"] = "厄运之槌", @@ -9677,8 +8663,6 @@ MTH_DS_Zones = { ["deDE"] = "Jadefeuerbach", ["enUS"] = "Jadefire Run", ["esES"] = "Sendero Fuego de Jade", - ["frFR"] = "Défilé des Jadefeu", - ["koKR"] = "비취불꽃 비탈", ["ptBR"] = "Sendero Jadefuego", ["ruRU"] = "Холм Нефритового Пламени", ["zhCN"] = "碧火小径", @@ -9696,8 +8680,6 @@ MTH_DS_Zones = { ["deDE"] = "Thondroril", ["enUS"] = "Thondroril River", ["esES"] = "Río Thondroril", - ["frFR"] = "La Thondroril", - ["koKR"] = "톤드로릴 강", ["ptBR"] = "O Rio Thondroril", ["ruRU"] = "Река Тондрорил", ["zhCN"] = "索多里尔河", @@ -9715,8 +8697,6 @@ MTH_DS_Zones = { ["deDE"] = "Thondroril", ["enUS"] = "Thondroril River", ["esES"] = "Río Thondroril", - ["frFR"] = "La Thondroril", - ["koKR"] = "톤드로릴 강", ["ptBR"] = "O Rio Thondroril", ["ruRU"] = "Река Тондрорил", ["zhCN"] = "索多里尔河", @@ -9734,8 +8714,6 @@ MTH_DS_Zones = { ["deDE"] = "Mereldarsee", ["enUS"] = "Lake Mereldar", ["esES"] = "Lago Mereldar", - ["frFR"] = "Lac Mereldar", - ["koKR"] = "메렐다르 호수", ["ptBR"] = "Lago Mereldar", ["ruRU"] = "Озеро Мерельдар", ["zhCN"] = "米雷达尔湖", @@ -9753,8 +8731,6 @@ MTH_DS_Zones = { ["deDE"] = "Pestilenznarbe", ["enUS"] = "Pestilent Scar", ["esES"] = "Cicatriz Pestilente", - ["frFR"] = "Balafre pestilentielle", - ["koKR"] = "전염의 흉터", ["ptBR"] = "Cicatriz Pestilenta", ["ruRU"] = "Моровой овраг", ["zhCN"] = "瘟疫之痕", @@ -9772,8 +8748,6 @@ MTH_DS_Zones = { ["deDE"] = "Die Infektnarbe", ["enUS"] = "The Infectis Scar", ["esES"] = "La Cicatriz Infectis", - ["frFR"] = "La Balafre infecte", - ["koKR"] = "오염의 흉터", ["ptBR"] = "A Cicatriz Infecta", ["ruRU"] = "Чумной овраг", ["zhCN"] = "魔刃之痕", @@ -9791,8 +8765,6 @@ MTH_DS_Zones = { ["deDE"] = "Faulholzsee", ["enUS"] = "Blackwood Lake", ["esES"] = "Lago Bosque Negro", - ["frFR"] = "Lac de Noirbois", - ["koKR"] = "검은나무 호수", ["ptBR"] = "Lago Bosquenero", ["ruRU"] = "Озеро Чернолесья", ["zhCN"] = "黑木湖", @@ -9810,8 +8782,6 @@ MTH_DS_Zones = { ["deDE"] = "Schreckenstal", ["enUS"] = "Terrordale", ["esES"] = "Valle del Terror", - ["frFR"] = "Val-Terreur", - ["koKR"] = "테러데일", ["ptBR"] = "Vale Terrordale", ["ruRU"] = "Долина Ужаса", ["zhCN"] = "恐惧谷", @@ -9829,8 +8799,6 @@ MTH_DS_Zones = { ["deDE"] = "Totmannsfurt", ["enUS"] = "Deadman\'s Crossing", ["esES"] = "Cruce del Hombre Muerto", - ["frFR"] = "Croisée de l\'homme mort", - ["koKR"] = "사자의 길", ["ptBR"] = "Travessia do Morto", ["ruRU"] = "Перекресток Мертвеца", ["zhCN"] = "死者十字", @@ -9848,8 +8816,6 @@ MTH_DS_Zones = { ["deDE"] = "Der Skarabäuswall", ["enUS"] = "The Scarab Wall", ["esES"] = "Murallas del Escarabajo", - ["frFR"] = "Le Mur du scarabée", - ["koKR"] = "스카라베 성벽", ["ptBR"] = "A Muralha do Escaravelho", ["ruRU"] = "Стена Скарабея", ["zhCN"] = "甲虫之墙", @@ -9867,8 +8833,6 @@ MTH_DS_Zones = { ["deDE"] = "Südwindposten", ["enUS"] = "Southwind Village", ["esES"] = "Villa Viento del Sur", - ["frFR"] = "Village de Sudevent", - ["koKR"] = "마파람 마을", ["ptBR"] = "Aldeia Southwind", ["ruRU"] = "Деревня Южного Ветра", ["zhCN"] = "南风村", @@ -9886,8 +8850,6 @@ MTH_DS_Zones = { ["deDE"] = "Das Kristalltal", ["enUS"] = "The Crystal Vale", ["esES"] = "El Valle de Cristal", - ["frFR"] = "La Vallée des cristaux", - ["koKR"] = "수정 골짜기", ["ptBR"] = "O Vale Cristalino", ["ruRU"] = "Долина Кристаллов", ["zhCN"] = "水晶谷", @@ -9905,8 +8867,6 @@ MTH_DS_Zones = { ["deDE"] = "Bau des Ashischwarms", ["enUS"] = "Hive\'Ashi", ["esES"] = "Colmena\'Ashi", - ["frFR"] = "Ruche\'Ashi", - ["koKR"] = "하이브아쉬", ["ptBR"] = "Colme\'Ashi", ["ruRU"] = "Улей Аши", ["zhCN"] = "亚什虫巢", @@ -9924,8 +8884,6 @@ MTH_DS_Zones = { ["deDE"] = "Bau des Zoraschwarms", ["enUS"] = "Hive\'Zora", ["esES"] = "Colmena\'Zora", - ["frFR"] = "Ruche\'Zora", - ["koKR"] = "하이브조라", ["ptBR"] = "Colme\'Zora", ["ruRU"] = "Улей Зора", ["zhCN"] = "佐拉虫巢", @@ -9943,8 +8901,6 @@ MTH_DS_Zones = { ["deDE"] = "Bau des Regalschwarms", ["enUS"] = "Hive\'Regal", ["esES"] = "Colmena\'Regal", - ["frFR"] = "Ruche\'Regal", - ["koKR"] = "하이브레갈", ["ptBR"] = "Colme\'Regal", ["ruRU"] = "Улей Регал", ["zhCN"] = "雷戈虫巢", @@ -9962,8 +8918,6 @@ MTH_DS_Zones = { ["deDE"] = "Dun Baldar", ["enUS"] = "Dun Baldar", ["esES"] = "Dun Baldar", - ["frFR"] = "Dun Baldar", - ["koKR"] = "던 발다르", ["ptBR"] = "Dun Baldar", ["ruRU"] = "Дун Болдар", ["zhCN"] = "丹巴达尔", @@ -9981,8 +8935,6 @@ MTH_DS_Zones = { ["deDE"] = "Eisblutgarnison", ["enUS"] = "Iceblood Garrison", ["esES"] = "Guarnición Sangre de Hielo", - ["frFR"] = "Garnison de Glace-sang", - ["koKR"] = "얼음피 주둔지", ["ptBR"] = "Guarnição Sanguefrio", ["ruRU"] = "Гарнизон Стылой Крови", ["zhCN"] = "冰血要塞", @@ -10000,8 +8952,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Frostwolf", ["enUS"] = "Frostwolf Keep", ["esES"] = "Bastión Lobo Gélido", - ["frFR"] = "Donjon Frostwolf", - ["koKR"] = "서리늑대 요새", ["ptBR"] = "Fortaleza Lobo Gélido", ["ruRU"] = "Крепость Северного Волка", ["zhCN"] = "霜狼要塞", @@ -10019,8 +8969,6 @@ MTH_DS_Zones = { ["deDE"] = "Burg Cenarius", ["enUS"] = "Cenarion Hold", ["esES"] = "Bastión Cenarion", - ["frFR"] = "Fort cénarien", - ["koKR"] = "세나리온 요새", ["ptBR"] = "Forte Cenariano", ["ruRU"] = "Крепость Кенария", ["zhCN"] = "塞纳里奥要塞", diff --git a/modules/autobuy/module.lua b/modules/autobuy/module.lua index 54de574..ef3121c 100644 --- a/modules/autobuy/module.lua +++ b/modules/autobuy/module.lua @@ -6,7 +6,7 @@ local MTH_AutoBuy = { name = "autobuy", enabled = false, - version = "1.1.0", + version = "1.2.0", events = { "VARIABLES_LOADED", "MERCHANT_SHOW", @@ -33,7 +33,7 @@ local function AB_EnsureBridgeFrame(moduleRef) return MTH_AutoBuy._bridgeFrame end - local frame = CreateFrame("Frame", "MTH_AutoBuyBridgeFrame") + local frame = CreateFrame("Frame", "MTH_AutoBuyBridge") if not frame then AB_Log("failed to create bridge frame", "error") return nil @@ -42,8 +42,8 @@ local function AB_EnsureBridgeFrame(moduleRef) frame:RegisterEvent("MERCHANT_SHOW") frame:RegisterEvent("MERCHANT_UPDATE") frame:RegisterEvent("MERCHANT_CLOSED") - frame:SetScript("OnEvent", function(_, eventName) - eventName = eventName or event + frame:SetScript("OnEvent", function() + local eventName = event local engine = AB_Engine() if not engine then AB_Trace("bridge event=" .. tostring(eventName) .. " engine missing") diff --git a/modules/autoquest/module.lua b/modules/autoquest/module.lua index 5e30e0b..de3f53d 100644 --- a/modules/autoquest/module.lua +++ b/modules/autoquest/module.lua @@ -6,7 +6,7 @@ local MTH_AutoQuest = { name = "autoquest", enabled = false, - version = "1.1.0", + version = "1.2.0", events = { "GOSSIP_SHOW", "QUEST_GREETING", @@ -34,7 +34,6 @@ local QA_ITEM_BLASTED_BOAR_LUNG_NAME = "Blasted Boar Lung" local QA_ITEM_VULTURE_GIZZARD_NAME = "Vulture Gizzard" local QA_ITEM_GROUND_SCORPOK_ASSAY_NAME = "Ground Scorpok Assay" -local QA_DirectEventFrame = nil local QA_TooltipHooked = false local QA_TooltipPollFrame = nil local QA_TooltipRefreshFrame = nil @@ -292,7 +291,8 @@ local function QA_CountItemInBags(expectedId, expectedName) for slot = 1, slots do local link = getContainerItemLink(bag, slot) if type(link) == "string" and link ~= "" then - local itemId = tonumber(string.match(link, "item:(%d+)")) + local _, _, itemIdStr = string.find(link, "item:(%d+)") + local itemId = tonumber(itemIdStr) local itemName = nil if type(getItemInfo) == "function" then itemName = getItemInfo(link) @@ -456,8 +456,8 @@ local function QA_EnsureTooltipHook() if hasHookScript and onTooltipSetUnitExists then pcall(function() - GameTooltip:HookScript("OnTooltipSetUnit", function(self) - QA_AppendDrazialTooltip(self, "hook:setunit") + GameTooltip:HookScript("OnTooltipSetUnit", function() + QA_AppendDrazialTooltip(this, "hook:setunit") end) end) elseif hasSetScript and hasGetScript and onTooltipSetUnitExists then @@ -466,11 +466,11 @@ local function QA_EnsureTooltipHook() end) if okGetPrev then pcall(function() - GameTooltip:SetScript("OnTooltipSetUnit", function(self) + GameTooltip:SetScript("OnTooltipSetUnit", function() if type(previous) == "function" then - previous(self) + previous() end - QA_AppendDrazialTooltip(self, "script:setunit") + QA_AppendDrazialTooltip(this, "script:setunit") end) end) end @@ -478,8 +478,8 @@ local function QA_EnsureTooltipHook() if hasHookScript and onShowExists then pcall(function() - GameTooltip:HookScript("OnShow", function(self) - QA_AppendDrazialTooltip(self, "hook:show") + GameTooltip:HookScript("OnShow", function() + QA_AppendDrazialTooltip(this, "hook:show") end) end) elseif hasSetScript and hasGetScript and onShowExists then @@ -488,11 +488,11 @@ local function QA_EnsureTooltipHook() end) if okGetPrevShow then pcall(function() - GameTooltip:SetScript("OnShow", function(self) + GameTooltip:SetScript("OnShow", function() if type(previousShow) == "function" then - previousShow(self) + previousShow() end - QA_AppendDrazialTooltip(self, "script:show") + QA_AppendDrazialTooltip(this, "script:show") end) end) end @@ -505,17 +505,17 @@ local function QA_EnsureTooltipPoller() if QA_TooltipPollFrame then return end - local frame = CreateFrame("Frame", "MTH_AutoQuestTooltipPollFrame") + local frame = CreateFrame("Frame", "MTH_AQTooltipPoll") if not frame then return end frame._mthElapsed = 0 - frame:SetScript("OnUpdate", function(self, elapsed) - self._mthElapsed = (self._mthElapsed or 0) + (elapsed or arg1 or 0) - if self._mthElapsed < 0.20 then + frame:SetScript("OnUpdate", function() + this._mthElapsed = (this._mthElapsed or 0) + (arg1 or 0) + if this._mthElapsed < 0.20 then return end - self._mthElapsed = 0 + this._mthElapsed = 0 if not (MTH_AutoQuest and MTH_AutoQuest.enabled) then return end @@ -591,16 +591,16 @@ end local function QA_RequestTooltipRefresh(delaySeconds) delaySeconds = tonumber(delaySeconds) or 0.10 if not QA_TooltipRefreshFrame then - QA_TooltipRefreshFrame = CreateFrame("Frame", "MTH_AutoQuestTooltipRefreshFrame") + QA_TooltipRefreshFrame = CreateFrame("Frame", "MTH_AQTooltipRefresh") if not QA_TooltipRefreshFrame then return end - QA_TooltipRefreshFrame:SetScript("OnUpdate", function(self, elapsed) - local frameRef = self or this or QA_TooltipRefreshFrame + QA_TooltipRefreshFrame:SetScript("OnUpdate", function() + local frameRef = this or QA_TooltipRefreshFrame if not frameRef then return end - frameRef._elapsed = (frameRef._elapsed or 0) + (elapsed or arg1 or 0) + frameRef._elapsed = (frameRef._elapsed or 0) + (arg1 or 0) if frameRef._elapsed < (frameRef._delay or 0.10) then return end @@ -915,48 +915,14 @@ local function QA_RunProfileAutomation(eventName, profile) end end -local function QA_SetDirectEventFrameActive(active) - if not QA_DirectEventFrame then - return - end - if active then - QA_DirectEventFrame:RegisterEvent("GOSSIP_SHOW") - QA_DirectEventFrame:RegisterEvent("QUEST_GREETING") - QA_DirectEventFrame:RegisterEvent("QUEST_DETAIL") - QA_DirectEventFrame:RegisterEvent("QUEST_PROGRESS") - QA_DirectEventFrame:RegisterEvent("QUEST_COMPLETE") - else - QA_DirectEventFrame:UnregisterAllEvents() - end -end - -local function QA_EnsureDirectEventFrame(moduleRef) - if QA_DirectEventFrame then - return QA_DirectEventFrame - end - local frame = CreateFrame("Frame", "MTH_AutoQuestEventFrame") - if not frame then - QA_Debug("direct frame create failed") - return nil - end - frame:SetScript("OnEvent", function(_, eventName) - eventName = eventName or event - if not (moduleRef and moduleRef.enabled) then - return - end - QA_Debug("directEvent=" .. tostring(eventName)) - QA_RunProfileAutomation(eventName, QA_PROFILE_SCORPOK) - QA_RunProfileAutomation(eventName, QA_PROFILE_SISSIES) - end) - QA_DirectEventFrame = frame - return frame -end +-- NOTE: QA_DirectEventFrame removed (Phase 2 fix #22b) +-- The central event router already dispatches GOSSIP_SHOW, QUEST_GREETING, +-- QUEST_DETAIL, QUEST_PROGRESS, QUEST_COMPLETE to MTH_AutoQuest:onEvent(). +-- Having a second frame register the same events caused double-dispatch. function MTH_AutoQuest:init() local store = QA_GetOptionsStore() self.initialized = true - QA_EnsureDirectEventFrame(self) - QA_SetDirectEventFrameActive(self.enabled and true or false) QA_Debug("init: module active=" .. tostring(self.enabled and true or false) .. ", option scorpokDrazial=" .. tostring(store and store.scorpokDrazial and true or false) .. ", option arrowsForSissies=" .. tostring(store and store.arrowsForSissies and true or false) @@ -965,7 +931,6 @@ end function MTH_AutoQuest:setEnabled(enabled) self.enabled = enabled and true or false - QA_SetDirectEventFrameActive(self.enabled and true or false) end function MTH_AutoQuest:onEvent(eventName) @@ -981,7 +946,7 @@ function MTH_AutoQuest:onEvent(eventName) end function MTH_AutoQuest:cleanup() - QA_SetDirectEventFrameActive(false) + -- no-op: direct event frame removed in Phase 2 end MTH:RegisterModule("autoquest", MTH_AutoQuest) diff --git a/modules/chronometer/engine.lua b/modules/chronometer/engine.lua index e559bcf..b5d3309 100644 --- a/modules/chronometer/engine.lua +++ b/modules/chronometer/engine.lua @@ -485,16 +485,22 @@ local function getActionSpell(slot) end if not Chronometer._scanTooltip then - Chronometer._scanTooltip = CreateFrame("GameTooltip", "MTH_ChronometerScanTooltip", UIParent, "GameTooltipTemplate") - Chronometer._scanTooltip:SetOwner(UIParent, "ANCHOR_NONE") + local tip = CreateFrame("GameTooltip", "MTH_ChrBarProbe", UIParent) + tip:SetOwner(UIParent, "ANCHOR_NONE") + for i = 1, 4 do + local L = tip:CreateFontString("MTH_ChrBarProbeTextLeft"..i, "ARTWORK", "GameTooltipText") + local R = tip:CreateFontString("MTH_ChrBarProbeTextRight"..i, "ARTWORK", "GameTooltipText") + tip:AddFontStrings(L, R) + end + Chronometer._scanTooltip = tip end local tooltip = Chronometer._scanTooltip tooltip:ClearLines() tooltip:SetAction(slot) - local left1 = getglobal("MTH_ChronometerScanTooltipTextLeft1") - local left2 = getglobal("MTH_ChronometerScanTooltipTextLeft2") + local left1 = getglobal("MTH_ChrBarProbeTextLeft1") + local left2 = getglobal("MTH_ChrBarProbeTextLeft2") local spellName = left1 and left1:GetText() or nil if not spellName or spellName == "" then return nil, 0 @@ -1191,7 +1197,7 @@ function Chronometer:ToggleAnchor() end function Chronometer:CreateAnchor(text, r, g, b) - local frame = CreateFrame("Button", "MTHChronometerAnchor", UIParent) + local frame = CreateFrame("Button", "MTH_ChronometerAnchor", UIParent) frame:SetWidth(220) frame:SetHeight(25) frame.owner = self @@ -1219,25 +1225,23 @@ function Chronometer:CreateAnchor(text, r, g, b) MTH_CHRON_Trace("CreateAnchor default point=" .. MTH_CHRON_DescribePoint(frame)) end - frame:SetScript("OnDragStart", function(self) - self = self or this - if not self or not self.StartMoving then + frame:SetScript("OnDragStart", function() + if not this or not this.StartMoving then return end - MTH_CHRON_Trace("anchor drag-start point=" .. MTH_CHRON_DescribePoint(self)) - self:StartMoving() + MTH_CHRON_Trace("anchor drag-start point=" .. MTH_CHRON_DescribePoint(this)) + this:StartMoving() end) - frame:SetScript("OnDragStop", function(self) - self = self or this - if not self then + frame:SetScript("OnDragStop", function() + if not this then return end - if self.StopMovingOrSizing then - self:StopMovingOrSizing() + if this.StopMovingOrSizing then + this:StopMovingOrSizing() end - local point, _, _, x, y = self:GetPoint() + local point, _, _, x, y = this:GetPoint() x = tonumber(x) y = tonumber(y) if not x or not y then @@ -1246,16 +1250,16 @@ function Chronometer:CreateAnchor(text, r, g, b) x = math.floor(x + 0.5) y = math.floor(y + 0.5) - self:ClearAllPoints() - self:SetPoint(point or "TOPLEFT", UIParent, point or "TOPLEFT", x, y) + this:ClearAllPoints() + this:SetPoint(point or "TOPLEFT", UIParent, point or "TOPLEFT", x, y) - if self.owner and self.owner.profile and type(self.owner.profile.barposition) == "table" then - self.owner.profile.barposition.point = point or "TOPLEFT" - self.owner.profile.barposition.relativePoint = point or "TOPLEFT" - self.owner.profile.barposition.x = x - self.owner.profile.barposition.y = y - MTH_CHRON_Trace("anchor drag-stop saved profile=" .. MTH_CHRON_FormatBarPosition(self.owner.profile) - .. " frame=" .. MTH_CHRON_DescribePoint(self)) + if this.owner and this.owner.profile and type(this.owner.profile.barposition) == "table" then + this.owner.profile.barposition.point = point or "TOPLEFT" + this.owner.profile.barposition.relativePoint = point or "TOPLEFT" + this.owner.profile.barposition.x = x + this.owner.profile.barposition.y = y + MTH_CHRON_Trace("anchor drag-stop saved profile=" .. MTH_CHRON_FormatBarPosition(this.owner.profile) + .. " frame=" .. MTH_CHRON_DescribePoint(this)) end end) diff --git a/modules/chronometer/libs/CandyBar-2.0/CandyBar-2.0.lua b/modules/chronometer/libs/CandyBar-2.0/CandyBar-2.0.lua index eee14f8..67d6f81 100644 --- a/modules/chronometer/libs/CandyBar-2.0/CandyBar-2.0.lua +++ b/modules/chronometer/libs/CandyBar-2.0/CandyBar-2.0.lua @@ -8,7 +8,6 @@ Documentation: http://web.archive.org/web/20070314234510/http://wowace.com/wiki/ Description: A timer bars library. Dependencies: AceLibrary, AceOO-2.0, PaintChips-2.0 ]] -local match = string.match local getn,setn,tinsert = table.getn, table.setn,table.insert local vmajor, vminor = "CandyBar-2.0", "$Revision: 16011 $" diff --git a/modules/chronometer/module.lua b/modules/chronometer/module.lua index d187c10..6a3baa0 100644 --- a/modules/chronometer/module.lua +++ b/modules/chronometer/module.lua @@ -1,7 +1,7 @@ local MTH_ChronometerModule = { name = "chronometer", enabled = true, - version = "1.1.0", + version = "1.2.0", events = {}, initialized = false, } diff --git a/modules/feedomatic/FeedOMatic.lua b/modules/feedomatic/FeedOMatic.lua index e32ad96..8a5b3fa 100644 --- a/modules/feedomatic/FeedOMatic.lua +++ b/modules/feedomatic/FeedOMatic.lua @@ -780,7 +780,7 @@ local function FOM_DebugLogMerchantFoods(sourceEvent) end end -function FOM_FeedButton_OnClick() +function MTH_FOM_FeedButton_OnClick() if (arg1 == "RightButton") then if (MTH_OpenOptions) then MTH_OpenOptions("FeedOMatic"); @@ -790,7 +790,7 @@ function FOM_FeedButton_OnClick() end end -function FOM_FeedButton_OnEnter() +function MTH_FOM_FeedButton_OnEnter() if ( PetFrameHappiness.tooltip ) then GameTooltip:SetOwner(PetFrameHappiness, "ANCHOR_RIGHT"); GameTooltip:SetText(PetFrameHappiness.tooltip); @@ -807,7 +807,7 @@ function FOM_FeedButton_OnEnter() end end -function FOM_FeedButton_OnLeave() +function MTH_FOM_FeedButton_OnLeave() GameTooltip:Hide(); end @@ -985,13 +985,13 @@ function FOM_OnEvent(event, arg1) this:RegisterEvent("PLAYER_REGEN_ENABLED"); end - if (FOM_FeedButton == nil) then - FOM_FeedButton = CreateFrame("Button", "FOM_FeedButton", PetFrameHappiness); - FOM_FeedButton:SetAllPoints(PetFrameHappiness); - FOM_FeedButton:RegisterForClicks("LeftButtonUp", "RightButtonUp"); - FOM_FeedButton:SetScript("OnClick", FOM_FeedButton_OnClick); - FOM_FeedButton:SetScript("OnEnter", FOM_FeedButton_OnEnter); - FOM_FeedButton:SetScript("OnLeave", FOM_FeedButton_OnLeave); + if (MTH_FOM_FeedButton == nil) then + MTH_FOM_FeedButton = CreateFrame("Button", "MTH_FOM_FeedButton", PetFrameHappiness); + MTH_FOM_FeedButton:SetAllPoints(PetFrameHappiness); + MTH_FOM_FeedButton:RegisterForClicks("LeftButtonUp", "RightButtonUp"); + MTH_FOM_FeedButton:SetScript("OnClick", MTH_FOM_FeedButton_OnClick); + MTH_FOM_FeedButton:SetScript("OnEnter", MTH_FOM_FeedButton_OnEnter); + MTH_FOM_FeedButton:SetScript("OnLeave", MTH_FOM_FeedButton_OnLeave); end if (FOM_Config.Level == "happy") then @@ -1236,16 +1236,27 @@ function FOM_DifficultyToNum(level) end end +local FOM_CachedPlayerClass = nil +local FOM_OnUpdateElapsed = 0 + function FOM_OnUpdate(elapsed) - - _, realClass = UnitClass("player"); - if (realClass ~= "HUNTER") then return; end + FOM_OnUpdateElapsed = FOM_OnUpdateElapsed + (elapsed or 0) + if FOM_OnUpdateElapsed < 0.05 then + return + end + local dt = FOM_OnUpdateElapsed + FOM_OnUpdateElapsed = 0 + + if not FOM_CachedPlayerClass then + _, FOM_CachedPlayerClass = UnitClass("player") + end + if (FOM_CachedPlayerClass ~= "HUNTER") then return; end -- If it's been more than a second since our last tradeskill update, -- we can allow the event to process again. - FOM_TradeSkillLock.EventTimer = FOM_TradeSkillLock.EventTimer + elapsed; + FOM_TradeSkillLock.EventTimer = FOM_TradeSkillLock.EventTimer + dt; if (FOM_TradeSkillLock.Locked) then - FOM_TradeSkillLock.EventCooldown = FOM_TradeSkillLock.EventCooldown + elapsed; + FOM_TradeSkillLock.EventCooldown = FOM_TradeSkillLock.EventCooldown + dt; if (FOM_TradeSkillLock.EventCooldown > FOM_TradeSkillLock.EventCooldownTime) then FOM_TradeSkillLock.EventCooldown = 0; @@ -1415,8 +1426,8 @@ function FOM_CanFeed() if ( UnitLevel("player") >= 40 ) then for _, buffTexture in mountTextureSubStrings do if ( string.find(buff, buffTexture) ) then - FOMTooltip:SetUnitBuff("player", buffIndex+1); - local msg = FOMTooltipTextLeft1:GetText(); + MTH_FOM_Tooltip:SetUnitBuff("player", buffIndex+1); + local msg = MTH_FOM_TooltipTextLeft1:GetText(); if (msg ~= nil) then msg = string.lower(msg); for _, mountName in FOM_MOUNT_NAME_SUBSTRINGS do @@ -2567,9 +2578,9 @@ function FOM_IsTemporaryFood(itemLink) end return false; end - FOMTooltip:ClearLines(); - FOMTooltip:SetHyperlink(link); - if (FOMTooltipTextLeft2:GetText() == ITEM_CONJURED) then + MTH_FOM_Tooltip:ClearLines(); + MTH_FOM_Tooltip:SetHyperlink(link); + if (MTH_FOM_TooltipTextLeft2:GetText() == ITEM_CONJURED) then if (numericItemId ~= nil) then FOM_TEMP_FOOD_CACHE[numericItemId] = true; end diff --git a/modules/feedomatic/localization.lua b/modules/feedomatic/localization.lua index 24d589f..2799455 100644 --- a/modules/feedomatic/localization.lua +++ b/modules/feedomatic/localization.lua @@ -4,7 +4,7 @@ ------------------------------------------------------ -- Key bindings -BINDING_HEADER_FEEDOMATIC = "Fizzwidget Feed-O-Matic"; +-- NOTE: BINDING_HEADER_FEEDOMATIC is defined in api/localization.lua via the MTH_L() system. BINDING_NAME_FEEDOMATIC = "Feed Pet"; -- Diet names. These should be the all-lowercase versions of the six diets returned from GetPetFoodTypes(). (Want to get them all nice and quick for your localization? Go tame a bear... they eat anything.) @@ -111,110 +111,6 @@ FOM_OptionsButtonText = { }; ------------------------------------------------------ -if (GetLocale() == "frFR") then - --- Diet names. These should be the all-lowercase versions of the six diets returned from GetPetFoodTypes(). (Want to get them all nice and quick for your localization? Go tame a bear... they eat anything.) --- THESE STRINGS MUST BE LOCALIZED for Feed-O-Matic to work properly in other locales. - FOM_DIET_MEAT = "viande"; - FOM_DIET_FISH = "poisson"; - FOM_DIET_BREAD = "pain"; - FOM_DIET_CHEESE = "fromage"; - FOM_DIET_FRUIT = "fruit"; - FOM_DIET_FUNGUS = "champignon"; - - -- If the player has a buff whose icon name contains "Ability_Mount" and whose name contains one of these substrings, we assume the player is mounted. We have to use this rather oblique way to check for mounted because some other buffs use the Ability_Mount_* icons. If these aren't localized, we may not recognize when the player is mounted and still try to feed the pet. - FOM_MOUNT_NAME_SUBSTRINGS = { "kodo", "loup", "raptor", "steed", "cheval", "bélier", "tigre", "mécanotrotteur", }; - - -- It's not clear whether the 5th and 6th returns from GetItemInfo() are supposed to be localized... so we have localized keys for them just in case. If these aren't localized, we'll just needlessly search your ammo bags for food. - FOM_AMMO_POUCH = "Giberne"; - FOM_QUIVER = "Carquois"; - - --- From here on down, the localized strings are just for readability... they don't affect whether Feed-O-Matic works. - - -- Two special diets; one is used for tracking food that provides a bonus (or at least, that you don't want to have fed to your pet when the 'savebonus' option is on), and another that's used in the chat-line interface for listing all diets. - FOM_DIET_BONUS = "bonus"; - FOM_DIET_ALL = "tous"; - - -- Used in tooltips to indicate food quality. - FOM_QUALITY_UNKNOWN = "%s peut le manger, mais n'a jamais essayé."; - FOM_QUALITY_UNDER = "%s n'en mange plus désormais."; - FOM_QUALITY_MIGHT = "%s en mangera peut-être."; - FOM_QUALITY_WILL = "%s en mangera."; - FOM_QUALITY_LIKE = "%s aime en manger."; - FOM_QUALITY_LOVE = "%s adore en manger."; - - -- User-visible errors - FOM_ERROR_NO_PET = "Vous n'avez pas de familier."; - FOM_ERROR_PET_DEAD = "Votre familier est mort."; - FOM_ERROR_NO_FEEDABLE_PET = "Vous n'avez pas de familier capable de manger."; - FOM_ERROR_FOOD_NOT_FOUND = "%s n'a pas trouvé de %s dans votre sac."; - FOM_ERROR_NO_FOOD = "%s n'a pas trouvé de nourriture dans votre sac."; - - -- Feeding status messages - FOM_FEEDING_EAT_ANOTHER = "%s n'aime pas cette nourriture et va essayer autre chose..." - FOM_FEEDING_FEED_ANOTHER = "cherche autre chose à donner à %s..."; - FOM_FEEDING_EAT = "%s mange un(e) %s."; - FOM_FEEDING_FEED = "donne à %s à manger un(e) %s. "; - - -- Beast family names - BAT = "Chauve-souris"; - BEAR = "Ours"; - BOAR = "Sanglier"; - CARRION_BIRD = "Charognard"; - CAT = "Félin"; - CRAB = "Crabe"; - CROCOLISK = "Crocilisque"; - GORILLA = "Gorille"; - HYENA = "Hyène"; - OWL = "Chouette"; - RAPTOR = "Raptor"; - SCORPID = "Scorpide"; - SPIDER = "Araignée"; - TALLSTRIDER = "Haut-trotteur"; - TURTLE = "Tortue"; - WIND_SERPENT = "Serpent des vents"; - WOLF = "Loup"; - - FOM_PET_HUNGRY = "%s a faim!"; - FOM_PET_VERY_HUNGRY = "%s a très faim!"; - - FOM_OPTIONS_HEADER = "Feed-O-Matic Options"; - FOM_OPTIONS_GENERAL = "Options générales:"; - FOM_OPTIONS_FOOD_CHOICE = "Eviter la nourriture utilisée en cuisine:"; - FOM_OPTIONS_FEED_NOTIFY = "Prévenir lorsque votre familier est nourrit:"; - FOM_OPTIONS_WARNING = "Avertir quand votre familier a besoin d'être nourrit:"; - - FOM_KEEPOPEN = "Essayer de garder au moins"; - FOM_KEEPOPEN_SLOTS = "emplacements de sac libres"; - FOM_KEEPOPEN_INFO = "(Le familier choisira la nourriture des piles les plus petites, sans tenir compte de ses préférences.)"; - - FOM_OptionsButtonText = { - ["Tooltip"] = "Afficher l'avis de votre familier concernant la nourriture", - ["AvoidQuestFood"] = "Eviter la nourriture utile dans les quêtes", - ["AvoidBonusFood"] = "Eviter la nourriture donnant un bonus", - ["PreferHigherQuality"] = "Privilégier la nourriture que votre familier préfère", - ["Fallback"] = "Utiliser la nourriture évitée s'il n'y en a plus d'autres", - ["SaveForCook_All"] = "Toutes nourritures utilisées pour la cuisine", - ["SaveForCook_Green"] = "si elle est utilisée dans les recettes |cff3fbf3f\"faciles\"|r ou supérieures", - ["SaveForCook_Yellow"] = "si elle est utilisée dans les recettes |cffffff00\"moyennes\"|r ou supérieures", - ["SaveForCook_Orange"] = "si elle est utilisée dans les recettes |cffff7f3f\"difficiles\"|r", - ["SaveForCook_None"] = "Ne pas éviter la nourriture utilisée en cuisine", - ["IconWarning"] = "Clignoter l'icône", - ["TextWarning"] = "Afficher un texte", - ["AudioWarning"] = "Jouer un son", - ["AudioWarningBell"] = "Un son de cloche au lieu du cri du familier", - ["AlertEmote"] = "Via emote (visible par les autres)", - ["AlertChat"] = "Dans la fenêtre de discussion (visible uniquement par vous)", - ["AlertNone"] = "Ne pas prévenir", - ["LevelContent"] = "quand \"content\"", - ["LevelUnhappy"] = "quand \"mécontent\"", - ["LevelOff"] = "Ne pas avertir", - }; -end - ------------------------------------------------------- - if (GetLocale() == "deDE") then -- Diet names. These should be the all-lowercase versions of the six diets returned from GetPetFoodTypes(). (Want to get them all nice and quick for your localization? Go tame a bear... they eat anything.) @@ -279,26 +175,4 @@ if (GetLocale() == "deDE") then WIND_SERPENT = "Windnatter"; -- WOLF = "Wolf"; -- same as enUS -end - ------------------------------------------------------- - -if (GetLocale() == "koKR") then - --- Diet names. These should be the all-lowercase versions of the six diets returned from GetPetFoodTypes(). (Want to get them all nice and quick for your localization? Go tame a bear... they eat anything.) --- THESE STRINGS MUST BE LOCALIZED for Feed-O-Matic to work properly in other locales. --- FOM_DIET_MEAT = "meat"; --- FOM_DIET_FISH = "fish"; --- FOM_DIET_BREAD = "bread"; --- FOM_DIET_CHEESE = "cheese"; --- FOM_DIET_FRUIT = "fruit"; --- FOM_DIET_FUNGUS = "fungus"; - - -- If the player has a buff whose icon name contains "Ability_Mount" and whose name contains one of these substrings, we assume the player is mounted. We have to use this rather oblique way to check for mounted because some other buffs use the Ability_Mount_* icons. --- FOM_MOUNT_NAME_SUBSTRINGS = { "kodo", "wolf", "raptor", "steed", "horse", "ram", "saber", "mechanostrider" }; - - -- It's not clear whether the 5th and 6th returns from GetItemInfo() are supposed to be localized... so we have localized keys for them just in case. --- FOM_AMMO_POUCH = "Ammo Pouch"; - FOM_QUIVER = "화살통"; - end \ No newline at end of file diff --git a/modules/feedomatic/module.lua b/modules/feedomatic/module.lua index c37f157..973119c 100644 --- a/modules/feedomatic/module.lua +++ b/modules/feedomatic/module.lua @@ -6,7 +6,7 @@ local MTH_FeedOMatic = { name = "feedomatic", enabled = false, - version = "1.1.0", + version = "1.2.0", events = { "VARIABLES_LOADED", "MERCHANT_SHOW", @@ -32,7 +32,7 @@ local MTH_FeedOMatic = { } local MTH_PETL_HOOK_BOUNDARY_KEY = "pet-lifecycle-hooks" -local MTH_FeedOMatic_MerchantProbeFrame = nil +local MTH_FOM_MerchantProbe = nil function MTH_FeedOMatic_OnUpdate(elapsed) if not elapsed then @@ -47,7 +47,7 @@ function MTH_FeedOMatic_OnUpdate(elapsed) end local function MTH_FeedOMatic_GetRuntimeFrame() - return getglobal("Frame_GFW_FeedOMatic") + return getglobal("MTH_FOM_OnUpdateFrame") end local function MTH_FeedOMatic_CaptureHookBoundary() @@ -216,16 +216,16 @@ end local function MTH_FeedOMatic_SetMerchantProbeEnabled(enabled) if not enabled then - if MTH_FeedOMatic_MerchantProbeFrame then - MTH_FeedOMatic_MerchantProbeFrame:UnregisterEvent("MERCHANT_SHOW") - MTH_FeedOMatic_MerchantProbeFrame:UnregisterEvent("MERCHANT_UPDATE") + if MTH_FOM_MerchantProbe then + MTH_FOM_MerchantProbe:UnregisterEvent("MERCHANT_SHOW") + MTH_FOM_MerchantProbe:UnregisterEvent("MERCHANT_UPDATE") end return end - if not MTH_FeedOMatic_MerchantProbeFrame then - MTH_FeedOMatic_MerchantProbeFrame = CreateFrame("Frame", "MTH_FeedOMatic_MerchantProbeFrame") - MTH_FeedOMatic_MerchantProbeFrame:SetScript("OnEvent", function() + if not MTH_FOM_MerchantProbe then + MTH_FOM_MerchantProbe = CreateFrame("Frame", "MTH_FOM_MerchantProbe") + MTH_FOM_MerchantProbe:SetScript("OnEvent", function() local evt = event if evt == "MERCHANT_SHOW" or evt == "MERCHANT_UPDATE" then MTH_FeedOMatic_Log("probe event received: " .. tostring(evt), "debug") @@ -234,8 +234,8 @@ local function MTH_FeedOMatic_SetMerchantProbeEnabled(enabled) end) end - MTH_FeedOMatic_MerchantProbeFrame:RegisterEvent("MERCHANT_SHOW") - MTH_FeedOMatic_MerchantProbeFrame:RegisterEvent("MERCHANT_UPDATE") + MTH_FOM_MerchantProbe:RegisterEvent("MERCHANT_SHOW") + MTH_FOM_MerchantProbe:RegisterEvent("MERCHANT_UPDATE") MTH_FeedOMatic_Log("merchant probe enabled", "debug") end @@ -277,8 +277,8 @@ function MTH_FeedOMatic:setEnabled(enabled) MTH_FeedOMatic_SyncSavedVariables() MTH_FeedOMatic_EnsureVariablesLoaded(self) MTH_FeedOMatic_SetMerchantProbeEnabled(false) - if FOM_FeedButton then - FOM_FeedButton:Show() + if MTH_FOM_FeedButton then + MTH_FOM_FeedButton:Show() end else -- Disable FeedOMatic functionality @@ -287,8 +287,8 @@ function MTH_FeedOMatic:setEnabled(enabled) FOM_State.ShouldFeed = false end MTH_FeedOMatic_SetMerchantProbeEnabled(false) - if FOM_FeedButton then - FOM_FeedButton:Hide() + if MTH_FOM_FeedButton then + MTH_FOM_FeedButton:Hide() end end end @@ -316,8 +316,8 @@ function MTH_FeedOMatic:cleanup() FOM_State.ShouldFeed = false end MTH_FeedOMatic_SetMerchantProbeEnabled(false) - if FOM_FeedButton then - FOM_FeedButton:Hide(); + if MTH_FOM_FeedButton then + MTH_FOM_FeedButton:Hide(); end end diff --git a/modules/feedomatic/runtime.xml b/modules/feedomatic/runtime.xml index c8af4c5..fd9fe9a 100644 --- a/modules/feedomatic/runtime.xml +++ b/modules/feedomatic/runtime.xml @@ -3,7 +3,7 @@ FeedOMatic Runtime Frame Loader (MetaHunt) Minimal runtime XML without legacy options window definitions. --> - + if (MTH_FOM_OnUpdate) then @@ -15,7 +15,7 @@ Minimal runtime XML without legacy options window definitions. -