From 2c94650993037ad3d3b14e0768eb318f686abb7c Mon Sep 17 00:00:00 2001 From: DuvelCorp Date: Fri, 27 Feb 2026 18:57:24 +0100 Subject: [PATCH] v1.0.4 --- .gitignore | 6 + MetaHunt.toc | 6 +- README.MD | 39 +- api/constants.lua | 8 +- api/core-framework.lua | 94 +- api/core-scan-beasttraining.lua | 51 +- api/core-scan-spellbookpet.lua | 8 +- api/core-scan-stablemaster.lua | 6 +- api/core.lua | 10 +- api/debug-frame.lua | 25 +- api/hunterbook-tab-beastlore.lua | 7 +- api/hunterbook-tab-npcfinder.lua | 9 +- api/hunterbook-tab-weapons.lua | 72 +- api/hunterbook.lua | 517 +- api/hunterbook.xml | 30 +- api/localization.lua | 417 +- api/map-markers.lua | 24 +- api/minimap-button.lua | 15 +- api/options-autobuy.lua | 15 +- api/options-chronometer.lua | 81 +- api/options-credits.lua | 51 +- api/options-feedomatic.lua | 89 +- api/options-shell.lua | 31 +- api/options-tree.lua | 4 + api/options-zbuttons.lua | 300 +- api/options.xml | 2 + api/version-check.lua | 179 + data/ds-bags.lua | 1513 ++ data/ds-beasts-extra.lua | 2 +- data/ds-items-origins.lua | 17889 +++++++++++++++++++++ data/ds-items.lua | 7 - data/init.lua | 79 + init/api.xml | 2 + init/localization.xml | 38 + locales/data/beasts/deDE.lua | 713 + locales/data/beasts/enUS.lua | 9 + locales/data/beasts/esES.lua | 713 + locales/data/beasts/ptBR.lua | 713 + locales/data/beasts/ruRU.lua | 573 + locales/data/beasts/zhCN.lua | 713 + locales/data/items/deDE.lua | 331 + locales/data/items/enUS.lua | 331 + locales/data/items/esES.lua | 331 + locales/data/items/ptBR.lua | 331 + locales/data/items/ruRU.lua | 268 + locales/data/items/zhCN.lua | 331 + locales/data/vendors/deDE.lua | 327 + locales/data/vendors/enUS.lua | 334 + locales/data/vendors/esES.lua | 327 + locales/data/vendors/ptBR.lua | 327 + locales/data/vendors/ruRU.lua | 230 + locales/data/vendors/zhCN.lua | 327 + locales/init.lua | 4 + locales/spells/deDE.lua | 46 + locales/spells/enUS.lua | 46 + locales/spells/esES.lua | 46 + locales/spells/ptBR.lua | 46 + locales/spells/ruRU.lua | 46 + locales/spells/zhCN.lua | 46 + locales/ui/deDE.lua | 6 + locales/ui/enUS.lua | 131 + locales/ui/esES.lua | 5 + locales/ui/ptBR.lua | 5 + locales/ui/ruRU.lua | 5 + locales/ui/zhCN.lua | 5 + modules/autobuy/engine.lua | 212 +- modules/autobuy/module.lua | 2 +- modules/chronometer/data-hunter.lua | 7 + modules/chronometer/module.lua | 2 +- modules/feedomatic/FeedOMatic.lua | 12 +- modules/feedomatic/module.lua | 2 +- modules/smartammo/engine.lua | 190 +- modules/smartammo/module.lua | 16 +- modules/tooltips/module.lua | 2 +- modules/zhunter/DeferredInit.lua | 13 +- modules/zhunter/ZSpellButtonTemplate.lua | 76 +- modules/zhunter/loader.xml | 3 + modules/zhunter/module.lua | 48 +- modules/zhunter/zButtonAmmo.lua | 202 +- modules/zhunter/zButtonAspect.lua | 50 +- modules/zhunter/zButtonPet.lua | 155 +- modules/zhunter/zButtonRanged.lua | 717 + modules/zhunter/zButtonRanged.xml | 14 + modules/zhunter/zButtonTrack.lua | 1 + modules/zhunter/zButtonTrap.lua | 1 + 85 files changed, 30197 insertions(+), 820 deletions(-) create mode 100644 api/version-check.lua create mode 100644 data/ds-bags.lua create mode 100644 data/ds-items-origins.lua create mode 100644 init/localization.xml create mode 100644 locales/data/beasts/deDE.lua create mode 100644 locales/data/beasts/enUS.lua create mode 100644 locales/data/beasts/esES.lua create mode 100644 locales/data/beasts/ptBR.lua create mode 100644 locales/data/beasts/ruRU.lua create mode 100644 locales/data/beasts/zhCN.lua create mode 100644 locales/data/items/deDE.lua create mode 100644 locales/data/items/enUS.lua create mode 100644 locales/data/items/esES.lua create mode 100644 locales/data/items/ptBR.lua create mode 100644 locales/data/items/ruRU.lua create mode 100644 locales/data/items/zhCN.lua create mode 100644 locales/data/vendors/deDE.lua create mode 100644 locales/data/vendors/enUS.lua create mode 100644 locales/data/vendors/esES.lua create mode 100644 locales/data/vendors/ptBR.lua create mode 100644 locales/data/vendors/ruRU.lua create mode 100644 locales/data/vendors/zhCN.lua create mode 100644 locales/init.lua create mode 100644 locales/spells/deDE.lua create mode 100644 locales/spells/enUS.lua create mode 100644 locales/spells/esES.lua create mode 100644 locales/spells/ptBR.lua create mode 100644 locales/spells/ruRU.lua create mode 100644 locales/spells/zhCN.lua create mode 100644 locales/ui/deDE.lua create mode 100644 locales/ui/enUS.lua create mode 100644 locales/ui/esES.lua create mode 100644 locales/ui/ptBR.lua create mode 100644 locales/ui/ruRU.lua create mode 100644 locales/ui/zhCN.lua create mode 100644 modules/zhunter/zButtonRanged.lua create mode 100644 modules/zhunter/zButtonRanged.xml diff --git a/.gitignore b/.gitignore index 87b4ca5..0af11ef 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,9 @@ # Keep this ignore file tracked !.gitignore + +# Exclude non-runtime localization helper artifacts +tools/ +LOC*.md +LOCALIZATION*.md +CHANGELOG.md diff --git a/MetaHunt.toc b/MetaHunt.toc index b8e261d..009c157 100644 --- a/MetaHunt.toc +++ b/MetaHunt.toc @@ -1,7 +1,7 @@ ## Interface: 11200 -## Version: 1.0.3 +## Version: 1.0.4 ## Title: MetaHunt - |cff00ff00Hunter -## Author: Metasploit +## 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. ## SavedVariables: MTH_SavedVariables, FOM_Config, FOM_FoodQuality, FOM_AddedFoods, FOM_RemovedFoods, FOM_Cooking, FOM_QuestFood, FOM_LocaleInfo ## SavedVariablesPerCharacter: ZHunterMod_Saved, MTH_CharSavedVariables @@ -26,6 +26,8 @@ data\ds-vendors.lua data\ds-vendors-extra.lua data\ds-items.lua data\ds-items-extra.lua +data\ds-items-origins.lua +data\ds-bags.lua data\ds-items-atlas-sources.lua data\ds-zones.lua data\ds-zones-fallback.lua diff --git a/README.MD b/README.MD index ec51590..0db418d 100644 --- a/README.MD +++ b/README.MD @@ -1,11 +1,12 @@ # MetaHunt MetaHunt is a Turtle WoW Hunter toolkit. -It combines never seen pet-centric features and revives old broken hunter add-ons. +It combines never-seen pet-centric and beast tracking features, and revives old broken hunter add-ons. +It provides usefull tools for all hunters, wheter they are still leveling, lone-wolf, or HL raider. ## Twow Data -Metahunt ships with larges up-to-date datastores for all data a hunter needs : +Metahunt ships with larges up-to-date datastores for all Turtle WOW data a hunter needs : - All beasts, their location, and the abilities they can learn you - All Pet families, their abilities and their diet @@ -14,16 +15,21 @@ Metahunt ships with larges up-to-date datastores for all data a hunter needs : - All Stable, Hunter and Pet Masters - All Ammo vendors - ## Smart Ammo -Auto swap your main ammo to junk ammo for shots that doesn't scale on damage, and re-equip you main ammo right away. +- Auto swap your main ammo to junk ammo for shots that doesn't scale on damage, and re-equip you main ammo right away. Don't waste your Doomshots on nothing anymore, save money ! +- Auto equip another ammo instantly during combat whenever you get out of your current ammo. +- Auto equip the right ammo when you swap from a box/xbow to a gun and the other way around. -# Tooltips + + ## Tooltips - Get enhanced tooltips on beasts, ammo vendors, and your pet. + Get enhanced mouseover tooltips on : + - Beasts : Shows which abilities a beast can teach. They appear green if you already know them, and red if not. + - Vendors : Shows if a vendor sells Arrows and/or Bullets. + - Your pet : Shows your pet's XP, loyalty, happiness and how much you fed it this session. -# zBouttons + ## zBouttons Old zHunterMod addon on steroids. Fully compatible with Twow, and enhanced with new functionalities @@ -31,22 +37,27 @@ Old zHunterMod addon on steroids. Fully compatible with Twow, and enhanced with - zPet : Intelligent collapsible pet Bar regrouping all pet spells and providing an intelligent button that always show you the right spell to use depending on the situation - zTrack: All your trackings in one collapsible bar - zAspect: All your trackings in one collapsible bar +- zRanged : All the rnaged weampons currently in your bags to swap them fast - But also zMounts, zToys and zCompanions. -# Feed-O-Matic + ## Feed-O-Matic + Now compatible with Turtle, feed your pet with one key bind, it will always pickup the best food for your pet. -# Chronometer + ## Chronometer The good old Chronometer addon, purged of non-necessary things and reconfigured for a pure hunter use. -# Autobuy + ## Autobuy -Define your own simple rules for auto buy ammo and pet food. +Define your own simple rules for auto buy ammo and pet food when you open a vendor. -# The book of Hunters -- Browse the Metahunt datastores of NPCs and open the map to locate them like in pfQuest + ## The book of Hunters + + The book of Hunters is the main GUI of Metahunt, it allows to display the data constantly collected about you and your pet, and browse the addon's data to find anything a Hunter needs. + +- Browse the Metahunt datastores of NPCs (Beast, vendors, masters) and open the map to locate them like in pfQuest - Track all info about the pet abilities that you know and don't know yet - Track all info about your stabled pets -- Keeep an history of all your pets after you abbandon them +- Keep an history of all your pets after you abandon them or if they run away. diff --git a/api/constants.lua b/api/constants.lua index f428a6a..a9081e5 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.0.3" +MTH_CONST.version = MTH_CONST.version or "1.0.4" MTH_CONST.WEAPON_TYPES = { BOWS = "Bows", @@ -18,7 +18,7 @@ MTH_CONST.AMMO = { SOLID = "Solid Shot", CRAFTSOLID = "Crafted Solid Shot", EXPLODING = "Exploding Shot", - MITHRILSLUG = "Hi-impact Mithril Slugs", + MITHRILSLUG = "Hi-Impact Mithril Slugs", ACCURATE = "Accurate Slugs", GYROSHOT = "Mithril Gyro-Shot", ICETHREADED = "Ice Threaded Bullet", @@ -86,6 +86,8 @@ JUNKSHOT_VIPER = MTH_CONST.AMMO.JUNKSHOTS.VIPER JUNKSHOT_ARCANE = MTH_CONST.AMMO.JUNKSHOTS.ARCANE JUNKSHOT_CONCUSSIVE = MTH_CONST.AMMO.JUNKSHOTS.CONCUSSIVE JUNKSHOT_DISTRACTING = MTH_CONST.AMMO.JUNKSHOTS.DISTRACTING +JUNKSHOT_BAITED = MTH_CONST.AMMO.JUNKSHOTS.BAITED +JUNKSHOT_TRANQ = MTH_CONST.AMMO.JUNKSHOTS.TRANQ MTH_AMMO_BULLETS = { BULLETS_LIGHT, @@ -125,6 +127,8 @@ MTH_AMMO_JUNKSHOTS = { JUNKSHOT_ARCANE, JUNKSHOT_CONCUSSIVE, JUNKSHOT_DISTRACTING, + JUNKSHOT_BAITED, + JUNKSHOT_TRANQ, } MTH_AMMO_BULLET_RANK = {} diff --git a/api/core-framework.lua b/api/core-framework.lua index 818d7dd..ec278f4 100644 --- a/api/core-framework.lua +++ b/api/core-framework.lua @@ -1,5 +1,5 @@ MTH = MTH or { - version = "1.0.3", + version = "1.0.4", name = "MetaHunt", modules = {}, config = {}, @@ -8,6 +8,15 @@ MTH = MTH or { local MTH_CHAT_PREFIX = "|cFFFFFFFF[|r|cFFD14A4AMeta|r|cFFABD473Hunt|r|cFFFFFFFF]|r " local MTH_NON_HUNTER_BLOCK_MESSAGE = "You are not a hunter and you are not allowed here. Disable the add-on for this character." +local MTH_MESSAGE_DEFAULTS = { + initModulesLoaded = false, + initSarcasticWelcome = true, + petHungry = false, + beastTrainingScan = true, + spellbookScan = false, + petRanAway = true, + mapMarkers = true, +} local function MTH_ClassGateTrace(_step, _detail) return @@ -1003,6 +1012,50 @@ function MTH:Print(msg, severity) return self:Log(msg, severity) end +function MTH:GetMessageSettings() + if not MTH_SavedVariables then + self:InitSavedVariables() + end + if type(MTH_SavedVariables.messages) ~= "table" then + MTH_SavedVariables.messages = {} + end + local settings = MTH_SavedVariables.messages + for key, defaultValue in pairs(MTH_MESSAGE_DEFAULTS) do + if settings[key] == nil then + settings[key] = defaultValue and true or false + else + settings[key] = settings[key] and true or false + end + end + return settings +end + +function MTH:IsMessageEnabled(key, defaultEnabled) + local settings = self:GetMessageSettings() + local value = settings and settings[key] + if value == nil then + if defaultEnabled ~= nil then + value = defaultEnabled and true or false + else + value = true + end + settings[key] = value + end + return value and true or false +end + +function MTH:SetMessageEnabled(key, enabled) + if type(key) ~= "string" or key == "" then + return false + end + local settings = self:GetMessageSettings() + if not settings then + return false + end + settings[key] = enabled and true or false + return true +end + function MTH:DebugPrint(msg) if self.debug then self:Print("[DEBUG] " .. tostring(msg), "debug") @@ -1080,6 +1133,16 @@ function MTH:InitSavedVariables() if not MTH_SavedVariables.modules.zhunter then MTH_SavedVariables.modules.zhunter = MTH_SavedVariables.zhunter or {} end + if type(MTH_SavedVariables.messages) ~= "table" then + MTH_SavedVariables.messages = {} + end + for key, defaultValue in pairs(MTH_MESSAGE_DEFAULTS) do + if MTH_SavedVariables.messages[key] == nil then + MTH_SavedVariables.messages[key] = defaultValue and true or false + else + MTH_SavedVariables.messages[key] = MTH_SavedVariables.messages[key] and true or false + end + end MTH_SavedVariables.feedomatic = MTH_SavedVariables.modules.feedomatic MTH_SavedVariables.zhunter = MTH_SavedVariables.modules.zhunter @@ -1249,7 +1312,9 @@ function MTH:AnnounceLoadComplete() end self:Print("Check ignition: OK! Version " .. tostring(self.version or "unknown") .. " loaded.") - --self:Print("Modules enabled : " .. moduleList .. ".") + if self:IsMessageEnabled("initModulesLoaded", false) then + self:Print("Modules enabled : " .. moduleList .. ".") + end local petTrainingStore = nil if type(MTH_PETS_GetRootStore) == "function" then @@ -1284,8 +1349,10 @@ function MTH:AnnounceLoadComplete() end end if not hasCompletedPetScan then - local playerLevel = (type(UnitLevel) == "function") and (tonumber(UnitLevel("player")) or 0) or 0 - if playerLevel >= 12 then + local rawPlayerLevel = (type(UnitLevel) == "function") and UnitLevel("player") or nil + local playerLevel = tonumber(rawPlayerLevel) or 0 + local shouldShowBeastTrainingReminder = (playerLevel >= 12 and playerLevel <= 60) + if shouldShowBeastTrainingReminder then self:Print("You should open your Beast Training once to save your learned pet abilities.") self._loadCompleteAnnounced = true return @@ -1293,7 +1360,7 @@ function MTH:AnnounceLoadComplete() end local welcomeMessages = { - "You are now shipping the latest cutting edge technology.", + "You are now shipping the latest cutting-edge Nelf technology.", "SHELLS ARE FOR PUSSIES.", "Sometimes, you just need a little less gun.", "Repeat 5 times : \"Un chasseur sachant chasser sans son chien\".", @@ -1380,6 +1447,19 @@ function MTH:AnnounceLoadComplete() "Your pet follows orders. Pathing follows dark magic.", "Today’s objective: hit crits and dodge responsibility.", "Go forth, badboy ranger — leave footprints, not explanations.", + "MetaHunt loaded. Your plan has been forwarded to Quality Control for comedy review.", + "Systems online. Tactical brilliance still listed as a future expansion feature.", + "Hunter detected. Restraint not detected.", + "Startup complete. Your pet is the adult in this relationship.", + "All modules green. Your target selection remains performance art.", + "Welcome back. The dungeon requested a waiver after seeing your login.", + "Interface stable. Decision-making unstable. Proceed.", + "MetaHunt armed. Your confidence has entered the area without supervision.", + "Ready to hunt. Ready to kite. Not ready to explain any of it.", + "Boot successful. Friendly fire is still technically ‘friendly.’", + "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.", } local welcomeIndex = 1 @@ -1391,7 +1471,9 @@ function MTH:AnnounceLoadComplete() welcomeIndex = math.random(1, welcomeCount) end end - self:Print(welcomeMessages[welcomeIndex]) + if self:IsMessageEnabled("initSarcasticWelcome", true) then + self:Print(welcomeMessages[welcomeIndex]) + end self._loadCompleteAnnounced = true end diff --git a/api/core-scan-beasttraining.lua b/api/core-scan-beasttraining.lua index fe41d1b..f29b5a7 100644 --- a/api/core-scan-beasttraining.lua +++ b/api/core-scan-beasttraining.lua @@ -167,9 +167,14 @@ function MTH_PT_HasBeastTrainingRows() end local function MTH_PT_DebugLog(line) - if not MTH_PT_VERBOSE_SCAN_LOGS then return end - local text = "[TRAINSCAN] " .. tostring(line or "") - MTH:Print(text, "debug") + return +end + +local function MTH_PT_IsScanMessageEnabled() + if not (MTH and MTH.IsMessageEnabled) then + return true + end + return MTH:IsMessageEnabled("beastTrainingScan", true) end local function MTH_PT_MakeTokenFromAbilityRank(abilityName, rankNumber) @@ -382,10 +387,12 @@ local function MTH_PT_ProcessLearnSystemMessage(rawMessage) label = label .. " (Rank " .. tostring(rankNumber) .. ")" end if MTH and MTH.Print then - if changed then - MTH:Print("Pet ability learned and recorded: " .. label .. ". It is now marked as known in MetaHunt.") - else - MTH:Print("Pet ability learned for current pet: " .. label .. ".") + if MTH:IsMessageEnabled("beastTrainingScan", true) then + if changed then + MTH:Print("Pet ability learned and recorded: " .. label .. ". It is now marked as known in MetaHunt.") + else + MTH:Print("Pet ability learned for current pet: " .. label .. ".") + end end end if changed then @@ -605,18 +612,24 @@ function MTH_PT_ApplyScan(triggerReason) for _ in pairs(baseSet) do totalBaselines = totalBaselines + 1 end if triggerReason == "initial" then - MTH:Print("Initial train scan complete: " .. tostring(totalBaselines) .. " baselines / " .. tostring(totalRanks) .. " ranks recorded for this character.") + if MTH_PT_IsScanMessageEnabled() then + MTH:Print("Initial train scan complete: " .. tostring(totalBaselines) .. " baselines / " .. tostring(totalRanks) .. " ranks recorded for this character.") + end elseif added > 0 then table.sort(addedDetails) local detailsText = table.concat(addedDetails, ", ") if detailsText ~= "" then local msg = "New pet data recorded (" .. tostring(added) .. " new rank(s)): " .. detailsText .. ". Known totals for this character: " .. tostring(totalBaselines) .. " ability type(s), " .. tostring(totalRanks) .. " rank(s)." - MTH:Print(msg) - MTH:Print("INFO: " .. msg, "debug") + if MTH_PT_IsScanMessageEnabled() then + MTH:Print(msg) + MTH:Print("INFO: " .. msg, "debug") + end else local msg = "New pet data recorded (" .. tostring(added) .. " new rank(s)). Known totals for this character: " .. tostring(totalBaselines) .. " ability type(s), " .. tostring(totalRanks) .. " rank(s)." - MTH:Print(msg) - MTH:Print("INFO: " .. msg, "debug") + if MTH_PT_IsScanMessageEnabled() then + MTH:Print(msg) + MTH:Print("INFO: " .. msg, "debug") + end end end @@ -657,7 +670,7 @@ local function MTH_PT_RunDoubleScan(triggerBase) if MTH_PT_DebugLog then MTH_PT_DebugLog("scan skipped: no beast-training rows, trigger=" .. tostring(triggerBase or "")) end - if feedbackOnOpen and MTH and MTH.Print then + if feedbackOnOpen and MTH and MTH.Print and MTH_PT_IsScanMessageEnabled() then MTH:Print("Beast Training opened, but scan did not run yet (no scannable rows detected).") end return false @@ -670,7 +683,7 @@ local function MTH_PT_RunDoubleScan(triggerBase) if MTH_PT_DebugLog then MTH_PT_DebugLog("scan complete: trigger=" .. tostring(triggerBase or "") .. " ok=" .. tostring(ok and true or false) .. " dt=" .. tostring((t1 or 0) - (t0 or 0)) .. "s") end - if feedbackOnOpen and MTH and MTH.Print then + if feedbackOnOpen and MTH and MTH.Print and MTH_PT_IsScanMessageEnabled() then if ok then local addedCount = tonumber(added) or 0 local msg = "Beast Training scan complete: " .. tostring(baselines or 0) .. " baselines / " .. tostring(ranks or 0) .. " ranks." @@ -711,16 +724,22 @@ local function MTH_PT_OnEvent(_, evt, eventArg1) end if evt == "PLAYER_ENTERING_WORLD" then + local playerLevel = 0 + if type(UnitLevel) == "function" then + playerLevel = tonumber(UnitLevel("player")) or 0 + end if UnitClass then local _, classToken = UnitClass("player") if classToken ~= "HUNTER" then return end end - if not MTH_PT_HasAnyLearnedSpells() then + if playerLevel >= 12 and not MTH_PT_HasAnyLearnedSpells() then local store = MTH_PT_GetStore() local now = time() if not store.lastPrompt or (now - store.lastPrompt) > 60 then store.lastPrompt = now - MTH:Print("No Beast Training scan found for this character. Open Beast Training (right panel) to record pet spell ranks.") + if MTH_PT_IsScanMessageEnabled() then + MTH:Print("No Beast Training scan found for this character. Open Beast Training (right panel) to record pet spell ranks.") + end end end return diff --git a/api/core-scan-spellbookpet.lua b/api/core-scan-spellbookpet.lua index 1d9dae2..73b39b1 100644 --- a/api/core-scan-spellbookpet.lua +++ b/api/core-scan-spellbookpet.lua @@ -284,11 +284,15 @@ function MTH_CommandPetSpellScan() local ok, count, changed = MTH_PS_ScanNow("manual") if not ok then - MTH:Print("Pet spellbook scan failed.") + if not (MTH and MTH.IsMessageEnabled) or MTH:IsMessageEnabled("spellbookScan", false) then + MTH:Print("Pet spellbook scan failed.") + end MTH_PS_VERBOSE_LOGS = false return end - MTH:Print("Pet spellbook scan: " .. tostring(count or 0) .. " spell(s). changed=" .. tostring(changed and true or false)) + if not (MTH and MTH.IsMessageEnabled) or MTH:IsMessageEnabled("spellbookScan", false) then + MTH:Print("Pet spellbook scan: " .. tostring(count or 0) .. " spell(s). changed=" .. tostring(changed and true or false)) + end local store = MTH_PS_GetStore() MTH_PS_DebugPrint("Store status: lastScan=" .. tostring(store.lastScan or 0) .. " lastCount=" .. tostring(store.lastCount or 0) .. " lastTrigger=" .. tostring(store.lastTrigger or "") .. " lastChangeAt=" .. tostring(store.lastChangeAt or 0), true) MTH_PS_VERBOSE_LOGS = false diff --git a/api/core-scan-stablemaster.lua b/api/core-scan-stablemaster.lua index 86cae12..1cad6a7 100644 --- a/api/core-scan-stablemaster.lua +++ b/api/core-scan-stablemaster.lua @@ -1267,7 +1267,7 @@ local function MTH_PETS_ApplySnapshotToRow(row, snapshot, source, context) or tonumber(row.tamedAt) ~= nil or tonumber(row.tameBeastId) ~= nil or (type(row.tameZone) == "string" and row.tameZone ~= "") - if not hasTameRecord then + if not hasTameRecord and hasPendingTame then local sourceText = tostring(source or "") if sourceText == "unit-pet-acquire" or sourceText == "refresh-current-pet" then row.tameRecorded = true @@ -1758,7 +1758,9 @@ function MTH_PETS_RecordPetRunaway(source, rawMessage) if MTH and MTH.Print then local displayName = MTH_PETS_NormalizeText(petName) if displayName == "" then displayName = "Unknown" end - MTH:Print("YOUR PET " .. tostring(displayName) .. " HAS RUNAWAY FOREVER :-( Try to feed it better next time.") + if MTH:IsMessageEnabled("petRanAway", true) then + MTH:Print("YOUR PET " .. tostring(displayName) .. " HAS RUNAWAY FOREVER :-( Try to feed it better next time.") + end end return true diff --git a/api/core.lua b/api/core.lua index 84c15bd..ffadf0a 100644 --- a/api/core.lua +++ b/api/core.lua @@ -224,7 +224,9 @@ end if type(MTH_CommandPetSpellScan) ~= "function" then function MTH_CommandPetSpellScan() local ok, count = MTH_PS_ScanNow("manual-core-fallback") - MTH:Print("Pet spellbook scan: " .. tostring(count or 0) .. " spell(s). ok=" .. tostring(ok and true or false)) + if not (MTH and MTH.IsMessageEnabled) or MTH:IsMessageEnabled("spellbookScan", false) then + MTH:Print("Pet spellbook scan: " .. tostring(count or 0) .. " spell(s). ok=" .. tostring(ok and true or false)) + end end end @@ -243,6 +245,12 @@ function SlashCmdList.MTH(msg, editbox) MTH_CommandOptions() elseif lowerMsg == "book" or lowerMsg == "hunterbook" then MTH_CommandBook() + elseif lowerMsg == "err" then + if MTH_DebugFrame and type(MTH_DebugFrame.Toggle) == "function" then + MTH_DebugFrame:Toggle() + else + MTH:Print("Debug frame is not available yet") + end else MTH:Print("Unknown command: " .. tostring(msg)) MTH:Print("Available: /mth options, /mth book") diff --git a/api/debug-frame.lua b/api/debug-frame.lua index 3219faa..63de1c7 100644 --- a/api/debug-frame.lua +++ b/api/debug-frame.lua @@ -15,6 +15,13 @@ MTH_DebugFrame = { infoCount = 0 } +local function MTH_DF_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + function MTH_DebugFrame:Initialize() if self.initialized then return @@ -57,14 +64,14 @@ function MTH_DebugFrame:Initialize() -- Title local title = self.frame:CreateFontString(nil, "OVERLAY", "GameFontNormalLarge") title:SetPoint("TOPLEFT", self.frame, "TOPLEFT", 20, -15) - title:SetText("MetaHunt Debug - Errors & Messages") + title:SetText(MTH_DF_L("DEBUG_TITLE", "MetaHunt Debug - Errors & Messages")) -- Close button local closeButton = CreateFrame("Button", nil, self.frame, "UIPanelButtonTemplate") closeButton:SetPoint("TOPRIGHT", self.frame, "TOPRIGHT", -8, -8) closeButton:SetWidth(22) closeButton:SetHeight(22) - closeButton:SetText("X") + closeButton:SetText(MTH_DF_L("COMMON_CLOSE_SHORT", "X")) closeButton:SetScript("OnClick", function() MTH_DebugFrame:Hide() end) -- Clear button @@ -72,7 +79,7 @@ function MTH_DebugFrame:Initialize() clearButton:SetPoint("BOTTOMLEFT", self.frame, "BOTTOMLEFT", 10, 10) clearButton:SetWidth(100) clearButton:SetHeight(25) - clearButton:SetText("Clear") + clearButton:SetText(MTH_DF_L("COMMON_CLEAR", "Clear")) clearButton:SetScript("OnClick", function() MTH_DebugFrame:Clear() end) -- Select-all button @@ -80,7 +87,7 @@ function MTH_DebugFrame:Initialize() copyButton:SetPoint("LEFT", clearButton, "RIGHT", 10, 0) copyButton:SetWidth(100) copyButton:SetHeight(25) - copyButton:SetText("Select All") + copyButton:SetText(MTH_DF_L("COMMON_SELECT_ALL", "Select All")) copyButton:SetScript("OnClick", function() MTH_DebugFrame:SelectAllText() end) -- Scroll frame + text content with proper vertical scrollbar @@ -179,9 +186,9 @@ function MTH_DebugFrame:UpdateDisplay() return end - local text = "=== Errors Captured: " .. self.captureCount .. " ===\n" - text = text .. "=== Info Captured: " .. (self.infoCount or 0) .. " ===\n" - text = text .. "=== Total in queue: " .. table.getn(self.errors) .. " ===\n\n" + local text = string.format(MTH_DF_L("DEBUG_SUMMARY_ERRORS", "=== Errors Captured: %s ==="), tostring(self.captureCount)) .. "\n" + text = text .. string.format(MTH_DF_L("DEBUG_SUMMARY_INFO", "=== Info Captured: %s ==="), tostring(self.infoCount or 0)) .. "\n" + text = text .. string.format(MTH_DF_L("DEBUG_SUMMARY_QUEUE", "=== Total in queue: %s ==="), tostring(table.getn(self.errors))) .. "\n\n" for i = 1, table.getn(self.errors) do local err = self.errors[i] @@ -238,7 +245,7 @@ function MTH_DebugFrame:Clear() self:UpdateDisplay() if self.initialized and self.isVisible then if MTH and MTH.Print then - MTH:Print("Debug frame cleared") + MTH:Print(MTH_DF_L("DEBUG_CLEARED", "Debug frame cleared")) end end end @@ -251,7 +258,7 @@ function MTH_DebugFrame:SelectAllText() self.scrollText:HighlightText(0, -1) self.scrollText:SetFocus() if MTH and MTH.Print then - MTH:Print("All text selected - press Ctrl+C to copy") + MTH:Print(MTH_DF_L("DEBUG_ALL_SELECTED", "All text selected - press Ctrl+C to copy")) end end diff --git a/api/hunterbook-tab-beastlore.lua b/api/hunterbook-tab-beastlore.lua index 896352c..62804db 100644 --- a/api/hunterbook-tab-beastlore.lua +++ b/api/hunterbook-tab-beastlore.lua @@ -238,7 +238,8 @@ function MTH_BOOK_BeastMatches(beastId, beast) end if MTH_BOOK_STATE.search ~= "" then - local name = MTH_BOOK_SafeLower(beast.name) + local localizedName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name + local name = MTH_BOOK_SafeLower(localizedName) local family = MTH_BOOK_SafeLower(beast.family) local idText = tostring(beastId) if string.find(name, MTH_BOOK_STATE.search, 1, true) == nil @@ -260,8 +261,8 @@ function MTH_BOOK_BeastSort(a, b) local la = MTH_BOOK_ParseLevel(ba.lvl) or 0 local lb = MTH_BOOK_ParseLevel(bb.lvl) or 0 if la ~= lb then return la < lb end - local na = ba.name or "" - local nb = bb.name or "" + local na = (MTH and MTH.GetLocalizedBeastName) and MTH:GetLocalizedBeastName(a, ba.name) or (ba.name or "") + local nb = (MTH and MTH.GetLocalizedBeastName) and MTH:GetLocalizedBeastName(b, bb.name) or (bb.name or "") if na ~= nb then return na < nb end return a < b end diff --git a/api/hunterbook-tab-npcfinder.lua b/api/hunterbook-tab-npcfinder.lua index 1803e9c..0a00c5a 100644 --- a/api/hunterbook-tab-npcfinder.lua +++ b/api/hunterbook-tab-npcfinder.lua @@ -168,7 +168,8 @@ function MTH_BOOK_NPCMatches(npcId, vendor) if MTH_BOOK_STATE.search ~= "" then local functionSummary = MTH_BOOK_GetNPCFunctionSummary(vendor) local firstZone, firstSubzone = MTH_BOOK_GetNPCZoneSummary(vendor) - local hay = MTH_BOOK_SafeLower(tostring(vendor.name or "") .. " " .. tostring(functionSummary or "") .. " " .. tostring(firstZone or "") .. " " .. tostring(firstSubzone or "") .. " " .. tostring(npcId)) + local displayName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(npcId, vendor.name)) or vendor.name + local hay = MTH_BOOK_SafeLower(tostring(displayName or "") .. " " .. tostring(functionSummary or "") .. " " .. tostring(firstZone or "") .. " " .. tostring(firstSubzone or "") .. " " .. tostring(npcId)) if string.find(hay, MTH_BOOK_STATE.search, 1, true) == nil then return false end @@ -182,8 +183,10 @@ function MTH_BOOK_NPCSort(a, b) local va = vendors and vendors[a] local vb = vendors and vendors[b] if not va or not vb then return a < b end - local na = MTH_BOOK_SafeLower(va.name) - local nb = MTH_BOOK_SafeLower(vb.name) + local vaName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(a, va.name)) or va.name + local vbName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(b, vb.name)) or vb.name + local na = MTH_BOOK_SafeLower(vaName) + local nb = MTH_BOOK_SafeLower(vbName) if na ~= nb then return na < nb end return a < b end diff --git a/api/hunterbook-tab-weapons.lua b/api/hunterbook-tab-weapons.lua index 835c1e1..73fb77b 100644 --- a/api/hunterbook-tab-weapons.lua +++ b/api/hunterbook-tab-weapons.lua @@ -15,10 +15,42 @@ MTH_HUNTERBOOK_TABS.items = { }, } +MTH_HUNTERBOOK_TABS.projectiles = { + headerLabel = "Projectiles", + columnLabels = { "ID", "Req", "Lvl", "Type", "Name", "DPS", "Source" }, + columnLayout = { + { x = 8, width = 36, align = "LEFT" }, + { x = 44, width = 30, align = "LEFT" }, + { x = 74, width = 30, align = "LEFT" }, + { x = 104, width = 62, align = "LEFT" }, + { x = 166, width = 228, align = "LEFT" }, + { x = 396, width = 44, align = "LEFT" }, + { x = 442, width = 110, align = "LEFT" }, + }, +} + +MTH_HUNTERBOOK_TABS.ammobags = { + headerLabel = "Ammo Bags", + columnLabels = { "ID", "Req", "Lvl", "Slots", "Type", "Name", "Source" }, + columnLayout = { + { x = 8, width = 40, align = "LEFT" }, + { x = 50, width = 36, align = "LEFT" }, + { x = 88, width = 34, align = "LEFT" }, + { x = 124, width = 42, align = "LEFT" }, + { x = 168, width = 80, align = "LEFT" }, + { x = 250, width = 192, align = "LEFT" }, + { x = 444, width = 108, align = "LEFT" }, + }, +} + function MTH_BOOK_NormalizeItemSubtype(value) local subtype = MTH_BOOK_SafeLower(value) + subtype = string.gsub(subtype, "^%s+", "") + subtype = string.gsub(subtype, "%s+$", "") if subtype == "arrows" then return "arrow" end if subtype == "bullets" then return "bullet" end + if subtype == "ammo pouch" or subtype == "ammo pouches" then return "ammopouch" end + if subtype == "quivers" then return "quiver" end if subtype == "bows" then return "bow" end if subtype == "rifle" or subtype == "rifles" then return "gun" end if subtype == "cross bow" or subtype == "cross-bow" or subtype == "crossbows" or subtype == "xbow" or subtype == "xbows" then return "crossbow" end @@ -29,11 +61,36 @@ function MTH_BOOK_IsRangedWeaponSubtype(subtype) return subtype == "bow" or subtype == "gun" or subtype == "crossbow" end +local function MTH_BOOK_IsProjectileSubtype(subtype) + return subtype == "arrow" or subtype == "bullet" +end + +local function MTH_BOOK_IsAmmoBagSubtype(subtype) + return subtype == "quiver" or subtype == "ammopouch" +end + function MTH_BOOK_ItemMatches(itemId, item) if not item then return false end if item.notingame then return false end local itemSubtype = MTH_BOOK_NormalizeItemSubtype(item.subtype) - if not MTH_BOOK_IsRangedWeaponSubtype(itemSubtype) then return false end + local rawSubtype = MTH_BOOK_SafeLower(item.subtype) + rawSubtype = string.gsub(rawSubtype, "^%s+", "") + rawSubtype = string.gsub(rawSubtype, "%s+$", "") + local mode = tostring(MTH_BOOK_STATE and MTH_BOOK_STATE.mode or "items") + if mode == "projectiles" then + if not MTH_BOOK_IsProjectileSubtype(itemSubtype) then return false end + elseif mode == "ammobags" then + local hasSlots = tonumber(item.slots) and tonumber(item.slots) > 0 + local looksLikeAmmoBag = MTH_BOOK_IsAmmoBagSubtype(itemSubtype) + or rawSubtype == "ammo pouch" + or rawSubtype == "ammo pouches" + or rawSubtype == "quiver" + or rawSubtype == "quivers" + or hasSlots + if not looksLikeAmmoBag then return false end + else + if not MTH_BOOK_IsRangedWeaponSubtype(itemSubtype) then return false end + end local selectedSubtype = MTH_BOOK_NormalizeItemSubtype(MTH_BOOK_STATE.itemSubtype) if selectedSubtype ~= "all" and itemSubtype ~= selectedSubtype then return false end if MTH_BOOK_STATE.itemOnlyMyLevel then @@ -48,11 +105,12 @@ function MTH_BOOK_ItemMatches(itemId, item) if MTH_BOOK_STATE.flag3 and not MTH_BOOK_HasEntries(item.objects) then return false end if MTH_BOOK_STATE.search ~= "" then - local name = MTH_BOOK_SafeLower(item.name) + local localizedName = (MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(itemId, item.name) + or item.name + local name = MTH_BOOK_SafeLower(localizedName) local idText = tostring(itemId) - if string.find(name, MTH_BOOK_STATE.search, 1, true) == nil and string.find(idText, MTH_BOOK_STATE.search, 1, true) == nil then - return false - end + if string.find(name, MTH_BOOK_STATE.search, 1, true) == nil and string.find(idText, MTH_BOOK_STATE.search, 1, true) == nil then return false end end return true @@ -66,8 +124,8 @@ function MTH_BOOK_ItemSort(a, b) local la = ia.level or 0 local lb = ib.level or 0 if la ~= lb then return la < lb end - local na = ia.name or "" - local nb = ib.name or "" + local na = (MTH and MTH.GetLocalizedItemName) and MTH:GetLocalizedItemName(a, ia.name) or (ia.name or "") + local nb = (MTH and MTH.GetLocalizedItemName) and MTH:GetLocalizedItemName(b, ib.name) or (ib.name or "") if na ~= nb then return na < nb end return a < b end diff --git a/api/hunterbook.lua b/api/hunterbook.lua index 927d420..f8d6116 100644 --- a/api/hunterbook.lua +++ b/api/hunterbook.lua @@ -8,6 +8,11 @@ local function MTH_BOOK_GetTabDefinition(mode) return MTH_HUNTERBOOK_TABS[tostring(mode or "")] end +local function MTH_BOOK_IsItemMode(mode) + local resolved = tostring(mode or (MTH_BOOK_STATE and MTH_BOOK_STATE.mode) or "") + return resolved == "items" or resolved == "projectiles" or resolved == "ammobags" +end + MTH_BOOK_Browser = nil local MTH_BOOK_RefreshFilter local MTH_BOOK_UpdateResults @@ -20,6 +25,31 @@ local MTH_BOOK_NPC_DATABASE_URL = "https://database.turtlecraft.gg/?npc=%d" local MTH_BOOK_ITEM_DATABASE_URL = "https://database.turtlecraft.gg/?item=%d" local MTH_BOOK_STABLE_CURRENT_ID_CACHE = nil +local MTH_BOOK_FALLBACK_BAG_ITEMS = { + [2101] = { name = "Light Quiver", subtype = "quiver", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=2101" }, + [2102] = { name = "Small Ammo Pouch", subtype = "ammo pouch", slots = 6, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=2102" }, + [2662] = { name = "Ribbly's Quiver", subtype = "quiver", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=2662" }, + [2663] = { name = "Ribbly's Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 50, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=2663" }, + [3573] = { name = "Hunting Quiver", subtype = "quiver", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=3573" }, + [3574] = { name = "Hunting Ammo Sack", subtype = "ammo pouch", slots = 10, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=3574" }, + [3604] = { name = "Bandolier of the Night Watch", subtype = "ammo pouch", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=3604" }, + [3605] = { name = "Quiver of the Night Watch", subtype = "quiver", slots = 12, reqlevel = nil, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=3605" }, + [5439] = { name = "Small Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=5439" }, + [5441] = { name = "Small Shot Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=5441" }, + [7278] = { name = "Light Leather Quiver", subtype = "quiver", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=7278" }, + [7279] = { name = "Small Leather Ammo Pouch", subtype = "ammo pouch", slots = 8, reqlevel = nil, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=7279" }, + [7371] = { name = "Heavy Quiver", subtype = "quiver", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=7371" }, + [7372] = { name = "Heavy Leather Ammo Pouch", subtype = "ammo pouch", slots = 14, reqlevel = 30, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=7372" }, + [8217] = { name = "Quickdraw Quiver", subtype = "quiver", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=8217" }, + [8218] = { name = "Thick Leather Ammo Pouch", subtype = "ammo pouch", slots = 16, reqlevel = 40, quality = 2, sourceUrl = "https://database.turtlecraft.gg/?item=8218" }, + [11362] = { name = "Medium Quiver", subtype = "quiver", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=11362" }, + [11363] = { name = "Medium Shot Pouch", subtype = "ammo pouch", slots = 10, reqlevel = 10, quality = 1, sourceUrl = "https://database.turtlecraft.gg/?item=11363" }, + [18714] = { name = "Ancient Sinew Wrapped Lamina", subtype = "quiver", slots = 18, reqlevel = 60, quality = 4, sourceUrl = "https://database.turtlecraft.gg/?item=18714" }, + [19319] = { name = "Harpy Hide Quiver", subtype = "quiver", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=19319" }, + [19320] = { name = "Gnoll Skin Bandolier", subtype = "ammo pouch", slots = 16, reqlevel = 55, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=19320" }, + [61549] = { name = "Swiftfeather Quiver", subtype = "quiver", slots = 16, reqlevel = 57, quality = 3, sourceUrl = "https://database.turtlecraft.gg/?item=61549" }, +} + local function MTH_BOOK_FamiliesTrace(message) return end @@ -64,6 +94,8 @@ local MTH_BOOK_STATE = { families = { col = nil, asc = true }, abilities = { col = nil, asc = true }, items = { col = nil, asc = true }, + projectiles = { col = nil, asc = true }, + ammobags = { col = nil, asc = true }, npcs = { col = nil, asc = true }, stable = { col = nil, asc = true }, pethistory = { col = 5, asc = false }, @@ -157,6 +189,29 @@ local MTH_BOOK_ItemSubtypeOptions = { { value = "crossbow", label = "Crossbow" }, } +local MTH_BOOK_ItemSubtypeOptionsProjectiles = { + { value = "all", label = "All Projectiles" }, + { value = "arrow", label = "Arrow" }, + { value = "bullet", label = "Bullet" }, +} + +local MTH_BOOK_ItemSubtypeOptionsAmmoBags = { + { value = "all", label = "All Ammo Bags" }, + { value = "quiver", label = "Quiver" }, + { value = "ammopouch", label = "Ammo Pouch" }, +} + +local function MTH_BOOK_GetItemSubtypeOptions(mode) + local resolved = tostring(mode or MTH_BOOK_STATE.mode or "") + if resolved == "projectiles" then + return MTH_BOOK_ItemSubtypeOptionsProjectiles + end + if resolved == "ammobags" then + return MTH_BOOK_ItemSubtypeOptionsAmmoBags + end + return MTH_BOOK_ItemSubtypeOptions +end + local MTH_BOOK_PetAbilityRanks = {} local MTH_BOOK_CONTENT_LAYOUT_DEFAULT = { @@ -247,7 +302,7 @@ local function MTH_BOOK_ApplyContentLayoutForMode() local layout = MTH_BOOK_CONTENT_LAYOUT_DEFAULT if MTH_BOOK_STATE.mode == "petabilities" then layout = MTH_BOOK_CONTENT_LAYOUT_PETABILITIES - elseif MTH_BOOK_STATE.mode == "items" then + elseif MTH_BOOK_IsItemMode() then layout = MTH_BOOK_CONTENT_LAYOUT_ITEMS elseif MTH_BOOK_STATE.mode == "npcs" then layout = MTH_BOOK_CONTENT_LAYOUT_NPCS @@ -615,8 +670,8 @@ local function MTH_BOOK_OpenSelectedBeastOnMap() if not MTH_Map or not MTH_Map.FocusVendor then return end local okNpc = MTH_Map:FocusVendor(npcId, npc) if not okNpc then return end - if DEFAULT_CHAT_FRAME then - local npcName = npc and npc.name or "Unknown" + if DEFAULT_CHAT_FRAME and MTH:IsMessageEnabled("mapMarkers", true) then + local npcName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(npcId, npc and npc.name)) or (npc and npc.name) or "Unknown" MTH:Print("Focused map markers for " .. tostring(npcName) .. " (" .. tostring(npcId) .. ")") end return @@ -630,8 +685,8 @@ local function MTH_BOOK_OpenSelectedBeastOnMap() return end - if DEFAULT_CHAT_FRAME then - local beastName = beast and beast.name or "Unknown" + if DEFAULT_CHAT_FRAME and MTH:IsMessageEnabled("mapMarkers", true) then + local beastName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast and beast.name)) or (beast and beast.name) or "Unknown" MTH:Print("Focused map markers for " .. tostring(beastName) .. " (" .. tostring(beastId) .. ")") end end @@ -703,6 +758,7 @@ local function MTH_BOOK_ShowAllFilteredBeastsOnMap() local beastId = tonumber(MTH_BOOK_STATE.results[i]) local beast = beastId and MTH_DS_Beasts and MTH_DS_Beasts[beastId] if beast and beast.coords then + local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name or "Unknown" for j = 1, table.getn(beast.coords) do local c = beast.coords[j] if c and c[1] and c[2] and c[3] then @@ -718,7 +774,7 @@ local function MTH_BOOK_ShowAllFilteredBeastsOnMap() zoneId = zoneId, x = x, y = y, - title = string.format("%s (%d)", beast.name or "Unknown", beastId), + title = string.format("%s (%d)", beastDisplayName, beastId), detail = details, beastId = beastId, color = { 0.95, 0.82, 0.10 }, @@ -743,7 +799,7 @@ local function MTH_BOOK_ShowAllFilteredBeastsOnMap() MTH_Map:UpdateWorldMap() MTH_Map:UpdateMinimap() - if MTH and MTH.Print then + if MTH and MTH.Print and MTH:IsMessageEnabled("mapMarkers", true) then MTH:Print("Focused map markers for " .. tostring(table.getn(nodes)) .. " beasts in this zone.") end end @@ -769,9 +825,28 @@ local function MTH_BOOK_SyncTopAreaColorWithSelectedTab() end function MTH_BOOK_GetItemsTable() - local items = _G["MTH_DS_Items"] + if MTH_BOOK_STATE.mode == "ammobags" then + local bagItems = MTH_DS_BagItems or MTH_DS_Bags + if (not bagItems) and type(getglobal) == "function" then + bagItems = getglobal("MTH_DS_BagItems") or getglobal("MTH_DS_Bags") + end + if bagItems then return bagItems end + return MTH_BOOK_FALLBACK_BAG_ITEMS + end + if MTH_BOOK_STATE.mode == "projectiles" then + local ammoItems = MTH_DS_AmmoItems + if (not ammoItems) and type(getglobal) == "function" then + ammoItems = getglobal("MTH_DS_AmmoItems") + end + if ammoItems then return ammoItems end + return {} + end + local items = MTH_DS_Items + if (not items) and type(getglobal) == "function" then + items = getglobal("MTH_DS_Items") + end if items then return items end - return MTH_DS_AmmoItems + return MTH_DS_AmmoItems or {} end local function MTH_BOOK_CountMap(map) @@ -781,6 +856,65 @@ local function MTH_BOOK_CountMap(map) return count end +local function MTH_BOOK_GetSourceBlockCount(block) + if type(block) ~= "table" then return 0 end + if tonumber(block.count) and tonumber(block.count) > 0 then + return tonumber(block.count) + end + if type(block.entries) == "table" then + return MTH_BOOK_CountMap(block.entries) + end + return MTH_BOOK_CountMap(block) +end + +local function MTH_BOOK_BuildAtlasSourceTags(atlas) + local tags = {} + if type(atlas) ~= "table" then return tags end + if atlas.vendor then table.insert(tags, "Vendor") end + if atlas.quest then table.insert(tags, "Quest") end + if atlas.crafted then table.insert(tags, "Crafted") end + if atlas.boss then table.insert(tags, "Boss") end + if atlas.pvp then table.insert(tags, "PvP") end + if atlas.worlddrop then table.insert(tags, "World Drop") end + if atlas.world then table.insert(tags, "World") end + if atlas.event then table.insert(tags, "Event") end + return tags +end + +local function MTH_BOOK_GetItemSourceInfo(item) + local info = { + vendors = MTH_BOOK_CountMap(item and item.vendors), + drops = MTH_BOOK_CountMap(item and item.drops), + objects = MTH_BOOK_CountMap(item and item.objects), + sourceTypes = {}, + atlasTags = MTH_BOOK_BuildAtlasSourceTags(item and item.atlas_sources), + primary = "-", + } + + if type(item) == "table" and type(item.sources) == "table" then + for rawKey, block in pairs(item.sources) do + local template = (type(block) == "table" and block.template) and tostring(block.template) or "?" + table.insert(info.sourceTypes, tostring(rawKey) .. " : " .. template) + end + end + + if table.getn(info.sourceTypes) == 0 then + if info.vendors > 0 then table.insert(info.sourceTypes, "sold-by : npc") end + if info.drops > 0 then table.insert(info.sourceTypes, "dropped-by : npc") end + if info.objects > 0 then table.insert(info.sourceTypes, "contained-in : object") end + for i = 1, table.getn(info.atlasTags) do + table.insert(info.sourceTypes, "atlas : " .. tostring(info.atlasTags[i])) + end + end + + table.sort(info.sourceTypes) + if table.getn(info.sourceTypes) > 0 then + info.primary = info.sourceTypes[1] + end + + return info +end + function MTH_BOOK_HasEntries(map) if not map then return false end for _ in pairs(map) do return true end @@ -813,6 +947,50 @@ end local function MTH_BOOK_GetItemQualityColorCode(quality) local q = tonumber(quality) + if not q and type(quality) == "string" then + local lowered = string.lower(quality) + if lowered == "poor" then q = 0 end + if lowered == "common" then q = 1 end + if lowered == "uncommon" then q = 2 end + if lowered == "rare" then q = 3 end + if lowered == "epic" then q = 4 end + if lowered == "legendary" then q = 5 end + if lowered == "artifact" then q = 6 end + end + if q ~= nil and type(GetItemQualityColor) == "function" then + local _, _, _, colorCode = GetItemQualityColor(q) + if colorCode and colorCode ~= "" then + local hex = string.gsub(tostring(colorCode), "|c", "") + hex = string.gsub(hex, "|r", "") + hex = string.gsub(hex, "^#", "") + if string.len(hex) == 8 then return string.upper(hex) end + if string.len(hex) == 6 then return "FF" .. string.upper(hex) end + end + end + if q ~= nil and ITEM_QUALITY_COLORS and ITEM_QUALITY_COLORS[q] then + local c = ITEM_QUALITY_COLORS[q] + if c and c.r and c.g and c.b then + local r = math.floor((tonumber(c.r) or 1) * 255 + 0.5) + local g = math.floor((tonumber(c.g) or 1) * 255 + 0.5) + local b = math.floor((tonumber(c.b) or 1) * 255 + 0.5) + return string.format("FF%02X%02X%02X", r, g, b) + end + end + return "FFFFFFFF" +end + +local function MTH_BOOK_GetWeaponLegacyQualityColorCode(quality) + local q = tonumber(quality) + if not q and type(quality) == "string" then + local lowered = string.lower(quality) + if lowered == "poor" then q = 6 end + if lowered == "common" then q = 5 end + if lowered == "uncommon" then q = 4 end + if lowered == "rare" then q = 3 end + if lowered == "epic" then q = 2 end + if lowered == "legendary" then q = 1 end + if lowered == "artifact" then q = 1 end + end if q == 2 then return "FFAA66FF" end if q == 3 then return "FF0070DD" end if q == 4 then return "FF1EFF00" end @@ -821,6 +999,33 @@ local function MTH_BOOK_GetItemQualityColorCode(quality) return "FFFFFFFF" end +local function MTH_BOOK_ParseProjectileDPSFromText(text) + if type(text) ~= "string" or text == "" then return nil end + local lowered = string.lower(text) + local raw = string.match(lowered, "adds%s+([%d]+[%.,]?[%d]*)%s+damage%s+per%s+seconds?") + if not raw then + raw = string.match(lowered, "([%d]+[%.,]?[%d]*)%s+damage%s+per%s+seconds?") + end + if not raw then return nil end + local normalized = string.gsub(raw, ",", ".") + return tonumber(normalized) +end + +local function MTH_BOOK_GetProjectileDPSValue(item) + if type(item) ~= "table" then return nil end + local existing = tonumber(item.dps) + if existing then return existing end + + local dps = MTH_BOOK_ParseProjectileDPSFromText(item.tooltip) + if not dps then dps = MTH_BOOK_ParseProjectileDPSFromText(item.description) end + if dps then + item.dps = dps + return dps + end + + return nil +end + local function MTH_BOOK_GetPlayerReactDefaults() local faction = UnitFactionGroup and UnitFactionGroup("player") if faction == "Alliance" then @@ -1065,11 +1270,12 @@ local function MTH_BOOK_GetSortKey(entry, col) if MTH_BOOK_STATE.mode == "pets" then local beast = MTH_DS_Beasts and MTH_DS_Beasts[entry] if not beast then return nil end + local beastName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(entry, beast.name)) or beast.name local traits = MTH_BOOK_ParseBeastTraits(beast) if col == 1 then return tonumber(entry) or 0 end if col == 2 then return MTH_BOOK_ParseLevel(beast.lvl) or 0 end if col == 3 then return MTH_BOOK_SafeLower(beast.family) end - if col == 4 then return MTH_BOOK_SafeLower(beast.name) end + if col == 4 then return MTH_BOOK_SafeLower(beastName) end if col == 5 then return MTH_BOOK_SafeLower(MTH_BOOK_GetBeastAbilitiesSummary(beast)) end if col == 6 then return MTH_BOOK_SafeLower(MTH_BOOK_GetBeastZoneSummary(beast)) end if col == 7 then return traits.rare and 1 or 0 end @@ -1110,7 +1316,10 @@ local function MTH_BOOK_GetSortKey(entry, col) local functionSummary = MTH_BOOK_GetNPCFunctionSummary(npc) local zoneName = MTH_BOOK_GetNPCZoneSummary(npc) if col == 1 then return tonumber(entry) or 0 end - if col == 2 then return MTH_BOOK_SafeLower(npc.name) end + if col == 2 then + local npcName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(entry, npc.name)) or npc.name + return MTH_BOOK_SafeLower(npcName) + end if col == 3 then return react end if col == 4 then return MTH_BOOK_SafeLower(functionSummary) end if col == 5 then return MTH_BOOK_SafeLower(zoneName) end @@ -1143,13 +1352,41 @@ local function MTH_BOOK_GetSortKey(entry, col) local items = MTH_BOOK_GetItemsTable() local item = items and items[entry] if not item then return nil end + local localizedItemName = (MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(entry, item.name) + or item.name if col == 1 then return tonumber(entry) or 0 end if col == 2 then return tonumber(item.reqlevel) or 0 end if col == 3 then return tonumber(item.level) or 0 end - if col == 4 then return MTH_BOOK_SafeLower(item.subtype) end - if col == 5 then return MTH_BOOK_SafeLower(item.name) end - if col == 6 then return tonumber(item.dps) or 0 end - if col == 7 then return tonumber(item.speed) or 0 end + if MTH_BOOK_STATE.mode == "ammobags" then + if col == 4 then return tonumber(item.slots) or 0 end + if col == 5 then return MTH_BOOK_SafeLower(item.subtype) end + if col == 6 then return MTH_BOOK_SafeLower(localizedItemName) end + if col == 7 then + local hasVendors = MTH_BOOK_CountMap(item.vendors) > 0 + local hasDrops = MTH_BOOK_CountMap(item.drops) > 0 + local hasObjects = MTH_BOOK_CountMap(item.objects) > 0 + if hasVendors and (hasDrops or hasObjects) then return "mixed" end + if hasDrops and hasObjects then return "mixed" end + if hasVendors then return "vendor" end + if hasDrops then return "drop" end + if hasObjects then return "object" end + return "" + end + else + if col == 4 then return MTH_BOOK_SafeLower(item.subtype) end + if col == 5 then return MTH_BOOK_SafeLower(localizedItemName) end + if MTH_BOOK_STATE.mode == "projectiles" then + if col == 6 then return MTH_BOOK_GetProjectileDPSValue(item) or 0 end + if col == 7 then + local sourceInfo = MTH_BOOK_GetItemSourceInfo(item) + return MTH_BOOK_SafeLower(sourceInfo and sourceInfo.primary or "") + end + else + if col == 6 then return tonumber(item.dps) or 0 end + if col == 7 then return tonumber(item.speed) or 0 end + end + end return nil end @@ -1227,12 +1464,13 @@ local function MTH_BOOK_BuildResults() then if MTH_BOOK_STATE.search == "" or string.find(abilityLower, MTH_BOOK_STATE.search, 1, true) ~= nil - or string.find(MTH_BOOK_SafeLower(beast.name), MTH_BOOK_STATE.search, 1, true) ~= nil + or string.find(MTH_BOOK_SafeLower((MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name), MTH_BOOK_STATE.search, 1, true) ~= nil or string.find(MTH_BOOK_SafeLower(beast.family), MTH_BOOK_STATE.search, 1, true) ~= nil then + local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name or "Unknown" table.insert(results, { beastId = beastId, - name = beast.name or "Unknown", + name = beastDisplayName, family = beast.family or "?", level = beastLevel or 0, rare = beast.rare and true or false, @@ -1442,14 +1680,10 @@ local function MTH_BOOK_BuildPetAbilityOptions() local abilityLower = MTH_BOOK_SafeLower(abilityLabel) if abilityLower ~= "" and abilityLower ~= "none" and abilityLower ~= "unknown" then local row = abilityMap[abilityLower] - if not row then - row = { value = abilityLower, label = abilityLabel, ranks = {} } - abilityMap[abilityLower] = row - end - if bucket and bucket.spells then + if row and bucket and bucket.spells then for i = 1, table.getn(bucket.spells) do local spell = bucket.spells[i] - if spell then + if spell and MTH_BOOK_SafeLower(spell.learnMethod or "beast") ~= "trainer" then local rank = tonumber(spell.rankNumber) if rank and rank > 0 then row.ranks[rank] = true @@ -1757,12 +1991,15 @@ local function MTH_BOOK_UpdatePetLearnSourceDropdownText() end local function MTH_BOOK_GetItemSubtypeLabelByValue(value) - for i = 1, table.getn(MTH_BOOK_ItemSubtypeOptions) do - local option = MTH_BOOK_ItemSubtypeOptions[i] + local options = MTH_BOOK_GetItemSubtypeOptions() + for i = 1, table.getn(options) do + local option = options[i] if option and option.value == value then return option.label end end + if MTH_BOOK_STATE.mode == "projectiles" then return "All Projectiles" end + if MTH_BOOK_STATE.mode == "ammobags" then return "All Ammo Bags" end return "All Ranged" end @@ -1785,7 +2022,7 @@ end local function MTH_BOOK_UpdateQuickFilterControls() MTH_BOOK_UpdateCheckboxLayoutByMode() - if MTH_BOOK_STATE.mode == "items" then + if MTH_BOOK_IsItemMode() then MTH_BOOK_STATE.pageSize = 18 elseif MTH_BOOK_STATE.mode == "families" then MTH_BOOK_STATE.pageSize = 16 @@ -2035,7 +2272,7 @@ local function MTH_BOOK_UpdateQuickFilterControls() if requireVendor then requireVendor:Show() end if requireDrop then requireDrop:Show() end if requireObject then requireObject:Show() end - elseif MTH_BOOK_STATE.mode == "items" then + elseif MTH_BOOK_IsItemMode() then if searchLabel then searchLabel:Show() end if minLabel then minLabel:Hide() end if maxLabel then maxLabel:Hide() end @@ -2197,7 +2434,7 @@ local function MTH_BOOK_UpdateQuickFilterControls() if itemSubtypeDropdown then itemSubtypeDropdown:Hide() end end - if MTH_BOOK_STATE.mode ~= "petabilities" and MTH_BOOK_STATE.mode ~= "items" and petOnlyMyLevel then + if MTH_BOOK_STATE.mode ~= "petabilities" and not MTH_BOOK_IsItemMode() and petOnlyMyLevel then petOnlyMyLevel:Hide() end if MTH_BOOK_STATE.mode ~= "pets" and petInZoneOnly then @@ -2341,8 +2578,9 @@ local function MTH_BOOK_InitItemSubtypeDropdown() if not itemDropdown then return end UIDropDownMenu_Initialize(itemDropdown, function() - for i = 1, table.getn(MTH_BOOK_ItemSubtypeOptions) do - local option = MTH_BOOK_ItemSubtypeOptions[i] + local options = MTH_BOOK_GetItemSubtypeOptions() + for i = 1, table.getn(options) do + local option = options[i] local info = MTH_BOOK_DropdownCreateInfo() info.text = option.label info.func = function() @@ -2357,7 +2595,7 @@ local function MTH_BOOK_InitItemSubtypeDropdown() end end) - UIDropDownMenu_SetWidth(75, itemDropdown) + UIDropDownMenu_SetWidth(120, itemDropdown) UIDropDownMenu_JustifyText("LEFT", itemDropdown) MTH_BOOK_UpdateItemSubtypeDropdownText() end @@ -2728,8 +2966,9 @@ function MTH_BOOK_UpdateDetail() local functionSummary = MTH_BOOK_GetNPCFunctionSummary(npc) local zoneName, subzoneName = MTH_BOOK_GetNPCZoneSummary(npc) + local npcName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(npcId, npc.name)) or npc.name local lines = {} - table.insert(lines, "|cFFFFFF00" .. tostring(npc.name or "Unknown") .. "|r") + table.insert(lines, "|cFFFFFF00" .. tostring(npcName or "Unknown") .. "|r") MTH_BOOK_AddDetailSection(lines, "Identity") MTH_BOOK_AddDetailKV(lines, "ID", npcId) MTH_BOOK_AddDetailKV(lines, "React", MTH_BOOK_GetNPCReactBucket(npc.fac)) @@ -2773,7 +3012,8 @@ function MTH_BOOK_UpdateDetail() return end local lines = {} - table.insert(lines, "|cFFFFFF00" .. (beast.name or "Unknown") .. "|r") + local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name + table.insert(lines, "|cFFFFFF00" .. (beastDisplayName or "Unknown") .. "|r") MTH_BOOK_AddDetailSection(lines, "Identity") MTH_BOOK_AddDetailKV(lines, "ID", beastId) MTH_BOOK_AddDetailKV(lines, "Family", beast.family or "?") @@ -2828,9 +3068,10 @@ function MTH_BOOK_UpdateDetail() end local lines = {} table.insert(lines, "|cFFFFFF00" .. tostring(entry.abilityToken) .. "|r") + local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(entry.beastId, beast.name)) or beast.name MTH_BOOK_AddDetailSection(lines, "Identity") - MTH_BOOK_AddDetailKV(lines, "Beast", tostring(beast.name or "Unknown") .. " (ID " .. tostring(entry.beastId) .. ")") + MTH_BOOK_AddDetailKV(lines, "Beast", tostring(beastDisplayName or "Unknown") .. " (ID " .. tostring(entry.beastId) .. ")") MTH_BOOK_AddDetailKV(lines, "Family", beast.family or "?") MTH_BOOK_AddDetailSection(lines, "Stats") @@ -3033,7 +3274,7 @@ function MTH_BOOK_UpdateDetail() end local tameBeastId = hasRecordedTame and (tonumber(row.tameBeastId) or (legacyTameContext and tonumber(legacyTameContext.beastId) or nil)) or nil local tameBeast = tameBeastId and MTH_DS_Beasts and MTH_DS_Beasts[tameBeastId] or nil - local tameBeastName = tostring((tameBeast and tameBeast.name) or (legacyTameContext and legacyTameContext.name) or "-") + local tameBeastName = tostring(((MTH and MTH.GetLocalizedBeastName and tameBeastId and tameBeast and MTH:GetLocalizedBeastName(tameBeastId, tameBeast.name)) or (tameBeast and tameBeast.name)) or (legacyTameContext and legacyTameContext.name) or "-") local lines = {} table.insert(lines, "|cFFFFFF00" .. tostring(row.name or "Unknown") .. "|r") @@ -3089,12 +3330,12 @@ function MTH_BOOK_UpdateDetail() return end - local v = MTH_BOOK_CountMap(item.vendors) - local d = MTH_BOOK_CountMap(item.drops) - local o = MTH_BOOK_CountMap(item.objects) - local atlas = item.atlas_sources or {} + local sourceInfo = MTH_BOOK_GetItemSourceInfo(item) local lines = {} - table.insert(lines, "|cFFFFFF00" .. (item.name or "Unknown") .. "|r") + local localizedItemName = (MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(itemId, item.name) + or item.name + table.insert(lines, "|cFFFFFF00" .. (localizedItemName or "Unknown") .. "|r") MTH_BOOK_AddDetailSection(lines, "Identity") MTH_BOOK_AddDetailKV(lines, "ID", itemId) @@ -3103,25 +3344,21 @@ function MTH_BOOK_UpdateDetail() MTH_BOOK_AddDetailSection(lines, "Stats") MTH_BOOK_AddDetailKV(lines, "Level", item.level or "?") MTH_BOOK_AddDetailKV(lines, "Req Level", item.reqlevel or "-") + if item.slots then MTH_BOOK_AddDetailKV(lines, "Slots", item.slots) end if item.quality then MTH_BOOK_AddDetailKV(lines, "Quality", item.quality) end if item.dps then MTH_BOOK_AddDetailKV(lines, "DPS", item.dps) end if item.speed then MTH_BOOK_AddDetailKV(lines, "Speed", item.speed) end + if item.sourceUrl and item.sourceUrl ~= "" then MTH_BOOK_AddDetailKV(lines, "DB URL", item.sourceUrl) end MTH_BOOK_AddDetailSection(lines, "Sources") - MTH_BOOK_AddDetailKV(lines, "Vendors", v) - MTH_BOOK_AddDetailKV(lines, "Creature Drops", d) - MTH_BOOK_AddDetailKV(lines, "Object Sources", o) - - if atlas.boss or atlas.world or atlas.worlddrop or atlas.quest or atlas.vendor or atlas.pvp or atlas.crafted or atlas.event then - MTH_BOOK_AddDetailSection(lines, "Atlas Hints") - MTH_BOOK_AddDetailKV(lines, "Boss Loot", atlas.boss and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "World Sources", atlas.world and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "World Drop", atlas.worlddrop and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "Quest Reward", atlas.quest and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "Vendor / Faction", atlas.vendor and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "PvP Reward", atlas.pvp and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "Crafted", atlas.crafted and "Yes" or "-") - MTH_BOOK_AddDetailKV(lines, "Event", atlas.event and "Yes" or "-") + if table.getn(sourceInfo.sourceTypes) == 0 then + MTH_BOOK_AddDetailKV(lines, "Source", "-") + elseif table.getn(sourceInfo.sourceTypes) == 1 then + MTH_BOOK_AddDetailKV(lines, "Source", sourceInfo.sourceTypes[1]) + else + for i = 1, table.getn(sourceInfo.sourceTypes) do + MTH_BOOK_AddDetailKV(lines, "Source " .. tostring(i), sourceInfo.sourceTypes[i]) + end end MTH_BOOK_SetDetailText(detail, table.concat(lines, "\n")) MTH_BOOK_UpdateOpenMapButton() @@ -3137,6 +3374,8 @@ local function MTH_BOOK_UpdateHeader() if mode == "families" then modeLabel = "Families" end if mode == "petabilities" then modeLabel = "Pet Abilities" end if mode == "items" then modeLabel = "Ranged Weapons" end + if mode == "projectiles" then modeLabel = "Projectiles" end + if mode == "ammobags" then modeLabel = "Ammo Bags" end if mode == "npcs" then modeLabel = "NPC Finder" end if mode == "stable" then modeLabel = "Stable" end if mode == "pethistory" then modeLabel = "Pet History" end @@ -3177,6 +3416,8 @@ local function MTH_BOOK_GetColumnLabels() return { "Ability", "Lvl", "Family", "Beast", "Rare" } elseif MTH_BOOK_STATE.mode == "npcs" then return { "ID", "Name", "React", "Function", "Zone" } + elseif MTH_BOOK_STATE.mode == "projectiles" then + return { "ID", "Req", "Lvl", "Type", "Name", "DPS", "Source" } end return { "ID", "Req", "Lvl", "Type", "Name", "DPS", "Speed", "Source" } end @@ -3239,6 +3480,16 @@ local function MTH_BOOK_GetColumnLayout() { x = 242, width = 160, align = "LEFT" }, { x = 404, width = 148, align = "LEFT" }, } + elseif MTH_BOOK_STATE.mode == "projectiles" then + return { + { x = 8, width = 36, align = "LEFT" }, + { x = 44, width = 30, align = "LEFT" }, + { x = 74, width = 30, align = "LEFT" }, + { x = 104, width = 62, align = "LEFT" }, + { x = 166, width = 228, align = "LEFT" }, + { x = 396, width = 44, align = "LEFT" }, + { x = 442, width = 110, align = "LEFT" }, + } end return { @@ -3286,6 +3537,8 @@ local function MTH_BOOK_ApplyColumnLayout(parent) for row = 1, MTH_BOOK_STATE.pageSize do local btn = MTH_BOOK_STATE.buttons[row] if btn and btn.cols then + local itemNameColumn = (MTH_BOOK_STATE.mode == "ammobags") and 6 or 5 + local itemNameLayout = layout[itemNameColumn] local parentWidth = tonumber(parent:GetWidth()) or 0 local rowWidth = parentWidth - 8 if rowWidth < 220 then rowWidth = 220 end @@ -3310,7 +3563,7 @@ local function MTH_BOOK_ApplyColumnLayout(parent) if btn.bookLinkButton then local info = layout[1] - if (MTH_BOOK_STATE.mode == "pets" or MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_STATE.mode == "items") and info then + if (MTH_BOOK_STATE.mode == "pets" or MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_IsItemMode()) and info then btn.bookLinkButton:ClearAllPoints() btn.bookLinkButton:SetPoint("LEFT", btn, "LEFT", info.x - 4, 0) btn.bookLinkButton:SetWidth(info.width) @@ -3324,10 +3577,10 @@ local function MTH_BOOK_ApplyColumnLayout(parent) if btn.itemLinkButton then btn.itemLinkButton:Hide() end if btn.nameHoverButton then - if MTH_BOOK_STATE.mode == "items" and layout[5] then + if MTH_BOOK_IsItemMode() and itemNameLayout then btn.nameHoverButton:ClearAllPoints() - btn.nameHoverButton:SetPoint("LEFT", btn, "LEFT", layout[5].x + 12, 0) - btn.nameHoverButton:SetWidth(layout[5].width - 16) + btn.nameHoverButton:SetPoint("LEFT", btn, "LEFT", itemNameLayout.x + 12, 0) + btn.nameHoverButton:SetWidth(itemNameLayout.width - 16) btn.nameHoverButton:SetHeight(btn:GetHeight()) btn.nameHoverButton:Show() else @@ -3336,14 +3589,14 @@ local function MTH_BOOK_ApplyColumnLayout(parent) end if btn.itemIcon then - if MTH_BOOK_STATE.mode == "items" and layout[5] then + if MTH_BOOK_IsItemMode() and itemNameLayout then btn.itemIcon:ClearAllPoints() - btn.itemIcon:SetPoint("LEFT", btn, "LEFT", layout[5].x - 4, 0) + btn.itemIcon:SetPoint("LEFT", btn, "LEFT", itemNameLayout.x - 4, 0) btn.itemIcon:Show() - if btn.cols and btn.cols[5] then - btn.cols[5]:ClearAllPoints() - btn.cols[5]:SetPoint("LEFT", btn, "LEFT", layout[5].x + 12, 0) - btn.cols[5]:SetWidth(layout[5].width - 16) + if btn.cols and btn.cols[itemNameColumn] then + btn.cols[itemNameColumn]:ClearAllPoints() + btn.cols[itemNameColumn]:SetPoint("LEFT", btn, "LEFT", itemNameLayout.x + 12, 0) + btn.cols[itemNameColumn]:SetWidth(itemNameLayout.width - 16) end else btn.itemIcon:Hide() @@ -3357,6 +3610,7 @@ local function MTH_BOOK_GetRowValues(entry) if MTH_BOOK_STATE.mode == "pets" then local beast = MTH_DS_Beasts and MTH_DS_Beasts[entry] if not beast then return { "", "", "", "", "", "", "", "", "" } end + local beastDisplayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(entry, beast.name)) or beast.name local traits = MTH_BOOK_ParseBeastTraits(beast) local abilities = MTH_BOOK_GetBeastAbilitiesSummary(beast) local zone = MTH_BOOK_GetBeastZoneSummary(beast) @@ -3364,7 +3618,7 @@ local function MTH_BOOK_GetRowValues(entry) "|cFF33CCFF" .. tostring(entry) .. "|r", tostring(beast.lvl or "?"), tostring(beast.family or "?"), - tostring(beast.name or "Unknown"), + tostring(beastDisplayName or "Unknown"), abilities, zone, (traits.rare and "R" or ""), @@ -3452,9 +3706,10 @@ local function MTH_BOOK_GetRowValues(entry) local react = MTH_BOOK_GetNPCReactBucket(vendor.fac) local functionSummary = MTH_BOOK_GetNPCFunctionSummary(vendor) local zoneName = MTH_BOOK_GetNPCZoneSummary(vendor) + local vendorName = (MTH and MTH.GetLocalizedNPCNameById and MTH:GetLocalizedNPCNameById(entry, vendor.name)) or vendor.name return { "|cFF33CCFF" .. tostring(entry) .. "|r", - tostring(vendor.name or "Unknown"), + tostring(vendorName or "Unknown"), react, functionSummary, zoneName, @@ -3463,46 +3718,54 @@ local function MTH_BOOK_GetRowValues(entry) local items = MTH_BOOK_GetItemsTable() local item = items and items[entry] - if not item then return { "", "", "", "", "", "", "", "" } end - local itemName = tostring(item.name or "Unknown") - local colorCode = MTH_BOOK_GetItemQualityColorCode(item.quality) - local sourceText = "-" - local hasVendors = MTH_BOOK_CountMap(item.vendors) > 0 - local hasDrops = MTH_BOOK_CountMap(item.drops) > 0 - local hasObjects = MTH_BOOK_CountMap(item.objects) > 0 - local concreteCount = 0 - if hasVendors then concreteCount = concreteCount + 1 end - if hasDrops then concreteCount = concreteCount + 1 end - if hasObjects then concreteCount = concreteCount + 1 end - if concreteCount > 1 then - sourceText = "Mixed" - elseif hasVendors then - sourceText = "Vendor" - elseif hasDrops then - sourceText = "Drop" - elseif hasObjects then - sourceText = "Object" - else - local atlas = item.atlas_sources - if atlas then - if atlas.boss then - sourceText = "Boss" - elseif atlas.quest then - sourceText = "Quest" - elseif atlas.vendor then - sourceText = "Vendor" - elseif atlas.pvp then - sourceText = "PvP" - elseif atlas.crafted then - sourceText = "Crafted" - elseif atlas.worlddrop then - sourceText = "World Drop" - elseif atlas.world then - sourceText = "World" - elseif atlas.event then - sourceText = "Event" - end + if not item then + if MTH_BOOK_STATE.mode == "projectiles" or MTH_BOOK_STATE.mode == "ammobags" then + return { "", "", "", "", "", "", "" } end + return { "", "", "", "", "", "", "", "" } + end + local itemName = tostring(((MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(entry, item.name) + or item.name) or "Unknown") + local resolvedQuality = item.quality + if not resolvedQuality and MTH_BOOK_STATE.mode == "projectiles" and MTH_DS_ItemOrigins and MTH_DS_ItemOrigins[entry] then + resolvedQuality = MTH_DS_ItemOrigins[entry].quality + end + if not resolvedQuality and type(GetItemInfo) == "function" then + local _, _, runtimeQuality = GetItemInfo(entry) + if runtimeQuality ~= nil then + resolvedQuality = runtimeQuality + item.quality = runtimeQuality + end + end + local colorCode = MTH_BOOK_GetItemQualityColorCode(resolvedQuality) + if MTH_BOOK_STATE.mode == "items" then + colorCode = MTH_BOOK_GetWeaponLegacyQualityColorCode(resolvedQuality) + end + local sourceInfo = MTH_BOOK_GetItemSourceInfo(item) + local sourceText = sourceInfo.primary + if MTH_BOOK_STATE.mode == "ammobags" then + return { + "|cFF33CCFF" .. tostring(entry) .. "|r", + tostring(item.reqlevel or 0), + tostring(item.level or 0), + tostring(item.slots or "-"), + tostring(item.subtype or "?"), + "|c" .. colorCode .. itemName .. "|r", + sourceText, + } + end + if MTH_BOOK_STATE.mode == "projectiles" then + local projectileDps = MTH_BOOK_GetProjectileDPSValue(item) + return { + "|cFF33CCFF" .. tostring(entry) .. "|r", + tostring(item.reqlevel or 0), + tostring(item.level or 0), + tostring(item.subtype or "?"), + "|c" .. colorCode .. itemName .. "|r", + (projectileDps and tostring(projectileDps) or "-"), + sourceText, + } end return { "|cFF33CCFF" .. tostring(entry) .. "|r", @@ -3751,7 +4014,7 @@ MTH_BOOK_UpdateResults = function() end end if btn.itemIcon then - if MTH_BOOK_STATE.mode == "items" then + if MTH_BOOK_IsItemMode() then local items = MTH_BOOK_GetItemsTable() local item = items and items[entry] if item and item.icon and item.icon ~= "" then @@ -3945,7 +4208,7 @@ local function MTH_BOOK_UpdateModeLabels() end end if minLabel then - if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_STATE.mode == "items" or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then + if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_IsItemMode() or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then minLabel:Hide() else minLabel:Show() @@ -3953,7 +4216,7 @@ local function MTH_BOOK_UpdateModeLabels() end end if maxLabel then - if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_STATE.mode == "items" or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then + if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_IsItemMode() or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then maxLabel:Hide() else maxLabel:Show() @@ -3963,7 +4226,7 @@ local function MTH_BOOK_UpdateModeLabels() if getglobal("MTH_BOOK_HideNoAbilitiesText") then getglobal("MTH_BOOK_HideNoAbilitiesText"):SetText("Hide No Abilities") end if getglobal("MTH_BOOK_PetOnlyMyLevelText") then - if MTH_BOOK_STATE.mode == "items" then + if MTH_BOOK_IsItemMode() then getglobal("MTH_BOOK_PetOnlyMyLevelText"):SetText("Show only my level") else getglobal("MTH_BOOK_PetOnlyMyLevelText"):SetText("Only my level") @@ -4003,7 +4266,7 @@ end local function MTH_BOOK_ApplyInputs() local search = getglobal("MTH_BOOK_Search") MTH_BOOK_STATE.search = MTH_BOOK_SafeLower(search and search:GetText() or "") - if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_STATE.mode == "items" or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then + if MTH_BOOK_STATE.mode == "npcs" or MTH_BOOK_IsItemMode() or MTH_BOOK_STATE.mode == "stable" or MTH_BOOK_STATE.mode == "families" or MTH_BOOK_STATE.mode == "pethistory" then MTH_BOOK_STATE.minLevel = nil MTH_BOOK_STATE.maxLevel = nil else @@ -4029,7 +4292,7 @@ local function MTH_BOOK_ApplyInputs() MTH_BOOK_STATE.petInZoneOnly = petInZoneOnly and petInZoneOnly:GetChecked() == 1 or false elseif MTH_BOOK_STATE.mode == "petabilities" then MTH_BOOK_STATE.petOnlyMyLevel = petOnlyMyLevel and petOnlyMyLevel:GetChecked() == 1 or false - elseif MTH_BOOK_STATE.mode == "items" then + elseif MTH_BOOK_IsItemMode() then MTH_BOOK_STATE.itemOnlyMyLevel = petOnlyMyLevel and petOnlyMyLevel:GetChecked() == 1 or false elseif MTH_BOOK_STATE.mode == "npcs" then MTH_BOOK_STATE.npcHideNoZone = hideUnknown and hideUnknown:GetChecked() == 1 or false @@ -4077,6 +4340,8 @@ local function MTH_BOOK_UpdateSectionTabs() local sectionFamilies = getglobal("MTH_BOOK_SectionFamilies") local sectionPetAbilities = getglobal("MTH_BOOK_SectionPetAbilities") local sectionItems = getglobal("MTH_BOOK_SectionItems") + local sectionProjectiles = getglobal("MTH_BOOK_SectionProjectiles") + local sectionAmmoBags = getglobal("MTH_BOOK_SectionAmmoBags") local sectionNPCs = getglobal("MTH_BOOK_SectionNPCs") local sectionStable = getglobal("MTH_BOOK_SectionStable") local sectionPetHistory = getglobal("MTH_BOOK_SectionPetHistory") @@ -4094,6 +4359,8 @@ local function MTH_BOOK_UpdateSectionTabs() setState(sectionFamilies, MTH_BOOK_STATE.mode == "families") setState(sectionPetAbilities, MTH_BOOK_STATE.mode == "petabilities") setState(sectionItems, MTH_BOOK_STATE.mode == "items") + setState(sectionProjectiles, MTH_BOOK_STATE.mode == "projectiles") + setState(sectionAmmoBags, MTH_BOOK_STATE.mode == "ammobags") setState(sectionNPCs, MTH_BOOK_STATE.mode == "npcs") setState(sectionStable, MTH_BOOK_STATE.mode == "stable") setState(sectionPetHistory, MTH_BOOK_STATE.mode == "pethistory") @@ -4105,10 +4372,12 @@ local function MTH_BOOK_LayoutSectionTabs() local sectionFamilies = getglobal("MTH_BOOK_SectionFamilies") local sectionPetAbilities = getglobal("MTH_BOOK_SectionPetAbilities") local sectionItems = getglobal("MTH_BOOK_SectionItems") + local sectionProjectiles = getglobal("MTH_BOOK_SectionProjectiles") + local sectionAmmoBags = getglobal("MTH_BOOK_SectionAmmoBags") local sectionNPCs = getglobal("MTH_BOOK_SectionNPCs") local sectionStable = getglobal("MTH_BOOK_SectionStable") local sectionPetHistory = getglobal("MTH_BOOK_SectionPetHistory") - if not (tabBar and sectionPets and sectionFamilies and sectionPetAbilities and sectionItems and sectionNPCs) then return end + if not (tabBar and sectionPets and sectionFamilies and sectionPetAbilities and sectionItems and sectionNPCs and sectionProjectiles and sectionAmmoBags) then return end if sectionStable then sectionStable:ClearAllPoints() @@ -4134,9 +4403,15 @@ local function MTH_BOOK_LayoutSectionTabs() sectionItems:ClearAllPoints() sectionItems:SetPoint("LEFT", sectionNPCs, "RIGHT", 2, 0) + sectionProjectiles:ClearAllPoints() + sectionProjectiles:SetPoint("LEFT", sectionItems, "RIGHT", 2, 0) + + sectionAmmoBags:ClearAllPoints() + sectionAmmoBags:SetPoint("LEFT", sectionProjectiles, "RIGHT", 2, 0) + if sectionPetHistory then sectionPetHistory:ClearAllPoints() - sectionPetHistory:SetPoint("LEFT", sectionItems, "RIGHT", 2, 0) + sectionPetHistory:SetPoint("LEFT", sectionAmmoBags, "RIGHT", 2, 0) end end @@ -4194,7 +4469,7 @@ local function MTH_BOOK_ResetStateForMode(mode) elseif mode == "petabilities" then MTH_BOOK_STATE.petLearnSource = "beast" MTH_BOOK_STATE.petOnlyMyLevel = true - elseif mode == "items" then + elseif MTH_BOOK_IsItemMode(mode) then MTH_BOOK_STATE.itemSubtype = "all" MTH_BOOK_STATE.itemOnlyMyLevel = false elseif mode == "npcs" then @@ -4230,7 +4505,7 @@ local function MTH_BOOK_ApplyStateToWidgets(widgets) if widgets.petOnlyMyLevel then if MTH_BOOK_STATE.mode == "petabilities" then widgets.petOnlyMyLevel:SetChecked(MTH_BOOK_STATE.petOnlyMyLevel and 1 or nil) - elseif MTH_BOOK_STATE.mode == "items" then + elseif MTH_BOOK_IsItemMode() then widgets.petOnlyMyLevel:SetChecked(MTH_BOOK_STATE.itemOnlyMyLevel and 1 or nil) else widgets.petOnlyMyLevel:SetChecked(nil) @@ -4391,7 +4666,7 @@ local function MTH_BOOK_CreateResultButtons(parent) end) btn.nameHoverButton:SetScript("OnClick", function() if not this:GetParent() or not this:GetParent().entry then return end - if MTH_BOOK_STATE.mode == "items" and this:GetParent().entry.itemId and type(IsShiftKeyDown) == "function" and IsShiftKeyDown() then + if MTH_BOOK_IsItemMode() and this:GetParent().entry.itemId and type(IsShiftKeyDown) == "function" and IsShiftKeyDown() then if MTH_BOOK_InsertItemLinkToChat(this:GetParent().entry.itemId) then return end @@ -4436,7 +4711,7 @@ local function MTH_BOOK_CreateResultButtons(parent) btn:SetScript("OnClick", function() if this.entry then - if MTH_BOOK_STATE.mode == "items" and this.entry.itemId and type(IsShiftKeyDown) == "function" and IsShiftKeyDown() then + if MTH_BOOK_IsItemMode() and this.entry.itemId and type(IsShiftKeyDown) == "function" and IsShiftKeyDown() then if MTH_BOOK_InsertItemLinkToChat(this.entry.itemId) then return end @@ -4506,6 +4781,8 @@ local function MTH_BOOK_WireUI(frame) local sectionFamilies = getglobal("MTH_BOOK_SectionFamilies") local sectionPetAbilities = getglobal("MTH_BOOK_SectionPetAbilities") local sectionItems = getglobal("MTH_BOOK_SectionItems") + local sectionProjectiles = getglobal("MTH_BOOK_SectionProjectiles") + local sectionAmmoBags = getglobal("MTH_BOOK_SectionAmmoBags") local sectionNPCs = getglobal("MTH_BOOK_SectionNPCs") local sectionStable = getglobal("MTH_BOOK_SectionStable") local sectionPetHistory = getglobal("MTH_BOOK_SectionPetHistory") @@ -4551,6 +4828,8 @@ local function MTH_BOOK_WireUI(frame) if sectionFamilies then sectionFamilies:SetScript("OnClick", function() MTH_BOOK_SetMode("families") end) end if sectionPetAbilities then sectionPetAbilities:SetScript("OnClick", function() MTH_BOOK_SetMode("petabilities") end) end if sectionItems then sectionItems:SetScript("OnClick", function() MTH_BOOK_SetMode("items") end) end + if sectionProjectiles then sectionProjectiles:SetScript("OnClick", function() MTH_BOOK_SetMode("projectiles") end) end + if sectionAmmoBags then sectionAmmoBags:SetScript("OnClick", function() MTH_BOOK_SetMode("ammobags") end) end if sectionNPCs then sectionNPCs:SetScript("OnClick", function() MTH_BOOK_SetMode("npcs") end) end if sectionStable then sectionStable:SetScript("OnClick", function() MTH_BOOK_SetMode("stable") end) end if sectionPetHistory then sectionPetHistory:SetScript("OnClick", function() MTH_BOOK_SetMode("pethistory") end) end @@ -4559,6 +4838,8 @@ local function MTH_BOOK_WireUI(frame) MTH_BOOK_StyleSectionTab(sectionFamilies) MTH_BOOK_StyleSectionTab(sectionPetAbilities) MTH_BOOK_StyleSectionTab(sectionItems) + MTH_BOOK_StyleSectionTab(sectionProjectiles) + MTH_BOOK_StyleSectionTab(sectionAmmoBags) MTH_BOOK_StyleSectionTab(sectionNPCs) MTH_BOOK_StyleSectionTab(sectionStable) MTH_BOOK_StyleSectionTab(sectionPetHistory) @@ -4883,7 +5164,7 @@ local function MTH_BOOK_WireUI(frame) if petOnlyMyLevel then if MTH_BOOK_STATE.mode == "petabilities" then petOnlyMyLevel:SetChecked(MTH_BOOK_STATE.petOnlyMyLevel and 1 or nil) - elseif MTH_BOOK_STATE.mode == "items" then + elseif MTH_BOOK_IsItemMode() then petOnlyMyLevel:SetChecked(MTH_BOOK_STATE.itemOnlyMyLevel and 1 or nil) else petOnlyMyLevel:SetChecked(nil) diff --git a/api/hunterbook.xml b/api/hunterbook.xml index 2ce5b76..b243925 100644 --- a/api/hunterbook.xml +++ b/api/hunterbook.xml @@ -120,54 +120,66 @@ - + - + + diff --git a/api/localization.lua b/api/localization.lua index e5a0f77..9d9e439 100644 --- a/api/localization.lua +++ b/api/localization.lua @@ -2,103 +2,174 @@ -- MetaHunt Localization System ------------------------------------------------------ -MTH.localization = {} +MTH.localization = MTH.localization or {} MTH.currentLocale = GetLocale() --- Binding Headers (must be defined early for keybindings) -BINDING_HEADER_FEEDOMATIC = "[MetaHunt] Feed-O-Matic" -BINDING_HEADER_ZAspectHeader = "[MetaHunt] ZAspect Buttons" -BINDING_HEADER_ZTrackHeader = "[MetaHunt] ZTrack Buttons" -BINDING_HEADER_ZTrapHeader = "[MetaHunt] ZTrap Buttons" -BINDING_HEADER_ZPetHeader = "[MetaHunt] ZPet Buttons" -BINDING_HEADER_ZAmmoHeader = "[MetaHunt] ZAmmo Buttons" +local MTH_LOCALE_ALIASES = { + enGB = "enUS", + esMX = "esES", + zhTW = "zhCN", + frFR = "enUS", +} --- Localization table structure -local L = {} - --- English (default) -if MTH.currentLocale == "enUS" or MTH.currentLocale == "enGB" then - - -- FeedOMatic - L.FEEDOMATIC_NAME = "Feed-O-Matic" - L.FEEDOMATIC_DESC = "Helps a Hunter keep his pets well fed" - L.TOOLTIPS_OPTION_FOOD = "Add tooltips on food" - L.TOOLTIPS_OPTION_FOOD_HELP = "Show your current pet's food preference directly in item tooltips." - L.TOOLTIPS_OPTION_OWNPET = "Activate on my pet" - L.TOOLTIPS_OPTION_OWNPET_HELP = "Show your own pet status details in tooltip when hovering your pet context." - L.TOOLTIPS_FOOD_QUALITY_UNKNOWN = "%s can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_QUALITY_UNDER = "%s doesn't like this anymore." - L.TOOLTIPS_FOOD_QUALITY_MIGHT = "%s might eat this." - L.TOOLTIPS_FOOD_QUALITY_WILL = "%s will eat this." - L.TOOLTIPS_FOOD_QUALITY_LIKE = "%s likes to eat this." - L.TOOLTIPS_FOOD_QUALITY_LOVE = "%s loves to eat this." - L.TOOLTIPS_FOOD_MARKER_UNKNOWN = "can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_MARKER_UNDER = "doesn't like this anymore." - L.TOOLTIPS_FOOD_MARKER_MIGHT = "might eat this." - L.TOOLTIPS_FOOD_MARKER_WILL = "will eat this." - L.TOOLTIPS_FOOD_MARKER_LIKE = "likes to eat this." - L.TOOLTIPS_FOOD_MARKER_LOVE = "loves to eat this." - - -- zhunter - L.ZHUNTER_NAME = "zhunter" - L.ZHUNTER_DESC = "Various features to make a hunter's life easier" - --- German / Deutsch -elseif MTH.currentLocale == "deDE" then - - L.FEEDOMATIC_NAME = "Futter-O-Mat" - L.ZHUNTER_NAME = "zhunter" - L.TOOLTIPS_OPTION_FOOD = "Add tooltips on food" - L.TOOLTIPS_OPTION_FOOD_HELP = "Show your current pet's food preference directly in item tooltips." - L.TOOLTIPS_OPTION_OWNPET = "Activate on my pet" - L.TOOLTIPS_OPTION_OWNPET_HELP = "Show your own pet status details in tooltip when hovering your pet context." - L.TOOLTIPS_FOOD_QUALITY_UNKNOWN = "%s can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_QUALITY_UNDER = "%s doesn't like this anymore." - L.TOOLTIPS_FOOD_QUALITY_MIGHT = "%s might eat this." - L.TOOLTIPS_FOOD_QUALITY_WILL = "%s will eat this." - L.TOOLTIPS_FOOD_QUALITY_LIKE = "%s likes to eat this." - L.TOOLTIPS_FOOD_QUALITY_LOVE = "%s loves to eat this." - L.TOOLTIPS_FOOD_MARKER_UNKNOWN = "can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_MARKER_UNDER = "doesn't like this anymore." - L.TOOLTIPS_FOOD_MARKER_MIGHT = "might eat this." - L.TOOLTIPS_FOOD_MARKER_WILL = "will eat this." - L.TOOLTIPS_FOOD_MARKER_LIKE = "likes to eat this." - L.TOOLTIPS_FOOD_MARKER_LOVE = "loves to eat this." - --- French / Français -elseif MTH.currentLocale == "frFR" then - - L.FEEDOMATIC_NAME = "Nourricier" - L.ZHUNTER_NAME = "zhunter" - L.TOOLTIPS_OPTION_FOOD = "Add tooltips on food" - L.TOOLTIPS_OPTION_FOOD_HELP = "Show your current pet's food preference directly in item tooltips." - L.TOOLTIPS_OPTION_OWNPET = "Activate on my pet" - L.TOOLTIPS_OPTION_OWNPET_HELP = "Show your own pet status details in tooltip when hovering your pet context." - L.TOOLTIPS_FOOD_QUALITY_UNKNOWN = "%s can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_QUALITY_UNDER = "%s doesn't like this anymore." - L.TOOLTIPS_FOOD_QUALITY_MIGHT = "%s might eat this." - L.TOOLTIPS_FOOD_QUALITY_WILL = "%s will eat this." - L.TOOLTIPS_FOOD_QUALITY_LIKE = "%s likes to eat this." - L.TOOLTIPS_FOOD_QUALITY_LOVE = "%s loves to eat this." - L.TOOLTIPS_FOOD_MARKER_UNKNOWN = "can eat this, but hasn't tried it yet." - L.TOOLTIPS_FOOD_MARKER_UNDER = "doesn't like this anymore." - L.TOOLTIPS_FOOD_MARKER_MIGHT = "might eat this." - L.TOOLTIPS_FOOD_MARKER_WILL = "will eat this." - L.TOOLTIPS_FOOD_MARKER_LIKE = "likes to eat this." - L.TOOLTIPS_FOOD_MARKER_LOVE = "loves to eat this." +local MTH_SUPPORTED_LOCALES = { + enUS = true, + deDE = true, + esES = true, + ptBR = true, + ruRU = true, + zhCN = true, +} +local function MTH_ResolveLocale(locale) + local resolved = tostring(locale or "enUS") + if MTH_LOCALE_ALIASES[resolved] then + resolved = MTH_LOCALE_ALIASES[resolved] + end + if not MTH_SUPPORTED_LOCALES[resolved] then + resolved = "enUS" + end + return resolved end -MTH.localization[MTH.currentLocale] = L +local activeLocale = MTH_ResolveLocale(MTH.currentLocale) +local localeData = MTH_LocaleData or {} +local uiLocales = localeData.ui or {} +local uiDefault = uiLocales.enUS or {} +local uiActive = uiLocales[activeLocale] or {} --- Get localized string -function MTH:GetLocalization(key, default) - if L[key] then - return L[key] +local function MTH_L(key, default) + if uiActive[key] ~= nil then + return uiActive[key] + end + if uiDefault[key] ~= nil then + return uiDefault[key] end return default or key end +MTH.localization[activeLocale] = uiActive +MTH.localization.enUS = uiDefault + +BINDING_HEADER_FEEDOMATIC = MTH_L("BINDING_HEADER_FEEDOMATIC", "[MetaHunt] Feed-O-Matic") +BINDING_HEADER_ZAspectHeader = MTH_L("BINDING_HEADER_ZAspectHeader", "[MetaHunt] ZAspect Buttons") +BINDING_HEADER_ZTrackHeader = MTH_L("BINDING_HEADER_ZTrackHeader", "[MetaHunt] ZTrack Buttons") +BINDING_HEADER_ZTrapHeader = MTH_L("BINDING_HEADER_ZTrapHeader", "[MetaHunt] ZTrap Buttons") +BINDING_HEADER_ZPetHeader = MTH_L("BINDING_HEADER_ZPetHeader", "[MetaHunt] ZPet Buttons") +BINDING_HEADER_ZAmmoHeader = MTH_L("BINDING_HEADER_ZAmmoHeader", "[MetaHunt] ZAmmo Buttons") + +function MTH:GetLocalization(key, default) + return MTH_L(key, default) +end + +local function MTH_GetLocaleVendorNameMap(locale) + local dataLocales = (MTH_LocaleData and MTH_LocaleData.data) or nil + local vendorLocales = dataLocales and dataLocales.vendors or nil + if type(vendorLocales) ~= "table" then + return nil + end + return vendorLocales[locale] +end + +local function MTH_GetLocaleItemNameMap(locale) + local dataLocales = (MTH_LocaleData and MTH_LocaleData.data) or nil + local itemLocales = dataLocales and dataLocales.items or nil + if type(itemLocales) ~= "table" then + return nil + end + return itemLocales[locale] +end + +local function MTH_GetLocaleBeastNameMap(locale) + local dataLocales = (MTH_LocaleData and MTH_LocaleData.data) or nil + if type(dataLocales) ~= "table" then + MTH_LocaleData = MTH_LocaleData or {} + MTH_LocaleData.data = MTH_LocaleData.data or {} + dataLocales = MTH_LocaleData.data + end + local beastLocales = dataLocales and dataLocales.beasts or nil + if type(beastLocales) ~= "table" then + dataLocales.beasts = {} + beastLocales = dataLocales.beasts + end + + if locale == "enUS" then + local enMap = beastLocales.enUS + if type(enMap) ~= "table" then + enMap = {} + beastLocales.enUS = enMap + end + if next(enMap) == nil then + local beasts = _G and _G.MTH_DS_Beasts or MTH_DS_Beasts + if type(beasts) == "table" then + for beastId, beast in pairs(beasts) do + local id = tonumber(beastId) + local name = type(beast) == "table" and tostring(beast.name or "") or "" + if id and name ~= "" and enMap[id] == nil then + enMap[id] = name + end + end + end + end + end + return beastLocales[locale] +end + +function MTH:GetLocalizedVendorName(vendorId, defaultName) + local id = tonumber(vendorId) + if not id then + return defaultName or "Unknown" + end + local locale = MTH_ResolveLocale(self.currentLocale or GetLocale() or "enUS") + local localeMap = MTH_GetLocaleVendorNameMap(locale) + if localeMap and localeMap[id] and localeMap[id] ~= "" then + return localeMap[id] + end + local fallbackMap = MTH_GetLocaleVendorNameMap("enUS") + if fallbackMap and fallbackMap[id] and fallbackMap[id] ~= "" then + return fallbackMap[id] + end + return defaultName or "Unknown" +end + +function MTH:GetLocalizedNPCNameById(npcId, defaultName) + return self:GetLocalizedVendorName(npcId, defaultName) +end + +function MTH:GetLocalizedItemName(itemId, defaultName) + local id = tonumber(itemId) + if not id then + return defaultName or "Unknown" + end + local locale = MTH_ResolveLocale(self.currentLocale or GetLocale() or "enUS") + local localeMap = MTH_GetLocaleItemNameMap(locale) + if localeMap and localeMap[id] and localeMap[id] ~= "" then + return localeMap[id] + end + local fallbackMap = MTH_GetLocaleItemNameMap("enUS") + if fallbackMap and fallbackMap[id] and fallbackMap[id] ~= "" then + return fallbackMap[id] + end + return defaultName or "Unknown" +end + +function MTH:GetLocalizedBeastName(beastId, defaultName) + local id = tonumber(beastId) + if not id then + return defaultName or "Unknown" + end + local locale = MTH_ResolveLocale(self.currentLocale or GetLocale() or "enUS") + local localeMap = MTH_GetLocaleBeastNameMap(locale) + if localeMap and localeMap[id] and localeMap[id] ~= "" then + return localeMap[id] + end + local fallbackMap = MTH_GetLocaleBeastNameMap("enUS") + if fallbackMap and fallbackMap[id] and fallbackMap[id] ~= "" then + return fallbackMap[id] + end + return defaultName or "Unknown" +end + -- Module localization helper function MTH:RegisterModuleLocalization(module_name, localizationTable) if not self.localization.modules then @@ -118,60 +189,146 @@ function MTH:GetModuleLocalization(module_name, key, default) end local MTH_SPELL_LOCALE = { - enUS = { - ["Banish"] = "Banish", - ["Bestial Wrath"] = "Bestial Wrath", - ["Concussive Shot"] = "Concussive Shot", - ["Counterattack"] = "Counterattack", - ["Critical Mass"] = "Critical Mass", - ["Clever Traps"] = "Clever Traps", - ["Deterrence"] = "Deterrence", - ["Explosive Trap"] = "Explosive Trap", - ["Explosive Trap Effect"] = "Explosive Trap Effect", - ["Feed Pet"] = "Feed Pet", - ["Flare"] = "Flare", - ["Freezing Trap"] = "Freezing Trap", - ["Freezing Trap Effect"] = "Freezing Trap Effect", - ["Frost Trap"] = "Frost Trap", - ["Frost Trap Aura"] = "Frost Trap Aura", - ["Hunter's Mark"] = "Hunter's Mark", - ["Holy Strength"] = "Holy Strength", - ["Immolation Trap"] = "Immolation Trap", - ["Immolation Trap Effect"] = "Immolation Trap Effect", - ["Improved Concussive Shot"] = "Improved Concussive Shot", - ["Improved Wing Clip"] = "Improved Wing Clip", - ["Perception"] = "Perception", - ["Piercing Shot"] = "Piercing Shot", - ["Piercing Shots"] = "Piercing Shots", - ["Quick Shots"] = "Quick Shots", - ["Rapid Fire"] = "Rapid Fire", - ["Scare Beast"] = "Scare Beast", - ["Scatter Shot"] = "Scatter Shot", - ["Scorpid Poison"] = "Scorpid Poison", - ["Scorpid Sting"] = "Scorpid Sting", - ["Serpent Sting"] = "Serpent Sting", - ["Stoneform"] = "Stoneform", - ["Unstable Power"] = "Unstable Power", - ["Ephemeral Power"] = "Ephemeral Power", - ["Viper Sting"] = "Viper Sting", - ["War Stomp"] = "War Stomp", - ["Will of the Forsaken"] = "Will of the Forsaken", - ["Wing Clip"] = "Wing Clip", - ["Wyvern Sting"] = "Wyvern Sting", - ["Blood Fury"] = "Blood Fury", - ["Berserking"] = "Berserking", - }, } +local MTH_SPELL_ID_BY_TOKEN = { + ["Banish"] = 710, + ["Bestial Wrath"] = 19574, + ["Concussive Shot"] = 5116, + ["Counterattack"] = 19306, + ["Clever Traps"] = 19239, + ["Deterrence"] = 19263, + ["Explosive Trap"] = 13813, + ["Explosive Trap Effect"] = 13812, + ["Feed Pet"] = 6991, + ["Flare"] = 1543, + ["Freezing Trap"] = 1499, + ["Freezing Trap Effect"] = 3355, + ["Frost Trap"] = 13809, + ["Frost Trap Aura"] = 13810, + ["Hunter's Mark"] = 1130, + ["Immolation Trap"] = 13795, + ["Immolation Trap Effect"] = 13797, + ["Improved Concussive Shot"] = 19407, + ["Improved Wing Clip"] = 19229, + ["Perception"] = 20600, + ["Rapid Fire"] = 3045, + ["Scare Beast"] = 1513, + ["Scatter Shot"] = 19503, + ["Scorpid Sting"] = 3043, + ["Serpent Sting"] = 1978, + ["Stoneform"] = 20594, + ["Viper Sting"] = 3034, + ["War Stomp"] = 20549, + ["Will of the Forsaken"] = 7744, + ["Wing Clip"] = 2974, + ["Wyvern Sting"] = 19386, + ["Blood Fury"] = 20572, + ["Berserking"] = 26297, +} + +do + local spellLocales = (MTH_LocaleData and MTH_LocaleData.spells) or nil + if type(spellLocales) == "table" then + for localeKey, localeMap in pairs(spellLocales) do + if type(localeMap) == "table" then + MTH_SPELL_LOCALE[localeKey] = localeMap + end + end + end +end + +do + local extras = { + enUS = { + ["Devilsaur Eye"] = "Devilsaur Eye", + ["Devilsaur Fury"] = "Devilsaur Fury", + ["Zandalarian Hero Medallion"] = "Zandalarian Hero Medallion", + ["Restless Strength"] = "Restless Strength", + ["Earthstrike"] = "Earthstrike", + ["Badge of the Swarmguard"] = "Badge of the Swarmguard", + ["Jom Gabbar"] = "Jom Gabbar", + ["Kiss of the Spider"] = "Kiss of the Spider", + ["Slayer's Crest"] = "Slayer's Crest", + }, + deDE = { + ["Devilsaur Eye"] = "Auge eines Teufelssauriers", + ["Devilsaur Fury"] = "Zorn des Teufelssauriers", + ["Zandalarian Hero Medallion"] = "Zandalarianisches Heldenmedallion", + ["Restless Strength"] = "Ruhelose Stärke", + ["Earthstrike"] = "Erdschlag", + ["Badge of the Swarmguard"] = "Abzeichen der Schwarmwache", + ["Jom Gabbar"] = "Jom Gabbar", + ["Kiss of the Spider"] = "Kuss der Spinne", + ["Slayer's Crest"] = "Jägerspitze", + }, + esES = { + ["Devilsaur Eye"] = "Ojo de Demosaurio", + ["Devilsaur Fury"] = "Furia del devilsaurio", + ["Zandalarian Hero Medallion"] = "Zandalarian Hero Medallion", + ["Restless Strength"] = "Fuerza agitada", + ["Earthstrike"] = "Golpeterra", + ["Badge of the Swarmguard"] = "Badge of the Swarmguard", + ["Jom Gabbar"] = "Jom Gabbar", + ["Kiss of the Spider"] = "Kiss of the Spider", + ["Slayer's Crest"] = "Cresta de Matador", + }, + frFR = { + ["Devilsaur Eye"] = "Oeil de diablosaure", + ["Devilsaur Fury"] = "Fureur du diablosaure", + ["Zandalarian Hero Medallion"] = "Médaillon de héros zandalarien", + ["Restless Strength"] = "Force inconstante", + ["Earthstrike"] = "Choc de terre", + ["Badge of the Swarmguard"] = "Insigne de garde-essaim", + ["Jom Gabbar"] = "Jom Gabbar", + ["Kiss of the Spider"] = "Baiser de l'araignée", + ["Slayer's Crest"] = "Ecusson de tueur", + }, + zhCN = { + ["Devilsaur Eye"] = "魔暴龙眼", + ["Devilsaur Fury"] = "魔暴龙之怒", + ["Zandalarian Hero Medallion"] = "赞达拉英雄徽记", + ["Restless Strength"] = "充沛之力", + ["Earthstrike"] = "大地之击", + ["Badge of the Swarmguard"] = "虫群守卫徽章", + ["Jom Gabbar"] = "Jom Gabbar", + ["Kiss of the Spider"] = "蜘蛛之吻", + ["Slayer's Crest"] = "屠戮者徽记", + }, + } + + for localeKey, localeMap in pairs(extras) do + if type(MTH_SPELL_LOCALE[localeKey]) ~= "table" then + MTH_SPELL_LOCALE[localeKey] = {} + end + for token, localized in pairs(localeMap) do + if MTH_SPELL_LOCALE[localeKey][token] == nil then + MTH_SPELL_LOCALE[localeKey][token] = localized + end + end + end +end + MTH.Const = MTH.Const or {} MTH.Const.SpellLocaleMap = MTH_SPELL_LOCALE +MTH.Const.NPCLocaleMap = (MTH_LocaleData and MTH_LocaleData.data and MTH_LocaleData.data.vendors) or {} +MTH.Const.ItemLocaleMap = (MTH_LocaleData and MTH_LocaleData.data and MTH_LocaleData.data.items) or {} +MTH.Const.BeastLocaleMap = (MTH_LocaleData and MTH_LocaleData.data and MTH_LocaleData.data.beasts) or {} function MTH:LocalizeSpell(spellToken) local key = tostring(spellToken or "") if key == "" then return key end - local locale = tostring(self.currentLocale or GetLocale() or "enUS") + local getSpellInfo = _G and _G["GetSpellInfo"] or nil + local spellId = MTH_SPELL_ID_BY_TOKEN[key] + if spellId and getSpellInfo then + local spellName = getSpellInfo(spellId) + if spellName and spellName ~= "" then + return spellName + end + end + local locale = MTH_ResolveLocale(self.currentLocale or GetLocale() or "enUS") local localeMap = MTH_SPELL_LOCALE[locale] or MTH_SPELL_LOCALE.enUS if localeMap and localeMap[key] then return localeMap[key] diff --git a/api/map-markers.lua b/api/map-markers.lua index 47cfb34..c486b09 100644 --- a/api/map-markers.lua +++ b/api/map-markers.lua @@ -572,6 +572,7 @@ function MTH_Map:FocusBeast(beastId, beast) local cr, cg, cb = MTH_Map_GetFamilyColor(row.family) local nodes = {} local firstZoneId = nil + local displayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(id, row.name)) or row.name or "Unknown" for i = 1, table.getn(coords) do local c = coords[i] @@ -581,7 +582,7 @@ function MTH_Map:FocusBeast(beastId, beast) firstZoneId = zoneId end local details = string.format("Family: %s\nLevel: %s\nAbilities: %s", row.family or "?", row.lvl or "?", row.abilities or "None") - MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", row.name or "Unknown", id), details, cr, cg, cb, { kind = "beast", beastId = id }) + MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", displayName, id), details, cr, cg, cb, { kind = "beast", beastId = id }) end end @@ -637,6 +638,7 @@ function MTH_Map:FocusVendor(vendorId, vendor) local nodes = {} local firstZoneId = nil + local displayName = (MTH and MTH.GetLocalizedVendorName and MTH:GetLocalizedVendorName(id, row.name)) or row.name or "Unknown" for i = 1, table.getn(coords) do local c = coords[i] if c and c[1] and c[2] and c[3] then @@ -645,7 +647,7 @@ function MTH_Map:FocusVendor(vendorId, vendor) firstZoneId = zoneId end local details = string.format("React: %s\nLevel: %s\nFunctions: %s", react ~= "" and react or "?", row.lvl or "?", metaTags) - MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", row.name or "Unknown", id), details, cr, cg, cb, { kind = "vendor", vendorId = id }) + MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", displayName, id), details, cr, cg, cb, { kind = "vendor", vendorId = id }) end end @@ -1087,12 +1089,13 @@ function MTH_Map:RegisterDefaultProviders() for beastId, beast in pairs(MTH_DS_Beasts) do local coords = beast and MTH_Map_GetCoordsForUnit(beastId, beast.coords) if beast and coords and table.getn(coords) > 0 then + local displayName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(beastId, beast.name)) or beast.name or "Unknown" local cr, cg, cb = MTH_Map_GetFamilyColor(beast.family) for i = 1, table.getn(coords) do local c = coords[i] if c and c[1] and c[2] and c[3] then local details = string.format("Family: %s\nLevel: %s\nAbilities: %s", beast.family or "?", beast.lvl or "?", beast.abilities or "None") - MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", beast.name or "Unknown", beastId), details, cr, cg, cb, { kind = "beast", beastId = beastId }) + MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", displayName, beastId), details, cr, cg, cb, { kind = "beast", beastId = beastId }) end end end @@ -1111,11 +1114,12 @@ function MTH_Map:RegisterDefaultProviders() for vendorId, vendor in pairs(MTH_DS_Vendors) do local coords = vendor and MTH_Map_GetCoordsForUnit(vendorId, vendor.coords) if vendor and coords and table.getn(coords) > 0 then + local displayName = (MTH and MTH.GetLocalizedVendorName and MTH:GetLocalizedVendorName(vendorId, vendor.name)) or vendor.name or "Unknown" for i = 1, table.getn(coords) do local c = coords[i] if c and c[1] and c[2] and c[3] then local details = string.format("Faction: %s\nLevel: %s", vendor.fac or "?", vendor.lvl or "?") - MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", vendor.name or "Unknown", vendorId), details, 0.20, 0.90, 1.00, { kind = "vendor", vendorId = vendorId }) + MTH_Map_AddNode(nodes, c[3], c[1], c[2], string.format("%s (%d)", displayName, vendorId), details, 0.20, 0.90, 1.00, { kind = "vendor", vendorId = vendorId }) end end end @@ -1136,15 +1140,19 @@ function MTH_Map:RegisterDefaultProviders() for itemId, item in pairs(items) do if item and item.drops then + local itemDefaultName = item.name or "Unknown" + local itemDisplayName = (MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(itemId, itemDefaultName) + or itemDefaultName for creatureId, chance in pairs(item.drops) do local creature = MTH_DS_Beasts and MTH_DS_Beasts[creatureId] local coords = MTH_Map_GetCoordsForUnit(creatureId, creature and creature.coords) local creatureName = nil if MTH_DS_CreatureCoords and MTH_DS_CreatureCoords[creatureId] and table.getn(MTH_DS_CreatureCoords[creatureId]) > 0 then - creatureName = (MTH_DS_CreatureNames and MTH_DS_CreatureNames[creatureId]) or (creature and creature.name) + creatureName = (MTH_DS_CreatureNames and MTH_DS_CreatureNames[creatureId]) or ((MTH and MTH.GetLocalizedBeastName and creature and MTH:GetLocalizedBeastName(creatureId, creature.name)) or (creature and creature.name)) elseif creature and creature.coords and table.getn(creature.coords) > 0 then - creatureName = creature.name + creatureName = (MTH and MTH.GetLocalizedBeastName and MTH:GetLocalizedBeastName(creatureId, creature.name)) or creature.name end if coords and table.getn(coords) > 0 then @@ -1155,7 +1163,7 @@ function MTH_Map:RegisterDefaultProviders() local chanceText = pct and string.format("%.2f%%", pct) or tostring(chance or "?") local details = string.format( "Item: %s (%d)\nDrop Creature: %s (%d)\nDrop Chance: %s", - item.name or "Unknown", + itemDisplayName or "Unknown", tonumber(itemId) or 0, creatureName or "Unknown", tonumber(creatureId) or 0, @@ -1166,7 +1174,7 @@ function MTH_Map:RegisterDefaultProviders() c[3], c[1], c[2], - string.format("%s ← %s", item.name or "Unknown Item", creatureName or "Unknown Creature"), + string.format("%s ← %s", itemDisplayName or "Unknown Item", creatureName or "Unknown Creature"), details, 1.00, 0.35, diff --git a/api/minimap-button.lua b/api/minimap-button.lua index fda07dd..bb5bc2c 100644 --- a/api/minimap-button.lua +++ b/api/minimap-button.lua @@ -6,6 +6,13 @@ if not MTH_MinimapButton then MTH_MinimapButton = {} end +local function MTH_MB_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + local function MTH_MB_GetStore() if not MTH_CharSavedVariables then MTH_CharSavedVariables = {} @@ -111,10 +118,10 @@ function MTH_MinimapButton:Initialize() self = self or this if not self then return end GameTooltip:SetOwner(self, "ANCHOR_LEFT") - GameTooltip:SetText("MetaHunt", 1, 0.82, 0) - GameTooltip:AddLine("Left-Click: Open Hunter Book", 1, 1, 1) - GameTooltip:AddLine("Right-Click: Open MetaHunt Options", 1, 1, 1) - GameTooltip:AddLine("Drag: Move button", 0.8, 0.8, 0.8) + 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) + GameTooltip:AddLine(MTH_MB_L("MINIMAP_HINT_DRAG", "Drag: Move button"), 0.8, 0.8, 0.8) GameTooltip:Show() end) diff --git a/api/options-autobuy.lua b/api/options-autobuy.lua index bc37638..69849bd 100644 --- a/api/options-autobuy.lua +++ b/api/options-autobuy.lua @@ -346,6 +346,15 @@ local function MTH_AB_GetBuyableItems(subtype) if type(MTH_AutoBuy_GetProjectileItems) == "function" then local result = MTH_AutoBuy_GetProjectileItems(subtype) if type(result) == "table" then + for i = 1, table.getn(result) do + local row = result[i] + if type(row) == "table" then + local itemId = tonumber(row.itemId) + if itemId and MTH and MTH.GetLocalizedItemName then + row.name = MTH:GetLocalizedItemName(itemId, row.name) + end + end + end return result end end @@ -356,9 +365,13 @@ local function MTH_AB_GetBuyableItems(subtype) for itemId, row in pairs(source) do if type(row) == "table" and string.lower(tostring(row.subtype or "")) == wanted and type(row.vendors) == "table" then for _ in pairs(row.vendors) do + local defaultName = tostring(row.name or ("Item " .. tostring(itemId))) + local localizedName = (MTH and MTH.GetLocalizedItemName) + and MTH:GetLocalizedItemName(itemId, defaultName) + or defaultName table.insert(result, { itemId = tonumber(itemId) or itemId, - name = tostring(row.name or ("Item " .. tostring(itemId))), + name = tostring(localizedName), level = tonumber(row.level) or 0, reqlevel = tonumber(row.reqlevel) or 0, }) diff --git a/api/options-chronometer.lua b/api/options-chronometer.lua index 37913c8..08f0c75 100644 --- a/api/options-chronometer.lua +++ b/api/options-chronometer.lua @@ -336,25 +336,36 @@ local function MTH_CHRON_NormalizeSection(tabKey) return "general" end -local function MTH_CHRON_RenderTimerSection(container, profile, title, items, bucket) - local timerX = 20 - local timerY = -84 - MTH_CHRON_MakeTitle(container, "MetaHuntOptionsChronometerTimersHeader", title, timerX, timerY) +local function MTH_CHRON_RenderTimerSection(container, profile, title, items, bucket, opts) + opts = opts or {} + local timerX = opts.x or 20 + local timerY = opts.y or -84 + local prefix = tostring(opts.prefix or "Main") + + MTH_CHRON_MakeTitle(container, "MetaHuntOptionsChronometerTimersHeader" .. prefix, title, timerX, timerY) timerY = timerY - 24 if table.getn(items) == 0 then - MTH_CHRON_MakeSmall(container, "MetaHuntOptionsChronometerSectionEmpty", "(none)", timerX + 8, timerY) + MTH_CHRON_MakeSmall(container, "MetaHuntOptionsChronometerSectionEmpty" .. prefix, "(none)", timerX + 8, timerY) return end for i = 1, table.getn(items) do if timerY < -560 then - MTH_CHRON_MakeSmall(container, "MetaHuntOptionsChronometerOverflow", "...more", timerX + 8, timerY) + MTH_CHRON_MakeSmall(container, "MetaHuntOptionsChronometerOverflow" .. prefix, "...more", timerX + 8, timerY) break end - local timerName = items[i] - local controlName = "MetaHuntOptionsChronometerTimer" .. tostring(bucket) .. tostring(i) - local check = MTH_CreateCheckbox(container, controlName, tostring(timerName), timerY, timerX) + local row = items[i] + local timerName = row + local label = row + if type(row) == "table" then + timerName = row.key or row.timer or row.name + label = row.label or row.name or row.key + end + timerName = tostring(timerName or "") + label = tostring(label or timerName) + local controlName = "MetaHuntOptionsChronometerTimer" .. prefix .. tostring(bucket) .. tostring(i) + 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) @@ -371,6 +382,43 @@ local function MTH_CHRON_RenderTimerSection(container, profile, title, items, bu end end +local MTH_CHRON_HUNTER_TRINKETS = { + { labelToken = "Devilsaur Eye", timerToken = "Devilsaur Fury" }, + { labelToken = "Zandalarian Hero Medallion", timerToken = "Restless Strength" }, + { labelToken = "Earthstrike", timerToken = "Earthstrike" }, + { labelToken = "Badge of the Swarmguard", timerToken = "Badge of the Swarmguard" }, + { labelToken = "Jom Gabbar", timerToken = "Jom Gabbar" }, + { labelToken = "Kiss of the Spider", timerToken = "Kiss of the Spider" }, + { labelToken = "Slayer's Crest", timerToken = "Slayer's Crest" }, +} + +local function MTH_CHRON_LocalizeTimerToken(token) + if MTH and MTH.LocalizeSpell then + return tostring(MTH:LocalizeSpell(token) or token) + end + return tostring(token) +end + +local function MTH_CHRON_BuildHunterTrinketItems(classEvents) + local eventSet = {} + for i = 1, table.getn(classEvents or {}) do + eventSet[tostring(classEvents[i])] = true + end + + local result = {} + for i = 1, table.getn(MTH_CHRON_HUNTER_TRINKETS) do + local def = MTH_CHRON_HUNTER_TRINKETS[i] + local key = MTH_CHRON_LocalizeTimerToken(def.timerToken) + if eventSet[key] then + table.insert(result, { + key = key, + label = MTH_CHRON_LocalizeTimerToken(def.labelToken), + }) + end + end + return result +end + function MTH_RefreshChronometerOptions(tabKey) if not MTH_CHRON_IsReady() then return end MTH_SetupChronometerOptions(tabKey) @@ -582,11 +630,20 @@ function MTH_SetupChronometerOptions(tabKey) else local classSpells, classEvents, racial = MTH_CHRON_BuildTimerLists() if section == "classspells" then - MTH_CHRON_RenderTimerSection(container, profile, "Hunter Spells", classSpells, class) + MTH_CHRON_RenderTimerSection(container, profile, "Hunter Spells", classSpells, class, { + x = 20, + y = -84, + prefix = "ClassSpells", + }) + MTH_CHRON_RenderTimerSection(container, profile, "Hunter Trinkets", MTH_CHRON_BuildHunterTrinketItems(classEvents), class, { + x = 300, + y = -84, + prefix = "ClassTrinkets", + }) elseif section == "classevents" then - MTH_CHRON_RenderTimerSection(container, profile, "Hunter Events", classEvents, class) + MTH_CHRON_RenderTimerSection(container, profile, "Hunter Events", classEvents, class, { prefix = "ClassEvents" }) elseif section == "racial" then - MTH_CHRON_RenderTimerSection(container, profile, "Racial", racial, "RACIAL") + MTH_CHRON_RenderTimerSection(container, profile, "Racial", racial, "RACIAL", { prefix = "Racial" }) end end end diff --git a/api/options-credits.lua b/api/options-credits.lua index f8c080d..a73d921 100644 --- a/api/options-credits.lua +++ b/api/options-credits.lua @@ -5,6 +5,13 @@ local MTH_CREDITS_READY = MTH_OptionsRequire and MTH_OptionsRequire("options-cre local MTH_CREDITS_FONT_DELTA = 2 +local function MTH_CR_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + local function MTH_CreditsBumpFont(fs) if not fs or not fs.GetFont or not fs.SetFont then return end local path, size, flags = fs:GetFont() @@ -18,12 +25,12 @@ local function MTH_CreditsInsertLink(url) if link == "" then return end if type(MTH_InsertLinkToChat) == "function" and MTH_InsertLinkToChat(link) then if MTH and MTH.Print then - MTH:Print("Link inserted in chat: " .. link) + MTH:Print(MTH_CR_L("CREDITS_LINK_INSERTED", "Link inserted in chat: ") .. link) end return end if MTH and MTH.Print then - MTH:Print("Link: " .. link) + MTH:Print(MTH_CR_L("CREDITS_LINK_FALLBACK", "Link: ") .. link) end end @@ -93,7 +100,7 @@ function MTH_SetupCreditsOptions() local title = container:CreateFontString("MetaHuntOptionsCreditsTitle", "ARTWORK", "GameFontNormal") title:SetPoint("TOPLEFT", container, "TOPLEFT", 10, -10) - title:SetText("Credits") + title:SetText(MTH_CR_L("CREDITS_TITLE", "Credits")) title:SetTextColor(1.00, 0.82, 0.00) local scrollFrame = MTH_GetFrame("MetaHuntOptionsCreditsScroll") @@ -113,18 +120,20 @@ function MTH_SetupCreditsOptions() MTH_CreditsClearFrame(content) scrollFrame:SetScrollChild(content) - local cursor = MTH_CreditsCreateText(content, content, "About the code", "GameFontNormal", -2, 1.00, 0.82, 0.00) + local cursor = MTH_CreditsCreateText(content, content, MTH_CR_L("CREDITS_ABOUT_CODE_TITLE", "About the code"), "GameFontNormal", -2, 1.00, 0.82, 0.00) cursor = MTH_CreditsCreateText(content, cursor, + MTH_CR_L("CREDITS_ABOUT_CODE_INTRO", "This addon is, in others, a compilation of old vanilla addons that I loved and played with during years. But most of them had become very buggy with TwoW as new contain was added to the server. \n I fixed, reworked, enhanced, and melted them within a modern modular framework that I created.\n" - .. "I want to make it crystal clear about what work is mine, and what is not and respectfully credit the original authors for the great stuff I've taken from them:", + .. "I want to make it crystal clear about what work is mine, and what is not and respectfully credit the original authors for the great stuff I've taken from them:"), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "- zBars, Antidaze and Autostrip were core functionalities of Vanilla zHunterMod addon. And I kept the \"z\" naming of bars/buttons to always remember it. On top of this I have created myself zAmmo, zCompanions, zMount, zToys.\nAlso the SmartAmmo feature idea is coming from Zhuntermod: there was a file in it with that functionality, but was like a work-in-progress, totally unfunctional and even \"dangerous\" in its current state, and was not active in the addon. Since it was a fucking great idea, I recoded it mostly from scratch and made it work reliably and safely.", + MTH_CR_L("CREDITS_ABOUT_ZHUNTER", + "- zBars, Antidaze and Autostrip were core functionalities of Vanilla zHunterMod addon. And I kept the \"z\" naming of bars/buttons to always remember it. On top of this I have created myself zAmmo, zCompanions, zMount, zToys.\nAlso the SmartAmmo feature idea is coming from Zhuntermod: there was a file in it with that functionality, but was like a work-in-progress, totally unfunctional and even \"dangerous\" in its current state, and was not active in the addon. Since it was a fucking great idea, I recoded it mostly from scratch and made it work reliably and safely."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "- Feed-o-Matic was entirely the work of Fizzwidget. I made it work for Twow, by melting it as a module calling Metahunt core to get pet's state and up-to-date data for new pet families and their diet.", + MTH_CR_L("CREDITS_ABOUT_FEEDOMATIC", "- Feed-o-Matic was entirely the work of Fizzwidget. I made it work for Twow, by melting it as a module calling Metahunt core to get pet's state and up-to-date data for new pet families and their diet."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateLink(content, "https://www.wowinterface.com/downloads/info4160-FizzwidgetFeed-O-Matic.html", @@ -133,7 +142,7 @@ function MTH_SetupCreditsOptions() -4) cursor = MTH_CreditsCreateText(content, cursor, - "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Turtle wow data, and is now usable on other things than Beasts.", + MTH_CR_L("CREDITS_ABOUT_TOOLTIPS", "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Turtle wow data, and is now usable on other things than Beasts."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateLink(content, "https://legacy-wow.com/vanilla-addons/fizzwidget-hunter-helper/", @@ -142,7 +151,7 @@ function MTH_SetupCreditsOptions() -4) cursor = MTH_CreditsCreateText(content, cursor, - "- Chronometer was an old and very popular vanilla addon working with ACE2 libraries. It has known uncountable iterations by various people over the years, and I can't credit them all of them here. The current version used by Metahunt is based on this Twow conversion made by \"wigan91\". I have reworked it to have it Hunter-focused-only: removed the non-hunter/race stuff, improved the definition for spells/effects config that were not correct, added missing hunter spells (not many), and implemented my own bar color scheme fitting better the hunter spells.", + MTH_CR_L("CREDITS_ABOUT_CHRONOMETER", "- Chronometer was an old and very popular vanilla addon working with ACE2 libraries. It has known uncountable iterations by various people over the years, and I can't credit them all of them here. The current version used by Metahunt is based on this Twow conversion made by \"wigan91\". I have reworked it to have it Hunter-focused-only: removed the non-hunter/race stuff, improved the definition for spells/effects config that were not correct, added missing hunter spells (not many), and implemented my own bar color scheme fitting better the hunter spells."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateLink(content, "https://github.com/wigan91/Chronometer-TWoW", @@ -151,25 +160,25 @@ function MTH_SetupCreditsOptions() -4) cursor = MTH_CreditsCreateText(content, cursor, - "- The Map/Marker system is the one of pfQuest from Master Shagu. Unfortunately he is no more reachable for some months and I could not have some talk with him about this. I mostly let it untouched, I just made slight modifications so it can integrate better within Metahunt, and doesn't conflict with pfQuest.", + MTH_CR_L("CREDITS_ABOUT_MAP", "- The Map/Marker system is the one of pfQuest from Master Shagu. Unfortunately he is no more reachable for some months and I could not have some talk with him about this. I mostly let it untouched, I just made slight modifications so it can integrate better within Metahunt, and doesn't conflict with pfQuest."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "- The system allowing to fetch itemlinks in game (In the Weapon tab of the Hunter Book notably) is the one of Atlas Twow.", + MTH_CR_L("CREDITS_ABOUT_ATLAS_LINKS", "- The system allowing to fetch itemlinks in game (In the Weapon tab of the Hunter Book notably) is the one of Atlas Twow."), "GameFontNormalSmall", -10) - cursor = MTH_CreditsCreateText(content, cursor, "About data sources", "GameFontNormal", -14, 1.00, 0.82, 0.00) + cursor = MTH_CreditsCreateText(content, cursor, MTH_CR_L("CREDITS_ABOUT_DATA_TITLE", "About data sources"), "GameFontNormal", -14, 1.00, 0.82, 0.00) cursor = MTH_CreditsCreateText(content, cursor, - "Metahunt ships with its own Turtle-WoW datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\n" - .. "Sources used to build the data include:", + MTH_CR_L("CREDITS_ABOUT_DATA_INTRO", "Metahunt ships with its own Turtle-WoW datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\n" + .. "Sources used to build the data include:"), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "- pfQuest for Beasts and Ammo vendors NPCs and their spawn points (and beasts respawn times if any). Thank you again Shagu.", + MTH_CR_L("CREDITS_DATA_PFQUEST", "- pfQuest for Beasts and Ammo vendors NPCs and their spawn points (and beasts respawn times if any). Thank you again Shagu."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "- This invaluable and very accurate spreadsheet for beasts having pet abilities. A big thanks to all twow players that crafted this! Now you dont need that sheet anymore, you have Metahunt! And the Great Book of Huntards is awesome and accurate also because of YOU.", + MTH_CR_L("CREDITS_DATA_SHEET", "- This invaluable and very accurate spreadsheet for beasts having pet abilities. A big thanks to all twow players that crafted this! Now you dont need that sheet anymore, you have Metahunt! And the Great Book of Huntards is awesome and accurate also because of YOU."), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateLink(content, "https://docs.google.com/spreadsheets/d/1u33knqlYXvY-jR6pvTd58gyDg8OYEuwYsSoEnIjeA8k/edit?gid=4136205#gid=4136205", @@ -178,16 +187,16 @@ function MTH_SetupCreditsOptions() -4) cursor = MTH_CreditsCreateText(content, cursor, - "- Atlas twow for ranged weapon sources\n\n" - .. "- Twow wiki for pet diet (which was incomplete, missing Serpents and Foxes)", + MTH_CR_L("CREDITS_DATA_OTHER", "- Atlas twow for ranged weapon sources\n\n" + .. "- Twow wiki for pet diet (which was incomplete, missing Serpents and Foxes)"), "GameFontNormalSmall", -10) cursor = MTH_CreditsCreateText(content, cursor, - "With that being said, go back hunting fellas!", + MTH_CR_L("CREDITS_CLOSING", "With that being said, go back hunting fellas!"), "GameFontNormalSmall", -10, 1.00, 0.82, 0.00) cursor = MTH_CreditsCreateText(content, cursor, - "\n" - .. "Metasploit , of Nordaanar.", + MTH_CR_L("CREDITS_SIGNATURE", "\n" + .. "Metasploit , of Nordaanar."), "GameFontNormalSmall", -10) end diff --git a/api/options-feedomatic.lua b/api/options-feedomatic.lua index b2606e2..a6a7248 100644 --- a/api/options-feedomatic.lua +++ b/api/options-feedomatic.lua @@ -14,6 +14,13 @@ local MTH_FOM_STATE = { ctrl = {}, } +local function MTH_FOM_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + local function MTH_EnsureFOMConfig() if FOM_Config then return @@ -69,16 +76,16 @@ end local function MTH_FOM_GetBindingDisplayText() if not GetBindingKey then - return "Unavailable" + return MTH_FOM_L("FOM_BIND_UNAVAILABLE", "Unavailable") end local key1, key2 = GetBindingKey("FEEDOMATIC") if not key1 and not key2 then - return "Unbound" + return MTH_FOM_L("FOM_BIND_UNBOUND", "Unbound") end if key1 and key2 then return key1 .. " / " .. key2 end - return key1 or key2 or "Unbound" + return key1 or key2 or MTH_FOM_L("FOM_BIND_UNBOUND", "Unbound") end local function MTH_FOM_UpdateBindingStatus() @@ -87,9 +94,9 @@ local function MTH_FOM_UpdateBindingStatus() return end if MTH_FOM_STATE.bindingCapture then - bindStatus:SetText("Feed key: press a key... (ESC to clear)") + bindStatus:SetText(MTH_FOM_L("FOM_BIND_STATUS_PROMPT", "Feed key: press a key... (ESC to clear)")) else - bindStatus:SetText("Feed key: " .. MTH_FOM_GetBindingDisplayText()) + bindStatus:SetText(string.format(MTH_FOM_L("FOM_BIND_STATUS_VALUE", "Feed key: %s"), MTH_FOM_GetBindingDisplayText())) end end @@ -100,7 +107,7 @@ local function MTH_FOM_StopBindingCapture() MTH_FOM_STATE.bindButton:SetPropagateKeyboardInput(true) end MTH_FOM_STATE.bindButton:EnableKeyboard(false) - MTH_FOM_STATE.bindButton:SetText("Set Key") + MTH_FOM_STATE.bindButton:SetText(MTH_FOM_L("FOM_BIND_SET_KEY", "Set Key")) end MTH_FOM_UpdateBindingStatus() end @@ -108,7 +115,7 @@ end local function MTH_FOM_StartBindingCapture() MTH_FOM_STATE.bindingCapture = true if MTH_FOM_STATE.bindButton then - MTH_FOM_STATE.bindButton:SetText("Press key...") + MTH_FOM_STATE.bindButton:SetText(MTH_FOM_L("FOM_BIND_PRESS_KEY", "Press key...")) MTH_FOM_STATE.bindButton:EnableKeyboard(true) if MTH_FOM_STATE.bindButton.SetPropagateKeyboardInput then MTH_FOM_STATE.bindButton:SetPropagateKeyboardInput(false) @@ -128,13 +135,13 @@ end local function MTH_FOM_SaveBinding(key) if not SetBinding or not SaveBindings or not GetBindingKey then if MTH and MTH.Print then - MTH:Print("Keybinding APIs unavailable.") + MTH:Print(MTH_FOM_L("FOM_ERROR_KEYBIND_API_UNAVAILABLE", "Keybinding APIs unavailable.")) end return end if InCombatLockdown and InCombatLockdown() then if MTH and MTH.Print then - MTH:Print("Cannot change keybindings during combat.") + MTH:Print(MTH_FOM_L("FOM_ERROR_KEYBIND_COMBAT_LOCKED", "Cannot change keybindings during combat.")) end MTH_FOM_StopBindingCapture() return @@ -207,7 +214,7 @@ function MTH_SetupFeedOMaticOptions() local title = container:CreateFontString("MetaHuntOptionsFeedOMaticTitle", "ARTWORK", "GameFontHighlight") title:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -10) - title:SetText("Feed-O-Matic") + title:SetText(MTH_FOM_L("FOM_TITLE", "Feed-O-Matic")) local statusNotice = container:CreateFontString("MetaHuntOptionsFeedOMaticStatusNotice", "ARTWORK", "GameFontNormalSmall") statusNotice:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -34) @@ -215,9 +222,9 @@ function MTH_SetupFeedOMaticOptions() statusNotice:SetJustifyH("LEFT") statusNotice:SetJustifyV("TOP") statusNotice:SetTextColor(0.35, 0.65, 1) - statusNotice:SetText("Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for TurtleWoW because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional.") + statusNotice:SetText(MTH_FOM_L("FOM_STATUS_NOTICE", "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for TurtleWoW because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional.")) - local moduleCheck = MTH_CreateCheckbox(container, "MetaHuntOptionsFeedOMaticEnabled", "Enable FeedOMatic module", -32 + yAdjust) + 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 @@ -226,7 +233,7 @@ function MTH_SetupFeedOMaticOptions() if MTH and MTH.SetModuleEnabled then local ok, err = MTH:SetModuleEnabled("feedomatic", enabled) if not ok and MTH and MTH.Print then - MTH:Print("Failed to change FeedOMatic state: " .. tostring(err)) + MTH:Print(string.format(MTH_FOM_L("FOM_ERROR_TOGGLE_FAILED", "Failed to change FeedOMatic state: %s"), tostring(err))) end end MTH_RefreshFeedOMaticOptions() @@ -236,18 +243,18 @@ function MTH_SetupFeedOMaticOptions() local leftHeader = container:CreateFontString("MetaHuntOptionsFeedOMaticGeneralHeader", "ARTWORK", "GameFontHighlight") leftHeader:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -62 + yAdjust) - leftHeader:SetText("General") + leftHeader:SetText(MTH_FOM_L("FOM_HEADER_GENERAL", "General")) local bindStatus = container:CreateFontString("MetaHuntOptionsFOMBindStatus", "ARTWORK", "GameFontNormalSmall") bindStatus:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -80 + yAdjust) - bindStatus:SetText("Feed key: " .. MTH_FOM_GetBindingDisplayText()) + bindStatus:SetText(string.format(MTH_FOM_L("FOM_BIND_STATUS_VALUE", "Feed key: %s"), MTH_FOM_GetBindingDisplayText())) MTH_FOM_STATE.bindStatus = bindStatus local bindButton = CreateFrame("Button", "MetaHuntOptionsFOMBindButton", container, "UIPanelButtonTemplate") bindButton:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -100 + yAdjust) bindButton:SetWidth(90) bindButton:SetHeight(22) - bindButton:SetText("Set Key") + bindButton:SetText(MTH_FOM_L("FOM_BIND_SET_KEY", "Set Key")) bindButton:EnableKeyboard(false) bindButton:SetScript("OnClick", function() if MTH_FOM_STATE.bindingCapture then @@ -279,7 +286,7 @@ function MTH_SetupFeedOMaticOptions() bindClearButton:SetPoint("LEFT", bindButton, "RIGHT", 8, 0) bindClearButton:SetWidth(70) bindClearButton:SetHeight(22) - bindClearButton:SetText("Clear") + bindClearButton:SetText(MTH_FOM_L("FOM_BIND_CLEAR", "Clear")) bindClearButton:SetScript("OnClick", function() MTH_FOM_SaveBinding(nil) end) @@ -291,12 +298,12 @@ function MTH_SetupFeedOMaticOptions() bindHint:SetJustifyH("LEFT") bindHint:SetJustifyV("TOP") bindHint:SetTextColor(0.35, 0.65, 1) - bindHint:SetText("You should assign a key bind for feed-o-matic,\nin order to feed your pet automatically.\nThe key \"P\" is an excellent candidate !") + bindHint:SetText(MTH_FOM_L("FOM_BIND_HINT", "You should assign a key bind for feed-o-matic,\nin order to feed your pet automatically.\nThe key \"P\" is an excellent candidate !")) - MTH_FOM_STATE.ctrl.AvoidQuestFood = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAvoidQuest", FOM_OptionsButtonText and FOM_OptionsButtonText["AvoidQuestFood"] or "Avoid quest foods", -170 + yAdjust) - MTH_FOM_STATE.ctrl.AvoidBonusFood = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAvoidBonus", FOM_OptionsButtonText and FOM_OptionsButtonText["AvoidBonusFood"] or "Avoid bonus foods", -195 + yAdjust) - MTH_FOM_STATE.ctrl.PreferHigherQuality = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMPreferQuality", FOM_OptionsButtonText and FOM_OptionsButtonText["PreferHigherQuality"] or "Prefer higher quality food", -220 + yAdjust) - MTH_FOM_STATE.ctrl.Fallback = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMFallback", FOM_OptionsButtonText and FOM_OptionsButtonText["Fallback"] or "Fallback to avoided foods", -245 + yAdjust) + MTH_FOM_STATE.ctrl.AvoidQuestFood = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAvoidQuest", FOM_OptionsButtonText and FOM_OptionsButtonText["AvoidQuestFood"] or MTH_FOM_L("FOM_LABEL_AVOID_QUEST_FOODS", "Avoid quest foods"), -170 + yAdjust) + MTH_FOM_STATE.ctrl.AvoidBonusFood = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAvoidBonus", FOM_OptionsButtonText and FOM_OptionsButtonText["AvoidBonusFood"] or MTH_FOM_L("FOM_LABEL_AVOID_BONUS_FOODS", "Avoid bonus foods"), -195 + yAdjust) + 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 @@ -305,7 +312,7 @@ function MTH_SetupFeedOMaticOptions() local keepOpenLabel = container:CreateFontString("MetaHuntOptionsFOMKeepOpenLabel", "ARTWORK", "GameFontNormalSmall") keepOpenLabel:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -302 + yAdjust) - keepOpenLabel:SetText("Keep open bag slots:") + keepOpenLabel:SetText(MTH_FOM_L("FOM_KEEP_OPEN_BAG_SLOTS", "Keep open bag slots:")) local keepOpen = CreateFrame("EditBox", "MetaHuntOptionsFOMKeepOpen", container, "InputBoxTemplate") keepOpen:SetPoint("LEFT", keepOpenLabel, "RIGHT", 8, 0) @@ -325,30 +332,30 @@ function MTH_SetupFeedOMaticOptions() local notifyHeader = container:CreateFontString("MetaHuntOptionsFOMNotifyHeader", "ARTWORK", "GameFontHighlight") notifyHeader:SetPoint("TOPLEFT", container, "TOPLEFT", 20, -336 + yAdjust) - notifyHeader:SetText("Notify when feeding") + notifyHeader:SetText(MTH_FOM_L("FOM_HEADER_NOTIFY_WHEN_FEEDING", "Notify when feeding")) - MTH_FOM_STATE.ctrl.AlertEmote = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertEmote", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertEmote"] or "Via emote", -360 + yAdjust) - MTH_FOM_STATE.ctrl.AlertChat = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertChat", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertChat"] or "In chat", -385 + yAdjust) - MTH_FOM_STATE.ctrl.AlertNone = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertNone", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertNone"] or "Don't notify", -410 + yAdjust) + MTH_FOM_STATE.ctrl.AlertEmote = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertEmote", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertEmote"] or MTH_FOM_L("FOM_LABEL_NOTIFY_VIA_EMOTE", "Via emote"), -360 + yAdjust) + MTH_FOM_STATE.ctrl.AlertChat = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertChat", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertChat"] or MTH_FOM_L("FOM_LABEL_NOTIFY_IN_CHAT", "In chat"), -385 + yAdjust) + MTH_FOM_STATE.ctrl.AlertNone = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAlertNone", FOM_OptionsButtonText and FOM_OptionsButtonText["AlertNone"] or MTH_FOM_L("FOM_LABEL_NOTIFY_NONE", "Don't notify"), -410 + yAdjust) if MTH_FOM_STATE.ctrl.AlertEmote then MTH_FOM_STATE.ctrl.AlertEmote:SetScript("OnClick", function() MTH_FOM_SetAlert("emote"); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.AlertChat then MTH_FOM_STATE.ctrl.AlertChat:SetScript("OnClick", function() MTH_FOM_SetAlert("chat"); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.AlertNone then MTH_FOM_STATE.ctrl.AlertNone:SetScript("OnClick", function() MTH_FOM_SetAlert("none"); MTH_RefreshFeedOMaticOptions() end) end local warnHeader = container:CreateFontString("MetaHuntOptionsFOMWarnHeader", "ARTWORK", "GameFontHighlight") warnHeader:SetPoint("TOPLEFT", container, "TOPLEFT", rightColumnX, -276 + yAdjust) - warnHeader:SetText("Warn when pet needs feeding") + warnHeader:SetText(MTH_FOM_L("FOM_HEADER_WARN_WHEN_PET_NEEDS_FEEDING", "Warn when pet needs feeding")) - MTH_FOM_STATE.ctrl.LevelContent = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelContent", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelContent"] or "When content", -300 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.LevelUnhappy = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelUnhappy", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelUnhappy"] or "When unhappy", -325 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.LevelOff = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelOff", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelOff"] or "Don't warn", -350 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.LevelContent = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelContent", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelContent"] or MTH_FOM_L("FOM_LABEL_WARN_WHEN_CONTENT", "When content"), -300 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.LevelUnhappy = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelUnhappy", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelUnhappy"] or MTH_FOM_L("FOM_LABEL_WARN_WHEN_UNHAPPY", "When unhappy"), -325 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.LevelOff = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMLevelOff", FOM_OptionsButtonText and FOM_OptionsButtonText["LevelOff"] or MTH_FOM_L("FOM_LABEL_DONT_WARN", "Don't warn"), -350 + yAdjust, rightColumnX) if MTH_FOM_STATE.ctrl.LevelContent then MTH_FOM_STATE.ctrl.LevelContent:SetScript("OnClick", function() MTH_FOM_SetLevel("content"); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.LevelUnhappy then MTH_FOM_STATE.ctrl.LevelUnhappy:SetScript("OnClick", function() MTH_FOM_SetLevel("unhappy"); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.LevelOff then MTH_FOM_STATE.ctrl.LevelOff:SetScript("OnClick", function() MTH_FOM_SetLevel("off"); MTH_RefreshFeedOMaticOptions() end) end - MTH_FOM_STATE.ctrl.AudioWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAudioWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["AudioWarning"] or "Play sound", -378 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.AudioWarningBell = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAudioWarningBell", FOM_OptionsButtonText and FOM_OptionsButtonText["AudioWarningBell"] or "Use bell sound", -403 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.TextWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMTextWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["TextWarning"] or "Show text", -428 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.IconWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMIconWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["IconWarning"] or "Flash icon", -453 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.AudioWarning = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMAudioWarning", FOM_OptionsButtonText and FOM_OptionsButtonText["AudioWarning"] or MTH_FOM_L("FOM_LABEL_PLAY_SOUND", "Play sound"), -378 + yAdjust, rightColumnX) + 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 @@ -356,13 +363,13 @@ function MTH_SetupFeedOMaticOptions() local cookHeader = container:CreateFontString("MetaHuntOptionsFOMCookingHeader", "ARTWORK", "GameFontHighlight") cookHeader:SetPoint("TOPLEFT", container, "TOPLEFT", rightColumnX, -62 + yAdjust) - cookHeader:SetText("Avoid foods used in cooking") + cookHeader:SetText(MTH_FOM_L("FOM_HEADER_AVOID_FOODS_USED_IN_COOKING", "Avoid foods used in cooking")) - MTH_FOM_STATE.ctrl.SaveCookOrange = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookOrange", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Orange"] or "Only difficult recipes", -86 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.SaveCookYellow = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookYellow", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Yellow"] or "Medium or better", -111 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.SaveCookGreen = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookGreen", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Green"] or "Easy or better", -136 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.SaveCookAll = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookAll", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_All"] or "All foods", -161 + yAdjust, rightColumnX) - MTH_FOM_STATE.ctrl.SaveCookNone = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookNone", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_None"] or "Do not save cooking foods", -186 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.SaveCookOrange = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookOrange", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Orange"] or MTH_FOM_L("FOM_LABEL_ONLY_DIFFICULT_RECIPES", "Only difficult recipes"), -86 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.SaveCookYellow = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookYellow", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Yellow"] or MTH_FOM_L("FOM_LABEL_MEDIUM_OR_BETTER", "Medium or better"), -111 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.SaveCookGreen = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookGreen", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_Green"] or MTH_FOM_L("FOM_LABEL_EASY_OR_BETTER", "Easy or better"), -136 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.SaveCookAll = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookAll", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_All"] or MTH_FOM_L("FOM_LABEL_ALL_FOODS", "All foods"), -161 + yAdjust, rightColumnX) + MTH_FOM_STATE.ctrl.SaveCookNone = MTH_CreateCheckbox(container, "MetaHuntOptionsFOMSaveCookNone", FOM_OptionsButtonText and FOM_OptionsButtonText["SaveForCook_None"] or MTH_FOM_L("FOM_LABEL_DO_NOT_SAVE_COOKING_FOODS", "Do not save cooking foods"), -186 + yAdjust, rightColumnX) if MTH_FOM_STATE.ctrl.SaveCookOrange then MTH_FOM_STATE.ctrl.SaveCookOrange:SetScript("OnClick", function() MTH_FOM_SetCookingLevel(3); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.SaveCookYellow then MTH_FOM_STATE.ctrl.SaveCookYellow:SetScript("OnClick", function() MTH_FOM_SetCookingLevel(2); MTH_RefreshFeedOMaticOptions() end) end if MTH_FOM_STATE.ctrl.SaveCookGreen then MTH_FOM_STATE.ctrl.SaveCookGreen:SetScript("OnClick", function() MTH_FOM_SetCookingLevel(1); MTH_RefreshFeedOMaticOptions() end) end diff --git a/api/options-shell.lua b/api/options-shell.lua index 3e7a929..15a7034 100644 --- a/api/options-shell.lua +++ b/api/options-shell.lua @@ -13,6 +13,13 @@ local MTH_OPTIONS_SHELL_READY = MTH_OptionsRequire and MTH_OptionsRequire("optio "MTH_BuildOptionsTree", }) +local function MTH_OPT_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + local function MTH_RegisterEscClose(frameName) if not (frameName and UISpecialFrames) then return @@ -33,7 +40,7 @@ local function MTH_EnsureOptionsFrame() MetaHuntOptions = CreateFrame("Frame", "MetaHuntOptions", UIParent, "MetaHuntOptionsTemplate") if not MetaHuntOptions then if MTH and MTH.Print then - MTH:Print("[MTH OPTIONS] Failed to create MetaHuntOptions", "error") + MTH:Print(MTH_OPT_L("OPT_ERR_CREATE_OPTIONS_FRAME", "[MTH OPTIONS] Failed to create MetaHuntOptions"), "error") end return nil end @@ -68,7 +75,7 @@ local function MTH_EnsureOptionsFrame() closeBtn:SetPoint("TOPRIGHT", MetaHuntOptions, "TOPRIGHT", MTH_OPTIONS_CONST.CLOSE_BTN_OFFSET_X, MTH_OPTIONS_CONST.CLOSE_BTN_OFFSET_Y) closeBtn:SetWidth(MTH_OPTIONS_CONST.CLOSE_BTN_SIZE) closeBtn:SetHeight(MTH_OPTIONS_CONST.CLOSE_BTN_SIZE) - closeBtn:SetText("X") + closeBtn:SetText(MTH_OPT_L("COMMON_CLOSE_SHORT", "X")) closeBtn:SetScript("OnClick", function() MetaHuntOptions:Hide() end) end @@ -110,6 +117,17 @@ function MTH_SelectOptionsTab(tabKey) MTH_SetupGeneralOptions() MTH_OPTIONS_SETUP["General"] = true end + elseif tabKey == "Messages" then + if not MTH_OPTIONS_SETUP["Messages"] then + if type(MTH_SetupMessagesOptions) == "function" then + MTH_SetupMessagesOptions() + MTH_OPTIONS_SETUP["Messages"] = true + end + else + if type(MTH_SetupMessagesOptions) == "function" then + MTH_SetupMessagesOptions() + end + end elseif tabKey == "Pet" then if not MTH_OPTIONS_SETUP["Pet"] then MTH_SetupPetOptions() @@ -130,6 +148,13 @@ function MTH_SelectOptionsTab(tabKey) MTH_SetupTrapOptions() MTH_OPTIONS_SETUP["Trap"] = true end + elseif tabKey == "Ranged" then + if not MTH_OPTIONS_SETUP["Ranged"] then + MTH_SetupRangedOptions() + MTH_OPTIONS_SETUP["Ranged"] = true + else + MTH_SetupRangedOptions() + end elseif tabKey == "Ammo" then if not MTH_OPTIONS_SETUP["Ammo"] then MTH_SetupAmmoOptions() @@ -185,7 +210,7 @@ function MTH_SelectOptionsTab(tabKey) MTH_SetupChronometerOptions() MTH_OPTIONS_SETUP[tabKey] = true elseif MTH and MTH.Print then - MTH:Print("Chronometer options module not loaded", "error") + MTH:Print(MTH_OPT_L("OPT_ERR_CHRON_NOT_LOADED", "Chronometer options module not loaded"), "error") end else if _G then diff --git a/api/options-tree.lua b/api/options-tree.lua index 8e2cdb6..3aaf6f0 100644 --- a/api/options-tree.lua +++ b/api/options-tree.lua @@ -28,10 +28,12 @@ MTH_OPTIONS_CONST = MTH_OPTIONS_CONST or { MTH_OPTIONS_TABS = MTH_OPTIONS_TABS or { { key = "General", label = "General", frame = "MetaHuntOptionsGeneral" }, + { key = "Messages", label = "Messages", frame = "MetaHuntOptionsMessages" }, { key = "Pet", label = "ZPet", frame = "MetaHuntOptionsPet" }, { key = "Track", label = "ZTrack", frame = "MetaHuntOptionsTrack" }, { key = "Aspect", label = "ZAspect", frame = "MetaHuntOptionsAspect" }, { key = "Trap", label = "ZTrap", frame = "MetaHuntOptionsTrap" }, + { key = "Ranged", label = "ZRanged", frame = "MetaHuntOptionsRanged" }, { key = "Ammo", label = "ZAmmo", frame = "MetaHuntOptionsAmmo" }, { key = "Mounts", label = "ZMounts", frame = "MetaHuntOptionsMounts" }, { key = "Companions", label = "ZCompanions", frame = "MetaHuntOptionsCompanions" }, @@ -49,6 +51,7 @@ MTH_OPTIONS_TABS = MTH_OPTIONS_TABS or { MTH_OPTIONS_TREE = MTH_OPTIONS_TREE or { { label = "General", key = "General" }, + { label = "Messages", key = "Messages" }, { label = "Auto Buy", key = "AutoBuy" }, { label = "Feed-O-Matic", key = "FeedOMatic" }, { @@ -60,6 +63,7 @@ MTH_OPTIONS_TREE = MTH_OPTIONS_TREE or { { label = "zAspect", key = "Aspect" }, { label = "zTrack", key = "Track" }, { label = "zTrap", key = "Trap" }, + { label = "zRanged", key = "Ranged" }, { label = "zMounts", key = "Mounts" }, { label = "zCompanions", key = "Companions" }, { label = "zToys", key = "Toys" }, diff --git a/api/options-zbuttons.lua b/api/options-zbuttons.lua index a90ffe8..e4166e7 100644 --- a/api/options-zbuttons.lua +++ b/api/options-zbuttons.lua @@ -6,6 +6,13 @@ local MTH_ZBUTTONS_READY = MTH_OptionsRequire and MTH_OptionsRequire("options-zb "MTH_CreateActionButton", }) +local function MTH_ZB_L(key, default) + if MTH and MTH.GetLocalization then + return MTH:GetLocalization(key, default) + end + return default or key +end + local function MTH_ZB_RefreshTab(tabName) if type(MTH_ResetAndSelectOptionsTab) == "function" then MTH_ResetAndSelectOptionsTab(tabName) @@ -150,6 +157,11 @@ local function MTH_GetButtonItemList(buttonName) end end return getglobal("ZHunterMod_Ammo_Buttons") or sharedArrows + elseif buttonName == "zButtonRanged" then + local rangedList = getglobal("ZHunterMod_Ranged_Weapons") + if rangedList and table.getn(rangedList) > 0 then + return rangedList + end elseif buttonName == "zButtonMounts" or buttonName == "zButtonCompanions" or buttonName == "zButtonToys" then if ZHunterMod_Saved and ZHunterMod_Saved[buttonName] and ZHunterMod_Saved[buttonName]["spells"] then return ZHunterMod_Saved[buttonName]["spells"] @@ -191,6 +203,68 @@ local function MTH_EnsureAmmoOptionsWatcher() end) end +local function MTH_ZB_GetDefaultEnabled(buttonName) + if buttonName == "zButtonMounts" or buttonName == "zButtonCompanions" or buttonName == "zButtonToys" or buttonName == "zButtonRanged" then + return false + end + return true +end + +local function MTH_ZB_EnsureButtonOptionDefaults(buttonName) + if not (ZHunterMod_Saved and buttonName) then + return nil + end + + if type(ZHunterMod_Saved[buttonName]) ~= "table" then + ZHunterMod_Saved[buttonName] = {} + end + + local saved = ZHunterMod_Saved[buttonName] + + if saved["enabled"] == nil then + saved["enabled"] = MTH_ZB_GetDefaultEnabled(buttonName) + end + saved["enabled"] = saved["enabled"] and true or false + + if saved["tooltip"] == nil then + saved["tooltip"] = true + end + saved["tooltip"] = saved["tooltip"] and true or false + + if type(saved["children"]) ~= "table" then + saved["children"] = {} + end + if saved["children"]["hideonclick"] == nil then + saved["children"]["hideonclick"] = true + end + saved["children"]["hideonclick"] = saved["children"]["hideonclick"] and true or false + + if type(saved["parent"]) ~= "table" then + saved["parent"] = {} + end + if saved["parent"]["hide"] == nil then + saved["parent"]["hide"] = false + end + saved["parent"]["hide"] = saved["parent"]["hide"] and true or false + if saved["parent"]["circle"] == nil then + saved["parent"]["circle"] = true + end + saved["parent"]["circle"] = saved["parent"]["circle"] and true or false + + if saved["firstbutton"] ~= "LEFT" and saved["firstbutton"] ~= "RIGHT" then + saved["firstbutton"] = "RIGHT" + end + + if buttonName == "zButtonAmmo" then + if saved["showammoname"] == nil then + saved["showammoname"] = true + end + saved["showammoname"] = saved["showammoname"] and true or false + end + + return saved +end + local function MTH_SetupButtonOptions(containerName, buttonName, displayName, maxButtons) local container = MTH_GetFrame(containerName) if not container then @@ -205,7 +279,7 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma if not ZHunterMod_Saved or not ZHunterMod_Saved[buttonName] then local errText = container:CreateFontString(containerName.."Error", "ARTWORK", "GameFontNormal") errText:SetPoint("CENTER", container, "CENTER", 0, 0) - errText:SetText("Configuration not loaded for "..displayName) + errText:SetText(string.format(MTH_ZB_L("ZB_ERR_CONFIG_NOT_LOADED", "Configuration not loaded for %s"), tostring(displayName))) errText:SetTextColor(1, 0.5, 0.5) if MTH and MTH.Print then MTH:Print("[MTH] zhunter saved data missing for "..buttonName, "error") @@ -214,6 +288,10 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end local buttonObj = getglobal(buttonName) + local saved = MTH_ZB_EnsureButtonOptionDefaults(buttonName) + if not saved then + return + end local containerWidth = container:GetWidth() or 500 local leftWidth = 260 local rightX = leftWidth + 44 @@ -236,17 +314,15 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma return section end - if ZHunterMod_Saved[buttonName]["enabled"] == nil then - ZHunterMod_Saved[buttonName]["enabled"] = true - end + local enabledValue = saved["enabled"] and true or false local enableLabel = tostring(displayName or "") if string.len(enableLabel) > 0 then enableLabel = string.lower(string.sub(enableLabel, 1, 1)) .. string.sub(enableLabel, 2) end - local enableButton = MTH_CreateCheckbox(container, containerName.."EnableButton", "Enable "..enableLabel, -8) + local enableButton = MTH_CreateCheckbox(container, containerName.."EnableButton", string.format(MTH_ZB_L("ZB_LABEL_ENABLE_FMT", "Enable %s"), enableLabel), -8) if enableButton then - enableButton:SetChecked(ZHunterMod_Saved[buttonName]["enabled"] and true or false) + enableButton:SetChecked(enabledValue and true or false) enableButton.buttonName = buttonName enableButton.buttonObj = buttonObj enableButton:SetScript("OnClick", function(self) @@ -257,16 +333,16 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end) end - local parentSection = MTH_ZB_EnsureSection(containerName.."ParentSection", "Parent Button", -52, 116) - local childrenSection = MTH_ZB_EnsureSection(containerName.."ChildrenSection", "Children Buttons", -184, 235) + 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 parentYOffset = -18 local childrenYOffset = -18 - local btnSize = MTH_CreateSlider(childrenSection or container, containerName.."ButtonSize", "Button Size", 10, 100, 1, childrenYOffset) + local btnSize = MTH_CreateSlider(childrenSection or container, containerName.."ButtonSize", MTH_ZB_L("ZB_LABEL_BUTTON_SIZE", "Button Size"), 10, 100, 1, childrenYOffset) if btnSize then btnSize:SetWidth(leftWidth - 40) - btnSize:SetValue(ZHunterMod_Saved[buttonName]["children"]["size"] or 36) + btnSize:SetValue(saved["children"]["size"] or 36) btnSize.buttonName = buttonName btnSize.buttonObj = buttonObj btnSize.itemList = MTH_GetButtonItemList(buttonName) @@ -285,10 +361,10 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end childrenYOffset = childrenYOffset - 50 - local rowCount = MTH_CreateSlider(childrenSection or container, containerName.."RowCount", "Number of Rows", 1, maxButtons, 1, childrenYOffset) + local rowCount = MTH_CreateSlider(childrenSection or container, containerName.."RowCount", MTH_ZB_L("ZB_LABEL_NUMBER_OF_ROWS", "Number of Rows"), 1, maxButtons, 1, childrenYOffset) if rowCount then rowCount:SetWidth(leftWidth - 40) - rowCount:SetValue(ZHunterMod_Saved[buttonName]["rows"] or 1) + rowCount:SetValue(saved["rows"] or 1) rowCount.buttonName = buttonName rowCount.buttonObj = buttonObj rowCount.itemList = MTH_GetButtonItemList(buttonName) @@ -303,12 +379,9 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end childrenYOffset = childrenYOffset - 40 - if ZHunterMod_Saved[buttonName]["firstbutton"] == nil then - ZHunterMod_Saved[buttonName]["firstbutton"] = "RIGHT" - end - local expandLeft = MTH_CreateCheckbox(childrenSection or container, containerName.."ExpandLeft", "Expand Left (opposite side)", childrenYOffset) + local expandLeft = MTH_CreateCheckbox(childrenSection or container, containerName.."ExpandLeft", MTH_ZB_L("ZB_LABEL_EXPAND_LEFT", "Expand Left (opposite side)"), childrenYOffset) if expandLeft then - expandLeft:SetChecked(ZHunterMod_Saved[buttonName]["firstbutton"] == "LEFT") + expandLeft:SetChecked(saved["firstbutton"] == "LEFT") expandLeft.buttonName = buttonName expandLeft.buttonObj = buttonObj expandLeft:SetScript("OnClick", function(self) @@ -325,13 +398,13 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end childrenYOffset = childrenYOffset - 30 - local hideClick = MTH_CreateCheckbox(childrenSection or container, containerName.."HideOnClick", "Hide Buttons On Click", childrenYOffset) + local hideClick = MTH_CreateCheckbox(childrenSection or container, containerName.."HideOnClick", MTH_ZB_L("ZB_LABEL_HIDE_BUTTONS_ON_CLICK", "Hide Buttons On Click"), childrenYOffset) if hideClick then - hideClick:SetChecked(ZHunterMod_Saved[buttonName]["children"]["hideonclick"]) + hideClick:SetChecked(saved["children"]["hideonclick"]) hideClick.buttonName = buttonName hideClick.buttonObj = buttonObj if hideClick.buttonObj then - hideClick.buttonObj.hideonclick = ZHunterMod_Saved[buttonName]["children"]["hideonclick"] and true or false + hideClick.buttonObj.hideonclick = saved["children"]["hideonclick"] and true or false end hideClick:SetScript("OnClick", function(self) self = self or this @@ -344,13 +417,13 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end childrenYOffset = childrenYOffset - 25 - local showTooltip = MTH_CreateCheckbox(childrenSection or container, containerName.."ShowTooltip", "Show Tooltip", childrenYOffset) + local showTooltip = MTH_CreateCheckbox(childrenSection or container, containerName.."ShowTooltip", MTH_ZB_L("ZB_LABEL_SHOW_TOOLTIP", "Show Tooltip"), childrenYOffset) if showTooltip then - showTooltip:SetChecked(ZHunterMod_Saved[buttonName]["tooltip"]) + showTooltip:SetChecked(saved["tooltip"]) showTooltip.buttonName = buttonName showTooltip.buttonObj = buttonObj if showTooltip.buttonObj then - showTooltip.buttonObj.tooltip = ZHunterMod_Saved[buttonName]["tooltip"] and true or false + showTooltip.buttonObj.tooltip = saved["tooltip"] and true or false end showTooltip:SetScript("OnClick", function(self) self = self or this @@ -364,12 +437,9 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma childrenYOffset = childrenYOffset - 25 if buttonName == "zButtonAmmo" then - if ZHunterMod_Saved[buttonName]["showammoname"] == nil then - ZHunterMod_Saved[buttonName]["showammoname"] = 1 - end - local showAmmoName = MTH_CreateCheckbox(childrenSection or container, containerName.."ShowAmmoName", "Show ammo name", childrenYOffset) + local showAmmoName = MTH_CreateCheckbox(childrenSection or container, containerName.."ShowAmmoName", MTH_ZB_L("ZB_LABEL_SHOW_AMMO_NAME", "Show ammo name"), childrenYOffset) if showAmmoName then - showAmmoName:SetChecked(ZHunterMod_Saved[buttonName]["showammoname"]) + showAmmoName:SetChecked(saved["showammoname"]) showAmmoName.buttonName = buttonName showAmmoName.buttonObj = buttonObj showAmmoName.maxButtons = maxButtons @@ -398,10 +468,10 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma childrenYOffset = childrenYOffset - 35 end - local mainSize = MTH_CreateSlider(parentSection or container, containerName.."MainButtonSize", "Button Size", 10, 100, 1, parentYOffset) + local mainSize = MTH_CreateSlider(parentSection or container, containerName.."MainButtonSize", MTH_ZB_L("ZB_LABEL_BUTTON_SIZE", "Button Size"), 10, 100, 1, parentYOffset) if mainSize then mainSize:SetWidth(leftWidth - 40) - mainSize:SetValue(ZHunterMod_Saved[buttonName]["parent"]["size"] or 36) + mainSize:SetValue(saved["parent"]["size"] or 36) mainSize.buttonName = buttonName mainSize.buttonObj = buttonObj mainSize.onChange = function(val, slider) @@ -423,9 +493,9 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end parentYOffset = parentYOffset - 35 - local hideButton = MTH_CreateCheckbox(parentSection or container, containerName.."HideButton", "Hide Button", parentYOffset) + local hideButton = MTH_CreateCheckbox(parentSection or container, containerName.."HideButton", MTH_ZB_L("ZB_LABEL_HIDE_BUTTON", "Hide Button"), parentYOffset) if hideButton then - hideButton:SetChecked(ZHunterMod_Saved[buttonName]["parent"]["hide"]) + hideButton:SetChecked(saved["parent"]["hide"]) hideButton.buttonName = buttonName hideButton.buttonObj = buttonObj hideButton:SetScript("OnClick", function(self) @@ -440,9 +510,9 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end parentYOffset = parentYOffset - 25 - local useCircle = MTH_CreateCheckbox(parentSection or container, containerName.."UseCircle", "Use Circle Button", parentYOffset) + local useCircle = MTH_CreateCheckbox(parentSection or container, containerName.."UseCircle", MTH_ZB_L("ZB_LABEL_USE_CIRCLE_BUTTON", "Use Circle Button"), parentYOffset) if useCircle then - useCircle:SetChecked(ZHunterMod_Saved[buttonName]["parent"]["circle"]) + useCircle:SetChecked(saved["parent"]["circle"]) useCircle.buttonName = buttonName useCircle.buttonObj = buttonObj useCircle:SetScript("OnClick", function(self) @@ -456,18 +526,18 @@ local function MTH_SetupButtonOptions(containerName, buttonName, displayName, ma end) end - MTH_SetButtonEnabledState(buttonName, buttonObj, ZHunterMod_Saved[buttonName]["enabled"] and true or false) + MTH_SetButtonEnabledState(buttonName, buttonObj, saved["enabled"] and true or false) local advHeader = container:CreateFontString(containerName.."AdvHeader", "ARTWORK", "GameFontHighlight") advHeader:SetPoint("TOPLEFT", container, "TOPLEFT", rightX, -10) - advHeader:SetText("Spell Order") + advHeader:SetText(MTH_ZB_L("ZB_HEADER_SPELL_ORDER", "Spell Order")) local itemList = MTH_GetButtonItemList(buttonName) if not itemList or not ZHunterMod_Saved[buttonName]["spells"] then local noData = container:CreateFontString(containerName.."NoData", "ARTWORK", "GameFontNormalSmall") noData:SetPoint("TOPRIGHT", container, "TOPRIGHT", -80, -50) - noData:SetText("Spell data not loaded") + noData:SetText(MTH_ZB_L("ZB_TEXT_SPELL_DATA_NOT_LOADED", "Spell data not loaded")) noData:SetTextColor(1, 0.5, 0.5) return end @@ -608,6 +678,13 @@ function MTH_SetupTrapOptions() MTH_SetupButtonOptions("MetaHuntOptionsTrap", "zButtonTrap", "ZTrap", 4) end +function MTH_SetupRangedOptions() + if not MTH_ZBUTTONS_READY then return end + local itemList = MTH_GetButtonItemList("zButtonRanged") + local maxButtons = itemList and table.getn(itemList) or 1 + MTH_SetupButtonOptions("MetaHuntOptionsRanged", "zButtonRanged", "ZRanged", maxButtons) +end + function MTH_SetupAmmoOptions() if not MTH_ZBUTTONS_READY then return end MTH_EnsureAmmoOptionsWatcher() @@ -674,7 +751,7 @@ function MTH_SetupSmartAmmoOptions() end) end - local smartToggle = MTH_CreateCheckbox(container, "MetaHuntOptionsSmartAmmoEnabled", "Enable Smart Ammo Swaps", -94) + local smartToggle = MTH_CreateCheckbox(container, "MetaHuntOptionsSmartAmmoEnabled", "Enable Junk Shot Swaps", -94) if smartToggle then local enabled = type(MTHSmartAmmo_GetSmartEnabled) == "function" and MTHSmartAmmo_GetSmartEnabled() and true or false smartToggle:SetChecked(enabled) @@ -710,6 +787,119 @@ function MTH_SetupSmartAmmoOptions() end end +function MTH_SetupMessagesOptions() + if not MTH_ZBUTTONS_READY then return end + local container = MTH_GetFrame("MetaHuntOptionsMessages") + if not container then return end + + MTH_ClearContainer(container) + + local section = CreateFrame("Frame", "MetaHuntMessagesSection", container, "OptionFrameBoxTemplate") + if not section then return end + section:SetPoint("TOPLEFT", container, "TOPLEFT", 8, -8) + section:SetPoint("TOPRIGHT", container, "TOPRIGHT", -8, -8) + section:SetHeight(268) + + local titleFrame = getglobal("MetaHuntMessagesSectionTitle") + if titleFrame then + titleFrame:SetText("Messages") + end + + local help = section:CreateFontString("MetaHuntMessagesHelp", "ARTWORK") + help:SetFont("Fonts\\FRIZQT__.TTF", 10) + help:SetJustifyH("LEFT") + help:SetPoint("TOPLEFT", section, "TOPLEFT", 14, -12) + help:SetPoint("TOPRIGHT", section, "TOPRIGHT", -14, -12) + help:SetText("Enable or Disable Metahunt chat messages") + + local msgSettings = (MTH and MTH.GetMessageSettings and MTH:GetMessageSettings()) or {} + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("initModulesLoaded", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("initSarcasticWelcome", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("petHungry", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("beastTrainingScan", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("spellbookScan", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("petRanAway", self:GetChecked() and true or false) + end + end) + end + + 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 + if MTH and MTH.SetMessageEnabled then + MTH:SetMessageEnabled("mapMarkers", self:GetChecked() and true or false) + end + end) + end + +end + function MTH_SetupGeneralOptions() if not MTH_ZBUTTONS_READY then return end local parentFrame = MTH_GetFrame("MetaHuntOptionsGeneral") @@ -806,7 +996,7 @@ function MTH_SetupGeneralOptions() help:Show() end - local smartAmmoSection = ensureSection("MetaHuntGeneralSmartAmmoBox", "Smart Ammo", topY, 186, "left") + local smartAmmoSection = ensureSection("MetaHuntGeneralSmartAmmoBox", "Smart Ammo", topY, 254, "left") if smartAmmoSection then local smartModuleEnabled = MTH and MTH.IsModuleEnabled and MTH:IsModuleEnabled("smartammo", true) local smartModuleToggle = ensureCheckbox(smartAmmoSection, "MetaHuntGeneralSmartAmmoModuleToggle", "Enable module", -10, smartModuleEnabled) @@ -825,10 +1015,16 @@ function MTH_SetupGeneralOptions() end) end - ensureHelpText(smartAmmoSection, "MetaHuntGeneralSmartAmmoModuleHelp", "Automatically swaps arrows/bullets based on equipped ranged weapon.", -34) + local moduleHelp = getglobal("MetaHuntGeneralSmartAmmoModuleHelp") + if moduleHelp then + moduleHelp:Hide() + end - local smartEnabled = type(MTHSmartAmmo_GetSmartEnabled) == "function" and MTHSmartAmmo_GetSmartEnabled() and true or false - local smartToggle = ensureCheckbox(smartAmmoSection, "MetaHuntGeneralSmartAmmoEnabledToggle", "Enable Smart Ammo Swaps", -68, smartEnabled) + local smartEnabled = true + if type(MTHSmartAmmo_GetSmartEnabled) == "function" then + smartEnabled = MTHSmartAmmo_GetSmartEnabled() and true or false + end + local smartToggle = ensureCheckbox(smartAmmoSection, "MetaHuntGeneralSmartAmmoEnabledToggle", "Enable Junk Shot Swaps", -58, smartEnabled) if smartToggle then if not smartModuleEnabled then smartToggle:Disable() @@ -839,7 +1035,7 @@ function MTH_SetupGeneralOptions() end end) end - ensureHelpText(smartAmmoSection, "MetaHuntGeneralSmartAmmoEnabledHelp", "Auto-equips arrows or bullets matching your ranged weapon.", -96) + ensureHelpText(smartAmmoSection, "MetaHuntGeneralSmartAmmoEnabledHelp", "Swaps to low-tier ammo for shots that don't scale on weapon damage, then swaps back to your previous ammo.", -86) local reloadEnabled = type(MTHSmartAmmo_GetReloadEnabled) == "function" and MTHSmartAmmo_GetReloadEnabled() and true or false local reloadToggle = ensureCheckbox(smartAmmoSection, "MetaHuntGeneralSmartAmmoReloadToggle", "Enable Auto-Fallback", -126, reloadEnabled) @@ -854,9 +1050,23 @@ function MTH_SetupGeneralOptions() end) end ensureHelpText(smartAmmoSection, "MetaHuntGeneralSmartAmmoReloadHelp", "Falls back to any available ammo when preferred ammo is missing.", -154) + + local weaponSwapEnabled = type(MTHSmartAmmo_GetWeaponSwapEnabled) == "function" and MTHSmartAmmo_GetWeaponSwapEnabled() and true or false + local weaponSwapToggle = ensureCheckbox(smartAmmoSection, "MetaHuntGeneralSmartAmmoWeaponSwapToggle", "Enable Weapon-Swap Auto Ammo", -180, weaponSwapEnabled) + if weaponSwapToggle then + if not smartModuleEnabled then + weaponSwapToggle:Disable() + end + weaponSwapToggle:SetScript("OnClick", function() + if type(MTHSmartAmmo_SetWeaponSwapEnabled) == "function" then + MTHSmartAmmo_SetWeaponSwapEnabled(this:GetChecked() and 1 or nil) + end + end) + end + ensureHelpText(smartAmmoSection, "MetaHuntGeneralSmartAmmoWeaponSwapHelp", "When you swap between gun and bow/crossbow, instantly equips the best matching ammo from your bags.", -208) end - local stripSection = ensureSection("MetaHuntGeneralAutoStripBox", "Auto-Strip", topY - 202, 122, "left") + local stripSection = ensureSection("MetaHuntGeneralAutoStripBox", "Auto-Strip", topY - 270, 122, "left") if stripSection then local autoStripToggle = ensureCheckbox(stripSection, "MetaHuntGeneralAutoStripToggle", "Enable Auto-Strip on Combat Exit", -10, stripSaved["autostrip"] and true or false) if autoStripToggle then @@ -879,7 +1089,7 @@ function MTH_SetupGeneralOptions() ensureHelpText(stripSection, "MetaHuntGeneralAutoStripHelp", "Auto-strip unequips items when combat ends. Requires at least one empty bag slot.", -64) end - local antiSection = ensureSection("MetaHuntGeneralAntiDazeBox", "Anti-Daze", topY - 338, 96, "left") + local antiSection = ensureSection("MetaHuntGeneralAntiDazeBox", "Anti-Daze", topY - 406, 96, "left") if antiSection then local antiDazeEnabled = (AntiDaze_GetEnabled and AntiDaze_GetEnabled()) or false local antiToggle = ensureCheckbox(antiSection, "MetaHuntGeneralAntiDazeToggle", "Enable Anti-Daze", -10, antiDazeEnabled) diff --git a/api/options.xml b/api/options.xml index d3bcd80..b8d4672 100644 --- a/api/options.xml +++ b/api/options.xml @@ -66,10 +66,12 @@ + + diff --git a/api/version-check.lua b/api/version-check.lua new file mode 100644 index 0000000..85c19d6 --- /dev/null +++ b/api/version-check.lua @@ -0,0 +1,179 @@ +MTH = MTH or {} +MTH.VersionCheck = MTH.VersionCheck or {} + +local VC = MTH.VersionCheck +VC.abbrev = "MTH" +VC.channelName = "LFT" +VC.nextPublishAt = nil +VC.joinAt = nil +VC.notified = false +VC._invalidVersionWarned = false + +local function VC_GetTimeNow() + if type(time) == "function" then + return time() + end + if type(GetTime) == "function" then + return math.floor(GetTime()) + end + return 0 +end + +function VC:GetLocalVersionString() + if MTH and MTH.version and tostring(MTH.version) ~= "" then + return tostring(MTH.version) + end + local getMeta = _G and _G["GetAddOnMetadata"] or nil + if type(getMeta) == "function" then + local v = getMeta("MetaHunt", "Version") + if v and v ~= "" then + return tostring(v) + end + end + return "0.0.0" +end + +function VC:GetLocalVersionNumber() + local versionText = self:GetLocalVersionString() + local _, _, major, minor, patch = string.find(tostring(versionText or ""), "^(%d+)%.(%d+)%.?(%d*)$") + if not major then + return nil + end + major = tonumber(major) or 0 + minor = tonumber(minor) or 0 + patch = tonumber(patch) or 0 + return (major * 1000000) + (minor * 1000) + patch +end + +local function VC_GetChannelIdByName(channelName) + if type(GetChannelName) ~= "function" then + return nil + end + local id = nil + local name = nil + id, name = GetChannelName(channelName) + id = tonumber(id) + if id and id > 0 then + return id + end + return nil +end + +local function VC_IsOurChannel(name) + return type(name) == "string" and string.lower(name) == string.lower(VC.channelName) +end + +function VC:ResetPublishDelay() + self.nextPublishAt = VC_GetTimeNow() + math.random(10, 20) +end + +function VC:ShouldPublish() + return self.nextPublishAt and VC_GetTimeNow() >= self.nextPublishAt +end + +function VC:TryPublish() + if type(SendChatMessage) ~= "function" then + return false + end + local channelId = VC_GetChannelIdByName(self.channelName) + if not channelId then + if type(JoinChannelByName) == "function" then + JoinChannelByName(self.channelName, "", 0, false) + end + return false + end + local localVersionNumber = self:GetLocalVersionNumber() + if not localVersionNumber or localVersionNumber <= 0 then + if not self._invalidVersionWarned and MTH and type(MTH.Print) == "function" then + self._invalidVersionWarned = true + MTH:Print("Version check disabled: invalid local version format.") + end + return false + end + local payload = self.abbrev .. ":" .. tostring(localVersionNumber) .. ":v" + SendChatMessage(payload, "CHANNEL", nil, tostring(channelId)) + return true +end + +function VC:HandleRemoteMessage(message, author, channelLabel) + if self.notified then + return + end + if not message or message == "" then + return + end + if author and UnitName and author == UnitName("player") then + return + end + local channelName = string.gsub(tostring(channelLabel or ""), "^%d+%.%s*", "") + if not VC_IsOurChannel(channelName) then + return + end + if string.find(message, self.abbrev .. ":", 1, true) ~= 1 then + return + end + + local _, _, addonTag, remoteVersion = string.find(message, "^([^:]+):([^:]+):") + if addonTag ~= self.abbrev then + return + end + local remoteNumber = tonumber(remoteVersion) + if not remoteNumber or remoteNumber <= 0 then + return + end + local localVersionNumber = self:GetLocalVersionNumber() + if not localVersionNumber or localVersionNumber <= 0 then + return + end + if remoteNumber <= localVersionNumber then + return + end + + self.notified = true + self.nextPublishAt = nil + if MTH and type(MTH.Print) == "function" then + MTH:Print("A new version is available !") + end + + if VC.frame then + VC.frame:UnregisterEvent("CHAT_MSG_CHANNEL") + VC.frame:SetScript("OnUpdate", nil) + end +end + +if not VC.frame then + local frame = CreateFrame("Frame", "MTHVersionCheckFrame", UIParent) + if frame then + VC.frame = frame + frame:RegisterEvent("PLAYER_ENTERING_WORLD") + frame:RegisterEvent("CHAT_MSG_CHANNEL") + frame:SetScript("OnEvent", function() + if event == "PLAYER_ENTERING_WORLD" then + VC.joinAt = GetTime() + 6 + VC:ResetPublishDelay() + elseif event == "CHAT_MSG_CHANNEL" then + VC:HandleRemoteMessage(arg1, arg2, arg4) + end + end) + frame:SetScript("OnUpdate", function() + if (this._mthTick or 1) > GetTime() then + return + end + this._mthTick = GetTime() + 1 + + if VC.joinAt and GetTime() >= VC.joinAt then + if not VC_GetChannelIdByName(VC.channelName) and type(JoinChannelByName) == "function" then + JoinChannelByName(VC.channelName, "", 0, false) + end + VC.joinAt = nil + end + + if VC:ShouldPublish() then + if VC:TryPublish() then + VC.nextPublishAt = nil + this:SetScript("OnUpdate", nil) + end + end + end) + end +end diff --git a/data/ds-bags.lua b/data/ds-bags.lua new file mode 100644 index 0000000..978d216 --- /dev/null +++ b/data/ds-bags.lua @@ -0,0 +1,1513 @@ +-- MetaHunt Bags Database (Quivers + Ammo Pouches) +-- Source: https://database.turtlecraft.gg/?items=11 +-- Auto-generated extraction with source recursion. + +if not MTH_DS then MTH_DS = {} end + +MTH_DS_BagItems = { + [2101] = { + ["name"] = "Light Quiver", + ["icon"] = "INV_Misc_Quiver_09", + ["quality"] = 1, + ["level"] = 1, + ["slots"] = 6, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Light Quiver\n6 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2101", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 1685, + ["name"] = "Xandar Goodbeard", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 80102, + ["name"] = "Ohgi Cardya", + ["tag"] = "Trader", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3158, + ["name"] = "Duokna", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2102] = { + ["name"] = "Small Ammo Pouch", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 1, + ["slots"] = 6, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Small Ammo Pouch\n6 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2102", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 5, + ["entries"] = { + { + ["id"] = 2685, + ["name"] = "Mazk Snipeshot", + ["tag"] = "Engineering Supplies", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3072, + ["name"] = "Kawnie Softbreeze", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Metalsmith", + ["level"] = 8, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 8, + ["classification"] = 0, + }, + { + ["id"] = 829, + ["name"] = "Adlin Pridedrift", + ["tag"] = "General Supplies", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2662] = { + ["name"] = "Ribbly's Quiver", + ["icon"] = "INV_Misc_Quiver_06", + ["quality"] = 2, + ["level"] = 55, + ["reqlevel"] = 50, + ["slots"] = 16, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Ribbly's Quiver\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 50\nEquip: Increases ranged attack speed by 14%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2662", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9543, + ["name"] = "Ribbly Screwspigot", + ["level"] = 53, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [2663] = { + ["name"] = "Ribbly's Bandolier", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 2, + ["level"] = 55, + ["reqlevel"] = 50, + ["slots"] = 16, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Ribbly's Bandolier\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 50\nEquip: Increases ranged attack speed by 14%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2663", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9543, + ["name"] = "Ribbly Screwspigot", + ["level"] = 53, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [3573] = { + ["name"] = "Hunting Quiver", + ["icon"] = "INV_Misc_Quiver_03", + ["quality"] = 1, + ["level"] = 15, + ["slots"] = 10, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Hunting Quiver\nBinds when picked up\nUnique\n10 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3573", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3574] = { + ["name"] = "Hunting Ammo Sack", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 15, + ["slots"] = 10, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Hunting Ammo Sack\nBinds when picked up\n10 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3574", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3604] = { + ["name"] = "Bandolier of the Night Watch", + ["icon"] = "INV_Misc_Bag_09_Blue", + ["quality"] = 2, + ["level"] = 25, + ["slots"] = 12, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Bandolier of the Night Watch\nBinds when picked up\nUnique\n12 Slot Bag\nEquip: Increases ranged attack speed by 11%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3604", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3605] = { + ["name"] = "Quiver of the Night Watch", + ["icon"] = "INV_Misc_Quiver_04", + ["quality"] = 2, + ["level"] = 25, + ["slots"] = 12, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Quiver of the Night Watch\nBinds when picked up\nUnique\n12 Slot Bag\nEquip: Increases ranged attack speed by 11%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3605", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [5439] = { + ["name"] = "Small Quiver", + ["icon"] = "INV_Misc_Quiver_09", + ["quality"] = 1, + ["level"] = 5, + ["slots"] = 8, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Small Quiver\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5439", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 47, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "Ammunition Vendor", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "The Army of Lordaeron", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61742, + ["name"] = "Mazin Forkblast", + ["tag"] = "Weapon and Shield Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "Bowyer", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "Fletcher", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "Ammunition", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Metalsmith", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "Superior Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "Ammunition", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "School of the Dragonhawk", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "Bowyer", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Bowyer", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "Fletcher", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 20, + ["classification"] = 0, + }, + }, + }, + }, + }, + [5441] = { + ["name"] = "Small Shot Pouch", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 5, + ["slots"] = 8, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Small Shot Pouch\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5441", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 19, + ["entries"] = { + { + ["id"] = 1469, + ["name"] = "Vrok Blunderblast", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3078, + ["name"] = "Kennah Hawkseye", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "Guns and Ammo", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 2997, + ["name"] = "Jyn Stonehoof", + ["tag"] = "Weapons Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1243, + ["name"] = "Hegnar Rumbleshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gun Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + }, + }, + }, + }, + [7278] = { + ["name"] = "Light Leather Quiver", + ["icon"] = "INV_Misc_Quiver_01", + ["quality"] = 1, + ["level"] = 5, + ["slots"] = 8, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Light Leather Quiver\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=7278", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9060, + ["name"] = "@Light Leather Quiver", + }, + }, + }, + }, + }, + [7279] = { + ["name"] = "Small Leather Ammo Pouch", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 5, + ["slots"] = 8, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Small Leather Ammo Pouch\n8 Slot Bag\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=7279", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9062, + ["name"] = "@Small Leather Ammo Pouch", + }, + }, + }, + }, + }, + [7371] = { + ["name"] = "Heavy Quiver", + ["icon"] = "INV_Misc_Quiver_02", + ["quality"] = 2, + ["level"] = 35, + ["reqlevel"] = 30, + ["slots"] = 14, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Heavy Quiver\n14 Slot Bag\nRequires Level 30\nEquip: Increases ranged attack speed by 12%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=7371", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9193, + ["name"] = "@Heavy Quiver", + }, + }, + }, + }, + }, + [7372] = { + ["name"] = "Heavy Leather Ammo Pouch", + ["icon"] = "INV_Misc_Bag_09", + ["quality"] = 2, + ["level"] = 35, + ["reqlevel"] = 30, + ["slots"] = 14, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Heavy Leather Ammo Pouch\n14 Slot Bag\nRequires Level 30\nEquip: Increases ranged attack speed by 12%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=7372", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9194, + ["name"] = "@Heavy Leather Ammo Pouch", + }, + }, + }, + }, + }, + [8217] = { + ["name"] = "Quickdraw Quiver", + ["icon"] = "INV_Misc_Quiver_07", + ["quality"] = 2, + ["level"] = 45, + ["reqlevel"] = 40, + ["slots"] = 16, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Quickdraw Quiver\n16 Slot Bag\nRequires Level 40\nEquip: Increases ranged attack speed by 13%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8217", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14930, + ["name"] = "@Quickdraw Quiver", + }, + }, + }, + }, + }, + [8218] = { + ["name"] = "Thick Leather Ammo Pouch", + ["icon"] = "INV_Misc_Bag_09_Black", + ["quality"] = 2, + ["level"] = 45, + ["reqlevel"] = 40, + ["slots"] = 16, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Thick Leather Ammo Pouch\n16 Slot Bag\nRequires Level 40\nEquip: Increases ranged attack speed by 13%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8218", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14932, + ["name"] = "@Thick Leather Ammo Pouch", + }, + }, + }, + }, + }, + [11362] = { + ["name"] = "Medium Quiver", + ["icon"] = "INV_Misc_Quiver_10", + ["quality"] = 1, + ["level"] = 15, + ["reqlevel"] = 10, + ["slots"] = 10, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Medium Quiver\n10 Slot Bag\nRequires Level 10\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11362", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 52, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "Ammunition Vendor", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "The Army of Lordaeron", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 61742, + ["name"] = "Mazin Forkblast", + ["tag"] = "Weapon and Shield Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91207, + ["name"] = "Maleka", + ["tag"] = "Weapon and Armor Vendor", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "Ammunition", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Metalsmith", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bow Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "Superior Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "Ammunition", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "School of the Dragonhawk", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60762, + ["name"] = "Blacksmith Torren", + ["tag"] = "Weapons and Armor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "Fletcher", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Bowyer", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11363] = { + ["name"] = "Medium Shot Pouch", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 15, + ["reqlevel"] = 10, + ["slots"] = 10, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Medium Shot Pouch\n10 Slot Bag\nRequires Level 10\nEquip: Increases ranged attack speed by 10%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11363", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 2685, + ["name"] = "Mazk Snipeshot", + ["tag"] = "Engineering Supplies", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Metalsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [18714] = { + ["name"] = "Ancient Sinew Wrapped Lamina", + ["icon"] = "INV_Misc_Quiver_03", + ["quality"] = 4, + ["level"] = 75, + ["reqlevel"] = 60, + ["slots"] = 18, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Ancient Sinew Wrapped Lamina\nBinds when picked up\nUnique\n18 Slot Bag\nClasses: Hunter\nRequires Level 60\nEquip: Increases ranged attack speed by 15%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18714", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [19319] = { + ["name"] = "Harpy Hide Quiver", + ["icon"] = "INV_Misc_Quiver_06", + ["quality"] = 3, + ["level"] = 60, + ["reqlevel"] = 55, + ["slots"] = 16, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Harpy Hide Quiver\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 55\nEquip: Increases ranged attack speed by 15%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19319", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 13217, + ["name"] = "Thanthaldis Snowgleam", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13219, + ["name"] = "Jekyll Flandring", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13218, + ["name"] = "Grunnda Wolfheart", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13216, + ["name"] = "Gaelden Hammersmith", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19320] = { + ["name"] = "Gnoll Skin Bandolier", + ["icon"] = "INV_Misc_Ammo_Bullet_01", + ["quality"] = 3, + ["level"] = 60, + ["reqlevel"] = 55, + ["slots"] = 16, + ["subtype"] = "ammo pouch", + ["description"] = "", + ["tooltip"] = "Gnoll Skin Bandolier\nBinds when picked up\nUnique\n16 Slot Bag\nRequires Level 55\nEquip: Increases ranged attack speed by 15%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19320", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 13217, + ["name"] = "Thanthaldis Snowgleam", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13219, + ["name"] = "Jekyll Flandring", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13218, + ["name"] = "Grunnda Wolfheart", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13216, + ["name"] = "Gaelden Hammersmith", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [61549] = { + ["name"] = "Swiftfeather Quiver", + ["icon"] = "INV_Misc_Quiver_03", + ["quality"] = 3, + ["reqlevel"] = 57, + ["slots"] = 16, + ["subtype"] = "quiver", + ["description"] = "", + ["tooltip"] = "Swiftfeather Quiver\nBinds when equipped\nUnique\n16 Slot Bag\nRequires Level 57\nEquip: Increases ranged attack speed by 14%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61549", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61488, + ["name"] = "Azurebeak", + ["level"] = 60, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, +} + +MTH_DS_Bags = MTH_DS_BagItems diff --git a/data/ds-beasts-extra.lua b/data/ds-beasts-extra.lua index d2ba109..7641827 100644 --- a/data/ds-beasts-extra.lua +++ b/data/ds-beasts-extra.lua @@ -1667,7 +1667,7 @@ if not MTH_DS_Beasts[61096] then ["family"] = "Wind Serpents", ["lvl"] = "57-58", ["fac"] = "Unknown", - ["abilities"] = "TBD", + ["abilities"] = "None", ["attackSpeed"] = "2.0", ["untameable"] = true, ["respawnMinSeconds"] = 280, diff --git a/data/ds-items-origins.lua b/data/ds-items-origins.lua new file mode 100644 index 0000000..208e137 --- /dev/null +++ b/data/ds-items-origins.lua @@ -0,0 +1,17889 @@ +-- MetaHunt Item Origins Overlay (Projectiles, Bows, Guns, Crossbows) +-- Sources: ?items=6, ?items=2.2, ?items=2.3, ?items=2.18 +-- World-drop heavy lists are collapsed to worldDrop + droppedByCount. + +if not MTH_DS then MTH_DS = {} end +if not MTH_DS_AmmoItems then MTH_DS_AmmoItems = {} end + +MTH_DS_ItemOrigins = { + [2098] = { + ["name"] = "Double-barreled Shotgun", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 27, + ["reqlevel"] = 22, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Double-barreled Shotgun\nBinds when equippedRangedGun21 - 40 DamageSpeed 2.30(13.3 damage per second)\nDurability 70 / 70\nRequires Level 22", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2098", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 408, + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 7, + ["name"] = "*", + ["level"] = 1, + ["classification"] = 0, + }, + }, + }, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 18, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [2099] = { + ["name"] = "Dwarven Hand Cannon", + ["icon"] = "INV_Weapon_Rifle_09", + ["quality"] = 4, + ["level"] = 58, + ["reqlevel"] = 53, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Dwarven Hand Cannon\nBinds when equippedRangedGun66 - 124 DamageSpeed 2.90(32.8 damage per second)\nDurability 90 / 90\nRequires Level 53\nEquip: Chance to strike your ranged target with a Flaming Cannonball for 33 to 50 Fire damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2099", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 489, + }, + }, + [2100] = { + ["name"] = "Precisely Calibrated Boomstick", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 4, + ["level"] = 48, + ["reqlevel"] = 43, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Precisely Calibrated Boomstick\nBinds when equippedRangedGun38 - 45 DamageSpeed 1.50(27.7 damage per second)\n+14 Agility\nDurability 90 / 90\nRequires Level 43", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2100", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 302, + }, + }, + [2504] = { + ["name"] = "Worn Shortbow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 1, + ["level"] = 2, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Worn ShortbowRangedBow2 - 5 DamageSpeed 2.30(1.5 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2504", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2505] = { + ["name"] = "Polished Shortbow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 4, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Polished ShortbowRangedBow2 - 5 DamageSpeed 2.00(1.8 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2505", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2506] = { + ["name"] = "Hornwood Recurve Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 1, + ["level"] = 8, + ["reqlevel"] = 3, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hornwood Recurve BowRangedBow3 - 7 DamageSpeed 2.10(2.4 damage per second)\nDurability 30 / 30\nRequires Level 3", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2506", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 11, + ["entries"] = { + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Bowyer", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2507] = { + ["name"] = "Laminated Recurve Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 1, + ["level"] = 16, + ["reqlevel"] = 11, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Laminated Recurve BowRangedBow10 - 20 DamageSpeed 2.60(5.8 damage per second)\nDurability 40 / 40\nRequires Level 11", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2507", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 21, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Bowyer", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "The Army of Lordaeron", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "Bowyer", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "Bowyer", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "School of the Dragonhawk", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2508] = { + ["name"] = "Old Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 1, + ["level"] = 2, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Old BlunderbussRangedGun2 - 5 DamageSpeed 2.30(1.5 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2508", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2509] = { + ["name"] = "Ornate Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_02", + ["quality"] = 1, + ["level"] = 9, + ["reqlevel"] = 4, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Ornate BlunderbussRangedGun4 - 9 DamageSpeed 2.20(3.0 damage per second)\nDurability 30 / 30\nRequires Level 4", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2509", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 17, + ["entries"] = { + { + ["id"] = 1469, + ["name"] = "Vrok Blunderblast", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3078, + ["name"] = "Kennah Hawkseye", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "Guns and Ammo", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 2997, + ["name"] = "Jyn Stonehoof", + ["tag"] = "Weapons Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1243, + ["name"] = "Hegnar Rumbleshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2510] = { + ["name"] = "Solid Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 1, + ["level"] = 3, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Solid BlunderbussRangedGun3 - 6 DamageSpeed 2.20(2.0 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2510", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 6, + ["entries"] = { + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3078, + ["name"] = "Kennah Hawkseye", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1243, + ["name"] = "Hegnar Rumbleshot", + ["tag"] = "Gunsmith", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gun Merchant", + ["level"] = 10, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2511] = { + ["name"] = "Hunter's Boomstick", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 1, + ["level"] = 14, + ["reqlevel"] = 9, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Hunter's BoomstickRangedGun7 - 14 DamageSpeed 2.10(5.0 damage per second)\nDurability 40 / 40\nRequires Level 9", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2511", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 14, + ["entries"] = { + { + ["id"] = 1469, + ["name"] = "Vrok Blunderblast", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Gunsmith", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "Guns and Ammo", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2997, + ["name"] = "Jyn Stonehoof", + ["tag"] = "Weapons Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "Gunsmith", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2512] = { + ["name"] = "Rough Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 1, + ["level"] = 5, + ["reqlevel"] = 1, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Rough ArrowProjectileArrowAdds 1.5 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2512", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 93, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1682, + ["name"] = "Yanni Stoutheart", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 1685, + ["name"] = "Xandar Goodbeard", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 91248, + ["name"] = "Wixx", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "Bow Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Ammunition Vendor", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Quartermaster", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 491, + ["name"] = "Quartermaster Lewis", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "The Army of Lordaeron", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "Trader", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 80102, + ["name"] = "Ohgi Cardya", + ["tag"] = "Everyday Necessities", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2134, + ["name"] = "Mrs. Winters", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3076, + ["name"] = "Moorat Longstride", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "Weapon and Shield Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 61742, + ["name"] = "Mazin Forkblast", + ["tag"] = "Weapons Merchant", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Food Merchant", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 80214, + ["name"] = "Malanius Silvershine", + ["tag"] = "Ammunition", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3587, + ["name"] = "Lyrai", + ["tag"] = "General Supplies", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 791, + ["name"] = "Lindsay Ashlock", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bowyer", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "General Goods Vendor", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1691, + ["name"] = "Kreg Bilmn", + ["tag"] = "Fletcher", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Ammunition", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3072, + ["name"] = "Kawnie Softbreeze", + ["tag"] = "Metalsmith", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 3186, + ["name"] = "K'waii", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 2115, + ["name"] = "Joshua Kien", + ["tag"] = "Bow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "General Supplies", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3498, + ["name"] = "Jazzik", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3164, + ["name"] = "Jark", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Superior Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 4082, + ["name"] = "Grawnal", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "General Supplies", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "General Supplies", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "General Goods Vendor", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "Fletcher", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "General Supplies", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 2140, + ["name"] = "Edwin Harly", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3158, + ["name"] = "Duokna", + ["tag"] = "General & Trade Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1250, + ["name"] = "Drake Lindgren", + ["tag"] = "Ammunition", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4182, + ["name"] = "Dalmond", + ["tag"] = "School of the Dragonhawk", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "General Supplies", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 4084, + ["name"] = "Chylina", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 9, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 9, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "General Supplies", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 152, + ["name"] = "Brother Danil", + ["tag"] = "General Supplies", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 151, + ["name"] = "Brog Hamfist", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "General Supplies", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 3481, + ["name"] = "Barg", + ["tag"] = "Fletcher", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3608, + ["name"] = "Aldia", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 829, + ["name"] = "Adlin Pridedrift", + ["tag"] = "Bow Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["level"] = 10, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2515] = { + ["name"] = "Sharp Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 1, + ["level"] = 15, + ["reqlevel"] = 10, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Sharp ArrowProjectileArrowAdds 3.5 damage per second\nRequires Level 10", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2515", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 142, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1682, + ["name"] = "Yanni Stoutheart", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 1685, + ["name"] = "Xandar Goodbeard", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 91246, + ["name"] = "Valkar", + ["tag"] = "Fletcher", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 60803, + ["name"] = "Tyrion Bouden", + ["tag"] = "The Blackwing Guard", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 10369, + ["name"] = "Trayexir", + ["tag"] = "Weapon Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 61058, + ["name"] = "Tazo Wirelight", + ["tag"] = "General Goods", + ["level"] = 13, + ["classification"] = 0, + }, + { + ["id"] = 60966, + ["name"] = "Tanzig Wexlight", + ["tag"] = "General Goods", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Bow Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "The Scourge", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "Ammunition Vendor", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Quartermaster", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Voodoo Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 491, + ["name"] = "Quartermaster Lewis", + ["tag"] = "Shanty Awares", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "The Army of Lordaeron", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "Everyday Necessities", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "General Goods Vendor", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "Engineering & General Goods Supplier", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 1448, + ["name"] = "Neal Allen", + ["tag"] = "General Goods", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "Bowyer", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Bowyer", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "Bowyer", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "General Goods Vendor", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "General Goods", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "Weapon and Shield Merchant", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61742, + ["name"] = "Mazin Forkblast", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "Ammunition", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "General Supplies", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 227, + ["name"] = "Mabel Solaj", + ["tag"] = "Bow Merchant", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 791, + ["name"] = "Lindsay Ashlock", + ["tag"] = "Bowyer", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "General Goods Vendor", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 62088, + ["name"] = "Laithor Morningleaf", + ["tag"] = "General Supplies", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Fletcher", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "Ammunition", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3589, + ["name"] = "Keina", + ["tag"] = "Metalsmith", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "General Goods", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "Bow Merchant", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3610, + ["name"] = "Jeena Featherbow", + ["tag"] = "Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3498, + ["name"] = "Jazzik", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4876, + ["name"] = "Jawn Highmesa", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Superior Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61743, + ["name"] = "Hazlor Torkfuse", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 3962, + ["name"] = "Haljan Oakheart", + ["tag"] = "Unhappy Prisoner", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1452, + ["name"] = "Gruham Rumdnul", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 4082, + ["name"] = "Grawnal", + ["tag"] = "Hand of Wrath", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "General Supplies", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3165, + ["name"] = "Ghrawt", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "Golden Moon", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "General Goods Vendor", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "Fletcher", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "Ammunition", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 2140, + ["name"] = "Edwin Harly", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "School of the Dragonhawk", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 91725, + ["name"] = "Darren Mistwall", + ["tag"] = "Camp Trader", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 4182, + ["name"] = "Dalmond", + ["tag"] = "Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "Innkeeper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4084, + ["name"] = "Chylina", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "General Goods Vendor", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60989, + ["name"] = "Borrin Dustshoulder", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "General Supplies", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Fletcher", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "The Scarlet Crusade", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3481, + ["name"] = "Barg", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods Vendor", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60740, + ["name"] = "Bald'aan The Quiet", + ["tag"] = "Weapon Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["tag"] = "Bow Merchant", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 60813, + ["name"] = "Ahnja Summerwind", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2516] = { + ["name"] = "Light Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 5, + ["reqlevel"] = 1, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Light ShotProjectileBulletAdds 1.5 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2516", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 72, + ["entries"] = { + { + ["id"] = 1682, + ["name"] = "Yanni Stoutheart", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1685, + ["name"] = "Xandar Goodbeard", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 91248, + ["name"] = "Wixx", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1469, + ["name"] = "Vrok Blunderblast", + ["tag"] = "Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "Quartermaster", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 491, + ["name"] = "Quartermaster Lewis", + ["tag"] = "Trader", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 80102, + ["name"] = "Ohgi Cardya", + ["tag"] = "Everyday Necessities", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "Gun Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "General Goods Vendor", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "Gunsmith", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 2134, + ["name"] = "Mrs. Winters", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 3076, + ["name"] = "Moorat Longstride", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "Engineering Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2685, + ["name"] = "Mazk Snipeshot", + ["tag"] = "Food Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 80214, + ["name"] = "Malanius Silvershine", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3587, + ["name"] = "Lyrai", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 791, + ["name"] = "Lindsay Ashlock", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Gunsmith", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "General Supplies", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1691, + ["name"] = "Kreg Bilmn", + ["tag"] = "Gunsmith", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 3078, + ["name"] = "Kennah Hawkseye", + ["tag"] = "General Goods", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 3072, + ["name"] = "Kawnie Softbreeze", + ["tag"] = "Metalsmith", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Guns and Ammo", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3186, + ["name"] = "K'waii", + ["tag"] = "Weapons Merchant", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 2997, + ["name"] = "Jyn Stonehoof", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 2115, + ["name"] = "Joshua Kien", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3498, + ["name"] = "Jazzik", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3164, + ["name"] = "Jark", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Gunsmith", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "Gunsmith", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 1243, + ["name"] = "Hegnar Rumbleshot", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61743, + ["name"] = "Hazlor Torkfuse", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 4082, + ["name"] = "Grawnal", + ["tag"] = "General Supplies", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "General Supplies", + ["level"] = 12, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "General Goods Vendor", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Supplies", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 2140, + ["name"] = "Edwin Harly", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3158, + ["name"] = "Duokna", + ["tag"] = "General & Trade Supplies", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 1250, + ["name"] = "Drake Lindgren", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 4182, + ["name"] = "Dalmond", + ["tag"] = "General Supplies", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 4084, + ["name"] = "Chylina", + ["tag"] = "General Goods", + ["level"] = 9, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 9, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "General Supplies", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 152, + ["name"] = "Brother Danil", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 151, + ["name"] = "Brog Hamfist", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3481, + ["name"] = "Barg", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 3608, + ["name"] = "Aldia", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["tag"] = "General Supplies", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 829, + ["name"] = "Adlin Pridedrift", + ["level"] = 36, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2519] = { + ["name"] = "Heavy Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 15, + ["reqlevel"] = 10, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Heavy ShotProjectileBulletAdds 3.5 damage per second\nRequires Level 10", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2519", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 123, + ["entries"] = { + { + ["id"] = 1682, + ["name"] = "Yanni Stoutheart", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 1685, + ["name"] = "Xandar Goodbeard", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 1469, + ["name"] = "Vrok Blunderblast", + ["tag"] = "Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 5510, + ["name"] = "Thulman Flintcrag", + ["tag"] = "Guns Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 61058, + ["name"] = "Tazo Wirelight", + ["tag"] = "General Goods", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 60966, + ["name"] = "Tanzig Wexlight", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "The Scourge", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Quartermaster", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Voodoo Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 491, + ["name"] = "Quartermaster Lewis", + ["tag"] = "Shanty Awares", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Everyday Necessities", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Engineering & General Goods Supplier", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 1448, + ["name"] = "Neal Allen", + ["tag"] = "General Goods", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "General Goods Vendor", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Gunsmith", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "General Goods", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "Engineering Supplies", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2685, + ["name"] = "Mazk Snipeshot", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "Ammunition", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "General Goods Vendor", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "General Supplies", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 227, + ["name"] = "Mabel Solaj", + ["tag"] = "General Goods Vendor", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 791, + ["name"] = "Lindsay Ashlock", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Gunsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Ammunition", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 3078, + ["name"] = "Kennah Hawkseye", + ["tag"] = "Metalsmith", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "Guns and Ammo", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Weapons Merchant", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2997, + ["name"] = "Jyn Stonehoof", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3498, + ["name"] = "Jazzik", + ["tag"] = "Gunsmith", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 4876, + ["name"] = "Jawn Highmesa", + ["tag"] = "Guns Merchant", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "Gunsmith", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "Gunsmith", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 1243, + ["name"] = "Hegnar Rumbleshot", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61743, + ["name"] = "Hazlor Torkfuse", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 3962, + ["name"] = "Haljan Oakheart", + ["tag"] = "Unhappy Prisoner", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1452, + ["name"] = "Gruham Rumdnul", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 4082, + ["name"] = "Grawnal", + ["tag"] = "Hand of Wrath", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "General Supplies", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "Golden Moon", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "General Goods", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "General Supplies", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "Ammunition", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 2140, + ["name"] = "Edwin Harly", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "Camp Trader", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 91725, + ["name"] = "Darren Mistwall", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 4182, + ["name"] = "Dalmond", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "Innkeeper", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 4084, + ["name"] = "Chylina", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "General Goods Vendor", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Gun Merchant", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60989, + ["name"] = "Borrin Dustshoulder", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "The Scarlet Crusade", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3481, + ["name"] = "Barg", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60740, + ["name"] = "Bald'aan The Quiet", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["tag"] = "General Goods", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60813, + ["name"] = "Ahnja Summerwind", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [2550] = { + ["name"] = "Monster - Bow, Short", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, ShortRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2550", + ["sources"] = { + }, + }, + [2551] = { + ["name"] = "Monster - Crossbow", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Monster - CrossbowRangedCrossbow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2551", + ["sources"] = { + }, + }, + [2552] = { + ["name"] = "Monster - Gun", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - GunRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2552", + ["sources"] = { + }, + }, + [2773] = { + ["name"] = "Cracked Shortbow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 8, + ["reqlevel"] = 3, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Cracked ShortbowRangedBow3 - 6 DamageSpeed 2.30(2.0 damage per second)\nDurability 30 / 30\nRequires Level 3", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2773", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 293, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 5, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 106318, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2844, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2843, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [2774] = { + ["name"] = "Rust-covered Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 7, + ["reqlevel"] = 2, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Rust-covered BlunderbussRangedGun3 - 6 DamageSpeed 2.40(1.9 damage per second)\nDurability 30 / 30\nRequires Level 2", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2774", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 293, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 106318, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2844, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2843, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [2777] = { + ["name"] = "Feeble Shortbow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 13, + ["reqlevel"] = 8, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Feeble ShortbowRangedBow4 - 8 DamageSpeed 1.80(3.3 damage per second)\nDurability 35 / 35\nRequires Level 8", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2777", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 264, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [2778] = { + ["name"] = "Cheap Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 13, + ["reqlevel"] = 8, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Cheap BlunderbussRangedGun5 - 9 DamageSpeed 2.20(3.2 damage per second)\nDurability 35 / 35\nRequires Level 8", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2778", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 264, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [2780] = { + ["name"] = "Light Hunting Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 0, + ["level"] = 19, + ["reqlevel"] = 14, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Light Hunting BowRangedBow5 - 10 DamageSpeed 1.70(4.4 damage per second)\nDurability 45 / 45\nRequires Level 14", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2780", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 345, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 10, + ["entries"] = { + { + ["id"] = 3642, + ["name"] = "Kolkars' Booty", + }, + { + ["id"] = 152608, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 152618, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 75293, + ["name"] = "Large Battered Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 3661, + ["name"] = "Weapon Crate", + }, + { + ["id"] = 3660, + ["name"] = "Armor Crate", + }, + { + ["id"] = 3689, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [2781] = { + ["name"] = "Dirty Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 18, + ["reqlevel"] = 13, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Dirty BlunderbussRangedGun6 - 12 DamageSpeed 2.20(4.1 damage per second)\nDurability 45 / 45\nRequires Level 13", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2781", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 345, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 3642, + ["name"] = "Kolkars' Booty", + }, + { + ["id"] = 152608, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 152618, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 75293, + ["name"] = "Large Battered Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 3661, + ["name"] = "Weapon Crate", + }, + { + ["id"] = 3689, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [2782] = { + ["name"] = "Mishandled Recurve Bow", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 0, + ["level"] = 24, + ["reqlevel"] = 19, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Mishandled Recurve BowRangedBow9 - 18 DamageSpeed 2.40(5.6 damage per second)\nDurability 55 / 55\nRequires Level 19", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2782", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 336, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 22, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2850, + ["name"] = "Solid Chest", + }, + { + ["id"] = 3714, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 3715, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [2783] = { + ["name"] = "Shoddy Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 22, + ["reqlevel"] = 17, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Shoddy BlunderbussRangedGun7 - 14 DamageSpeed 2.10(5.0 damage per second)\nDurability 50 / 50\nRequires Level 17", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2783", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 336, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 22, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2850, + ["name"] = "Solid Chest", + }, + { + ["id"] = 3714, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 3715, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [2785] = { + ["name"] = "Stiff Recurve Bow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 28, + ["reqlevel"] = 23, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Stiff Recurve BowRangedBow13 - 25 DamageSpeed 2.80(6.8 damage per second)\nDurability 60 / 60\nRequires Level 23", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2785", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 954, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 20, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 3704, + ["name"] = "Weapon Crate", + }, + { + ["id"] = 3689, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [2786] = { + ["name"] = "Oiled Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 29, + ["reqlevel"] = 24, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Oiled BlunderbussRangedGun9 - 19 DamageSpeed 2.00(7.0 damage per second)\nDurability 65 / 65\nRequires Level 24", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2786", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 954, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 20, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 3704, + ["name"] = "Weapon Crate", + }, + { + ["id"] = 3689, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [2824] = { + ["name"] = "Hurricane", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 4, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hurricane\nBinds when equippedRangedBow34 - 63 DamageSpeed 1.60(30.3 damage per second)\nDurability 90 / 90\nRequires Level 48\nEquip: Chance to strike your target with a Frost Arrow for 31 to 46 Frost damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2824", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 428, + }, + }, + [2825] = { + ["name"] = "Bow of Searing Arrows", + ["icon"] = "INV_Weapon_Bow_09", + ["quality"] = 4, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of Searing Arrows\nBinds when equippedRangedBow47 - 88 DamageSpeed 2.70(25.0 damage per second)\nDurability 90 / 90\nRequires Level 37\nEquip: Chance to strike your ranged target with a Searing Arrow for 18 to 27 Fire damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2825", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 257, + }, + }, + [2903] = { + ["name"] = "Daryl's Hunting Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 15, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Daryl's Hunting Bow\nBinds when picked upRangedBow9 - 18 DamageSpeed 2.30(5.9 damage per second)\nDurability 40 / 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2903", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [2904] = { + ["name"] = "Daryl's Hunting Rifle", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 16, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Daryl's Hunting Rifle\nBinds when picked upRangedGun11 - 21 DamageSpeed 2.50(6.4 damage per second)\nDurability 40 / 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=2904", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3021] = { + ["name"] = "Ranger Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 25, + ["reqlevel"] = 20, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ranger Bow\nBinds when equippedRangedBow23 - 45 DamageSpeed 2.70(12.6 damage per second)\n+1 Agility\nDurability 65 / 65\nRequires Level 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3021", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 457, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 19, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [3023] = { + ["name"] = "Large Bore Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 1, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Large Bore BlunderbussRangedGun13 - 24 DamageSpeed 2.50(7.4 damage per second)\nDurability 50 / 50\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3023", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 17, + ["entries"] = { + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "Gunsmith", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "Gunsmith", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gun Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3024] = { + ["name"] = "BKP 2700 \"Enforcer\"", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 1, + ["level"] = 26, + ["reqlevel"] = 21, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "BKP 2700 \"Enforcer\"RangedGun18 - 34 DamageSpeed 2.70(9.6 damage per second)\nDurability 60 / 60\nRequires Level 21", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3024", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 16, + ["entries"] = { + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "Gunsmith", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61751, + ["name"] = "Kango Boltblast", + ["tag"] = "Guns and Ammo", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "Guns Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "Gun Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "Gunsmith", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3025] = { + ["name"] = "BKP 42 \"Ultra\"", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 1, + ["level"] = 36, + ["reqlevel"] = 31, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "BKP 42 \"Ultra\"RangedGun20 - 38 DamageSpeed 2.10(13.8 damage per second)\nDurability 65 / 65\nRequires Level 31", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3025", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3026] = { + ["name"] = "Reinforced Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Reinforced BowRangedBow11 - 22 DamageSpeed 2.20(7.5 damage per second)\nDurability 50 / 50\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3026", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 28, + ["entries"] = { + { + ["id"] = 3409, + ["name"] = "Zendo'jian", + ["tag"] = "Weapon Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 91977, + ["name"] = "Olfan Goldenbrow", + ["tag"] = "The Army of Lordaeron", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bow Merchant", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "Superior Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 60659, + ["name"] = "Cydas Moonshadow", + ["tag"] = "School of the Dragonhawk", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4203, + ["name"] = "Ariyell Skyshadow", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3027] = { + ["name"] = "Heavy Recurve Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 1, + ["level"] = 25, + ["reqlevel"] = 20, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Heavy Recurve BowRangedBow15 - 29 DamageSpeed 2.40(9.2 damage per second)\nDurability 55 / 55\nRequires Level 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3027", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 18, + ["entries"] = { + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bow Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "Superior Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3028] = { + ["name"] = "Longbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 1, + ["level"] = 34, + ["reqlevel"] = 29, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "LongbowRangedBow21 - 39 DamageSpeed 2.30(13.0 damage per second)\nDurability 65 / 65\nRequires Level 29", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3028", + ["sources"] = { + }, + }, + [3030] = { + ["name"] = "Razor Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 1, + ["level"] = 30, + ["reqlevel"] = 25, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Razor ArrowProjectileArrowAdds 7.5 damage per second\nRequires Level 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3030", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 114, + ["entries"] = { + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60803, + ["name"] = "Tyrion Bouden", + ["tag"] = "The Blackwing Guard", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61058, + ["name"] = "Tazo Wirelight", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60966, + ["name"] = "Tanzig Wexlight", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "The Scourge", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "Ammunition Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "General Goods", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Voodoo Goods", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Shanty Awares", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "Everyday Necessities", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "General Goods Vendor", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "Engineering & General Goods Supplier", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 1448, + ["name"] = "Neal Allen", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Bowyer", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "General Goods Vendor", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "Weapons Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "Ammunition", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Bow Merchant", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 227, + ["name"] = "Mabel Solaj", + ["tag"] = "General Goods Vendor", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "General Supplies", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Fletcher", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Ammunition", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "Metalsmith", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "Bow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4876, + ["name"] = "Jawn Highmesa", + ["tag"] = "Superior Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61743, + ["name"] = "Hazlor Torkfuse", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 3962, + ["name"] = "Haljan Oakheart", + ["tag"] = "Unhappy Prisoner", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 1452, + ["name"] = "Gruham Rumdnul", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "Hand of Wrath", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "General Supplies", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "General Supplies", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "Golden Moon", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "Fletcher", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "Ammunition", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "Camp Trader", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 91725, + ["name"] = "Darren Mistwall", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "Innkeeper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4084, + ["name"] = "Chylina", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "General Goods Vendor", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60989, + ["name"] = "Borrin Dustshoulder", + ["tag"] = "Fletcher", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "The Scarlet Crusade", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 60740, + ["name"] = "Bald'aan The Quiet", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["tag"] = "General Goods", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["tag"] = "Bow Merchant", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60813, + ["name"] = "Ahnja Summerwind", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3033] = { + ["name"] = "Solid Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 30, + ["reqlevel"] = 25, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Solid ShotProjectileBulletAdds 7.5 damage per second\nRequires Level 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3033", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 105, + ["entries"] = { + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61058, + ["name"] = "Tazo Wirelight", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 60966, + ["name"] = "Tanzig Wexlight", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "The Scourge", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Voodoo Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Shanty Awares", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Everyday Necessities", + ["level"] = 19, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "Gun Merchant", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "General Goods Vendor", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "Engineering & General Goods Supplier", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 1448, + ["name"] = "Neal Allen", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Gunsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "Engineering Supplies", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 2685, + ["name"] = "Mazk Snipeshot", + ["tag"] = "General Goods", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "Ammunition", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 227, + ["name"] = "Mabel Solaj", + ["tag"] = "General Supplies", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Gunsmith", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Ammunition", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "General Goods", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "Metalsmith", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "Gunsmith", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4876, + ["name"] = "Jawn Highmesa", + ["tag"] = "Guns Merchant", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "Gunsmith", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 1686, + ["name"] = "Irene Sureshot", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 3088, + ["name"] = "Henry Chapal", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61743, + ["name"] = "Hazlor Torkfuse", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3962, + ["name"] = "Haljan Oakheart", + ["tag"] = "Unhappy Prisoner", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 1452, + ["name"] = "Gruham Rumdnul", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "Hand of Wrath", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "General Supplies", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "Golden Moon", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "General Goods", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "Ammunition", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "Camp Trader", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 91725, + ["name"] = "Darren Mistwall", + ["tag"] = "Innkeeper", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "General Goods Vendor", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Gun Merchant", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 26, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "Gunsmith", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60989, + ["name"] = "Borrin Dustshoulder", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "The Scarlet Crusade", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 60740, + ["name"] = "Bald'aan The Quiet", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["tag"] = "General Goods", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60813, + ["name"] = "Ahnja Summerwind", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [3036] = { + ["name"] = "Heavy Shortbow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 2, + ["level"] = 15, + ["reqlevel"] = 10, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Heavy Shortbow\nBinds when equippedRangedBow10 - 20 DamageSpeed 2.50(6.0 damage per second)\nDurability 40 / 40\nRequires Level 10", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3036", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 488, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [3037] = { + ["name"] = "Whipwood Recurve Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 2, + ["level"] = 34, + ["reqlevel"] = 29, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Whipwood Recurve Bow\nBinds when equippedRangedBow17 - 32 DamageSpeed 1.80(13.6 damage per second)\nDurability 65 / 65\nRequires Level 29", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3037", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 622, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [3039] = { + ["name"] = "Short Ash Bow", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 2, + ["level"] = 23, + ["reqlevel"] = 18, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Short Ash Bow\nBinds when equippedRangedBow12 - 23 DamageSpeed 1.90(9.2 damage per second)\nDurability 55 / 55\nRequires Level 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3039", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 531, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 19, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [3040] = { + ["name"] = "Hunter's Muzzle Loader", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 19, + ["reqlevel"] = 14, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Hunter's Muzzle Loader\nBinds when equippedRangedGun9 - 18 DamageSpeed 1.80(7.5 damage per second)\nDurability 45 / 45\nRequires Level 14", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3040", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 564, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 7, + ["entries"] = { + { + ["id"] = 3642, + ["name"] = "Kolkars' Booty", + }, + { + ["id"] = 152608, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 152618, + ["name"] = "Kolkar's Booty", + }, + { + ["id"] = 75293, + ["name"] = "Large Battered Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [3041] = { + ["name"] = "\"Mage-Eye\" Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 31, + ["reqlevel"] = 26, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "\"Mage-Eye\" Blunderbuss\nBinds when equippedRangedGun24 - 46 DamageSpeed 2.80(12.5 damage per second)\nDurability 65 / 65\nRequires Level 26", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3041", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 699, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [3042] = { + ["name"] = "BKP \"Sparrow\" Smallbore", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "BKP \"Sparrow\" Smallbore\nBinds when equippedRangedGun15 - 30 DamageSpeed 1.70(13.2 damage per second)\nDurability 65 / 65\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3042", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 548, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [3078] = { + ["name"] = "Naga Heartpiercer", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 2, + ["level"] = 26, + ["reqlevel"] = 21, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Naga Heartpiercer\nBinds when picked upRangedBow13 - 25 DamageSpeed 1.80(10.6 damage per second)\nDurability 60 / 60\nRequires Level 21", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3078", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 4831, + ["name"] = "Lady Sarevess", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [3079] = { + ["name"] = "Skorn's Rifle", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 12, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Skorn's Rifle\nBinds when picked upRangedGun6 - 13 DamageSpeed 1.90(5.0 damage per second)\nDurability 35 / 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3079", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3430] = { + ["name"] = "Sniper Rifle", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 44, + ["reqlevel"] = 39, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Sniper Rifle\nBinds when equippedRangedGun56 - 65 DamageSpeed 3.00(20.2 damage per second)\nDurability 65 / 65\nRequires Level 39\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3430", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 636, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 142184, + ["name"] = "Captain's Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + }, + }, + }, + }, + [3464] = { + ["name"] = "Feathered Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 2, + ["level"] = 35, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Feathered ArrowProjectileArrowAdds 9.5 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3464", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3465] = { + ["name"] = "Exploding Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 2, + ["level"] = 36, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Exploding ShotProjectileBulletAdds 9.5 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3465", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3493] = { + ["name"] = "Raptor's End", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 2, + ["level"] = 30, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Raptor's End\nBinds when picked upRangedBow24 - 46 DamageSpeed 2.90(12.1 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3493", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3567] = { + ["name"] = "Dwarven Fishing Pole", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 19, + ["subtype"] = "gun", + ["description"] = "Dwarves aren't known for their subtlety.", + ["tooltip"] = "Dwarven Fishing Pole\nBinds when picked upRangedGun9 - 19 DamageSpeed 1.90(7.4 damage per second)\nDurability 45 / 45\n\"Dwarves aren't known for their subtlety.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3567", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3742] = { + ["name"] = "Bow of Plunder", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 28, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of Plunder\nBinds when picked upRangedBow20 - 39 DamageSpeed 2.60(11.3 damage per second)\nDurability 60 / 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3742", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [3778] = { + ["name"] = "Taut Compound Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 0, + ["level"] = 31, + ["reqlevel"] = 26, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Taut Compound BowRangedBow13 - 25 DamageSpeed 2.50(7.6 damage per second)\nDurability 65 / 65\nRequires Level 26", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3778", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 954, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 17, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 3703, + ["name"] = "Armor Crate", + }, + { + ["id"] = 3704, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [3780] = { + ["name"] = "Long-barreled Musket", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Long-barreled MusketRangedGun14 - 27 DamageSpeed 2.60(7.9 damage per second)\nDurability 65 / 65\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=3780", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 706, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 17, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 3703, + ["name"] = "Armor Crate", + }, + { + ["id"] = 3704, + ["name"] = "Weapon Crate", + }, + }, + }, + }, + }, + [4025] = { + ["name"] = "Balanced Long Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 0, + ["level"] = 45, + ["reqlevel"] = 40, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Balanced Long BowRangedBow15 - 29 DamageSpeed 1.80(12.2 damage per second)\nDurability 65 / 65\nRequires Level 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4025", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 1421, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 11, + ["entries"] = { + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 141596, + ["name"] = "Witch Doctor's Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [4026] = { + ["name"] = "Sentinel Musket", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 43, + ["reqlevel"] = 38, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Sentinel MusketRangedGun22 - 43 DamageSpeed 2.80(11.6 damage per second)\nDurability 65 / 65\nRequires Level 38", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4026", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 1421, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 10, + ["entries"] = { + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 141596, + ["name"] = "Witch Doctor's Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [4086] = { + ["name"] = "Flash Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 37, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Flash Rifle\nBinds when picked upRangedGun19 - 36 DamageSpeed 1.80(15.3 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4086", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [4087] = { + ["name"] = "Trueshot Bow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 2, + ["level"] = 41, + ["reqlevel"] = 36, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Trueshot Bow\nBinds when equippedRangedBow24 - 45 DamageSpeed 1.90(18.2 damage per second)\nDurability 65 / 65\nRequires Level 36\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4087", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 609, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 142184, + ["name"] = "Captain's Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + }, + }, + }, + }, + [4089] = { + ["name"] = "Ricochet Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 48, + ["reqlevel"] = 43, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Ricochet Blunderbuss\nBinds when equippedRangedGun36 - 67 DamageSpeed 2.30(22.4 damage per second)\nDurability 65 / 65\nRequires Level 43\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4089", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 705, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [4110] = { + ["name"] = "Master Hunter's Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 2, + ["level"] = 45, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Master Hunter's Bow\nBinds when picked upRangedBow35 - 65 DamageSpeed 2.40(20.8 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4110", + ["sources"] = { + }, + }, + [4111] = { + ["name"] = "Master Hunter's Rifle", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 45, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Master Hunter's Rifle\nBinds when picked upRangedGun37 - 70 DamageSpeed 2.60(20.6 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4111", + ["sources"] = { + }, + }, + [4127] = { + ["name"] = "Shrapnel Blaster", + ["icon"] = "INV_Weapon_Rifle_02", + ["quality"] = 2, + ["level"] = 40, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Shrapnel Blaster\nBinds when picked upRangedGun23 - 43 DamageSpeed 1.90(17.4 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4127", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [4362] = { + ["name"] = "Rough Boomstick", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 10, + ["reqlevel"] = 5, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Rough Boomstick\nBinds when equippedRangedGun6 - 13 DamageSpeed 2.30(4.1 damage per second)\nDurability 35 / 35\nRequires Level 5", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4362", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3925, + ["name"] = "@Rough Boomstick", + }, + }, + }, + }, + }, + [4369] = { + ["name"] = "Deadly Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Deadly Blunderbuss\nBinds when equippedRangedGun15 - 28 DamageSpeed 2.60(8.3 damage per second)\nDurability 50 / 50\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4369", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3936, + ["name"] = "@Deadly Blunderbuss", + }, + }, + }, + }, + }, + [4372] = { + ["name"] = "Lovingly Crafted Boomstick", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 24, + ["reqlevel"] = 19, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Lovingly Crafted Boomstick\nBinds when equippedRangedGun12 - 23 DamageSpeed 1.80(9.7 damage per second)\nDurability 55 / 55\nRequires Level 19", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4372", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3939, + ["name"] = "@Lovingly Crafted Boomstick", + }, + }, + }, + }, + }, + [4379] = { + ["name"] = "Silver-plated Shotgun", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 26, + ["reqlevel"] = 21, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Silver-plated Shotgun\nBinds when equippedRangedGun19 - 37 DamageSpeed 2.70(10.4 damage per second)\nDurability 60 / 60\nRequires Level 21", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4379", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3949, + ["name"] = "@Silver-plated Shotgun", + }, + }, + }, + }, + }, + [4383] = { + ["name"] = "Moonsight Rifle", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 2, + ["level"] = 29, + ["reqlevel"] = 24, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Moonsight Rifle\nBinds when equippedRangedGun14 - 26 DamageSpeed 1.70(11.8 damage per second)\nDurability 65 / 65\nRequires Level 24", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4383", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3954, + ["name"] = "@Moonsight Rifle", + }, + }, + }, + }, + }, + [4474] = { + ["name"] = "Ravenwood Bow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 2, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ravenwood Bow\nBinds when equippedRangedBow17 - 32 DamageSpeed 1.90(12.9 damage per second)\nDurability 65 / 65\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4474", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 507, + ["name"] = "Fenros", + ["level"] = 32, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [4576] = { + ["name"] = "Light Bow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Light Bow\nBinds when equippedRangedBow9 - 18 DamageSpeed 1.70(7.9 damage per second)\nDurability 50 / 50\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4576", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 512, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 22, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2850, + ["name"] = "Solid Chest", + }, + { + ["id"] = 3714, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 3715, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [4577] = { + ["name"] = "Compact Shotgun", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 13, + ["reqlevel"] = 8, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Compact Shotgun\nBinds when equippedRangedGun7 - 14 DamageSpeed 2.00(5.3 damage per second)\nDurability 35 / 35\nRequires Level 8", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4577", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 544, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [4763] = { + ["name"] = "Blackwood Recurve Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 2, + ["level"] = 9, + ["reqlevel"] = 4, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Blackwood Recurve Bow\nBinds when equippedRangedBow7 - 14 DamageSpeed 2.70(3.9 damage per second)\nDurability 30 / 30\nRequires Level 4", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4763", + ["sources"] = { + }, + }, + [4931] = { + ["name"] = "Hickory Shortbow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 1, + ["level"] = 11, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hickory Shortbow\nBinds when picked upRangedBow5 - 10 DamageSpeed 2.00(3.8 damage per second)\nDurability 35 / 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4931", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [4960] = { + ["name"] = "Flash Pellet", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 7, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Flash PelletProjectileBulletAdds 2.0 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=4960", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [5258] = { + ["name"] = "Monster - Bow, Black", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, BlackRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5258", + ["sources"] = { + }, + }, + [5259] = { + ["name"] = "Monster - Bow, Red", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, RedRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5259", + ["sources"] = { + }, + }, + [5260] = { + ["name"] = "Monster - Bow, Brown", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, BrownRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5260", + ["sources"] = { + }, + }, + [5261] = { + ["name"] = "Monster - Bow, Gray", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, GrayRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5261", + ["sources"] = { + }, + }, + [5262] = { + ["name"] = "Monster - Bow, Dark Brown", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, Dark BrownRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5262", + ["sources"] = { + }, + }, + [5309] = { + ["name"] = "Privateer Musket", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 20, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Privateer Musket\nBinds when picked upRangedGun12 - 24 DamageSpeed 2.30(7.8 damage per second)\nDurability 50 / 50", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5309", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [5346] = { + ["name"] = "Orcish Battle Bow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 2, + ["level"] = 14, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Orcish Battle Bow\nBinds when picked upRangedBow7 - 14 DamageSpeed 1.90(5.5 damage per second)\nDurability 40 / 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5346", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [5568] = { + ["name"] = "Smooth Pebble", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 18, + ["reqlevel"] = 13, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Smooth PebbleProjectileBulletAdds 4.0 damage per second\nRequires Level 13", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5568", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 21, + ["entries"] = { + { + ["id"] = 2156, + ["name"] = "Cracked Golem", + ["tag"] = "Engineering Supplies", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 2157, + ["name"] = "Stone Behemoth", + ["tag"] = "Engineering Supplies", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 6206, + ["name"] = "Caverndeep Burrower", + ["level"] = 19, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6207, + ["name"] = "Caverndeep Ambusher", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 6210, + ["name"] = "Caverndeep Pillager", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6211, + ["name"] = "Caverndeep Reaver", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6218, + ["name"] = "Irradiated Slime", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6220, + ["name"] = "Irradiated Horror", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6223, + ["name"] = "Leprous Defender", + ["level"] = 24, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6233, + ["name"] = "Mechanized Sentry", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6234, + ["name"] = "Mechanized Guardian", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6391, + ["name"] = "Holdout Warrior", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6392, + ["name"] = "Holdout Medic", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6407, + ["name"] = "Holdout Technician", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9676, + ["name"] = "Tink Sprocketwhistle", + ["level"] = 28, + ["classification"] = 0, + }, + { + ["id"] = 81028, + ["name"] = "Gizmax Leaprocket", + ["level"] = 29, + ["classification"] = 0, + }, + { + ["id"] = 6329, + ["name"] = "Irradiated Pillager", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6219, + ["name"] = "Corrosive Lurker", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6221, + ["name"] = "Addled Leper", + ["level"] = 28, + ["classification"] = 0, + }, + { + ["id"] = 11920, + ["name"] = "Goggeroc", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 60442, + ["name"] = "Bael Modan Golem", + ["level"] = 31, + ["classification"] = 0, + }, + }, + }, + }, + }, + [5596] = { + ["name"] = "Ashwood Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 1, + ["level"] = 11, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ashwood Bow\nBinds when picked upRangedBow5 - 11 DamageSpeed 2.10(3.8 damage per second)\nDurability 35 / 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5596", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [5748] = { + ["name"] = "Centaur Longbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 16, + ["reqlevel"] = 11, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Centaur Longbow\nBinds when equippedRangedBow9 - 18 DamageSpeed 2.20(6.1 damage per second)\nDurability 40 / 40\nRequires Level 11", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5748", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 80941, + ["name"] = "Earthcaller Jalyssa", + ["tag"] = "Gelkis Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + { + ["id"] = 80942, + ["name"] = "Deathcaller Aisha", + ["tag"] = "Magram Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [5817] = { + ["name"] = "Lunaris Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 2, + ["level"] = 30, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Lunaris Bow\nBinds when picked upRangedBow23 - 43 DamageSpeed 2.70(12.2 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=5817", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [6315] = { + ["name"] = "Steelarrow Crossbow", + ["icon"] = "INV_Weapon_Crossbow_01", + ["quality"] = 2, + ["level"] = 27, + ["reqlevel"] = 22, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Steelarrow Crossbow\nBinds when equippedRangedCrossbow29 - 45 DamageSpeed 3.40(10.9 damage per second)\nDurability 60 / 60\nRequires Level 22", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=6315", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 6523, + ["name"] = "Dark Iron Rifleman", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [6469] = { + ["name"] = "Venomstrike", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 3, + ["level"] = 24, + ["reqlevel"] = 19, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Venomstrike\nBinds when picked upRangedBow16 - 30 DamageSpeed 2.40(9.6 damage per second)\nDurability 65 / 65\nRequires Level 19\nEquip: Chance to strike your ranged target with a Venom Shot for 31 to 46 Nature damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=6469", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3673, + ["name"] = "Lord Serpentis", + ["tag"] = "Fanglord", + ["level"] = 21, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [6696] = { + ["name"] = "Nightstalker Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 3, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Nightstalker Bow\nBinds when picked upRangedBow19 - 36 DamageSpeed 1.70(16.2 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=6696", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 4425, + ["name"] = "Blind Hunter", + ["level"] = 32, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [6739] = { + ["name"] = "Cliffrunner's Aim", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 2, + ["level"] = 29, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Cliffrunner's Aim\nBinds when picked upRangedBow19 - 36 DamageSpeed 2.30(12.0 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=6739", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [6798] = { + ["name"] = "Blasting Hackbut", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 37, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Blasting Hackbut\nBinds when picked upRangedGun30 - 56 DamageSpeed 2.80(15.4 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=6798", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [7729] = { + ["name"] = "Chesterfall Musket", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Chesterfall Musket\nBinds when equippedRangedGun26 - 50 DamageSpeed 2.30(16.5 damage per second)\nDurability 75 / 75\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=7729", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 34, + ["entries"] = { + { + ["id"] = 4282, + ["name"] = "Scarlet Magician", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4283, + ["name"] = "Scarlet Sentry", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4285, + ["name"] = "Scarlet Disciple", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4286, + ["name"] = "Scarlet Soldier", + ["level"] = 31, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4287, + ["name"] = "Scarlet Gallant", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4288, + ["name"] = "Scarlet Beastmaster", + ["level"] = 31, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4290, + ["name"] = "Scarlet Guardsman", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4291, + ["name"] = "Scarlet Diviner", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4292, + ["name"] = "Scarlet Protector", + ["level"] = 33, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4294, + ["name"] = "Scarlet Sorcerer", + ["level"] = 34, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4295, + ["name"] = "Scarlet Myrmidon", + ["level"] = 34, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4296, + ["name"] = "Scarlet Adept", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4298, + ["name"] = "Scarlet Defender", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4299, + ["name"] = "Scarlet Chaplain", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4300, + ["name"] = "Scarlet Wizard", + ["level"] = 34, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4301, + ["name"] = "Scarlet Centurion", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4302, + ["name"] = "Scarlet Champion", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4303, + ["name"] = "Scarlet Abbot", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4306, + ["name"] = "Scarlet Torturer", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4308, + ["name"] = "Unfettered Spirit", + ["level"] = 38, + ["classification"] = 0, + }, + { + ["id"] = 4540, + ["name"] = "Scarlet Monk", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6426, + ["name"] = "Anguished Dead", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6427, + ["name"] = "Haunting Phantasm", + ["level"] = 33, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4304, + ["name"] = "Scarlet Tracking Hound", + ["level"] = 34, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4293, + ["name"] = "Scarlet Scryer", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61971, + ["name"] = "Scarlet Jailer", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62537, + ["name"] = "Stormreaver Battlemaster", + ["level"] = 34, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62645, + ["name"] = "Shadow Council Alchemist", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62651, + ["name"] = "Shadow Council Cultist", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62659, + ["name"] = "Shadow Council Torturer", + ["level"] = 39, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62647, + ["name"] = "Shadow Council Summoner", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62663, + ["name"] = "Sinister Interrogator", + ["level"] = 39, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62666, + ["name"] = "Brutish Felguard", + ["level"] = 39, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62669, + ["name"] = "Shadow Council Soulweaver", + ["level"] = 40, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [8067] = { + ["name"] = "Crafted Light Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 10, + ["reqlevel"] = 5, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Crafted Light ShotProjectileBulletAdds 2.0 damage per second\nRequires Level 5", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8067", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3920, + ["name"] = "@Crafted Light Shot", + }, + }, + }, + }, + }, + [8068] = { + ["name"] = "Crafted Heavy Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 20, + ["reqlevel"] = 15, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Crafted Heavy ShotProjectileBulletAdds 4.5 damage per second\nRequires Level 15", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8068", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3930, + ["name"] = "@Crafted Heavy Shot", + }, + }, + }, + }, + }, + [8069] = { + ["name"] = "Crafted Solid Shot", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 1, + ["level"] = 35, + ["reqlevel"] = 30, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Crafted Solid ShotProjectileBulletAdds 8.5 damage per second\nRequires Level 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8069", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 3947, + ["name"] = "@Crafted Solid Shot", + }, + }, + }, + }, + }, + [8179] = { + ["name"] = "Cadet's Bow", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 1, + ["level"] = 6, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Cadet's BowRangedBow3 - 6 DamageSpeed 2.00(2.3 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8179", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 124, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 106318, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2844, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2843, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [8180] = { + ["name"] = "Hunting Bow", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 2, + ["level"] = 11, + ["reqlevel"] = 6, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hunting Bow\nBinds when equippedRangedBow8 - 16 DamageSpeed 2.60(4.6 damage per second)\nDurability 35 / 35\nRequires Level 6", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8180", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 485, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 2039, + ["name"] = "Hidden Strongbox", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [8181] = { + ["name"] = "Hunting Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 1, + ["level"] = 9, + ["reqlevel"] = 4, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Hunting RifleRangedGun5 - 11 DamageSpeed 2.70(3.0 damage per second)\nDurability 30 / 30\nRequires Level 4", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8181", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 298, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 106318, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2844, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2843, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [8182] = { + ["name"] = "Pellet Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 1, + ["level"] = 7, + ["reqlevel"] = 2, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Pellet RifleRangedGun4 - 9 DamageSpeed 2.60(2.5 damage per second)\nDurability 30 / 30\nRequires Level 2", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8182", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 186, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 106318, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2844, + ["name"] = "Battered Chest", + }, + { + ["id"] = 2843, + ["name"] = "Battered Chest", + }, + }, + }, + }, + }, + [8183] = { + ["name"] = "Precision Bow", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 2, + ["level"] = 27, + ["reqlevel"] = 22, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Precision Bow\nBinds when equippedRangedBow20 - 37 DamageSpeed 2.60(11.0 damage per second)\nDurability 60 / 60\nRequires Level 22", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8183", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 556, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 18, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [8188] = { + ["name"] = "Explosive Shotgun", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 2, + ["level"] = 37, + ["reqlevel"] = 32, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Explosive Shotgun\nBinds when equippedRangedGun22 - 42 DamageSpeed 2.10(15.2 damage per second)\nDurability 65 / 65\nRequires Level 32", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=8188", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 715, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [9399] = { + ["name"] = "Precision Arrow", + ["icon"] = "INV_Ammo_Arrow_01", + ["quality"] = 2, + ["level"] = 40, + ["reqlevel"] = 35, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Precision ArrowProjectileArrowAdds 11.5 damage per second\nRequires Level 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9399", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 6906, + ["name"] = "Baelog", + ["level"] = 41, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9400] = { + ["name"] = "Baelog's Shortbow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 1, + ["level"] = 41, + ["reqlevel"] = 36, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Baelog's Shortbow\nBinds when picked upRangedBow29 - 55 DamageSpeed 2.30(18.3 damage per second)\n+3 Agility\nDurability 65 / 65\nRequires Level 36", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9400", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 6906, + ["name"] = "Baelog", + ["level"] = 41, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9412] = { + ["name"] = "Galgann's Fireblaster", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 3, + ["level"] = 47, + ["reqlevel"] = 42, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Galgann's Fireblaster\nBinds when picked upRangedGun44 - 84 DamageSpeed 2.60(24.6 damage per second)\nDurability 75 / 75\nRequires Level 42\nEquip: Chance to strike your ranged target with a Fire Blast for 12 to 19 Fire damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9412", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 7291, + ["name"] = "Galgann Firehammer", + ["level"] = 45, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9422] = { + ["name"] = "Shadowforge Bushmaster", + ["icon"] = "INV_Musket_02", + ["quality"] = 3, + ["level"] = 43, + ["reqlevel"] = 38, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Shadowforge Bushmaster\nBinds when equippedRangedGun46 - 86 DamageSpeed 2.90(22.8 damage per second)\n+7 Shadow Resistance\nDurability 75 / 75\nRequires Level 38", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9422", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 11, + ["entries"] = { + { + ["id"] = 4849, + ["name"] = "Shadowforge Archaeologist", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4853, + ["name"] = "Stonevault Geomancer", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4855, + ["name"] = "Stonevault Brawler", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4857, + ["name"] = "Stone Keeper", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4860, + ["name"] = "Stone Steward", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7012, + ["name"] = "Earthen Sculptor", + ["level"] = 44, + ["classification"] = 0, + }, + { + ["id"] = 7022, + ["name"] = "Venomlash Scorpid", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7290, + ["name"] = "Shadowforge Sharpshooter", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7320, + ["name"] = "Stonevault Mauler", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7321, + ["name"] = "Stonevault Flameweaver", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 60906, + ["name"] = "Kegdesh Foulmantle", + ["level"] = 42, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9426] = { + ["name"] = "Monolithic Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 3, + ["level"] = 41, + ["reqlevel"] = 36, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monolithic Bow\nBinds when equippedRangedBow41 - 77 DamageSpeed 2.70(21.9 damage per second)\n+6 Strength\n+3 Agility\nDurability 75 / 75\nRequires Level 36", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9426", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 14, + ["entries"] = { + { + ["id"] = 4848, + ["name"] = "Shadowforge Darkcaster", + ["tag"] = "Skardyn", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4850, + ["name"] = "Stonevault Cave Lurker", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4853, + ["name"] = "Stonevault Geomancer", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4855, + ["name"] = "Stonevault Brawler", + ["level"] = 39, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4857, + ["name"] = "Stone Keeper", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4860, + ["name"] = "Stone Steward", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4861, + ["name"] = "Shrike Bat", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4863, + ["name"] = "Jadespine Basilisk", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7022, + ["name"] = "Venomlash Scorpid", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7023, + ["name"] = "Obsidian Sentinel", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7320, + ["name"] = "Stonevault Mauler", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7321, + ["name"] = "Stonevault Flameweaver", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 4852, + ["name"] = "Stonevault Oracle", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62725, + ["name"] = "Thromrar Darkflame", + ["level"] = 39, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9456] = { + ["name"] = "Glass Shooter", + ["icon"] = "INV_Weapon_Rifle_02", + ["quality"] = 3, + ["level"] = 35, + ["reqlevel"] = 30, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Glass Shooter\nBinds when picked upRangedGun36 - 68 DamageSpeed 2.90(17.9 damage per second)\nDurability 75 / 75\nRequires Level 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9456", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 6228, + ["name"] = "Dark Iron Ambassador", + ["level"] = 33, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [9487] = { + ["name"] = "Hi-tech Supergun", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 29, + ["reqlevel"] = 24, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Hi-tech Supergun\nBinds when equippedRangedGun23 - 43 DamageSpeed 2.30(14.3 damage per second)\nDurability 75 / 75\nRequires Level 24", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=9487", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 17, + ["entries"] = { + { + ["id"] = 6206, + ["name"] = "Caverndeep Burrower", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6207, + ["name"] = "Caverndeep Ambusher", + ["level"] = 27, + ["classification"] = 0, + }, + { + ["id"] = 6208, + ["name"] = "Caverndeep Invader", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6211, + ["name"] = "Caverndeep Reaver", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6212, + ["name"] = "Dark Iron Agent", + ["level"] = 25, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6213, + ["name"] = "Irradiated Invader", + ["level"] = 26, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6220, + ["name"] = "Irradiated Horror", + ["level"] = 27, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6223, + ["name"] = "Leprous Defender", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6225, + ["name"] = "Mechano-Tank", + ["level"] = 32, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6226, + ["name"] = "Mechano-Flamewalker", + ["level"] = 33, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6227, + ["name"] = "Mechano-Frostwalker", + ["level"] = 24, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6230, + ["name"] = "Peacekeeper Security Suit", + ["level"] = 26, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6232, + ["name"] = "Arcane Nullifier X-21", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6233, + ["name"] = "Mechanized Sentry", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6234, + ["name"] = "Mechanized Guardian", + ["level"] = 28, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6231, + ["name"] = "Techbot", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 6329, + ["name"] = "Irradiated Pillager", + ["level"] = 29, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [10508] = { + ["name"] = "Mithril Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 41, + ["reqlevel"] = 36, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Mithril Blunderbuss\nBinds when equippedRangedGun36 - 68 DamageSpeed 2.90(17.9 damage per second)\n+5 Agility\nDurability 65 / 65\nRequires Level 36", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10508", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12595, + ["name"] = "@Mithril Blunderbuss", + }, + }, + }, + }, + }, + [10510] = { + ["name"] = "Mithril Heavy-bore Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 44, + ["reqlevel"] = 39, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Mithril Heavy-bore Rifle\nBinds when equippedRangedGun41 - 76 DamageSpeed 2.90(20.2 damage per second)\nDurability 65 / 65\nRequires Level 39\nEquip: +14 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10510", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12614, + ["name"] = "@Mithril Heavy-bore Rifle", + }, + }, + }, + }, + }, + [10512] = { + ["name"] = "Hi-Impact Mithril Slugs", + ["icon"] = "INV_Ammo_Bullet_01", + ["quality"] = 2, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Hi-Impact Mithril SlugsProjectileBulletAdds 12.5 damage per second\nRequires Level 37", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10512", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12596, + ["name"] = "@Hi-Impact Mithril Slugs", + }, + }, + }, + }, + }, + [10513] = { + ["name"] = "Mithril Gyro-Shot", + ["icon"] = "INV_Ammo_Bullet_01", + ["quality"] = 2, + ["level"] = 49, + ["reqlevel"] = 44, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Mithril Gyro-ShotProjectileBulletAdds 15.0 damage per second\nRequires Level 44", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10513", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12621, + ["name"] = "@Mithril Gyro-Shot", + }, + }, + }, + }, + }, + [10567] = { + ["name"] = "Quillshooter", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 3, + ["level"] = 38, + ["reqlevel"] = 33, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Quillshooter\nBinds when equippedRangedBow31 - 58 DamageSpeed 2.80(15.9 damage per second)\nDurability 75 / 75\nRequires Level 33\nEquip: Chance to strike your ranged target with a Quill Shot for 66 to 99 Nature damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10567", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 16, + ["entries"] = { + { + ["id"] = 7328, + ["name"] = "Withered Reaver", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7329, + ["name"] = "Withered Quilguard", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62678, + ["name"] = "Death's Head Battleguard", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7335, + ["name"] = "Death's Head Geomancer", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62676, + ["name"] = "Death's Head Worshipper", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62677, + ["name"] = "Death's Head Servitor", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7337, + ["name"] = "Death's Head Necromancer", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7341, + ["name"] = "Skeletal Frostweaver", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7342, + ["name"] = "Skeletal Summoner", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7345, + ["name"] = "Splinterbone Captain", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7347, + ["name"] = "Boneflayer Ghoul", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7348, + ["name"] = "Thorn Eater Ghoul", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7353, + ["name"] = "Freezing Spirit", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7332, + ["name"] = "Withered Spearhide", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7352, + ["name"] = "Frozen Soul", + ["level"] = 37, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 7349, + ["name"] = "Tomb Fiend", + ["level"] = 38, + ["classification"] = 0, + }, + }, + }, + }, + }, + [10579] = { + ["name"] = "Explosive Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 3, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Explosive ArrowProjectileArrowAdds 14.5 damage per second\nRequires Level 37", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10579", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12719, + ["name"] = "@Explosive Arrow", + }, + }, + }, + }, + }, + [10624] = { + ["name"] = "Stinging Bow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 47, + ["reqlevel"] = 42, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Stinging Bow\nBinds when equippedRangedBow36 - 67 DamageSpeed 2.10(24.5 damage per second)\n+3 Strength\nDurability 75 / 75\nRequires Level 42\nEquip: +14 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=10624", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 23, + ["entries"] = { + { + ["id"] = 5224, + ["name"] = "Murk Slitherer", + ["level"] = 45, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5226, + ["name"] = "Murk Worm", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5228, + ["name"] = "Saturated Ooze", + ["level"] = 47, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5243, + ["name"] = "Cursed Atal'ai", + ["level"] = 48, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5256, + ["name"] = "Atal'ai Warrior", + ["level"] = 47, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5259, + ["name"] = "Atal'ai Witch Doctor", + ["level"] = 48, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5263, + ["name"] = "Mummified Atal'ai", + ["level"] = 45, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5267, + ["name"] = "Unliving Atal'ai", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5269, + ["name"] = "Atal'ai Priest", + ["level"] = 48, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5271, + ["name"] = "Atal'ai Deathwalker", + ["level"] = 49, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5273, + ["name"] = "Atal'ai High Priest", + ["level"] = 48, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5277, + ["name"] = "Nightmare Scalebane", + ["level"] = 50, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5280, + ["name"] = "Nightmare Wyrmkin", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5291, + ["name"] = "Hakkari Frostwing", + ["level"] = 47, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5708, + ["name"] = "Spawn of Hakkar", + ["level"] = 48, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 8497, + ["name"] = "Nightmare Suppressor", + ["level"] = 49, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5283, + ["name"] = "Nightmare Wanderer", + ["level"] = 46, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5225, + ["name"] = "Murk Spitter", + ["level"] = 47, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5261, + ["name"] = "Enthralled Atal'ai", + ["level"] = 50, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5235, + ["name"] = "Fungal Ooze", + ["level"] = 51, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 5270, + ["name"] = "Atal'ai Corpse Eater", + ["level"] = 50, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 8438, + ["name"] = "Hakkari Bloodkeeper", + ["level"] = 51, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 8336, + ["name"] = "Hakkari Sapper", + ["level"] = 49, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [11021] = { + ["name"] = "Monster - Big Sniper Gun", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Big Sniper GunRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11021", + ["sources"] = { + }, + }, + [11284] = { + ["name"] = "Accurate Slugs", + ["icon"] = "INV_Ammo_Bullet_01", + ["quality"] = 1, + ["level"] = 45, + ["reqlevel"] = 40, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Accurate SlugsProjectileBulletAdds 13.0 damage per second\nRequires Level 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11284", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 89, + ["entries"] = { + { + ["id"] = 11184, + ["name"] = "Wixxrak", + ["tag"] = "Weaponsmith & Gunsmith", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 53, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 62403, + ["name"] = "Vohand Blundergate", + ["tag"] = "Gunsmith", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 33, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 4889, + ["name"] = "Torq Ironblast", + ["tag"] = "Gunsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 92217, + ["name"] = "Ticas Quirkfuzz", + ["tag"] = "Gun Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 3053, + ["name"] = "Synge", + ["tag"] = "Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "The Scourge", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Voodoo Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Shanty Awares", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Everyday Necessities", + ["level"] = 30, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "Gun Merchant", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "General Goods Vendor", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 4603, + ["name"] = "Nicholas Atwood", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Gunsmith", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 1461, + ["name"] = "Murndan Derth", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "General Goods", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "Ammunition", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "Bow & Gun Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "General Supplies", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 1297, + ["name"] = "Lina Stover", + ["tag"] = "Gunsmith", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Ammunition", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 61445, + ["name"] = "Krilee Stormshot", + ["tag"] = "General Goods", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "Guns and Ammo Merchant", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "General Goods", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 3322, + ["name"] = "Kaja", + ["tag"] = "Guns Merchant", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "General Goods", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "Unhappy Prisoner", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 3018, + ["name"] = "Hogor Thunderhoof", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "Hand of Wrath", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "General Supplies", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "General Supplies", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "Golden Moon", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods Vendor", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "Ammunition", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Goods", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "Camp Trader", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "Innkeeper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "General Goods", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "General Supplies", + ["level"] = 25, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "General Goods Vendor", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gun Merchant", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Gunsmith", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 5123, + ["name"] = "Bretta Goldfury", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 8131, + ["name"] = "Blizrik Buckshot", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "Blue Anchor Exports Trader", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 80008, + ["name"] = "Aubrey Merton", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 40, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11285] = { + ["name"] = "Jagged Arrow", + ["icon"] = "INV_Weapon_ShortBlade_25", + ["quality"] = 1, + ["level"] = 45, + ["reqlevel"] = 40, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Jagged ArrowProjectileArrowAdds 13.0 damage per second\nRequires Level 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11285", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 95, + ["entries"] = { + { + ["id"] = 9552, + ["name"] = "Zanara", + ["tag"] = "Bowyer", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 62148, + ["name"] = "Wisteria Gallagher", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 61115, + ["name"] = "Wezzy Coppersaw", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 2808, + ["name"] = "Vikki Lonsav", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 61651, + ["name"] = "Vi'cha Spirithowler", + ["tag"] = "Wolfskull Clan", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 1149, + ["name"] = "Uthok", + ["tag"] = "General Supplies", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60803, + ["name"] = "Tyrion Bouden", + ["tag"] = "The Blackwing Guard", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 12027, + ["name"] = "Tukk", + ["tag"] = "General Goods Vendor", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 3313, + ["name"] = "Trak'gen", + ["tag"] = "General Goods Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 80267, + ["name"] = "Torial Dawnrise", + ["tag"] = "General Goods", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 1285, + ["name"] = "Thurman Mullby", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 61478, + ["name"] = "Talavana Andalorah", + ["tag"] = "General Goods", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 12246, + ["name"] = "Super-Seller 680", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Bow Merchant", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 21002, + ["name"] = "Squire Boltfling", + ["tag"] = "The Scourge", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60653, + ["name"] = "Skeletal Blacksmith", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 61288, + ["name"] = "Savenna Mosscage", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3541, + ["name"] = "Sarah Raycroft", + ["tag"] = "Alchemy Supplies", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 61272, + ["name"] = "Samantha Stewards", + ["tag"] = "Ammunition Vendor", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 51656, + ["name"] = "Rug", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 17598, + ["name"] = "Renn'az", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3625, + ["name"] = "Rarck", + ["tag"] = "Voodoo Goods", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 80808, + ["name"] = "Ranor Riptusk", + ["tag"] = "Shanty Awares", + ["level"] = 48, + ["classification"] = 0, + }, + { + ["id"] = 91868, + ["name"] = "Primalist Gojo", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 36, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9320, + ["name"] = "Pipoca the Searunner", + ["tag"] = "Everyday Necessities", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 62739, + ["name"] = "Orthol the Tracker", + ["tag"] = "General Goods Vendor", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 62628, + ["name"] = "Nyxma Niftpatch", + ["tag"] = "General Goods", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 12959, + ["name"] = "Nergal", + ["tag"] = "General Goods", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 61523, + ["name"] = "Naytha Grovelight", + ["tag"] = "General Goods Vendor", + ["level"] = 1, + ["classification"] = 0, + }, + { + ["id"] = 62469, + ["name"] = "Navigator Weebletax", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 2084, + ["name"] = "Natheril Raincaller", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4241, + ["name"] = "Mydrannul", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "The Thorium Brotherhood", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62086, + ["name"] = "Meldor Swiftlance", + ["tag"] = "General Goods", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 60790, + ["name"] = "Mathilda Beckett", + ["tag"] = "Ammunition", + ["level"] = 36, + ["classification"] = 0, + }, + { + ["id"] = 14624, + ["name"] = "Master Smith Burninate", + ["tag"] = "Bow Merchant", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 2803, + ["name"] = "Malygen", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 62437, + ["name"] = "Maktha", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "General Supplies", + ["level"] = 45, + ["classification"] = 0, + }, + { + ["id"] = 8362, + ["name"] = "Kuruk", + ["tag"] = "General Goods", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Fletcher", + ["level"] = 14, + ["classification"] = 0, + }, + { + ["id"] = 92169, + ["name"] = "Kryillos", + ["tag"] = "Ammunition", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 91403, + ["name"] = "Kintello", + ["tag"] = "General Goods", + ["level"] = 46, + ["classification"] = 0, + }, + { + ["id"] = 789, + ["name"] = "Kimberly Hiett", + ["tag"] = "Metalsmith", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 62404, + ["name"] = "Kazand Blundergate", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2401, + ["name"] = "Kayren Soothallow", + ["tag"] = "Bow Merchant", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 62402, + ["name"] = "Kargun Mightfall", + ["tag"] = "Bowyer", + ["level"] = 3, + ["classification"] = 0, + }, + { + ["id"] = 5134, + ["name"] = "Jonivera Farmountain", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Superior Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "General Goods", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 8139, + ["name"] = "Jabbey", + ["tag"] = "Unhappy Prisoner", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 62436, + ["name"] = "Hagrekk", + ["tag"] = "General Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 60663, + ["name"] = "Grin Harold", + ["tag"] = "Hand of Wrath", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 2908, + ["name"] = "Grawl", + ["tag"] = "General Goods", + ["level"] = 43, + ["classification"] = 0, + }, + { + ["id"] = 2820, + ["name"] = "Graud", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 11555, + ["name"] = "Gorn One Eye", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 60641, + ["name"] = "Goma", + ["tag"] = "General Supplies", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 60766, + ["name"] = "Golsh", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 61440, + ["name"] = "Gnidabern Coilspinner", + ["tag"] = "General Supplies", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 62409, + ["name"] = "Gazla Blackforge", + ["tag"] = "Golden Moon", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 92177, + ["name"] = "Garto'ogg", + ["tag"] = "General Goods", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "General Goods Vendor", + ["level"] = 57, + ["classification"] = 0, + }, + { + ["id"] = 7942, + ["name"] = "Faralorn", + ["tag"] = "Provisions", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 60646, + ["name"] = "Evatax", + ["tag"] = "Fletcher", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 65002, + ["name"] = "Ethernos", + ["tag"] = "Ammunition", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 4170, + ["name"] = "Ellandrieth", + ["tag"] = "General Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 62462, + ["name"] = "Elindra Swiftluck", + ["tag"] = "General Goods", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 1462, + ["name"] = "Edwina Monzor", + ["tag"] = "Camp Trader", + ["level"] = 10, + ["classification"] = 0, + }, + { + ["id"] = 61443, + ["name"] = "Dimbil Stormshot", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 91956, + ["name"] = "Denia Hale", + ["tag"] = "Innkeeper", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 12021, + ["name"] = "Daeolyn Summerleaf", + ["tag"] = "General Goods", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 734, + ["name"] = "Corporal Bluth", + ["tag"] = "General Supplies", + ["level"] = 52, + ["classification"] = 0, + }, + { + ["id"] = 12960, + ["name"] = "Christi Galvanis", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 65003, + ["name"] = "Chradarmu", + ["tag"] = "The Argent Dawn", + ["level"] = 55, + ["classification"] = 0, + }, + { + ["id"] = 4896, + ["name"] = "Charity Mipsy", + ["tag"] = "Innkeeper", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 61812, + ["name"] = "Celia Daywing", + ["tag"] = "Heavy Armor Merchant", + ["level"] = 34, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "General Goods Vendor", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 11038, + ["name"] = "Caretaker Alen", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 15174, + ["name"] = "Calandrath", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 6028, + ["name"] = "Burkrum", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 5101, + ["name"] = "Bryllia Ironbrand", + ["tag"] = "Fletcher", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "General Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 92200, + ["name"] = "Bhatra", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 60456, + ["name"] = "Belgrush Daggerfist", + ["tag"] = "Bowyer", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 62307, + ["name"] = "Barbara Lee", + ["tag"] = "General Goods Vendor", + ["level"] = 40, + ["classification"] = 0, + }, + { + ["id"] = 2806, + ["name"] = "Bale", + ["tag"] = "General Goods", + ["level"] = 50, + ["classification"] = 0, + }, + { + ["id"] = 61140, + ["name"] = "Azmela Shadowcrest", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "General Goods", + ["level"] = 20, + ["classification"] = 0, + }, + { + ["id"] = 3350, + ["name"] = "Asoran", + ["tag"] = "Bow Merchant", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61563, + ["name"] = "Arayna Softwind", + ["level"] = 23, + ["classification"] = 0, + }, + { + ["id"] = 61369, + ["name"] = "Anati Gapper", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 62096, + ["name"] = "Aira Starsworn", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11303] = { + ["name"] = "Fine Shortbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 16, + ["reqlevel"] = 11, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Fine Shortbow\nBinds when equippedRangedBow7 - 14 DamageSpeed 1.70(6.2 damage per second)\nDurability 40 / 40\nRequires Level 11", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11303", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1198, + ["name"] = "Rallic Finn", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14846, + ["name"] = "Lhara", + ["tag"] = "Darkmoon Faire Exotic Goods", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 18, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3410, + ["name"] = "Jin'sora", + ["tag"] = "Bow Merchant", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11304] = { + ["name"] = "Fine Longbow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 19, + ["reqlevel"] = 14, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Fine Longbow\nBinds when equippedRangedBow14 - 26 DamageSpeed 2.70(7.4 damage per second)\nDurability 45 / 45\nRequires Level 14", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11304", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 1668, + ["name"] = "William MacGregor", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3534, + ["name"] = "Wallace the Blind", + ["tag"] = "Weaponsmith", + ["level"] = 15, + ["classification"] = 0, + }, + { + ["id"] = 3488, + ["name"] = "Uthrok", + ["tag"] = "Bowyer & Gunsmith", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 19, + ["classification"] = 0, + }, + { + ["id"] = 1459, + ["name"] = "Naela Trance", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 9553, + ["name"] = "Nadia Vernon", + ["tag"] = "Bowyer", + ["level"] = 16, + ["classification"] = 0, + }, + { + ["id"] = 1687, + ["name"] = "Cliff Hadin", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9549, + ["name"] = "Borand", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 228, + ["name"] = "Avette Fellwood", + ["tag"] = "Bowyer", + ["level"] = 25, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11305] = { + ["name"] = "Dense Shortbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 35, + ["reqlevel"] = 30, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Dense Shortbow\nBinds when equippedRangedBow19 - 35 DamageSpeed 1.90(14.2 damage per second)\nDurability 65 / 65\nRequires Level 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11305", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 7, + ["entries"] = { + { + ["id"] = 9551, + ["name"] = "Starn", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 9555, + ["name"] = "Mu'uta", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + { + ["id"] = 14846, + ["name"] = "Lhara", + ["tag"] = "Darkmoon Faire Exotic Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 4892, + ["name"] = "Jensen Farran", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 2839, + ["name"] = "Haren Kanmae", + ["tag"] = "Superior Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 14301, + ["name"] = "Brinna Valanaar", + ["tag"] = "Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3951, + ["name"] = "Bhaldaran Ravenshade", + ["tag"] = "Bowyer", + ["level"] = 37, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11306] = { + ["name"] = "Sturdy Recurve", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Sturdy Recurve\nBinds when equippedRangedBow20 - 37 DamageSpeed 2.20(13.0 damage per second)\nDurability 65 / 65\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11306", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 6, + ["entries"] = { + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 14846, + ["name"] = "Lhara", + ["tag"] = "Darkmoon Faire Exotic Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11307] = { + ["name"] = "Massive Longbow", + ["icon"] = "GenBow_twow3F", + ["quality"] = 2, + ["level"] = 47, + ["reqlevel"] = 42, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Massive Longbow\nBinds when equippedRangedBow43 - 80 DamageSpeed 2.80(22.0 damage per second)\nDurability 65 / 65\nRequires Level 42", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11307", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 5122, + ["name"] = "Skolmin Goldfury", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 3015, + ["name"] = "Kuna Thunderhorn", + ["tag"] = "Bowyer & Fletching Goods", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1298, + ["name"] = "Frederick Stover", + ["tag"] = "Bow & Arrow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4604, + ["name"] = "Abigail Sawyer", + ["tag"] = "Bow Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11308] = { + ["name"] = "Sylvan Shortbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 49, + ["reqlevel"] = 44, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Sylvan Shortbow\nBinds when equippedRangedBow32 - 59 DamageSpeed 2.00(22.8 damage per second)\nDurability 65 / 65\nRequires Level 44", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11308", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 12029, + ["name"] = "Narianna", + ["tag"] = "Bowyer", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 14846, + ["name"] = "Lhara", + ["tag"] = "Darkmoon Faire Exotic Goods", + ["level"] = 51, + ["classification"] = 0, + }, + { + ["id"] = 4173, + ["name"] = "Landria", + ["tag"] = "Bow Merchant", + ["level"] = 35, + ["classification"] = 0, + }, + { + ["id"] = 9548, + ["name"] = "Cawind Trueaim", + ["tag"] = "Gunsmith & Bowyer", + ["level"] = 35, + ["classification"] = 0, + }, + }, + }, + }, + }, + [11628] = { + ["name"] = "Houndmaster's Bow", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Houndmaster's Bow\nBinds when picked upRangedBow34 - 64 DamageSpeed 1.80(27.2 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 48\nEquip: Attack Power increased by 24 when fighting Beasts.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11628", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9319, + ["name"] = "Houndmaster Grebmar", + ["level"] = 52, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [11629] = { + ["name"] = "Houndmaster's Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Houndmaster's Rifle\nBinds when picked upRangedGun44 - 82 DamageSpeed 2.30(27.4 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 48\nEquip: Attack Power increased by 24 when fighting Beasts.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11629", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9319, + ["name"] = "Houndmaster Grebmar", + ["level"] = 52, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [11630] = { + ["name"] = "Rockshard Pellets", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 3, + ["level"] = 52, + ["reqlevel"] = 47, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Rockshard PelletsProjectileBulletAdds 18.0 damage per second\nRequires Level 47", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=11630", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9025, + ["name"] = "Lord Roccor", + ["level"] = 51, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [12446] = { + ["name"] = "Anvilmar Musket", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 1, + ["level"] = 5, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Anvilmar Musket\nBinds when picked upRangedGun4 - 8 DamageSpeed 2.70(2.2 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12446", + ["sources"] = { + }, + }, + [12447] = { + ["name"] = "Thistlewood Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 5, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Thistlewood Bow\nBinds when picked upRangedBow3 - 7 DamageSpeed 2.30(2.2 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12447", + ["sources"] = { + }, + }, + [12448] = { + ["name"] = "Light Hunting Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 1, + ["level"] = 5, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Light Hunting Rifle\nBinds when picked upRangedGun2 - 6 DamageSpeed 1.90(2.1 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12448", + ["sources"] = { + }, + }, + [12449] = { + ["name"] = "Primitive Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 5, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Primitive Bow\nBinds when picked upRangedBow4 - 8 DamageSpeed 2.70(2.2 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12449", + ["sources"] = { + }, + }, + [12523] = { + ["name"] = "Monster - Gun, Silver Musket", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, Silver MusketRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12523", + ["sources"] = { + }, + }, + [12651] = { + ["name"] = "Blackcrow", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 59, + ["reqlevel"] = 54, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Blackcrow\nBinds when picked upRangedCrossbow77 - 117 DamageSpeed 3.20(30.3 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 54\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12651", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9236, + ["name"] = "Shadow Hunter Vosh'gajin", + ["level"] = 58, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [12653] = { + ["name"] = "Riphook", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 59, + ["reqlevel"] = 54, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Riphook\nBinds when picked upRangedBow46 - 87 DamageSpeed 2.20(30.2 damage per second)\nDurability 75 / 75\nRequires Level 54\nEquip: +22 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12653", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9236, + ["name"] = "Shadow Hunter Vosh'gajin", + ["level"] = 58, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [12654] = { + ["name"] = "Doomshot", + ["icon"] = "Ability_Hunter_CriticalShot", + ["quality"] = 3, + ["level"] = 59, + ["reqlevel"] = 54, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "DoomshotProjectileArrowAdds 20.0 damage per second\nRequires Level 54", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=12654", + ["sources"] = { + }, + }, + [13019] = { + ["name"] = "Harpyclaw Short Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Harpyclaw Short Bow\nBinds when equippedRangedBow20 - 38 DamageSpeed 1.80(16.1 damage per second)\nDurability 75 / 75\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13019", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 442, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13020] = { + ["name"] = "Skystriker Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 39, + ["reqlevel"] = 34, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Skystriker Bow\nBinds when equippedRangedBow30 - 57 DamageSpeed 2.10(20.7 damage per second)\nDurability 75 / 75\nRequires Level 34", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13020", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 379, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13021] = { + ["name"] = "Needle Threader", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 47, + ["reqlevel"] = 42, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Needle Threader\nBinds when equippedRangedBow34 - 64 DamageSpeed 2.00(24.5 damage per second)\n+4 Spirit\n+6 Stamina\nDurability 75 / 75\nRequires Level 42", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13021", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 407, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + }, + }, + }, + }, + [13022] = { + ["name"] = "Gryphonwing Long Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 55, + ["reqlevel"] = 50, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Gryphonwing Long Bow\nBinds when equippedRangedBow53 - 100 DamageSpeed 2.70(28.3 damage per second)\n+8 Agility\n+4 Stamina\nDurability 75 / 75\nRequires Level 50", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13022", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 651, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 160836, + ["name"] = "Relic Coffer", + }, + }, + }, + }, + }, + [13023] = { + ["name"] = "Eaglehorn Long Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 63, + ["reqlevel"] = 58, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Eaglehorn Long Bow\nBinds when equippedRangedBow40 - 76 DamageSpeed 1.80(32.2 damage per second)\n+10 Agility\n+4 Stamina\nDurability 75 / 75\nRequires Level 58", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13023", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 316, + }, + }, + [13037] = { + ["name"] = "Crystalpine Stinger", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Crystalpine Stinger\nBinds when equippedRangedCrossbow35 - 54 DamageSpeed 2.80(15.9 damage per second)\nDurability 75 / 75\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13037", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 442, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 16, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 3703, + ["name"] = "Armor Crate", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13038] = { + ["name"] = "Swiftwind", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 40, + ["reqlevel"] = 35, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Swiftwind\nBinds when equippedRangedCrossbow34 - 51 DamageSpeed 2.00(21.3 damage per second)\n+7 Agility\nDurability 75 / 75\nRequires Level 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13038", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 350, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13039] = { + ["name"] = "Skull Splitting Crossbow", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 48, + ["reqlevel"] = 43, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Skull Splitting Crossbow\nBinds when equippedRangedCrossbow52 - 79 DamageSpeed 2.60(25.2 damage per second)\n+3 Strength\nDurability 75 / 75\nRequires Level 43\nEquip: +14 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13039", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 397, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + }, + }, + }, + }, + [13040] = { + ["name"] = "Heartseeking Crossbow", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 56, + ["reqlevel"] = 51, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Heartseeking Crossbow\nBinds when equippedRangedCrossbow71 - 108 DamageSpeed 3.10(28.9 damage per second)\n+9 Agility\n+4 Stamina\nDurability 75 / 75\nRequires Level 51\nEquip: Chance to strike your ranged target with a Shadowbolt for 13 to 20 Shadow damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13040", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 706, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13136] = { + ["name"] = "Lil Timmy's Peashooter", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Lil Timmy's Peashooter\nBinds when equippedRangedGun20 - 37 DamageSpeed 2.60(11.0 damage per second)\nDurability 60 / 60\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13136", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 243, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 19, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 106319, + ["name"] = "Battered Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13137] = { + ["name"] = "Ironweaver", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 34, + ["reqlevel"] = 29, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Ironweaver\nBinds when equippedRangedGun31 - 59 DamageSpeed 2.60(17.3 damage per second)\nDurability 75 / 75\nRequires Level 29", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13137", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 464, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13138] = { + ["name"] = "The Silencer", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "The Silencer\nBinds when equippedRangedGun43 - 82 DamageSpeed 2.80(22.3 damage per second)\nDurability 75 / 75\nRequires Level 37\nEquip: +14 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13138", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 353, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + }, + }, + }, + }, + [13139] = { + ["name"] = "Guttbuster", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 50, + ["reqlevel"] = 45, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Guttbuster\nBinds when equippedRangedGun49 - 92 DamageSpeed 2.70(26.1 damage per second)\n+8 Agility\n+3 Strength\nDurability 75 / 75\nRequires Level 45", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13139", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 497, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + }, + }, + }, + }, + [13146] = { + ["name"] = "Shell Launcher Shotgun", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 58, + ["reqlevel"] = 53, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Shell Launcher Shotgun\nBinds when equippedRangedGun48 - 89 DamageSpeed 2.30(29.8 damage per second)\nDurability 75 / 75\nRequires Level 53\nEquip: Chance to strike your ranged target with a Flaming Shell for 18 to 27 Fire damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13146", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 684, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [13147] = { + ["name"] = "Monster - Bow, White", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, WhiteRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13147", + ["sources"] = { + }, + }, + [13175] = { + ["name"] = "Voone's Twitchbow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 2, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Voone's Twitchbow\nBinds when picked upRangedBow31 - 58 DamageSpeed 1.60(27.8 damage per second)\nDurability 65 / 65\nRequires Level 55", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13175", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9237, + ["name"] = "War Master Voone", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [13248] = { + ["name"] = "Burstshot Harquebus", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 56, + ["reqlevel"] = 51, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Burstshot Harquebus\nBinds when picked upRangedGun52 - 98 DamageSpeed 2.60(28.8 damage per second)\n+8 Stamina\nDurability 75 / 75\nRequires Level 51\nEquip: +10 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13248", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 9046, + ["name"] = "Scarshield Quartermaster", + ["tag"] = "Scarshield Legion", + ["level"] = 55, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [13377] = { + ["name"] = "Miniature Cannon Balls", + ["icon"] = "INV_Ammo_Bullet_02", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Miniature Cannon BallsProjectileBulletAdds 20.5 damage per second\nRequires Level 56", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13377", + ["sources"] = { + }, + }, + [13380] = { + ["name"] = "Willey's Portable Howitzer", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Willey's Portable Howitzer\nBinds when picked upRangedGun63 - 118 DamageSpeed 2.90(31.2 damage per second)\n+9 Stamina\nDurability 75 / 75\nRequires Level 56\nEquip: +8 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13380", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 10997, + ["name"] = "Cannon Master Willey", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 10997, + ["name"] = "Cannon Master Willey", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [13474] = { + ["name"] = "Farmer Dalson's Shotgun", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 56, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Farmer Dalson's Shotgun\nBinds when picked upRangedGun34 - 64 DamageSpeed 1.90(25.8 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13474", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [13824] = { + ["name"] = "Recurve Long Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 0, + ["level"] = 55, + ["reqlevel"] = 45, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Recurve Long BowRangedBow26 - 50 DamageSpeed 2.50(15.2 damage per second)\nDurability 65 / 65\nRequires Level 45", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13824", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 1422, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 5, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 176224, + ["name"] = "Supply Crate", + }, + }, + }, + }, + }, + [13825] = { + ["name"] = "Primed Musket", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 0, + ["level"] = 57, + ["reqlevel"] = 52, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Primed MusketRangedGun20 - 37 DamageSpeed 1.80(15.8 damage per second)\nDurability 65 / 65\nRequires Level 52", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13825", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 1053, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 176224, + ["name"] = "Supply Crate", + }, + }, + }, + }, + }, + [13923] = { + ["name"] = "Monster - Gun, Tauren Blade Silver", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, Tauren Blade SilverRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13923", + ["sources"] = { + }, + }, + [13924] = { + ["name"] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, Tauren Scope Blade Feathered Silver DeluxeRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=13924", + ["sources"] = { + }, + }, + [14105] = { + ["name"] = "Monster - Bow, C01/B02 White", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, C01/B02 WhiteRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=14105", + ["sources"] = { + }, + }, + [14118] = { + ["name"] = "Monster - Bow, C02/B02 Black", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, C02/B02 BlackRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=14118", + ["sources"] = { + }, + }, + [14394] = { + ["name"] = "Durability Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Durability BowRangedBow1 - 3 DamageSpeed 1.80(1.1 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=14394", + ["sources"] = { + }, + }, + [14642] = { + ["name"] = "Monster - Gun, Tauren Feathers Silver", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, Tauren Feathers SilverRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=14642", + ["sources"] = { + }, + }, + [15205] = { + ["name"] = "Owlsight Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 20, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Owlsight Rifle\nBinds when picked upRangedGun14 - 27 DamageSpeed 2.60(7.9 damage per second)\nDurability 50 / 50", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15205", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [15284] = { + ["name"] = "Long Battle Bow", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 2, + ["level"] = 29, + ["reqlevel"] = 24, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Long Battle Bow\nBinds when equippedRangedBow18 - 34 DamageSpeed 2.20(11.8 damage per second)\nDurability 65 / 65\nRequires Level 24", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15284", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 597, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 18, + ["entries"] = { + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 74447, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 74448, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75295, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75298, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2849, + ["name"] = "Battered Chest", + }, + { + ["id"] = 111095, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15285] = { + ["name"] = "Archer's Longbow", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 2, + ["level"] = 32, + ["reqlevel"] = 27, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Archer's Longbow\nBinds when equippedRangedBow23 - 44 DamageSpeed 2.60(12.9 damage per second)\nDurability 65 / 65\nRequires Level 27", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15285", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 549, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15286] = { + ["name"] = "Long Redwood Bow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 2, + ["level"] = 35, + ["reqlevel"] = 30, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Long Redwood Bow\nBinds when equippedRangedBow28 - 52 DamageSpeed 2.80(14.3 damage per second)\nDurability 65 / 65\nRequires Level 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15286", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 621, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 15, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 75297, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75300, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 75296, + ["name"] = "Large Iron Bound Chest", + }, + { + ["id"] = 75299, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2852, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4095, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 4096, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15287] = { + ["name"] = "Crusader Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 45, + ["reqlevel"] = 40, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Crusader Bow\nBinds when equippedRangedBow32 - 60 DamageSpeed 2.20(20.9 damage per second)\nDurability 65 / 65\nRequires Level 40\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15287", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 636, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 12, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 142184, + ["name"] = "Captain's Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + }, + }, + }, + }, + [15288] = { + ["name"] = "Blasthorn Bow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Blasthorn Bow\nBinds when equippedRangedBow51 - 96 DamageSpeed 2.60(28.3 damage per second)\nDurability 65 / 65\nRequires Level 56\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15288", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 533, + }, + }, + [15289] = { + ["name"] = "Archstrike Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 2, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Archstrike Bow\nBinds when equippedRangedBow48 - 91 DamageSpeed 2.30(30.2 damage per second)\nDurability 65 / 65\nRequires Level 60\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15289", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 232, + }, + }, + [15291] = { + ["name"] = "Harpy Needler", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 2, + ["level"] = 51, + ["reqlevel"] = 46, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Harpy Needler\nBinds when equippedRangedBow44 - 84 DamageSpeed 2.70(23.7 damage per second)\nDurability 65 / 65\nRequires Level 46\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15291", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 695, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 179697, + ["name"] = "Arena Treasure Chest", + }, + }, + }, + }, + }, + [15294] = { + ["name"] = "Siege Bow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 2, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Siege Bow\nBinds when equippedRangedBow48 - 90 DamageSpeed 2.80(24.6 damage per second)\nDurability 65 / 65\nRequires Level 48\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15294", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 748, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15295] = { + ["name"] = "Quillfire Bow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 2, + ["level"] = 55, + ["reqlevel"] = 50, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Quillfire Bow\nBinds when equippedRangedBow41 - 77 DamageSpeed 2.30(25.7 damage per second)\nDurability 65 / 65\nRequires Level 50\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15295", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 930, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 179697, + ["name"] = "Arena Treasure Chest", + }, + }, + }, + }, + }, + [15296] = { + ["name"] = "Hawkeye Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 2, + ["level"] = 63, + ["reqlevel"] = 58, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hawkeye Bow\nBinds when equippedRangedBow35 - 65 DamageSpeed 1.70(29.4 damage per second)\nDurability 65 / 65\nRequires Level 58\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15296", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 601, + }, + }, + [15322] = { + ["name"] = "Smoothbore Gun", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 39, + ["reqlevel"] = 34, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Smoothbore Gun\nBinds when equippedRangedGun29 - 54 DamageSpeed 2.50(16.6 damage per second)\nDurability 65 / 65\nRequires Level 34", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15322", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 573, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 2857, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105581, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 2855, + ["name"] = "Solid Chest", + }, + { + ["id"] = 105570, + ["name"] = "Alliance Strongbox", + }, + { + ["id"] = 105578, + ["name"] = "Horde Chest", + }, + { + ["id"] = 105579, + ["name"] = "Alliance Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15323] = { + ["name"] = "Percussion Shotgun", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 50, + ["reqlevel"] = 45, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Percussion Shotgun\nBinds when equippedRangedGun37 - 70 DamageSpeed 2.30(23.3 damage per second)\nDurability 65 / 65\nRequires Level 45\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15323", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 695, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 5, + ["entries"] = { + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153451, + ["name"] = "Solid Chest", + }, + { + ["id"] = 4149, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + }, + }, + }, + }, + [15324] = { + ["name"] = "Burnside Rifle", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 56, + ["reqlevel"] = 51, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Burnside Rifle\nBinds when equippedRangedGun45 - 85 DamageSpeed 2.50(26.0 damage per second)\nDurability 65 / 65\nRequires Level 51\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15324", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 909, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 9, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 160845, + ["name"] = "Dark Coffer", + }, + { + ["id"] = 176224, + ["name"] = "Supply Crate", + }, + }, + }, + }, + }, + [15325] = { + ["name"] = "Sharpshooter Harquebus", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 2, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Sharpshooter Harquebus\nBinds when equippedRangedGun43 - 80 DamageSpeed 2.20(28.0 damage per second)\nDurability 65 / 65\nRequires Level 55\nRandom Bonuses", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15325", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 547, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 8, + ["entries"] = { + { + ["id"] = 153469, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153464, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153463, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 153468, + ["name"] = "Large Mithril Bound Chest", + }, + { + ["id"] = 153454, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153453, + ["name"] = "Solid Chest", + }, + { + ["id"] = 153462, + ["name"] = "Large Solid Chest", + }, + { + ["id"] = 160845, + ["name"] = "Dark Coffer", + }, + }, + }, + }, + }, + [15460] = { + ["name"] = "Monster - Gun, Shotgun", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, ShotgunRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15460", + ["sources"] = { + }, + }, + [15691] = { + ["name"] = "Sidegunner Shottie", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 38, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Sidegunner Shottie\nBinds when picked upRangedGun32 - 61 DamageSpeed 2.90(16.0 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15691", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [15807] = { + ["name"] = "Light Crossbow", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 1, + ["level"] = 8, + ["reqlevel"] = 3, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Light CrossbowRangedCrossbow6 - 7 DamageSpeed 2.50(2.6 damage per second)\nDurability 30 / 30\nRequires Level 3", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15807", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Bowyer", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [15808] = { + ["name"] = "Fine Light Crossbow", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 1, + ["level"] = 21, + ["reqlevel"] = 16, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Fine Light CrossbowRangedCrossbow20 - 20 DamageSpeed 2.70(7.4 damage per second)\nDurability 50 / 50\nRequires Level 16", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15808", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [15809] = { + ["name"] = "Heavy Crossbow", + ["icon"] = "INV_Weapon_Crossbow_03", + ["quality"] = 1, + ["level"] = 34, + ["reqlevel"] = 29, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Heavy CrossbowRangedCrossbow36 - 37 DamageSpeed 2.80(13.0 damage per second)\nDurability 65 / 65\nRequires Level 29", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15809", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 7976, + ["name"] = "Thalgus Thunderfist", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 1287, + ["name"] = "Marda Weller", + ["tag"] = "Weapons Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + { + ["id"] = 4602, + ["name"] = "Benijah Fenner", + ["tag"] = "Weapon Merchant", + ["level"] = 30, + ["classification"] = 0, + }, + }, + }, + }, + }, + [15995] = { + ["name"] = "Thorium Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 52, + ["reqlevel"] = 47, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Thorium Rifle\nBinds when equippedRangedGun42 - 79 DamageSpeed 2.50(24.2 damage per second)\nDurability 65 / 65\nRequires Level 47\nEquip: +17 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15995", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 19792, + ["name"] = "@Thorium Rifle", + }, + }, + }, + }, + }, + [15997] = { + ["name"] = "Thorium Shells", + ["icon"] = "INV_Ammo_Bullet_03", + ["quality"] = 2, + ["level"] = 57, + ["reqlevel"] = 52, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Thorium ShellsProjectileBulletAdds 17.5 damage per second\nRequires Level 52", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=15997", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 19800, + ["name"] = "@Thorium Shells", + }, + }, + }, + }, + }, + [16004] = { + ["name"] = "Dark Iron Rifle", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 3, + ["level"] = 55, + ["reqlevel"] = 50, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Dark Iron Rifle\nBinds when equippedRangedGun70 - 106 DamageSpeed 3.10(28.4 damage per second)\nDurability 75 / 75\nRequires Level 50\nEquip: Chance to strike your ranged target with Shadow Shot for 18 to 27 Shadow damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=16004", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 19796, + ["name"] = "@Dark Iron Rifle", + }, + }, + }, + }, + }, + [16007] = { + ["name"] = "Flawless Arcanite Rifle", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Flawless Arcanite Rifle\nBinds when equippedRangedGun68 - 126 DamageSpeed 3.10(31.3 damage per second)\nDurability 75 / 75\nRequires Level 56\nEquip: Increased Guns +4.\nEquip: +10 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=16007", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 19833, + ["name"] = "@Flawless Arcanite Rifle", + }, + }, + }, + }, + }, + [16622] = { + ["name"] = "Thornflinger", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 2, + ["level"] = 57, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Thornflinger\nBinds when picked upRangedBow52 - 97 DamageSpeed 2.80(26.6 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=16622", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [16992] = { + ["name"] = "Smokey's Explosive Launcher", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 2, + ["level"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Smokey's Explosive Launcher\nBinds when picked upRangedGun52 - 98 DamageSpeed 2.70(27.8 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=16992", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [16996] = { + ["name"] = "Gorewood Bow", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 3, + ["level"] = 62, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Gorewood Bow\nBinds when picked upRangedBow55 - 104 DamageSpeed 2.50(31.8 damage per second)\n+9 Stamina\n+3 Agility\n+2 Strength\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=16996", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [17042] = { + ["name"] = "Nail Spitter", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 2, + ["level"] = 36, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Nail Spitter\nBinds when picked upRangedGun19 - 37 DamageSpeed 1.90(14.7 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17042", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [17069] = { + ["name"] = "Striker's Mark", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 4, + ["level"] = 69, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Striker's Mark\nBinds when picked upRangedBow69 - 129 DamageSpeed 2.50(39.6 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: +22 Attack Power.\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17069", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 11982, + ["name"] = "Magmadar", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [17072] = { + ["name"] = "Blastershot Launcher", + ["icon"] = "INV_Weapon_Rifle_09", + ["quality"] = 4, + ["level"] = 70, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Blastershot Launcher\nBinds when picked upRangedGun73 - 136 DamageSpeed 2.60(40.2 damage per second)\n+6 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17072", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 11988, + ["name"] = "Golemagg the Incinerator", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [17686] = { + ["name"] = "Master Hunter's Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 2, + ["level"] = 43, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Master Hunter's Bow\nBinds when picked upRangedBow32 - 61 DamageSpeed 2.40(19.4 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17686", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [17687] = { + ["name"] = "Master Hunter's Rifle", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 43, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Master Hunter's Rifle\nBinds when picked upRangedGun35 - 66 DamageSpeed 2.60(19.4 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17687", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [17717] = { + ["name"] = "Megashot Rifle", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Megashot Rifle\nBinds when picked upRangedGun32 - 61 DamageSpeed 1.70(27.4 damage per second)\n+5 Arcane Resistance\nDurability 75 / 75\nRequires Level 48\nEquip: +19 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17717", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 13601, + ["name"] = "Tinkerer Gizlock", + ["level"] = 50, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [17753] = { + ["name"] = "Verdant Keeper's Aim", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 3, + ["level"] = 53, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Verdant Keeper's Aim\nBinds when picked upRangedBow53 - 100 DamageSpeed 2.80(27.3 damage per second)\nDurability 75 / 75\nEquip: Chance to strike your ranged target with Keeper's Sting for 15 to 22 Nature damage.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=17753", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [18042] = { + ["name"] = "Thorium Headed Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 2, + ["level"] = 57, + ["reqlevel"] = 52, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Thorium Headed ArrowProjectileArrowAdds 17.5 damage per second\nRequires Level 52", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18042", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [18282] = { + ["name"] = "Core Marksman Rifle", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 4, + ["level"] = 66, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Core Marksman Rifle\nBinds when equippedRangedGun91 - 149 DamageSpeed 3.20(37.5 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: +24 ranged Attack Power.\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18282", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 22795, + ["name"] = "@Core Marksman Rifle", + }, + }, + }, + }, + }, + [18323] = { + ["name"] = "Satyr's Bow", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 3, + ["level"] = 58, + ["reqlevel"] = 53, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Satyr's Bow\nBinds when picked upRangedBow50 - 93 DamageSpeed 2.40(29.8 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 53\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18323", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 11490, + ["name"] = "Zevrim Thornhoof", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18388] = { + ["name"] = "Stoneshatter", + ["icon"] = "INV_Weapon_Crossbow_08", + ["quality"] = 3, + ["level"] = 62, + ["reqlevel"] = 57, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Stoneshatter\nBinds when picked upRangedCrossbow73 - 111 DamageSpeed 2.90(31.7 damage per second)\nDurability 75 / 75\nRequires Level 57\nEquip: Increased Crossbows +4.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18388", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 11486, + ["name"] = "Prince Tortheldrin", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 11486, + ["name"] = "Prince Tortheldrin", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18460] = { + ["name"] = "Unsophisticated Hand Cannon", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 2, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Unsophisticated Hand Cannon\nBinds when picked upRangedGun48 - 91 DamageSpeed 2.50(27.8 damage per second)\n+8 Strength\nDurability 65 / 65\nRequires Level 55", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18460", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 3, + ["entries"] = { + { + ["id"] = 14321, + ["name"] = "Guard Fengus", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 14326, + ["name"] = "Guard Mol'dar", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 14323, + ["name"] = "Guard Slip'kik", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18482] = { + ["name"] = "Ogre Toothpick Shooter", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 2, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ogre Toothpick Shooter\nBinds when picked upRangedBow61 - 62 DamageSpeed 2.20(28.0 damage per second)\n+6 Agility\n+5 Stamina\nDurability 65 / 65\nRequires Level 55", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18482", + ["sources"] = { + }, + }, + [18680] = { + ["name"] = "Ancient Bone Bow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ancient Bone Bow\nBinds when picked upRangedBow61 - 114 DamageSpeed 2.80(31.3 damage per second)\n+11 Agility\nDurability 75 / 75\nRequires Level 56", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18680", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 6, + ["entries"] = { + { + ["id"] = 10504, + ["name"] = "Lord Alexei Barov", + ["tag"] = "The Butcher", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 11261, + ["name"] = "Doctor Theolen Krastinov", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 10505, + ["name"] = "Instructor Malicia", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 10502, + ["name"] = "Lady Illucia Barov", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 10507, + ["name"] = "The Ravenian", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 10901, + ["name"] = "Lorekeeper Polkelt", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18713] = { + ["name"] = "Rhok'delar, Longbow of the Ancient Keepers", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 4, + ["level"] = 75, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Rhok'delar, Longbow of the Ancient Keepers\nBinds when picked up\nUniqueRangedBow89 - 166 DamageSpeed 2.90(44.0 damage per second)\nDurability 90 / 90\nClasses: Hunter\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.\nEquip: +17 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18713", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 23192, + ["name"] = "@Forming Rhok'delar", + }, + { + ["id"] = 24873, + ["name"] = "@Create Hunter Epic Bow DND", + }, + }, + }, + }, + }, + [18729] = { + ["name"] = "Screeching Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 3, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Screeching Bow\nBinds when picked upRangedBow70 - 71 DamageSpeed 2.30(30.7 damage per second)\n+3 Stamina\n+10 Shadow Resistance\nDurability 75 / 75\nRequires Level 55", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18729", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 10436, + ["name"] = "Baroness Anastari", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18738] = { + ["name"] = "Carapace Spine Crossbow", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Carapace Spine Crossbow\nBinds when picked upRangedCrossbow82 - 124 DamageSpeed 3.30(31.2 damage per second)\n+9 Stamina\n+4 Agility\nDurability 75 / 75\nRequires Level 56", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18738", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 10437, + ["name"] = "Nerub'enkan", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18755] = { + ["name"] = "Xorothian Firestick", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 3, + ["level"] = 62, + ["reqlevel"] = 57, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Xorothian Firestick\nBinds when picked upRangedGun57 - 108 DamageSpeed 2.60(31.7 damage per second)\n+6 Stamina\n+4 Agility\n+6 Shadow Resistance\nDurability 75 / 75\nRequires Level 57", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18755", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14506, + ["name"] = "Lord Hel'nurath", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [18833] = { + ["name"] = "Grand Marshal's Bullseye", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Grand Marshal's Bullseye\nBinds when picked upRangedBow74 - 109 DamageSpeed 1.80(50.8 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18833", + ["sources"] = { + }, + }, + [18835] = { + ["name"] = "High Warlord's Recurve", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "High Warlord's Recurve\nBinds when picked upRangedBow74 - 109 DamageSpeed 1.80(50.8 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18835", + ["sources"] = { + }, + }, + [18836] = { + ["name"] = "Grand Marshal's Repeater", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Grand Marshal's Repeater\nBinds when picked upRangedCrossbow120 - 175 DamageSpeed 2.90(50.9 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18836", + ["sources"] = { + }, + }, + [18837] = { + ["name"] = "High Warlord's Crossbow", + ["icon"] = "INV_Weapon_Crossbow_10", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "High Warlord's Crossbow\nBinds when picked upRangedCrossbow120 - 175 DamageSpeed 2.90(50.9 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18837", + ["sources"] = { + }, + }, + [18855] = { + ["name"] = "Grand Marshal's Hand Cannon", + ["icon"] = "INV_Weapon_Rifle_08", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Grand Marshal's Hand Cannon\nBinds when picked upRangedGun120 - 175 DamageSpeed 2.90(50.9 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18855", + ["sources"] = { + }, + }, + [18860] = { + ["name"] = "High Warlord's Street Sweeper", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "High Warlord's Street Sweeper\nBinds when picked upRangedGun120 - 175 DamageSpeed 2.90(50.9 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +41 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=18860", + ["sources"] = { + }, + }, + [19082] = { + ["name"] = "Monster - Fire Arrow", + ["icon"] = "INV_Ammo_Arrow_02", + ["quality"] = 1, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Monster - Fire ArrowProjectileArrowAdds 1.0 damage per second", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19082", + ["sources"] = { + }, + }, + [19107] = { + ["name"] = "Bloodseeker", + ["icon"] = "INV_Weapon_Crossbow_07", + ["quality"] = 3, + ["level"] = 63, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Bloodseeker\nBinds when picked upRangedCrossbow85 - 128 DamageSpeed 3.30(32.3 damage per second)\n+7 Agility\n+8 Strength\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19107", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [19114] = { + ["name"] = "Highland Bow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 2, + ["level"] = 51, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Highland Bow\nBinds when picked upRangedBow41 - 77 DamageSpeed 2.50(23.6 damage per second)\n+5 Agility\n+4 Stamina\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19114", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [19316] = { + ["name"] = "Ice Threaded Arrow", + ["icon"] = "Spell_Frost_IceShard", + ["quality"] = 2, + ["level"] = 54, + ["reqlevel"] = 51, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Ice Threaded Arrow\nBinds when picked upProjectileArrowAdds 16.5 damage per second\nRequires Level 51", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19316", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 13217, + ["name"] = "Thanthaldis Snowgleam", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13219, + ["name"] = "Jekyll Flandring", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13218, + ["name"] = "Grunnda Wolfheart", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13216, + ["name"] = "Gaelden Hammersmith", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19317] = { + ["name"] = "Ice Threaded Bullet", + ["icon"] = "Spell_Frost_FrostBlast", + ["quality"] = 2, + ["level"] = 54, + ["reqlevel"] = 51, + ["subtype"] = "projectile", + ["description"] = "", + ["tooltip"] = "Ice Threaded Bullet\nBinds when picked upProjectileBulletAdds 16.5 damage per second\nRequires Level 51", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19317", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 4, + ["entries"] = { + { + ["id"] = 13217, + ["name"] = "Thanthaldis Snowgleam", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13219, + ["name"] = "Jekyll Flandring", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13218, + ["name"] = "Grunnda Wolfheart", + ["tag"] = "Frostwolf Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 13216, + ["name"] = "Gaelden Hammersmith", + ["tag"] = "Stormpike Supply Officer", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19350] = { + ["name"] = "Heartstriker", + ["icon"] = "INV_Weapon_Bow_09", + ["quality"] = 4, + ["level"] = 75, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Heartstriker\nBinds when picked upRangedBow80 - 149 DamageSpeed 2.60(44.0 damage per second)\n+9 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +24 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19350", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12017, + ["name"] = "Broodlord Lashlayer", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19361] = { + ["name"] = "Ashjre'thul, Crossbow of Smiting", + ["icon"] = "INV_Weapon_Crossbow_09", + ["quality"] = 4, + ["level"] = 77, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Ashjre'thul, Crossbow of Smiting\nBinds when picked upRangedCrossbow124 - 186 DamageSpeed 3.40(45.6 damage per second)\n+7 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +36 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19361", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14020, + ["name"] = "Chromaggus", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19368] = { + ["name"] = "Dragonbreath Hand Cannon", + ["icon"] = "INV_Weapon_Rifle_02", + ["quality"] = 4, + ["level"] = 75, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Dragonbreath Hand Cannon\nBinds when picked upRangedGun99 - 173 DamageSpeed 3.10(43.9 damage per second)\n+14 Agility\n+7 Stamina\nDurability 90 / 90\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19368", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14601, + ["name"] = "Ebonroc", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19558] = { + ["name"] = "Outrider's Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 3, + ["level"] = 71, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrider's Bow\nBinds when picked upRangedBow62 - 114 DamageSpeed 2.40(36.7 damage per second)\n+11 Stamina\n+5 Agility\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19558", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14754, + ["name"] = "Kelm Hargunth", + ["tag"] = "Warsong Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19559] = { + ["name"] = "Outrider's Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrider's Bow\nBinds when picked upRangedBow46 - 86 DamageSpeed 2.40(27.5 damage per second)\n+8 Stamina\n+3 Agility\nDurability 75 / 75\nRequires Level 48", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19559", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14754, + ["name"] = "Kelm Hargunth", + ["tag"] = "Warsong Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19560] = { + ["name"] = "Outrider's Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 3, + ["level"] = 43, + ["reqlevel"] = 38, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrider's Bow\nBinds when picked upRangedBow38 - 71 DamageSpeed 2.40(22.7 damage per second)\n+6 Stamina\n+3 Agility\nDurability 75 / 75\nRequires Level 38", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19560", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14754, + ["name"] = "Kelm Hargunth", + ["tag"] = "Warsong Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19561] = { + ["name"] = "Outrider's Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 3, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrider's Bow\nBinds when picked upRangedBow28 - 52 DamageSpeed 2.40(16.7 damage per second)\nDurability 75 / 75\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19561", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14754, + ["name"] = "Kelm Hargunth", + ["tag"] = "Warsong Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19562] = { + ["name"] = "Outrunner's Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 71, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrunner's Bow\nBinds when picked upRangedBow62 - 114 DamageSpeed 2.40(36.7 damage per second)\n+11 Stamina\n+5 Agility\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19562", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14753, + ["name"] = "Illiyana Moonblaze", + ["tag"] = "Silverwing Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19563] = { + ["name"] = "Outrunner's Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrunner's Bow\nBinds when picked upRangedBow46 - 86 DamageSpeed 2.40(27.5 damage per second)\n+8 Stamina\n+3 Agility\nDurability 75 / 75\nRequires Level 48", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19563", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14753, + ["name"] = "Illiyana Moonblaze", + ["tag"] = "Silverwing Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19564] = { + ["name"] = "Outrunner's Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 43, + ["reqlevel"] = 38, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrunner's Bow\nBinds when picked upRangedBow38 - 71 DamageSpeed 2.40(22.7 damage per second)\n+6 Stamina\n+3 Agility\nDurability 75 / 75\nRequires Level 38", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19564", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14753, + ["name"] = "Illiyana Moonblaze", + ["tag"] = "Silverwing Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19565] = { + ["name"] = "Outrunner's Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrunner's Bow\nBinds when picked upRangedBow28 - 52 DamageSpeed 2.40(16.7 damage per second)\nDurability 75 / 75\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19565", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14753, + ["name"] = "Illiyana Moonblaze", + ["tag"] = "Silverwing Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19853] = { + ["name"] = "Gurubashi Dwarf Destroyer", + ["icon"] = "INV_Weapon_Rifle_10", + ["quality"] = 4, + ["level"] = 68, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Gurubashi Dwarf Destroyer\nBinds when picked up\nUniqueRangedGun76 - 142 DamageSpeed 2.80(38.9 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: +30 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19853", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14834, + ["name"] = "Hakkar", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [19993] = { + ["name"] = "Hoodoo Hunting Bow", + ["icon"] = "INV_Waepon_Bow_ZulGrub_D_02", + ["quality"] = 3, + ["level"] = 68, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Hoodoo Hunting Bow\nBinds when picked upRangedBow68 - 128 DamageSpeed 2.80(35.0 damage per second)\n+10 Agility\n+4 Stamina\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=19993", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15085, + ["name"] = "Wushoolay", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20038] = { + ["name"] = "Mandokir's Sting", + ["icon"] = "INV_Waepon_Bow_ZulGrub_D_01", + ["quality"] = 4, + ["level"] = 66, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Mandokir's Sting\nBinds when picked upRangedBow68 - 127 DamageSpeed 2.60(37.5 damage per second)\n+11 Agility\n+8 Stamina\nDurability 90 / 90\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20038", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 11382, + ["name"] = "Bloodlord Mandokir", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + { + ["id"] = 11382, + ["name"] = "Bloodlord Mandokir", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20245] = { + ["name"] = "90 Green Warrior Gun", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 90, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "90 Green Warrior Gun\nBinds when equippedRangedGun81 - 151 DamageSpeed 2.50(46.4 damage per second)\n+9 Strength\n+8 Stamina\nDurability 65 / 65\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20245", + ["sources"] = { + }, + }, + [20285] = { + ["name"] = "63 Green Warrior Gun", + ["icon"] = "INV_Weapon_Rifle_05", + ["quality"] = 2, + ["level"] = 63, + ["reqlevel"] = 58, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "63 Green Warrior Gun\nBinds when equippedRangedGun51 - 96 DamageSpeed 2.50(29.4 damage per second)\n+6 Strength\n+6 Stamina\nDurability 65 / 65\nRequires Level 58", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20285", + ["sources"] = { + }, + }, + [20299] = { + ["name"] = "90 Green Rogue Bow", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 2, + ["level"] = 90, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "90 Green Rogue Bow\nBinds when picked upRangedBow81 - 151 DamageSpeed 2.50(46.4 damage per second)\n+6 Stamina\n+10 Agility\nDurability 65 / 65\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20299", + ["sources"] = { + }, + }, + [20313] = { + ["name"] = "63 Green Rogue Bow", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 2, + ["level"] = 63, + ["reqlevel"] = 58, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "63 Green Rogue Bow\nBinds when picked upRangedBow51 - 96 DamageSpeed 2.50(29.4 damage per second)\n+4 Stamina\n+7 Agility\nDurability 65 / 65\nRequires Level 58", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20313", + ["sources"] = { + }, + }, + [20368] = { + ["name"] = "Bland Bow of Steadiness", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 60, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "This bow has no real variance.", + ["tooltip"] = "Bland Bow of Steadiness\nBinds when picked upRangedBow46 - 46 DamageSpeed 1.50(30.7 damage per second)\nDurability 75 / 75\nRequires Level 60\n\"This bow has no real variance.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20368", + ["sources"] = { + }, + }, + [20437] = { + ["name"] = "Outrider's Bow", + ["icon"] = "INV_Weapon_Bow_06", + ["quality"] = 3, + ["level"] = 23, + ["reqlevel"] = 18, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrider's Bow\nBinds when picked upRangedBow19 - 37 DamageSpeed 2.40(11.7 damage per second)\nDurability 65 / 65\nRequires Level 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20437", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14754, + ["name"] = "Kelm Hargunth", + ["tag"] = "Warsong Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20438] = { + ["name"] = "Outrunner's Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 23, + ["reqlevel"] = 18, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Outrunner's Bow\nBinds when picked upRangedBow19 - 37 DamageSpeed 2.40(11.7 damage per second)\nDurability 65 / 65\nRequires Level 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20438", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14753, + ["name"] = "Illiyana Moonblaze", + ["tag"] = "Silverwing Supply Officer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20488] = { + ["name"] = "Rhok'delar, Longbow of the Ancient Keepers DEP", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 4, + ["level"] = 75, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Rhok'delar, Longbow of the Ancient Keepers DEP\nBinds when picked up\nUniqueRangedBow89 - 166 DamageSpeed 2.90(44.0 damage per second)\nDurability 90 / 90\nClasses: Hunter\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.\nEquip: +17 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20488", + ["sources"] = { + ["created-by"] = { + ["template"] = "spell", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 23194, + ["name"] = "@Forming Rhok'delar", + }, + }, + }, + }, + }, + [20599] = { + ["name"] = "Polished Ironwood Crossbow", + ["icon"] = "INV_Weapon_Crossbow_11", + ["quality"] = 4, + ["level"] = 76, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Polished Ironwood Crossbow\nBinds when picked up\nUniqueRangedCrossbow101 - 177 DamageSpeed 3.10(44.8 damage per second)\n+6 Stamina\n+7 Nature Resistance\nDurability 90 / 90\nRequires Level 60\nEquip: +26 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20599", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 14889, + ["name"] = "Emeriss", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20646] = { + ["name"] = "Sandstrider's Mark", + ["icon"] = "INV_Weapon_Bow_03", + ["quality"] = 2, + ["level"] = 59, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Sandstrider's Mark\nBinds when picked upRangedBow44 - 82 DamageSpeed 2.30(27.4 damage per second)\n+8 Stamina\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20646", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [20663] = { + ["name"] = "Deep Strike Bow", + ["icon"] = "INV_Weapon_Bow_10", + ["quality"] = 3, + ["level"] = 60, + ["reqlevel"] = 55, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Deep Strike Bow\nBinds when picked upRangedBow58 - 108 DamageSpeed 2.70(30.7 damage per second)\n+6 Agility\n+6 Intellect\n+4 Stamina\nDurability 75 / 75\nRequires Level 55", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20663", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15307, + ["name"] = "Earthen Templar", + ["tag"] = "Abyssal Council", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [20722] = { + ["name"] = "Crystal Slugthrower", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 3, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Crystal Slugthrower\nBinds when equippedRangedGun65 - 122 DamageSpeed 2.80(33.4 damage per second)\n+4 Stamina\nDurability 75 / 75\nRequires Level 60\nEquip: +20 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=20722", + ["sources"] = { + }, + }, + [21272] = { + ["name"] = "Blessed Qiraji Musket", + ["icon"] = "INV_Weapon_Rifle_11", + ["quality"] = 4, + ["level"] = 79, + ["subtype"] = "gun", + ["description"] = "The weapon is infused and reinforced with Elementium.", + ["tooltip"] = "Blessed Qiraji Musket\nBinds when picked up\nUniqueRangedGun109 - 184 DamageSpeed 3.10(47.3 damage per second)\n+10 Stamina\nDurability 90 / 90\nEquip: +31 ranged Attack Power.\n\"The weapon is infused and reinforced with Elementium.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21272", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [21459] = { + ["name"] = "Crossbow of Imminent Doom", + ["icon"] = "INV_Weapon_Crossbow_06", + ["quality"] = 4, + ["level"] = 72, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Crossbow of Imminent Doom\nBinds when picked upRangedCrossbow103 - 155 DamageSpeed 3.10(41.6 damage per second)\n+7 Agility\n+5 Stamina\n+5 Strength\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21459", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15339, + ["name"] = "Ossirian the Unscarred", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [21478] = { + ["name"] = "Bow of Taut Sinew", + ["icon"] = "INV_Weapon_Bow_13", + ["quality"] = 4, + ["level"] = 68, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of Taut Sinew\nBinds when picked upRangedBow59 - 111 DamageSpeed 2.20(38.6 damage per second)\n+8 Nature Resistance\nDurability 90 / 90\nRequires Level 60\nEquip: +22 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21478", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15369, + ["name"] = "Ayamiss the Hunter", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [21550] = { + ["name"] = "Monster - Bow, Kaldorei", + ["icon"] = "INV_Weapon_Bow_05", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Monster - Bow, KaldoreiRangedBow1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21550", + ["sources"] = { + }, + }, + [21554] = { + ["name"] = "Monster - Gun, PvP Horde", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, PvP HordeRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21554", + ["sources"] = { + }, + }, + [21564] = { + ["name"] = "Monster - Gun, Kaldorei PVP Alliance", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 0, + ["level"] = 1, + ["reqlevel"] = 1, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Gun, Kaldorei PVP AllianceRangedGun1 - 2 DamageSpeed 2.00(0.8 damage per second)\nDurability 18 / 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21564", + ["sources"] = { + }, + }, + [21616] = { + ["name"] = "Huhuran's Stinger", + ["icon"] = "INV_Weapon_Bow_14", + ["quality"] = 4, + ["level"] = 78, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Huhuran's Stinger\nBinds when picked upRangedBow87 - 163 DamageSpeed 2.70(46.3 damage per second)\n+18 Agility\nDurability 90 / 90\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21616", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15509, + ["name"] = "Princess Huhuran", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [21800] = { + ["name"] = "Silithid Husked Launcher", + ["icon"] = "INV_Weapon_Rifle_10", + ["quality"] = 3, + ["level"] = 68, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Silithid Husked Launcher\nBinds when equippedRangedGun68 - 128 DamageSpeed 2.80(35.0 damage per second)\n+10 Stamina\n+4 Agility\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=21800", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 19, + ["entries"] = { + { + ["id"] = 15318, + ["name"] = "Hive'Zara Drone", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15320, + ["name"] = "Hive'Zara Soldier", + ["level"] = 60, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15323, + ["name"] = "Hive'Zara Sandstalker", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15325, + ["name"] = "Hive'Zara Wasp", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15327, + ["name"] = "Hive'Zara Stinger", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15333, + ["name"] = "Silicate Feeder", + ["level"] = 61, + ["classification"] = 0, + }, + { + ["id"] = 15335, + ["name"] = "Flesh Hunter", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15336, + ["name"] = "Hive'Zara Tail Lasher", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15338, + ["name"] = "Obsidian Destroyer", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15355, + ["name"] = "Anubisath Guardian", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15462, + ["name"] = "Spitting Scarab", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15324, + ["name"] = "Qiraji Gladiator", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15387, + ["name"] = "Qiraji Warrior", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15386, + ["name"] = "Major Yeggeth", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15392, + ["name"] = "Captain Tuubid", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15391, + ["name"] = "Captain Qeez", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15390, + ["name"] = "Captain Xurrem", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15389, + ["name"] = "Captain Drenn", + ["level"] = 61, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 15343, + ["name"] = "Qiraji Swarmguard", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [22318] = { + ["name"] = "Malgen's Long Bow", + ["icon"] = "INV_Weapon_Bow_12", + ["quality"] = 3, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Malgen's Long Bow\nBinds when picked upRangedBow63 - 118 DamageSpeed 2.90(31.2 damage per second)\n+4 Stamina\nDurability 75 / 75\nRequires Level 56\nEquip: +20 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22318", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 8925, + ["name"] = "Dredge Worm", + ["level"] = 50, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 8927, + ["name"] = "Dark Screecher", + ["level"] = 52, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 181074, + ["name"] = "Arena Spoils", + }, + }, + }, + }, + }, + [22347] = { + ["name"] = "Fahrad's Reloading Repeater", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 65, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Fahrad's Reloading Repeater\nBinds when picked upRangedCrossbow85 - 128 DamageSpeed 3.20(33.3 damage per second)\n+4 Agility\nDurability 75 / 75\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22347", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [22656] = { + ["name"] = "The Purifier", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 4, + ["level"] = 63, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "The Purifier\nBinds when picked upRangedGun74 - 138 DamageSpeed 3.00(35.3 damage per second)\nDurability 90 / 90\nEquip: Improves your chance to get a critical strike by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22656", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [22810] = { + ["name"] = "Toxin Injector", + ["icon"] = "INV_weapon_rifle_13", + ["quality"] = 4, + ["level"] = 83, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Toxin Injector\nBinds when picked upRangedGun68 - 135 DamageSpeed 2.00(50.8 damage per second)\n+10 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +28 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22810", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15931, + ["name"] = "Grobbulus", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [22811] = { + ["name"] = "Soulstring", + ["icon"] = "INV_Weapon_Bow_13", + ["quality"] = 4, + ["level"] = 86, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Soulstring\nBinds when picked upRangedBow113 - 201 DamageSpeed 2.90(54.1 damage per second)\n+6 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.\nEquip: +18 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22811", + ["sources"] = { + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 181366, + ["name"] = "Four Horsemen Chest", + }, + }, + }, + }, + }, + [22812] = { + ["name"] = "Nerubian Slavemaker", + ["icon"] = "INV_Weapon_Crossbow_12", + ["quality"] = 4, + ["level"] = 89, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Nerubian Slavemaker\nBinds when picked upRangedCrossbow128 - 238 DamageSpeed 3.20(57.2 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: +24 Attack Power.\nEquip: Improves your chance to get a critical strike by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=22812", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 15990, + ["name"] = "Kel'Thuzad", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + { + ["id"] = 15990, + ["name"] = "Kel'Thuzad", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [23557] = { + ["name"] = "Larvae of the Great Worm", + ["icon"] = "INV_Weapon_Rifle_10", + ["quality"] = 4, + ["level"] = 81, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Larvae of the Great Worm\nBinds when picked upRangedGun103 - 192 DamageSpeed 3.00(49.2 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.\nEquip: +18 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=23557", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 15517, + ["name"] = "Ouro", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [41023] = { + ["name"] = "Water-logged Musket", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 1, + ["level"] = 5, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Water-logged Musket\nBinds when picked upRangedGun2 - 6 DamageSpeed 2.20(1.8 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=41023", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [41190] = { + ["name"] = "Bow of Alah'Thalas", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 2, + ["level"] = 13, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of Alah'Thalas\nBinds when picked upRangedBow9 - 18 DamageSpeed 2.50(5.4 damage per second)\n+1 Agility\nDurability 35 / 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=41190", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [41725] = { + ["name"] = "Dragonmaw Battle Bow", + ["icon"] = "GenBow_twow3F", + ["quality"] = 3, + ["level"] = 33, + ["reqlevel"] = 28, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Dragonmaw Battle Bow\nBinds when picked upRangedBow22 - 58 DamageSpeed 2.40(16.7 damage per second)\n+5 Fire Resistance\nDurability 75 / 75\nRequires Level 28", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=41725", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 62070, + ["name"] = "Overlord Blackheart", + ["level"] = 31, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [51746] = { + ["name"] = "Shadowblaster", + ["icon"] = "INV_Musket_02", + ["quality"] = 3, + ["level"] = 62, + ["reqlevel"] = 57, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Shadowblaster\nBinds when picked upRangedGun126 - 65 DamageSpeed 3.10+2 - 5 Shadow Damage\n(31.9 damage per second)\n+9 Stamina\nDurability 75 / 75\nRequires Level 57\nEquip: +14 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51746", + ["sources"] = { + }, + }, + [51759] = { + ["name"] = "Siege Bomber", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "gun", + ["description"] = "Comes with an underbarrel bomb launcher.", + ["tooltip"] = "Siege Bomber\nBinds when equippedRangedGun36 - 68 DamageSpeed 2.80(18.6 damage per second)\nDurability 65 / 65\nRequires Level 37\nUse: Inflicts 149 to 202 Fire damage and stuns targets in a 5 yard radius for 3 sec. Any damage will break the effect.\n\"Comes with an underbarrel bomb launcher.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51759", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 2749, + ["name"] = "Siege Golem", + ["level"] = 40, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [51768] = { + ["name"] = "Bow of Quel'Danil", + ["icon"] = "INV_Weapon_Bow_16", + ["quality"] = 2, + ["level"] = 49, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of Quel'Danil\nBinds when picked upRangedBow32 - 59 DamageSpeed 2.10(21.7 damage per second)\n+4 Agility\n+4 Stamina\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51768", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [51780] = { + ["name"] = "Ghoulslayer Shotgun", + ["icon"] = "INV_weapon_rifle_13", + ["quality"] = 4, + ["level"] = 66, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Ghoulslayer Shotgun\nBinds when picked upRangedGun81 - 151 DamageSpeed 3.10(37.4 damage per second)\nDurability 90 / 90\nRequires Level 60\nEquip: +24 Attack Power.\nEquip: +15 Attack Power when fighting Undead.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51780", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80936, + ["name"] = "Dark Reaver of Karazhan", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [51794] = { + ["name"] = "Otherworldly Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 52, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Otherworldly Rifle\nBinds when picked upRangedGun40 - 76 DamageSpeed 2.60+1 - 2 Fire Damage\n+1 - 2 Shadow Damage\n+1 - 2 Frost Damage\n(24.1 damage per second)\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51794", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [51828] = { + ["name"] = "Hawkwind Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 1, + ["level"] = 10, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Hawkwind Rifle\nBinds when picked upRangedGun6 - 12 DamageSpeed 2.60(3.5 damage per second)\nDurability 30 / 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51828", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [51844] = { + ["name"] = "Stunning Crossbow", + ["icon"] = "INV_Weapon_Crossbow_08", + ["quality"] = 2, + ["level"] = 41, + ["subtype"] = "crossbow", + ["description"] = "Cock the bow, aim, and fire!", + ["tooltip"] = "Stunning Crossbow\nBinds when picked upRangedCrossbow40 - 73 DamageSpeed 3.40(16.6 damage per second)\n\"Cock the bow, aim, and fire!\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51844", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [51862] = { + ["name"] = "Brave's Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 2, + ["level"] = 20, + ["subtype"] = "gun", + ["description"] = "Shu'halo warriors nickname this gun \"Greenboy\" for the way the sun reflects off it.", + ["tooltip"] = "Brave's Rifle\nBinds when picked upRangedGun17 - 30 DamageSpeed 2.60(9.0 damage per second)\nDurability 50 / 50\n\"Shu'halo warriors nickname this gun \"Greenboy\" for the way the sun reflects off it.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=51862", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [55028] = { + ["name"] = "Kavdan's Patient Watch", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 4, + ["level"] = 62, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "Always hits the heart.", + ["tooltip"] = "Kavdan's Patient Watch\nBinds when picked upRangedCrossbow81 - 151 DamageSpeed 3.10(37.4 damage per second)\n+8 Stamina\nRequires Level 60\nRequires Syndicate - ExaltedEquip: +22 ranged Attack Power.\n\"Always hits the heart.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=55028", + ["sources"] = { + }, + }, + [55068] = { + ["name"] = "Zan's Leperification Blaster", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 50, + ["reqlevel"] = 45, + ["subtype"] = "gun", + ["description"] = "Needs spell: Use: Zap your target with radioactive energy, turning it into a Leper Gnome and reducing its damage dealt by 15 and its movement speed by 20% for 12 seconds. (5 min cd) actual quote :Still very much a prototype. Don't show it to other gnomes", + ["tooltip"] = "Zan's Leperification Blaster\nBinds when picked upRangedGun49 - 92 DamageSpeed 2.70(26.1 damage per second)\n+4 Agility\n+4 Stamina\nDurability 75 / 75\nRequires Level 45\nRequires Ravenholdt - Revered\"Needs spell: Use: Zap your target with radioactive energy, turning it into a Leper Gnome and reducing its damage dealt by 15 and its movement speed by 20% for 12 seconds. (5 min cd) actual quote :Still very much a prototype. Don't show it to other gnomes\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=55068", + ["sources"] = { + }, + }, + [55096] = { + ["name"] = "Phase-shifting Crossbow", + ["icon"] = "INV_Weapon_Crossbow_18", + ["quality"] = 4, + ["level"] = 88, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Phase-shifting Crossbow\nBinds when picked up\nUniqueRangedCrossbow111 - 203 DamageSpeed 2.80(56.1 damage per second)\n+9 Strength\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to get a critical strike by 1%.\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=55096", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61951, + ["name"] = "Anomalus", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [55346] = { + ["name"] = "Rain of Spiders", + ["icon"] = "INV_Weapon_BoneBow2", + ["quality"] = 4, + ["level"] = 96, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Rain of Spiders\nBinds when picked up\nUniqueRangedBow144 - 255 DamageSpeed 3.10(64.4 damage per second)\n+10 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: +22 ranged Attack Power.\nEquip: Improves your chance to get a critical strike by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=55346", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 93333, + ["name"] = "Mephistroth", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [55379] = { + ["name"] = "Slag Slugger", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 3, + ["level"] = 23, + ["reqlevel"] = 18, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Slag Slugger\nBinds when picked upRangedGun15 - 28 DamageSpeed 2.30(9.3 damage per second)\nDurability 65 / 65\nRequires Level 18\nEquip: Chance to strike your ranged target with a Slag Bolt for 13 to 18 Fire damage immediately and 30 Fire damage over 6 sec.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=55379", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61963, + ["name"] = "Masterpiece Harvester", + ["level"] = 20, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [58016] = { + ["name"] = "Ashwood Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 2, + ["level"] = 39, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Ashwood Bow\nBinds when picked upRangedBow29 - 50 DamageSpeed 2.30(17.2 damage per second)\n+5 Stamina\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=58016", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [58083] = { + ["name"] = "Nippsy's Precision Rifle", + ["icon"] = "INV_Weapon_Rifle_02", + ["quality"] = 3, + ["level"] = 47, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Nippsy's Precision Rifle\nBinds when picked upRangedGun51 - 92 DamageSpeed 2.90(24.7 damage per second)\n+6 Agility\n+5 Intellect\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=58083", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [58086] = { + ["name"] = "Standard Grade Rifle", + ["icon"] = "INV_Weapon_Rifle_04", + ["quality"] = 1, + ["level"] = 8, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Standard Grade Rifle\nBinds when picked upRangedGun4 - 9 DamageSpeed 2.60(2.5 damage per second)\nDurability 30 / 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=58086", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [58193] = { + ["name"] = "Demon Hair Bow", + ["icon"] = "GenBow_twow3F", + ["quality"] = 3, + ["level"] = 40, + ["reqlevel"] = 35, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Demon Hair Bow\nBinds when picked upRangedBow53 - 79 DamageSpeed 3.10(21.3 damage per second)\nDurability 75 / 75\nRequires Level 35\nEquip: +19 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=58193", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 62665, + ["name"] = "Lady Drazare", + ["level"] = 38, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [58284] = { + ["name"] = "Waterlogged Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 35, + ["reqlevel"] = 30, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Waterlogged Blunderbuss\nBinds when picked upRangedGun31 - 55 DamageSpeed 3.00(14.3 damage per second)\n+3 Stamina\n+3 Agility\nDurability 65 / 65\nRequires Level 30", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=58284", + ["sources"] = { + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 12843, + ["name"] = "Sunken Treasure Chest", + }, + }, + }, + }, + }, + [60165] = { + ["name"] = "Wobblefree Fizz-rifle", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 2, + ["level"] = 59, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Wobblefree Fizz-rifle\nBinds when picked upRangedGun71 - 107 DamageSpeed 2.60(34.2 damage per second)\n+5 Intellect\nDurability 65 / 65\nEquip: +10 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60165", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60309] = { + ["name"] = "'Jadewood' Longbow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 2, + ["level"] = 40, + ["subtype"] = "bow", + ["description"] = "The band is encrusted with bright jades", + ["tooltip"] = "'Jadewood' Longbow\nBinds when picked upRangedBow23 - 45 DamageSpeed 1.90(17.9 damage per second)\n+6 Intellect\nDurability 65 / 65\n\"The band is encrusted with bright jades\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60309", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60338] = { + ["name"] = "Lordaeron Rusty Crossbow", + ["icon"] = "INV_Weapon_Crossbow_01", + ["quality"] = 2, + ["level"] = 15, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Lordaeron Rusty Crossbow\nBinds when picked upRangedCrossbow12 - 23 DamageSpeed 3.00(5.8 damage per second)\nDurability 40 / 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60338", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60339] = { + ["name"] = "High Elven Rotten Bow", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 2, + ["level"] = 15, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "High Elven Rotten Bow\nBinds when picked upRangedBow9 - 18 DamageSpeed 2.30(5.9 damage per second)\nDurability 40 / 40", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60339", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60440] = { + ["name"] = "Bloodscalp Longbow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 3, + ["level"] = 50, + ["reqlevel"] = 45, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bloodscalp Longbow\nBinds when picked upRangedBow56 - 108 DamageSpeed 3.00(27.3 damage per second)\n+6 Agility\nDurability 75 / 75\nRequires Level 45", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60440", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80269, + ["name"] = "Kin'Tozo", + ["tag"] = "Exiled Bloodscalp Warlord", + ["level"] = 45, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [60506] = { + ["name"] = "Vigilance", + ["icon"] = "INV_Weapon_Crossbow_05", + ["quality"] = 3, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Vigilance\nBinds when picked upRangedCrossbow72 - 114 DamageSpeed 2.80(33.2 damage per second)\n+9 Stamina\n+5 Agility\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60506", + ["sources"] = { + ["contained-in-object"] = { + ["template"] = "object", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 2010867, + ["name"] = "Vault Armory Equipment", + }, + }, + }, + }, + }, + [60545] = { + ["name"] = "Techrifle X-TREME 5200", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 56, + ["reqlevel"] = 51, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Techrifle X-TREME 5200\nBinds when picked upRangedGun47 - 93 DamageSpeed 2.60+1 - 5 Fire Damage\n(28.1 damage per second)\n+8 Agility\n+2 Intellect\nDurability 75 / 75\nRequires Level 51", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60545", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 60736, + ["name"] = "Engineer Figgles", + ["tag"] = "The Creator", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [60624] = { + ["name"] = "Goldplated Royal Crossbow", + ["icon"] = "INV_Weapon_Crossbow_03", + ["quality"] = 3, + ["level"] = 65, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Goldplated Royal Crossbow\nBinds when picked upRangedCrossbow86 - 131 DamageSpeed 3.30(32.9 damage per second)\n+5 Intellect\n+5 Agility\nDurability 75 / 75\nEquip: +12 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60624", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60782] = { + ["name"] = "Shieldbreaker Arbalest", + ["icon"] = "INV_Weapon_Crossbow_15", + ["quality"] = 4, + ["level"] = 61, + ["reqlevel"] = 56, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Shieldbreaker Arbalest\nBinds when equippedRangedCrossbow73 - 133 DamageSpeed 3.00(34.3 damage per second)\nDurability 90 / 90\nRequires Level 56\nEquip: Your attacks ignore 35 of the target's armor.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60782", + ["sources"] = { + ["worldDrop"] = true, + ["droppedByCount"] = 348, + }, + }, + [60821] = { + ["name"] = "Theramore Arbalest", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 3, + ["level"] = 47, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Theramore Arbalest\nBinds when picked upRangedCrossbow57 - 106 DamageSpeed 3.40(24.0 damage per second)\n+8 Agility\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60821", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [60882] = { + ["name"] = "Magram Windstriker", + ["icon"] = "GenBow_twow3F", + ["quality"] = 3, + ["level"] = 53, + ["reqlevel"] = 48, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Magram Windstriker\nBinds when picked upRangedBow71 - 92 DamageSpeed 2.90+5 - 7 Nature Damage\n(30.2 damage per second)\n+4 Intellect\nDurability 75 / 75\nRequires Level 48\nRequires Magram Clan Centaur - ReveredEquip: +12 ranged Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60882", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80942, + ["name"] = "Deathcaller Aisha", + ["tag"] = "Magram Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [60953] = { + ["name"] = "Brackenwall Longbow", + ["icon"] = "INV_Weapon_Bow_07", + ["quality"] = 3, + ["level"] = 47, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Brackenwall Longbow\nBinds when picked upRangedBow49 - 90 DamageSpeed 2.90(24.0 damage per second)\n+8 Agility\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=60953", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61011] = { + ["name"] = "Flintlocke's Hand Cannon", + ["icon"] = "INV_Weapon_Rifle_09", + ["quality"] = 4, + ["level"] = 65, + ["subtype"] = "gun", + ["description"] = "Also good for shooting woodchucks.", + ["tooltip"] = "Flintlocke's Hand Cannon\nBinds when picked up\nUniqueRangedGun97 - 139 DamageSpeed 3.20(36.9 damage per second)\n+5 Stamina\nDurability 90 / 90\nRequires - ExaltedEquip: Improves your chance to hit by 1%.\n\"Also good for shooting woodchucks.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61011", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80943, + ["name"] = "Dronormu", + ["tag"] = "Quartermaster", + ["level"] = 57, + ["classification"] = 0, + }, + }, + }, + }, + }, + [61068] = { + ["name"] = "Dark Iron Desecrator", + ["icon"] = "Spell_frost_fireresistancetotem", + ["quality"] = 4, + ["level"] = 65, + ["subtype"] = "gun", + ["description"] = "The true embodiment of Dark Iron construction.", + ["tooltip"] = "Dark Iron Desecrator\nBinds when picked upRangedGun72 - 142 DamageSpeed 2.90+5 - 10 Fire Damage\n(39.5 damage per second)\n+10 Fire Resistance\n+10 Shadow Resistance\nDurability 90 / 90\nUse: Blasts a target for 50 to 71 Fire damage.\nEquip: Improves your chance to get a critical strike by 1%.\n\"The true embodiment of Dark Iron construction.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61068", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61165] = { + ["name"] = "Bow of the Night Huntress", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 2, + ["level"] = 35, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of the Night Huntress\nBinds when picked upRangedBow22 - 41 DamageSpeed 2.20(14.3 damage per second)\n+5 Shadow Resistance\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61165", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61248] = { + ["name"] = "Beasthunter's Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_TWoW_02_Gray", + ["quality"] = 4, + ["level"] = 66, + ["reqlevel"] = 60, + ["subtype"] = "gun", + ["description"] = "The initials G.G. are etched on the stock.", + ["tooltip"] = "Beasthunter's Blunderbuss\nBinds when picked upRangedGun72 - 138 DamageSpeed 2.80(37.5 damage per second)\n+5 Agility\nDurability 90 / 90\nRequires Level 60\nEquip: +39 Attack Power when fighting Beasts.\n\"The initials G.G. are etched on the stock.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61248", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61223, + ["name"] = "Clawlord Howlfang", + ["level"] = 63, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [61307] = { + ["name"] = "Worgen Hunter Musket", + ["icon"] = "INV_Weapon_Rifle_TWoW_02_Ironblack", + ["quality"] = 3, + ["level"] = 46, + ["reqlevel"] = 41, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Worgen Hunter Musket\nBinds when picked upRangedGun50 - 92 DamageSpeed 2.90(24.5 damage per second)\n+4 Stamina\nDurability 75 / 75\nRequires Level 41\nEquip: +12 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61307", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61419, + ["name"] = "Matthias Holtz", + ["tag"] = "Worgen Hunter", + ["level"] = 44, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [61383] = { + ["name"] = "Intricate Gnomish Blunderbuss", + ["icon"] = "INV_Weapon_Rifle_TWoW_01_Gold_Noglow", + ["quality"] = 3, + ["level"] = 37, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Intricate Gnomish Blunderbuss\nBinds when picked upRangedGun30 - 78 DamageSpeed 3.00(18.0 damage per second)\n+3 Intellect\nDurability 75 / 75", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61383", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61472] = { + ["name"] = "Brigade Rifle", + ["icon"] = "INV_Weapon_Rifle_TWoW_02_Gray", + ["quality"] = 2, + ["level"] = 45, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Brigade Rifle\nBinds when picked upRangedGun42 - 76 DamageSpeed 2.80(21.1 damage per second)\n+4 Agility\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61472", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61525] = { + ["name"] = "Nature's Call", + ["icon"] = "INV_Weapon_Bow_04", + ["quality"] = 4, + ["level"] = 81, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "Favored by the dryad.", + ["tooltip"] = "Nature's Call\nBinds when picked up\nUniqueRangedBow103 - 191 DamageSpeed 3.00(49.0 damage per second)\n+8 Stamina\nDurability 90 / 90\nRequires Level 60\nEquip: Improves your chance to hit by 1%.\nEquip: Your attacks ignore 25 of the target's armor.\n\"Favored by the dryad.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61525", + ["sources"] = { + }, + }, + [61569] = { + ["name"] = "Time Frozen Bow", + ["icon"] = "INV_Weapon_Bow_09", + ["quality"] = 3, + ["level"] = 64, + ["reqlevel"] = 59, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Time Frozen Bow\nBinds when equippedRangedBow76 - 139 DamageSpeed 3.50+4 - 10 Fire Damage\n(32.7 damage per second)\n+-10 Frost Resistance\nDurability 75 / 75\nRequires Level 59\nEquip: Increases your attack and casting speed by 1%.\nEquip: Improves your chance to hit by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61569", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 11, + ["entries"] = { + { + ["id"] = 65100, + ["name"] = "Infinite Dragonspawn", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65101, + ["name"] = "Infinite Riftguard", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65102, + ["name"] = "Infinite Riftweaver", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65103, + ["name"] = "Infinite Whelp", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61317, + ["name"] = "Temporal Dust", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61318, + ["name"] = "Echo of Time", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65105, + ["name"] = "Infinite Rift-Lord", + ["level"] = 62, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 50106, + ["name"] = "Time Anomaly", + ["level"] = 62, + ["classification"] = 0, + }, + { + ["id"] = 65110, + ["name"] = "Darkwater Python", + ["level"] = 61, + ["classification"] = 0, + }, + { + ["id"] = 65111, + ["name"] = "Murkwater Crocolisk", + ["level"] = 61, + ["classification"] = 0, + }, + { + ["id"] = 65112, + ["name"] = "Blackfang Tarantula", + ["level"] = 62, + ["classification"] = 0, + }, + }, + }, + }, + }, + [61629] = { + ["name"] = "Farmer's Musket", + ["icon"] = "INV_Weapon_Rifle_TWoW_02_Purple", + ["quality"] = 2, + ["level"] = 46, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Farmer's Musket\nBinds when picked upRangedGun38 - 76 DamageSpeed 2.60(21.9 damage per second)\n+6 Stamina\n+3 Agility\nDurability 65 / 65", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61629", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [61683] = { + ["name"] = "Battered Arbalest", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 0, + ["level"] = 45, + ["reqlevel"] = 40, + ["subtype"] = "crossbow", + ["description"] = "Somehow still in working condition.", + ["tooltip"] = "Battered ArbalestRangedCrossbow19 - 35 DamageSpeed 2.20(12.3 damage per second)\nDurability 65 / 65\nRequires Level 40\n\"Somehow still in working condition.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=61683", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 61364, + ["name"] = "Greymane Arbalest", + ["level"] = 43, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [70049] = { + ["name"] = "Worn Crossbow", + ["icon"] = "INV_Weapon_Crossbow_02", + ["quality"] = 1, + ["level"] = 2, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Worn CrossbowRangedCrossbow3 - 6 DamageSpeed 3.00(1.5 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=70049", + ["sources"] = { + }, + }, + [80106] = { + ["name"] = "Miscalibrated Rifle", + ["icon"] = "INV_Weapon_Rifle_01", + ["quality"] = 1, + ["level"] = 6, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Miscalibrated Rifle\nBinds when picked upRangedGun5 - 9 DamageSpeed 2.80(2.5 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80106", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [80127] = { + ["name"] = "Polished Boomstick", + ["icon"] = "INV_Weapon_Rifle_03", + ["quality"] = 2, + ["level"] = 11, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Polished Boomstick\nBinds when picked upRangedGun8 - 15 DamageSpeed 2.40(4.8 damage per second)\nDurability 35 / 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80127", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [80207] = { + ["name"] = "Worn Wooden Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 6, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Worn Wooden Bow\nBinds when picked upRangedBow5 - 9 DamageSpeed 2.80(2.5 damage per second)\nDurability 25 / 25", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80207", + ["sources"] = { + ["reward-of"] = { + ["template"] = "quest", + ["count"] = 0, + ["entries"] = { + }, + }, + }, + }, + [80223] = { + ["name"] = "Farstrider Lodge Protector's Bow", + ["icon"] = "INV_Weapon_Bow_17", + ["quality"] = 3, + ["level"] = 23, + ["reqlevel"] = 18, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Farstrider Lodge Protector's Bow\nBinds when picked upRangedBow19 - 37 DamageSpeed 2.40(11.7 damage per second)\nDurability 65 / 65\nRequires Level 18", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80223", + ["sources"] = { + }, + }, + [80503] = { + ["name"] = "Well-balanced Short Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 16, + ["reqlevel"] = 10, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Well-balanced Short Bow\nBinds when picked upRangedBow8 - 15 DamageSpeed 1.70(6.8 damage per second)\nDurability 40 / 40\nClasses: Warrior, Hunter, Rogue\nRequires Level 10\nRequires Silvermoon Remnant - Friendly", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80503", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80266, + ["name"] = "Soalara Dawnstar", + ["tag"] = "Silvermoon Remnant Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [80546] = { + ["name"] = "Quel'dorei Ranger's Longbow", + ["icon"] = "INV_Weapon_Bow_17", + ["quality"] = 3, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Quel'dorei Ranger's Longbow\nBinds when picked upRangedBow75 - 118 DamageSpeed 2.90(33.3 damage per second)\n+5 Stamina\nDurability 75 / 75\nRequires Level 60\nRequires Silvermoon Remnant - ReveredEquip: +22 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80546", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 80266, + ["name"] = "Soalara Dawnstar", + ["tag"] = "Silvermoon Remnant Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [80603] = { + ["name"] = "Sturdy Short Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 16, + ["reqlevel"] = 10, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Sturdy Short Bow\nBinds when picked upRangedBow7 - 14 DamageSpeed 1.70(6.2 damage per second)\nDurability 40 / 40\nClasses: Warrior, Hunter, Rogue\nRequires Level 10\nRequires Revantusk Trolls - Friendly", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80603", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 80915, + ["name"] = "Tan'Pogo", + ["tag"] = "Revantusk Trolls Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + { + ["id"] = 80807, + ["name"] = "Reolis Riptusk", + ["tag"] = "Horde Cloth Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [80646] = { + ["name"] = "Revantusk Shadow Hunter's Longbow", + ["icon"] = "INV_Weapon_Bow_08", + ["quality"] = 3, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Revantusk Shadow Hunter's Longbow\nBinds when picked upRangedBow75 - 118 DamageSpeed 2.90(33.3 damage per second)\n+5 Stamina\nDurability 75 / 75\nRequires Level 60\nRequires Revantusk Trolls - ReveredEquip: +22 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80646", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 2, + ["entries"] = { + { + ["id"] = 80915, + ["name"] = "Tan'Pogo", + ["tag"] = "Revantusk Trolls Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + { + ["id"] = 80807, + ["name"] = "Reolis Riptusk", + ["tag"] = "Horde Cloth Quartermaster", + ["level"] = 11, + ["classification"] = 0, + }, + }, + }, + }, + }, + [80745] = { + ["name"] = "Abomination Crossbow", + ["icon"] = "INV_Weapon_Crossbow_04", + ["quality"] = 3, + ["level"] = 42, + ["reqlevel"] = 37, + ["subtype"] = "crossbow", + ["description"] = "Made from abomination ribs and stitching. Truly horrifying.", + ["tooltip"] = "Abomination Crossbow\nBinds when picked upRangedCrossbow47 - 87 DamageSpeed 3.00(22.3 damage per second)\n+4 Strength\n+4 Stamina\nDurability 75 / 75\nRequires Level 37\n\"Made from abomination ribs and stitching. Truly horrifying.\"", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80745", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 8567, + ["name"] = "Glutton", + ["level"] = 40, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [80795] = { + ["name"] = "Burstshot Harquebus", + ["icon"] = "INV_Weapon_Rifle_06", + ["quality"] = 3, + ["level"] = 56, + ["reqlevel"] = 51, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Burstshot Harquebus\nBinds when equippedRangedGun52 - 98 DamageSpeed 2.60(28.8 damage per second)\n+8 Stamina\nDurability 75 / 75\nRequires Level 51\nEquip: +10 Attack Power.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80795", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 37, + ["entries"] = { + { + ["id"] = 9097, + ["name"] = "Scarshield Legionnaire", + ["tag"] = "Scarshield Legion", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9098, + ["name"] = "Scarshield Spellbinder", + ["tag"] = "Scarshield Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9045, + ["name"] = "Scarshield Acolyte", + ["tag"] = "Scarshield Legion", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9258, + ["name"] = "Scarshield Raider", + ["tag"] = "Scarshield Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9257, + ["name"] = "Scarshield Warlock", + ["tag"] = "Scarshield Legion", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9239, + ["name"] = "Smolderthorn Mystic", + ["tag"] = "Firebrand Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9240, + ["name"] = "Smolderthorn Shadow Priest", + ["tag"] = "Firebrand Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9265, + ["name"] = "Smolderthorn Shadow Hunter", + ["tag"] = "Firebrand Legion", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9236, + ["name"] = "Shadow Hunter Vosh'gajin", + ["tag"] = "Firebrand Legion", + ["level"] = 54, + ["classification"] = 3, + ["isBossLike"] = true, + }, + { + ["id"] = 9199, + ["name"] = "Spirestone Enforcer", + ["tag"] = "Firebrand Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9201, + ["name"] = "Spirestone Ogre Magus", + ["tag"] = "Bloodaxe Legion", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9197, + ["name"] = "Spirestone Battle Mage", + ["tag"] = "Bloodaxe Legion", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9219, + ["name"] = "Spirestone Butcher", + ["tag"] = "Bloodaxe Legion", + ["level"] = 55, + ["classification"] = 2, + ["isBossLike"] = true, + }, + { + ["id"] = 9200, + ["name"] = "Spirestone Reaver", + ["tag"] = "Bloodaxe Legion", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9216, + ["name"] = "Spirestone Warlord", + ["tag"] = "Bloodaxe Legion", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9196, + ["name"] = "Highlord Omokk", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9259, + ["name"] = "Firebrand Grunt", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9262, + ["name"] = "Firebrand Invoker", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9261, + ["name"] = "Firebrand Darkweaver", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9264, + ["name"] = "Firebrand Pyromancer", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9260, + ["name"] = "Firebrand Legionnaire", + ["level"] = 54, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9692, + ["name"] = "Bloodaxe Raider", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9583, + ["name"] = "Bloodaxe Veteran", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9716, + ["name"] = "Bloodaxe Warmonger", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9693, + ["name"] = "Bloodaxe Evoker", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9717, + ["name"] = "Bloodaxe Summoner", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 9268, + ["name"] = "Smolderthorn Berserker", + ["level"] = 55, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61191, + ["name"] = "Shadowbane Alpha", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61192, + ["name"] = "Shadowbane Darkcaster", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61193, + ["name"] = "Shadowbane Ambusher", + ["level"] = 58, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61194, + ["name"] = "Shadowbane Ragefang", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 61211, + ["name"] = "Shadowbane Glutton", + ["level"] = 59, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65100, + ["name"] = "Infinite Dragonspawn", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65101, + ["name"] = "Infinite Riftguard", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65102, + ["name"] = "Infinite Riftweaver", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 65105, + ["name"] = "Infinite Rift-Lord", + ["level"] = 57, + ["classification"] = 1, + ["isBossLike"] = true, + }, + { + ["id"] = 62555, + ["name"] = "Blackrock Pyremaster", + ["level"] = 56, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [80820] = { + ["name"] = "Quilflinger", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 2, + ["level"] = 13, + ["reqlevel"] = 8, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Quilflinger\nBinds when equippedRangedBow7 - 14 DamageSpeed 2.10+1 - 1 Nature Damage\n(5.5 damage per second)\nDurability 35 / 35\nRequires Level 8", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80820", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 5785, + ["name"] = "Sister Hatelash", + ["level"] = 11, + ["classification"] = 4, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [80825] = { + ["name"] = "Flamestring Bow", + ["icon"] = "INV_Weapon_Bow_09", + ["quality"] = 3, + ["level"] = 47, + ["reqlevel"] = 42, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Flamestring Bow\nBinds when equippedRangedBow44 - 84 DamageSpeed 2.60+2 - 7 Fire Damage\n(26.3 damage per second)\nRequires Level 42\nEquip: Adds 4 fire damage to your weapon attack.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80825", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 2447, + ["name"] = "Narillasanz", + ["level"] = 44, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [80876] = { + ["name"] = "Silvermoon Bow", + ["icon"] = "INV_Weapon_Bow_02", + ["quality"] = 1, + ["level"] = 2, + ["reqlevel"] = 1, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Silvermoon BowRangedBow2 - 5 DamageSpeed 2.30(1.5 damage per second)\nDurability 20 / 20", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=80876", + ["sources"] = { + }, + }, + [83094] = { + ["name"] = "Monster - Rifle2H, Mechagnome", + ["icon"] = "INV_Weapon_Rifle_29", + ["quality"] = 1, + ["level"] = 7, + ["reqlevel"] = 2, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Monster - Rifle2H, MechagnomeRangedGun4 - 9 DamageSpeed 2.60(2.5 damage per second)\nDurability 30 / 30\nRequires Level 2", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=83094", + ["sources"] = { + }, + }, + [83225] = { + ["name"] = "Bow of the Grove", + ["icon"] = "INV_Weapon_Bow_11", + ["quality"] = 3, + ["level"] = 40, + ["reqlevel"] = 35, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Bow of the Grove\nBinds when picked upRangedBow43 - 68 DamageSpeed 2.60(21.3 damage per second)\n+3 Agility\nDurability 75 / 75\nRequires Level 35", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=83225", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 92109, + ["name"] = "Keeper Ranathos", + ["level"] = 35, + ["classification"] = 1, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [83257] = { + ["name"] = "Caer Darrow Reserve Rifle", + ["icon"] = "INV_Weapon_Rifle_07", + ["quality"] = 3, + ["level"] = 62, + ["reqlevel"] = 56, + ["subtype"] = "gun", + ["description"] = "", + ["tooltip"] = "Caer Darrow Reserve Rifle\nBinds when picked upRangedGun76 - 94 DamageSpeed 2.60(32.7 damage per second)\nDurability 75 / 75\nRequires Level 56\nEquip: Improves your chance to get a critical strike by 1%.", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=83257", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 49007, + ["name"] = "The Wandering Knight", + ["level"] = 55, + ["classification"] = 2, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [83452] = { + ["name"] = "Windbreaker", + ["icon"] = "INV_Weapon_Bow_01", + ["quality"] = 3, + ["level"] = 65, + ["reqlevel"] = 60, + ["subtype"] = "bow", + ["description"] = "", + ["tooltip"] = "Windbreaker\nBinds when picked upRangedBow44 - 96 DamageSpeed 2.30+7 - 14 Frost Damage\n(35.0 damage per second)\n+12 Agility\n+5 Frost Resistance\nDurability 75 / 75\nRequires Level 60", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=83452", + ["sources"] = { + ["dropped-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 91916, + ["name"] = "Archlich Enkhraz", + ["level"] = 62, + ["classification"] = 3, + ["isBossLike"] = true, + }, + }, + }, + }, + }, + [83517] = { + ["name"] = "Balanced Light Crossbow", + ["icon"] = "INV_Weapon_Crossbow_01", + ["quality"] = 1, + ["level"] = 16, + ["reqlevel"] = 11, + ["subtype"] = "crossbow", + ["description"] = "", + ["tooltip"] = "Balanced Light CrossbowRangedCrossbow12 - 21 DamageSpeed 2.90(5.7 damage per second)\nDurability 40 / 40\nRequires Level 11", + ["sourceUrl"] = "https://database.turtlecraft.gg/?item=83517", + ["sources"] = { + ["sold-by"] = { + ["template"] = "npc", + ["count"] = 1, + ["entries"] = { + { + ["id"] = 81035, + ["name"] = "Jake Booker", + ["tag"] = "Bowyer", + ["level"] = 15, + ["classification"] = 0, + }, + }, + }, + }, + }, +} + +for itemId, originRow in pairs(MTH_DS_ItemOrigins) do + local item = MTH_DS_AmmoItems[itemId] + if not item then + item = {} + MTH_DS_AmmoItems[itemId] = item + end + if not item["name"] and originRow["name"] then item["name"] = originRow["name"] end + if not item["icon"] and originRow["icon"] then item["icon"] = originRow["icon"] end + if not item["quality"] and originRow["quality"] then item["quality"] = originRow["quality"] end + if not item["level"] and originRow["level"] then item["level"] = originRow["level"] end + if not item["reqlevel"] and originRow["reqlevel"] then item["reqlevel"] = originRow["reqlevel"] end + if not item["subtype"] and originRow["subtype"] then item["subtype"] = originRow["subtype"] end + if (not item["description"] or item["description"] == "") and originRow["description"] then item["description"] = originRow["description"] end + if (not item["tooltip"] or item["tooltip"] == "") and originRow["tooltip"] then item["tooltip"] = originRow["tooltip"] end + if not item["sourceUrl"] and originRow["sourceUrl"] then item["sourceUrl"] = originRow["sourceUrl"] end + item["sources"] = originRow["sources"] + if originRow["sources"] and originRow["sources"]["worldDrop"] then + item["worlddrop"] = true + end +end diff --git a/data/ds-items.lua b/data/ds-items.lua index e946a6e..481057c 100644 --- a/data/ds-items.lua +++ b/data/ds-items.lua @@ -732,13 +732,6 @@ MTH_DS_AmmoItems = { [92217] = 0, }, }, - [3034] = { - ["name"] = "BKP \"Impact\" Shot", - ["level"] = 35, - ["reqlevel"] = 30, - ["icon"] = "INV_Ammo_Bullet_02", - ["subtype"] = "bullet", - }, [3464] = { ["name"] = "Feathered Arrow", ["level"] = 35, diff --git a/data/init.lua b/data/init.lua index 5a5499d..b01d349 100644 --- a/data/init.lua +++ b/data/init.lua @@ -26,6 +26,85 @@ end MTH_DS_MarkNotInGameRangedWeapons() +local function MTH_DS_ApplyCapturedProjectileQualities() + if type(MTH_DS_AmmoItems) ~= "table" then return end + + local capturedQualityByItemId = { + [2512] = 1, + [2515] = 1, + [2516] = 1, + [2519] = 1, + [3030] = 1, + [3033] = 1, + [3464] = 2, + [3465] = 2, + [4960] = 1, + [5568] = 1, + [8067] = 1, + [8068] = 1, + [8069] = 1, + [9399] = 2, + [10512] = 2, + [10513] = 2, + [10579] = 3, + [11284] = 1, + [11285] = 1, + [11630] = 3, + [12654] = 3, + [13377] = 3, + [15997] = 2, + [18042] = 2, + [19316] = 2, + [19317] = 2, + } + + for itemId, quality in pairs(capturedQualityByItemId) do + local row = MTH_DS_AmmoItems[itemId] + if type(row) == "table" then + row.quality = quality + end + end +end + +MTH_DS_ApplyCapturedProjectileQualities() + +local function MTH_DS_ApplyCapturedAmmoBagQualities() + local bagItems = MTH_DS_BagItems or MTH_DS_Bags + if type(bagItems) ~= "table" then return end + + local capturedQualityByItemId = { + [2101] = 1, + [2102] = 1, + [3573] = 1, + [3574] = 1, + [3604] = 2, + [3605] = 2, + [5439] = 1, + [5441] = 1, + [7278] = 1, + [7279] = 1, + [7371] = 2, + [7372] = 2, + [8217] = 2, + [8218] = 2, + [11362] = 1, + [11363] = 1, + [18714] = 4, + [19319] = 3, + [19320] = 3, + [61549] = 3, + } + + for itemId, quality in pairs(capturedQualityByItemId) do + local row = bagItems[itemId] + if type(row) == "table" then + row.quality = quality + end + end +end + +MTH_DS_ApplyCapturedAmmoBagQualities() + local function MTH_DS_EnsurePetSpellsTrainerGrowl() if not MTH_DS_PetSpells then return end if type(MTH_DS_PetSpells.allSpells) ~= "table" then MTH_DS_PetSpells.allSpells = {} end diff --git a/init/api.xml b/init/api.xml index c6fa655..9d628c5 100644 --- a/init/api.xml +++ b/init/api.xml @@ -8,6 +8,7 @@ + @@ -32,6 +33,7 @@ + diff --git a/init/localization.xml b/init/localization.xml new file mode 100644 index 0000000..90d6323 --- /dev/null +++ b/init/localization.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/locales/data/beasts/deDE.lua b/locales/data/beasts/deDE.lua new file mode 100644 index 0000000..1cbf2df --- /dev/null +++ b/locales/data/beasts/deDE.lua @@ -0,0 +1,713 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +MTH_LocaleData.data.beasts.deDE = { + [30] = "Waldspinne", + [43] = "Minenspinne", + [69] = "Erkrankter wilder Waldwolf", + [113] = "Steinhauereber", + [118] = "Streuner", + [119] = "Langschnauze", + [154] = "Großer Fleischreißer", + [157] = "Geiferzahn", + [199] = "Junger Fleischreißer", + [213] = "Ausgehungerter Terrorwolf", + [217] = "Giftweberspinne", + [299] = "Junger Wolf", + [330] = "Prinzessin", + [345] = "Stopfwanst", + [390] = "Gefolgsschwein", + [428] = "Terrorkondor", + [442] = "Tarantel", + [454] = "Junger Geiferzahn", + [462] = "Vultros", + [471] = "Giftzahnbrutmutter", + [505] = "Große Tarantel", + [521] = "Lupos", + [524] = "Steinhauteber", + [525] = "Räudiger Wolf", + [539] = "Zwerggiftweberspinne", + [547] = "Großer Geiferzahn", + [565] = "Tollwütiger Terrorwolf", + [569] = "Grüner Eremit", + [574] = "Naraxis", + [616] = "Chatter", + [628] = "Schwarzer Verheerer", + [681] = "Junger Schlingendorntiger", + [682] = "Schlingendorntiger", + [683] = "Junger Panther", + [684] = "Schattentatzenpanther", + [685] = "Schlingendornraptor", + [686] = "Schmetterschwanz", + [687] = "Dschungelpirscher", + [704] = "Struppiger Waldwolf", + [705] = "Struppiger junger Wolf", + [708] = "Kleiner Klippeneber", + [728] = "Bhag'thera", + [729] = "Sin'Dall", + [730] = "Tethis", + [731] = "König Bangalash", + [736] = "Panther", + [767] = "Sumpfjaguar", + [768] = "Schattenpanther", + [769] = "Todesstoßtarantel", + [772] = "Schlingendorntigerin", + [822] = "Junger Waldbär", + [830] = "Sandkriecher", + [831] = "Meereskriecher", + [833] = "Kojotenrudelanführer", + [834] = "Kojote", + [854] = "Junger Dschungelpirscher", + [855] = "Junger Schlingendornraptor", + [856] = "Junger Schmetterschwanz", + [858] = "Trauerspinner", + [922] = "Schlickkriecher", + [923] = "Junger schwarzer Verheerer", + [930] = "Junges einer Schwarzen Witwe", + [949] = "Aaskrabbler", + [976] = "Kurzens Kriegstiger", + [977] = "Kurzens Kriegspanther", + [1015] = "Hochlandraptor", + [1016] = "Hochlandschmetterschwanz", + [1017] = "Hochlandsensenklaue", + [1018] = "Hochlandscharfzahn", + [1019] = "Alter Scharfzahn", + [1020] = "Scheckiger Raptor", + [1021] = "Scheckiger Kreischer", + [1022] = "Scheckige Sensenklaue", + [1023] = "Scheckiger Scharfzahn", + [1082] = "Sägezahnkrokilisk", + [1084] = "Junger Sägezahnkrokilisk", + [1087] = "Sägezahnschnapper", + [1088] = "Monströser Kriecher", + [1108] = "Nebeltalgorilla", + [1109] = "Fleischreißer", + [1111] = "Egelpirscher", + [1112] = "Egelwitwe", + [1114] = "Dschungeldonnerer", + [1125] = "Klippeneber", + [1126] = "Großer Klippeneber", + [1127] = "Alter Klippeneber", + [1128] = "Junger Schwarzbär", + [1129] = "Schwarzbär", + [1130] = "Bjarn", + [1131] = "Winterwolf", + [1132] = "Holzkopf", + [1133] = "Verhungernder Winterwolf", + [1138] = "Schneefährtenleserwolf", + [1140] = "Scharfzahnmatriarchin", + [1150] = "Flusskrokilisk", + [1152] = "Schnappkieferkrokilisk", + [1184] = "Klippenlauerer", + [1185] = "Holzlauerer", + [1186] = "Schwarzbär", + [1188] = "Ergrauter Schwarzbär", + [1189] = "Schwarzbärenpatriarch", + [1190] = "Bergeber", + [1191] = "Räudiger Bergeber", + [1192] = "Alter Bergeber", + [1194] = "Bergbussard", + [1195] = "Waldlauerer", + [1196] = "Eisklauenbär", + [1199] = "Halbwüchsiger Schneeleopard", + [1201] = "Schneeleopard", + [1216] = "Küstenkriecher", + [1225] = "Alte Rußtatze", + [1258] = "Schwarzer Verheerermastiff", + [1400] = "Sumpflandkrokilisk", + [1417] = "Junger Sumpflandkrokilisk", + [1504] = "Junger Nachtweber", + [1505] = "Nachtweber", + [1508] = "Junger Aasfresser", + [1509] = "Struppiger Aasfresser", + [1511] = "Wütender Silberrücken", + [1512] = "Nachtsauger", + [1513] = "Räudiger Nachtsauger", + [1516] = "Konda", + [1547] = "Altersschwacher Schattenhund", + [1548] = "Verfluchter Schattenhund", + [1549] = "Gefräßiger Schattenhund", + [1553] = "Großer Nachtsauger", + [1554] = "Vampirnachtsauger", + [1555] = "Heimtückischer Nachtweber", + [1557] = "Alter Nebeltalgorilla", + [1558] = "Silberrückenpatriarch", + [1688] = "Nachtwebermatriarchin", + [1689] = "Vernarbter Klippeneber", + [1693] = "Lochkrokilisk", + [1713] = "Alter Schattentatzenpanther", + [1765] = "Worg", + [1766] = "Tollwütiger Worg", + [1778] = "Wilder ergrauter Bär", + [1780] = "Netzhuscherhetzer", + [1781] = "Netzhuscherlauerer", + [1797] = "Tollwütiger Riesenbär", + [1809] = "Aasgeier", + [1815] = "Kranker Schwarzbär", + [1816] = "Kranker Grizzly", + [1817] = "Kranker Wolf", + [1822] = "Giftnebellauerer", + [1824] = "Seuchenlauerer", + [1922] = "Grauer Forstwolf", + [1923] = "Blutschnauzenworg", + [1961] = "Marterklaue", + [1984] = "Junger Disteleber", + [1985] = "Disteleber", + [1986] = "Waldweberspinne", + [1994] = "Githyiss die Üble", + [1995] = "Strigideule", + [1996] = "Strigidkreischer", + [1997] = "Strigidjäger", + [1998] = "Waldweberlauerer", + [1999] = "Waldwebergiftzahn", + [2000] = "Waldweberseidenspinner", + [2001] = "Riesige Waldweberspinne", + [2031] = "Junger Nachtsäbler", + [2032] = "Räudiger Nachtsäbler", + [2033] = "Alter Nachtsäbler", + [2034] = "Wilder Nachtsäbler", + [2042] = "Nachtsäbler", + [2043] = "Pirschender Nachtsäbler", + [2069] = "Mondpirscher", + [2070] = "Mondpirscherwicht", + [2071] = "Mondpirschermatriarchin", + [2089] = "Riesiger Sumpflandkrokilisk", + [2163] = "Distelbär", + [2165] = "Ergrauter Distelbär", + [2172] = "Schreitergelegemutter", + [2175] = "Schattenklaue", + [2231] = "Zwerggezeitenkriecher", + [2232] = "Gezeitenkriecher", + [2233] = "Verkrusteter Gezeitenkriecher", + [2234] = "Junger Riffkriecher", + [2235] = "Riffkriecher", + [2236] = "Tobender Riffkriecher", + [2237] = "Mondpirscherpatriarch", + [2275] = "Wütender Stanley", + [2321] = "Waldschreiterjunges", + [2322] = "Waldschreiter", + [2323] = "Riesiger Waldschreiter", + [2348] = "Alter Mooskrabbler", + [2349] = "Domestizierter Krabbler", + [2350] = "Waldkrabbler", + [2351] = "Verseuchter Bär", + [2354] = "Heimtückischer Graubär", + [2356] = "Alter Graubär", + [2384] = "Verhungernder Berglöwe", + [2385] = "Hügellandpirscher", + [2406] = "Berglöwe", + [2407] = "Bulliger Berglöwe", + [2408] = "Schnappkiefer", + [2476] = "Gosh-Haldir", + [2505] = "Salzwasserschnappkiefer", + [2521] = "Himmelsmähnengorilla", + [2522] = "Jagueropirscher", + [2544] = "Südlicher Sandkriecher", + [2559] = "Hochlandschreiter", + [2560] = "Hochlandhauer", + [2561] = "Hochlandfleischpirscher", + [2563] = "Ebenenkrabbler", + [2565] = "Riesiger Ebenenkrabbler", + [2578] = "Junger Mesabussard", + [2579] = "Mesabussard", + [2580] = "Alter Mesabussard", + [2635] = "Alter Schnappkieferkrokilisk", + [2680] = "Wolfswelpe der Blutfratzen", + [2681] = "Raubwolf der Blutfratzen", + [2686] = "Brutwache der Bleichborken", + [2727] = "Klippenkojote", + [2728] = "Wilder Klippenkojote", + [2729] = "Alter Klippenkojote", + [2730] = "Tollwütiger Klippenkojote", + [2731] = "Kammpirscher", + [2732] = "Kammjägerin", + [2734] = "Kammpirscherpatriarch", + [2753] = "Barnabus", + [2829] = "Verhungernder Bussard", + [2830] = "Ausgedörrter Bussard", + [2831] = "Riesenbussard", + [2850] = "Zerbrochener Zahn", + [2923] = "Räudige Silbermähne", + [2924] = "Silbermähnenwolf", + [2925] = "Silbermähnenheuler", + [2926] = "Silbermähnenpirscher", + [2931] = "Zaricotl", + [2954] = "Kampfeber der Borstennacken", + [2955] = "Ebenenschreiter", + [2956] = "Ausgewachsener Ebenenschreiter", + [2957] = "Alter Ebenenschreiter", + [2958] = "Präriewolf", + [2959] = "Präriepirscher", + [2960] = "Präriewolfalpha", + [2961] = "Bergpuma", + [2966] = "Junger Kampfeber", + [2969] = "Drahtiger Sturzflieger", + [2970] = "Sturzflieger", + [2971] = "Kralliger Sturzflieger", + [3035] = "Flachlandpuma", + [3068] = "Mazzranache", + [3098] = "Scheckiger Eber", + [3099] = "Scheckiger Terroreber", + [3100] = "Alter scheckiger Eber", + [3106] = "Brandungskriecher", + [3107] = "Ausgewachsener Brandungskriecher", + [3108] = "Verkrusteter Brandungskriecher", + [3110] = "Schaudermagenkrokilisk", + [3121] = "Durotartiger", + [3122] = "Blutkrallenschwanzpeitscher", + [3123] = "Blutkrallensensenschlund", + [3124] = "Skorpidarbeiter", + [3125] = "Rasselnder Skorpid", + [3126] = "Gepanzerter Skorpid", + [3127] = "Siechstachelskorpid", + [3225] = "Verderbter scheckiger Eber", + [3226] = "Verderbter Skorpid", + [3227] = "Verderbter Blutkrallensensenschlund", + [3228] = "Verderbter Brandungskriecher", + [3231] = "Verderbter Schaudermagenkrokilisk", + [3241] = "Savannenpatriarch", + [3243] = "Savannenhochmähne", + [3244] = "Großer Ebenenschreiter", + [3245] = "Störrischer Ebenenschreiter", + [3246] = "Flüchtiger Ebenenschreiter", + [3247] = "Donnerfalkenjungtier", + [3249] = "Großer Donnerfalke", + [3250] = "Silithidkrabbler", + [3252] = "Silithidschwärmer", + [3254] = "Sonnenschuppenschmetterschwanz", + [3255] = "Sonnenschuppenkreischer", + [3256] = "Sonnenschuppensensenklaue", + [3257] = "Ishamuhale", + [3281] = "Sarkoth", + [3415] = "Savannenjägerin", + [3416] = "Savannenmatriarchin", + [3424] = "Donnerfalkenwolkenkitzler", + [3425] = "Savannenstreuner", + [3461] = "Oasenschnappkiefer", + [3472] = "Washte Pawne", + [3475] = "Echeyakee", + [3503] = "Silithidbeschützer", + [3566] = "Flachlandstreuner", + [3581] = "Kanalbestie", + [3619] = "Geistersäbler", + [3630] = "Deviatwinder", + [3631] = "Deviatdornenpeitscher", + [3632] = "Deviatkrabbler", + [3633] = "Deviattöter", + [3634] = "Deviatpirscher", + [3636] = "Deviatverheerer", + [3637] = "Deviatwächter", + [3653] = "Kresh", + [3809] = "Eschentalbär", + [3810] = "Alter Eschentalbär", + [3811] = "Riesiger Eschentalbär", + [3812] = "Rasselnder Kriecher", + [3814] = "Stachelkriecher", + [3819] = "Wilddornpirscher", + [3820] = "Wilddorngiftspucker", + [3821] = "Wilddornlauerer", + [3823] = "Geisterpfotenläufer", + [3824] = "Geisterpfotenheuler", + [3825] = "Geisterpfotenalpha", + [3861] = "Düsterer Worg", + [3862] = "Sabbernder Worg", + [3866] = "Üble Fledermaus", + [3868] = "Blutsucher", + [4005] = "Kluftmooskrabbler", + [4006] = "Kluftmoosnetzweber", + [4007] = "Kluftmoosgiftspucker", + [4040] = "Höhlenpirscher", + [4067] = "Mondlichtläufer", + [4117] = "Wolkenschlange", + [4118] = "Giftige Wolkenschlange", + [4119] = "Alte Wolkenschlange", + [4124] = "Nadelpuma", + [4126] = "Klippenpirscher", + [4127] = "Fleischreißerhyäne", + [4128] = "Fleischreißerpirscher", + [4129] = "Fleischreißerkläffer", + [4139] = "Skorpidschrecken", + [4140] = "Skorpidhäscher", + [4142] = "Spiegelpanzerschildkröte", + [4143] = "Spiegelpanzerschnapper", + [4144] = "Spiegelpanzerbohrer", + [4154] = "Salzwüstenaasfresser", + [4158] = "Salzwüstengeier", + [4248] = "Pestfleckenhyäne", + [4249] = "Pestfleckenkläffer", + [4250] = "Rudelhund der Galak", + [4263] = "Kluftmoosjungtier", + [4264] = "Kluftmoosmatriarchin", + [4304] = "Scharlachroter Fährtenleserhund", + [4316] = "Rudelhund der Kolkar", + [4341] = "Staubsuhlerkrokilisk", + [4342] = "Staubsuhlerzwingenkiefer", + [4343] = "Staubsuhlerschnapper", + [4344] = "Scheckiger Staubsuhlerkrokilisk", + [4345] = "Staubsuhlerdolchrachen", + [4351] = "Blutsumpfraptor", + [4352] = "Blutsumpfkreischer", + [4355] = "Blutsumpfsensenklaue", + [4356] = "Blutsumpfscharfzahn", + [4357] = "Blutsumpfschmetterschwanz", + [4376] = "Graunebelspinne", + [4377] = "Graunebeljungtier", + [4378] = "Graunebeleremit", + [4379] = "Graunebelseidenspinner", + [4380] = "Graunebelwitwe", + [4396] = "Schlammpanzerschildkröte", + [4397] = "Dornenschlammpanzer", + [4398] = "Schlammpanzereinbuddler", + [4399] = "Schlammpanzerbohrer", + [4400] = "Schlammpanzerschnappkiefer", + [4411] = "Dunkelzahnlauerer", + [4412] = "Dunkelzahnkrabbler", + [4413] = "Dunkelzahnspinne", + [4414] = "Dunkelzahngiftspucker", + [4415] = "Riesige Dunkelzahnspinne", + [4425] = "Blinder Jäger", + [4511] = "Agam'ar", + [4512] = "Faulender Agam'ar", + [4514] = "Tobender Agam'ar", + [4538] = "Kralfledermaus", + [4539] = "Große Kralfledermaus", + [4548] = "Stahlbiss", + [4660] = "Skelettpfote der Maraudine", + [4662] = "Skelettpfote der Magram", + [4688] = "Skelettpfotenhyäne", + [4689] = "Verhungernde Skelettpfote", + [4690] = "Tollwütige Skelettpfote", + [4692] = "Schreckenssturzflieger", + [4693] = "Schreckensflieger", + [4694] = "Schreckensschlitzer", + [4695] = "Aasschrecken", + [4696] = "Skorpashischnapper", + [4697] = "Skorpashipeitscher", + [4699] = "Skorpashigiftpeitscher", + [4821] = "Huschendes Krustentier", + [4822] = "Schnappendes Krustentier", + [4823] = "Stacheliges Krustentier", + [4824] = "Fischschnapper von Aku'mai", + [4825] = "Schnappkiefer von Aku'mai", + [4841] = "Schlammwühler", + [4861] = "Würgerfledermaus", + [4887] = "Ghamoo-Ra", + [4950] = "Spot", + [5048] = "Deviatotter", + [5053] = "Deviatkrokilisk", + [5056] = "Deviatschreckensfang", + [5224] = "Düstergleiter", + [5225] = "Düsterspeier", + [5260] = "Groddocaffe", + [5262] = "Groddocdonnerer", + [5268] = "Eisenfellbär", + [5272] = "Grauer Eisenfellbär", + [5274] = "Eisenfellpatriarch", + [5286] = "Langzahnläufer", + [5287] = "Langzahnheuler", + [5288] = "Tollwütiger Langzahn", + [5291] = "Frostflügler der Hakkari", + [5307] = "Talkreischer", + [5308] = "Wilder Talkreischer", + [5349] = "Arash-ethis", + [5352] = "Silbergrimm der Weise", + [5356] = "Knurrer", + [5422] = "Skorpidjäger", + [5423] = "Skorpidschwanzpeitscher", + [5424] = "Skorpiddünenpirscher", + [5425] = "Verhungernde Eiterpfote", + [5426] = "Eiterpfotenhyäne", + [5427] = "Tollwütige Eiterpfote", + [5428] = "Roc", + [5429] = "Feuerroc", + [5430] = "Sengender Roc", + [5431] = "Brandungsgleiter", + [5432] = "Riesiger Brandungsgleiter", + [5708] = "Brut von Hakkar", + [5755] = "Deviatviper", + [5756] = "Deviatgiftschwinge", + [5762] = "Deviatmokassinschlange", + [5766] = "Savannenjunges", + [5807] = "Der Kratzer", + [5823] = "Todesschinder", + [5828] = "Humar der Rudellord", + [5829] = "Snort der Spucker", + [5834] = "Azzere die Himmelsklinge", + [5842] = "Takk der Springer", + [5856] = "Glasnetzspinne", + [5857] = "Sengende Lavaspinne", + [5858] = "Große Lavaspinne", + [5865] = "Dishu", + [5937] = "Übelstich", + [5982] = "Schwarzer Töter", + [5984] = "Verhungernder Kicherfang", + [5985] = "Kicherfanghyäne", + [5988] = "Skorpokstecher", + [5992] = "Aschmähneneber", + [6013] = "Entflogener Bussard", + [6352] = "Korallenpanzerschleicher", + [6369] = "Korallenpanzerschildkröte", + [6505] = "Ravasaurus", + [6506] = "Ravasaurusläufer", + [6507] = "Ravasaurusjäger", + [6508] = "Gifthautravasaurus", + [6513] = "Stampfer von Un'Goro", + [6514] = "Gorilla von Un'Goro", + [6516] = "Donnerer von Un'Goro", + [6581] = "Ravasaurusmatriarchin", + [6585] = "Uhk'loc", + [6788] = "Höhlenmutter", + [6789] = "Distelbärjunges", + [7022] = "Giftpeitscherskorpid", + [7055] = "Worg des Schwarzfels", + [7078] = "Kluftskorpid", + [7097] = "Eisenschnabeleule", + [7098] = "Eisenschnabelkreischer", + [7099] = "Eisenschnabeljäger", + [7268] = "Wächter der Sandwüter", + [7319] = "Lady Sathrah", + [7405] = "Tödlicher Kluftskorpid", + [7430] = "Junger Frostsäbler", + [7431] = "Frostsäbler", + [7432] = "Frostsäblerpirscherin", + [7433] = "Frostsäblerjägerin", + [7434] = "Rudelbehüterin der Frostsäbler", + [7443] = "Splitterzahnraufer", + [7444] = "Splitterzahnbär", + [7445] = "Alter Splitterzahn", + [7446] = "Tollwütiger Splitterzahn", + [7455] = "Winterquelleule", + [7456] = "Winterquellkreischer", + [7803] = "Dünenbuddlerskorpid", + [8207] = "Glutschwinge", + [8208] = "Mordlustige Eiterpfote", + [8211] = "Klippenspringer", + [8213] = "Eisenpanzer", + [8277] = "Rekk'tilac", + [8299] = "Fledderschnabel", + [8300] = "Verheerer", + [8301] = "Clack der Häscher", + [8303] = "Suhlaman", + [8336] = "Pionier der Hakkari", + [8600] = "Seuchenfledermaus", + [8601] = "Giftige Seuchenfledermaus", + [8602] = "Monströse Seuchenfledermaus", + [8762] = "Baumspinnereremit", + [8926] = "Tiefstecher", + [8927] = "Dunkelkreischer", + [8933] = "Höhlenkrabbler", + [8956] = "Wutklauenbär", + [8958] = "Wutklauenraufer", + [8959] = "Teufelspfotenwolf", + [8960] = "Teufelspfotenaasfresser", + [8961] = "Teufelspfotenverheerer", + [9416] = "Worg der Schmetterschilde", + [9622] = "U'cha", + [9683] = "Lar'korwis Weibchen", + [9684] = "Lar'korwi", + [9690] = "Glutworg", + [9691] = "Giftstichskorpid", + [9694] = "Sabbernder Glutworg", + [9695] = "Todespeitschenskorpid", + [9696] = "Worg der Blutäxte", + [9697] = "Riesiger Glutworg", + [9698] = "Feuerschwanzskorpid", + [10077] = "Totenreißer", + [10200] = "Rak'shiri", + [10221] = "Worgwelpe der Blutäxte", + [10356] = "Bayne", + [10357] = "Ressan der Aufstachler", + [10359] = "Sri'skulk", + [10375] = "Spitzenspinnling", + [10644] = "Nebelheuler", + [10737] = "Shy-Rotam", + [10741] = "Sian-Rotam", + [10806] = "Ursius", + [10882] = "Arikara", + [10981] = "Frostwolf", + [11357] = "Sohn von Hakkar", + [11360] = "Zulianisches Junges", + [11361] = "Zulianischer Tiger", + [11365] = "Zulianischer Panther", + [11368] = "Blutsucherfledermaus", + [11370] = "Razzashibrutwitwe", + [11371] = "Razzashischlange", + [11372] = "Razzashiotter", + [11735] = "Steinpanzerskorpid", + [11736] = "Steinpanzerzange", + [11737] = "Steinpanzerschinder", + [11738] = "Sandhuscher", + [11739] = "Felspirscher", + [11921] = "Besseleth", + [12037] = "Ursol'lok", + [12431] = "Blutmaul", + [12432] = "Zwingenkiefer", + [12433] = "Krethis Schattennetz", + [13599] = "Phlegmatischer Schnappkiefer", + [14123] = "Stahlkieferschnapper", + [14222] = "Araga", + [14223] = "Benj der Missmutige", + [14228] = "Kicherer", + [14232] = "Pfeil", + [14233] = "Reißerschuppe", + [14234] = "Hayoc", + [14266] = "Shanda die Weberin", + [14268] = "Lord Condar", + [14279] = "Kriechfänger", + [14280] = "Der Große Samras", + [14283] = "Eule der Sturmlanzen", + [14339] = "Todesheuler", + [14343] = "Olm der Weise", + [14344] = "Mongress", + [14472] = "Gretheer", + [14476] = "Krellack", + [14491] = "Kurmokk", + [14532] = "Razzashigiftbrut", + [14821] = "Razzashiraptor", + [14965] = "Rasende Blutsucherfledermaus", + [15041] = "Brut von Mar'li", + [15043] = "Zulianischer Krokilisk", + [15101] = "Zulianischer Streuner", + [16117] = "Verseuchtes Schwein", + [36507] = "Fleck", + [36514] = "Frostsäblerjunges", + [37007] = "Black Widow Hatchling", + [40000] = "Roter Fuchs", + [50624] = "Silithidschwärmer", + [50627] = "Silithidschwärmer", + [50630] = "Silithidschwärmer", + [60494] = "Kummerklaue", + [60697] = "Beruhigungshund", + [60848] = "Eber der Borstennacken", + [61074] = "Gorilla der Hochtalfeste", + [61075] = "Felsenschalenkrabbler", + [61076] = "Sandschalenkrabbler", + [61077] = "Schimpanse der Hochtalfeste", + [61078] = "Affe der Hochtalfeste", + [61080] = "Älterer Gorilla des Hochtals", + [61082] = "Donnerschreiter der Hochtalfeste", + [61090] = "Bürstenschwanz Kobra", + [61091] = "Bürstenschwanz Natter", + [61095] = "Giftpeitscher Schreier", + [61096] = "Giftpeitscher Schlange", + [61098] = "König Morogo Donnerfuß", + [61206] = "Spinnenkrabbler Kriecher", + [61218] = "Deviat Windschlangenschlüpfling", + [61227] = "Dämmerpelz Schleicher", + [61228] = "Dämmerpelz Pirscher", + [61229] = "Ausgehungerter Dämmerpelz", + [61230] = "Pestschwingen Fledermausjunges", + [61231] = "Pestschwingen Fledermaus", + [61232] = "Düsternetz Spinne", + [61233] = "Düsternetz Giftspucker", + [61336] = "Großhorn Eule", + [61337] = "Großhorn Jäger", + [61401] = "Große Schreckensschwinge", + [61488] = "Azurenschnabel", + [61500] = "Silberrücken von Hochtal", + [61552] = "Abendkrabbler", + [61554] = "Morgengeheul", + [61599] = "Dunkelsäbel", + [61656] = "Aschenfeder Bussard", + [61657] = "Aschenfeder Stürmer", + [61658] = "Hyäne der Aschenpfoten", + [61659] = "Jäger der Aschenpfoten", + [61660] = "Steinschwanz Skorpid", + [61661] = "Steinschwanz Peitscher", + [61662] = "Schwarzgift Skorpid", + [61680] = "Schlammriff Kriecher", + [61681] = "Junger Schlammriff Kriecher", + [61686] = "Aschenfeder Plünderer", + [61689] = "Junger Thalassischer Eber", + [61690] = "Junger Karmesinroter Luchs", + [61691] = "Wald Falkenschreiter", + [61692] = "Thalassischer Eber", + [61693] = "Karmesinroter Luchs", + [61695] = "Elfenbein Falkenschreiter", + [61696] = "Älterer Thalassischer Eber", + [61697] = "Leuchtluchs", + [61698] = "Leuchtluchs Matriarchin", + [61699] = "Shar'lan", + [61700] = "Älterer Karmesinroter Luchs", + [61704] = "Kriecher der Weltenwanderer", + [61716] = "Karmesinroter Falkenschreiter", + [61717] = "Thalassischer Fuchs", + [61774] = "Brillanter Manawyrm", + [61775] = "Smaragd Manawyrm", + [61776] = "Lavendel Manawyrm", + [61789] = "Mondfeder", + [61975] = "Hochhauer Eber", + [62066] = "Höhlenweber Brutmutter", + [62073] = "Höhlenweber Spinne", + [62074] = "Höhlenweber Kriecher", + [62075] = "Höhlenweber Giftspucker", + [62121] = "Goldborsten Eber", + [62122] = "Stämmiger Goldborsten Eber", + [62123] = "Goldpelz Bär", + [62124] = "Goldpelz Grizzly", + [62125] = "Älterer Timberwolf", + [62126] = "Timberwolf Alpha", + [62223] = "Grimmschuppenraptor", + [62224] = "Grimmschuppenkreischer", + [62225] = "Grimmschuppenprügler", + [62226] = "Steinhautkeiler", + [62227] = "Alter Steinhauteber", + [62247] = "Braune Einsiedlerspinne", + [62248] = "Große Braune Einsiedlerspinne", + [62256] = "Klarwasser Schnappkiefer", + [62257] = "Kranker Klarwasser Schnappkiefer", + [62258] = "Scharfzahn Krokilisk", + [62259] = "Riesiger Scharfzahn Krokilisk", + [62260] = "Waldeber", + [62261] = "Alter Waldeber", + [62262] = "Hochebenen Eber", + [62271] = "Junger Goldborsten Eber", + [62272] = "Junger Waldwolf", + [62338] = "Sturmflügel Bussard", + [62339] = "Sturmflügel Aasgeier", + [62340] = "Zerzauster Felsspitzenkoyote", + [62341] = "Sabbernder Felsspitzenkoyote", + [62342] = "Nebelrinden Spinne", + [62343] = "Nebelrinden Netzwirkerin", + [62344] = "Mutter Nebelrinde", + [62345] = "Trauermoor Krokilisk", + [62642] = "Klingenschuppe", + [80250] = "Karmesinroter Luchs", + [80252] = "Junger Arktisfuchs", + [80254] = "Junger Brauner Fuchs", + [80256] = "Silberfuchs", + [80257] = "Roter Fuchs", + [80258] = "Junger Nebelwolf", + [80259] = "Nebelwolf", + [80260] = "Geisterfuchs", + [80466] = "Tirisfal Pestbär", + [80815] = "Amaniadler", + [80816] = "Hinterlandadler", + [80920] = "Amani Adler", + [90980] = "Zulianischer Panther", + [90981] = "Zulianischer Panther", + [91819] = "Hazzuri Tiger", + [91825] = "Junger Bengal Tiger", + [91826] = "Bengal Matriarchin", + [91827] = "Bengal Tiger", + [91828] = "Bengal Alpha", + [91829] = "Dschungelrücken Stampfer", + [91830] = "Dschungelrücken Schläger", + [91831] = "Leuchtkrabbler", + [91832] = "Inselkneifer", + [91833] = "Felskrabbler", + [91838] = "Tiefenschalen Schnapper", + [91960] = "Dschungelpranken Tiger", + [91961] = "Dschungelpranken Schattentiger", + [91962] = "Salzschnapp Krokilisk", + [91966] = "Giftige Dschungelschlange", + [91984] = "Tirisklaue Bär", + [91985] = "Tirisklaue Junges", + [91987] = "Felshauer Eber", + [91989] = "Graupfoten Wolf", + [91990] = "Graupfoten Alpha", + [92115] = "Rasende Scharfklaue", + [92146] = "Strandkrabbler", + [92147] = "Silberküstenkrabbler", +} diff --git a/locales/data/beasts/enUS.lua b/locales/data/beasts/enUS.lua new file mode 100644 index 0000000..2ea544b --- /dev/null +++ b/locales/data/beasts/enUS.lua @@ -0,0 +1,9 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +-- Intentionally left empty by default. +-- enUS beast names are lazy-bootstrapped from MTH_DS_Beasts at runtime, +-- and this table can still be used for manual ID overrides when needed. +MTH_LocaleData.data.beasts.enUS = { +} diff --git a/locales/data/beasts/esES.lua b/locales/data/beasts/esES.lua new file mode 100644 index 0000000..e830a57 --- /dev/null +++ b/locales/data/beasts/esES.lua @@ -0,0 +1,713 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +MTH_LocaleData.data.beasts.esES = { + [30] = "Araña del Bosque", + [43] = "Araña Minera", + [69] = "Lobo Maderero", + [113] = "Jabalí Colmipétreo", + [118] = "Merodeador", + [119] = "Morrolargo", + [154] = "Desgarrador Mayor", + [157] = "Dentosangre", + [199] = "Desgarrador Joven", + [213] = "Lobo Feroz Hambriento", + [217] = "Telarácnida Venenosa", + [299] = "Lobo Joven", + [330] = "Princesa", + [345] = "Panzallena", + [390] = "Séquito Porcino", + [428] = "Cóndor Temible", + [442] = "Tarantula", + [454] = "Dentosangre Joven", + [462] = "Vultros", + [471] = "Madre Colmillo", + [505] = "Tarántula Superior", + [521] = "Lupos", + [524] = "Jabalí Pielroca", + [525] = "Lobo Sarnoso", + [539] = "Telarácnida Pigmeovenenosa", + [547] = "Gran Dentosangre", + [565] = "Lobo Temible Rabioso", + [569] = "Ermitaña Verde", + [574] = "Naraxis", + [616] = "Parloteador", + [628] = "Devastador Negro", + [681] = "Tigre Joven de Tuercespina", + [682] = "Tigre de Tuercespina", + [683] = "Pantera Joven", + [684] = "Pantera Faucesombría", + [685] = "Raptor de Tuercespina", + [686] = "Raptor Colazote", + [687] = "Acechador de la Selva", + [704] = "Lobo Gris Pulgoso", + [705] = "Lobo Joven Harapiento", + [708] = "Jabalí del Peñasco Pequeño", + [728] = "Bhag'thera", + [729] = "Sin'Dall", + [730] = "Tethis", + [731] = "Rey Bangalash", + [736] = "Pantera", + [767] = "Jaguar del Pantano", + [768] = "Pantera de las Sombras", + [769] = "Tarántula Golpe Mortal", + [772] = "Tigresa de Tuercespina", + [822] = "Oso del Bosque Joven", + [830] = "Reptador de Arena", + [831] = "Reptador Marino", + [833] = "Coyote Líder", + [834] = "Coyote", + [854] = "Acechador de la Jungla Joven", + [855] = "Raptor de la Vega de Tuercespina Joven", + [856] = "Raptor Cola de Látigo Joven", + [858] = "Tejedor de la Penumbra", + [922] = "Reptador de Cieno", + [923] = "Devastador Negro Joven", + [930] = "Prole de Viuda Negra", + [949] = "Recluso Carroñero", + [976] = "Médico Brujo Kurzen", + [977] = "Tigre de Guerra Kurzen", + [1015] = "Raptor de las Tierras Altas", + [1016] = "Colazote de las Tierras Altas", + [1017] = "Garfiohoz de las Tierras Altas", + [1018] = "Fauzafilo de las Tierras Altas", + [1019] = "Fauces Navaja Ancianas", + [1020] = "Raptor Moteado", + [1021] = "Chillón Moteado", + [1022] = "Garfiohoz Moteado", + [1023] = "Fauzafilada Moteado", + [1082] = "Crocolisco Dientesierra", + [1084] = "Crocolisco Dientes de Sierra Joven", + [1087] = "Triturador Dientesierra", + [1088] = "Reptador Monstruoso", + [1108] = "Gorila del Valle de la Niebla", + [1109] = "Desgarrador", + [1111] = "Acechador de Sanguijuelas", + [1112] = "Viuda Sanguijuela", + [1114] = "Tronador de la Jungla", + [1125] = "Jabalí del Risco", + [1126] = "Jabalí de Peñasco Grande", + [1127] = "Jabalí del Risco Anciano", + [1128] = "Oso Negro Joven", + [1129] = "Oso Negro", + [1130] = "Bjarn", + [1131] = "Lobo Invernal", + [1132] = "Maderero", + [1133] = "Lobo Invernal Hambriento", + [1138] = "Lobo Rastreador de Nieve", + [1140] = "Matriarca Tajobuche", + [1150] = "Crocolisco de Río", + [1152] = "Cocodrilo Quijada", + [1184] = "Acechador del Risco", + [1185] = "Acechador de Madera", + [1186] = "Oso Negro Anciano", + [1188] = "Oso Negro Canoso", + [1189] = "Patriarca Oso Negro", + [1190] = "Jabalí de Montaña", + [1191] = "Jabalí de Montaña Harapiento", + [1192] = "Jabalí Montés Mayor", + [1194] = "Buitre de Montaña", + [1195] = "Acechador del Bosque", + [1196] = "Oso Garra de Hielo", + [1199] = "Leopardo de las Nieves Joven", + [1201] = "Leopardo de Nieve", + [1216] = "Reptador de la Costa", + [1225] = "Viejo Sooty", + [1258] = "Masadura Nicroyermo", + [1400] = "Crocolisco de Humedales", + [1417] = "Crocolisco Joven de los Humedales", + [1504] = "Nocturácnida Joven", + [1505] = "Araña Nocturácnida", + [1508] = "Carroñero Joven", + [1509] = "Carroñero Andrajoso", + [1511] = "Gorila Lomoplata Iracundo", + [1512] = "Murciumbrío", + [1513] = "Murciumbrío Sarnoso", + [1516] = "Konda", + [1547] = "Can Oscuro Decrépito", + [1548] = "Can Oscuro Maldito", + [1549] = "Can Oscuro Voraz", + [1553] = "Murciumbrío Superior", + [1554] = "Murciumbrío Vampírico", + [1555] = "Nocturácnida Sañosa", + [1557] = "Gorila Del Valle Velo de Bruma Viejo", + [1558] = "Patriarca Lomoplata", + [1688] = "Matriarca Nocturácnida", + [1689] = "Jabalí Del Risco Cicatríceo", + [1693] = "Crocolisco del Lago", + [1713] = "Pantera Faucesombría Vieja", + [1765] = "Huargo", + [1766] = "Huargo Jaspeado", + [1778] = "Oso Grisáceo Feroz", + [1780] = "Acechamusgo", + [1781] = "Trepanieblas", + [1797] = "Oso Grisáceo Gigante", + [1809] = "Buitre Carroñero", + [1815] = "Oso Negro Malsano", + [1816] = "Pardo Malsano", + [1817] = "Lobo Malsano", + [1822] = "Rondador NeboVenenoso", + [1824] = "Rondador de Peste", + [1922] = "Lobo Grisáceo Del Bosque", + [1923] = "Huargo Sangrocico", + [1961] = "Sarnagarra", + [1984] = "Joven Jabalí Cardo", + [1985] = "Jabalí Cardo", + [1986] = "Araña Tejemadera", + [1994] = "Githyiss la Vil", + [1995] = "Lechuza Estrígida", + [1996] = "Estridador Estrígido", + [1997] = "Cazador Estrígido", + [1998] = "Rondador Tejemadera", + [1999] = "Venolmillo Tejemadera", + [2000] = "Virasedal Tejemadera", + [2001] = "Araña Tejemadera Gigante", + [2031] = "Sable de la Noche Joven", + [2032] = "Sable de la Noche Sarnoso", + [2033] = "Sable de la Noche Mayor", + [2034] = "Sable de la Noche Salvaje", + [2042] = "Sable de la Noche", + [2043] = "Acechador Sable de la Noche", + [2069] = "Acechalunas", + [2070] = "Cachorro Acechalunas", + [2071] = "Matriarca Acechalunas", + [2089] = "Crocolisco Gigante de Los Humedales", + [2163] = "Oso Cardo", + [2165] = "Oso Cardo Grisáceo", + [2172] = "Zancador Pedalar", + [2175] = "Garrasombría", + [2231] = "Corremareas Marepígmeo", + [2232] = "Corremareas", + [2233] = "Corremareas Escamado", + [2234] = "Joven Reptador Correarrecifes", + [2235] = "Correarrecifes", + [2236] = "Reptador Correarrecifes Enfurecido", + [2237] = "Señor Acechalunas", + [2275] = "Stanley Enfurecido", + [2321] = "Fugalante Zancudo Del Bosque", + [2322] = "Zancudo Del Bosque", + [2323] = "Zancudo Del Bosque Gigante", + [2348] = "Trepamusgo Mayor", + [2349] = "Trepamusgo Gigante", + [2350] = "Trepamusgo Del Bosque", + [2351] = "Oso Gris", + [2354] = "Oso Gris Sañoso", + [2356] = "Oso Gris Viejo", + [2384] = "León de Montaña Famélico", + [2385] = "León de Montaña Feral", + [2406] = "León de Montaña", + [2407] = "León de Montaña Descomunal", + [2408] = "Quijaforte", + [2476] = "Gran Crocolisco del Lago", + [2505] = "Quijaforte Marino", + [2521] = "Gorila Cieloleno", + [2522] = "Acechador Jaguero", + [2544] = "Reptador de Las Arenas Del Sur", + [2559] = "Zancudo de las Tierras Altas", + [2560] = "Vándalo de las Tierras Altas", + [2561] = "Acechacarne de las Tierras Altas", + [2563] = "Trepador de Las Llanuras", + [2565] = "Trepador de Las Llanuras Gigante", + [2578] = "Águila Ratonera de Mesa Joven", + [2579] = "Águila Ratonera Mesa", + [2580] = "Águila Ratonera de Mesa Mayor", + [2635] = "Crocolisco Marino Mayor", + [2680] = "Lobato Vilrama", + [2681] = "Lobo de Montar Vilrama", + [2686] = "Guardia Del Linaje Secacorteza", + [2727] = "Coyote del Risco", + [2728] = "Coyote de Risco Feral", + [2729] = "Coyote del Risco Mayor", + [2730] = "Coyote del Risco Rabioso", + [2731] = "Acechador de la Cresta", + [2732] = "Cazadora de la Cresta", + [2734] = "Patriarca Acechador de la Cresta", + [2753] = "Barnabus", + [2829] = "Águila Ratonera Hambrienta", + [2830] = "Águila Ratonera", + [2831] = "Águila Ratonera Gigante", + [2850] = "Diente Partido", + [2923] = "Melenargenta Sarnoso", + [2924] = "Lobo Melenargenta", + [2925] = "Aullador Melenargenta", + [2926] = "Acechador Melenargenta", + [2931] = "Zaricotl", + [2954] = "Jabaguerrero Lomopelo", + [2955] = "Zancudo de Llanura", + [2956] = "Zancudo de Llanura Adulto", + [2957] = "Zancudo de Llanura Viejo", + [2958] = "Lobo de Pradera", + [2959] = "Acechador de Pradera", + [2960] = "Lobo Alfa de Pradera", + [2961] = "Puma Montés", + [2966] = "Jabaguerrero", + [2969] = "Aguilón Nervudo", + [2970] = "Aguilón", + [2971] = "Aguilón Garrudo", + [3035] = "Puma de las Estepas", + [3068] = "Mazzranache", + [3098] = "Jabalí Jaspeado", + [3099] = "Jabalí Jaspeado Temible", + [3100] = "Jabalí Jaspeado Mayor", + [3106] = "Reptador de la Superficie Pigmeo", + [3107] = "Reptador de Espuma", + [3108] = "Reptador de Espuma Escamado", + [3110] = "Crocolisco Fauzatroz", + [3121] = "Tigre de Durotar", + [3122] = "Colazote Garrasangre", + [3123] = "Rojomorro Garrasangre", + [3124] = "Trabajador Escórpido", + [3125] = "Escórpido Castañeante", + [3126] = "Escórpido Acorazado", + [3127] = "Escórpido Venocola", + [3225] = "Jabalí Jaspeado Corrupto", + [3226] = "Escórpido Corrupto", + [3227] = "Rojomorro Garrasangre Corrupto", + [3228] = "Reptador de Oleaje Corrupto", + [3231] = "Crocolisco Fauzatroz Corrupto", + [3241] = "Patriarca de Sabana", + [3243] = "Crinalta de la Sabana", + [3244] = "Zancudo de Llanura Superior", + [3245] = "Zancudo de Llanura Arisco", + [3246] = "Zancudo Veloz de Llanura", + [3247] = "Prole de Halcón Trueno", + [3249] = "Halcón Trueno Superior", + [3250] = "Trepador Silítido", + [3252] = "Enjambre Silítido", + [3254] = "Colazote Solescama", + [3255] = "Estridador Solescama", + [3256] = "Segador Solescama", + [3257] = "Ishamuhale", + [3281] = "Sarkoth", + [3415] = "Cazadora de Sabana", + [3416] = "Matriarca de Sabana", + [3424] = "Halcón Trueno Desechanube", + [3425] = "Merodeador de Sabana", + [3461] = "Quijaforte del Oasis", + [3472] = "Washte Pawne", + [3475] = "Echeyakee", + [3503] = "Protector Silítido", + [3566] = "Merodeador de Llanuras", + [3581] = "Bestia de Alcantarilla", + [3619] = "Sable Fantasma", + [3630] = "Volutador Descarriado", + [3631] = "Aguijolatigador Descarriado", + [3632] = "Trepador Descarriado", + [3633] = "Destripador Descarriado", + [3634] = "Acechador Descarriado", + [3636] = "Devastador Descarriado", + [3637] = "Guardián Descarriado", + [3653] = "Kresh", + [3809] = "Oso de Vallefresno", + [3810] = "Oso Viejo de Vallefresno", + [3811] = "Oso Gigante de Vallefresno", + [3812] = "Reptador Castañeante", + [3814] = "Reptador Espinado", + [3819] = "Acechador Espinaferal", + [3820] = "EscupeVeneno Espinaferal", + [3821] = "Rondador Espinaferal", + [3823] = "Corredor Garraespectro", + [3824] = "Aullador Garraespectro", + [3825] = "Alfa Garraespectro", + [3861] = "Huargo Lóbrego", + [3862] = "Huargo Babeante", + [3866] = "Murciovil", + [3868] = "Rastreasangre", + [4005] = "Trepador Musgondo", + [4006] = "Tejerred Musgondo", + [4007] = "EscupeVeneno Musgondo", + [4040] = "Acechador de Cuevas", + [4067] = "Corredor Crepuscular", + [4117] = "Serpiente Nubosa", + [4118] = "Serpiente Nubosa Venenosa", + [4119] = "Serpiente Nubosa Anciana", + [4124] = "Puma de las Agujas", + [4126] = "Acechador del Risco", + [4127] = "Hiena Dentecenado", + [4128] = "Acechador Dentecenado", + [4129] = "Gruñidor Dentecenado", + [4139] = "Terror Escórpido", + [4140] = "Atracador Escórpido", + [4142] = "Tortuga Caparallante", + [4143] = "Sacudidor Caparallante", + [4144] = "Cavapozos Caparallante", + [4154] = "Carroñero del Desierto de Sal", + [4158] = "Buitre del Desierto de Sal", + [4248] = "Hiena Pestillejo", + [4249] = "Gruñidor Pestillejo", + [4250] = "Can de Manada Galak", + [4263] = "Prole de Musgondo", + [4264] = "Matriarca Musgondo", + [4304] = "Sabueso Escarlata", + [4316] = "Can de Manada Kolkar", + [4341] = "Crocolisco Secorrón", + [4342] = "Mentovilo Secorrón", + [4343] = "Sacudidor Secorrón", + [4344] = "Crocolisco Secorrón Jaspeado", + [4345] = "Faucedaga Secorrón", + [4351] = "Raptor Cienorrojo", + [4352] = "Estridador Cienorrojo", + [4355] = "Segador Cienorrojo", + [4356] = "Tajobuche Cienorrojo", + [4357] = "Colazote Cienorrojo", + [4376] = "Araña Niebla Negra", + [4377] = "Rondadora Niebla Negra", + [4378] = "Ermitaña Niebla Negra", + [4379] = "Virasedal Niebla Negra", + [4380] = "Viuda Niebla Negra", + [4396] = "Tortuga Fangorroca", + [4397] = "Caparapico Fangorroca", + [4398] = "Hurgador Fangorroca", + [4399] = "Cavapozos Fangorroca", + [4400] = "Quijaforte Fangorroca", + [4411] = "Rondador Colmilloumbrío", + [4412] = "Trepador Colmilloumbrío", + [4413] = "Araña Colmilloumbrío", + [4414] = "EscupeVeneno Colmilloumbrío", + [4415] = "Araña Colmilloumbrío Gigante", + [4425] = "Cazador ciego", + [4511] = "Agam'ar", + [4512] = "Agam'ar Putrefacto", + [4514] = "Agam'ar Enfurecido", + [4538] = "Murciélago del Horado", + [4539] = "Murciélago del Horado Superior", + [4548] = "Metaleador", + [4660] = "Zarpósea Maraudine", + [4662] = "Zarpósea Maggram", + [4688] = "Hiena Zarpósea", + [4689] = "Zarpósea Famélica", + [4690] = "Zarpósea Rabiosa", + [4692] = "Aguilón Aterrador", + [4693] = "Volater Aterrador", + [4694] = "Desgarrador Aterrador", + [4695] = "Horror Carroñero", + [4696] = "Sacudidor Scorpashi", + [4697] = "Azotador Scorpashi", + [4699] = "LatiVenenoso Scorpashi", + [4821] = "Crustarácnido", + [4822] = "Crustáceo Mordedor", + [4823] = "Crustáceo Espinoso", + [4824] = "Pescador Aku'mai", + [4825] = "Quijaforte Aku'mai", + [4841] = "Lodomuerto", + [4861] = "Alcaudociélago", + [4887] = "Ghamoo-ra", + [4950] = "Mancha", + [5048] = "Víbora Descarriada", + [5053] = "Crocolisco Descarriado", + [5056] = "Colminferno Descarriado", + [5224] = "Deslizador de la Oscuridad", + [5225] = "Escupidor de la Oscuridad", + [5260] = "Simio Groddoc", + [5262] = "Tronador Groddoc", + [5268] = "Oso Cueracero", + [5272] = "Oso Cueracero Grisáceo", + [5274] = "Patriarca Cueracero", + [5286] = "Corredor Dientelargo", + [5287] = "Aullador Dientelargo", + [5288] = "Dientelargo Rabioso", + [5291] = "Alaescarcha Hakkari", + [5307] = "Estridador del Valle", + [5308] = "Estridador del Valle Huido", + [5349] = "Arash-ethis", + [5352] = "Viejo Tripasgrises", + [5356] = "Gruñidor", + [5422] = "Cazador Escórpido", + [5423] = "Colazote Escórpido", + [5424] = "Acechadunas Escórpido", + [5425] = "Llagapata Hambrienta", + [5426] = "Hiena Llagapata", + [5427] = "Llagapata Rabiosa", + [5428] = "Roc", + [5429] = "Roc de Fuego", + [5430] = "Roc Abrasador", + [5431] = "Planoleador", + [5432] = "Planoleador Gigante", + [5708] = "Engendro de Hakkar", + [5755] = "Víbora Descarriada", + [5756] = "Venala Descarriada", + [5762] = "Mocasin Descarriado", + [5766] = "Cachorro de la Sabana", + [5807] = "El Rastrillo", + [5823] = "Despellejador de la Muerte", + [5828] = "Humar el Señor Orgulloso", + [5829] = "Bufo el Molesto", + [5834] = "Azzere el Filo del Cielo", + [5842] = "Takk el Saltarín", + [5856] = "Araña Cristalderma", + [5857] = "Lavaraña Abrasadora", + [5858] = "Lavaraña Superior", + [5865] = "Dishu", + [5937] = "Aguijón Vil", + [5982] = "Destripador Negro", + [5984] = "Hiena Risitas Hambrienta", + [5985] = "Hiena Risitas", + [5988] = "Aguijonero Scorpok", + [5992] = "Jabalí Cenicrín", + [6013] = "Águila Ratonera Guardapaso", + [6352] = "Rondador Corazacoral", + [6369] = "Tortuga Corazacoral", + [6505] = "Ravasaurio", + [6506] = "Corredor Ravasaurio", + [6507] = "Cazador Ravasaurio", + [6508] = "Ravasaurio Pellejo Venenoso", + [6513] = "Vapuleador de Un'Goro", + [6514] = "Gorila de Un'Goro", + [6516] = "Tronador de Un'Goro", + [6581] = "Matriarca Ravasaurio", + [6585] = "Uhk'loc", + [6788] = "Madre del Cubil", + [6789] = "Cachorro Cardo", + [7022] = "Escórpido LatiVenenoso", + [7055] = "Huargo Roca Negra", + [7078] = "Escórpido de la Grieta", + [7097] = "Lechuza Cortezaférrea", + [7098] = "Estridador Cortezaférrea", + [7099] = "Cazador Cortezaférrea", + [7268] = "Guardián Furiarena", + [7319] = "Lady Sathrah", + [7405] = "Escórpido Del Risco Mortal", + [7430] = "Cachorro de Sable de Escarcha", + [7431] = "Sable de Hielo", + [7432] = "Acechador Sable de Hielo", + [7433] = "Cazadora Sable de Hielo", + [7434] = "Vigía Del Orgullo Sable de Hielo", + [7443] = "Aplastador Dentoesquirla", + [7444] = "Oso Dentoesquirla", + [7445] = "Ancestro Dentoesquirla", + [7446] = "Dentoesquirla Rabioso", + [7455] = "Lechuza de Cuna Del Invierno", + [7456] = "Estridador de Cuna Del Invierno", + [7803] = "Perforadunas Escórpido", + [8207] = "Pájaro de Fuego Mayor", + [8208] = "Llagapata Mortífera", + [8211] = "Viejo Saltariscos", + [8213] = "Espaldacerada", + [8277] = "Rekk'tilac", + [8299] = "Escupetripas", + [8300] = "Devastatia", + [8301] = "Clack el Atracador", + [8303] = "Gruñón", + [8336] = "Zapador Hakkari", + [8600] = "Murcipeste", + [8601] = "Murcipeste Nocivo", + [8602] = "Murcipeste Monstruoso", + [8762] = "Ermitaña Telamadera", + [8926] = "Aguijonero Profundo", + [8927] = "Estridador Sombrío", + [8933] = "Trepador de Cuevas", + [8956] = "Oso Zarpira", + [8958] = "Aplastador Zarpira", + [8959] = "Lobo Zarpayel", + [8960] = "Carroñero Zarpayel", + [8961] = "Devastador Zarpayel", + [9416] = "Huargo del Escudo del Estigma", + [9622] = "U'cha", + [9683] = "Compañera de Lar'Korwi", + [9684] = "Lar'korwi", + [9690] = "Huargo Brasal", + [9691] = "Escórpido Venopunta", + [9694] = "Huargo Brasal Esclavizante", + [9695] = "Escórpido Latimorte", + [9696] = "Huargo Hacha de Sangre", + [9697] = "Huargo Brasal Gigante", + [9698] = "Escórpido Colafuego", + [10077] = "Morifauces", + [10200] = "Rak'shiri", + [10221] = "Mascolupo Hacha de Sangre", + [10356] = "Bayne", + [10357] = "Ressan el Enfilador", + [10359] = "Sri'skulk", + [10375] = "Arañita de la Cumbre", + [10644] = "Aullanieblas", + [10737] = "Vergonzoso-Rotam", + [10741] = "Sian-Rotam", + [10806] = "Ursius", + [10882] = "Arikara", + [10981] = "Lobo Gélido", + [11357] = "Hijo de Hakkar", + [11360] = "Cachorro Zulian", + [11361] = "Tigre Zulian", + [11365] = "Tigre Zuliano", + [11368] = "Murciélago Buscasangre", + [11370] = "Proleviuda Razzashi", + [11371] = "Serpiente Razzashi", + [11372] = "Víbora Razzashi", + [11735] = "Escórpido Latipiedra", + [11736] = "Tenazario Latipiedra", + [11737] = "Despellejador Latipiedra", + [11738] = "Arácnido de Arena", + [11739] = "Acecharrocas", + [11921] = "Besseleth", + [12037] = "Ursol'lok", + [12431] = "Mandisangre", + [12432] = "Viejo Malafauce", + [12433] = "Krethis Sombravolta", + [13599] = "Quijaforte Imperturbable", + [14123] = "Sacudidor Quijacero", + [14222] = "Araga", + [14223] = "Cascarrabias Ben", + [14228] = "Giggler", + [14232] = "Dardo", + [14233] = "Rasgascama", + [14234] = "Hayoc", + [14266] = "Shanda la Giratoria", + [14268] = "Lord Condar", + [14279] = "Trepazoso", + [14280] = "Gran Samras", + [14283] = "Lechuza Pico Tormenta", + [14339] = "Aullador de la Muerte", + [14343] = "Olm el Sabio", + [14344] = "Mongress", + [14472] = "Gretheer", + [14476] = "Krellack", + [14491] = "Kurmokk", + [14532] = "Venenoso Razzashi", + [14821] = "Raptor Razzashi", + [14965] = "Murciélago Procurasangre Demenciado", + [15041] = "Alevín de Mar'li", + [15043] = "Crocolisco Zulian", + [15101] = "Merodeador Zulian", + [16117] = "Cerdo Infestado", + [36507] = "Mancha", + [36514] = "Cachorro de Sable de Escarcha", + [37007] = "Prole de Viuda Negra", + [40000] = "Zorro Rojo", + [50624] = "Enjambre Silítido", + [50627] = "Enjambre Silítido", + [50630] = "Enjambre Silítido", + [60494] = "Zarpa de Pesar", + [60697] = "Can de la Calma", + [60848] = "Jabalí Lomopelo", + [61074] = "Gorila de Valalto", + [61075] = "Reptador Caparazón de Roca", + [61076] = "Reptador Caparazón de Arena", + [61077] = "Chimpancé de Valalto", + [61078] = "Mono de Valalto", + [61080] = "Anciano Gorila de Valalto", + [61082] = "Tronador de Valalto", + [61090] = "Cobra Colamatorral", + [61091] = "Serpiente Colamatorral", + [61095] = "Chillador Venodesuellador", + [61096] = "Serpiente Venodesuellador", + [61098] = "Rey Morogo Pies de Trueno", + [61206] = "Reptador de Telaraña Escurridiza", + [61218] = "Cría de Serpiente Descarriado", + [61227] = "Acechador Fauceumbría", + [61228] = "Acechador Fauceumbría", + [61229] = "Piel Oscura Hambriento", + [61230] = "Cría de Murciélago Ala Vil", + [61231] = "Murciélago Ala Vil", + [61232] = "Araña de Red Hueca", + [61233] = "Escupidor de Veneno de Red Hueca", + [61336] = "Búho Grancuerno", + [61337] = "Cazador Grancuerno", + [61401] = "Murciélago Alavil Superior", + [61488] = "Picoazul", + [61500] = "Espalda Plateada de Valalto", + [61552] = "Correanoche", + [61554] = "Aullaalba", + [61599] = "Sable Oscuro", + [61656] = "Buitre Pluma de Ceniza", + [61657] = "Planeador Pluma de Ceniza", + [61658] = "Hiena Pataceniza", + [61659] = "Cazador Pataceniza", + [61660] = "Escórpido Colapétrea", + [61661] = "Azotador Colapétrea", + [61662] = "Escórpido Veneno Negro", + [61680] = "Reptador de Arrecife de Fango", + [61681] = "Reptador Arrecife de Lodo Joven", + [61686] = "Viajero Pluma de Ceniza", + [61689] = "Jabalí Thalassiano Jóven", + [61690] = "Lince Carmesí Jóven", + [61691] = "Jinete de Águila del Bosque", + [61692] = "Jabalí Thalassiano", + [61693] = "Lince Carmesí", + [61695] = "Halcón Thalassiano Marfil", + [61696] = "Jabalí Thalassiano Anciano", + [61697] = "Lynx Brillante", + [61698] = "Lynx Brillante Matriarca", + [61699] = "Shar'lan", + [61700] = "Lynx Carmesí Viejo", + [61704] = "Reptador Errante", + [61716] = "Corcel alado Carmesí", + [61717] = "Zorro Thalassiano", + [61774] = "Maldición de Maná Brillante", + [61775] = "Cachorro de Maná Esmeralda", + [61776] = "Serpiente de Maná Lavanda", + [61789] = "Pluma Lunar", + [61975] = "Jabalí Colmilloalto", + [62066] = "Madre Criadora Tejecaverna", + [62073] = "Araña Tejecaverna", + [62074] = "Escalador Tejecaverna", + [62075] = "Escupidor de Veneno Tejecaverna", + [62121] = "Jabalí Espinofirme ", + [62122] = "Jabalí Espinofirme Grande", + [62123] = "Oso Pelodoro", + [62124] = "Oso Pardo Pelodoro", + [62125] = "Lobo del Bosque Anciano", + [62126] = "Alfa del Bosque Anciano", + [62223] = "Raptor Escama Sombría", + [62224] = "Chillón Escama Sombría", + [62225] = "Azotador Escama Sombría", + [62226] = "Jabalí Piel de Piedra", + [62227] = "Jabalí de Piel de Piedra Anciano", + [62247] = "Reclusa Marrón", + [62248] = "Reclusa Marrón Superior", + [62256] = "Quijaforte de Agua Dulce", + [62257] = "Quijada de Agua Clara Enfermizo", + [62258] = "Crocolisco Dientefilo", + [62259] = "Cocodrilo Denteserra Gigante", + [62260] = "Jabalí del Bosque", + [62261] = "Jabalí del Bosque Viejo", + [62262] = "Jabalí de la Mesa", + [62271] = "Jabalí Dientebrillo Joven", + [62272] = "Lobo Maderero Joven", + [62338] = "Buitre Ala Tormenta", + [62339] = "Buitre Ala Tormenta", + [62340] = "Coyote Rocoso Andrajoso", + [62341] = "Coyote Rocoso Babeante", + [62342] = "Araña Cortezaniebla", + [62343] = "Tejedora Cortezaniebla", + [62344] = "Madre Cortezaniebla", + [62345] = "Crocolisco Lamentoso", + [62642] = "Faucefilosa", + [80250] = "Lince Carmesí", + [80252] = "Zorro Ártico Joven", + [80254] = "Zorro Marrón Joven", + [80256] = "Zorro Plateado", + [80257] = "Zorro Rojo", + [80258] = "Zorro de Niebla Joven", + [80259] = "Zorro de la Niebla", + [80260] = "Zorro Espiritual", + [80466] = "Oso Apestado de Tirisfal", + [80815] = "Águila Amani", + [80816] = "Águila de Las Tierras del Interior", + [80920] = "Águila Amani", + [90980] = "Tigre Zuliano", + [90981] = "Tigre Zuliano", + [91819] = "Tigre Hazzuri", + [91825] = "Tigre de Bengala Joven", + [91826] = "Matriarca de Bengala", + [91827] = "Tigre de Bengala", + [91828] = "Alfa de Bengala", + [91829] = "Pisoteador Lomo de Jungla", + [91830] = "Azotador Lomo de Jungla", + [91831] = "Reptador Luminoso", + [91832] = "Pinza de la Isla", + [91833] = "Reptador de Rocas", + [91838] = "Sacudidor Caparazhondo", + [91960] = "Pantera Zarpa de Jungla", + [91961] = "Pantera de las Sombras Zarpa de Jungla", + [91962] = "Crocolisco Rompesal", + [91966] = "Serpiente de la Selva Venenosa", + [91984] = "Oso Tirisgarra", + [91985] = "Cachorro Tirisgarra", + [91987] = "Jabalí Riscolmillo", + [91989] = "Lobo Zarpa Gris", + [91990] = "Alfa Zarpa Gris", + [92115] = "Garrafilada Enfurecida", + [92146] = "Reptador de la Playa", + [92147] = "Reptador de la Costa de Plata", +} diff --git a/locales/data/beasts/ptBR.lua b/locales/data/beasts/ptBR.lua new file mode 100644 index 0000000..537dc52 --- /dev/null +++ b/locales/data/beasts/ptBR.lua @@ -0,0 +1,713 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +MTH_LocaleData.data.beasts.ptBR = { + [30] = "Aranha da Floresta", + [43] = "Aranha da Mina", + [69] = "Lobo Silvestre", + [113] = "Javali Pedratusco", + [118] = "Predador", + [119] = "Fuçalonga", + [154] = "Ripa-Carne Maior", + [157] = "Goretusk", + [199] = "Ripa-carne Jovem", + [213] = "Lobo Hediondo Faminto", + [217] = "Venaracna", + [299] = "Lobo Jovem", + [330] = "Princesa", + [345] = "Ronquifuça", + [390] = "Séquito Porcino", + [428] = "Condor Hediondo", + [442] = "Tarântula", + [454] = "Gorestusco Jovem", + [462] = "Vultros", + [471] = "Mãe Veneno", + [505] = "Grande Tarântula", + [521] = "Lupos", + [524] = "Javali Couropedra", + [525] = "Lobo Sarnento", + [539] = "Veneracna Pigmeia", + [547] = "Grande Goretusk", + [565] = "Lobo Hediondo Raivoso", + [569] = "Recluso Verde", + [574] = "Naraxis", + [616] = "Palpos", + [628] = "Devastador Negro", + [681] = "Tigre-do-espinhaço Jovem", + [682] = "Tigre da Selva do Espinhaço", + [683] = "Pantera Jovem", + [684] = "Pantera Umbragorja", + [685] = "Raptor da Selva do Espinhaço", + [686] = "Raptor Batecauda", + [687] = "Perseguidor da Selva", + [704] = "Lobo Silvestre Sarnento", + [705] = "Lobo Jovem Roto", + [708] = "Rochetusco Pequeno", + [728] = "Bhag'thera", + [729] = "Sin'dall", + [730] = "Tethis", + [731] = "Rei Bangalash", + [736] = "Pantera", + [767] = "Onça do Pântano", + [768] = "Pantera das Sombras", + [769] = "Tarântula Mataca", + [772] = "Tigresa da Selva do Espinhaço", + [822] = "Ursinho da Floresta", + [830] = "Rastreador de Areia", + [831] = "Rastreador do Mar", + [833] = "Coiote-alfa", + [834] = "Coiote", + [854] = "Espreitador da Selva Jovem", + [855] = "Raptor-do-espinhaço Jovem", + [856] = "Raptor Batecauda Jovem", + [858] = "Girador de Tristeza", + [922] = "Rastrejante do Lodo", + [923] = "Assolador Negro Jovem", + [930] = "Filhote de Viúva Negra", + [949] = "Reclusa Carniceira", + [976] = "Tigre de Guerra Kurzen", + [977] = "Pantera de Guerra Kurzen", + [1015] = "Raptor Montanhês", + [1016] = "Batecauda Montanhês", + [1017] = "Garrafoice Montanhês", + [1018] = "Rasgaqueixo Montanhês", + [1019] = "Rasgaqueixo Ancião", + [1020] = "Raptor Mosqueado", + [1021] = "Guinchador Mosqueado", + [1022] = "Garrafoice Mosqueado", + [1023] = "Rasgaqueixo Mosqueado", + [1082] = "Crocolisco Dentesserra", + [1084] = "Crocolisco Dentesserra Jovem", + [1087] = "Tartalisca Dentesserra", + [1088] = "Rastejante Monstruoso", + [1108] = "Gorila do Vale da Névoa", + [1109] = "Ripa-carne", + [1111] = "Espreitadora Sanguessuga", + [1112] = "Viúva Negra Sanguessuga", + [1114] = "Trovejador da Selva", + [1125] = "Rochetusco", + [1126] = "Rochetusco Grande", + [1127] = "Rochetusco Ancião", + [1128] = "Urso Preto Jovem", + [1129] = "Urso Preto", + [1130] = "Bjarn", + [1131] = "Lobo Invernal", + [1132] = "Lenho", + [1133] = "Lobo Invernal Faminto", + [1138] = "Lobo Rastreador da Neve", + [1140] = "Matriarca Rasgaqueixo", + [1150] = "Crocolisco do Rio", + [1152] = "Crocolisco Arapuca", + [1184] = "Tocaieira do Penhasco", + [1185] = "Tocaieira da Mata", + [1186] = "Urso Preto Ancião", + [1188] = "Urso Pardo Preto", + [1189] = "Urso Preto Patriarca", + [1190] = "Javali Montanhês", + [1191] = "Javali Montanhês Sarnento", + [1192] = "Javali Montanhês Ancião", + [1194] = "Urubu Montanhês", + [1195] = "Tocaieira da Floresta", + [1196] = "Urso Garra de Gelo", + [1199] = "Leopardo da Neve Juvenil", + [1201] = "Leopardo da Neve", + [1216] = "Orlatisco", + [1225] = "Velho Fumaça", + [1258] = "Mastim Assolador Negro", + [1400] = "Crocolisco do Pantanal", + [1417] = "Crocolisco do Pantanal Jovem", + [1504] = "Trevateia Jovem", + [1505] = "Trevateia", + [1508] = "Carniceiro Jovem", + [1509] = "Carniceiro Roto", + [1511] = "Gorila Costalva Enfurecido", + [1512] = "Quiropúsculo", + [1513] = "Quiropúsculo Sarnento", + [1516] = "Konda", + [1547] = "Cão das Trevas Decrépito", + [1548] = "Cão das Trevas Amaldiçoado", + [1549] = "Cão das Trevas Voraz", + [1553] = "Grande Quiropúsculo", + [1554] = "Quiropúsculo Vampírico", + [1555] = "Trevateia Malévola", + [1557] = "Gorila Ancião do Vale da Névoa", + [1558] = "Patriarca Costalva", + [1688] = "Matriarca Trevateia", + [1689] = "Rochetusco Cicatrizado", + [1693] = "Crocolisco Lacustre", + [1713] = "Pantera Umbragorja Anciã", + [1765] = "Worg", + [1766] = "Worg Mosqueado", + [1778] = "Urso Cinzento Feroz", + [1780] = "Espreitadora do Musgo", + [1781] = "Rastejante da Bruma", + [1797] = "Urso Cinzento Gigante", + [1809] = "Abutre Carniceiro", + [1815] = "Urso Preto Doente", + [1816] = "Urso-cinzento Doente", + [1817] = "Lobo Doente", + [1822] = "Tocaieira Rasterruça", + [1824] = "Tocaieira Pestilenta", + [1922] = "Lobo Cinza da Floresta", + [1923] = "Worg Rinossangue", + [1961] = "Ronhagarra", + [1984] = "Javali-espinho Jovem", + [1985] = "Javali-espinho", + [1986] = "Aranha Lenhateia", + [1994] = "Githyiss, a Torpe", + [1995] = "Coruja Estrígida", + [1996] = "Guinchadora Estrígida", + [1997] = "Caçadora Estrígida", + [1998] = "Tocaieira Lenhateia", + [1999] = "Lenhateia Peçonhenta", + [2000] = "Lenhateia Fiandeira", + [2001] = "Aranha Lenhateia Gigante", + [2031] = "Sabre-da-noite Jovem", + [2032] = "Sabre-da-noite Sarnento", + [2033] = "Sabre-da-noite Ancião", + [2034] = "Sabre-da-noite Feral", + [2042] = "Sabre-da-noite", + [2043] = "Espreitador Sabre-da-noite", + [2069] = "Espreitaluna", + [2070] = "Espreitaluna Raquítico", + [2071] = "Matriarca Espreitaluna", + [2089] = "Crocolisco do Pantanal Gigante", + [2163] = "Ursocardo", + [2165] = "Ursocardo Grisalho", + [2172] = "Mamãe Moa da Floresta", + [2175] = "Garrassombra", + [2231] = "Maretisco Pigmeu", + [2232] = "Maretisco", + [2233] = "Maretisco Incrustado", + [2234] = "Tiscoral Jovem", + [2235] = "Tiscoral", + [2236] = "Tiscoral Furioso", + [2237] = "Espreitaluna Macho", + [2275] = "Fido Enraivecido", + [2321] = "Filhote de Florestruz", + [2322] = "Florestruz", + [2323] = "Florestruz Gigante", + [2348] = "Rastejamusgo Anciã", + [2349] = "Rastejante do Musgo Gigante", + [2350] = "Rastejante do Musgo da Floresta", + [2351] = "Urso Cinzento", + [2354] = "Urso-cinzento Feroz", + [2356] = "Urso Cinzento Ancião", + [2384] = "Leão da Montanha Esfomeado", + [2385] = "Leão da Montanha Selvagem", + [2406] = "Leão da Montanha", + [2407] = "Leão da Montanha Imponente", + [2408] = "Mordelisca", + [2476] = "Crocolisco Lacustre Grande", + [2505] = "Mordelisca de Água Salgada", + [2521] = "Gorila Grenhacéu", + [2522] = "Espreitador Jaguara", + [2544] = "Aretisco Austral", + [2559] = "Andarilho do Planalto", + [2560] = "Espancador do Planalto", + [2561] = "Fareja-carne do Planalto", + [2563] = "Rastejante das Planícies", + [2565] = "Rastejante Gigante das Planícies", + [2578] = "Filhote de Urubu da Chapada", + [2579] = "Urubu da Chapada", + [2580] = "Urubu Ancião da Chapada", + [2635] = "Crocolisco de Água Salgada Ancião", + [2680] = "Filhote de Lobo Ramatorpe", + [2681] = "Lobo Saqueador Ramatorpe", + [2686] = "Guarda-prole Cascasseca", + [2727] = "Coiote do Rochedo", + [2728] = "Coiote Feroz do Rochedo", + [2729] = "Coiote Ancião do Rochedo", + [2730] = "Coiote Raivoso do Rochedo", + [2731] = "Espreitador da Serra", + [2732] = "Caçadora da Serra", + [2734] = "Patriarca Espreitador da Serra", + [2753] = "Barnabus", + [2829] = "Urubu Faminto", + [2830] = "Urubu", + [2831] = "Urubu Gigante", + [2850] = "Dente Quebrado", + [2923] = "Jubaprata Sarnento", + [2924] = "Lobo Jubaprata", + [2925] = "Uivador Jubaprata", + [2926] = "Espreitador Jubaprata", + [2931] = "Zaricotl", + [2954] = "Javaliço Costagulha", + [2955] = "Pinote", + [2956] = "Pinote Adulto", + [2957] = "Pinote Ancião", + [2958] = "Lobo-da-pradaria", + [2959] = "Espreitador-da-pradaria", + [2960] = "Lobo-da-pradaria Alfa", + [2961] = "Puma da Montanha", + [2966] = "Javaliço", + [2969] = "Rapineiro Esguio", + [2970] = "Rapineiro", + [2971] = "Rapineiro de Gadanho", + [3035] = "Puma das Estepes", + [3068] = "Mazzranache", + [3098] = "Mosquetusco", + [3099] = "Mosquetusco Hediondo", + [3100] = "Mosquetusco Ancião", + [3106] = "Surfatisco Pigmeu", + [3107] = "Surfatisco", + [3108] = "Surfatisco Incrustado", + [3110] = "Crocolisco Bocarrão", + [3121] = "Tigre de Durotar", + [3122] = "Açoitacauda Garrassangre", + [3123] = "Bocalfanje Garrassangre", + [3124] = "Escorpídeo Operário", + [3125] = "Escorpídeo Estalador", + [3126] = "Escorpídeo Encouraçado", + [3127] = "Escorpídeo Caudaçonha", + [3225] = "Mosquetusco Corrompido", + [3226] = "Escorpídeo Corrompido", + [3227] = "Bocalfanje Garrassangre Corrompido", + [3228] = "Surfatisco Corrompido", + [3231] = "Crocolisco Bocarrão Corrompido", + [3241] = "Patriarca da Savana", + [3243] = "Jubalta da Savana", + [3244] = "Pinote Grande", + [3245] = "Pinote Turrão", + [3246] = "Pinote Fugaz", + [3247] = "Filhote de Falcotrom", + [3249] = "Grande Falcotrom", + [3250] = "Rastejante Silitídeo", + [3252] = "Enxameador Silitídeo", + [3254] = "Batecauda Helióscamo", + [3255] = "Uivador Helióscamo", + [3256] = "Garrafoice Helióscamo", + [3257] = "Ishamuhale", + [3281] = "Sarkoth", + [3415] = "Caçadora da Savana", + [3416] = "Matriarca da Savana", + [3424] = "Falcotrom Raspa-nuvens", + [3425] = "Predador da Savana", + [3461] = "Mordelisca do Oásis", + [3472] = "Anhan Guera", + [3475] = "Echeyaki", + [3503] = "Protetor Silitídeo", + [3566] = "Predador das Estepes", + [3581] = "Fera do Esgoto", + [3619] = "Sabre Fantasma", + [3630] = "Espiríleo Anormal", + [3631] = "Cravaçoite Anormal", + [3632] = "Rastejante Anormal", + [3633] = "Matador Anormal", + [3634] = "Espreitador Anormal", + [3636] = "Assolador Anormal", + [3637] = "Guardião Anormal", + [3653] = "Cresh", + [3809] = "Urso do Vale Gris", + [3810] = "Urso Ancião do Vale Gris", + [3811] = "Urso Gigante do Vale Gris", + [3812] = "Rastetisco Espocador", + [3814] = "Espetisco", + [3819] = "Espreitadora Cardagreste", + [3820] = "Cospeçonha Cardagreste", + [3821] = "Tocaieira Cardagreste", + [3823] = "Corredor Patalmas", + [3824] = "Patalmas Uivador", + [3825] = "Patalmas Alfa", + [3861] = "Worg Sinistro", + [3862] = "Worg Salivante", + [3866] = "Morcego Torpe", + [3868] = "Busca-sangue", + [4005] = "Rastejante de Fundolimo", + [4006] = "Teceteia de Fundolimo", + [4007] = "Cospeçonha de Fundolimo", + [4040] = "Espreitadora da Caverna", + [4067] = "Corredor do Crepúsculo", + [4117] = "Serpente das Nuvens", + [4118] = "Serpente das Nuvens Venenosa", + [4119] = "Serpente das Nuvens Anciã", + [4124] = "Puma de Mil Agulhas", + [4126] = "Espreitador dos Penhascos", + [4127] = "Hiena Presavaia", + [4128] = "Espreitador Presavaia", + [4129] = "Rosnador Presavaia", + [4139] = "Terror Escorpídeo", + [4140] = "Aniquilador Escorpídeo", + [4142] = "Tartaruga Quelobrilho", + [4143] = "Tartalisca Quelobrilho", + [4144] = "Perfurador Quelobrilho", + [4154] = "Catador da Planície Salgada", + [4158] = "Abutre da Planície Salgada", + [4248] = "Hiena Courirrita", + [4249] = "Rosnadora Courirrita", + [4250] = "Galath Alcateio", + [4263] = "Filhote de Aranha de Fundolimo", + [4264] = "Matriarca de Fundolimo", + [4304] = "Cão Farejador Escarlate", + [4316] = "Kolkar Alcateio", + [4341] = "Crocolísco Secâmoro", + [4342] = "Mandivil Secâmoro", + [4343] = "Abocalisco Secâmoro", + [4344] = "Crocolísco Secâmoro Mosqueado", + [4345] = "Secâmoro Gorjadaga", + [4351] = "Raptor Dinossangue", + [4352] = "Gritador Dinossangue", + [4355] = "Garrafoice Dinossangue", + [4356] = "Rasgaqueixo Dinossangue", + [4357] = "Batecauda Dinossangue", + [4376] = "Aranha Névoa Negra", + [4377] = "Tocaieira Névoa Negra", + [4378] = "Reclusa Névoa Negra", + [4379] = "Tecesseda Névoa Negra", + [4380] = "Viúva Névoa Negra", + [4396] = "Quelônio Pedralama", + [4397] = "Espicasca Pedralama", + [4398] = "Toqueira Pedralama", + [4399] = "Escavadora Pedralama", + [4400] = "Mordelisca Pedralama", + [4411] = "Tocaieira Presanegra", + [4412] = "Rastejante Presanegra", + [4413] = "Aranha Presanegra", + [4414] = "Cospeçonha Presanegra", + [4415] = "Aranha Presanegra Gigante", + [4425] = "Caçador Cego", + [4511] = "Agam'ar", + [4512] = "Agam'ar Pútrido", + [4514] = "Agam'ar Furioso", + [4538] = "Morcego do Urzal", + [4539] = "Grande Morcego do Urzal", + [4548] = "Estalaço", + [4660] = "Pataóssea Maraudino", + [4662] = "Pataóssea Magram", + [4688] = "Hiena Pataóssea", + [4689] = "Pataóssea Esfomeada", + [4690] = "Pataóssea Raivosa", + [4692] = "Pavor Rapineiro", + [4693] = "Pavor Alado", + [4694] = "Pavor Estripante", + [4695] = "Carniceiro Horrendo", + [4696] = "Escorpachi Estalante", + [4697] = "Escorpachi Açoitador", + [4699] = "Escorpachi Venelátego", + [4821] = "Crustáceo Deslizante", + [4822] = "Crustáceo Mordedor", + [4823] = "Crustáceo Farpado", + [4824] = "Aku'mai Pescadora", + [4825] = "Mordelisca Aku'mai", + [4841] = "Mortocharco", + [4861] = "Morcego Corvoide", + [4887] = "Ghamoo-ra", + [4950] = "Manchinha", + [5048] = "Áspide Anormal", + [5053] = "Crocolisco Anormal", + [5056] = "Presátera Anormal", + [5224] = "Coleante do Lodo", + [5225] = "Cospelodo", + [5260] = "Gorila Groddoc", + [5262] = "Trovejante Groddoc", + [5268] = "Urso Veloférreo", + [5272] = "Urso Veloférreo Cinzento", + [5274] = "Patriarca Veloférreo", + [5286] = "Corredor Longodente", + [5287] = "Uivador Longodente", + [5288] = "Longodente Raivoso", + [5291] = "Asa Gélida Hakkari", + [5307] = "Guinchador do Vale", + [5308] = "Guinchador Errante do Vale", + [5349] = "Arash-ethis", + [5352] = "Velho Pançagris", + [5356] = "Rosnador", + [5422] = "Caçador Escorpídeo", + [5423] = "Caudaçoite Escorpídeo", + [5424] = "Espretareia Escorpídeo", + [5425] = "Patapústula Faminta", + [5426] = "Hiena Patapústula", + [5427] = "Patapústula Raivoso", + [5428] = "Roca", + [5429] = "Roca de Fogo", + [5430] = "Roca Flamejante", + [5431] = "Tartaruga Ondesliza", + [5432] = "Tartaruga Ondesliza Gigante", + [5708] = "Rebento de Hakkar", + [5755] = "Víbora Anormal", + [5756] = "Peçonhasa Anormal", + [5762] = "Caninana Anormal", + [5766] = "Filhote da Savana", + [5807] = "O Estraçalhador", + [5823] = "Açoita-morte", + [5828] = "Humar, o Senhor dos Leões", + [5829] = "Roncão, o Importuno", + [5834] = "Azzere, o Cortacéu", + [5842] = "Takk, o Saltador", + [5856] = "Aranha Teia-de-vidro", + [5857] = "Aranha de Lava Causticante", + [5858] = "Grande Aranha de Lava", + [5865] = "Dishu", + [5937] = "Torpicada", + [5982] = "Matador Negro", + [5984] = "Rasgarrindo Faminta", + [5985] = "Hiena Rasgarrindo", + [5988] = "Aguilhante Escorpóde", + [5992] = "Javali Jubacinza", + [6013] = "Urubu Errante", + [6352] = "Tocaieiro Cascoral", + [6369] = "Tartaruga Cascoral", + [6505] = "Ravassauro", + [6506] = "Ravassauro Corredor", + [6507] = "Ravassauro Caçador", + [6508] = "Ravassauro Pelenoso", + [6513] = "Pisoteador de Un'Goro", + [6514] = "Gorila de Un'Goro", + [6516] = "Trovejador de Un'Goro", + [6581] = "Matriarca Ravassauro", + [6585] = "Uhk'loc", + [6788] = "Matriarca do Covil", + [6789] = "Ursocardinho", + [7022] = "Escorpídeo Açoitador", + [7055] = "Worg Rocha Negra", + [7078] = "Escorpídeo da Fenda", + [7097] = "Coruja Bico-de-ferro", + [7098] = "Guinchador Bico-de-ferro", + [7099] = "Caçador Bico-de-ferro", + [7268] = "Guardião Zangareia", + [7319] = "Lady Sathrah", + [7405] = "Escorpídeo Mortal da Fenda", + [7430] = "Filhote de Sabre-de-gelo", + [7431] = "Sabre-de-gelo", + [7432] = "Espreitador Sabre-de-gelo", + [7433] = "Caçadora Sabre-de-gelo", + [7434] = "Vigia Sabre-de-gelo", + [7443] = "Espancador Dentilhaço", + [7444] = "Urso Dentilhaço", + [7445] = "Ancião Dentilhaço", + [7446] = "Dentilhaço Raivoso", + [7455] = "Coruja de Hibérnia", + [7456] = "Guinchadora de Hibérnia", + [7803] = "Entocador Escorpídeo", + [8207] = "Ave Flamejante Maior", + [8208] = "Patapústula Matadora", + [8211] = "Velho Pula-penhasco", + [8213] = "Cascaférrea", + [8277] = "Rekk'tilac", + [8299] = "Láquila", + [8300] = "Rasgarga", + [8301] = "Clack, o Aniquilador", + [8303] = "Grunhido", + [8336] = "Sapador Hakkari", + [8600] = "Quiróprago", + [8601] = "Quiróprago Nóxio", + [8602] = "Quiróprago Monstruoso", + [8762] = "Reclusa Xilaracna", + [8926] = "Aguilhão Profundo", + [8927] = "Uivador Sombrio", + [8933] = "Rastejante da Caverna", + [8956] = "Urso Garraivoso", + [8958] = "Espancador Garraivoso", + [8959] = "Lobo Patavil", + [8960] = "Catador Patavil", + [8961] = "Assolador Patavil", + [9416] = "Worg do Escudo Marcado", + [9622] = "U'cha", + [9683] = "Lar'korwi Fêmea", + [9684] = "Lar'korwi", + [9690] = "Worg Incandescente", + [9691] = "Escorpídeo Furimata", + [9694] = "Worg Incandescente Salivante", + [9695] = "Escorpídeo Letalátego", + [9696] = "Worg Machado Sangrento", + [9697] = "Worg Incandescente Gigante", + [9698] = "Escorpídeo Cauda-de-fogo", + [10077] = "Goela da Morte", + [10200] = "Rak'shiri", + [10221] = "Filhote de Worg Machado Sangrento", + [10356] = "Bayne", + [10357] = "Ressan, o Agulheiro", + [10359] = "Tok'aya", + [10375] = "Filhote de Aranha do Pináculo", + [10644] = "Uivador da Névoa", + [10737] = "Shy-Rotam", + [10741] = "Sian-Rotam", + [10806] = "Úrsius", + [10882] = "Arikara", + [10981] = "Lobo do Gelo", + [11357] = "Filho de Hakkar", + [11360] = "Cria Zulian", + [11361] = "Tigre Zulian", + [11365] = "Pantera Zulian", + [11368] = "Morcego Sanguinário", + [11370] = "Proleviúva Razzashi", + [11371] = "Serpente Razzashi", + [11372] = "Áspide Razzashi", + [11735] = "Escorpídeo Petraçoite", + [11736] = "Tenaz Petraçoite", + [11737] = "Esfolador Petraçoite", + [11738] = "Rastejante da Areia", + [11739] = "Espreitadora de Rocha", + [11921] = "Besseleth", + [12037] = "Ursol'lok", + [12431] = "Dilaceros", + [12432] = "Velho Tenaz", + [12433] = "Krethis Umbrateia", + [13599] = "Mordelisca Estólida", + [14123] = "Tartalisca Maxilaço", + [14222] = "Araga", + [14223] = "Benji Rabugento", + [14228] = "Risadinha", + [14232] = "Dardo", + [14233] = "Rancascame", + [14234] = "Hayoc", + [14266] = "Shanda, a Tecelã", + [14268] = "Lorde Condar", + [14279] = "Rastejatriz", + [14280] = "Zé Comilão", + [14283] = "Coruja de Lançatroz", + [14339] = "Uivo Mortífero", + [14343] = "Olm, o Sábio", + [14344] = "Mestiça", + [14472] = "Gretheer", + [14476] = "Krellack", + [14491] = "Kurmokk", + [14532] = "Veneracnídea Razzashi", + [14821] = "Raptor Razzashi", + [14965] = "Morcego Sanguinário Frenético", + [15041] = "Prole de Mar'li", + [15043] = "Crocolisco Zulian", + [15101] = "Predador Zulian", + [16117] = "Suíno Pestilento", + [36507] = "Manchinha", + [36514] = "Filhote de Sabre-de-gelo", + [37007] = "Filhote de Viúva Negra", + [40000] = "Raposa-vermelha", + [50624] = "Enxameador Silitídeo", + [50627] = "Enxameador Silitídeo", + [50630] = "Enxameador Silitídeo", + [60494] = "Pesagarra", + [60697] = "Cão de Caça", + [60848] = "Javali Costagulha", + [61074] = "Gorila do Altovale", + [61075] = "Rastreador Pedraconha", + [61076] = "Aretisco Conchareia", + [61077] = "Chimpanzé do Altovale", + [61078] = "Macaco do Altovale", + [61080] = "Gorila Ancião do Altovale", + [61082] = "Trovejante do Altovale", + [61090] = "Cobra Rabo-de-escova", + [61091] = "Áspide de Cauda de Escova", + [61095] = "Ginchador Esfolavêneno", + [61096] = "Serpente Esfolavêneno", + [61098] = "Rei Morogo Pé de Trovão", + [61206] = "Rastejante Tremeteia", + [61218] = "Filhote de Espiríleo Anormal", + [61227] = "Predador Crespupele", + [61228] = "Espreitador Crespupele", + [61229] = "Pele do Crepúsculo Faminto", + [61230] = "Morceguinho Asa Vil", + [61231] = "Morcego Asa Vil", + [61232] = "Aranha Teia Oca", + [61233] = "Veneno de Teia Oca", + [61336] = "Corujão Grande", + [61337] = "Caçador de Chifres Grandes", + [61401] = "Morcego Asatorpe Maior", + [61488] = "Azurebeak", + [61500] = "Highvale Silverback", + [61552] = "Crespulizo", + [61554] = "Dawnhowl", + [61599] = "Sabre Negro", + [61656] = "Urubu Penagris", + [61657] = "Caçador Penagris", + [61658] = "Hiena Patacinza", + [61659] = "Caçador Patacinza", + [61660] = "Escorpídeo Cauda-de-pedra", + [61661] = "Açoitador Cauda-de-pedra", + [61662] = "Escorpídeo Peçonha-negra", + [61680] = "Rastejante Coralodo", + [61681] = "Tiscoral Sujo Jovem", + [61686] = "Catador Penagris", + [61689] = "Javali Thalassiano Jovem ", + [61690] = "Lince-carmesim Jovem ", + [61691] = "Falcostruz da Floresta", + [61692] = "Javali Thalassiano", + [61693] = "Lince-carmesim", + [61695] = "Falcostruz Marfim", + [61696] = "Javali Thalassiano Ancião", + [61697] = "Lince-lume", + [61698] = "Matriarca Lince-lume", + [61699] = "Shar'lan", + [61700] = "Lince-carmesim Ancião", + [61704] = "Rastejante dos Andarilhos", + [61716] = "Falcostruz Carmesim", + [61717] = "Raposa Thalassiana", + [61774] = "Moreia de Mana Brilhante", + [61775] = "Moreia de Mana Esmeralda", + [61776] = "Moreia de Mana Lavanda", + [61789] = "Lunapluma", + [61975] = "Javali Presa Alta", + [62066] = "Prolemadre Espeleoteia", + [62073] = "Aranha Espeleoteia", + [62074] = "Rastejante Espeleoteia", + [62075] = "Cospeçonha Espeleoteia", + [62121] = "Javali de Cerdas Douradas", + [62122] = "Javali Corpulento de Cerdas Douradas", + [62123] = "Urso Dourado", + [62124] = "Urso-cardo Dourado", + [62125] = "Lobo Silvestre Ancião", + [62126] = "Lobo Silvestre Alfa", + [62223] = "Raptor Escamatroz", + [62224] = "Uivador Escamatroz", + [62225] = "Espancador Escamatroz", + [62226] = "Javali-couropétreo", + [62227] = "Javali-couropétreo Ancião", + [62247] = "Recluso Castanho", + [62248] = "Grande Recluso Marrom", + [62256] = "Mordelisca de Águas Claras", + [62257] = "Mordelisca de Águas Claras Doente", + [62258] = "Crocolisco Dentefino", + [62259] = "Crocolisco Gigante Dente-de-navalha", + [62260] = "Javali da Floresta", + [62261] = "Javali Ancião da Floresta", + [62262] = "Javali da Chapada", + [62271] = "Jovem Javali Cerdouro", + [62272] = "Jovem Lobo Silvestre", + [62338] = "Urubu Asatempéria", + [62339] = "Abrute Asatempéria", + [62340] = "Ragged Crag Coyote", + [62341] = "Coiote Penhascoscravo", + [62342] = "Aranha Mistbark", + [62343] = "Conjurador de teias Mistbark", + [62344] = "Mãe Mistbark", + [62345] = "Crocolisco Sorrowmore", + [62642] = "Filocéfalo", + [80250] = "Lince-carmesim", + [80252] = "Filhote de Raposa-do-ártico", + [80254] = "Filhote de Raposa-do-campo ", + [80256] = "Raposa-prateada", + [80257] = "Raposa-vermelha", + [80258] = "Filhote de Raposa-da-névoa", + [80259] = "Raposa-da-névoa", + [80260] = "Raposa Espiritual", + [80466] = "Urso Pestilento de Tirisfal", + [80815] = "Águia Amani", + [80816] = "Águia das Terras Agrestes", + [80920] = "Águia Amani", + [90980] = "Pantera Zulian", + [90981] = "Pantera Zulian", + [91819] = "Tigre Hazzuri", + [91825] = "Tigre-de-bengala Jovem", + [91826] = "Tigre de Bengala Matriarca", + [91827] = "Tigre de Bengala", + [91828] = "Tigre de Bengala Alfa", + [91829] = "Pisador da Selva", + [91830] = "Debulhador da Selva", + [91831] = "Rastreador Brilhante", + [91832] = "Tenaz Insular", + [91833] = "Rastejante de Rochas", + [91838] = "Quebrador Conchafunda", + [91960] = "Pantera Pataselva", + [91961] = "Pantera das Sombras Pataselva", + [91962] = "Crocolisco Arapuca", + [91966] = "Serpente da Selva Venenosa", + [91984] = "Urso Tirisgarra", + [91985] = "Filhote Tirisgarra", + [91987] = "Javali Presanhasco", + [91989] = "Lobo Pata Cinzenta", + [91990] = "Pata Cinzenta Alfa", + [92115] = "Garrafiada Enfurecido", + [92146] = "Rastejante da Praia", + [92147] = "Rastreador da Costa de Prata", +} diff --git a/locales/data/beasts/ruRU.lua b/locales/data/beasts/ruRU.lua new file mode 100644 index 0000000..bcab7c8 --- /dev/null +++ b/locales/data/beasts/ruRU.lua @@ -0,0 +1,573 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +MTH_LocaleData.data.beasts.ruRU = { + [30] = "Лесной паук", + [43] = "Рудниковый паук", + [69] = "Лесной волк", + [113] = "Вепрь-камнеклык", + [118] = "Лесной хищник", + [119] = "Длиннорыл", + [154] = "Большой шкуродер", + [157] = "Жутеклык", + [199] = "Молодой шкуродер", + [213] = "Голодный лютый волк", + [217] = "Ядовитый кругопряд", + [299] = "Молодой волк", + [330] = "Принцесса", + [345] = "Грубобрюх", + [390] = "Кабаний эскорт", + [428] = "Ужасающий кондор", + [442] = "Тарантул", + [454] = "Молодой жутевепрь", + [462] = "Сарыч", + [471] = "Мать Клык", + [505] = "Крупный тарантул", + [521] = "Волкус", + [524] = "Твердошкурый вепрь", + [525] = "Облезлый волк", + [539] = "Карликовый ядовитый кругопряд", + [547] = "Большой жутевепрь", + [565] = "Бешеный лютый волк", + [569] = "Зеленый паук-отшельник", + [574] = "Нараксис", + [616] = "Трещунья", + [628] = "Черный опустошитель", + [681] = "Молодой тигр Тернистой долины", + [682] = "Тигр Тернистой долины", + [683] = "Молодая пантера", + [684] = "Тенебрюхая пантера", + [685] = "Ящер Тернистой долины", + [686] = "Ящер-кнутохвост", + [687] = "Тропический ловец", + [704] = "Косматый лесной волк", + [705] = "Косматый молодой волк", + [708] = "Малый скальный вепрь", + [728] = "Баг'тира", + [729] = "Син'Далл", + [730] = "Тетис", + [731] = "Король Бангалаш", + [736] = "Пантера", + [767] = "Болотный ягуар", + [768] = "Пантера Тени", + [769] = "Смертоносный тарантул", + [772] = "Тигрица Тернистой долины", + [822] = "Молодой лесной медведь", + [830] = "Песчаный краб", + [831] = "Морской краб", + [833] = "Вожак стаи койотов", + [834] = "Койот", + [854] = "Молодой тропический ловец", + [855] = "Молодой ящер Тернистой долины", + [856] = "Молодой ящер-кнутохвост", + [858] = "Ткач скорби", + [922] = "Иловый краб", + [923] = "Молодой черный опустошитель", + [930] = "Детеныш черной вдовы", + [949] = "Падальщик-отшельник", + [976] = "Боевой тигр Курцена", + [977] = "Боевая пантера Курцена", + [1015] = "Ящер нагорья", + [1016] = "Кнутохвост нагорья", + [1017] = "Смертехват нагорья", + [1018] = "Острозуб Нагорья", + [1019] = "Старый острозуб", + [1020] = "Крапчатый ящер", + [1021] = "Крапчатый крикун", + [1022] = "Крапчатый смертехват", + [1023] = "Крапчатый острозуб", + [1082] = "Острозубый кроколиск", + [1084] = "Молодой острозубый кроколиск", + [1087] = "Острозубый крепкохват", + [1088] = "Чудовищный краб", + [1108] = "Горилла Туманной Долины", + [1109] = "Шкуродер", + [1111] = "Ловец-кровопийца", + [1112] = "Кровавая Вдова", + [1114] = "Джунглевый рокотун", + [1125] = "Скальный вепрь", + [1126] = "Большой скальный вепрь", + [1127] = "Старый скальный вепрь", + [1128] = "Молодой черный медведь", + [1129] = "Черный медведь", + [1130] = "Бьярн", + [1131] = "Снежный волк", + [1132] = "Серый", + [1133] = "Голодный снежный волк", + [1138] = "Снежный гончий волк", + [1140] = "Острозуб-матриарх", + [1150] = "Речной кроколиск", + [1152] = "Кроколиск-хрустогрыз", + [1184] = "Скальный скрытень", + [1185] = "Древесный воронковый паук", + [1186] = "Старый черный медведь", + [1188] = "Седой черный медведь", + [1189] = "Черный медведь-патриарх", + [1190] = "Горный вепрь", + [1191] = "Облезлый горный вепрь", + [1192] = "Старый горный вепрь", + [1194] = "Горный канюк", + [1195] = "Лесной паук-скрытень", + [1196] = "Медведь-ледолап", + [1199] = "Молодой снежный леопард", + [1201] = "Снежный леопард", + [1216] = "Береговой краб", + [1225] = "Старина Черношкур", + [1258] = "Черный мастиф-опустошитель", + [1400] = "Болотный кроколиск", + [1417] = "Молодой болотный кроколиск", + [1504] = "Молодой ночной кругопряд", + [1505] = "Ночной кругопряд", + [1508] = "Молодой падальщик", + [1509] = "Косматый падальщик", + [1511] = "Разъяренная седоспиная горилла", + [1512] = "Сумеречница", + [1513] = "Облезлая сумеречница", + [1516] = "Конда", + [1547] = "Дряхлый пес Тьмы", + [1548] = "Проклятый пес тьмы", + [1549] = "Прожорливый пес Тьмы", + [1553] = "Большая сумеречница", + [1554] = "Сумеречница-вампир", + [1555] = "Злобный ночной кругопряд", + [1557] = "Старая горилла Мглистой долины", + [1558] = "Среброспин-патриарх", + [1688] = "Ночной кругопряд-матриарх", + [1689] = "Покрытый шрамами скальный вепрь", + [1693] = "Озерный кроколиск", + [1713] = "Старая тенебрюхая пантера", + [1765] = "Ворг", + [1766] = "Крапчатый ворг", + [1778] = "Лютый седой медведь", + [1780] = "Мшистый паук-ловец", + [1781] = "Мглистый ползун", + [1797] = "Гигантский седой медведь", + [1809] = "Падальщик", + [1815] = "Больной черный медведь", + [1816] = "Болезненный гризли", + [1817] = "Больной волк", + [1822] = "Воронковый паук Ядовитого Тумана", + [1824] = "Чумной воронковый паук", + [1922] = "Серый лесной волк", + [1923] = "Кровожадный ворг", + [1961] = "Паршивый Коготь", + [1984] = "Молодой щетинистый вепрь", + [1985] = "Щетинистый вепрь", + [1986] = "Чащобный тенетник", + [1994] = "Гитьис Зловещая", + [1995] = "Сова", + [1996] = "Сова-крикун", + [1997] = "Сова-охотник", + [1998] = "Чащобный тенетник", + [1999] = "Чащобный ядозуб", + [2000] = "Чащобный паук-балдахинник", + [2001] = "Гигантский чащобный тенетник", + [2031] = "Молодой ночной саблезуб", + [2032] = "Облезлый ночной саблезуб", + [2033] = "Старый ночной саблезуб", + [2034] = "Яростный ночной саблезуб", + [2042] = "Ночной саблезуб", + [2043] = "Ночной саблезуб-охотник", + [2069] = "Лунопард", + [2070] = "Малорослый лунопард", + [2071] = "Лунопард-матриарх", + [2089] = "Огромный болотный кроколиск", + [2163] = "Колючешерстный медведь", + [2165] = "Седой колючешерстный медведь", + [2172] = "Долгоног-несушка", + [2175] = "Тенекоготь", + [2231] = "Карликовый прибрежный краб", + [2232] = "Прибрежный краб", + [2233] = "Покрытый илом краб", + [2234] = "Молодой рифовый краб", + [2235] = "Рифовый краб", + [2236] = "Гневный рифовый краб", + [2237] = "Взрослый лунопард", + [2275] = "Разъяренный", + [2321] = "Птенец лесного долгохода", + [2322] = "Лесной долгоход", + [2323] = "Гигантский лесной долгоног", + [2348] = "Старый моховой ползун", + [2349] = "Гигантский моховой ползун", + [2350] = "Лесной моховой ползун", + [2351] = "Серый медведь", + [2354] = "Злобный серый медведь", + [2356] = "Старый серый медведь", + [2384] = "Голодный горный лев", + [2385] = "Яростный горный лев", + [2406] = "Горный лев", + [2407] = "Крупный горный лев", + [2408] = "Хрустогрыз", + [2476] = "Большой озерный кроколиск", + [2505] = "Морской хрустогрыз", + [2521] = "Небогривая горилла", + [2522] = "Жагуар", + [2544] = "Южный песчаный краб", + [2559] = "Долгоног нагорья", + [2560] = "Твердозуб нагорья", + [2561] = "Плотоглот нагорья", + [2563] = "Равнинный ползун", + [2565] = "Гигантский равнинный ползун", + [2578] = "Молодой равнинный канюк", + [2579] = "Равнинный канюк", + [2580] = "Старый равнинный канюк", + [2635] = "Старый солоноводный кроколиск", + [2680] = "Волчонок Порочной Ветви", + [2681] = "Ездовой волк Порочной Ветви", + [2686] = "Паук-нянька племени Сухокожих", + [2727] = "Скальный койот", + [2728] = "Яростный скальный койот", + [2729] = "Старый скальный койот", + [2730] = "Бешеный скальный койот", + [2731] = "Горный охотник", + [2732] = "Горная охотница", + [2734] = "Патриарх горных охотинков", + [2753] = "Барнабус", + [2829] = "Голодный канюк", + [2830] = "Канюк", + [2831] = "Гигантский канюк", + [2850] = "Сломанный Клык", + [2923] = "Облезлый среброгрив", + [2924] = "Среброгривый волк", + [2925] = "Среброгривый ревун", + [2926] = "Среброгривый бродяга", + [2931] = "Зарикотль", + [2954] = "Боевой вепрь-дыбогрив", + [2955] = "Равнинный долгоног", + [2956] = "Взрослый равнинный долгоног", + [2957] = "Старый полевой долгоног", + [2958] = "Волк прерий", + [2959] = "Охотник прерий", + [2960] = "Могучий волк прерий", + [2961] = "Горная пума", + [2966] = "Боевой вепрь", + [2969] = "Тощий перепелятник", + [2970] = "Перепелятник", + [2971] = "Когтистый перепелятник", + [3035] = "Пума плоскогорья", + [3068] = "Маззранач", + [3098] = "Пятнистый вепрь", + [3099] = "Лютый пятнистый вепрь", + [3100] = "Старый крапчатый вепрь", + [3106] = "Карликовый приливный краб", + [3107] = "Приливный краб", + [3108] = "Поросший водорослями краб", + [3110] = "Крупнозубый кроколиск", + [3121] = "Дуротарский тигр", + [3122] = "Кровопалый кнутохвост", + [3123] = "Лезвезуб Кровавого Когтя", + [3124] = "Рабочий скорпид", + [3125] = "Гремучий скорпид", + [3126] = "Бронескорп", + [3127] = "Ядохвостый скорпид", + [3225] = "Оскверненный крапчатый вепрь", + [3226] = "Оскверненный скорпид", + [3227] = "Оскверненный лезвезуб Кровавого Когтя", + [3228] = "Порочный приливный краб", + [3231] = "Оскверненный крупнозубый кроколиск", + [3241] = "Патриарх саванны", + [3243] = "Высокогрив саванны", + [3244] = "Большой равнинный долгоног", + [3245] = "Злобный равнинный долгоног", + [3246] = "Проворный равнинный долгоног", + [3247] = "Птенец грозового змея", + [3249] = "Большой грозовой змей", + [3250] = "Ползучий силитид", + [3252] = "Членистоног Силитида", + [3254] = "Яркочешуйчатый кнутохвост", + [3255] = "Яркочешуйчатый крикун", + [3256] = "Яркочешуйчатый смертехват", + [3257] = "Ишамухал", + [3281] = "Саркот", + [3415] = "Охотница саванны", + [3416] = "Матриарх саванны", + [3424] = "Грозовой змей-облачник", + [3425] = "Хищник саванны", + [3461] = "Оазисный хрустогрыз", + [3472] = "Ваште Пауни", + [3475] = "Ичияки", + [3503] = "Заступник-силитид", + [3566] = "Хищник плоскогорья", + [3581] = "Тварь из Клоак", + [3619] = "Саблезубый призрак", + [3630] = "Загадочный крылозмей", + [3631] = "Загадочный жалохлест", + [3632] = "Загадочный ползун", + [3633] = "Загадочный душегуб", + [3634] = "Загадочный ловец", + [3636] = "Загадочный опустошитель", + [3637] = "Загадочный страж", + [3653] = "Криг", + [3809] = "Медведь Ясеневого леса", + [3810] = "Старый медведь Ясеневого леса", + [3811] = "Гигантский медведь Ясеневого леса", + [3812] = "Краб-щелкун", + [3814] = "Шипастый краб", + [3819] = "Паук-скакун Дикого Терна", + [3820] = "Ядоплюй Дикого Терна", + [3821] = "Воронковый паук Дикого Терна", + [3823] = "Светлолапый бегун", + [3824] = "Светлолапый ревун", + [3825] = "Светлолапый вожак", + [3861] = "Бесцветный ворг", + [3862] = "Слюнявый ворг", + [3866] = "Злобный нетопырь", + [3868] = "Кровожад", + [4005] = "Ползун из густого мха", + [4006] = "Моховой паук-вязальщик", + [4007] = "Моховой ядоплюй", + [4040] = "Пещерный ловец", + [4067] = "Сумеречный бегун", + [4117] = "Облачный змей", + [4118] = "Ядовитый облачный змей", + [4119] = "Старый облачный змей", + [4124] = "Игольчатая пума", + [4126] = "Скальный ловец", + [4127] = "Зубастая гиена", + [4128] = "Многозубый ловец", + [4129] = "Многозубый ворчун", + [4139] = "Скорпид-убийца", + [4140] = "Скорпид-разоритель", + [4142] = "Блестопанцирная черепаха", + [4143] = "Блестопанцирный крепкохват", + [4144] = "Блестопанцирный бурильщик", + [4154] = "Солончаковый падальщик", + [4158] = "Стервятник соляных равнин", + [4248] = "Паршивая гиена", + [4249] = "Паршивый рыкун", + [4250] = "Гиена племени Галак", + [4263] = "Детеныш густого мха", + [4264] = "Моховая паучиха", + [4304] = "Ищейка из Алого ордена", + [4316] = "Гиена племени Колкар", + [4341] = "Кроколиск-грязекуп", + [4342] = "Грязекуп-злобокус", + [4343] = "Грязекуп-крепкохват", + [4344] = "Крапчатый кроколиск-грязекуп", + [4345] = "Грязекуп-острозуб", + [4351] = "Ящер Кровавой Топи", + [4352] = "Крикун Кровавой Топи", + [4355] = "Смертехват Кровавой Топи", + [4356] = "Острозуб Кровавой Топи", + [4357] = "Кнутохвост Кровавой Топи", + [4376] = "Паук Мглистой пещеры", + [4377] = "Паучонок Мглистой пещеры", + [4378] = "Паук-отшельник Мглистой пещеры", + [4379] = "Паук-шелкопряд Мглистой пещеры", + [4380] = "Черная вдова Мглистой пещеры", + [4396] = "Глинистая черепаха", + [4397] = "Глинистая колючая черепаха", + [4398] = "Глинистый землеглот", + [4399] = "Глинистый бурильщик", + [4400] = "Глинистый хрустогрыз", + [4411] = "Скрытень-темножвал", + [4412] = "Ползун-темножвал", + [4413] = "Паук-темножвал", + [4414] = "Ядоплюй-темножвал", + [4415] = "Гигантский паук-темножвал", + [4425] = "Слепой охотник", + [4511] = "Агам'ар", + [4512] = "Гниющий вурдалак", + [4514] = "Разъяренный Агам'ар", + [4538] = "Лабиринтовый нетопырь", + [4539] = "Большой лабиринтовый нетопырь", + [4548] = "Сталезуб", + [4660] = "Костелап клана Мародин", + [4662] = "Костелап племени Маграм", + [4688] = "Костелапая гиена", + [4689] = "Голодный костелап", + [4690] = "Бешеный костелап", + [4692] = "Жуткий перепелятник", + [4693] = "Жуткий летун", + [4694] = "Жуткий потрошитель", + [4695] = "Ужасный падальщик", + [4696] = "Крепкохват cкорпаши", + [4697] = "Плеточник cкорпаши", + [4699] = "Ядохлыст cкорпаши", + [4821] = "Стремительное ракообразное", + [4822] = "Ракообразный клешнехват", + [4823] = "Колючий членистоног", + [4824] = "Рыбоед Аку'май", + [4825] = "Хрустогрыз Аку'май", + [4841] = "Зыбун", + [4861] = "Крылан-охотник", + [4887] = "Гхаму-ра", + [4950] = "Спот", + [5048] = "Загадочный аспид", + [5053] = "Загадочный кроколиск", + [5056] = "Загадочный страхозуб", + [5224] = "Мрачный ползун", + [5225] = "Мракоплюй", + [5260] = "Гроддокская обезьяна", + [5262] = "Гроддокский рокотун", + [5268] = "Медведь-сталемех", + [5272] = "Седой медведь-сталемех", + [5274] = "Сталемех-патриарх", + [5286] = "Длиннозуб-охотник", + [5287] = "Длиннозубый ревун", + [5288] = "Бешеный длиннозуб", + [5291] = "Ледокрыл из племени Хаккари", + [5307] = "Дольный крикун", + [5308] = "Норовистый дольный крикун", + [5349] = "Араш-етис", + [5352] = "Старый Серобрюх", + [5356] = "Рыкун", + [5422] = "Скорпид-охотник", + [5423] = "Плетохвостый скорпид", + [5424] = "Песчаный скорпид-охотник", + [5425] = "Голодный хромоног", + [5426] = "Хромоногая гиена", + [5427] = "Бешеный стертолап", + [5428] = "Рух", + [5429] = "Огненный рух", + [5430] = "Опаляющий рух", + [5431] = "Береговая черепаха", + [5432] = "Гигантская береговая черепаха", + [5708] = "Порождение Хаккара", + [5755] = "Загадочная гадюка", + [5756] = "Загадочный крылояд", + [5762] = "Загадочная болотная гадюка", + [5766] = "Детеныш зищника саванны", + [5807] = "Цап-царап", + [5823] = "Смертоносный живодер", + [5828] = "Вожак стаи Хумар", + [5829] = "Фырк Дразнила", + [5834] = "Аззира Клинок Небес", + [5842] = "Такк Прыгун", + [5856] = "Хрустальный паук", + [5857] = "Опаляющий лавовый паук", + [5858] = "Большой лавовый паук", + [5865] = "Дишу", + [5937] = "Коварное Жало", + [5982] = "Черный душегуб", + [5984] = "Голодный хохотун", + [5985] = "Хохочущая гиена", + [5988] = "Скорпок-острожал", + [5992] = "Пеплогривый кабан", + [6013] = "Своенравный канюк", + [6352] = "Кораллопанцирный скрытень", + [6369] = "Кораллопанцирная черепаха", + [6505] = "Равазавр", + [6506] = "Равазавр-бегун", + [6507] = "Равазавр-охотник", + [6508] = "Ядовитый равазавр", + [6513] = "Ун'Горский топотун", + [6514] = "Ун'горская горилла", + [6516] = "Ун'Горский рокотун", + [6581] = "Равазавр-матриарх", + [6585] = "Ак'лок", + [6788] = "Мать-медведица", + [6789] = "Медвежонок-осотник", + [7022] = "Ядоносный скорпид", + [7055] = "Ворг из клана Черной Горы", + [7078] = "Пещерный скорпид", + [7097] = "Железноклюв", + [7098] = "Железноклюв-крикун", + [7099] = "Железноклюв-охотник", + [7268] = "Страж из племени Песчаной Бури", + [7319] = "Леди Сатра", + [7405] = "Смертоносный пещерный скорпид", + [7430] = "Детеныш ледопарда", + [7431] = "Ледопард", + [7432] = "Ловчий ледопард", + [7433] = "Ледопард-охотница", + [7434] = "Дозорный прайда ледопардов", + [7443] = "Могучий щербозуб", + [7444] = "Медведь-щербозуб", + [7445] = "Старый щербозуб", + [7446] = "Бешеный щербозуб", + [7455] = "Сова Зимних Ключей", + [7456] = "Крикун Зимних Ключей", + [7803] = "Песчаный скорпид", + [8207] = "Большой огнекрыл", + [8208] = "Безжалостный хромоног", + [8211] = "Старый утесный прыгун", + [8213] = "Сталеспин", + [8277] = "Рекк'тилак", + [8299] = "Злобоклюй", + [8300] = "Разор", + [8301] = "Щелкун Разоритель", + [8303] = "Хрюггер", + [8336] = "Сапер из племени Хаккари", + [8600] = "Чумной нетопырь", + [8601] = "Пагубный нетопырь", + [8602] = "Чудовищный чумной нетопырь", + [8762] = "Древесный отшельник", + [8926] = "Глубинный острожал", + [8927] = "Черный крикун", + [8933] = "Пещерный ползун", + [8956] = "Медведь злобных когтей", + [8958] = "Злобнопалый изверг", + [8959] = "Волк-сквернолап", + [8960] = "Падальщик-сквернолап", + [8961] = "Опустошитель-сквернолап", + [9416] = "Ворг легиона Изрубленного Щита", + [9622] = "У'ча", + [9683] = "Самка Лар'корви", + [9684] = "Лар'корви", + [9690] = "Пепельный ворг", + [9691] = "Ядожалый скорпид", + [9694] = "Слюнявый пепельный ворг", + [9695] = "Скорпид-смертехлест", + [9696] = "Ворг легиона Кровавого Топора", + [9697] = "Огромный пепельный ворг", + [9698] = "Огнехвостый скорпид", + [10077] = "Гиблопасть", + [10200] = "Рак'шири", + [10221] = "Щенок ворга легиона Кровавого Топора", + [10356] = "Зверр", + [10357] = "Куссан Жалящий", + [10359] = "Шри'скалк", + [10375] = "Скальный паучонок", + [10644] = "Ревун из тумана", + [10737] = "Ши-Ротам", + [10741] = "Сиан-Ротам", + [10806] = "Урсиус", + [10882] = "Арикара", + [10981] = "Северный волк", + [11357] = "Сын Хаккара", + [11360] = "Зулианский тигренок", + [11361] = "Зулианский тигр", + [11365] = "Зулианская пантера", + [11368] = "Кровососущий нетопырь", + [11370] = "Черная вдова Раззаши", + [11371] = "Змей Раззаши", + [11372] = "Аспид Раззаши", + [11735] = "Камнехвостый скорпид", + [11736] = "Камнехвостый клешневик", + [11737] = "Камнехвостый живодер", + [11738] = "Песчаный паук-быстроног", + [11739] = "Скальный паук-скакун", + [11921] = "Бесселет", + [12037] = "Урсол'лок", + [12431] = "Жуткоклык", + [12432] = "Старый Губач", + [12433] = "Кретис Тенеткач", + [13599] = "Вялый хрустогрыз", + [14123] = "Стальноклювый крепкохват", + [14222] = "Арага", + [14223] = "Злобный Бенджи", + [14228] = "Хохотунья", + [14232] = "Дарт", + [14233] = "Чешуекус", + [14234] = "Хайок", + [14266] = "Шанда Прядильщица", + [14268] = "Лорд Кондар", + [14279] = "Ползух", + [14280] = "Большой Самрас", + [14283] = "Сова клана Грозовой Вершины", + [14339] = "Смертный вой", + [14343] = "Олм Мудрый", + [14344] = "Полукров", + [14472] = "Гретир", + [14476] = "Креллак", + [14491] = "Курмокк", + [14532] = "Ядокус Раззаши", + [14821] = "Ящер Раззаши", + [14965] = "Бесноватый кровососущий нетопырь", + [15041] = "Порождение Мар'ли", + [15043] = "Зулианский кроколиск", + [15101] = "Зулианский хищник", + [16117] = "Чумной кабан", +} diff --git a/locales/data/beasts/zhCN.lua b/locales/data/beasts/zhCN.lua new file mode 100644 index 0000000..bf87ba7 --- /dev/null +++ b/locales/data/beasts/zhCN.lua @@ -0,0 +1,713 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.beasts = MTH_LocaleData.data.beasts or {} + +MTH_LocaleData.data.beasts.zhCN = { + [30] = "森林蜘蛛", + [43] = "矿坑蜘蛛", + [69] = "森林狼", + [113] = "石牙野猪", + [118] = "觅食的灰狼", + [119] = "长鼻野猪", + [154] = "大碎尸鸟", + [157] = "血牙野猪", + [199] = "小碎尸鸟", + [213] = "饥饿的恐狼", + [217] = "结网毒蜘蛛", + [299] = "幼狼", + [330] = "公主", + [345] = "贝利格拉布", + [390] = "公主的随从", + [428] = "恐鹫", + [442] = "狼蛛", + [454] = "幼年血牙野猪", + [462] = "乌尔图斯", + [471] = "母蜘蛛", + [505] = "巨型狼蛛", + [521] = "鲁伯斯", + [524] = "石皮野猪", + [525] = "癞皮狼", + [539] = "小型结网毒蜘蛛", + [547] = "巨型血牙野猪", + [565] = "疯狂的恐狼", + [569] = "绿色独行蛛", + [574] = "纳拉克西斯", + [616] = "查特", + [628] = "黑色破坏者", + [681] = "小荆棘谷猛虎", + [682] = "荆棘谷猛虎", + [683] = "小猎豹", + [684] = "深喉猎豹", + [685] = "荆棘谷迅猛龙", + [686] = "鞭尾迅猛龙", + [687] = "丛林捕猎者", + [704] = "蓬毛森林狼", + [705] = "蓬毛幼狼", + [708] = "小型峭壁野猪", + [728] = "巴尔瑟拉", + [729] = "辛达尔", + [730] = "泰希斯", + [731] = "虎王邦加拉西", + [736] = "黑豹", + [767] = "沼泽虎", + [768] = "暗影黑豹", + [769] = "死亡狼蛛", + [772] = "荆棘谷雌虎", + [822] = "小森林熊", + [830] = "沙行蟹", + [831] = "海行蟹", + [833] = "山狗首领", + [834] = "山狗", + [854] = "幼年丛林捕猎者", + [855] = "幼年荆棘谷迅猛龙", + [856] = "幼年鞭尾迅猛龙", + [858] = "沼泽纺丝蛛", + [922] = "淤泥蟹", + [923] = "小黑色破坏者", + [930] = "小型黑寡妇蜘蛛", + [949] = "食腐独行蛛", + [976] = "库尔森战虎", + [977] = "库尔森战豹", + [1015] = "高地迅猛龙", + [1016] = "高地鞭尾龙", + [1017] = "高地镰爪龙", + [1018] = "高地刺喉龙", + [1019] = "老刺喉龙", + [1020] = "杂斑迅猛龙", + [1021] = "杂斑尖啸龙", + [1022] = "杂斑镰爪龙", + [1023] = "杂斑刺喉龙", + [1082] = "盐齿鳄鱼", + [1084] = "小盐齿鳄鱼", + [1087] = "盐齿钳嘴鳄", + [1088] = "巨型淤泥蟹", + [1108] = "迷雾谷猩猩", + [1109] = "碎尸鸟", + [1111] = "吸血捕猎者", + [1112] = "吸血寡妇", + [1114] = "丛林大猩猩", + [1125] = "峭壁野猪", + [1126] = "大峭壁野猪", + [1127] = "老峭壁野猪", + [1128] = "小黑熊", + [1129] = "黑熊", + [1130] = "游荡的冰爪熊", + [1131] = "冬狼", + [1132] = "狂暴的冬狼", + [1133] = "饥饿的冬狼", + [1138] = "雪狼", + [1140] = "刺喉雌龙", + [1150] = "淡水鳄", + [1152] = "钳嘴鳄鱼", + [1184] = "峭壁潜伏者", + [1185] = "林木潜伏者", + [1186] = "老黑熊", + [1188] = "灰斑黑熊", + [1189] = "黑熊首领", + [1190] = "山猪", + [1191] = "癞皮山猪", + [1192] = "老山猪", + [1194] = "山鹫", + [1195] = "森林潜伏者", + [1196] = "冰爪熊", + [1199] = "雪豹幼崽", + [1201] = "雪豹", + [1216] = "滩行蟹", + [1225] = "老煤灰", + [1258] = "巨型黑色破坏者", + [1400] = "湿地鳄鱼", + [1417] = "小湿地鳄鱼", + [1504] = "小夜行蜘蛛", + [1505] = "夜行蜘蛛", + [1508] = "小食腐狼", + [1509] = "蓬毛食腐狼", + [1511] = "暴怒的银背猩猩", + [1512] = "夜行蝙蝠", + [1513] = "癞皮夜行蝙蝠", + [1516] = "康达", + [1547] = "衰老的黑暗犬", + [1548] = "被诅咒的黑暗犬", + [1549] = "饥饿的黑暗犬", + [1553] = "巨型夜行蝙蝠", + [1554] = "吸血夜行蝙蝠", + [1555] = "邪恶的夜行蜘蛛", + [1557] = "老迈的迷雾谷猩猩", + [1558] = "银背雌猩猩", + [1688] = "夜行雌蜘蛛", + [1689] = "有伤疤的峭壁野猪", + [1693] = "洛克鳄", + [1713] = "老年深喉猎豹", + [1765] = "座狼", + [1766] = "杂斑座狼", + [1778] = "凶猛的灰斑熊", + [1780] = "苔藓阔步者", + [1781] = "迷雾爬行者", + [1797] = "巨型灰斑熊", + [1809] = "食腐秃鹫", + [1815] = "生病的黑熊", + [1816] = "生病的灰熊", + [1817] = "生病的狼", + [1822] = "毒雾潜伏者", + [1824] = "瘟疫潜伏者", + [1922] = "森林灰狼", + [1923] = "血牙座狼", + [1961] = "癞爪", + [1984] = "小草刺野猪", + [1985] = "草刺野猪", + [1986] = "树林蜘蛛", + [1994] = "邪恶的基塞伊斯", + [1995] = "巨翼枭", + [1996] = "巨翼恶枭", + [1997] = "巨翼猎枭", + [1998] = "树林潜伏者", + [1999] = "树林毒蜘蛛", + [2000] = "树林结网蛛", + [2001] = "巨型树林蜘蛛", + [2031] = "夜刃豹幼崽", + [2032] = "癞皮夜刃豹", + [2033] = "老夜刃豹", + [2034] = "野生夜刃豹", + [2042] = "夜刃豹", + [2043] = "夜刃捕食者", + [2069] = "月夜猛虎", + [2070] = "月夜猛虎幼崽", + [2071] = "月夜雌虎", + [2089] = "巨型湿地鳄鱼", + [2163] = "蓟熊", + [2165] = "灰斑蓟熊", + [2172] = "雌性森林陆行鸟", + [2175] = "影爪", + [2231] = "小潮行蟹", + [2232] = "潮行蟹", + [2233] = "硬壳潮行蟹", + [2234] = "小暗礁蟹", + [2235] = "暗礁蟹", + [2236] = "狂暴暗礁蟹", + [2237] = "月夜雄虎", + [2275] = "暴怒的斯坦利", + [2321] = "森林陆行鸟雏鸟", + [2322] = "森林陆行鸟", + [2323] = "凶猛的森林陆行鸟", + [2348] = "老食苔蛛", + [2349] = "巨型食苔蛛", + [2350] = "森林食苔蛛", + [2351] = "灰熊", + [2354] = "邪恶的灰熊", + [2356] = "老灰熊", + [2384] = "饥饿的山地狮", + [2385] = "野生山地狮", + [2406] = "山地狮", + [2407] = "巨型山地狮", + [2408] = "钳嘴龟", + [2476] = "大型洛克鳄", + [2505] = "海水钳嘴龟", + [2521] = "蓝鬃猩猩", + [2522] = "丛林猎豹", + [2544] = "南部沙蟹", + [2559] = "高地阔步龙", + [2560] = "高地长尾龙", + [2561] = "高地猎兽龙", + [2563] = "平原狼蛛", + [2565] = "巨型平原狼蛛", + [2578] = "小山地秃鹰", + [2579] = "山地秃鹰", + [2580] = "老山地秃鹰", + [2635] = "老海鳄", + [2680] = "邪枝幼狼", + [2681] = "邪枝巨狼", + [2686] = "枯木巢穴守卫", + [2727] = "峭壁山狗", + [2728] = "野生峭壁山狗", + [2729] = "老峭壁山狗", + [2730] = "疯狂的峭壁山狗", + [2731] = "山脊巡行者", + [2732] = "山脊雌豹", + [2734] = "山脊雄豹", + [2753] = "巴纳布斯", + [2829] = "饥饿的秃鹫", + [2830] = "秃鹫", + [2831] = "巨型秃鹫", + [2850] = "断牙", + [2923] = "癞皮银鬃狼", + [2924] = "银鬃狼", + [2925] = "银鬃嗥狼", + [2926] = "银鬃捕猎者", + [2931] = "札里科特", + [2954] = "刺背斗猪", + [2955] = "平原陆行鸟", + [2956] = "成年平原陆行鸟", + [2957] = "老平原陆行鸟", + [2958] = "草原狼", + [2959] = "草原捕食者", + [2960] = "草原狼前锋", + [2961] = "山狮", + [2966] = "斗猪", + [2969] = "消瘦的猛鹫", + [2970] = "猛鹫", + [2971] = "长爪猛鹫", + [3035] = "平原狮", + [3068] = "马兹拉纳其", + [3098] = "杂斑野猪", + [3099] = "可怕的杂斑野猪", + [3100] = "老杂斑野猪", + [3106] = "小海浪蟹", + [3107] = "海浪蟹", + [3108] = "硬壳海浪蟹", + [3110] = "巨齿鳄鱼", + [3121] = "杜隆塔尔猛虎", + [3122] = "血爪鞭尾龙", + [3123] = "血爪锐齿龙", + [3124] = "蝎子", + [3125] = "巨钳蝎", + [3126] = "硬甲蝎", + [3127] = "毒尾蝎", + [3225] = "堕落的杂斑野猪", + [3226] = "堕落蝎", + [3227] = "堕落的血爪锐齿龙", + [3228] = "堕落海浪蟹", + [3231] = "堕落的巨齿鳄鱼", + [3241] = "草原狮王", + [3243] = "长鬃草原狮", + [3244] = "巨型平原陆行鸟", + [3245] = "暴躁的平原陆行鸟", + [3246] = "敏捷的平原陆行鸟", + [3247] = "雷鹰雏鸟", + [3249] = "巨型雷鹰", + [3250] = "异种爬行者", + [3252] = "异种群居蝎", + [3254] = "赤鳞鞭尾龙", + [3255] = "赤鳞尖啸龙", + [3256] = "赤鳞镰爪龙", + [3257] = "伊沙姆哈尔", + [3281] = "萨科斯", + [3415] = "雌性草原狮", + [3416] = "草原狮后", + [3424] = "雷鹰破云者", + [3425] = "草原徘徊者", + [3461] = "绿洲钳嘴龟", + [3472] = "瓦希塔帕恩", + [3475] = "埃其亚基", + [3503] = "异种护卫者", + [3566] = "平原徘徊者", + [3581] = "下水道鳄鱼", + [3619] = "幽灵豹", + [3630] = "变异曲蛇", + [3631] = "变异刺鞭蛇", + [3632] = "变异爬行者", + [3633] = "变异屠戮者", + [3634] = "变异捕猎者", + [3636] = "变异破坏者", + [3637] = "变异守护者", + [3653] = "克雷什", + [3809] = "灰谷熊", + [3810] = "老灰谷熊", + [3811] = "灰谷巨熊", + [3812] = "巨钳蟹", + [3814] = "刺壳蟹", + [3819] = "野棘捕猎者", + [3820] = "野棘毒蜘蛛", + [3821] = "野棘潜伏者", + [3823] = "幽爪奔跑者", + [3824] = "幽爪嗥叫者", + [3825] = "幽爪前锋", + [3861] = "灰色座狼", + [3862] = "流涎的座狼", + [3866] = "邪蝠", + [3868] = "觅血者", + [4005] = "深苔爬行者", + [4006] = "深苔结网蛛", + [4007] = "深苔毒蜘蛛", + [4040] = "洞穴捕猎者", + [4067] = "夜行虎", + [4117] = "风蛇", + [4118] = "毒性风蛇", + [4119] = "老风蛇", + [4124] = "千针石林山狮", + [4126] = "峭壁捕猎者", + [4127] = "乱齿土狼", + [4128] = "乱齿捕猎者", + [4129] = "乱齿狂吠者", + [4139] = "恐蝎", + [4140] = "恐蝎劫掠者", + [4142] = "盐壳龟", + [4143] = "盐壳钳嘴龟", + [4144] = "盐壳掘地龟", + [4154] = "盐湖食腐鹫", + [4158] = "盐湖秃鹫", + [4248] = "杂毛土狼", + [4249] = "杂毛嚎叫者", + [4250] = "加拉克猎犬", + [4263] = "深苔幼蛛", + [4264] = "深苔雌蜘蛛", + [4304] = "血色捕猎犬", + [4316] = "科卡尔猎犬", + [4341] = "尘泥鳄鱼", + [4342] = "尘泥锐爪鳄鱼", + [4343] = "尘泥钳嘴鳄鱼", + [4344] = "尘泥杂斑鳄鱼", + [4345] = "尘泥利齿鳄鱼", + [4351] = "血沼迅猛龙", + [4352] = "血沼尖啸龙", + [4355] = "血沼镰爪龙", + [4356] = "血沼刺喉龙", + [4357] = "血沼鞭尾龙", + [4376] = "黑雾蜘蛛", + [4377] = "黑雾潜伏者", + [4378] = "黑雾独行蛛", + [4379] = "黑雾纺丝者", + [4380] = "黑雾寡妇蛛", + [4396] = "泥石海龟", + [4397] = "泥石刺壳龟", + [4398] = "泥石穴居龟", + [4399] = "泥石掘洞龟", + [4400] = "泥石钳嘴龟", + [4411] = "暗牙潜伏者", + [4412] = "暗牙爬行者", + [4413] = "暗牙蜘蛛", + [4414] = "暗牙毒蜘蛛", + [4415] = "巨型暗牙蜘蛛", + [4425] = "盲眼猎手", + [4511] = "阿迦玛", + [4512] = "腐烂的阿迦玛", + [4514] = "暴怒的阿迦玛", + [4538] = "沼泽蝙蝠", + [4539] = "巨型沼泽蝙蝠", + [4548] = "钢齿土狼", + [4660] = "玛洛迪骨爪土狼", + [4662] = "玛格拉姆骨爪土狼", + [4688] = "骨爪土狼", + [4689] = "饥饿的骨爪土狼", + [4690] = "疯狂的骨爪土狼", + [4692] = "恐怖飞扑者", + [4693] = "恐怖飞鸟", + [4694] = "恐怖撕裂者", + [4695] = "恐怖腐化鸟", + [4696] = "荒土巨钳蝎", + [4697] = "荒土鞭尾蝎", + [4699] = "荒土毒尾蝎", + [4821] = "滑腻的甲壳蟹", + [4822] = "巨钳甲壳蟹", + [4823] = "刺毛甲壳蟹", + [4824] = "阿库麦尔食鱼龟", + [4825] = "阿库麦尔钳嘴龟", + [4841] = "死沼巨鳄", + [4861] = "利齿蝙蝠", + [4887] = "加摩拉", + [4950] = "斑斑", + [5048] = "无毒飞蛇", + [5053] = "变异鳄鱼", + [5056] = "变异尖牙风蛇", + [5224] = "黑暗滑行虫", + [5225] = "黑暗粘液虫", + [5260] = "格罗多克猿人", + [5262] = "格罗多克大猩猩", + [5268] = "铁鬃熊", + [5272] = "铁鬃灰熊", + [5274] = "铁鬃熊王", + [5286] = "长牙奔跑者", + [5287] = "长牙嚎叫者", + [5288] = "疯狂的长牙狼", + [5291] = "哈卡莱霜翼飞蛇", + [5307] = "山谷尖啸者", + [5308] = "游荡的山谷尖啸者", + [5349] = "阿拉瑟希斯", + [5352] = "灰腹老熊", + [5356] = "咆哮者", + [5422] = "沙漠猎食蝎", + [5423] = "沙漠鞭尾蝎", + [5424] = "沙漠疾行蝎", + [5425] = "饥饿的疱爪土狼", + [5426] = "疱爪土狼", + [5427] = "疯狂的疱爪土狼", + [5428] = "大鹏", + [5429] = "火鹏", + [5430] = "炎鹏", + [5431] = "海浪龟", + [5432] = "巨型滑浪龟", + [5708] = "哈卡的后代", + [5755] = "剧毒飞蛇", + [5756] = "变异剧毒风蛇", + [5762] = "弱毒飞蛇", + [5766] = "草原幼狮", + [5807] = "扫荡者", + [5823] = "死亡毒蝎", + [5828] = "狮王休玛", + [5829] = "土狼斯诺特", + [5834] = "天空之刃艾泽里", + [5842] = "跳跃者塔克", + [5856] = "晶网蜘蛛", + [5857] = "灼热熔岩蜘蛛", + [5858] = "巨型熔岩蜘蛛", + [5865] = "迪舒", + [5937] = "邪刺恐蝎", + [5982] = "黑色屠戮者", + [5984] = "饥饿的弯牙土狼", + [5985] = "弯牙土狼", + [5988] = "厚甲毒刺蝎", + [5992] = "灰鬃野猪", + [6013] = "游荡的秃鹫", + [6352] = "珊瑚潜伏者", + [6369] = "珊瑚海龟", + [6505] = "暴掠龙", + [6506] = "疾奔暴掠龙", + [6507] = "狩猎暴掠龙", + [6508] = "毒皮暴掠龙", + [6513] = "安戈洛巨猩猩", + [6514] = "安戈洛猩猩", + [6516] = "安戈洛大猩猩", + [6581] = "暴掠龙女王", + [6585] = "乌卡洛克", + [6788] = "雌蓟熊", + [6789] = "小蓟熊", + [7022] = "毒鞭蝎", + [7055] = "黑石座狼", + [7078] = "裂隙沙漠蝎", + [7097] = "铁喙猫头鹰", + [7098] = "铁喙尖啸者", + [7099] = "铁喙狩猎者", + [7268] = "沙怒守护者", + [7319] = "萨丝拉", + [7405] = "致命的裂隙沙漠蝎", + [7430] = "小霜刃豹", + [7431] = "霜刃豹", + [7432] = "霜刃捕食者", + [7433] = "霜刃雌豹", + [7434] = "霜刃守卫者", + [7443] = "碎齿暴熊", + [7444] = "碎齿熊", + [7445] = "老碎齿熊", + [7446] = "疯狂的碎齿熊", + [7455] = "冬泉巨枭", + [7456] = "冬泉鸣枭", + [7803] = "沙漠掘洞蝎", + [8207] = "巨型火鸟", + [8208] = "残忍的疱爪土狼", + [8211] = "海崖奔跳者", + [8213] = "铁背龟", + [8277] = "雷克提拉克", + [8299] = "斯比弗雷尔", + [8300] = "毁灭", + [8301] = "掠夺者科拉克", + [8303] = "格朗特", + [8336] = "哈卡莱挖掘者", + [8600] = "瘟疫蝙蝠", + [8601] = "毒性瘟疫蝙蝠", + [8602] = "巨型瘟疫蝙蝠", + [8762] = "林木隐匿者", + [8926] = "深渊钉刺者", + [8927] = "黑暗尖啸者", + [8933] = "洞穴爬行者", + [8956] = "怒爪熊", + [8958] = "怒爪巨熊", + [8959] = "魔爪狼", + [8960] = "魔爪食腐狼", + [8961] = "魔爪掠夺者", + [9416] = "裂盾座狼", + [9622] = "尤尔查", + [9683] = "拉克维的配偶", + [9684] = "拉克维", + [9690] = "灰烬座狼", + [9691] = "毒尖蝎", + [9694] = "流涎的灰烬座狼", + [9695] = "死鞭蝎", + [9696] = "血斧座狼", + [9697] = "巨型灰烬座狼", + [9698] = "火尾蝎", + [10077] = "死亡之喉", + [10200] = "拉克西里", + [10221] = "血斧座狼幼崽", + [10356] = "贝恩", + [10357] = "毒针雷萨恩", + [10359] = "瑟斯库克", + [10375] = "尖塔小蜘蛛", + [10644] = "迷雾嚎叫者", + [10737] = "希洛塔姆", + [10741] = "赛洛塔姆", + [10806] = "尤西乌斯", + [10882] = "阿利卡拉", + [10981] = "霜狼", + [11357] = "哈卡之子", + [11360] = "祖利安幼虎", + [11361] = "祖利安猛虎", + [11365] = "祖利安雌猎虎", + [11368] = "觅血蝙蝠", + [11370] = "拉札什寡妇蜘蛛", + [11371] = "拉扎什毒蛇", + [11372] = "拉札什奎蛇", + [11735] = "石鞭蝎", + [11736] = "石鞭巨钳蝎", + [11737] = "石鞭掠夺者", + [11738] = "掠沙蜘蛛", + [11739] = "石行蜘蛛", + [11921] = "贝瑟莱斯", + [12037] = "乌索洛克", + [12431] = "血牙狼人", + [12432] = "维斯迦尔", + [12433] = "克雷希斯", + [13599] = "迟钝的钳嘴龟", + [14123] = "钢腭钳嘴龟", + [14222] = "阿拉加", + [14223] = "暴躁的本希", + [14228] = "怪笑者", + [14232] = "飞镖", + [14233] = "裂鳞", + [14234] = "哈尤克", + [14266] = "纺织者杉达", + [14268] = "康达尔老爷", + [14279] = "爬行的塞斯", + [14280] = "大个子萨姆拉斯", + [14283] = "雷矛猫头鹰", + [14339] = "死亡之嚎", + [14343] = "智者奥尔姆", + [14344] = "莫戈雷斯", + [14472] = "格雷瑟尔", + [14476] = "克里拉克", + [14491] = "库尔莫克", + [14532] = "拉札什毒液蜘蛛", + [14821] = "拉札什迅猛龙", + [14965] = "疯狂的觅血蝠", + [15041] = "玛尔里的爪牙", + [15043] = "祖利安鳄鱼", + [15101] = "祖利安徘徊者", + [16117] = "瘟疫野猪", + [36507] = "斯巴特", + [36514] = "霜刃豹幼崽", + [37007] = "黑寡妇幼蛛", + [40000] = "红色狐狸", + [50624] = "异种群居蝎", + [50627] = "异种群居蝎", + [50630] = "异种群居蝎", + [60494] = "悲爪", + [60697] = "抚慰犬", + [60848] = "刺背野猪", + [61074] = "高原大猩猩", + [61075] = "岩壳爬行者", + [61076] = "沙壳爬行者", + [61077] = "高原黑猩猩", + [61078] = "高原猴子", + [61080] = "年迈的高原大猩猩", + [61082] = "高原雷霆猩猩", + [61090] = "刷尾眼镜蛇", + [61091] = "刷尾蝰蛇", + [61095] = "毒液掠夺尖啸者", + [61096] = "毒液掠夺毒蛇", + [61098] = "莫罗戈·雷足国王", + [61206] = "掠网爬行者", + [61218] = "变异弯曲幼蛇", + [61227] = "暮毛徘徊者", + [61228] = "暮毛追猎者", + [61229] = "饥饿的暮毛", + [61230] = "邪翼蝙蝠宝宝", + [61231] = "邪翼蝙蝠", + [61232] = "空网蜘蛛", + [61233] = "空网喷毒者", + [61336] = "巨角猫头鹰", + [61337] = "巨角猎人", + [61401] = "巨型邪翼蝙蝠", + [61488] = "蔚蓝喙", + [61500] = "高原银背兽", + [61552] = "暮掠者", + [61554] = "黎明嚎叫", + [61599] = "暗豹", + [61656] = "灰羽秃鹰", + [61657] = "灰羽猎食者", + [61658] = "灰爪土狼", + [61659] = "灰爪猎手", + [61660] = "石尾蝎", + [61661] = "石尾鞭笞者", + [61662] = "黑毒蝎", + [61680] = "泥沼爬行者", + [61681] = "幼年泥沼爬行者", + [61686] = "灰羽食腐者", + [61689] = "幼年萨拉斯野猪", + [61690] = "幼年血色山猫", + [61691] = "森林陆行鸟", + [61692] = "萨拉斯野猪", + [61693] = "血色山猫", + [61695] = "白色陆行鸟", + [61696] = "年迈的萨拉斯野猪", + [61697] = "明亮山猫", + [61698] = "明亮山猫雌兽", + [61699] = "夏尔兰", + [61700] = "年迈的血色山猫", + [61704] = "远行爬行者", + [61716] = "赤红陆行鸟", + [61717] = "萨拉斯狐狸", + [61774] = "辉煌法力雏龙", + [61775] = "翡翠法力雏龙", + [61776] = "淡紫法力雏龙", + [61789] = "月羽", + [61975] = "巨牙野猪", + [62066] = "穴织女王", + [62073] = "穴织蜘蛛", + [62074] = "穴织爬行者", + [62075] = "穴织毒蜘蛛", + [62121] = "金鬃野猪", + [62122] = "雄壮的金鬃野猪", + [62123] = "金皮熊", + [62124] = "金皮灰熊", + [62125] = "年迈的森林狼", + [62126] = "森林狼前锋", + [62223] = "酷鳞迅猛龙", + [62224] = "酷鳞尖啸龙", + [62225] = "酷鳞长尾龙", + [62226] = "石皮野猪", + [62227] = "年迈的石皮野猪", + [62247] = "棕色隐匿者", + [62248] = "巨型棕色隐匿者", + [62256] = "清水钳嘴龟", + [62257] = "生病的清水钳嘴龟", + [62258] = "剃齿鳄鱼", + [62259] = "巨型剃齿鳄鱼", + [62260] = "森林野猪", + [62261] = "老森林野猪", + [62262] = "山地野猪", + [62271] = "幼年金鬃野猪", + [62272] = "幼年森林狼", + [62338] = "雷翼秃鹰", + [62339] = "雷翼秃鹫", + [62340] = "蓬毛峭壁山狗", + [62341] = "流涎的峭壁山狗", + [62342] = "雾木蜘蛛", + [62343] = "雾木结网蜘蛛", + [62344] = "雾木蛛母", + [62345] = "悲痛湖鳄鱼", + [62642] = "锋鳞", + [80250] = "血色山猫", + [80252] = "极地狐幼崽", + [80254] = "棕狐幼崽", + [80256] = "银狐", + [80257] = "红狐", + [80258] = "雾狐幼崽", + [80259] = "雾狐", + [80260] = "灵狐", + [80466] = "提瑞斯法瘟疫熊", + [80815] = "阿曼尼雄鹰", + [80816] = "辛特兰雄鹰", + [80920] = "阿曼尼雄鹰", + [90980] = "祖利安黑豹", + [90981] = "祖利安黑豹", + [91819] = "海祖瑞猛虎", + [91825] = "丛林虎幼崽", + [91826] = "丛林母虎", + [91827] = "丛林虎", + [91828] = "丛林前锋虎", + [91829] = "林背践踏猿", + [91830] = "林背迅击猿", + [91831] = "锐钳蟹", + [91832] = "海岛龙虾人", + [91833] = "岩石蟹", + [91838] = "厚壳钳嘴龟", + [91960] = "林爪黑豹", + [91961] = "林爪暗影黑豹", + [91962] = "盐钳鳄鱼", + [91966] = "毒性林蛇", + [91984] = "提瑞斯熊", + [91985] = "提瑞斯利爪幼熊", + [91987] = "峭壁牙野猪", + [91989] = "灰爪狼", + [91990] = "灰爪阿尔法", + [92115] = "被激怒的利爪", + [92146] = "沙滩蟹", + [92147] = "银岸蟹", +} diff --git a/locales/data/items/deDE.lua b/locales/data/items/deDE.lua new file mode 100644 index 0000000..9df8332 --- /dev/null +++ b/locales/data/items/deDE.lua @@ -0,0 +1,331 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.deDE = { + [2098] = "Doppelläufige Schrotflinte", + [2099] = "Zwergische Handkanone", + [2100] = "Präzise kalibriertes Schießeisen", + [2504] = "Abgenutzter Kurzbogen", + [2505] = "Polierter Kurzbogen", + [2506] = "Hornholzdoppelbogen", + [2507] = "Laminierter Doppelbogen", + [2508] = "Alte Donnerbüchse", + [2509] = "Verschnörkelte Donnerbüchse", + [2510] = "Robuste Donnerbüchse", + [2511] = "Jägerschießeisen", + [2512] = "Rauer Pfeil", + [2515] = "Scharfer Pfeil", + [2516] = "Leichtes Geschoss", + [2519] = "Schweres Geschoss", + [2550] = "Monster - Bow, Short", + [2551] = "Monster - Crossbow", + [2552] = "Monster - Gun", + [2773] = "Gesprungener Kurzbogen", + [2774] = "Rostbedeckte Donnerbüchse", + [2777] = "Schwächlicher Kurzbogen", + [2778] = "Billige Donnerbüchse", + [2780] = "Leichter Jagdbogen", + [2781] = "Schmutzige Donnerbüchse", + [2782] = "Verschlissener Doppelbogen", + [2783] = "Schäbige Donnerbüchse", + [2785] = "Steifer Doppelbogen", + [2786] = "Geölte Donnerbüchse", + [2824] = "Hurrikan", + [2825] = "Bogen der Sengpfeile", + [2903] = "Daryls Jagdbogen", + [2904] = "Daryls Jagdgewehr", + [3021] = "Waldläuferbogen", + [3023] = "Großkalibrige Donnerbüchse", + [3024] = "BKP 2700 \"Vollstrecker\"", + [3025] = "BKP 42 \"Ultra\"", + [3026] = "Verstärkter Bogen", + [3027] = "Schwerer Doppelbogen", + [3028] = "Longbow", + [3030] = "Schneidenpfeil", + [3033] = "Robustes Geschoss", + [3034] = "Glyphed Breastplate", + [3036] = "Schwerer Kurzbogen", + [3037] = "Peitschenholzdoppelbogen", + [3039] = "Kurzer Eschenbogen", + [3040] = "Vorderlader des Jägers", + [3041] = "Donnerbüchse \"Magierauge\"", + [3042] = "BKP \"Spatz\" Kleinkaliber", + [3078] = "Nagaherzbohrer", + [3079] = "Skorns Gewehr", + [3430] = "Heckenschützengewehr", + [3464] = "Gefiederter Pfeil", + [3465] = "Explosivgeschoss", + [3493] = "Raptor-Ex", + [3567] = "Zwergische Angelrute", + [3742] = "Bogen des Plünderns", + [3778] = "Gespannter Kompositbogen", + [3780] = "Langläufige Muskete", + [4025] = "Ausbalancierter Langbogen", + [4026] = "Schildwachenmuskete", + [4086] = "Blitzgewehr", + [4087] = "Volltrefferbogen", + [4089] = "Querschlägerbüchse", + [4110] = "Meisterjägerbogen", + [4111] = "Gewehr des Meisterjägers", + [4127] = "Schrapnellblaster", + [4362] = "Raues Schießeisen", + [4369] = "Tödliche Donnerbüchse", + [4372] = "Liebevoll hergestelltes Schießeisen", + [4379] = "Versilberte Schrotflinte", + [4383] = "Mondsichtgewehr", + [4474] = "Rabenholzbogen", + [4576] = "Leichter Bogen", + [4577] = "Kompakte Schrotflinte", + [4763] = "Blackwood Recurve Bow", + [4931] = "Hickorykurzbogen", + [4960] = "Blitzkügelchen", + [5258] = "Monster - Bow, Black", + [5259] = "Monster - Bow, Red", + [5260] = "Monster - Bow, Brown", + [5261] = "Monster - Bow, Gray", + [5262] = "Monster - Bow, Dark Brown", + [5309] = "Freibeutermuskete", + [5346] = "Orcischer Kampfbogen", + [5568] = "Glatter Kiesel", + [5596] = "Eschenholzbogen", + [5748] = "Centaur Longbow", + [5817] = "Lunarisbogen", + [6315] = "Stahlpfeilarmbrust", + [6469] = "Giftschlag", + [6696] = "Nachtpirscherbogen", + [6739] = "Klippenläufers Ziel", + [6798] = "Schmetterprügel", + [7729] = "Chesterfallmuskete", + [8067] = "Gefertigtes leichtes Geschoss", + [8068] = "Gefertigtes schweres Geschoss", + [8069] = "Gefertigtes robustes Geschoss", + [8179] = "Kadettenbogen", + [8180] = "Jagdbogen", + [8181] = "Jagdgewehr", + [8182] = "Schrotgewehr", + [8183] = "Präzisionsbogen", + [8188] = "Explosive Schrotflinte", + [9399] = "Präzisionspfeil", + [9400] = "Baelogs Kurzbogen", + [9412] = "Galganns Feuerblaster", + [9422] = "Buschmeister der Schattenschmiede", + [9426] = "Monolithbogen", + [9456] = "Glasschießprügel", + [9487] = "Hightech-Superschusswaffe", + [10508] = "Mithrildonnerbüchse", + [10510] = "Schwerkalibriges Mithrilgewehr", + [10512] = "Stark einschlagende Mithrilpatronen", + [10513] = "Gyromithrilgeschoss", + [10567] = "Stachelschießer", + [10579] = "Explosive Arrow", + [10624] = "Stechbogen", + [11021] = "Monster - Big Sniper Gun", + [11284] = "Genaue Patronen", + [11285] = "Gezackter Pfeil", + [11303] = "Feiner Kurzbogen", + [11304] = "Feiner Langbogen", + [11305] = "Handfester Kurzbogen", + [11306] = "Stabiler Doppelbogen", + [11307] = "Massiver Langbogen", + [11308] = "Sylvankurzbogen", + [11628] = "Hundemeisterbogen", + [11629] = "Hundemeisterflinte", + [11630] = "Felssplitterkügelchen", + [12446] = "Ambossarmuskete", + [12447] = "Distelholzbogen", + [12448] = "Leichtes Jagdgewehr", + [12449] = "Primitiver Bogen", + [12523] = "Monster - Gun, Silver Musket", + [12651] = "Schwarzkrähe", + [12653] = "Zerfetzhaken", + [12654] = "Verdammnisgeschoss", + [13019] = "Harpyienklauenkurzbogen", + [13020] = "Bogen des Himmelsstürmers", + [13021] = "Einfädler", + [13022] = "Greifenflügellangbogen", + [13023] = "Adlerhornlangbogen", + [13037] = "Kristallfichtenstecher", + [13038] = "Windhauch", + [13039] = "Schädelspalterarmbrust", + [13040] = "Herzsuchende Armbrust", + [13136] = "Klein Timmys Blasrohr", + [13137] = "Eisenwirker", + [13138] = "Der Verstummer", + [13139] = "Bauchripper", + [13146] = "Kugelspeiende Schrotflinte", + [13147] = "Monster - Bow, White", + [13175] = "Voones Zitterbogen", + [13248] = "Explosionsschuss-Arkebuse", + [13377] = "Miniaturkanonenkugeln", + [13380] = "Willeys tragbare Haubitze", + [13474] = "Bauer Dalsons Schrotflinte", + [13824] = "Doppellangbogen", + [13825] = "Scharfe Muskete", + [13923] = "Monster - Gun, Tauren Blade Silver", + [13924] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + [14105] = "Monster - Bow, C01/B02 White", + [14118] = "Monster - Bow, C02/B02 Black", + [14394] = "Durability Bow", + [14642] = "Monster - Gun, Tauren Feathers Silver", + [15205] = "Gewehr der Eulensicht", + [15284] = "Langer Kampfbogen", + [15285] = "Langbogen des Bogenschützen", + [15286] = "Rotholzlangbogen", + [15287] = "Kreuzzüglerbogen", + [15288] = "Durchschlagkräftiger Hornbogen", + [15289] = "Erzschlagbogen", + [15291] = "Harpyienstachler", + [15294] = "Belagerungsbogen", + [15295] = "Feuerfederbogen", + [15296] = "Falkenauges Bogen", + [15322] = "Glattlaufschusswaffe", + [15323] = "Zündschrotflinte", + [15324] = "Uferbachgewehr", + [15325] = "Scharfschützenarkebuse", + [15460] = "Monster - Gun, Shotgun", + [15691] = "Minischrotflinte", + [15807] = "Leichte Armbrust", + [15808] = "Feine leichte Armbrust", + [15809] = "Schwere Armbrust", + [15995] = "Thoriumgewehr", + [15997] = "Thoriumpatronen", + [16004] = "Dunkeleisengewehr", + [16007] = "Fehlerloses Arkanitgewehr", + [16622] = "Dornenwerfer", + [16992] = "Smokeys Sprengstoffschleuder", + [16996] = "Blutholzbogen", + [17042] = "Nagelspeier", + [17069] = "Mal des Schlägers", + [17072] = "Blasterwerfer", + [17686] = "Meisterjägerbogen", + [17687] = "Gewehr des Meisterjägers", + [17717] = "Megaschussgewehr", + [17753] = "Ziel des tiefgrünen Bewahrers", + [18042] = "Thoriumpfeile", + [18282] = "Kernscharfschützengewehr", + [18323] = "Satyrbogen", + [18388] = "Steinzertrümmerer", + [18460] = "Unausgereifte Handkanone", + [18482] = "Ogerzahnstocherschießer", + [18680] = "Uralter Knochenbogen", + [18713] = "Rhok'delar, Langbogen der uralten Bewahrer", + [18729] = "Kreischender Bogen", + [18738] = "Panzerrückgratarmbrust", + [18755] = "Xorothianischer Feuerstab", + [18833] = "Volltreffer des Großmarschalls", + [18835] = "Doppelbogen des Obersten Kriegsfürsten", + [18836] = "Repetierarmbrust des Großmarschalls", + [18837] = "Armbrust des Obersten Kriegsfürsten", + [18855] = "Handkanone des Großmarschalls", + [18860] = "Der Straßenfeger des Obersten Kriegsfürsten", + [19082] = "Monster - Fire Arrow", + [19107] = "Blutsucher", + [19114] = "Hochlandbogen", + [19316] = "Eisgewirkter Pfeil", + [19317] = "Eisgewirkte Kugel", + [19350] = "Herzensbrecher", + [19361] = "Ashjre'thul, Armbrust der Pein", + [19368] = "Drachenodemhandkanone", + [19558] = "Bogen der Vorhut", + [19559] = "Bogen der Vorhut", + [19560] = "Bogen der Vorhut", + [19561] = "Bogen der Vorhut", + [19562] = "Bogen des Kundschafters", + [19563] = "Bogen des Kundschafters", + [19564] = "Bogen des Kundschafters", + [19565] = "Bogen des Kundschafters", + [19853] = "Zwergenzerstörer der Gurubashi", + [19993] = "Hoodoojagdbogen", + [20038] = "Mandokirs Stachel", + [20245] = "90 Green Warrior Gun", + [20285] = "63 Green Warrior Gun", + [20299] = "90 Green Rogue Bow", + [20313] = "63 Green Rogue Bow", + [20368] = "Bland Bow of Steadiness", + [20437] = "Bogen der Vorhut", + [20438] = "Bogen des Kundschafters", + [20488] = "Rhok'delar, Langbogen der uralten Bewahrer DEP", + [20599] = "Polierte Eisenholzarmbrust", + [20646] = "Sandschreitermal", + [20663] = "Durchschlagskräftiger Bogen", + [20722] = "Kristallprojektilwerfer", + [21272] = "Gesegnete Qirajimuskete", + [21459] = "Armbrust der bevorstehenden Verdammnis", + [21478] = "Bogen der straffen Sehne", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Monster - Gun, PvP Horde", + [21564] = "Monster - Gun, Kaldorei PVP Alliance", + [21616] = "Huhurans Stachel", + [21800] = "Silithidhülsenzünder", + [22318] = "Malgens Langbogen", + [22347] = "Fahrads selbstladende Repetierarmbrust", + [22656] = "Der Läuterer", + [22810] = "Toxindüse", + [22811] = "Seelenstrang", + [22812] = "Nerubischer Sklavenjäger", + [23557] = "Larve des großen Wurms", + [41023] = "Water-logged Musket", + [41190] = "Bow of Alah'Thalas", + [41725] = "Drachenmal Kampfbogen", + [51746] = "Shadowblaster", + [51759] = "Siege Bomber", + [51768] = "Bow of Quel'Danil", + [51780] = "Ghoulslayer Shotgun", + [51794] = "Otherworldly Rifle", + [51828] = "Hawkwind Rifle", + [51844] = "Stunning Crossbow", + [51862] = "Brave's Rifle", + [55028] = "Kavdan's Patient Watch", + [55068] = "Zan's Leperification Blaster", + [55096] = "Phase-shifting Crossbow", + [55346] = "Rain of Spiders", + [55379] = "Slag Slugger", + [58016] = "Ashwood Bow", + [58083] = "Nippsy's Precision Rifle", + [58086] = "Standard Grade Rifle", + [58193] = "Demon Hair Bow", + [58284] = "Waterlogged Blunderbuss", + [60165] = "Wobblefree Fizz-rifle", + [60309] = "'Jadewood' Longbow", + [60338] = "Lordaeron Rusty Crossbow", + [60339] = "High Elven Rotten Bow", + [60440] = "Bloodscalp Longbow", + [60506] = "Vigilance", + [60545] = "Techrifle X-TREME 5200", + [60624] = "Goldplated Royal Crossbow", + [60782] = "Shieldbreaker Arbalest", + [60821] = "Theramore Armbrust", + [60882] = "Magram Windstriker", + [60953] = "Brackenwall Longbow", + [61011] = "Flintlocke's Hand Cannon", + [61068] = "Dark Iron Desecrator", + [61165] = "Bow of the Night Huntress", + [61248] = "Beasthunter's Blunderbuss", + [61307] = "Worgen Hunter Musket", + [61383] = "Intricate Gnomish Blunderbuss", + [61472] = "Brigade Rifle", + [61525] = "Nature's Call", + [61569] = "Time Frozen Bow", + [61629] = "Farmer's Musket", + [61683] = "Battered Arbalest", + [70049] = "Worn Crossbow", + [80106] = "Miscalibrated Rifle", + [80127] = "Polished Boomstick", + [80207] = "Worn Wooden Bow", + [80223] = "Weltenwanderer Jagdbogen", + [80503] = "Well-balanced Short Bow", + [80546] = "Quel'dorei Ranger's Longbow", + [80603] = "Sturdy Short Bow", + [80646] = "Revantusk Shadow Hunter's Longbow", + [80745] = "Abomination Crossbow", + [80795] = "Burstshot Harquebus", + [80820] = "Quilflinger", + [80825] = "Flamestring Bow", + [80876] = "Silvermoon Bow", + [83094] = "Monster - Rifle2H, Mechagnome", + [83225] = "Bow of the Grove", + [83257] = "Caer Darrow Reserve Rifle", + [83452] = "Windbreaker", + [83517] = "Balanced Light Crossbow", +} diff --git a/locales/data/items/enUS.lua b/locales/data/items/enUS.lua new file mode 100644 index 0000000..b0999f7 --- /dev/null +++ b/locales/data/items/enUS.lua @@ -0,0 +1,331 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.enUS = { + [2098] = "Double-barreled Shotgun", + [2099] = "Dwarven Hand Cannon", + [2100] = "Precisely Calibrated Boomstick", + [2504] = "Worn Shortbow", + [2505] = "Polished Shortbow", + [2506] = "Hornwood Recurve Bow", + [2507] = "Laminated Recurve Bow", + [2508] = "Old Blunderbuss", + [2509] = "Ornate Blunderbuss", + [2510] = "Solid Blunderbuss", + [2511] = "Hunter's Boomstick", + [2512] = "Rough Arrow", + [2515] = "Sharp Arrow", + [2516] = "Light Shot", + [2519] = "Heavy Shot", + [2550] = "Monster - Bow, Short", + [2551] = "Monster - Crossbow", + [2552] = "Monster - Gun", + [2773] = "Cracked Shortbow", + [2774] = "Rust-covered Blunderbuss", + [2777] = "Feeble Shortbow", + [2778] = "Cheap Blunderbuss", + [2780] = "Light Hunting Bow", + [2781] = "Dirty Blunderbuss", + [2782] = "Mishandled Recurve Bow", + [2783] = "Shoddy Blunderbuss", + [2785] = "Stiff Recurve Bow", + [2786] = "Oiled Blunderbuss", + [2824] = "Hurricane", + [2825] = "Bow of Searing Arrows", + [2903] = "Daryl's Hunting Bow", + [2904] = "Daryl's Hunting Rifle", + [3021] = "Ranger Bow", + [3023] = "Large Bore Blunderbuss", + [3024] = "BKP 2700 \"Enforcer\"", + [3025] = "BKP 42 \"Ultra\"", + [3026] = "Reinforced Bow", + [3027] = "Heavy Recurve Bow", + [3028] = "Longbow", + [3030] = "Razor Arrow", + [3033] = "Solid Shot", + [3034] = "BKP \\", + [3036] = "Heavy Shortbow", + [3037] = "Whipwood Recurve Bow", + [3039] = "Short Ash Bow", + [3040] = "Hunter's Muzzle Loader", + [3041] = "\"Mage-Eye\" Blunderbuss", + [3042] = "BKP \"Sparrow\" Smallbore", + [3078] = "Naga Heartpiercer", + [3079] = "Skorn's Rifle", + [3430] = "Sniper Rifle", + [3464] = "Feathered Arrow", + [3465] = "Exploding Shot", + [3493] = "Raptor's End", + [3567] = "Dwarven Fishing Pole", + [3742] = "Bow of Plunder", + [3778] = "Taut Compound Bow", + [3780] = "Long-barreled Musket", + [4025] = "Balanced Long Bow", + [4026] = "Sentinel Musket", + [4086] = "Flash Rifle", + [4087] = "Trueshot Bow", + [4089] = "Ricochet Blunderbuss", + [4110] = "Master Hunter's Bow", + [4111] = "Master Hunter's Rifle", + [4127] = "Shrapnel Blaster", + [4362] = "Rough Boomstick", + [4369] = "Deadly Blunderbuss", + [4372] = "Lovingly Crafted Boomstick", + [4379] = "Silver-plated Shotgun", + [4383] = "Moonsight Rifle", + [4474] = "Ravenwood Bow", + [4576] = "Light Bow", + [4577] = "Compact Shotgun", + [4763] = "Blackwood Recurve Bow", + [4931] = "Hickory Shortbow", + [4960] = "Flash Pellet", + [5258] = "Monster - Bow, Black", + [5259] = "Monster - Bow, Red", + [5260] = "Monster - Bow, Brown", + [5261] = "Monster - Bow, Gray", + [5262] = "Monster - Bow, Dark Brown", + [5309] = "Privateer Musket", + [5346] = "Orcish Battle Bow", + [5568] = "Smooth Pebble", + [5596] = "Ashwood Bow", + [5748] = "Centaur Longbow", + [5817] = "Lunaris Bow", + [6315] = "Steelarrow Crossbow", + [6469] = "Venomstrike", + [6696] = "Nightstalker Bow", + [6739] = "Cliffrunner's Aim", + [6798] = "Blasting Hackbut", + [7729] = "Chesterfall Musket", + [8067] = "Crafted Light Shot", + [8068] = "Crafted Heavy Shot", + [8069] = "Crafted Solid Shot", + [8179] = "Cadet's Bow", + [8180] = "Hunting Bow", + [8181] = "Hunting Rifle", + [8182] = "Pellet Rifle", + [8183] = "Precision Bow", + [8188] = "Explosive Shotgun", + [9399] = "Precision Arrow", + [9400] = "Baelog's Shortbow", + [9412] = "Galgann's Fireblaster", + [9422] = "Shadowforge Bushmaster", + [9426] = "Monolithic Bow", + [9456] = "Glass Shooter", + [9487] = "Hi-tech Supergun", + [10508] = "Mithril Blunderbuss", + [10510] = "Mithril Heavy-bore Rifle", + [10512] = "Hi-Impact Mithril Slugs", + [10513] = "Mithril Gyro-Shot", + [10567] = "Quillshooter", + [10579] = "Explosive Arrow", + [10624] = "Stinging Bow", + [11021] = "Monster - Big Sniper Gun", + [11284] = "Accurate Slugs", + [11285] = "Jagged Arrow", + [11303] = "Fine Shortbow", + [11304] = "Fine Longbow", + [11305] = "Dense Shortbow", + [11306] = "Sturdy Recurve", + [11307] = "Massive Longbow", + [11308] = "Sylvan Shortbow", + [11628] = "Houndmaster's Bow", + [11629] = "Houndmaster's Rifle", + [11630] = "Rockshard Pellets", + [12446] = "Anvilmar Musket", + [12447] = "Thistlewood Bow", + [12448] = "Light Hunting Rifle", + [12449] = "Primitive Bow", + [12523] = "Monster - Gun, Silver Musket", + [12651] = "Blackcrow", + [12653] = "Riphook", + [12654] = "Doomshot", + [13019] = "Harpyclaw Short Bow", + [13020] = "Skystriker Bow", + [13021] = "Needle Threader", + [13022] = "Gryphonwing Long Bow", + [13023] = "Eaglehorn Long Bow", + [13037] = "Crystalpine Stinger", + [13038] = "Swiftwind", + [13039] = "Skull Splitting Crossbow", + [13040] = "Heartseeking Crossbow", + [13136] = "Lil Timmy's Peashooter", + [13137] = "Ironweaver", + [13138] = "The Silencer", + [13139] = "Guttbuster", + [13146] = "Shell Launcher Shotgun", + [13147] = "Monster - Bow, White", + [13175] = "Voone's Twitchbow", + [13248] = "Burstshot Harquebus", + [13377] = "Miniature Cannon Balls", + [13380] = "Willey's Portable Howitzer", + [13474] = "Farmer Dalson's Shotgun", + [13824] = "Recurve Long Bow", + [13825] = "Primed Musket", + [13923] = "Monster - Gun, Tauren Blade Silver", + [13924] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + [14105] = "Monster - Bow, C01/B02 White", + [14118] = "Monster - Bow, C02/B02 Black", + [14394] = "Durability Bow", + [14642] = "Monster - Gun, Tauren Feathers Silver", + [15205] = "Owlsight Rifle", + [15284] = "Long Battle Bow", + [15285] = "Archer's Longbow", + [15286] = "Long Redwood Bow", + [15287] = "Crusader Bow", + [15288] = "Blasthorn Bow", + [15289] = "Archstrike Bow", + [15291] = "Harpy Needler", + [15294] = "Siege Bow", + [15295] = "Quillfire Bow", + [15296] = "Hawkeye Bow", + [15322] = "Smoothbore Gun", + [15323] = "Percussion Shotgun", + [15324] = "Burnside Rifle", + [15325] = "Sharpshooter Harquebus", + [15460] = "Monster - Gun, Shotgun", + [15691] = "Sidegunner Shottie", + [15807] = "Light Crossbow", + [15808] = "Fine Light Crossbow", + [15809] = "Heavy Crossbow", + [15995] = "Thorium Rifle", + [15997] = "Thorium Shells", + [16004] = "Dark Iron Rifle", + [16007] = "Flawless Arcanite Rifle", + [16622] = "Thornflinger", + [16992] = "Smokey's Explosive Launcher", + [16996] = "Gorewood Bow", + [17042] = "Nail Spitter", + [17069] = "Striker's Mark", + [17072] = "Blastershot Launcher", + [17686] = "Master Hunter's Bow", + [17687] = "Master Hunter's Rifle", + [17717] = "Megashot Rifle", + [17753] = "Verdant Keeper's Aim", + [18042] = "Thorium Headed Arrow", + [18282] = "Core Marksman Rifle", + [18323] = "Satyr's Bow", + [18388] = "Stoneshatter", + [18460] = "Unsophisticated Hand Cannon", + [18482] = "Ogre Toothpick Shooter", + [18680] = "Ancient Bone Bow", + [18713] = "Rhok'delar, Longbow of the Ancient Keepers", + [18729] = "Screeching Bow", + [18738] = "Carapace Spine Crossbow", + [18755] = "Xorothian Firestick", + [18833] = "Grand Marshal's Bullseye", + [18835] = "High Warlord's Recurve", + [18836] = "Grand Marshal's Repeater", + [18837] = "High Warlord's Crossbow", + [18855] = "Grand Marshal's Hand Cannon", + [18860] = "High Warlord's Street Sweeper", + [19082] = "Monster - Fire Arrow", + [19107] = "Bloodseeker", + [19114] = "Highland Bow", + [19316] = "Ice Threaded Arrow", + [19317] = "Ice Threaded Bullet", + [19350] = "Heartstriker", + [19361] = "Ashjre'thul, Crossbow of Smiting", + [19368] = "Dragonbreath Hand Cannon", + [19558] = "Outrider's Bow", + [19559] = "Outrider's Bow", + [19560] = "Outrider's Bow", + [19561] = "Outrider's Bow", + [19562] = "Outrunner's Bow", + [19563] = "Outrunner's Bow", + [19564] = "Outrunner's Bow", + [19565] = "Outrunner's Bow", + [19853] = "Gurubashi Dwarf Destroyer", + [19993] = "Hoodoo Hunting Bow", + [20038] = "Mandokir's Sting", + [20245] = "90 Green Warrior Gun", + [20285] = "63 Green Warrior Gun", + [20299] = "90 Green Rogue Bow", + [20313] = "63 Green Rogue Bow", + [20368] = "Bland Bow of Steadiness", + [20437] = "Outrider's Bow", + [20438] = "Outrunner's Bow", + [20488] = "Rhok'delar, Longbow of the Ancient Keepers DEP", + [20599] = "Polished Ironwood Crossbow", + [20646] = "Sandstrider's Mark", + [20663] = "Deep Strike Bow", + [20722] = "Crystal Slugthrower", + [21272] = "Blessed Qiraji Musket", + [21459] = "Crossbow of Imminent Doom", + [21478] = "Bow of Taut Sinew", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Monster - Gun, PvP Horde", + [21564] = "Monster - Gun, Kaldorei PVP Alliance", + [21616] = "Huhuran's Stinger", + [21800] = "Silithid Husked Launcher", + [22318] = "Malgen's Long Bow", + [22347] = "Fahrad's Reloading Repeater", + [22656] = "The Purifier", + [22810] = "Toxin Injector", + [22811] = "Soulstring", + [22812] = "Nerubian Slavemaker", + [23557] = "Larvae of the Great Worm", + [41023] = "Water-logged Musket", + [41190] = "Bow of Alah'Thalas", + [41725] = "Dragonmaw Battle Bow", + [51746] = "Shadowblaster", + [51759] = "Siege Bomber", + [51768] = "Bow of Quel'Danil", + [51780] = "Ghoulslayer Shotgun", + [51794] = "Otherworldly Rifle", + [51828] = "Hawkwind Rifle", + [51844] = "Stunning Crossbow", + [51862] = "Brave's Rifle", + [55028] = "Kavdan's Patient Watch", + [55068] = "Zan's Leperification Blaster", + [55096] = "Phase-shifting Crossbow", + [55346] = "Rain of Spiders", + [55379] = "Slag Slugger", + [58016] = "Ashwood Bow", + [58083] = "Nippsy's Precision Rifle", + [58086] = "Standard Grade Rifle", + [58193] = "Demon Hair Bow", + [58284] = "Waterlogged Blunderbuss", + [60165] = "Wobblefree Fizz-rifle", + [60309] = "'Jadewood' Longbow", + [60338] = "Lordaeron Rusty Crossbow", + [60339] = "High Elven Rotten Bow", + [60440] = "Bloodscalp Longbow", + [60506] = "Vigilance", + [60545] = "Techrifle X-TREME 5200", + [60624] = "Goldplated Royal Crossbow", + [60782] = "Shieldbreaker Arbalest", + [60821] = "Theramore Arbalest", + [60882] = "Magram Windstriker", + [60953] = "Brackenwall Longbow", + [61011] = "Flintlocke's Hand Cannon", + [61068] = "Dark Iron Desecrator", + [61165] = "Bow of the Night Huntress", + [61248] = "Beasthunter's Blunderbuss", + [61307] = "Worgen Hunter Musket", + [61383] = "Intricate Gnomish Blunderbuss", + [61472] = "Brigade Rifle", + [61525] = "Nature's Call", + [61569] = "Time Frozen Bow", + [61629] = "Farmer's Musket", + [61683] = "Battered Arbalest", + [70049] = "Worn Crossbow", + [80106] = "Miscalibrated Rifle", + [80127] = "Polished Boomstick", + [80207] = "Worn Wooden Bow", + [80223] = "Farstrider Lodge Protector's Bow", + [80503] = "Well-balanced Short Bow", + [80546] = "Quel'dorei Ranger's Longbow", + [80603] = "Sturdy Short Bow", + [80646] = "Revantusk Shadow Hunter's Longbow", + [80745] = "Abomination Crossbow", + [80795] = "Burstshot Harquebus", + [80820] = "Quilflinger", + [80825] = "Flamestring Bow", + [80876] = "Silvermoon Bow", + [83094] = "Monster - Rifle2H, Mechagnome", + [83225] = "Bow of the Grove", + [83257] = "Caer Darrow Reserve Rifle", + [83452] = "Windbreaker", + [83517] = "Balanced Light Crossbow", +} diff --git a/locales/data/items/esES.lua b/locales/data/items/esES.lua new file mode 100644 index 0000000..3018d07 --- /dev/null +++ b/locales/data/items/esES.lua @@ -0,0 +1,331 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.esES = { + [2098] = "Escopeta de Doble Cañón", + [2099] = "Cañón de Mano Enano", + [2100] = "Escopeta de Precisión Calibrada", + [2504] = "Arco Corto Desgastado", + [2505] = "Arco Corto Pulido", + [2506] = "Arco Recurvo de Madera de Cuerno", + [2507] = "Arco Recurvo Laminado", + [2508] = "Trabuco Viejo", + [2509] = "Trabuco Ornamentado", + [2510] = "Trabuco Sólido", + [2511] = "Escopeta de Cazador", + [2512] = "Flecha Áspera", + [2515] = "Flecha Afilada", + [2516] = "Disparo Ligero", + [2519] = "Disparo Pesado", + [2550] = "Monster - Bow, Short", + [2551] = "Monster - Crossbow", + [2552] = "Monster - Gun", + [2773] = "Arco Corto Roto", + [2774] = "Trabuco Cubierto de Óxido", + [2777] = "Arco Corto Débil", + [2778] = "Blunderbuss Barato", + [2780] = "Arco de Caza Ligero", + [2781] = "Trabuco Sucio", + [2782] = "Arco Recurvo Mal Manejado", + [2783] = "Trabuco de Mala Calidad", + [2785] = "Arco Recurvo Rígido", + [2786] = "Trabuco Aceitado", + [2824] = "Huracán", + [2825] = "Arco de Flechas Ardientes", + [2903] = "Arco de Caza de Daryl", + [2904] = "Rifle de Caza de Daryl", + [3021] = "Arco de Guardabosques", + [3023] = "Trabuco de Gran Calibre", + [3024] = "BKP 2700 \"Déspota\"", + [3025] = "BKP 42 \"Ultra\"", + [3026] = "Arco Reforzado", + [3027] = "Arco Recurvo Pesado", + [3028] = "Arco Largo", + [3030] = "Flecha de Navaja", + [3033] = "Disparo Sólido", + [3034] = "Disparo \"Impacto\" BKP", + [3036] = "Arco Corto Pesado", + [3037] = "Arco Recurvo de Madera de Látigo", + [3039] = "Arco de Fresno Corto", + [3040] = "Cargador de Bozal de Cazador", + [3041] = "Trabuco \"Ojo de Mago\"", + [3042] = "Pequeño Calibre \"Gorrión\" BKP", + [3078] = "Traspasa Corazones Naga", + [3079] = "Rifle de Skorn", + [3430] = "Rifle de Francotirador", + [3464] = "Flecha Emplumada", + [3465] = "Disparo Explosivo", + [3493] = "Fin del Raptor", + [3567] = "Caña de Pescar Enana", + [3742] = "Arco del Saqueo", + [3778] = "Arco Compuesto Tenso", + [3780] = "Mosquete de Cañón Largo", + [4025] = "Arco Largo Equilibrado", + [4026] = "Mosquete de Centinela", + [4086] = "Rifle de Destello", + [4087] = "Arco de Tiro Certero", + [4089] = "Trabuco de Rebote", + [4110] = "Arco de Maestro Cazador", + [4111] = "Rifle de Maestro Cazador", + [4127] = "Lanzador de Metralla", + [4362] = "Escopeta Rugosa", + [4369] = "Pistola de Perdigones Mortal", + [4372] = "Escopeta Elaborada con Amor", + [4379] = "Escopeta Plateada", + [4383] = "Rifle de Vista Lunar", + [4474] = "Arco de Bosque Cuervo", + [4576] = "Arco Ligero", + [4577] = "Escopeta Compacta", + [4763] = "Arco Recurvado Blackwood", + [4931] = "Arco Corto de Nogal Americano", + [4960] = "Perdigón de Destello", + [5258] = "Monster - Bow, Black", + [5259] = "Monster - Bow, Red", + [5260] = "Monster - Bow, Brown", + [5261] = "Monster - Bow, Gray", + [5262] = "Monster - Bow, Dark Brown", + [5309] = "Mosquete de Corsario", + [5346] = "Arco de Batalla Orco", + [5568] = "Guijarro Suave", + [5596] = "Arco de Madera de Fresno", + [5748] = "Arco Largo Centauro", + [5817] = "Arco Lunaris", + [6315] = "Ballesta de Flecha de Acero", + [6469] = "Golpe de Veneno", + [6696] = "Arco de Acechador Nocturno", + [6739] = "Objetivo de Abiscorredor", + [6798] = "Arcabuz Explosivo", + [7729] = "Mosquete Chesterfall", + [8067] = "Munición Ligera Fabricada", + [8068] = "Munición Pesada Fabricada", + [8069] = "Munición Sólida Fabricada", + [8179] = "Arco de Cadete", + [8180] = "Arco de Caza", + [8181] = "Rifle de Caza", + [8182] = "Rifle de Perdigones", + [8183] = "Arco de Precisión", + [8188] = "Escopeta Explosiva", + [9399] = "Flecha de Precisión", + [9400] = "Arco corto de Baelog", + [9412] = "Lanzador de Fuego de Galgann", + [9422] = "Maestro de Arbustos de Forjatiniebla", + [9426] = "Arco Monolítico", + [9456] = "Lanzador de Vidrio", + [9487] = "Súper Pistola de Alta Tecnología", + [10508] = "Trabuco de Mithril", + [10510] = "Rifle de Gran Calibre de Mithril", + [10512] = "Balas de Mithril de Alto Impacto", + [10513] = "Girodisparo de Mithril", + [10567] = "Lanzador de Plumas", + [10579] = "Flecha Explosiva", + [10624] = "Arco Punzante", + [11021] = "Monster - Big Sniper Gun", + [11284] = "Balas Precisas", + [11285] = "Flecha Dentada", + [11303] = "Arco Corto Fino", + [11304] = "Arco Largo Fino", + [11305] = "Arco Corto Denso", + [11306] = "Recurvo Robusto", + [11307] = "Arco Largo Masivo", + [11308] = "Arco Corto Silvano", + [11628] = "Arco del Amo de los Perros", + [11629] = "Rifle de Maestro de Sabuesos", + [11630] = "Perdigones de Fragmento de Roca", + [12446] = "Mosquete Yunquemar", + [12447] = "Arco de Madera de Cardo", + [12448] = "Rifle de Caza Ligero", + [12449] = "Arco Primitivo", + [12523] = "Monster - Gun, Silver Musket", + [12651] = "Cuervo Negro", + [12653] = "Gancho Desgarrador", + [12654] = "Disparo Mortal", + [13019] = "Arco Corto de Garra de Arpía", + [13020] = "Arco de Golpe Celestial", + [13021] = "Enhebrador de Agujas", + [13022] = "Arco Largo Ala de Grifo", + [13023] = "Arco Largo Cuerno de Águila", + [13037] = "Aguijón Cristalpine", + [13038] = "Viento Rápido", + [13039] = "Ballesta Trituracráneos", + [13040] = "Ballesta Buscacorazones", + [13136] = "Lanzador de Guisantes de Lil Timmy", + [13137] = "Tejedor de Hierro", + [13138] = "El Silenciador", + [13139] = "Destripador de Tripas", + [13146] = "Escopeta Lanzadora de Proyectiles", + [13147] = "Monster - Bow, White", + [13175] = "Arco Espasmódico de Voone", + [13248] = "Arquería Burstshot", + [13377] = "Balas de Cañón en Miniatura", + [13380] = "Obús Portátil de Willey", + [13474] = "Escopeta del Granjero Dalson", + [13824] = "Arco Largo Recurvo", + [13825] = "Mosquete Cebado", + [13923] = "Monster - Gun, Tauren Blade Silver", + [13924] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + [14105] = "Monster - Bow, C01/B02 White", + [14118] = "Monster - Bow, C02/B02 Black", + [14394] = "Arco de Durabilidad", + [14642] = "Monster - Gun, Tauren Feathers Silver", + [15205] = "Rifle de Vista de Búho", + [15284] = "Arco de Batalla Largo", + [15285] = "Arco Largo de Arquero", + [15286] = "Arco Largo de Secoya", + [15287] = "Arco de Cruzado", + [15288] = "Arco de Espina Explosiva", + [15289] = "Arco de Golpe de Arco", + [15291] = "Lanzador de Arpías", + [15294] = "Arco de Asedio", + [15295] = "Arco de Fuego de Púa", + [15296] = "Arco de Ojo de Halcón", + [15322] = "Pistola de Ánima Lisa", + [15323] = "Escopeta de Percusión", + [15324] = "Rifle Burnside", + [15325] = "Arcabuz de Tirador", + [15460] = "Monster - Gun, Shotgun", + [15691] = "Escopeta de Artillero Lateral", + [15807] = "Ballesta Ligera", + [15808] = "Ballesta Ligera Fina", + [15809] = "Ballesta Pesada", + [15995] = "Rifle de Torio", + [15997] = "Proyectiles de Torio", + [16004] = "Rifle Hierro Negro", + [16007] = "Rifle de Arcanita Impecable", + [16622] = "Lanzador de Espinas", + [16992] = "Lanzador Explosivo de Smokey", + [16996] = "Arco de Madera de Sangre", + [17042] = "Escupidor de Clavos", + [17069] = "Marca de Atacante", + [17072] = "Lanzador de Disparo Explosivo", + [17686] = "Arco de Maestro Cazador", + [17687] = "Rifle de Maestro Cazador", + [17717] = "Rifle de Megadisparo", + [17753] = "Puntería del Guardián Verde", + [18042] = "Flecha con Cabeza de Torio", + [18282] = "Rifle del Tirador de Núcleo", + [18323] = "Arco de Sátiro", + [18388] = "Rompepiedras", + [18460] = "Cañón de Mano Poco Sofisticado", + [18482] = "Lanzador de Palillos de Dientes de Ogro", + [18680] = "Arco de Hueso Antiguo", + [18713] = "Rhok'delar, Arco Largo de los Guardianes Ancestrales", + [18729] = "Arco Chillón", + [18738] = "Ballesta Carapacho Espinal", + [18755] = "Palo de Fuego Xorothiano", + [18833] = "Tiro al Blanco de Gran Mariscal", + [18835] = "Arco Recurvo del Gran Señor de la Guerra", + [18836] = "Repetidor del Gran Mariscal", + [18837] = "Ballesta del Gran Señor de la Guerra", + [18855] = "Cañón de Mano de Gran Mariscal", + [18860] = "Barredora de Calles del Gran Señor de la Guerra", + [19082] = "Monster - Fire Arrow", + [19107] = "Buscasangre", + [19114] = "Arco de las Tierras Altas", + [19316] = "Flecha de Hilo de Hielo", + [19317] = "Bala con Hilo de Hielo", + [19350] = "Golpe al Corazón", + [19361] = "Ashjre'thul, Ballesta de paliza", + [19368] = "Cañón de Mano Aliento de Dragón", + [19558] = "Arco de Corredor", + [19559] = "Arco de Corredor", + [19560] = "Arco de Corredor", + [19561] = "Arco de Corredor", + [19562] = "Arco de Corredor", + [19563] = "Arco de Corredor", + [19564] = "Arco de Corredor", + [19565] = "Arco de Corredor", + [19853] = "Destructor Enano Gurubashi", + [19993] = "Arco de Caza Vudú", + [20038] = "Aguijón de Mandokir", + [20245] = "90 Pistola del Guerrero Verde", + [20285] = "63 Pistola del Guerrero Verde", + [20299] = "90 Arco del Pícaro Verde", + [20313] = "63 Arco del Pícaro Verde", + [20368] = "Arco Insípido de Estabilidad", + [20437] = "Arco de Corredor", + [20438] = "Arco de Corredor", + [20488] = "Rhok'delar, Arco Largo de los Guardianes Ancestrales DEP", + [20599] = "Ballesta de Madera de Hierro Pulida", + [20646] = "Marca de Zancudo de Arena", + [20663] = "Arco de Golpe Profundo", + [20722] = "Lanzador de Lodo Cristalino", + [21272] = "Mosquete Qiraji Bendito", + [21459] = "Ballesta de Doom Inminente", + [21478] = "Arco de Tendones Tensos", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Monster - Gun, PvP Horde", + [21564] = "Monster - Gun, Kaldorei PVP Alliance", + [21616] = "Aguijón de Huhuran", + [21800] = "Lanzador de Cáscara de Silítido", + [22318] = "Arco Largo de Malgen", + [22347] = "Repetidor de Recarga de Fahrad", + [22656] = "El Purificador", + [22810] = "Inyector de Toxinas", + [22811] = "Hilo de Cuerda de Alma", + [22812] = "Creador de Esclavos Nerubiano", + [23557] = "Larvas del Gran Gusano", + [41023] = "Mosquete Empapado de Agua", + [41190] = "Arco de Alah'Thalas", + [41725] = "Arco de Batalla Mandíbula de Dragón", + [51746] = "Destructor de Sombras", + [51759] = "Pantalones de Bombardero de Asedio", + [51768] = "Arco de Quel'Danil", + [51780] = "Escopeta Matagules", + [51794] = "Rifle de Otro Mundo", + [51828] = "Rifle de Viento de Halcón", + [51844] = "Ballesta Aturdidora", + [51862] = "Rifle del Valiente", + [55028] = "Vigilancia Paciente de Kavdan", + [55068] = "Lanzador de Leprificación de Zan", + [55096] = "Ballesta de Cambio de Fase", + [55346] = "Lluvia de Arañas", + [55379] = "Golpeador de Babosas de Escoria", + [58016] = "Arco de Madera de Fresno", + [58083] = "Rifle de Precisión de Nippsy", + [58086] = "Rifle de Grado Estándar", + [58193] = "Arco de Cabello Demoníaco", + [58284] = "Trabuco Empapado", + [60165] = "Rifle de Fizz Sin Tambaleo", + [60309] = "Arco Largo de Madera de Jade", + [60338] = "Ballesta Oxidada de Lordaeron", + [60339] = "Arco Podrido Alto Elfo", + [60440] = "Arco Largo de Bloodscalp", + [60506] = "Vigilancia", + [60545] = "Tecnorifle X-TREME 5200", + [60624] = "Ballesta Real Chapada en Oro", + [60782] = "Arbalesta Rompeescudos", + [60821] = "Arbalesta de Theramore", + [60882] = "Viento de Magram", + [60953] = "Arco Largo de Brackenwall", + [61011] = "Cañón de Mano de Flintlocke", + [61068] = "Desacreditador de Hierro Oscuro", + [61165] = "Arco de la Cazadora Nocturna", + [61248] = "Trabuco de Cazabestias", + [61307] = "Mosquete de Cazador Huargo", + [61383] = "Trabuco Gnómico Intrincado", + [61472] = "Rifle de Brigada", + [61525] = "Llamada de la Naturaleza", + [61569] = "Arco de Tiempo Congelado", + [61629] = "Mosquete de Granjero", + [61683] = "Ballesta Deteriorada", + [70049] = "Ballesta Desgastada", + [80106] = "Rifle Descalibrado", + [80127] = "Escopeta Pulida", + [80207] = "Arco de Madera Desgastado", + [80223] = "Arco del Protector de la Logia de los Exploradores Lejanos", + [80503] = "Arco Corto Bien Equilibrado", + [80546] = "Arco Largo del Guardabosques Quel'dorei", + [80603] = "Arco Corto Robusto", + [80646] = "Arco Largo del Cazador de Sombras Revantusk", + [80745] = "Ballesta de Abominación", + [80795] = "Harquebus de Disparo Rápido", + [80820] = "Lanzapúas", + [80825] = "Arco de Cuerda de Llama", + [80876] = "Arco de Lunargenta", + [83094] = "Monstruo - Rifle 2H, Mecagnomo", + [83225] = "Arco del Bosque", + [83257] = "Rifle de Reserva de Caer Darrow", + [83452] = "Cortavientos", + [83517] = "Ballesta Ligera Equilibrada", +} diff --git a/locales/data/items/ptBR.lua b/locales/data/items/ptBR.lua new file mode 100644 index 0000000..d9586a7 --- /dev/null +++ b/locales/data/items/ptBR.lua @@ -0,0 +1,331 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.ptBR = { + [2098] = "Espingarda de Dois Canos", + [2099] = "Canhão de Mão Anão", + [2100] = "Boomstick Precisamente Calibrado", + [2504] = "Arco Curto Usado", + [2505] = "Arco Curto Polido", + [2506] = "Arco Recurvo de Hornwood", + [2507] = "Arco Recurvado Laminado", + [2508] = "Blunderbuss Antigo", + [2509] = "Mosquete Ornamentado", + [2510] = "Blunderbuss Sólido", + [2511] = "Boomstick do Caçador", + [2512] = "Flecha Bruta", + [2515] = "Flecha Afiada", + [2516] = "Tiro Leve", + [2519] = "Munição Pesada", + [2550] = "Monster - Bow, Short", + [2551] = "Monster - Crossbow", + [2552] = "Monster - Gun", + [2773] = "Arco Curto Rachado", + [2774] = "Blunderbuss Coberto de Ferrugem", + [2777] = "Arco Fraco", + [2778] = "Espingarda Barata", + [2780] = "Arco de Caça Leve", + [2781] = "Bate-bucha Sujo", + [2782] = "Arco Recurvo Mal Manipulado", + [2783] = "Blunderbuss de Qualidade Inferior", + [2785] = "Arco Recurvado Rígido", + [2786] = "Blunderbuss Oiled", + [2824] = "Furacão", + [2825] = "Arco de Flechas Incendiárias", + [2903] = "Arco de Caça de Daryl", + [2904] = "Rifle de Caça de Daryl", + [3021] = "Arco de Ranger", + [3023] = "Blunderbuss Grande", + [3024] = "\"Executor\" BKP 2700", + [3025] = "\"Ultra\" BKP 42", + [3026] = "Arco Reforçado", + [3027] = "Arco Recurvo Pesado", + [3028] = "Arco Longo", + [3030] = "Flecha Lâmina", + [3033] = "Tiro Sólido", + [3034] = "Projétil \"Impacto\" BKP", + [3036] = "Arco Curto Pesado", + [3037] = "Arco Recurvo de Madeira de Chicote", + [3039] = "Arco Curto de Cinzas", + [3040] = "Muzzle Loader do Caçador", + [3041] = "Bacamarte Olho de Mago", + [3042] = "Pequeno Canhão \"Sparrow\" BKP", + [3078] = "Coração Naga", + [3079] = "Rifle de Skorn", + [3430] = "Rifle de Atirador", + [3464] = "Flecha com Pena", + [3465] = "Tiro Explosivo", + [3493] = "Fim do Raptor", + [3567] = "Bastão de Pesca Anão", + [3742] = "Arco do Saque", + [3778] = "Arco de Composto Tenso", + [3780] = "Mosquete de Cano Longo", + [4025] = "Arco Longo Balanceado", + [4026] = "Mosquete Sentinel", + [4086] = "Rifle Flash", + [4087] = "Arco de Tiro Verdadeiro", + [4089] = "Blunderbuss Ricochete", + [4110] = "Arco do Mestre Caçador", + [4111] = "Rifle do Mestre Caçador", + [4127] = "Blaster de Estilhaços", + [4362] = "Boomstick Bruto", + [4369] = "Bacamarte Mortal", + [4372] = "Boomstick Feito Com Carinho", + [4379] = "Espingarda Revestida de Prata", + [4383] = "Rifle Moonsight", + [4474] = "Arco de Ravenwood", + [4576] = "Arco Leve", + [4577] = "Espingarda Compacta", + [4763] = "Arco Recurvo de Blackwood", + [4931] = "Arco Curto de Nogueira", + [4960] = "Pellet Flash", + [5258] = "Monster - Bow, Black", + [5259] = "Monster - Bow, Red", + [5260] = "Monster - Bow, Brown", + [5261] = "Monster - Bow, Gray", + [5262] = "Monster - Bow, Dark Brown", + [5309] = "Mosquete do Privateer", + [5346] = "Arco de Batalha Orc", + [5568] = "Pedra Suave", + [5596] = "Arco de Freixo", + [5748] = "Arco Longo de Centauro", + [5817] = "Arco Lunaris", + [6315] = "Bestas de Aço", + [6469] = "Golpe Venenoso", + [6696] = "Arco do Caçador Noturno", + [6739] = "Mira do Corredor de Penhasco", + [6798] = "Arcabuz Explosivo", + [7729] = "Mosquete de Chesterfall", + [8067] = "Tiros Leves Artesanais", + [8068] = "Tiros Pesados Artesanais", + [8069] = "Tiros Sólidos Artesanais", + [8179] = "Arco do Cadete", + [8180] = "Arco de Caça", + [8181] = "Rifle de Caçador", + [8182] = "Rifle de Pelotões", + [8183] = "Arco de Precisão", + [8188] = "Espingarda Explosiva", + [9399] = "Flecha de Precisão", + [9400] = "Arco Curto de Baelog", + [9412] = "Explosor de Fogo de Galgann", + [9422] = "Bushmaster Shadowforge", + [9426] = "Arco Monolítico", + [9456] = "Atirador de Vidro", + [9487] = "Supergun de Alta Tecnologia", + [10508] = "Blunderbuss de Mithril", + [10510] = "Rifle de Alta Potência de Mithril", + [10512] = "Balas de Mithril de Alto Impacto", + [10513] = "Gyro-Shot de Mithril", + [10567] = "Atirador Quilboar", + [10579] = "Flecha Explosiva", + [10624] = "Arco Picante", + [11021] = "Monster - Big Sniper Gun", + [11284] = "Projéteis Precisos", + [11285] = "Espeto de Jadestone", + [11303] = "Arco Curto Fino", + [11304] = "Arco Longo Fino", + [11305] = "Arco Curto Denso", + [11306] = "Arco Recurvo Sólido", + [11307] = "Arco Longo Massivo", + [11308] = "Arco Curto Silvano", + [11628] = "Arco do Mestre dos Cães", + [11629] = "Rifle do Mestre dos Cães", + [11630] = "Pellets Rockshard", + [12446] = "Mosquete de Anvilmar", + [12447] = "Arco de Thistlewood", + [12448] = "Rifle de Caça Leve", + [12449] = "Arco Primitivo", + [12523] = "Monster - Gun, Silver Musket", + [12651] = "Corvo Negro", + [12653] = "Ganchos de Riphook", + [12654] = "Tiro da Perdição", + [13019] = "Arco Curto Garras de Harpia", + [13020] = "Arco do Atirador dos Céus", + [13021] = "Agulha Enchedora de Linha", + [13022] = "Arco Longo das Asas de Grifo", + [13023] = "Arco Longo de Águia", + [13037] = "Ferrão de Crystalpine", + [13038] = "Vento Ágil", + [13039] = "Besta de Fissura do Crânio", + [13040] = "Besta Caçadora de Corações", + [13136] = "Espingarda de Timmy", + [13137] = "Cinto de Ironweave", + [13138] = "O Silenciador", + [13139] = "Quebra-guts", + [13146] = "Espingarda Lançadora de Conchas", + [13147] = "Monster - Bow, White", + [13175] = "Arco de Reflexo de Voone", + [13248] = "Espingarda de Estouro", + [13377] = "Bolas de Canhão Miniatura", + [13380] = "Howitzer Portátil de Willey", + [13474] = "Espingarda do Fazendeiro Dalson", + [13824] = "Arco Longo Recurvo", + [13825] = "Mosquete Comprimido", + [13923] = "Monster - Gun, Tauren Blade Silver", + [13924] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + [14105] = "Monster - Bow, C01/B02 White", + [14118] = "Monster - Bow, C02/B02 Black", + [14394] = "Arco de Durabilidade", + [14642] = "Monster - Gun, Tauren Feathers Silver", + [15205] = "Rifle Visão de Coruja", + [15284] = "Arco Longo de Batalha", + [15285] = "Arco Longo do Arqueiro", + [15286] = "Arco de Redwood Longo", + [15287] = "Arco do Cruzado", + [15288] = "Arco de Espinhos Explosivo", + [15289] = "Arco Arcataque", + [15291] = "Agulha de Harpia", + [15294] = "Arco de Cerco", + [15295] = "Arco Quilfire", + [15296] = "Arco de Falcógeno", + [15322] = "Arma de Cano Liso", + [15323] = "Espingarda de Percussão", + [15324] = "Rifle Burnside", + [15325] = "Harquebus do Atirador", + [15460] = "Monster - Gun, Shotgun", + [15691] = "Espingarda Sidegunner", + [15807] = "Besta Leve", + [15808] = "Balestra Leve Fina", + [15809] = "Besta Pesada", + [15995] = "Rifle de Torium", + [15997] = "Casca de Torium", + [16004] = "Rifle de Ferro Sombrio", + [16007] = "Rifle Arcanite Impecável", + [16622] = "Lançador de Espinhos", + [16992] = "Lançador Explosivo de Smokey", + [16996] = "Arco Gorewood", + [17042] = "Disparador de Preço", + [17069] = "Marca do Atacante", + [17072] = "Lançador de Disparo Explosivo", + [17686] = "Arco do Mestre Caçador", + [17687] = "Rifle do Mestre Caçador", + [17717] = "Rifle Megashot", + [17753] = "Mira do Guardião Verdejante", + [18042] = "Flecha com Ponta de Torium", + [18282] = "Rifle de Atirador de Elite do Núcleo", + [18323] = "Arco de Sátiro", + [18388] = "Quebra-pedras", + [18460] = "Canhão de Mão Simples", + [18482] = "Atirador de Palito de Ogre", + [18680] = "Arco de Osso Antigo", + [18713] = "Rhok'delar, Arco Longo dos Guardiões Antigos", + [18729] = "Arco Gritante", + [18738] = "Besta de Carapaça Espinhosa", + [18755] = "Cajado de Fogo Xorothiano", + [18833] = "Claymore do Grande Marechal", + [18835] = "Arco Recurvo do Alto Senhor da Guerra", + [18836] = "Espada da Mão Direita do Grande Marechal", + [18837] = "Besta do Alto Senhor da Guerra", + [18855] = "Machado de Mão do Grande Marechal", + [18860] = "Vassourão do Alto Senhor da Guerra", + [19082] = "Monster - Fire Arrow", + [19107] = "Busca-sangue", + [19114] = "Arco Highlander", + [19316] = "Flecha com Fio de Gelo", + [19317] = "Bala com Fio de Gelo", + [19350] = "Golpe de Coração", + [19361] = "Ashjre'thul, Besta da Punição", + [19368] = "Canhão de Mão Sopro de Dragão", + [19558] = "Arco do Outrider", + [19559] = "Arco do Outrider", + [19560] = "Arco do Outrider", + [19561] = "Arco do Outrider", + [19562] = "Arco do Corredor", + [19563] = "Arco do Corredor", + [19564] = "Arco do Corredor", + [19565] = "Arco do Corredor", + [19853] = "Destruidor Anão Gurubashi", + [19993] = "Arco de Caça do Hoodoo", + [20038] = "Picada de Mandokir", + [20245] = "90 Arma de Fogo Verde de Guerreiro", + [20285] = "63 Arma de Fogo Verde de Guerreiro", + [20299] = "90 Arco Verde de Ladino", + [20313] = "63 Arco Verde de Ladino", + [20368] = "Arco Sem Graça da Estabilidade", + [20437] = "Arco do Outrider", + [20438] = "Arco do Corredor", + [20488] = "Rhok'delar, Arco Longo dos Guardiões Antigos DEP", + [20599] = "Best Crossbow Polida", + [20646] = "Marca do Andarilho de Areia", + [20663] = "Arco do Golpe Profundo", + [20722] = "Atirador de Lesmas de Cristal", + [21272] = "Mosquete Qiraji Abençoado", + [21459] = "Balestra da Ruína Imminente", + [21478] = "Arco de Tendão Tensionado", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Monster - Gun, PvP Horde", + [21564] = "Monster - Gun, Kaldorei PVP Alliance", + [21616] = "Aguilhão de Huhuran", + [21800] = "Lançador Casca de Silithid", + [22318] = "Arco Longo de Malgen", + [22347] = "Repetidor de Recarregamento de Fahrad", + [22656] = "O Purificador", + [22810] = "Injetor de Toxinas", + [22811] = "Cordas da Alma", + [22812] = "Escravizador Nerubiano", + [23557] = "Larvas do Grande Verme", + [41023] = "Mosquete Encharcado", + [41190] = "Arco de Alah'Thalas", + [41725] = "Arco de Batalha Presa do Dragão", + [51746] = "Blaster das Sombras", + [51759] = "Bombardeiro de Cerco", + [51768] = "Arco de Quel'Danil", + [51780] = "Espingarda Ghoulslayer", + [51794] = "Rifle de Outro Mundo", + [51828] = "Rifle de Hawkwind", + [51844] = "Besta Atordoante", + [51862] = "Rifle do Bravo", + [55028] = "Relógio de Paciência de Kavdan", + [55068] = "Blaster de Leproso de Zan", + [55096] = "Crossbow Fase-Deslocando", + [55346] = "Chuva de Aranhas", + [55379] = "Golpeador de Escória", + [58016] = "Arco de Freixo", + [58083] = "Rifle de Precisão de Nippsy", + [58086] = "Rifle de Grau Padrão", + [58193] = "Arco de Cabelo Demoníaco", + [58284] = "Trabuco Encharcado", + [60165] = "Rifle de Fizz-rifle Sem Balanço", + [60309] = "Arco Longo de Madeira de Jade", + [60338] = "Bestunho de Lordaeron", + [60339] = "Arco Podre de Elfo Alto", + [60440] = "Arco Longo dos Scalpos Sangrentos", + [60506] = "Braçadeiras de Vigor Aço", + [60545] = "Rifle X-TREME 5200", + [60624] = "Cruzado Real Dourado Revestido de Ouro", + [60782] = "Arbalesta do Quebra-escudos", + [60821] = "Arbalest de Theramore", + [60882] = "Ventos de Magram", + [60953] = "Arco Longo de Brackenwall", + [61011] = "Canhão de Mão de Flintlocke", + [61068] = "Profanador de Ferro Sombrio", + [61165] = "Arco da Caçadora Noturna", + [61248] = "Bacamarte do Caçador de Feras", + [61307] = "Mosquete do Caçador de Worgen", + [61383] = "Blunderbuss Gnômico Intricado", + [61472] = "Rifle da Brigada", + [61525] = "Chamada da Natureza", + [61569] = "Arco Congelado do Tempo", + [61629] = "Mosquete do Fazendeiro", + [61683] = "Besta Grande Maltratada", + [70049] = "Bestunto Usado", + [80106] = "Rifle Descalibrado", + [80127] = "Boomstick Polido", + [80207] = "Arco de Madeira Usado", + [80223] = "Arco de Protetor da Lodge Farstrider", + [80503] = "Arco Curto Bem Equilibrado", + [80546] = "Arco Longo do Ranger Quel'dorei", + [80603] = "Arco Curto Sólido", + [80646] = "Arco Longo do Caçador de Sombras Revantusk", + [80745] = "Besta de Abominação", + [80795] = "Espingarda de Estouro", + [80820] = "Quilflinger", + [80825] = "Arco Flamestring", + [80876] = "Arco de Silvermoon", + [83094] = "Rifle 2H, Mechagnome", + [83225] = "Arco do Bosque", + [83257] = "Rifle da Reserva de Caer Darrow", + [83452] = "Corta-vento", + [83517] = "Besta Leve Balanceada", +} diff --git a/locales/data/items/ruRU.lua b/locales/data/items/ruRU.lua new file mode 100644 index 0000000..9b8af8c --- /dev/null +++ b/locales/data/items/ruRU.lua @@ -0,0 +1,268 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.ruRU = { + [2098] = "Двуствольный дробовик", + [2099] = "Дворфийская пищаль", + [2100] = "Пристрелянный громобой", + [2504] = "Иссеченный короткий лук", + [2505] = "Полированный короткий лук", + [2506] = "Изогнутый лук Рогатого леса", + [2507] = "Многослойный изогнутый лук", + [2508] = "Старинный мушкетон", + [2509] = "Изысканный мушкетон", + [2510] = "Крепкий мушкетон", + [2511] = "Охотничий громобой", + [2512] = "Грубая стрела", + [2515] = "Острая стрела", + [2516] = "Легкий патрон", + [2519] = "Тяжелый патрон", + [2550] = "Монстр - лук, короткий", + [2551] = "Монстр - арбалет", + [2552] = "Монстр - ружье", + [2773] = "Треснувший короткий лук", + [2774] = "Заржавевший мушкетон", + [2777] = "Непрочный лук", + [2778] = "Дешевый мушкетон", + [2780] = "Легкий охотничий лук", + [2781] = "Грязный мушкетон", + [2782] = "Неудобный изогнутый лук", + [2783] = "Дешевый мушкетон", + [2785] = "Испорченный изогнутый лук", + [2786] = "Смазанный мушкетон", + [2824] = "Ураган", + [2825] = "Лук Жгучих Стрел", + [2903] = "Охотничий лук Дерила", + [2904] = "Охотничья винтовка Дерила", + [3021] = "Лук следопыта", + [3023] = "Крупнокалиберный мушкетон", + [3024] = "BKP 2700 \"Принуждение\"", + [3025] = "BKP 42 \"Ультра\"", + [3026] = "Усиленный лук", + [3027] = "Тяжелый изогнутый лук", + [3028] = "Длинный лук", + [3030] = "Стрела-бритва", + [3033] = "Твердый патрон", + [3034] = "Испорченный BKP патрон \"Импульс\"", + [3036] = "Тяжелый короткий лук", + [3037] = "Изогнутый лук Стонущего леса", + [3039] = "Короткий ясеневый лук", + [3040] = "Охотничья фузея", + [3041] = "Мушкетон \"Глаз мага\"", + [3042] = "BKP \"Воробей\" малого калибра", + [3078] = "Нагский сердцекол", + [3079] = "Винтовка Скорна", + [3430] = "Снайперская винтовка", + [3464] = "Оперенная стрела", + [3465] = "Разрывной патрон", + [3493] = "Погибель ящеров", + [3567] = "Дворфийская удочка", + [3742] = "Лук Ограбления", + [3778] = "Тугой композитный лук", + [3780] = "Длинноствольный мушкет", + [4025] = "Сбалансированный длинный лук", + [4026] = "Мушкет часового", + [4086] = "Световая винтовка", + [4087] = "Лук Верного прицела", + [4089] = "Рикошетный мушкетон", + [4110] = "Лук предводителя охотников", + [4111] = "Винтовка опытного охотника", + [4127] = "Шрапнельный самострел", + [4362] = "Грубый громобой", + [4369] = "Смертоносный мушкетон", + [4372] = "Искусно сделанный громобой", + [4379] = "Посеребренный дробовик", + [4383] = "Лунная винтовка", + [4474] = "Лук Вороньего леса", + [4576] = "Легкий лук", + [4577] = "Компактный дробовик", + [4763] = "Изогнутый лук Чернолесья", + [4931] = "Короткий лук из гикори", + [4960] = "Мелкая пулька", + [5258] = "Монстр - лук, черный", + [5259] = "Монстр - лук, красный", + [5260] = "Монстр - лук, коричневый", + [5261] = "Монстр - лук, серый", + [5262] = "Монстр - лук, темно-коричневый", + [5309] = "Мушкет капера", + [5346] = "Оркский боевой лук", + [5568] = "Шлифованный метательный камень", + [5596] = "Ясеневый лук", + [5748] = "Длинный лук кентавра", + [5817] = "Лук Лунариса", + [6315] = "Арбалет со стальными стрелами", + [6469] = "Ядовитый удар", + [6696] = "Лук ночного ловца", + [6739] = "Лук меткости Скального Бегуна", + [6798] = "Разрывной аркебуз", + [7729] = "Мушкет Честерфолла", + [8067] = "Легкий искусно изготовленный патрон", + [8068] = "Тяжелый искусно изготовленный патрон", + [8069] = "Твердый искусно изготовленный патрон", + [8179] = "Лук оруженосца", + [8180] = "Охотничий лук", + [8181] = "Охотничья винтовка", + [8182] = "Шариковая винтовка", + [8183] = "Точный лук", + [8188] = "Дробовик взрывного действия", + [9399] = "Точная стрела", + [9400] = "Короткий лук Бейлога", + [9412] = "Самострел Галганна", + [9422] = "Тенекованный бушмейстер", + [9426] = "Монолитный лук", + [9456] = "Стеклянный пистолет", + [9487] = "Высокотехничное сверхружье", + [10508] = "Мифриловый мушкетон", + [10510] = "Мифриловая крупнокалиберная винтовка", + [10512] = "Бронебойные мифриловые пули", + [10513] = "Мифриловый гиро-патрон", + [10567] = "Перострел", + [10579] = "Взрывная стрела", + [10624] = "Жалящий лук", + [11021] = "Монстр - большое снайперское ружье", + [11284] = "Точные пули", + [11285] = "Зазубренная стрела", + [11303] = "Тонкий короткий лук", + [11304] = "Тонкий длинный лук", + [11305] = "Массивный короткий лук", + [11306] = "Прочный изгиб", + [11307] = "Массивный длинный лук", + [11308] = "Сильванский короткий лук", + [11628] = "Лук псаря", + [11629] = "Винтовка псаря", + [11630] = "Каменноосколочная беспатронная пуля", + [12446] = "Мушкет Старой Наковальни", + [12447] = "Лук Чертополоха", + [12448] = "Легкая охотничья винтовка", + [12449] = "Простой лук", + [12523] = "Монстр - ружье, серебряный мушкет", + [12651] = "Черный ворон", + [12653] = "Обдирочный крюк", + [12654] = "Роковой патрон", + [13019] = "Короткий лук из когтя гарпии", + [13020] = "Лук небесного бойца", + [13021] = "Продеватель игл", + [13022] = "Длинный лук Грифоньего крыла", + [13023] = "Длинный лук Орлиного рога", + [13037] = "Оса Хрустальных сосен", + [13038] = "Быстроветр", + [13039] = "Арбалет раскалывающий череп", + [13040] = "Арбалет Ищущий Сердце", + [13136] = "Пугач маленького Тимми", + [13137] = "Железноткач", + [13138] = "Глушитель", + [13139] = "Выдавливатель внутренностей", + [13146] = "Крупнокалиберный дробовик", + [13147] = "Монстр - лук, белый", + [13175] = "Натянутый лук Вуна", + [13248] = "Залповая аркебуза", + [13377] = "Ядра для мини-пушки", + [13380] = "Переносная пушка Виллей", + [13474] = "Дробовик фермера Далсона", + [13824] = "Изогнутый длинный лук", + [13825] = "Заряженный мушкет", + [13923] = "Монстр - ружье, серебряный кринок таурена", + [13924] = "Монстр - ружье, таурен, прицел, клинок, оперенный, серебряный, высокопробный", + [14105] = "Монстр - лук, C01/B02 белый", + [14118] = "Монстр - лук, C02/B02 черный", + [14394] = "Лук выносливости", + [14642] = "Монстр - ружье, серебряные перья таурена", + [15205] = "Совиная винтовка", + [15284] = "Длинный боевой лук", + [15285] = "Длинный лук лучника", + [15286] = "Длинный лук из красного дерева", + [15287] = "Лук Рыцаря", + [15288] = "Взрывороговый лук", + [15289] = "Лук архиудара", + [15291] = "Игольщик гарпии", + [15294] = "Осадный лук", + [15295] = "Огненноперый лук", + [15296] = "Лук Соколиного глаза", + [15322] = "Гладкоствольное ружье", + [15323] = "Дробовик ударного действия", + [15324] = "Винтовка Бернсайда", + [15325] = "Стрелковая аркебуза", + [15460] = "Монстр - ружье, дробовик", + [15691] = "Саперная лопата", + [15807] = "Легкий арбалет", + [15808] = "Тонкий легкий арбалет", + [15809] = "Тяжелый арбалет", + [15995] = "Ториевая винтовка", + [15997] = "Ториевые гильзы", + [16004] = "Винтовка из черного железа", + [16007] = "Отличная арканитовая винтовка", + [16622] = "Метатель Шипов", + [16992] = "Гремучее ружье Смоки", + [16996] = "Клинолесский лук", + [17042] = "Гвоздомет", + [17069] = "Знак нападающего", + [17072] = "Взрывострел", + [17686] = "Лук предводителя охотников", + [17687] = "Винтовка опытного охотника", + [17717] = "Убойная винтовка", + [17753] = "Цель Зеленого хранителя", + [18042] = "Стрела с ториевым наконечником", + [18282] = "Снайперская винтовка Центра", + [18323] = "Лук сатира", + [18388] = "Камнелом", + [18460] = "Примитивная пищаль", + [18482] = "Огрский зубочисткострел", + [18680] = "Древний костяной лук", + [18713] = "Рок-Делар, длинный лук Древних хранителей", + [18729] = "Визжащий лук", + [18738] = "Панцирный шипастый лук", + [18755] = "Ксоротианский огнепал", + [18833] = "Бычий глаз главнокомандующего", + [18835] = "Изгиб верховного вождя", + [18836] = "Скорострельный арбалет главнокомандующего", + [18837] = "Арбалет верховного вождя", + [18855] = "Пищаль главнокомандующего", + [18860] = "Дворник верховного вождя", + [19082] = "Монстр - огненная стрела", + [19107] = "Кровоискатель", + [19114] = "Лук горца", + [19316] = "Пронизанная льдом стрела", + [19317] = "Пронизанная льдом пуля", + [19350] = "Выдиратель сердец", + [19361] = "Аширетул, разящий арбалет", + [19368] = "Пищаль Дыхания Дракона", + [19558] = "Лук лазутчика", + [19559] = "Лук лазутчика", + [19560] = "Лук лазутчика", + [19561] = "Лук лазутчика", + [19562] = "Лук гонца", + [19563] = "Лук гонца", + [19564] = "Лук гонца", + [19565] = "Лук гонца", + [19853] = "Разрушитель дворфов Гурубаши", + [19993] = "Охотничий лук худу", + [20038] = "Жало Мэндокира", + [20245] = "90 Зеленое воинское ружье", + [20285] = "63 Зеленое воинское ружье", + [20299] = "90 Зеленый лук разбойника", + [20313] = "63 Зеленый лук разбойника", + [20368] = "Легкий лук Постоянства", + [20437] = "Лук лазутчика", + [20438] = "Лук гонца", + [20488] = "Рок-Делар, длинный лук Древних хранителей DEP", + [20599] = "Полированный арбалет из железного дерева", + [20646] = "Знак Песчаного странника", + [20663] = "Прошивающий насквозь лук", + [20722] = "Хрустальный пулемет", + [21272] = "Благословленный киражский мушкет", + [21459] = "Арбалет Неотвратимого Рока", + [21478] = "Лук Тугие Жилы", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Монстр - ружье, PvP Орда", + [21564] = "Монстр - ружье, Кальдорай PvP Альянс", + [21616] = "Хабуранская оса", + [21800] = "Силитидское хитиновое ружье", + [22318] = "Длинный лук Мальдена", + [22347] = "Многозарядный перезаряжаемый арбалет Фахрада", + [22656] = "Очиститель", + [22810] = "Впрыскиватель яда", + [22811] = "Душевервие", + [22812] = "Нерубийский поработитель", + [23557] = "Личинка Большого Червя", +} diff --git a/locales/data/items/zhCN.lua b/locales/data/items/zhCN.lua new file mode 100644 index 0000000..5cdf340 --- /dev/null +++ b/locales/data/items/zhCN.lua @@ -0,0 +1,331 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.items = MTH_LocaleData.data.items or {} + +MTH_LocaleData.data.items.zhCN = { + [2098] = "双管猎枪", + [2099] = "矮人手持火炮", + [2100] = "精确校准过的火枪", + [2504] = "用旧的短弓", + [2505] = "精制短弓", + [2506] = "角木弯弓", + [2507] = "多层弯弓", + [2508] = "老式短枪", + [2509] = "精制短枪", + [2510] = "结实的短枪", + [2511] = "猎人火枪", + [2512] = "劣质箭", + [2515] = "锋利的箭", + [2516] = "轻弹丸", + [2519] = "重弹丸", + [2550] = "Monster - Bow, Short", + [2551] = "Monster - Crossbow", + [2552] = "Monster - Gun", + [2773] = "破损的短弓", + [2774] = "生锈的短枪", + [2777] = "无力的短弓", + [2778] = "廉价火枪", + [2780] = "轻型猎弓", + [2781] = "肮脏的短枪", + [2782] = "粗劣的弯弓", + [2783] = "廉价火枪", + [2785] = "僵硬的弯弓", + [2786] = "油腻的火枪", + [2824] = "飓风", + [2825] = "灼热弓", + [2903] = "达瑞尔的猎弓", + [2904] = "达瑞尔的猎枪", + [3021] = "游侠之弓", + [3023] = "大口径短枪", + [3024] = "“执行者”BKP 2700", + [3025] = "“偏激者”BKP 42", + [3026] = "强化弓", + [3027] = "重型弯弓", + [3028] = "长弓", + [3030] = "锐锋箭", + [3033] = "实心子弹", + [3034] = "秘文胸甲", + [3036] = "硬短弓", + [3037] = "柳木弯弓", + [3039] = "灰木短弓", + [3040] = "猎人火枪", + [3041] = "“法师之眼”大口径火枪", + [3042] = "“麻雀”短枪BKP", + [3078] = "纳迦穿心者", + [3079] = "斯考恩的火枪", + [3430] = "狙击步枪", + [3464] = "火焰之箭", + [3465] = "爆破弹药", + [3493] = "迅猛龙终结者", + [3567] = "矮人钓鱼竿", + [3742] = "劫掠之弓", + [3778] = "紧绷的复合弓", + [3780] = "长筒步枪", + [4025] = "平衡长弓", + [4026] = "卫戍火枪", + [4086] = "闪光步枪", + [4087] = "强击之弓", + [4089] = "弹子火枪", + [4110] = "狩猎高手的猎弓", + [4111] = "狩猎高手的火枪", + [4127] = "榴弹爆破枪", + [4362] = "劣质火枪", + [4369] = "致命的短枪", + [4372] = "精致手工火枪", + [4379] = "镀银猎枪", + [4383] = "夜视步枪", + [4474] = "黑木之弓", + [4576] = "轻型弓", + [4577] = "紧凑火枪", + [4763] = "布莱克伍德弯弓", + [4931] = "桃木短弓", + [4960] = "闪光球", + [5258] = "Monster - Bow, Black", + [5259] = "Monster - Bow, Red", + [5260] = "Monster - Bow, Brown", + [5261] = "Monster - Bow, Gray", + [5262] = "Monster - Bow, Dark Brown", + [5309] = "海盗步枪", + [5346] = "兽人战弓", + [5568] = "光滑的鹅卵石", + [5596] = "灰木弓", + [5748] = "半人马长弓", + [5817] = "月神之弓", + [6315] = "钢矢硬弩", + [6469] = "毒蛇", + [6696] = "夜行者之弓", + [6739] = "峭壁行者之弓", + [6798] = "爆破火枪", + [7729] = "穿胸步枪", + [8067] = "精制轻弹丸", + [8068] = "精制重弹丸", + [8069] = "精制实心弹丸", + [8179] = "学员之弓", + [8180] = "狩猎强弓", + [8181] = "狩猎步枪", + [8182] = "圆弹步枪", + [8183] = "精准之弓", + [8188] = "爆破猎枪", + [9399] = "精准之箭", + [9400] = "巴尔洛戈的短弓", + [9412] = "加加恩的火枪", + [9422] = "暗炉火枪", + [9426] = "浑石弓", + [9456] = "玻璃枪", + [9487] = "高科技步枪", + [10508] = "秘银火枪", + [10510] = "大口径秘银步枪", + [10512] = "高速秘银弹头", + [10513] = "秘银螺旋弹", + [10567] = "硬刺之弓", + [10579] = "爆炸箭", + [10624] = "钉刺猎弓", + [11021] = "Monster - Big Sniper Gun", + [11284] = "精准弹丸", + [11285] = "锯齿箭", + [11303] = "精良的短弓", + [11304] = "精良的长弓", + [11305] = "笨重的短弓", + [11306] = "强韧的弯弓", + [11307] = "大型长弓", + [11308] = "森林短弓", + [11628] = "驯犬者长弓", + [11629] = "驯犬者步枪", + [11630] = "石片弹丸", + [12446] = "安威玛火枪", + [12447] = "棘木弓", + [12448] = "轻型猎枪", + [12449] = "粗制弓", + [12523] = "Monster - Gun, Silver Musket", + [12651] = "黑鸦", + [12653] = "撕裂之钩", + [12654] = "末日之击", + [13019] = "鹰身人之爪短弓", + [13020] = "击天之弓", + [13021] = "射针弓", + [13022] = "狮鹫之翼长弓", + [13023] = "鹰角长弓", + [13037] = "水晶之刺", + [13038] = "迅捷之风", + [13039] = "碎颅强弩", + [13040] = "觅心弩", + [13136] = "提米的玩具枪", + [13137] = "织铁者", + [13138] = "沉默者", + [13139] = "轰击火枪", + [13146] = "散弹发射器", + [13147] = "Monster - Bow, White", + [13175] = "沃恩的迅捷弓", + [13248] = "爆击火枪", + [13377] = "迷你炮弹", + [13380] = "威利的便携式榴弹炮", + [13474] = "农夫达尔松的猎枪", + [13824] = "弯曲的长弓", + [13825] = "基础步枪", + [13923] = "Monster - Gun, Tauren Blade Silver", + [13924] = "Monster - Gun, Tauren Scope Blade Feathered Silver Deluxe", + [14105] = "Monster - Bow, C01/B02 White", + [14118] = "Monster - Bow, C02/B02 Black", + [14394] = "耐久性弓", + [14642] = "Monster - Gun, Tauren Feathers Silver", + [15205] = "鹰眼步枪", + [15284] = "长战弓", + [15285] = "射手长弓", + [15286] = "红木长弓", + [15287] = "十字军长弓", + [15288] = "犄角长弓", + [15289] = "曲线长弓", + [15291] = "鹰身人缝衣针", + [15294] = "攻城长弓", + [15295] = "羽毛弓", + [15296] = "鹰眼长弓", + [15322] = "滑膛枪", + [15323] = "震击猎枪", + [15324] = "伯恩赛德步枪", + [15325] = "神射手火绳枪", + [15460] = "Monster - Gun, Shotgun", + [15691] = "射手火枪", + [15807] = "轻弩", + [15808] = "优质轻弩", + [15809] = "重弩", + [15995] = "瑟银火枪", + [15997] = "瑟银弹", + [16004] = "黑铁步枪", + [16007] = "完美的奥金步枪", + [16622] = "荆棘投掷者", + [16992] = "烟鬼的炸药发射器", + [16996] = "血木猎弓", + [17042] = "钉枪", + [17069] = "速射强弓", + [17072] = "爆击猎枪", + [17686] = "狩猎高手的猎弓", + [17687] = "狩猎高手的火枪", + [17717] = "超射程精密步枪", + [17753] = "绿色守护者之弓", + [18042] = "瑟银之箭", + [18282] = "火核狙击步枪", + [18323] = "萨特强弓", + [18388] = "破石者", + [18460] = "简易手持火炮", + [18482] = "食人魔牙签发射器", + [18680] = "上古骨弓", + [18713] = "伦鲁迪洛尔,上古守护者的长弓", + [18729] = "尖啸之弓", + [18738] = "虫壳强弩", + [18755] = "克索诺斯火棍", + [18833] = "大元帅的硬弓", + [18835] = "高阶督军的弯弓", + [18836] = "大元帅的强弩", + [18837] = "高阶督军的弩", + [18855] = "大元帅的手持火炮", + [18860] = "高阶督军的火枪", + [19082] = "Monster - Fire Arrow", + [19107] = "觅血者", + [19114] = "高地长弓", + [19316] = "冰线箭矢", + [19317] = "冰线枪弹", + [19350] = "击心者", + [19361] = "埃瑟利苏尔,惩戒之弩", + [19368] = "龙息手持火炮", + [19558] = "护卫之弓", + [19559] = "护卫之弓", + [19560] = "护卫之弓", + [19561] = "护卫之弓", + [19562] = "侍从之弓", + [19563] = "侍从之弓", + [19564] = "侍从之弓", + [19565] = "侍从之弓", + [19853] = "古拉巴什矮人摧毁者", + [19993] = "噩运猎弓", + [20038] = "曼多基尔之刺", + [20245] = "90绿色战士猎枪", + [20285] = "63绿色战士猎枪", + [20299] = "90绿色盗贼之弓", + [20313] = "65绿色盗贼之弓", + [20368] = "稳固弯弓", + [20437] = "护卫之弓", + [20438] = "侍从之弓", + [20488] = "伦鲁迪洛尔,上古守护者的长弓", + [20599] = "抛光铁木强弩", + [20646] = "沙行者印记", + [20663] = "深击之弓", + [20722] = "水晶掷弹器", + [21272] = "神圣其拉火枪", + [21459] = "迫近末日之弩", + [21478] = "紧绷肌腱之弓", + [21550] = "Monster - Bow, Kaldorei", + [21554] = "Monster - Gun, PvP Horde", + [21564] = "Monster - Gun, Kaldorei PVP Alliance", + [21616] = "哈霍兰之刺", + [21800] = "异种獠牙发射器", + [22318] = "玛尔根的长弓", + [22347] = "法拉德的装填器", + [22656] = "清洁者", + [22810] = "毒液注射器", + [22811] = "灵魂之弦", + [22812] = "蛛魔制奴者", + [23557] = "巨虫的幼体", + [41023] = "浸水的火铳", + [41190] = "阿尔萨拉斯之弓", + [41725] = "龙喉战弓", + [51746] = "暗影射手", + [51759] = "攻城爆破枪", + [51768] = "奎尔丹尼之弓", + [51780] = "食尸鬼猎枪", + [51794] = "异界步枪", + [51828] = "鹰风步枪", + [51844] = "震耳欲聋的十字弓", + [51862] = "勇士的步枪", + [55028] = "卡夫丹的坏手表", + [55068] = "麻风能量扩散器", + [55096] = "相位十字弩", + [55346] = "蜘蛛之雨", + [55379] = "熔渣猛击者", + [58016] = "白蜡木弓", + [58083] = "尼普西的精密步枪", + [58086] = "标准制式步枪", + [58193] = "恶魔毛发长弓", + [58284] = "浸水的火枪", + [60165] = "稳定冷却步枪", + [60309] = "“翡翠木”长弓", + [60338] = "洛丹伦生锈步兵弩", + [60339] = "高等精灵腐烂弓", + [60440] = "血顶长弓", + [60506] = "警戒", + [60545] = "超科技步枪X-TREME 5200", + [60624] = "镀金皇家十字弩", + [60782] = "破盾之弩", + [60821] = "塞拉摩弩", + [60882] = "玛格拉姆击风者", + [60953] = "蕨墙村长弓", + [61011] = "弗林特洛克手持加农炮", + [61068] = "黑铁亵渎者", + [61165] = "暗夜女猎手之弓", + [61248] = "兽猎者步枪", + [61307] = "狼人猎手猎枪", + [61383] = "精致侏儒步枪", + [61472] = "步兵来复枪", + [61525] = "自然的呼唤", + [61569] = "时光冻结之弓", + [61629] = "农夫猎枪", + [61683] = "损坏之弩", + [70049] = "破旧十字弓", + [80106] = "未调整的步枪", + [80127] = "抛光爆炸棒", + [80207] = "破旧木弓", + [80223] = "远行者小屋守卫之弓", + [80503] = "平衡短弓", + [80546] = "奎尔多雷游侠长弓", + [80603] = "结实短弓", + [80646] = "恶齿暗影猎手长弓", + [80745] = "憎恶之弩", + [80795] = "爆射手铳", + [80820] = "针刺", + [80825] = "火焰弓", + [80876] = "银月之弓", + [83094] = "怪物 - 双手步枪, 机械侏儒", + [83225] = "林地长弓", + [83257] = "凯尔达隆储备步枪", + [83452] = "碎风者", + [83517] = "平衡轻弩", +} diff --git a/locales/data/vendors/deDE.lua b/locales/data/vendors/deDE.lua new file mode 100644 index 0000000..e874dd7 --- /dev/null +++ b/locales/data/vendors/deDE.lua @@ -0,0 +1,327 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.deDE = { + [7] = "*", + [151] = "Brog Grobschlacht", + [152] = "Bruder Danil", + [227] = "Mabel Solaj", + [228] = "Avette Teufelswald", + [491] = "Rüstmeister Lewis", + [543] = "Nalesette Wildbringer", + [734] = "Korporal Bluth", + [789] = "Kimberly Hiett", + [791] = "Lindsay Aschenlocke", + [829] = "Adlin Stolzmut", + [895] = "Thorgas Grimson", + [987] = "Ogromm", + [1149] = "Uthok", + [1198] = "Rallic Finn", + [1231] = "Grif Wildherz", + [1243] = "Hegnar Schlingerschuss", + [1250] = "Drake Lindgren", + [1285] = "Thurman Mullby", + [1287] = "Marda Weller", + [1297] = "Lina Ofner", + [1298] = "Frederick Ofner", + [1404] = "Kragg", + [1448] = "Neal Allen", + [1452] = "Gruham Rumdnul", + [1459] = "Naela Trance", + [1461] = "Murndan Derth", + [1462] = "Edwina Monzor", + [1469] = "Vrok Büchsenschuss", + [1668] = "William MacGregor", + [1682] = "Yanni Wagemut", + [1685] = "Xandar Gutbart", + [1686] = "Irene Immertreff", + [1687] = "Cliff Hadin", + [1691] = "Kreg Bilmn", + [2084] = "Natheril Regenrufer", + [2115] = "Joshua Kien", + [2134] = "Frau Winters", + [2140] = "Edwin Harly", + [2401] = "Kayren Rußgrub", + [2685] = "Mazk Zielschuss", + [2803] = "Malygen", + [2806] = "Bale", + [2808] = "Vikki Lonsav", + [2820] = "Graud", + [2839] = "Haren Kanmae", + [2878] = "Peria Lamenur", + [2879] = "Karrina Mekenda", + [2908] = "Grawl", + [2997] = "Jyn Steinhuf", + [3015] = "Kuna Donnerhorn", + [3018] = "Hogor Donnerhuf", + [3038] = "Kary Donnerhorn", + [3039] = "Holt Donnerhorn", + [3040] = "Urek Donnerhorn", + [3053] = "Flämmer", + [3061] = "Lanka Weitschuss", + [3065] = "Yaw Scharfmähne", + [3072] = "Kawnie Sanfthauch", + [3076] = "Moorat Langschreiter", + [3078] = "Kennah Falkenauge", + [3088] = "Henry Chapal", + [3154] = "Jen'shan", + [3158] = "Duokna", + [3164] = "Jark", + [3165] = "Ghrawt", + [3171] = "Thotar", + [3186] = "K'waii", + [3306] = "Keldas", + [3313] = "Trak'gen", + [3322] = "Kaja", + [3350] = "Asoran", + [3352] = "Ormak Grimmschlag", + [3406] = "Xor'juul", + [3407] = "Sian'dur", + [3409] = "Zendo'jian", + [3410] = "Jin'sora", + [3481] = "Barg", + [3488] = "Uthrok", + [3498] = "Jazzik", + [3534] = "Wallace der Blinde", + [3541] = "Sarah Lichthof", + [3545] = "Claude Erksine", + [3587] = "Lyrai", + [3589] = "Keina", + [3596] = "Ayanna Immerlauf", + [3601] = "Dazalar", + [3608] = "Aldia", + [3610] = "Jeena Federbogen", + [3620] = "Harruk", + [3622] = "Grokor", + [3624] = "Zudd", + [3625] = "Rarck", + [3688] = "Reban Freiläufer", + [3698] = "Bolyun", + [3951] = "Bhaldaran Rabenschwarz", + [3962] = "Haljan Eichenherz", + [3963] = "Danlaar Nachtwandler", + [4082] = "Grawnal", + [4084] = "Chylina", + [4138] = "Jeen'ra Nachtläufer", + [4146] = "Jocaste", + [4170] = "Ellandrieth", + [4173] = "Landria", + [4182] = "Dalmond", + [4203] = "Ariyell Himmelsschatten", + [4205] = "Dorion", + [4241] = "Mydrannul", + [4320] = "Caelyb", + [4555] = "Eleanor Altbrot", + [4602] = "Benijah Fenner", + [4603] = "Nicholas Imwald", + [4604] = "Abigail Sägner", + [4876] = "Jawn Hochfeld", + [4889] = "Torq Sprengeisen", + [4892] = "Jensen Farran", + [4896] = "Charity Mipsy", + [5101] = "Bryllia Eisenmal", + [5115] = "Daera Prunkspeer", + [5116] = "Olmin Feuerbart", + [5117] = "Regnus Donnerstein", + [5122] = "Skolmin Goldrausch", + [5123] = "Bretta Goldrausch", + [5134] = "Jonivera Bergweh", + [5501] = "Kaerbrus", + [5510] = "Thulman Kieselbruch", + [5515] = "Einris Prunkspeer", + [5516] = "Ulfir Eisenbart", + [5517] = "Thorfin Steinschild", + [5814] = "Gastwirt Thulbek", + [6028] = "Burkrum", + [6749] = "Erma", + [7942] = "Faralorn", + [7976] = "Thalgus Donnerfaust", + [8131] = "Blizrik Bockschuss", + [8139] = "Stupser", + [8308] = "Alenndaar Lapidaar", + [8362] = "Kuruk", + [9320] = "Pipoca die Meerläuferin", + [9548] = "Cawind Blattschuss", + [9549] = "Borand", + [9551] = "Starn", + [9552] = "Zanara", + [9553] = "Nadia Vernon", + [9555] = "Mu'uta", + [9976] = "Tharlidun", + [9977] = "Sylista", + [9978] = "Wesley", + [9979] = "Sarah Goode", + [9980] = "Shelby Steinsplint", + [9981] = "Sikwa", + [9982] = "Penny", + [9983] = "Kelsuwa", + [9984] = "Ulbrek Feuerhand", + [9985] = "Laziphus", + [9986] = "Shyrka Wolfsläufer", + [9987] = "Shoja'my", + [9988] = "Xon'cha", + [9989] = "Lina Ofenglut", + [10045] = "Kirk Maxwell", + [10046] = "Bethaine Flinthammer", + [10047] = "Michael", + [10048] = "Gereck", + [10049] = "Hekkru", + [10050] = "Seikwa", + [10051] = "Seriadne", + [10052] = "Maluressier", + [10053] = "Anya Maulray", + [10054] = "Bulrug", + [10055] = "Morganus", + [10056] = "Alassin", + [10057] = "Theodore Mont Claire", + [10058] = "Greth", + [10059] = "Antarius", + [10060] = "Rußhuf", + [10061] = "Killium Geröllzeh", + [10062] = "Steven Black", + [10063] = "Reggifuz", + [10085] = "Jaelysia", + [10086] = "Hesuwa Donnerhorn", + [10088] = "Xao'tsu", + [10089] = "Silvaria", + [10090] = "Belia Donnerstein", + [10369] = "Trayexir", + [10930] = "Dargh Blattschuss", + [11038] = "Verwalter Alen", + [11069] = "Jenova Steinschild", + [11104] = "Shelgrayn", + [11105] = "Aboda", + [11117] = "Awenasa", + [11119] = "Azzelby", + [11184] = "Wixxrak", + [11555] = "Gorn Einauge", + [12021] = "Daeolyn Sommerblatt", + [12027] = "Tukk", + [12029] = "Narianna", + [12246] = "Superverkaufomat 680", + [12782] = "Hauptmann O'Neal", + [12959] = "Nergal", + [12960] = "Christi Galvanis", + [13216] = "Gaelden Hammerschmied", + [13217] = "Thanthaldis Schneeglanz", + [13218] = "Grunnda Wolfsherz", + [13219] = "Jorek Eisenflanke", + [13616] = "Stallmeister der Frostwölfe", + [13617] = "Stallmeister der Sturmlanzen", + [14301] = "Brinna Valanaar", + [14581] = "Unteroffizier Donnerhorn", + [14624] = "Meisterschmied Burninate", + [14741] = "Jäger Markhor", + [14753] = "Illiyana Mondflamm", + [14754] = "Kelm Hargunth", + [14846] = "Lhara", + [15131] = "Qeeju", + [15174] = "Calandrath", + [15722] = "Knappe Leoren Mal'derath", + [16094] = "Durik", + [16156] = "Dunkelgeplagter Krieger", + [17598] = "Renn'az", + [21002] = "Knappe Bolzenschleuder", + [51656] = "Rug", + [60456] = "Belgrush Dolchfaust", + [60483] = "Morpheus Rippenkäfig", + [60484] = "Liott Mähnenhaut", + [60485] = "Noel Bärenfinger", + [60486] = "Vaya Spinnenbiss", + [60487] = "Valdos Tollhund", + [60488] = "Diane Weidenfeld", + [60641] = "Goma", + [60646] = "Evatax", + [60653] = "Skelettschmied", + [60659] = "Cydas Mondschatten", + [60663] = "Grin Harold", + [60740] = "Bald'aan der Stille", + [60766] = "Golsh", + [60768] = "Herekk", + [60790] = "Mathilda Beckett", + [60803] = "Tyrion Bouden", + [60813] = "Ahnja Sommerwind", + [60966] = "Tanzig Wexlicht", + [60989] = "Borrin Staubschulter", + [61058] = "Tazo Drahtlicht", + [61115] = "Wezzy Kupfersäge", + [61140] = "Azmela Schattenkamm", + [61266] = "Alexandra", + [61272] = "Samantha Verwalter", + [61288] = "Savenna Mooskäfig", + [61369] = "Anati Spaltgang", + [61440] = "Gnidabern Spulenwirbler", + [61443] = "Dimbil Sturmstoß", + [61445] = "Krilee Sturmstoß", + [61478] = "Talavana Andalorah", + [61523] = "Naytha Trüblicht", + [61563] = "Arayna Weichwind", + [61624] = "AJ Frühbeere", + [61625] = "Daisy Windhelm", + [61626] = "Diane Kleefeld", + [61627] = "Alter Jonah", + [61628] = "Willhelm Felsschleifer", + [61629] = "Marven", + [61640] = "Schütze Rembrandt Olar", + [61651] = "Vi'cha Geisterheuler", + [61722] = "Sazzlix", + [61742] = "Mazin Forkblast", + [61743] = "Hazlor Torksicherung", + [61751] = "Kango Bolzenknall", + [61812] = "Celia Tagesflügel", + [62086] = "Meldor Schnelllanze", + [62088] = "Laithor Morgenblatt", + [62096] = "Aira Sterneneid", + [62098] = "Gozzlek", + [62099] = "Guzhek", + [62148] = "Wisteria Gallagher", + [62161] = "Leander Hering", + [62307] = "Barbara Lee", + [62401] = "Farwyn Gerstnacht", + [62402] = "Kargun Kraftfall", + [62403] = "Vohand Poltertor", + [62404] = "Kazand Poltertor", + [62409] = "Gazla Schwarzschmied", + [62436] = "Hagrekk", + [62437] = "Maktha", + [62462] = "Elindra Flinkglück", + [62469] = "Navigator Weebletax", + [62628] = "Nyxma Flickenfein", + [62739] = "Orthol the Tracker", + [65002] = "Ethernos", + [65003] = "Chradarmu", + [80008] = "Aubrey Merton", + [80102] = "Ohgi Cardya", + [80105] = "Mayten Knallgewehr", + [80214] = "Malanius Silberschein", + [80219] = "Waldläufer Rubinah Sonneneid", + [80245] = "Damilara Sonnensorge", + [80266] = "Soalara Morgenstern", + [80267] = "Torial Morgendämmerung", + [80457] = "Andrelas Thas'danil", + [80458] = "Waldläuferin Canarah Kim'Alah", + [80807] = "Reolis Reißhauer", + [80808] = "Ranor Reißhauer", + [80810] = "Rinja Duftstoß", + [80855] = "Klee Drehscharf", + [80856] = "Twinkie Bummstock", + [80903] = "Viz Fizbeast", + [80915] = "Tan'Pogo", + [80941] = "Erdruferin Jalyssa", + [80942] = "Todesruferin Aisha", + [80943] = "Dronormu", + [81035] = "Jake Booker", + [81050] = "Dunkelläuferin Lanissa", + [91246] = "Valkar", + [91248] = "Wixx", + [91403] = "Kintello", + [91725] = "Darren Nebelwall", + [91868] = "Primalist Gojo", + [91956] = "Denia Hale", + [91977] = "Olfan Goldbraue", + [92169] = "Kryillos", + [92177] = "Garto'ogg", + [92200] = "Bhatra", + [92217] = "Ticas Wirrflausch", +} diff --git a/locales/data/vendors/enUS.lua b/locales/data/vendors/enUS.lua new file mode 100644 index 0000000..81e22e4 --- /dev/null +++ b/locales/data/vendors/enUS.lua @@ -0,0 +1,334 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.enUS = { + [7] = "*", + [150] = "[UNUSED] Brother Milius", + [151] = "Brog Hamfist", + [152] = "Brother Danil", + [227] = "Mabel Solaj", + [228] = "Avette Fellwood", + [491] = "Quartermaster Lewis", + [543] = "Nalesette Wildbringer", + [734] = "Corporal Bluth", + [789] = "Kimberly Hiett", + [791] = "Lindsay Ashlock", + [829] = "Adlin Pridedrift", + [895] = "Thorgas Grimson", + [904] = "[UNUSED] Regna Khurn", + [987] = "Ogromm", + [1149] = "Uthok", + [1198] = "Rallic Finn", + [1231] = "Grif Wildheart", + [1243] = "Hegnar Rumbleshot", + [1250] = "Drake Lindgren", + [1285] = "Thurman Mullby", + [1287] = "Marda Weller", + [1297] = "Lina Stover", + [1298] = "Frederick Stover", + [1404] = "Kragg", + [1448] = "Neal Allen", + [1452] = "Gruham Rumdnul", + [1455] = "[UNUSED] Grummar Thunk", + [1459] = "Naela Trance", + [1461] = "Murndan Derth", + [1462] = "Edwina Monzor", + [1469] = "Vrok Blunderblast", + [1668] = "William MacGregor", + [1682] = "Yanni Stoutheart", + [1685] = "Xandar Goodbeard", + [1686] = "Irene Sureshot", + [1687] = "Cliff Hadin", + [1691] = "Kreg Bilmn", + [1859] = "[UNUSED] Nyein Longwind", + [2084] = "Natheril Raincaller", + [2115] = "Joshua Kien", + [2134] = "Mrs. Winters", + [2140] = "Edwin Harly", + [2286] = "Bow Guy", + [2401] = "Kayren Soothallow", + [2685] = "Mazk Snipeshot", + [2803] = "Malygen", + [2806] = "Bale", + [2808] = "Vikki Lonsav", + [2820] = "Graud", + [2839] = "Haren Kanmae", + [2878] = "Peria Lamenur", + [2879] = "Karrina Mekenda", + [2908] = "Grawl", + [2997] = "Jyn Stonehoof", + [3015] = "Kuna Thunderhorn", + [3018] = "Hogor Thunderhoof", + [3038] = "Kary Thunderhorn", + [3039] = "Holt Thunderhorn", + [3040] = "Urek Thunderhorn", + [3053] = "Synge", + [3061] = "Lanka Farshot", + [3065] = "Yaw Sharpmane", + [3072] = "Kawnie Softbreeze", + [3076] = "Moorat Longstride", + [3078] = "Kennah Hawkseye", + [3088] = "Henry Chapal", + [3154] = "Jen'shan", + [3158] = "Duokna", + [3164] = "Jark", + [3165] = "Ghrawt", + [3171] = "Thotar", + [3186] = "K'waii", + [3306] = "Keldas", + [3313] = "Trak'gen", + [3322] = "Kaja", + [3350] = "Asoran", + [3352] = "Ormak Grimshot", + [3406] = "Xor'juul", + [3407] = "Sian'dur", + [3409] = "Zendo'jian", + [3410] = "Jin'sora", + [3481] = "Barg", + [3488] = "Uthrok", + [3498] = "Jazzik", + [3534] = "Wallace the Blind", + [3541] = "Sarah Raycroft", + [3545] = "Claude Erksine", + [3587] = "Lyrai", + [3589] = "Keina", + [3596] = "Ayanna Everstride", + [3601] = "Dazalar", + [3608] = "Aldia", + [3610] = "Jeena Featherbow", + [3620] = "Harruk", + [3622] = "Grokor", + [3624] = "Zudd", + [3625] = "Rarck", + [3688] = "Reban Freerunner", + [3698] = "Bolyun", + [3951] = "Bhaldaran Ravenshade", + [3962] = "Haljan Oakheart", + [3963] = "Danlaar Nightstride", + [4082] = "Grawnal", + [4084] = "Chylina", + [4138] = "Jeen'ra Nightrunner", + [4146] = "Jocaste", + [4170] = "Ellandrieth", + [4173] = "Landria", + [4182] = "Dalmond", + [4203] = "Ariyell Skyshadow", + [4205] = "Dorion", + [4241] = "Mydrannul", + [4320] = "Caelyb", + [4555] = "Eleanor Rusk", + [4602] = "Benijah Fenner", + [4603] = "Nicholas Atwood", + [4604] = "Abigail Sawyer", + [4876] = "Jawn Highmesa", + [4889] = "Torq Ironblast", + [4892] = "Jensen Farran", + [4896] = "Charity Mipsy", + [5101] = "Bryllia Ironbrand", + [5115] = "Daera Brightspear", + [5116] = "Olmin Burningbeard", + [5117] = "Regnus Thundergranite", + [5122] = "Skolmin Goldfury", + [5123] = "Bretta Goldfury", + [5134] = "Jonivera Farmountain", + [5501] = "Kaerbrus", + [5510] = "Thulman Flintcrag", + [5515] = "Einris Brightspear", + [5516] = "Ulfir Ironbeard", + [5517] = "Thorfin Stoneshield", + [5814] = "Innkeeper Thulbek", + [6028] = "Burkrum", + [6749] = "Erma", + [7942] = "Faralorn", + [7976] = "Thalgus Thunderfist", + [8131] = "Blizrik Buckshot", + [8139] = "Jabbey", + [8308] = "Alenndaar Lapidaar", + [8362] = "Kuruk", + [9320] = "Pipoca the Searunner", + [9548] = "Cawind Trueaim", + [9549] = "Borand", + [9551] = "Starn", + [9552] = "Zanara", + [9553] = "Nadia Vernon", + [9555] = "Mu'uta", + [9976] = "Tharlidun", + [9977] = "Sylista", + [9978] = "Wesley", + [9979] = "Sarah Goode", + [9980] = "Shelby Stoneflint", + [9981] = "Sikwa", + [9982] = "Penny", + [9983] = "Kelsuwa", + [9984] = "Ulbrek Firehand", + [9985] = "Laziphus", + [9986] = "Shyrka Wolfrunner", + [9987] = "Shoja'my", + [9988] = "Xon'cha", + [9989] = "Lina Hearthstove", + [10045] = "Kirk Maxwell", + [10046] = "Bethaine Flinthammer", + [10047] = "Michael", + [10048] = "Gereck", + [10049] = "Hekkru", + [10050] = "Seikwa", + [10051] = "Seriadne", + [10052] = "Maluressian", + [10053] = "Anya Maulray", + [10054] = "Bulrug", + [10055] = "Morganus", + [10056] = "Alassin", + [10057] = "Theodore Mont Claire", + [10058] = "Greth", + [10059] = "Antarius", + [10060] = "Grimestack", + [10061] = "Killium Bouldertoe", + [10062] = "Steven Black", + [10063] = "Reggifuz", + [10085] = "Jaelysia", + [10086] = "Hesuwa Thunderhorn", + [10088] = "Xao'tsu", + [10089] = "Silvaria", + [10090] = "Belia Thundergranite", + [10369] = "Trayexir", + [10930] = "Dargh Trueaim", + [11038] = "Caretaker Alen", + [11069] = "Jenova Stoneshield", + [11104] = "Shelgrayn", + [11105] = "Aboda", + [11117] = "Awenasa", + [11119] = "Azzleby", + [11184] = "Wixxrak", + [11555] = "Gorn One Eye", + [12021] = "Daeolyn Summerleaf", + [12027] = "Tukk", + [12029] = "Narianna", + [12036] = "Aerie Peak General Goods", + [12246] = "Super-Seller 680", + [12782] = "Captain O'Neal", + [12959] = "Nergal", + [12960] = "Christi Galvanis", + [13216] = "Gaelden Hammersmith", + [13217] = "Thanthaldis Snowgleam", + [13218] = "Grunnda Wolfheart", + [13219] = "Jekyll Flandring", + [13616] = "Frostwolf Stable Master", + [13617] = "Stormpike Stable Master", + [14301] = "Brinna Valanaar", + [14581] = "Sergeant Thunderhorn", + [14624] = "Master Smith Burninate", + [14741] = "Huntsman Markhor", + [14753] = "Illiyana Moonblaze", + [14754] = "Kelm Hargunth", + [14846] = "Lhara", + [15131] = "Qeeju", + [15174] = "Calandrath", + [15722] = "Squire Leoren Mal'derath", + [16094] = "Durik", + [16156] = "Dark Touched Warrior", + [17078] = "Jimmy McWeaksauce", + [17598] = "Renn'az", + [21002] = "Squire Boltfling", + [51656] = "Rug", + [60456] = "Belgrush Daggerfist", + [60483] = "Morpheus Ribcage", + [60484] = "Liott Maneskin", + [60485] = "Noel Bearfinger", + [60486] = "Vaya Spidersbite", + [60487] = "Valdos Madhound", + [60488] = "Diane Willowfield", + [60641] = "Goma", + [60646] = "Evatax", + [60653] = "Skeletal Blacksmith", + [60659] = "Cydas Moonshadow", + [60663] = "Grin Harold", + [60740] = "Bald'aan The Quiet", + [60766] = "Golsh", + [60768] = "Herekk", + [60790] = "Mathilda Beckett", + [60803] = "Tyrion Bouden", + [60813] = "Ahnja Summerwind", + [60966] = "Tanzig Wexlight", + [60989] = "Borrin Dustshoulder", + [61058] = "Tazo Wirelight", + [61115] = "Wezzy Coppersaw", + [61140] = "Azmela Shadowcrest", + [61266] = "Alexandra", + [61272] = "Samantha Stewards", + [61288] = "Savenna Mosscage", + [61369] = "Anati Gapper", + [61440] = "Gnidabern Coilspinner", + [61443] = "Dimbil Stormshot", + [61445] = "Krilee Stormshot", + [61478] = "Talavana Andalorah", + [61523] = "Naytha Grovelight", + [61563] = "Arayna Softwind", + [61624] = "AJ Springberry", + [61625] = "Daisy Windhelm", + [61626] = "Diane Cloverfield", + [61627] = "Old Jonah", + [61628] = "Willhelm Rockdust", + [61629] = "Marven", + [61640] = "Marksman Rembrandt Olar", + [61651] = "Vi'cha Spirithowler", + [61722] = "Sazzlix", + [61742] = "Mazin Forkblast", + [61743] = "Hazlor Torkfuse", + [61751] = "Kango Boltblast", + [61812] = "Celia Daywing", + [62086] = "Meldor Swiftlance", + [62088] = "Laithor Morningleaf", + [62096] = "Aira Starsworn", + [62098] = "Gozzlek", + [62099] = "Guzhek", + [62148] = "Wisteria Gallagher", + [62161] = "Leander Hering", + [62307] = "Barbara Lee", + [62401] = "Farwyn Barleynight", + [62402] = "Kargun Mightfall", + [62403] = "Vohand Blundergate", + [62404] = "Kazand Blundergate", + [62409] = "Gazla Blackforge", + [62436] = "Hagrekk", + [62437] = "Maktha", + [62462] = "Elindra Swiftluck", + [62469] = "Navigator Weebletax", + [62628] = "Nyxma Niftpatch", + [62739] = "Orthol the Tracker", + [65002] = "Ethernos", + [65003] = "Chradarmu", + [80008] = "Aubrey Merton", + [80102] = "Ohgi Cardya", + [80105] = "Mayten Boomrifle", + [80214] = "Malanius Silvershine", + [80219] = "Ranger Rubinah Sunsworn", + [80245] = "Damilara Sunsorrow", + [80266] = "Soalara Dawnstar", + [80267] = "Torial Dawnrise", + [80457] = "Andrelas Thas'danil", + [80458] = "Ranger Canarah Kim'Alah", + [80807] = "Reolis Riptusk", + [80808] = "Ranor Riptusk", + [80810] = "Rinja Scenttusk", + [80855] = "Clover Spinpistol", + [80856] = "Twinkie Boomstick", + [80903] = "Viz Fizbeast", + [80915] = "Tan'Pogo", + [80941] = "Earthcaller Jalyssa", + [80942] = "Deathcaller Aisha", + [80943] = "Dronormu", + [81035] = "Jake Booker", + [81050] = "Dark Ranger Lanissa", + [91246] = "Valkar", + [91248] = "Wixx", + [91403] = "Kintello", + [91725] = "Darren Mistwall", + [91868] = "Primalist Gojo", + [91956] = "Denia Hale", + [91977] = "Olfan Goldenbrow", + [92169] = "Kryillos", + [92177] = "Garto'ogg", + [92200] = "Bhatra", + [92217] = "Ticas Quirkfuzz", +} diff --git a/locales/data/vendors/esES.lua b/locales/data/vendors/esES.lua new file mode 100644 index 0000000..3f55e9f --- /dev/null +++ b/locales/data/vendors/esES.lua @@ -0,0 +1,327 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.esES = { + [7] = "*", + [151] = "Brog Patosar", + [152] = "Hermano Danil", + [227] = "Mabel Solaj", + [228] = "Avette Bosquevil", + [491] = "Intendente Lewis", + [543] = "Nalesette Asilvestra", + [734] = "Cabo Bluth", + [789] = "Kimberly Hiett", + [791] = "Lindsay Cierreniza", + [829] = "Adlin Rumborgullo", + [895] = "Thorgas Grimson", + [987] = "Ogromm", + [1149] = "Uthok", + [1198] = "Rallic Finn", + [1231] = "Grif Corazón Salvaje", + [1243] = "Hegnar Disparatrueno", + [1250] = "Draco Lindgren", + [1285] = "Thurman Mullby", + [1287] = "Marda Weller", + [1297] = "Lina Paladare", + [1298] = "Frederick Hornillos", + [1404] = "Kragg", + [1448] = "Neal Allen", + [1452] = "Gruham Rumdnul", + [1459] = "Naela Trance", + [1461] = "Murndan Carestía", + [1462] = "Edwina Monzor", + [1469] = "Vrok Rayobestial", + [1668] = "William MacGregor", + [1682] = "Yanni Cuoreforte", + [1685] = "Xandar Bonbarba", + [1686] = "Irene Tiroseguro", + [1687] = "Cliff Hadin", + [1691] = "Kreg Bilmn", + [2084] = "Natheril Clamalluvia", + [2115] = "Joshua Kien", + [2134] = "Sra. Winters", + [2140] = "Edwin Harly", + [2401] = "Kayren Sombrollín", + [2685] = "Mazk Tirocertero", + [2803] = "Malygen", + [2806] = "Fardo", + [2808] = "Vikki Lonsav", + [2820] = "Graud", + [2839] = "Haren Kanmae", + [2878] = "Peria Lamenur", + [2879] = "Karrina Mekenda", + [2908] = "Graul", + [2997] = "Jyn Pezuñapétrea", + [3015] = "Kuna Tronacuerno", + [3018] = "Hogor Pezuñatrueno", + [3038] = "Kary Tronacuerno", + [3039] = "Holt Tronacuerno", + [3040] = "Urek Tronacuerno", + [3053] = "Synge", + [3061] = "Lanka Tirolargo", + [3065] = "Yaw Crinafilada", + [3072] = "Kawnie Brisaleve", + [3076] = "Moorat Zancada Larga", + [3078] = "Kennah Ojo de Halcón", + [3088] = "Henry Chapal", + [3154] = "Jen'shan", + [3158] = "Duokna", + [3164] = "Jark", + [3165] = "Ghrawt", + [3171] = "Thotar", + [3186] = "K'waii", + [3306] = "Keldas", + [3313] = "Trak'gen", + [3322] = "Kaja", + [3350] = "Asoran", + [3352] = "Ormak Tirosiniestro", + [3406] = "Xor'juul", + [3407] = "Sian'dur", + [3409] = "Zendo'jian", + [3410] = "Jin'sora", + [3481] = "Barg", + [3488] = "Uthrok", + [3498] = "Jazzik", + [3534] = "Wallace el Ciego", + [3541] = "Sarah Raycroft", + [3545] = "Claude Erksine", + [3587] = "Lyrai", + [3589] = "Keina", + [3596] = "Ayanna Semprerguida", + [3601] = "Dazalar", + [3608] = "Aldia", + [3610] = "Jeena Plumarco", + [3620] = "Harruk", + [3622] = "Grokor", + [3624] = "Zudd", + [3625] = "Rarck", + [3688] = "Reban Corredor", + [3698] = "Bolyun", + [3951] = "Bhaldaran Sombracuervo", + [3962] = "Haljan Roblezón", + [3963] = "Danlaar Zancanoche", + [4082] = "Grawnal", + [4084] = "Chylina", + [4138] = "Jeen'ra Noctámbulus", + [4146] = "Jocaste", + [4170] = "Ellandrieth", + [4173] = "Landria", + [4182] = "Dalmond", + [4203] = "Ariyell Cielosombra", + [4205] = "Dorion", + [4241] = "Mydrannul", + [4320] = "Caelyb", + [4555] = "Eleanor Rusk", + [4602] = "Benijah Fenner", + [4603] = "Nicholas Emadera", + [4604] = "Abigail Sierra", + [4876] = "Jawn Mesalta", + [4889] = "Torq Balacero", + [4892] = "Jensen Farran", + [4896] = "Caridad Mipsy", + [5101] = "Bryllia Ferracha", + [5115] = "Daera Lanza Reluciente", + [5116] = "Olmin Barbanllamas", + [5117] = "Regnus Tronagranito", + [5122] = "Skolmin Furiadorada", + [5123] = "Bretta Furiadorada", + [5134] = "Jonivera Montelejano", + [5501] = "Kaerbrus", + [5510] = "Thulman Riscosílex", + [5515] = "Einris Lanza Reluciente", + [5516] = "Ulfir Barbaférrea", + [5517] = "Thorfin Petrescudo", + [5814] = "Tabernero Thulbek", + [6028] = "Burkrum", + [6749] = "Erma", + [7942] = "Faralorn", + [7976] = "Thalgus Puñotrueno", + [8131] = "Blizrik Machobala", + [8139] = "Jabbey", + [8308] = "Alenndaar Lapidaar", + [8362] = "Kuruk", + [9320] = "Pipoca Corredora del Mar", + [9548] = "Cawind Endiana", + [9549] = "Borand", + [9551] = "Starn", + [9552] = "Zanara", + [9553] = "Nadia Vernon", + [9555] = "Mu'uta", + [9976] = "Tharlidun", + [9977] = "Sylista", + [9978] = "Wesley", + [9979] = "Sarah Goode", + [9980] = "Shelby Petrepiedra", + [9981] = "Sikwa", + [9982] = "Penny", + [9983] = "Kelsuwa", + [9984] = "Ulbrek Manofuego", + [9985] = "Laziphus", + [9986] = "Shyrka Correlobo", + [9987] = "Shoja'my", + [9988] = "Xon'cha", + [9989] = "Lina Hogarstufa", + [10045] = "Kirk Maxwell", + [10046] = "Bethaine Hachílex", + [10047] = "Michael", + [10048] = "Gereck", + [10049] = "Hekkru", + [10050] = "Seikwa", + [10051] = "Seriadne", + [10052] = "Maluressian", + [10053] = "Anya Maulray", + [10054] = "Bulrug", + [10055] = "Morganus", + [10056] = "Alassin", + [10057] = "Theodore Mont Claire", + [10058] = "Greth", + [10059] = "Antarius", + [10060] = "Mugrín", + [10061] = "Killium Dedorroca", + [10062] = "Steven Black", + [10063] = "Reggifuz", + [10085] = "Jaelysia", + [10086] = "Hesuwa Tronacuerno", + [10088] = "Xao'tsu", + [10089] = "Silvaria", + [10090] = "Belia Tronagranito", + [10369] = "Trayexir", + [10930] = "Dargh Tirojusto", + [11038] = "Custodio Alen", + [11069] = "Jenova Petrescudo", + [11104] = "Shelgrayn", + [11105] = "Aboda", + [11117] = "Awenasa", + [11119] = "Azzleby", + [11184] = "Wixxrak", + [11555] = "Gorn el Tuerto", + [12021] = "Daeolyn Hoja Estival", + [12027] = "Tukk", + [12029] = "Narianna", + [12246] = "Supervendedor 680", + [12782] = "Capitán O'Neal", + [12959] = "Nergal", + [12960] = "Christi Galvanis", + [13216] = "Gaelden Martillero", + [13217] = "Thanthaldis Brillaneve", + [13218] = "Grunnda Corazón de Lobo", + [13219] = "Jekyll Flandring", + [13616] = "Maestra de Establos Lobo Gélido", + [13617] = "Maestra de Establos Pico Tormenta", + [14301] = "Brinna Valanaar", + [14581] = "Sargento Tronacuerno", + [14624] = "Maestro Herrero Cremación", + [14741] = "Cazador Markhor", + [14753] = "Illiyana Lunardiente", + [14754] = "Kelm Hargunth", + [14846] = "Lhara", + [15131] = "Qeeju", + [15174] = "Calandrath", + [15722] = "Escudero Leoren Mal'derath", + [16094] = "Durik", + [16156] = "Guerrero del Toque Oscuro", + [17598] = "Renn'az", + [21002] = "Escudero Lanzarayos", + [51656] = "Rug", + [60456] = "Belgrush Puñaldaga", + [60483] = "Morpheus Cajacostilla", + [60484] = "Liott Piel de Melena", + [60485] = "Noel Dedoso", + [60486] = "Vaya Mordisquepinchos", + [60487] = "Valdos Sabuesoloco", + [60488] = "Diane Camposalvaje", + [60641] = "Goma", + [60646] = "Evatax", + [60653] = "Herrero Esquelético", + [60659] = "Cydas Sombra Lunar", + [60663] = "Grin Harold", + [60740] = "Bald'aan el Silencioso", + [60766] = "Golsh", + [60768] = "Herekk", + [60790] = "Mathilda Beckett", + [60803] = "Tyrion Bouden", + [60813] = "Ahnja Viento de Verano", + [60966] = "Tanzig Luzligera", + [60989] = "Borrin Espalda de Polvo", + [61058] = "Tazo Luzalambre", + [61115] = "Wezzy Sierra de Cobre", + [61140] = "Azmela Crestoscuro", + [61266] = "Alexandra", + [61272] = "Samantha Stewards", + [61288] = "Savenna Musgoceniza", + [61369] = "Anati Gapper", + [61440] = "Gnidabern Giraperno", + [61443] = "Dimbil Disparotormenta", + [61445] = "Krinkle Buenacero", + [61478] = "Talavana Andalorah", + [61523] = "Naytha Luz de la Humildad", + [61563] = "Arayna Vientosuave", + [61624] = "AJ Springberry", + [61625] = "Daisy Vientovela", + [61626] = "Diane Campotrebol", + [61627] = "Viejo Jonah", + [61628] = "Willhelm Polvo de Roca", + [61629] = "Marven", + [61640] = "Tirador Rembrandt Olar", + [61651] = "Vi'cha Aullido Espiritual", + [61722] = "Sazzlix", + [61742] = "Mazin Explosión de Tenedor", + [61743] = "Hazlor Torkfuse", + [61751] = "Kango Explosión de Pernos", + [61812] = "Celia Aladía", + [62086] = "Meldor Lanzaveloz", + [62088] = "Reptador del Lago", + [62096] = "Aira Juracielos", + [62098] = "Gozzlek", + [62099] = "Guzhek", + [62148] = "Wisteria Gallagher", + [62161] = "Leander Hering", + [62307] = "Barbara Lee", + [62401] = "Farwyn Nochecebada", + [62402] = "Kargun Caída Poderosa", + [62403] = "Vohand Portatruenos", + [62404] = "Kazand Blundergate", + [62409] = "Gazla Forjanegra", + [62436] = "Hagrekk", + [62437] = "Maktha", + [62462] = "Elindra Suerteluz", + [62469] = "Navegante Weebletax", + [62628] = "Nyxma Remiendolisto", + [62739] = "Orthol el Rastreador", + [65002] = "Ethernos", + [65003] = "Chradarmu", + [80008] = "Aubrey Merton", + [80102] = "Ohgi Cardya", + [80105] = "Mayten Riflebum", + [80214] = "Malanius Brillo Plateado", + [80219] = "Forestal Rubinah Jurasol", + [80245] = "Damilara Tristealba", + [80266] = "Soalara Estrella del Alba", + [80267] = "Torial Alzaluz", + [80457] = "Andrelas Thas'danil", + [80458] = "Forestal Canarah Kim'Alah", + [80807] = "Reolis Colmillo de Marea", + [80808] = "Ranor Colmillo de Marea", + [80810] = "Rinja Colmillolento", + [80855] = "Trébol Girapistola", + [80856] = "Twinkie Boomstick", + [80903] = "Viz Bestiotrón", + [80915] = "Tan'Pogo", + [80941] = "Invocatierra Jalyssa", + [80942] = "Clamamuerte Aisha", + [80943] = "Dronormu", + [81035] = "Jake Booker", + [81050] = "Exploradora Nocturna Lanissa", + [91246] = "Valkar", + [91248] = "Wixx", + [91403] = "Kintello", + [91725] = "Darren Murmurobruma", + [91868] = "Primalista Gojo", + [91956] = "Denia Hale", + [91977] = "Olfan Ceja Dorada", + [92169] = "Kryillos", + [92177] = "Garto'ogg", + [92200] = "Bhatra", + [92217] = "Ticas Pelorretorcido", +} diff --git a/locales/data/vendors/ptBR.lua b/locales/data/vendors/ptBR.lua new file mode 100644 index 0000000..1d1ea9a --- /dev/null +++ b/locales/data/vendors/ptBR.lua @@ -0,0 +1,327 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.ptBR = { + [7] = "*", + [151] = "Brog Hamfist", + [152] = "Irmão Daniel", + [227] = "Mabel Solaj", + [228] = "Avette Fellwood", + [491] = "Intendente Lewis", + [543] = "Nalesette Frenesias ", + [734] = "Cabo Bluth", + [789] = "Kimberly Hiett", + [791] = "Lindsay Ashlock", + [829] = "Adlin Pridedrift", + [895] = "Thorgas Grimson", + [987] = "Ogromm", + [1149] = "Uthok", + [1198] = "Ricardo Fino", + [1231] = "Grif Selvacuore", + [1243] = "Hegnar Estremetiro", + [1250] = "Draco Lindgren", + [1285] = "Túlio Malheiros", + [1287] = "Marcia Weller", + [1297] = "Lina Fornalha", + [1298] = "Frederico Fornalha", + [1404] = "Kragg", + [1448] = "Nélio Allen", + [1452] = "Gruham Patego", + [1459] = "Naela Trance", + [1461] = "Murndan Derth", + [1462] = "Eduína Monzor", + [1469] = "Vrok Soltagafe", + [1668] = "Guilherme Gregorsohn", + [1682] = "Yanni Cuoreforte", + [1685] = "Xandar Boabarba", + [1686] = "Irene Tirocerto", + [1687] = "Cliff Filoneiro", + [1691] = "Kreg Bilmn", + [2084] = "Natheril Clamachuva", + [2115] = "Josué Fontenelle", + [2134] = "Sra. Hibérnias", + [2140] = "Eduíno Harly", + [2401] = "Keila Fuligissacra", + [2685] = "Mazk Tirolongo", + [2803] = "Malygen", + [2806] = "Fardo", + [2808] = "Vikki Lonsav", + [2820] = "Graud", + [2839] = "Haren Kanmae", + [2878] = "Peria Lamenur", + [2879] = "Karrina Mekenda", + [2908] = "Grawl", + [2997] = "Jyn Casco de Pedra", + [3015] = "Kina Chifre Troante", + [3018] = "Hogor Casco de Trovão", + [3038] = "Kari Chifre Troante", + [3039] = "Holto Chifre Troante", + [3040] = "Urek Chifre Troante", + [3053] = "Synge", + [3061] = "Lanka Tiro Distante", + [3065] = "Yaw Crina Cortante", + [3072] = "Kaunie Brisa Suave", + [3076] = "Moorat Passo Longo", + [3078] = "Kenna Olho de Falcão", + [3088] = "Henry Chapal", + [3154] = "Jen'shan", + [3158] = "Duokna", + [3164] = "Jark", + [3165] = "Ghrawt", + [3171] = "Thotar", + [3186] = "K'waii", + [3306] = "Keldas", + [3313] = "Trak'gen", + [3322] = "Jaka", + [3350] = "Asoran", + [3352] = "Ormak Tiroatroz", + [3406] = "Xor'juul", + [3407] = "Sian'dur", + [3409] = "Zendo'jian", + [3410] = "Jin'sora", + [3481] = "Barg", + [3488] = "Uthrok", + [3498] = "Bossanovik", + [3534] = "Wallace, o Cego", + [3541] = "Sara Croft", + [3545] = "Claude Senotorto", + [3587] = "Lyrai", + [3589] = "Keina", + [3596] = "Ayanna Perenanda", + [3601] = "Dazalar", + [3608] = "Áldia", + [3610] = "Jiyna Penarco", + [3620] = "Harruk", + [3622] = "Grokor", + [3624] = "Zudd", + [3625] = "Rarck", + [3688] = "Reban Caminho Liberto", + [3698] = "Bolyun", + [3951] = "Bhaldaran Corvulto", + [3962] = "Haljan Ruboralma", + [3963] = "Danlaar Noctandas", + [4082] = "Grawnal", + [4084] = "Chylina", + [4138] = "Jeen'ra Velonyx", + [4146] = "Jocasta", + [4170] = "Ellandrieth", + [4173] = "Landria", + [4182] = "Dalmond", + [4203] = "Ariyell Caelumbra", + [4205] = "Dorion", + [4241] = "Mydrannul", + [4320] = "Caelyb", + [4555] = "Eleanor Rusga", + [4602] = "Breno Pugna", + [4603] = "Nicolau Madeira", + [4604] = "Abigail Arqueda", + [4876] = "Jawn Chapadalta", + [4889] = "Torq Estouraferro", + [4892] = "Jesse Fanfarrão", + [4896] = "Caritas Lindin", + [5101] = "Bryllia Marcaferro", + [5115] = "Daera Setalume", + [5116] = "Olmin Barbardente", + [5117] = "Regnus Granitrondo", + [5122] = "Skolmin Furiouro", + [5123] = "Bretta Furiouro", + [5134] = "Jonivera Montalgures", + [5501] = "Kaerbrus", + [5510] = "Thulman Rochassílex", + [5515] = "Einris Setalume", + [5516] = "Ulfir Barbaférrea", + [5517] = "Thorfin Escudopétreo", + [5814] = "Estalajadeiro Thulbek", + [6028] = "Burkrum", + [6749] = "Erma", + [7942] = "Faralorn", + [7976] = "Thalgus Punhostrondo", + [8131] = "Blizricco Sciumbigno", + [8139] = "Jebbs", + [8308] = "Alenndaar Lapidus", + [8362] = "Kuruk", + [9320] = "Pipoca, o Corredor do Mar", + [9548] = "Cavento Mira Certa", + [9549] = "Borand", + [9551] = "Starn", + [9552] = "Zanara", + [9553] = "Nádia Vernon", + [9555] = "Mu'uta", + [9976] = "Tharlidun", + [9977] = "Sylista", + [9978] = "Uóxton", + [9979] = "Sara Goode", + [9980] = "Shelby Pedrerneira", + [9981] = "Sikwa", + [9982] = "Magali", + [9983] = "Kelsuwa", + [9984] = "Ulbrek Flamão", + [9985] = "Laziphus", + [9986] = "Shairka Corre com Lobos", + [9987] = "Shoja'my", + [9988] = "Zon'cha", + [9989] = "Lina Fornalenha", + [10045] = "Ciro Magno", + [10046] = "Betânia Pedertelo", + [10047] = "Miguel", + [10048] = "Gereck", + [10049] = "Hekkru", + [10050] = "Seikwa", + [10051] = "Seriadne", + [10052] = "Maluressian", + [10053] = "Anita Malho", + [10054] = "Bulrug", + [10055] = "Morganus", + [10056] = "Alassin", + [10057] = "Teodoro Mont Claire", + [10058] = "Greth", + [10059] = "Antárius", + [10060] = "Fenujeira", + [10061] = "Killium Digisseixo", + [10062] = "Estevão Treva", + [10063] = "Maçaroca", + [10085] = "Jaelysia", + [10086] = "Hesuwa Chifre Troante", + [10088] = "Xao'tsu", + [10089] = "Silvaria", + [10090] = "Bélia Granitrondo", + [10369] = "Trayexir", + [10930] = "Dargh Miracerta", + [11038] = "Zelador Alen", + [11069] = "Jenova Escudopétreo", + [11104] = "Shelgrayn", + [11105] = "Aboda", + [11117] = "Awenasa", + [11119] = "Zenóbio", + [11184] = "Wixxrak", + [11555] = "Gorn Caolho", + [12021] = "Daeolyn Foliéstia", + [12027] = "Tukkão", + [12029] = "Narianna", + [12246] = "Super-Loja 680", + [12782] = "Capitão O'Neal", + [12959] = "Nergal", + [12960] = "Christi Galvanis", + [13216] = "Gaelden Marteleiro", + [13217] = "Tantaldis Cintilaneve", + [13218] = "Gruunda Coração de Lobo", + [13219] = "Jekyll Fâmulo", + [13616] = "Mestre de Estábulo dos Lobo do Gelo", + [13617] = "Mestre de Estábulo de Lançatroz", + [14301] = "Brinna Valanaar", + [14581] = "Sargento Chifre Troante", + [14624] = "Mestre Ferreiro Queimatar", + [14741] = "Guarda-caça Markhor", + [14753] = "Iliana Fulgiluna", + [14754] = "Kelm Hargunth", + [14846] = "Lhara", + [15131] = "Quoiju", + [15174] = "Calandrath", + [15722] = "Escudeiro Leoren Mal'derath", + [16094] = "Durik", + [16156] = "Guerreiro Tocado pelas Trevas", + [17598] = "Renn'az", + [21002] = "Escudeiro Boltfling", + [51656] = "Rug", + [60456] = "Belgrush Punhadaga", + [60483] = "Morfeu Toráxio", + [60484] = "Liott Maneskin", + [60485] = "Noel Bearfinger", + [60486] = "Vaya Noxiteia", + [60487] = "Valdos Cão Louco", + [60488] = "Diane Willowfield", + [60641] = "Panco", + [60646] = "Taxa de Evatação", + [60653] = "Ferreiro Descarnado", + [60659] = "Cydas Umbraluna", + [60663] = "Grin Harold", + [60740] = "Bald'aan, o Silencioso", + [60766] = "Golsh", + [60768] = "Herekk", + [60790] = "Mathilda Beckett", + [60803] = "Tyrion Bouden", + [60813] = "Ahnja Summerwind", + [60966] = "Tanzig Ceraluz", + [60989] = "Borrin Ombro de Poeira", + [61058] = "Tazo Fiolume", + [61115] = "Wezzy Serra-cobre", + [61140] = "Azmela Shadowcrest", + [61266] = "Alexandra", + [61272] = "Samantha Stewards", + [61288] = "Savenna Mosscage", + [61369] = "Anati Gapper", + [61440] = "Gnidabern Coilspinner", + [61443] = "Dimbil Tempestiro", + [61445] = "Krilee Tempestiro", + [61478] = "Talavana Andalorah", + [61523] = "Naytha Grovelight", + [61563] = "Arayna Softwind", + [61624] = "AJ Springberry", + [61625] = "Daisy Windhelm", + [61626] = "Diana Cloverfield", + [61627] = "Velho Jonas", + [61628] = "Willhelm Rochapó", + [61629] = "Marven", + [61640] = "Atirador Rembrandt Olar", + [61651] = "Vi'cha, o Espírito Uivador", + [61722] = "Sazzlix", + [61742] = "Mazin Forquilha", + [61743] = "Fusível Hazlor", + [61751] = "Kango Esxploderraio", + [61812] = "Célia Daywing", + [62086] = "Meldor Swiftlance", + [62088] = "Laithor Folhaurora", + [62096] = "Aira Jurestrela", + [62098] = "Gozzlek", + [62099] = "Guzhek", + [62148] = "Wisteria Gallagher", + [62161] = "Leandro Hering", + [62307] = "Barbara Lee", + [62401] = "Farwyn Cevada Noite", + [62402] = "Kargun Mightfall", + [62403] = "Vohand Blundergate", + [62404] = "Kazand Blundergate", + [62409] = "Gazla Forja Negra", + [62436] = "Hagrekk", + [62437] = "Maktha", + [62462] = "Elindra Swiftluck", + [62469] = "Navegador Weebletax", + [62628] = "Nyxma Retalhazero", + [62739] = "Orthol, o Rastreador", + [65002] = "Ethernos", + [65003] = "Chradarmu", + [80008] = "Aubrey Merton", + [80102] = "Ohgi Cardya", + [80105] = "Mayten Trovarma", + [80214] = "Malanius Brilhaprata", + [80219] = "Patrulheira Rubinah Jurassolar", + [80245] = "Damilara Sunsorrow", + [80266] = "Soalara Dawnstar", + [80267] = "Torial Alvorada", + [80457] = "Andrelas Thas'danil", + [80458] = "Patrulheira Canarah Kim'alah", + [80807] = "Reolis Riptusk", + [80808] = "Ranor Presa Riptosa", + [80810] = "Rinja Presafume", + [80855] = "Clover Spinpistol", + [80856] = "Twinkie Explosivara", + [80903] = "Viz Fizbeast", + [80915] = "Tan'Pogo", + [80941] = "Arauto da Terra Jalyssa", + [80942] = "Bradamorte Aisha", + [80943] = "Dronormu", + [81035] = "Jake Booker", + [81050] = "Patrulheira Sombia Lanissa", + [91246] = "Valkar", + [91248] = "Wixx", + [91403] = "Kintello", + [91725] = "Darren Mistwall", + [91868] = "Primalista Gojo", + [91956] = "Dénia Hale", + [91977] = "Olfan Goldenbrow", + [92169] = "Kryillos", + [92177] = "Garto'ogg", + [92200] = "Bhatra", + [92217] = "Ticas Quirkfuzz", +} diff --git a/locales/data/vendors/ruRU.lua b/locales/data/vendors/ruRU.lua new file mode 100644 index 0000000..f966f0e --- /dev/null +++ b/locales/data/vendors/ruRU.lua @@ -0,0 +1,230 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.ruRU = { + [150] = "[UNUSED] Brother Milius", + [151] = "Брог Мясорук", + [152] = "Брат Даниль", + [227] = "Мейбл Солаж", + [228] = "Аветта Хвористинка", + [491] = "Интендант Льюис", + [543] = "Налезетта Буйный Нрав", + [734] = "Капрал Блуф", + [789] = "Кимберли Хайетт", + [791] = "Линдски Ашлок", + [829] = "Одлин Гордоступ", + [895] = "Торгас Мрачнон", + [904] = "[UNUSED] Regna Khurn", + [987] = "Огромм", + [1149] = "Утхок", + [1198] = "Раллик Финн", + [1231] = "Гриф Дикое Сердце", + [1243] = "Хегнар Громострел", + [1250] = "Дрейк Линдгрен", + [1285] = "Турман Милби", + [1287] = "Марда Веллер", + [1297] = "Лина Стовер", + [1298] = "Фредерик Стовер", + [1404] = "Крагг", + [1448] = "Нил Аллен", + [1452] = "Грухам Румднул", + [1455] = "[UNUSED] Grummar Thunk", + [1459] = "Наела Транс", + [1461] = "Мурден Дерт", + [1462] = "Эдвина Монзор", + [1469] = "Врок Мимострел", + [1668] = "Вильям Макгрегор", + [1682] = "Янни Твердое Сердце", + [1685] = "Ксаварик", + [1686] = "Ирен Меткострел", + [1687] = "Клифф Кадин", + [1691] = "Крег Бильмн", + [1859] = "[UNUSED] Nyein Longwind", + [2084] = "Натериль Заклинатель Дождя", + [2115] = "Джошуа Кин", + [2134] = "Миссис Винтерс", + [2140] = "Эдвин Харли", + [2286] = "Лучник", + [2401] = "Кайрен Священный Прах", + [2685] = "Мазк Карабинс", + [2803] = "Малиген", + [2806] = "Тюкн", + [2808] = "Викки Лонсав", + [2820] = "Грауд", + [2839] = "Харен Канмай", + [2878] = "Перия Ламенур", + [2879] = "Каррина Мекенда", + [2908] = "Граул", + [2997] = "Джин Каменное Копыто", + [3015] = "Куна Громовой Рог", + [3018] = "Хогор Громовое Копыто", + [3038] = "Кари Громовой Рог", + [3039] = "Хольт Громовой Рог", + [3040] = "Урек Громовой Рог", + [3053] = "Синг", + [3061] = "Ланко Дальний Выстрел", + [3065] = "Йо Колкая Грива", + [3072] = "Кауни Нежный Ветерок", + [3076] = "Морат Дальний Путь", + [3078] = "Кеннах Соколиный Глаз", + [3088] = "Генри Чапал", + [3154] = "Джен'шан", + [3158] = "Дуокна", + [3164] = "Джарк", + [3165] = "Грахт", + [3171] = "Тотар", + [3186] = "К'вайа", + [3306] = "Кельдас", + [3313] = "Трак'ген", + [3322] = "Каджа", + [3350] = "Азоран", + [3352] = "Ормак Лютострел", + [3406] = "Ксор'джуул", + [3407] = "Шиан'дара", + [3409] = "Зендо'джиан", + [3410] = "Джин'сора", + [3481] = "Барг", + [3488] = "Утрок", + [3498] = "Джаззик", + [3534] = "Уоллес Слепой", + [3541] = "Сара Рэйкрофт", + [3545] = "Клод Эрксин", + [3587] = "Лирай", + [3589] = "Кейна", + [3596] = "Аянна Вечнобродка", + [3601] = "Дазалар", + [3608] = "Альдия", + [3610] = "Джиена Оперенная Стрела", + [3620] = "Харрук", + [3622] = "Грокор", + [3624] = "Зюдд", + [3625] = "Рерк", + [3688] = "Ребан Вольный Странник", + [3698] = "Больюн", + [3951] = "Балдаран Тень Ворона", + [3962] = "Хальян Сердце Дуба", + [3963] = "Данлаар Ночной странник", + [4082] = "Граунал", + [4084] = "Чилина", + [4138] = "Джин'ра Ночная Вестница", + [4146] = "Иокаста", + [4170] = "Элландриет", + [4173] = "Ландрия", + [4182] = "Дальмонд", + [4203] = "Ариэль Тень Небес", + [4205] = "Дорион", + [4241] = "Мидраннул", + [4320] = "Калиб", + [4555] = "Элинор Руск", + [4602] = "Бенидж Феннер", + [4603] = "Николас Этвуд", + [4604] = "Эбигейл Сойер", + [4876] = "Джаун Высокий Холм", + [4889] = "Торк Стальное Зарево", + [4892] = "Дженсен Фарран", + [4896] = "Милла Сердия", + [5101] = "Бриллия Железное Клеймо", + [5115] = "Дайра Яркое Копье", + [5116] = "Олмин Пламебород", + [5117] = "Регнус Громовой Гранит", + [5122] = "Сколомин Златопуля", + [5123] = "Бретта Златопуля", + [5134] = "Джонивера Дальногор", + [5501] = "Карбус", + [5510] = "Тулман Кремневый Утес", + [5515] = "Эйнриса Яркошип", + [5516] = "Ульфир Железнобород", + [5517] = "Торфин Камнещит", + [5814] = "Хозяин таверны Тулбек", + [6028] = "Буркрум", + [6749] = "Ирма", + [7942] = "Фаралорн", + [7976] = "Талгус Громодлань", + [8131] = "Близрик Шрапнельс", + [8139] = "Джабби", + [8308] = "Алендаар Лаподаар", + [8362] = "Курук", + [9548] = "Кавинд Верный Прицел", + [9549] = "Боранд", + [9551] = "Старн", + [9552] = "Занара", + [9553] = "Надя Вернон", + [9555] = "Му'ута", + [9976] = "Тарлидун", + [9977] = "Силиста", + [9978] = "Весли", + [9979] = "Сара Гуди", + [9980] = "Шелби Щебенка", + [9981] = "Сиква", + [9982] = "Пенни", + [9983] = "Кельсува", + [9984] = "Ульбрек Огненная Длань", + [9985] = "Лазиф", + [9986] = "Ширка Волкопас", + [9987] = "Шоя'май", + [9988] = "Ксон'ча", + [9989] = "Лина Жаркий Очаг", + [10045] = "Кирк Максвелл", + [10046] = "Бетайна Кремнемолот", + [10047] = "Мишель", + [10048] = "Герек", + [10049] = "Хеккру", + [10050] = "Сейква", + [10051] = "Сериадна", + [10052] = "Малурессиан", + [10053] = "Аня Молрэ", + [10054] = "Балруг", + [10055] = "Морганус", + [10056] = "Алассин", + [10057] = "Теодор Монт-Клэр", + [10058] = "Грет", + [10059] = "Антарий", + [10060] = "Трубадым", + [10061] = "Киллиум Твердопал", + [10062] = "Стивен Блэк", + [10063] = "Реггифуз", + [10085] = "Джеласия", + [10086] = "Хесува Громовой Рог", + [10088] = "Ксао'цу", + [10089] = "Сильвария", + [10090] = "Белия Громовой Гранит", + [10369] = "Трайексир", + [10930] = "Дарг Верный Прицел", + [11038] = "Управляющий Ален", + [11069] = "Дженова Камнещит", + [11104] = "Шельграйн", + [11105] = "Абода", + [11117] = "Авенаса", + [11119] = "Аззлеби", + [11184] = "Виззрак", + [11555] = "Горн Одноглаз", + [12021] = "Даолин Летний Лист", + [12027] = "Тукк", + [12029] = "Нарианна", + [12036] = "Торговка с Заоблачного пика", + [12246] = "Робо-торговец 680", + [12782] = "Капитан О'Нил", + [12959] = "Нергал", + [12960] = "Кристи Гальванис", + [13216] = "Гаелден Кузнечный Молот", + [13217] = "Тантальдис Снегоблеск", + [13218] = "Грюнда Волчье Сердце", + [13219] = "Джекилл Флендринг", + [13616] = "Смотритель стойл из клана Северного Волка", + [13617] = "Смотритель стойл из клана Грозовой Вершины", + [14301] = "Бринна Валанаар", + [14581] = "Сержант Громовой Рог", + [14624] = "Мастер-кузнец Гориврат", + [14741] = "Охотник Мархор", + [14753] = "Иллиана Лунное Сияние", + [14754] = "Кельм Харгюнт", + [14846] = "Лара", + [15131] = "Киджу", + [15174] = "Каландрата", + [15722] = "Оруженосец Леорен Мал'дерат", + [16094] = "Дарик", + [16156] = "Помеченный Тьмой воин", + [17078] = "Джимми Максоус", + [17598] = "Ренн'аз", +} diff --git a/locales/data/vendors/zhCN.lua b/locales/data/vendors/zhCN.lua new file mode 100644 index 0000000..f41e02c --- /dev/null +++ b/locales/data/vendors/zhCN.lua @@ -0,0 +1,327 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} +MTH_LocaleData.data.vendors = MTH_LocaleData.data.vendors or {} + +MTH_LocaleData.data.vendors.zhCN = { + [7] = "*", + [151] = "布洛葛·哈姆菲斯特", + [152] = "丹尼尔修士", + [227] = "玛贝尔·索拉什", + [228] = "艾瓦特·菲尔伍德", + [491] = "军需官刘易斯", + [543] = "纳雷塞特", + [734] = "布鲁斯下士", + [789] = "金伯利·海特", + [791] = "林塞·阿什洛克", + [829] = "艾德林·怒流", + [895] = "索加斯·格瑞姆森", + [987] = "欧格鲁姆", + [1149] = "尤索克", + [1198] = "拉里克·费恩", + [1231] = "格瑞夫·蛮心", + [1243] = "海格纳·重枪", + [1250] = "德拉克·林格雷", + [1285] = "萨尔曼·穆比", + [1287] = "玛尔达·维勒", + [1297] = "黎娜·斯图瓦", + [1298] = "弗德瑞克·斯图瓦", + [1404] = "克拉格", + [1448] = "尼尔·奥雷", + [1452] = "格鲁哈姆·拉姆杜恩", + [1459] = "奈拉·特兰斯", + [1461] = "穆恩达·德斯", + [1462] = "艾德温娜·蒙佐尔", + [1469] = "维罗克·乱枪", + [1668] = "威廉·马克葛瑞格", + [1682] = "雅尼·铁心", + [1685] = "山达·细须", + [1686] = "埃伦", + [1687] = "克里夫·哈丁", + [1691] = "克雷格·比尔姆", + [2084] = "纳瑟瑞尔·祈雨", + [2115] = "乔舒·基恩", + [2134] = "温特斯夫人", + [2140] = "艾德温·哈里", + [2401] = "凯伦·苏萨隆", + [2685] = "玛兹克·斯奈普沙特", + [2803] = "玛里甘", + [2806] = "拜尔", + [2808] = "维基·隆萨夫", + [2820] = "格劳德", + [2839] = "哈伦·坎麦尔", + [2878] = "派瑞亚·拉密诺尔", + [2879] = "卡瑞娜·麦肯达", + [2908] = "格劳尔", + [2997] = "吉恩·石蹄", + [3015] = "库纳·雷角", + [3018] = "霍高尔·雷角", + [3038] = "卡瑞·雷角", + [3039] = "浩特·雷角", + [3040] = "乌瑞克·雷角", + [3053] = "赛恩格", + [3061] = "兰卡·远箭", + [3065] = "雅文·刺鬃", + [3072] = "卡文尼·柔风", + [3076] = "姆拉特·远行", + [3078] = "肯纳·鹰眼", + [3088] = "亨利·查培尔", + [3154] = "基沙", + [3158] = "多克纳", + [3164] = "加尔克", + [3165] = "格劳特", + [3171] = "索塔尔", + [3186] = "克瓦埃", + [3306] = "凯尔达斯", + [3313] = "特拉克根", + [3322] = "卡加", + [3350] = "阿索兰", + [3352] = "奥玛克·酷射", + [3406] = "科索祖尔", + [3407] = "萨杜尔", + [3409] = "森度吉安", + [3410] = "金索拉", + [3481] = "巴尔格", + [3488] = "阿瑟罗克", + [3498] = "加吉克", + [3534] = "盲眼瓦拉斯", + [3541] = "莎拉·雷克劳夫特", + [3545] = "克劳德·艾尔克辛", + [3587] = "琳莱尔", + [3589] = "奇娜", + [3596] = "阿亚娜·远途", + [3601] = "达扎拉", + [3608] = "奥蒂亚", + [3610] = "吉娜·羽弓", + [3620] = "哈鲁克", + [3622] = "格罗科尔", + [3624] = "祖德", + [3625] = "拉尔克", + [3688] = "瑞班", + [3698] = "波尔温", + [3951] = "巴尔达兰·鸦影", + [3962] = "哈尔詹·橡木之心", + [3963] = "丹拉尔·夜路", + [4082] = "格劳纳尔", + [4084] = "莎琳娜", + [4138] = "吉恩拉", + [4146] = "祖卡斯特", + [4170] = "艾兰蒂斯", + [4173] = "兰德瑞亚", + [4182] = "达蒙德", + [4203] = "阿瑞耶尔·天影", + [4205] = "多利安", + [4241] = "迈德兰努尔", + [4320] = "凯尔林布", + [4555] = "艾林诺尔·拉斯克", + [4602] = "本尼亚·芬奈尔", + [4603] = "尼古拉斯·阿特伍德", + [4604] = "阿比盖恩·萨叶尔", + [4876] = "加恩·高塔", + [4889] = "托克·铁火", + [4892] = "杰森·法兰", + [4896] = "查瑞迪·米普斯", + [5101] = "布莱利亚·铁印", + [5115] = "戴拉·锐矛", + [5116] = "奥尔明·燃须", + [5117] = "雷格努斯·雷石", + [5122] = "斯克米·金怒", + [5123] = "布雷塔·金怒", + [5134] = "约尼维拉·远山", + [5501] = "凯尔布鲁斯", + [5510] = "苏尔曼·火崖", + [5515] = "恩瑞斯·锐矛", + [5516] = "奥菲尔·铁须", + [5517] = "索尔芬·石盾", + [5814] = "旅店老板苏贝克", + [6028] = "布克拉姆", + [6749] = "艾玛", + [7942] = "法拉罗恩", + [7976] = "萨古斯·雷拳", + [8131] = "布雷兹里克·巴克舒特", + [8139] = "加贝", + [8308] = "奥林达尔·石鹿", + [8362] = "库鲁克", + [9320] = "海行者皮波卡", + [9548] = "卡温德", + [9549] = "伯兰德", + [9551] = "斯塔恩", + [9552] = "萨纳拉", + [9553] = "纳迪亚·沃农", + [9555] = "穆塔", + [9976] = "萨里顿", + [9977] = "塞丽斯塔", + [9978] = "维斯雷", + [9979] = "萨拉·古迪", + [9980] = "谢尔比·石火", + [9981] = "希克瓦", + [9982] = "本尼", + [9983] = "克尔苏瓦", + [9984] = "乌布雷克·火拳", + [9985] = "拉兹弗斯", + [9986] = "谢尔卡·狼行者", + [9987] = "苏亚米", + [9988] = "克苏卡", + [9989] = "丽娜·壁炉", + [10045] = "科尔克·麦克斯韦尔", + [10046] = "贝塞尼·火锤", + [10047] = "麦克尔", + [10048] = "格雷克", + [10049] = "哈克鲁", + [10050] = "希克瓦", + [10051] = "瑟里亚迪", + [10052] = "玛鲁希亚", + [10053] = "安雅·玛尔雷", + [10054] = "布尔鲁格", + [10055] = "莫加努斯", + [10056] = "阿拉辛", + [10057] = "塞多蒙·克莱尔", + [10058] = "格雷斯", + [10059] = "安塔留斯", + [10060] = "格雷米斯塔克", + [10061] = "基利姆·石趾", + [10062] = "斯蒂文·布莱克", + [10063] = "雷格菲兹", + [10085] = "贾琳希亚", + [10086] = "赫苏瓦·雷角", + [10088] = "肖祖", + [10089] = "西尔瓦莉雅", + [10090] = "贝莉亚·雷岩", + [10369] = "特莱耶克", + [10930] = "达恩·准星", + [11038] = "护理者奥林", + [11069] = "耶诺瓦·石盾", + [11104] = "舍尔戈莱恩", + [11105] = "安伯达", + [11117] = "阿文纳萨", + [11119] = "阿兹雷比", + [11184] = "维撒克", + [11555] = "独眼高恩", + [12021] = "黛欧琳·夏叶", + [12027] = "图克", + [12029] = "娜利安", + [12246] = "超级商人680型", + [12782] = "奥尼尔上尉", + [12959] = "奈尔加", + [12960] = "克里斯蒂·加瓦尼斯", + [13216] = "盖尔丁", + [13217] = "塔萨迪斯·雪光", + [13218] = "格伦达·狼心", + [13219] = "耶克里·弗兰迪", + [13616] = "霜狼兽栏管理员", + [13617] = "雷矛兽栏管理员", + [14301] = "布琳娜·瓦兰达尔", + [14581] = "军士霍斯·雷角", + [14624] = "大铁匠博恩奈特", + [14741] = "猎户马克霍尔", + [14753] = "艾蒂尔·月火", + [14754] = "凯尔姆·哈古斯", + [14846] = "兰拉", + [15131] = "基苏", + [15174] = "卡兰德拉斯", + [15722] = "莱欧伦·玛尔迪拉斯", + [16094] = "杜雷克", + [16156] = "黑暗战士", + [17598] = "瑞安兹", + [21002] = "侍从博尔特弗林", + [51656] = "拉格", + [60456] = "贝格鲁什·匕拳", + [60483] = "墨菲斯·肋骨", + [60484] = "利奥特·鬃皮", + [60485] = "诺埃尔·熊指", + [60486] = "瓦雅·蛛刺", + [60487] = "沃尔多斯·疯狗", + [60488] = "戴安·柳田", + [60641] = "戈马", + [60646] = "伊维泰克斯", + [60653] = "骸骨铁匠", + [60659] = "赛达斯·月影", + [60663] = "格林·哈罗德", + [60740] = "安静的巴尔达安", + [60766] = "戈尔什", + [60768] = "赫里克", + [60790] = "玛蒂尔达·贝克特", + [60803] = "提利昂·布登", + [60813] = "安贾夏风", + [60966] = "坦齐格·韦光", + [60989] = "博林·沙肩", + [61058] = "塔佐·线灯", + [61115] = "韦兹·铜锯", + [61140] = "阿兹梅拉·影冠", + [61266] = "亚历山德拉", + [61272] = "萨曼莎·斯图尔兹", + [61288] = "萨维纳·莫斯凯奇", + [61369] = "阿纳蒂·加珀", + [61440] = "格尼达伯恩·绕圈", + [61443] = "丁比尔·风弹", + [61445] = "克里利·风弹", + [61478] = "塔拉瓦纳·安达洛拉", + [61523] = "内萨·格罗夫莱特", + [61563] = "艾瑞娜·微风", + [61624] = "AJ·春莓", + [61625] = "黛西·风盔", + [61626] = "黛安·科洛弗", + [61627] = "老约拿", + [61628] = "威廉·石灰", + [61629] = "马文", + [61640] = "神射手伦勃朗·奥拉尔", + [61651] = "灵魂狩猎者维恰", + [61722] = "萨兹利克斯", + [61742] = "玛津·火叉", + [61743] = "哈兹洛·托克福丝", + [61751] = "坎戈·螺栓爆破", + [61812] = "塞莉娅·黎明之翼", + [62086] = "梅尔多·迅矛", + [62088] = "莱索·晨叶", + [62096] = "艾拉·星誓", + [62098] = "戈兹克", + [62099] = "加兹克", + [62148] = "威斯特里亚·加拉格尔", + [62161] = "利安德·赫林", + [62307] = "芭芭拉·李", + [62401] = "法温·夜麦", + [62402] = "卡尔贡·力陨", + [62403] = "沃哈丹·枪门", + [62404] = "喀桑德·枪门", + [62409] = "加兹拉·黑炉", + [62436] = "哈格雷克", + [62437] = "马克塔", + [62462] = "埃琳德拉·鸿运", + [62469] = "领航员威宝泰克斯", + [62628] = "尼克斯玛·尼夫帕奇", + [62739] = "追踪者奥索尔", + [65002] = "埃特诺斯", + [65003] = "恰达穆", + [80008] = "奥布雷·莫顿", + [80102] = "奥吉·卡地亚", + [80105] = "梅坦·炸枪", + [80214] = "玛拉尼斯·月光", + [80219] = "游侠卢比纳·誓日", + [80245] = "达米拉拉·炎伤", + [80266] = "索拉拉·晨星", + [80267] = "图瑞奥·晨光", + [80457] = "安卓拉斯·萨斯达尼尔", + [80458] = "游侠科纳罗·吉姆阿拉", + [80807] = "瑞欧里斯·裂牙", + [80808] = "雷诺·裂牙", + [80810] = "瑞加·森特塔斯克", + [80855] = "克洛弗·旋枪", + [80856] = "特温奇·火枪", + [80903] = "维兹·菲泽比斯特", + [80915] = "塔岸坡格奥", + [80941] = "唤地者嘉丽莎", + [80942] = "唤亡者艾莎", + [80943] = "卓诺姆", + [81035] = "杰克·布克尔", + [81050] = "黑暗游侠拉里萨", + [91246] = "沃卡", + [91248] = "威克斯", + [91403] = "金泰洛", + [91725] = "达伦·米斯特沃", + [91868] = "高卓祭司", + [91956] = "德尼亚·黑尔", + [91977] = "奥梵·金眉", + [92169] = "克瑞伊洛斯", + [92177] = "伽图奥格", + [92200] = "巴特拉", + [92217] = "提卡斯·怪毛", +} diff --git a/locales/init.lua b/locales/init.lua new file mode 100644 index 0000000..495b4de --- /dev/null +++ b/locales/init.lua @@ -0,0 +1,4 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} +MTH_LocaleData.data = MTH_LocaleData.data or {} diff --git a/locales/spells/deDE.lua b/locales/spells/deDE.lua new file mode 100644 index 0000000..3d68eea --- /dev/null +++ b/locales/spells/deDE.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.deDE = { + ["Banish"] = "Verbannen", + ["Bestial Wrath"] = "Zorn des Wildtiers", + ["Concussive Shot"] = "Erschütternder Schuss", + ["Counterattack"] = "Gegenangriff", + ["Critical Mass"] = "Kritische Masse", + ["Clever Traps"] = "Falleneffizienz", + ["Deterrence"] = "Abschreckung", + ["Explosive Trap"] = "Sprengfalle", + ["Explosive Trap Effect"] = "Sprengfalle'-Effekt", + ["Feed Pet"] = "Tier füttern", + ["Flare"] = "Leuchtfeuer", + ["Freezing Trap"] = "Eiskältefalle", + ["Freezing Trap Effect"] = "Eisk?tefalle", + ["Frost Trap"] = "Frostfalle", + ["Frost Trap Aura"] = "Frost Trap Aura", + ["Hunter's Mark"] = "Mal des Jägers", + ["Holy Strength"] = "Heilige Stärke", + ["Immolation Trap"] = "Feuerbrandfalle", + ["Immolation Trap Effect"] = "Feuerbrandfalle", + ["Improved Concussive Shot"] = "Verbesserter Erschütternder Schuss", + ["Improved Wing Clip"] = "Verbessertes Zurechtstutzen", + ["Perception"] = "Wachsamkeit", + ["Piercing Shot"] = "Stichschuss", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Quick Shots", + ["Rapid Fire"] = "Schnellfeuer", + ["Scare Beast"] = "Wildtier ängstigen", + ["Scatter Shot"] = "Streuschuss", + ["Scorpid Poison"] = "Skorpidgift", + ["Scorpid Sting"] = "Skorpidstich", + ["Serpent Sting"] = "Schlangenbiss", + ["Stoneform"] = "Steingestalt", + ["Unstable Power"] = "Unstable Power", + ["Ephemeral Power"] = "Ephemeral Power", + ["Viper Sting"] = "Vipernbiss", + ["War Stomp"] = "Kriegsdonner", + ["Will of the Forsaken"] = "Wille der Verlassenen", + ["Wing Clip"] = "Zurechtstutzen", + ["Wyvern Sting"] = "Stich des Flügeldrachen", + ["Blood Fury"] = "Kochendes Blut", + ["Berserking"] = "Berserker", +} diff --git a/locales/spells/enUS.lua b/locales/spells/enUS.lua new file mode 100644 index 0000000..76782ae --- /dev/null +++ b/locales/spells/enUS.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.enUS = { + ["Banish"] = "Banish", + ["Bestial Wrath"] = "Bestial Wrath", + ["Concussive Shot"] = "Concussive Shot", + ["Counterattack"] = "Counterattack", + ["Critical Mass"] = "Critical Mass", + ["Clever Traps"] = "Clever Traps", + ["Deterrence"] = "Deterrence", + ["Explosive Trap"] = "Explosive Trap", + ["Explosive Trap Effect"] = "Explosive Trap Effect", + ["Feed Pet"] = "Feed Pet", + ["Flare"] = "Flare", + ["Freezing Trap"] = "Freezing Trap", + ["Freezing Trap Effect"] = "Freezing Trap Effect", + ["Frost Trap"] = "Frost Trap", + ["Frost Trap Aura"] = "Frost Trap Aura", + ["Hunter's Mark"] = "Hunter's Mark", + ["Holy Strength"] = "Holy Strength", + ["Immolation Trap"] = "Immolation Trap", + ["Immolation Trap Effect"] = "Immolation Trap Effect", + ["Improved Concussive Shot"] = "Improved Concussive Shot", + ["Improved Wing Clip"] = "Improved Wing Clip", + ["Perception"] = "Perception", + ["Piercing Shot"] = "Piercing Shot", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Quick Shots", + ["Rapid Fire"] = "Rapid Fire", + ["Scare Beast"] = "Scare Beast", + ["Scatter Shot"] = "Scatter Shot", + ["Scorpid Poison"] = "Scorpid Poison", + ["Scorpid Sting"] = "Scorpid Sting", + ["Serpent Sting"] = "Serpent Sting", + ["Stoneform"] = "Stoneform", + ["Unstable Power"] = "Unstable Power", + ["Ephemeral Power"] = "Ephemeral Power", + ["Viper Sting"] = "Viper Sting", + ["War Stomp"] = "War Stomp", + ["Will of the Forsaken"] = "Will of the Forsaken", + ["Wing Clip"] = "Wing Clip", + ["Wyvern Sting"] = "Wyvern Sting", + ["Blood Fury"] = "Blood Fury", + ["Berserking"] = "Berserking", +} diff --git a/locales/spells/esES.lua b/locales/spells/esES.lua new file mode 100644 index 0000000..7ef4b28 --- /dev/null +++ b/locales/spells/esES.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.esES = { + ["Banish"] = "Banish", + ["Bestial Wrath"] = "Bestial Wrath", + ["Concussive Shot"] = "Concussive Shot", + ["Counterattack"] = "Counterattack", + ["Critical Mass"] = "Critical Mass", + ["Clever Traps"] = "Clever Traps", + ["Deterrence"] = "Deterrence", + ["Explosive Trap"] = "Explosive Trap", + ["Explosive Trap Effect"] = "Explosive Trap Effect", + ["Feed Pet"] = "Feed Pet", + ["Flare"] = "Flare", + ["Freezing Trap"] = "Freezing Trap", + ["Freezing Trap Effect"] = "Freezing Trap Effect", + ["Frost Trap"] = "Frost Trap", + ["Frost Trap Aura"] = "Frost Trap Aura", + ["Hunter's Mark"] = "Hunter's Mark", + ["Holy Strength"] = "Holy Strength", + ["Immolation Trap"] = "Immolation Trap", + ["Immolation Trap Effect"] = "Immolation Trap Effect", + ["Improved Concussive Shot"] = "Improved Concussive Shot", + ["Improved Wing Clip"] = "Improved Wing Clip", + ["Perception"] = "Perception", + ["Piercing Shot"] = "Piercing Shot", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Quick Shots", + ["Rapid Fire"] = "Rapid Fire", + ["Scare Beast"] = "Scare Beast", + ["Scatter Shot"] = "Scatter Shot", + ["Scorpid Poison"] = "Scorpid Poison", + ["Scorpid Sting"] = "Scorpid Sting", + ["Serpent Sting"] = "Serpent Sting", + ["Stoneform"] = "Stoneform", + ["Unstable Power"] = "Unstable Power", + ["Ephemeral Power"] = "Ephemeral Power", + ["Viper Sting"] = "Viper Sting", + ["War Stomp"] = "War Stomp", + ["Will of the Forsaken"] = "Will of the Forsaken", + ["Wing Clip"] = "Wing Clip", + ["Wyvern Sting"] = "Wyvern Sting", + ["Blood Fury"] = "Blood Fury", + ["Berserking"] = "Berserking", +} diff --git a/locales/spells/ptBR.lua b/locales/spells/ptBR.lua new file mode 100644 index 0000000..dc9d6ed --- /dev/null +++ b/locales/spells/ptBR.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.ptBR = { + ["Banish"] = "Banish", + ["Bestial Wrath"] = "Bestial Wrath", + ["Concussive Shot"] = "Concussive Shot", + ["Counterattack"] = "Counterattack", + ["Critical Mass"] = "Critical Mass", + ["Clever Traps"] = "Clever Traps", + ["Deterrence"] = "Deterrence", + ["Explosive Trap"] = "Explosive Trap", + ["Explosive Trap Effect"] = "Explosive Trap Effect", + ["Feed Pet"] = "Feed Pet", + ["Flare"] = "Flare", + ["Freezing Trap"] = "Freezing Trap", + ["Freezing Trap Effect"] = "Freezing Trap Effect", + ["Frost Trap"] = "Frost Trap", + ["Frost Trap Aura"] = "Frost Trap Aura", + ["Hunter's Mark"] = "Hunter's Mark", + ["Holy Strength"] = "Holy Strength", + ["Immolation Trap"] = "Immolation Trap", + ["Immolation Trap Effect"] = "Immolation Trap Effect", + ["Improved Concussive Shot"] = "Improved Concussive Shot", + ["Improved Wing Clip"] = "Improved Wing Clip", + ["Perception"] = "Perception", + ["Piercing Shot"] = "Piercing Shot", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Quick Shots", + ["Rapid Fire"] = "Rapid Fire", + ["Scare Beast"] = "Scare Beast", + ["Scatter Shot"] = "Scatter Shot", + ["Scorpid Poison"] = "Scorpid Poison", + ["Scorpid Sting"] = "Scorpid Sting", + ["Serpent Sting"] = "Serpent Sting", + ["Stoneform"] = "Stoneform", + ["Unstable Power"] = "Unstable Power", + ["Ephemeral Power"] = "Ephemeral Power", + ["Viper Sting"] = "Viper Sting", + ["War Stomp"] = "War Stomp", + ["Will of the Forsaken"] = "Will of the Forsaken", + ["Wing Clip"] = "Wing Clip", + ["Wyvern Sting"] = "Wyvern Sting", + ["Blood Fury"] = "Blood Fury", + ["Berserking"] = "Berserking", +} diff --git a/locales/spells/ruRU.lua b/locales/spells/ruRU.lua new file mode 100644 index 0000000..01efb02 --- /dev/null +++ b/locales/spells/ruRU.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.ruRU = { + ["Banish"] = "Изгнание", + ["Bestial Wrath"] = "Звериный гнев", + ["Concussive Shot"] = "Контузящий выстрел", + ["Counterattack"] = "Контратака", + ["Critical Mass"] = "Критическая масса", + ["Clever Traps"] = "Хитрые ловушки", + ["Deterrence"] = "Сдерживание", + ["Explosive Trap"] = "Взрывная ловушка", + ["Explosive Trap Effect"] = "Эффект взрывной ловушки", + ["Feed Pet"] = "Кормление питомца", + ["Flare"] = "Осветительная ракета", + ["Freezing Trap"] = "Замораживающая ловушка", + ["Freezing Trap Effect"] = "Эффект замораживающей ловушки", + ["Frost Trap"] = "Ледяная ловушка", + ["Frost Trap Aura"] = "Аура ледяной ловушки", + ["Hunter's Mark"] = "Метка охотника", + ["Holy Strength"] = "Священная сила", + ["Immolation Trap"] = "Обжигающая ловушка", + ["Immolation Trap Effect"] = "Эффект обжигающей ловушки", + ["Improved Concussive Shot"] = "Улучшенный контузящий выстрел", + ["Improved Wing Clip"] = "Безжалостно подрезать крылья", + ["Perception"] = "Внимательность", + ["Piercing Shot"] = "Пронзающий выстрел", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Скорострельность", + ["Rapid Fire"] = "Быстрая стрельба", + ["Scare Beast"] = "Отпугивание зверя", + ["Scatter Shot"] = "Дезориентирующий выстрел", + ["Scorpid Poison"] = "Яд скорпида", + ["Scorpid Sting"] = "Укус скорпида", + ["Serpent Sting"] = "Укус змеи", + ["Stoneform"] = "Каменная форма", + ["Unstable Power"] = "Изменчивая сила", + ["Ephemeral Power"] = "Эфемерная Власть", + ["Viper Sting"] = "Укус гадюки", + ["War Stomp"] = "Громовая поступь", + ["Will of the Forsaken"] = "Воля Отрекшихся", + ["Wing Clip"] = "Подрезать крылья", + ["Wyvern Sting"] = "Укус виверны", + ["Blood Fury"] = "Кровавое неистовство", + ["Berserking"] = "Берсерк", +} diff --git a/locales/spells/zhCN.lua b/locales/spells/zhCN.lua new file mode 100644 index 0000000..b7a8dd0 --- /dev/null +++ b/locales/spells/zhCN.lua @@ -0,0 +1,46 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.spells = MTH_LocaleData.spells or {} + +MTH_LocaleData.spells.zhCN = { + ["Banish"] = "放逐术", + ["Bestial Wrath"] = "狂野怒火", + ["Concussive Shot"] = "震荡射击", + ["Counterattack"] = "反击", + ["Critical Mass"] = "火焰重击", + ["Clever Traps"] = "灵巧陷阱", + ["Deterrence"] = "威慑", + ["Explosive Trap"] = "爆炸陷阱", + ["Explosive Trap Effect"] = "爆炸陷阱效果", + ["Feed Pet"] = "喂养宠物", + ["Flare"] = "照明弹", + ["Freezing Trap"] = "冰冻陷阱", + ["Freezing Trap Effect"] = "冰冻陷阱效果", + ["Frost Trap"] = "冰霜陷阱", + ["Frost Trap Aura"] = "冰霜陷阱光环", + ["Hunter's Mark"] = "猎人印记", + ["Holy Strength"] = "Holy Strength", + ["Immolation Trap"] = "献祭陷阱", + ["Immolation Trap Effect"] = "献祭陷阱效果", + ["Improved Concussive Shot"] = "强化震荡射击", + ["Improved Wing Clip"] = "强化摔绊", + ["Perception"] = "感知", + ["Piercing Shot"] = "Piercing Shot", + ["Piercing Shots"] = "Piercing Shots", + ["Quick Shots"] = "Quick Shots", + ["Rapid Fire"] = "急速射击", + ["Scare Beast"] = "恐吓野兽", + ["Scatter Shot"] = "驱散射击", + ["Scorpid Poison"] = "蝎毒", + ["Scorpid Sting"] = "毒蝎钉刺", + ["Serpent Sting"] = "毒蛇钉刺", + ["Stoneform"] = "石像形态", + ["Unstable Power"] = "Unstable Power", + ["Ephemeral Power"] = "Ephemeral Power", + ["Viper Sting"] = "蝰蛇钉刺", + ["War Stomp"] = "战争践踏", + ["Will of the Forsaken"] = "亡灵意志", + ["Wing Clip"] = "摔绊", + ["Wyvern Sting"] = "翼龙钉刺", + ["Blood Fury"] = "血性狂暴", + ["Berserking"] = "狂暴", +} diff --git a/locales/ui/deDE.lua b/locales/ui/deDE.lua new file mode 100644 index 0000000..001a450 --- /dev/null +++ b/locales/ui/deDE.lua @@ -0,0 +1,6 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.deDE = { + FEEDOMATIC_NAME = "Futter-O-Mat", +} diff --git a/locales/ui/enUS.lua b/locales/ui/enUS.lua new file mode 100644 index 0000000..fcc41a9 --- /dev/null +++ b/locales/ui/enUS.lua @@ -0,0 +1,131 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.enUS = { + BINDING_HEADER_FEEDOMATIC = "[MetaHunt] Feed-O-Matic", + BINDING_HEADER_ZAspectHeader = "[MetaHunt] ZAspect Buttons", + BINDING_HEADER_ZTrackHeader = "[MetaHunt] ZTrack Buttons", + BINDING_HEADER_ZTrapHeader = "[MetaHunt] ZTrap Buttons", + BINDING_HEADER_ZPetHeader = "[MetaHunt] ZPet Buttons", + BINDING_HEADER_ZAmmoHeader = "[MetaHunt] ZAmmo Buttons", + + FEEDOMATIC_NAME = "Feed-O-Matic", + FEEDOMATIC_DESC = "Helps a Hunter keep his pets well fed", + ZHUNTER_NAME = "zhunter", + ZHUNTER_DESC = "Various features to make a hunter's life easier", + + TOOLTIPS_OPTION_FOOD = "Add tooltips on food", + TOOLTIPS_OPTION_FOOD_HELP = "Show your current pet's food preference directly in item tooltips.", + TOOLTIPS_OPTION_OWNPET = "Activate on my pet", + TOOLTIPS_OPTION_OWNPET_HELP = "Show your own pet status details in tooltip when hovering your pet context.", + TOOLTIPS_FOOD_QUALITY_UNKNOWN = "%s can eat this, but hasn't tried it yet.", + TOOLTIPS_FOOD_QUALITY_UNDER = "%s doesn't like this anymore.", + TOOLTIPS_FOOD_QUALITY_MIGHT = "%s might eat this.", + TOOLTIPS_FOOD_QUALITY_WILL = "%s will eat this.", + TOOLTIPS_FOOD_QUALITY_LIKE = "%s likes to eat this.", + TOOLTIPS_FOOD_QUALITY_LOVE = "%s loves to eat this.", + TOOLTIPS_FOOD_MARKER_UNKNOWN = "can eat this, but hasn't tried it yet.", + TOOLTIPS_FOOD_MARKER_UNDER = "doesn't like this anymore.", + TOOLTIPS_FOOD_MARKER_MIGHT = "might eat this.", + TOOLTIPS_FOOD_MARKER_WILL = "will eat this.", + TOOLTIPS_FOOD_MARKER_LIKE = "likes to eat this.", + TOOLTIPS_FOOD_MARKER_LOVE = "loves to eat this.", + + FOM_BIND_UNAVAILABLE = "Unavailable", + FOM_BIND_UNBOUND = "Unbound", + FOM_BIND_STATUS_PROMPT = "Feed key: press a key... (ESC to clear)", + FOM_BIND_STATUS_VALUE = "Feed key: %s", + FOM_BIND_SET_KEY = "Set Key", + FOM_BIND_PRESS_KEY = "Press key...", + FOM_BIND_CLEAR = "Clear", + FOM_ERROR_KEYBIND_API_UNAVAILABLE = "Keybinding APIs unavailable.", + FOM_ERROR_KEYBIND_COMBAT_LOCKED = "Cannot change keybindings during combat.", + FOM_ERROR_TOGGLE_FAILED = "Failed to change FeedOMatic state: %s", + + FOM_TITLE = "Feed-O-Matic", + FOM_STATUS_NOTICE = "Feed-O-Matic, created by the great Fizzwidget, is not yet entirely ready for TurtleWoW because I am missing \na reliable list of all foods, mostly impossible to fetch from the DB.\n It still works much better in this version, but all stuff related to Food buff and Cooking isnt fully functional.", + FOM_ENABLE_MODULE = "Enable FeedOMatic module", + FOM_HEADER_GENERAL = "General", + FOM_BIND_HINT = "You should assign a key bind for feed-o-matic,\nin order to feed your pet automatically.\nThe key \"P\" is an excellent candidate !", + FOM_KEEP_OPEN_BAG_SLOTS = "Keep open bag slots:", + FOM_HEADER_NOTIFY_WHEN_FEEDING = "Notify when feeding", + FOM_HEADER_WARN_WHEN_PET_NEEDS_FEEDING = "Warn when pet needs feeding", + FOM_HEADER_AVOID_FOODS_USED_IN_COOKING = "Avoid foods used in cooking", + + FOM_LABEL_AVOID_QUEST_FOODS = "Avoid quest foods", + FOM_LABEL_AVOID_BONUS_FOODS = "Avoid bonus foods", + FOM_LABEL_PREFER_HIGHER_QUALITY_FOOD = "Prefer higher quality food", + FOM_LABEL_FALLBACK_TO_AVOIDED_FOODS = "Fallback to avoided foods", + + FOM_LABEL_NOTIFY_VIA_EMOTE = "Via emote", + FOM_LABEL_NOTIFY_IN_CHAT = "In chat", + FOM_LABEL_NOTIFY_NONE = "Don't notify", + + FOM_LABEL_WARN_WHEN_CONTENT = "When content", + FOM_LABEL_WARN_WHEN_UNHAPPY = "When unhappy", + FOM_LABEL_DONT_WARN = "Don't warn", + + FOM_LABEL_PLAY_SOUND = "Play sound", + FOM_LABEL_USE_BELL_SOUND = "Use bell sound", + FOM_LABEL_SHOW_TEXT = "Show text", + FOM_LABEL_FLASH_ICON = "Flash icon", + + FOM_LABEL_ONLY_DIFFICULT_RECIPES = "Only difficult recipes", + FOM_LABEL_MEDIUM_OR_BETTER = "Medium or better", + FOM_LABEL_EASY_OR_BETTER = "Easy or better", + FOM_LABEL_ALL_FOODS = "All foods", + FOM_LABEL_DO_NOT_SAVE_COOKING_FOODS = "Do not save cooking foods", + + ZB_ERR_CONFIG_NOT_LOADED = "Configuration not loaded for %s", + ZB_LABEL_ENABLE_FMT = "Enable %s", + ZB_SECTION_PARENT_BUTTON = "Parent Button", + ZB_SECTION_CHILDREN_BUTTONS = "Children Buttons", + ZB_LABEL_BUTTON_SIZE = "Button Size", + ZB_LABEL_NUMBER_OF_ROWS = "Number of Rows", + ZB_LABEL_EXPAND_LEFT = "Expand Left (opposite side)", + ZB_LABEL_HIDE_BUTTONS_ON_CLICK = "Hide Buttons On Click", + ZB_LABEL_SHOW_TOOLTIP = "Show Tooltip", + ZB_LABEL_SHOW_AMMO_NAME = "Show ammo name", + ZB_LABEL_HIDE_BUTTON = "Hide Button", + ZB_LABEL_USE_CIRCLE_BUTTON = "Use Circle Button", + ZB_HEADER_SPELL_ORDER = "Spell Order", + ZB_TEXT_SPELL_DATA_NOT_LOADED = "Spell data not loaded", + + COMMON_CLOSE_SHORT = "X", + COMMON_CLEAR = "Clear", + COMMON_SELECT_ALL = "Select All", + + DEBUG_TITLE = "MetaHunt Debug - Errors & Messages", + DEBUG_SUMMARY_ERRORS = "=== Errors Captured: %s ===", + DEBUG_SUMMARY_INFO = "=== Info Captured: %s ===", + DEBUG_SUMMARY_QUEUE = "=== Total in queue: %s ===", + DEBUG_CLEARED = "Debug frame cleared", + DEBUG_ALL_SELECTED = "All text selected - press Ctrl+C to copy", + + MINIMAP_TITLE = "MetaHunt", + MINIMAP_HINT_LEFT_CLICK = "Left-Click: Open Hunter Book", + MINIMAP_HINT_RIGHT_CLICK = "Right-Click: Open MetaHunt Options", + MINIMAP_HINT_DRAG = "Drag: Move button", + + OPT_ERR_CREATE_OPTIONS_FRAME = "[MTH OPTIONS] Failed to create MetaHuntOptions", + OPT_ERR_CHRON_NOT_LOADED = "Chronometer options module not loaded", + + CREDITS_TITLE = "Credits", + CREDITS_LINK_INSERTED = "Link inserted in chat: ", + CREDITS_LINK_FALLBACK = "Link: ", + CREDITS_ABOUT_CODE_TITLE = "About the code", + CREDITS_ABOUT_CODE_INTRO = "This addon is, in others, a compilation of old vanilla addons that I loved and played with during years. But most of them had become very buggy with TwoW as new contain was added to the server. \n I fixed, reworked, enhanced, and melted them within a modern modular framework that I created.\nI want to make it crystal clear about what work is mine, and what is not and respectfully credit the original authors for the great stuff I've taken from them:", + CREDITS_ABOUT_ZHUNTER = "- zBars, Antidaze and Autostrip were core functionalities of Vanilla zHunterMod addon. And I kept the \"z\" naming of bars/buttons to always remember it. On top of this I have created myself zAmmo, zCompanions, zMount, zToys.\nAlso the SmartAmmo feature idea is coming from Zhuntermod: there was a file in it with that functionality, but was like a work-in-progress, totally unfunctional and even \"dangerous\" in its current state, and was not active in the addon. Since it was a fucking great idea, I recoded it mostly from scratch and made it work reliably and safely.", + CREDITS_ABOUT_FEEDOMATIC = "- Feed-o-Matic was entirely the work of Fizzwidget. I made it work for Twow, by melting it as a module calling Metahunt core to get pet's state and up-to-date data for new pet families and their diet.", + CREDITS_ABOUT_TOOLTIPS = "- Tooltips module is based on Hunter Helper, another vanilla addon of Fizzwidget. I kept the general idea, but there's not much original code left from it in Metahunt as I refactored everything so it plugs on MetaHunt controlled event handlers, can work with Turtle wow data, and is now usable on other things than Beasts.", + CREDITS_ABOUT_CHRONOMETER = "- Chronometer was an old and very popular vanilla addon working with ACE2 libraries. It has known uncountable iterations by various people over the years, and I can't credit them all of them here. The current version used by Metahunt is based on this Twow conversion made by \"wigan91\". I have reworked it to have it Hunter-focused-only: removed the non-hunter/race stuff, improved the definition for spells/effects config that were not correct, added missing hunter spells (not many), and implemented my own bar color scheme fitting better the hunter spells.", + CREDITS_ABOUT_MAP = "- The Map/Marker system is the one of pfQuest from Master Shagu. Unfortunately he is no more reachable for some months and I could not have some talk with him about this. I mostly let it untouched, I just made slight modifications so it can integrate better within Metahunt, and doesn't conflict with pfQuest.", + CREDITS_ABOUT_ATLAS_LINKS = "- The system allowing to fetch itemlinks in game (In the Weapon tab of the Hunter Book notably) is the one of Atlas Twow.", + CREDITS_ABOUT_DATA_TITLE = "About data sources", + CREDITS_ABOUT_DATA_INTRO = "Metahunt ships with its own Turtle-WoW datastores, limited to hunter stuff only, and most of this data is up-to-date (Feb 2026).\n\nSources used to build the data include:", + CREDITS_DATA_PFQUEST = "- pfQuest for Beasts and Ammo vendors NPCs and their spawn points (and beasts respawn times if any). Thank you again Shagu.", + CREDITS_DATA_SHEET = "- This invaluable and very accurate spreadsheet for beasts having pet abilities. A big thanks to all twow players that crafted this! Now you dont need that sheet anymore, you have Metahunt! And the Great Book of Huntards is awesome and accurate also because of YOU.", + CREDITS_DATA_OTHER = "- Atlas twow for ranged weapon sources\n\n- Twow wiki for pet diet (which was incomplete, missing Serpents and Foxes)", + CREDITS_CLOSING = "With that being said, go back hunting fellas!", + CREDITS_SIGNATURE = "\nMetasploit , of Nordaanar.", +} diff --git a/locales/ui/esES.lua b/locales/ui/esES.lua new file mode 100644 index 0000000..4070e08 --- /dev/null +++ b/locales/ui/esES.lua @@ -0,0 +1,5 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.esES = { +} diff --git a/locales/ui/ptBR.lua b/locales/ui/ptBR.lua new file mode 100644 index 0000000..f64b4cd --- /dev/null +++ b/locales/ui/ptBR.lua @@ -0,0 +1,5 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.ptBR = { +} diff --git a/locales/ui/ruRU.lua b/locales/ui/ruRU.lua new file mode 100644 index 0000000..f603b2e --- /dev/null +++ b/locales/ui/ruRU.lua @@ -0,0 +1,5 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.ruRU = { +} diff --git a/locales/ui/zhCN.lua b/locales/ui/zhCN.lua new file mode 100644 index 0000000..656ef29 --- /dev/null +++ b/locales/ui/zhCN.lua @@ -0,0 +1,5 @@ +MTH_LocaleData = MTH_LocaleData or {} +MTH_LocaleData.ui = MTH_LocaleData.ui or {} + +MTH_LocaleData.ui.zhCN = { +} diff --git a/modules/autobuy/engine.lua b/modules/autobuy/engine.lua index 3f3c74b..079783b 100644 --- a/modules/autobuy/engine.lua +++ b/modules/autobuy/engine.lua @@ -446,6 +446,120 @@ local function AB_ResolveAmmoByName(name) return row.itemId, row.subtype end +local function AB_GetInventoryBagSlotByContainerId(containerId) + local toInv = _G and _G["ContainerIDToInventoryID"] or nil + if type(toInv) == "function" then + local invSlot = tonumber(toInv(containerId)) + if invSlot and invSlot > 0 then + return invSlot + end + end + local bag = tonumber(containerId) + if bag and bag >= 1 and bag <= 4 then + return bag + 19 + end + return nil +end + +local function AB_GetSpecialAmmoBagTargets() + local targets = { + arrow = {}, + bullet = {}, + } + local getInvLink = _G and _G["GetInventoryItemLink"] or nil + if type(getInvLink) ~= "function" then + return targets + end + for bag = 1, 4 do + local invSlot = AB_GetInventoryBagSlotByContainerId(bag) + if invSlot then + local bagLink = getInvLink("player", invSlot) + local bagItemId = AB_ParseItemIdFromLink(bagLink) + local bagRow = (MTH_DS_BagItems and bagItemId) and MTH_DS_BagItems[tonumber(bagItemId) or bagItemId] or nil + local bagSubtype = bagRow and string.lower(tostring(bagRow.subtype or "")) or "" + if bagSubtype == "quiver" then + table.insert(targets.arrow, { bag = bag, invSlot = invSlot, itemId = bagItemId, subtype = bagSubtype }) + elseif bagSubtype == "ammo pouch" then + table.insert(targets.bullet, { bag = bag, invSlot = invSlot, itemId = bagItemId, subtype = bagSubtype }) + end + end + end + return targets +end + +local function AB_MoveAmmoStacksToSpecialBags(maxMoves) + local getSlots = _G and _G["GetContainerNumSlots"] or nil + local getLink = _G and _G["GetContainerItemLink"] or nil + local pick = _G and _G["PickupContainerItem"] or nil + local putInBag = _G and _G["PutItemInBag"] or nil + local hasCursor = _G and _G["CursorHasItem"] or nil + local clearCursor = _G and _G["ClearCursor"] or nil + if type(getSlots) ~= "function" or type(getLink) ~= "function" + or type(pick) ~= "function" or type(putInBag) ~= "function" + or type(hasCursor) ~= "function" or type(clearCursor) ~= "function" then + return 0 + end + + local targets = AB_GetSpecialAmmoBagTargets() + local arrowTargets = targets.arrow or {} + local bulletTargets = targets.bullet or {} + if table.getn(arrowTargets) == 0 and table.getn(bulletTargets) == 0 then + return 0 + end + + local moves = 0 + local moveLimit = math.floor(tonumber(maxMoves) or 200) + if moveLimit < 1 then moveLimit = 200 end + local isTargetBag = {} + for i = 1, table.getn(arrowTargets) do + local bagId = tonumber(arrowTargets[i].bag) + if bagId then + isTargetBag[bagId] = true + end + end + for i = 1, table.getn(bulletTargets) do + local bagId = tonumber(bulletTargets[i].bag) + if bagId then + isTargetBag[bagId] = true + end + end + + for sourceBag = 0, 4 do + local isSpecialSource = isTargetBag[tonumber(sourceBag)] and true or false + if not isSpecialSource then + local slots = tonumber(getSlots(sourceBag)) or 0 + for sourceSlot = 1, slots do + local link = getLink(sourceBag, sourceSlot) + local itemId = AB_ParseItemIdFromLink(link) + local ammoSubtype = itemId and AB_GetAmmoSubtypeByItemId(itemId) or nil + if ammoSubtype then + local destinationTargets = ammoSubtype == "arrow" and arrowTargets or bulletTargets + if table.getn(destinationTargets) > 0 then + pick(sourceBag, sourceSlot) + if hasCursor() then + for i = 1, table.getn(destinationTargets) do + putInBag(destinationTargets[i].invSlot) + if not hasCursor() then + moves = moves + 1 + break + end + end + if hasCursor() then + clearCursor() + end + if moves >= moveLimit then + return moves + end + end + end + end + end + end + end + + return moves +end + local function AB_DefaultRule() return { enabled = false, @@ -475,16 +589,6 @@ local function AB_EnsureRuleList(bucket) return bucket end -local function AB_Log(message, severity) - if type(MTH_Log) == "function" then - MTH_Log("[AutoBuy] " .. tostring(message or ""), severity) - end -end - -local function AB_Trace(message) - return -end - function Engine:GetConfigStore() if MTH and MTH.GetModuleSavedVariables then local store = MTH:GetModuleSavedVariables("autobuy") @@ -501,9 +605,6 @@ function Engine:EnsureDefaults() if store.enabled == nil then store.enabled = true end - if store.debug == nil then - store.debug = false - end if type(store.food) ~= "table" then store.food = {} end @@ -607,30 +708,8 @@ function Engine:IsEnabled() return store.enabled and true or false end -function Engine:IsDebugEnabled() - local store = self:EnsureDefaults() - return store.debug and true or false -end - -function Engine:IsTraceEnabled() - if self:IsDebugEnabled() then - return true - end - if MTH and MTH.debug then - return true - end - return false -end - -function Engine:Debug(message) - if self:IsTraceEnabled() then - AB_Log(message, "debug") - end -end - function Engine:Init() self:EnsureDefaults() - self:Debug("engine initialized") end function Engine:ScanMerchant() @@ -1152,92 +1231,34 @@ end function Engine:OnMerchantEvent(eventName) if eventName == "MERCHANT_SHOW" then self._merchantSessionExecuted = false - AB_Trace("merchant session reset on MERCHANT_SHOW") elseif eventName == "MERCHANT_UPDATE" and self._merchantSessionExecuted then - AB_Trace("skip MERCHANT_UPDATE: session already executed") return end - self:Debug("OnMerchantEvent enter event=" .. tostring(eventName)) - AB_Trace("OnMerchantEvent " .. tostring(eventName)) if not self:IsEnabled() then - self:Debug("OnMerchantEvent abort: engine store disabled") - local store = self:EnsureDefaults() - AB_Trace("abort: store.enabled=" .. tostring(store and store.enabled) - .. " projectiles.enabled=" .. tostring(store and store.projectiles and store.projectiles.enabled)) return end local snapshot = self:ScanMerchant() - self:Debug("snapshot count=" .. tostring(snapshot and snapshot.count or 0)) - AB_Trace("merchant item count=" .. tostring(snapshot and snapshot.count or 0)) local foodPlan = self:BuildFoodPlan(snapshot) local ammoPlan = self:BuildAmmoPlan(snapshot) - self:Debug(tostring(eventName) .. " merchant items=" .. tostring(snapshot.count) - .. " foodActions=" .. tostring(table.getn(foodPlan.actions or {})) - .. " ammoActions=" .. tostring(table.getn(ammoPlan.actions or {}))) - self:Debug("ammoPlan reason=" .. tostring(ammoPlan.reason or "")) - AB_Trace("ammoPlan reason=" .. tostring(ammoPlan.reason or "") - .. " actions=" .. tostring(table.getn(ammoPlan.actions or {}))) - AB_Trace("foodPlan reason=" .. tostring(foodPlan.reason or "") - .. " actions=" .. tostring(table.getn(foodPlan.actions or {}))) - for i = 1, table.getn(foodPlan.debugLines or {}) do - self:Debug("foodPlan " .. tostring(foodPlan.debugLines[i])) - end - for i = 1, table.getn(ammoPlan.debugLines or {}) do - self:Debug("ammoPlan " .. tostring(ammoPlan.debugLines[i])) - end - local totalRequestedStacks = 0 if table.getn(foodPlan.actions or {}) > 0 then - for i = 1, table.getn(foodPlan.actions or {}) do - local action = foodPlan.actions[i] - self:Debug("food action#" .. tostring(i) - .. " idx=" .. tostring(action.index) - .. " item=" .. tostring(action.itemId) - .. " diet=" .. tostring(action.diet) - .. " qtyStacks=" .. tostring(action.quantityStacks) - .. " targetStacks=" .. tostring(action.targetStacks) - .. " ownedStacks=" .. tostring(action.ownedStacks) - .. " deficit=" .. tostring(action.deficit) - .. " pets=" .. tostring(action.petCount) - .. " families=" .. tostring(action.familyCount)) - end local _, requestedStacks = self:ExecutePlan(foodPlan) totalRequestedStacks = totalRequestedStacks + requestedStacks - AB_Trace("executed food requestedStacks=" .. tostring(requestedStacks)) if requestedStacks > 0 then AB_AnnouncePurchases(foodPlan.actions) end - else - self:Debug("no food actions to execute") - AB_Trace("no food actions to execute") end if table.getn(ammoPlan.actions or {}) > 0 then - for i = 1, table.getn(ammoPlan.actions or {}) do - local action = ammoPlan.actions[i] - self:Debug("action#" .. tostring(i) - .. " idx=" .. tostring(action.index) - .. " item=" .. tostring(action.itemId) - .. " qtyStacks=" .. tostring(action.quantityStacks) - .. " qtyItems=" .. tostring(action.quantityItems) - .. " desiredStacks=" .. tostring(action.desiredStacks) - .. " ownedStacks=" .. tostring(action.ownedStacks) - .. " deficit=" .. tostring(action.deficit) - .. " stackCount=" .. tostring(action.stackCount)) - end - local executedActions, requestedStacks = self:ExecutePlan(ammoPlan) + local _, requestedStacks = self:ExecutePlan(ammoPlan) totalRequestedStacks = totalRequestedStacks + requestedStacks - AB_Trace("executed actions=" .. tostring(executedActions) .. " requestedStacks=" .. tostring(requestedStacks)) if requestedStacks > 0 then + AB_MoveAmmoStacksToSpecialBags(300) AB_AnnouncePurchases(ammoPlan.actions) end - self:Debug("executed ammo actions=" .. tostring(table.getn(ammoPlan.actions or {}))) - else - self:Debug("no ammo actions to execute") - AB_Trace("no actions to execute") end if totalRequestedStacks > 0 then @@ -1247,7 +1268,6 @@ end function Engine:OnMerchantClosed() self._merchantSessionExecuted = false - AB_Trace("merchant session reset on MERCHANT_CLOSED") end function MTH_AutoBuy_GetMerchantSnapshot() diff --git a/modules/autobuy/module.lua b/modules/autobuy/module.lua index 0c33d3b..a7f4b44 100644 --- a/modules/autobuy/module.lua +++ b/modules/autobuy/module.lua @@ -6,7 +6,7 @@ local MTH_AutoBuy = { name = "autobuy", enabled = false, - version = "1.0.3", + version = "1.0.4", events = { "VARIABLES_LOADED", "MERCHANT_SHOW", diff --git a/modules/chronometer/data-hunter.lua b/modules/chronometer/data-hunter.lua index 0a55e7c..3515a0a 100644 --- a/modules/chronometer/data-hunter.lua +++ b/modules/chronometer/data-hunter.lua @@ -47,6 +47,13 @@ function MTH_ChronometerHunterInstallData(engine) engine:AddTimer(engine.EVENT, BS["Piercing Shot"], 8, 1, 0, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\Ability_Hunter_DisarmingShot" }) engine:AddTimer(engine.EVENT, BS["Quick Shots"], 12, 0, 1, 1, { a = 1, cr = "MAROON", tx = "Interface\\Icons\\Ability_Hunter_Quickshot" }) engine:AddTimer(engine.EVENT, BS["Scorpid Poison"], 10, 1, 0, 0, { gr = 3, cr = "PURPLE", a = 1, dn = 1 }) + engine:AddTimer(engine.EVENT, BS["Devilsaur Fury"], 20, 0, 1, 1, { a = 1, cr = "PURPLE", xn = BS["Devilsaur Eye"], tx = "Interface\\Icons\\Ability_Hunter_Pet_Raptor" }) + engine:AddTimer(engine.EVENT, BS["Restless Strength"], 20, 0, 1, 1, { a = 1, cr = "PURPLE", xn = BS["Zandalarian Hero Medallion"], tx = "Interface\\Icons\\INV_Jewelry_Necklace_13" }) + engine:AddTimer(engine.EVENT, BS["Earthstrike"], 20, 0, 1, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\Spell_Nature_AbolishMagic" }) + engine:AddTimer(engine.EVENT, BS["Badge of the Swarmguard"], 30, 0, 1, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\INV_Misc_AhnQirajTrinket_04" }) + engine:AddTimer(engine.EVENT, BS["Jom Gabbar"], 20, 0, 1, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\Ability_Poisons" }) + engine:AddTimer(engine.EVENT, BS["Kiss of the Spider"], 15, 0, 1, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\INV_Trinket_Naxxramas04" }) + engine:AddTimer(engine.EVENT, BS["Slayer's Crest"], 20, 0, 1, 1, { a = 1, cr = "PURPLE", tx = "Interface\\Icons\\INV_Trinket_Naxxramas03" }) end local _, race = UnitRace("player") diff --git a/modules/chronometer/module.lua b/modules/chronometer/module.lua index 7bf5d0f..c0d5614 100644 --- a/modules/chronometer/module.lua +++ b/modules/chronometer/module.lua @@ -1,7 +1,7 @@ local MTH_ChronometerModule = { name = "chronometer", enabled = true, - version = "1.0.3", + version = "1.0.4", events = {}, initialized = false, } diff --git a/modules/feedomatic/FeedOMatic.lua b/modules/feedomatic/FeedOMatic.lua index efd3e7f..a869805 100644 --- a/modules/feedomatic/FeedOMatic.lua +++ b/modules/feedomatic/FeedOMatic.lua @@ -4,8 +4,6 @@ FOM_VERSION = "11200.2"; ------------------------------------------------------ --- TODO: if you don't auto-feed, have an option to make the need to feed more noticeable (e.g., pulsing halo around the pet-happiness icon). - -- constants FOM_WARNING_INTERVAL = 10; -- don't warn more than once per this many seconds MAX_QUALITY = 35 * 60 + 1; -- We store a notion of a food's "quality": its best happiness-per-tick multiplied by the pet's level as of when that tick occurred. We use "best" because a pet that's closer to "sated" (maximum happiness) will receive less happiness per tick than he would from the same food if he were hungrier. (So, a food that gives 35 happiness per tick to a level 60 pet is "better" than a food that's worth 35 happiness per tick to a level 30 pet.) Foods whose quality hasn't been observed yet are given this value when sorting, so we can prioritize the discovery of new foods' quality ratings. @@ -366,9 +364,7 @@ function MTH_GetMerchantFoodsByDiet() end local function FOM_DebugLog(message) - if (type(MTH_Log) == "function") then - MTH_Log("[FeedOMatic] " .. tostring(message or ""), "debug"); - end + return; end local function FOM_DebugLogMerchantFoods(sourceEvent) @@ -1551,8 +1547,10 @@ function FOM_CheckHappiness() else msg = FOM_PET_VERY_HUNGRY; end - GFWUtils.Print(string.format(msg, pet)); - GFWUtils.Note(string.format(msg, pet)); + if (not (MTH and MTH.IsMessageEnabled) or MTH:IsMessageEnabled("petHungry", false)) then + GFWUtils.Print(string.format(msg, pet)); + GFWUtils.Note(string.format(msg, pet)); + end end FOM_PlayHungrySound(); FOM_LastWarning = GetTime(); diff --git a/modules/feedomatic/module.lua b/modules/feedomatic/module.lua index af61e9c..ce588f8 100644 --- a/modules/feedomatic/module.lua +++ b/modules/feedomatic/module.lua @@ -6,7 +6,7 @@ local MTH_FeedOMatic = { name = "feedomatic", enabled = false, - version = "1.0.3", + version = "1.0.4", events = { "VARIABLES_LOADED", "MERCHANT_SHOW", diff --git a/modules/smartammo/engine.lua b/modules/smartammo/engine.lua index e86fee9..76696cc 100644 --- a/modules/smartammo/engine.lua +++ b/modules/smartammo/engine.lua @@ -15,7 +15,10 @@ local function MTHSmartAmmo_IsSmartEnabled() return moduleStore.smartEnabled and true or false end local saved = MTHSmartAmmo_GetSaved() - return saved["enabled"] + if saved["enabled"] == nil then + return true + end + return saved["enabled"] and true or false end local function MTHSmartAmmo_IsReloadEnabled() @@ -30,6 +33,18 @@ local function MTHSmartAmmo_IsReloadEnabled() return saved["reload"] and true or false end +local function MTHSmartAmmo_IsWeaponSwapEnabled() + local moduleStore = MTHSmartAmmo_GetModuleStore() + if type(moduleStore) == "table" and moduleStore.weaponSwapEnabled ~= nil then + return moduleStore.weaponSwapEnabled and true or false + end + local saved = MTHSmartAmmo_GetSaved() + if saved["weaponSwap"] == nil then + return true + end + return saved["weaponSwap"] and true or false +end + local MTHSmartAmmo_InitializeHooks MTHSmartAmmo_EnsureHooks = nil @@ -83,8 +98,24 @@ function MTHSmartAmmo_GetReloadEnabled() return MTHSmartAmmo_IsReloadEnabled() and true or false end -local function MTHSmartAmmo_Log(msg) - return +function MTHSmartAmmo_SetWeaponSwapEnabled(enabled, silent) + local saved = MTHSmartAmmo_GetSaved() + if enabled then + saved["weaponSwap"] = 1 + else + saved["weaponSwap"] = false + end + local moduleStore = MTHSmartAmmo_GetModuleStore() + if type(moduleStore) == "table" then + moduleStore.weaponSwapEnabled = enabled and true or false + end + if not silent and DEFAULT_CHAT_FRAME then + MTH_SA_Print("Smart Ammo weapon-swap auto-equip " .. (enabled and "Enabled." or "Disabled.")) + end +end + +function MTHSmartAmmo_GetWeaponSwapEnabled() + return MTHSmartAmmo_IsWeaponSwapEnabled() and true or false end local MTHSmartAmmo_CastSpell_Hook @@ -142,6 +173,10 @@ MTH_SA_Quantity = 0 MTH_SA_LastFallbackAttempt = 0 MTH_SA_LastKnownEquippedName = nil MTH_SA_LastFallbackNotice = { key = nil, time = 0 } +MTH_SA_LastKnownWeaponAmmoType = nil +MTH_SA_LastWeaponCheck = 0 +MTH_SA_StartupProtectUntil = (GetTime() or 0) + 2.0 +MTH_SA_StartupPrimed = nil local function MTHSmartAmmo_RefreshAmmoButtonDisplay() local createButtons = getglobal("zButtonAmmo_CreateButtons") @@ -211,6 +246,10 @@ local function MTHSmartAmmo_HandleFallbackResult(previousAmmo) end local function MTHSmartAmmo_TryFallbackEquip(reason) + local now = GetTime() or 0 + if now < (MTH_SA_StartupProtectUntil or 0) then + return + end if not MTH_SA_IsModuleEnabled() then return end @@ -224,20 +263,107 @@ local function MTHSmartAmmo_TryFallbackEquip(reason) return end - local now = GetTime() or 0 + now = GetTime() or 0 if MTH_SA_LastFallbackAttempt and (now - MTH_SA_LastFallbackAttempt) < 0.5 then return end MTH_SA_LastFallbackAttempt = now local previousAmmo = MTH_SA_GetEquippedAmmoName() or MTH_SA_LastKnownEquippedName - MTHSmartAmmo_Log("Fallback equip attempt reason=" .. tostring(reason or "unknown")) if MTH_SA_Check() or MTH_SA_FindAmmo() then MTH_SA_EquipAmmo() MTHSmartAmmo_HandleFallbackResult(previousAmmo) end end +local function MTHSmartAmmo_FindBestAmmoForType(ammoType) + if not ammoType then + return nil + end + local rankMap = (ammoType == "Bullets" and MTH_AMMO_BULLET_RANK) or MTH_AMMO_ARROW_RANK or {} + local best = nil + for bag = 4, 0, -1 do + for slot = GetContainerNumSlots(bag), 1, -1 do + local itemName = MTH_SA_GetContainerItemName(bag, slot) + if itemName then + local value = rankMap[itemName] + if value and (not best or value > best.value) then + best = { + name = itemName, + value = value, + bag = bag, + slot = slot, + } + end + end + end + end + return best +end + +local function MTHSmartAmmo_EquipAmmoFromSlot(bag, slot) + if not bag or not slot then + return false + end + PickupContainerItem(bag, slot) + if CursorHasItem and CursorHasItem() then + EquipCursorItem(0) + end + if CursorHasItem and CursorHasItem() then + if ClearCursor then + ClearCursor() + end + return false + end + return true +end + +local function MTHSmartAmmo_HandleWeaponSwapAutoEquip(reason) + local now = GetTime() or 0 + if now < (MTH_SA_StartupProtectUntil or 0) then + return + end + if not MTH_SA_IsModuleEnabled() then + return + end + if not MTHSmartAmmo_IsWeaponSwapEnabled() then + return + end + + local weaponAmmoType = MTH_SA_GetEquippedWeaponAmmoType() + if not weaponAmmoType then + MTH_SA_LastKnownWeaponAmmoType = nil + MTH_SA_StartupPrimed = true + return + end + + if not MTH_SA_StartupPrimed then + MTH_SA_LastKnownWeaponAmmoType = weaponAmmoType + MTH_SA_StartupPrimed = true + return + end + + if MTH_SA_LastKnownWeaponAmmoType == weaponAmmoType then + return + end + MTH_SA_LastKnownWeaponAmmoType = weaponAmmoType + + local bestAmmo = MTHSmartAmmo_FindBestAmmoForType(weaponAmmoType) + if not bestAmmo then + return + end + + local equippedNow = MTH_SA_GetEquippedAmmoName() + if equippedNow and equippedNow == bestAmmo.name then + return + end + + if MTHSmartAmmo_EquipAmmoFromSlot(bestAmmo.bag, bestAmmo.slot) then + MTH_SA_LastKnownEquippedName = bestAmmo.name + MTHSmartAmmo_RefreshAmmoButtonDisplay() + end +end + local frame = CreateFrame("Frame") frame:RegisterEvent("START_AUTOREPEAT_SPELL") frame:RegisterEvent("STOP_AUTOREPEAT_SPELL") @@ -245,6 +371,7 @@ frame:RegisterEvent("SPELLCAST_INTERRUPTED") frame:RegisterEvent("SPELLCAST_FAILED") frame:RegisterEvent("SPELLCAST_STOP") frame:RegisterEvent("SPELLCAST_DELAYED") +frame:RegisterEvent("PLAYER_ENTERING_WORLD") frame:SetScript("OnEvent", function() @@ -252,28 +379,28 @@ frame:SetScript("OnEvent", function() if MTHSmartAmmo_EnsureHooks then MTHSmartAmmo_EnsureHooks("EVENT:START_AUTOREPEAT_SPELL") end - local castHook, actionHook, byNameHook = MTHSmartAmmo_AreHooksInstalled() - MTHSmartAmmo_Log("EVENT START_AUTOREPEAT_SPELL smart=" .. tostring(MTHSmartAmmo_IsSmartEnabled()) .. " module=" .. tostring(MTH_SA_IsModuleEnabled()) .. " hooks=" .. tostring(castHook) .. "/" .. tostring(actionHook) .. "/" .. tostring(byNameHook)) MTH_SA_AutoShot = 1 MTHSmartAmmo_TryFallbackEquip("START_AUTOREPEAT_SPELL") elseif event == "STOP_AUTOREPEAT_SPELL" then - MTHSmartAmmo_Log("EVENT STOP_AUTOREPEAT_SPELL") MTH_SA_AutoShot = nil + elseif event == "PLAYER_ENTERING_WORLD" then + local now = GetTime() or 0 + MTH_SA_StartupProtectUntil = now + 2.0 + MTH_SA_StartupPrimed = nil + MTH_SA_LastKnownWeaponAmmoType = MTH_SA_GetEquippedWeaponAmmoType() + MTH_SA_LastKnownEquippedName = MTH_SA_GetEquippedAmmoName() + MTH_SA_LastWeaponCheck = now + elseif event == "SPELLCAST_START" then --DEFAULT_CHAT_FRAME:AddMessage("SPELLCAST_START ", 0, 1, 1) elseif event == "SPELLCAST_STOP" or event == "SPELLCAST_FAILED" or event == "SPELLCAST_INTERRUPTED" or event == "SPELLCAST_DELAYED" then - local castHook, actionHook, byNameHook = MTHSmartAmmo_AreHooksInstalled() - MTHSmartAmmo_Log("EVENT " .. tostring(event) .. " waitJunk=" .. tostring(MTH_SA_IsWaitingSwapJunk) .. " waitGood=" .. tostring(MTH_SA_IsWaitingSwapGood) .. " lastSpell=" .. tostring(MTH_SA_LastSpell) .. " smart=" .. tostring(MTHSmartAmmo_IsSmartEnabled()) .. " module=" .. tostring(MTH_SA_IsModuleEnabled()) .. " hooks=" .. tostring(castHook) .. "/" .. tostring(actionHook) .. "/" .. tostring(byNameHook)) if MTH_SA_IsWaitingSwapJunk then - MTHSmartAmmo_Log("EVENT swap request -> JUNK equipped=" .. tostring(MTH_SA_GetEquippedAmmoName()) .. " current=" .. tostring(MTH_SA.curname)) MTH_SA_EquipAmmo(1) elseif MTH_SA_IsWaitingSwapGood then - MTHSmartAmmo_Log("EVENT swap request -> GOOD equipped=" .. tostring(MTH_SA_GetEquippedAmmoName()) .. " current=" .. tostring(MTH_SA.curname)) MTH_SA_EquipAmmo() end - MTHSmartAmmo_Log("EVENT clear pending flags") MTH_SA_IsWaitingSwapJunk = nil MTH_SA_IsWaitingSwapGood = nil MTH_SA_LastSpell = nil @@ -298,19 +425,21 @@ frame:SetScript("OnUpdate", function(self, elapsed) end if MTH_SA_AmmoLastSwitch and (GetTime()-MTH_SA_AmmoLastSwitch > 0.5) and (MTH_SA_IsWaitingSwapJunk or MTH_SA_IsWaitingSwapGood) then - MTHSmartAmmo_Log("OnUpdate pending swap elapsed>0.5 equipped=" .. tostring(MTH_SA_GetEquippedAmmoName()) .. " waitJunk=" .. tostring(MTH_SA_IsWaitingSwapJunk) .. " waitGood=" .. tostring(MTH_SA_IsWaitingSwapGood)) if MTH_SA_IsWaitingSwapJunk then - MTHSmartAmmo_Log("OnUpdate swap request -> JUNK") MTH_SA_EquipAmmo(1) elseif MTH_SA_IsWaitingSwapGood then - MTHSmartAmmo_Log("OnUpdate swap request -> GOOD") MTH_SA_EquipAmmo() end - MTHSmartAmmo_Log("OnUpdate clear pending flags") MTH_SA_IsWaitingSwapJunk = nil MTH_SA_IsWaitingSwapGood = nil MTH_SA_LastSpell = nil end + + local now = GetTime() or 0 + if (now - (MTH_SA_LastWeaponCheck or 0)) >= 0.25 then + MTH_SA_LastWeaponCheck = now + MTHSmartAmmo_HandleWeaponSwapAutoEquip("OnUpdate-weapon-check") + end end) function MTH_SA_CountEquippedAmmo() @@ -358,12 +487,9 @@ function MTH_SA_GetContainerItemName(bag, slot) end function MTH_SA_EquipAmmo(junk) - MTHSmartAmmo_Log("EquipAmmo enter junk=" .. tostring(junk) .. " equipped=" .. tostring(MTH_SA_GetEquippedAmmoName()) .. " cur=" .. tostring(MTH_SA.curname) .. " junk=" .. tostring(MTH_SA.junkname)) - if not MTH_SA_AmmoLastSwitch then MTH_SA_AmmoLastSwitch = GetTime() end if not (MTH_SA_Check() or MTH_SA_FindAmmo()) then - MTHSmartAmmo_Log("EquipAmmo abort: cache invalid and FindAmmo failed") return end local bag, slot @@ -377,15 +503,12 @@ function MTH_SA_EquipAmmo(junk) if MTH_SA_GetEquippedAmmoName() ~= MTH_SA.curname and GetTime()-MTH_SA_AmmoLastSwitch > 0.5 then if not MTH_SA_FindAmmo() then - MTHSmartAmmo_Log("EquipAmmo abort: AMMO NOT FOUND during junk swap") return end end bag, slot = MTH_SA.junkbag, MTH_SA.junkslot - MTHSmartAmmo_Log("Swap GOOD->JUNK bag=" .. tostring(bag) .. " slot=" .. tostring(slot) .. " cur=" .. tostring(MTH_SA.curname) .. " curSlot=" .. tostring(MTH_SA.curslot) .. " junk=" .. tostring(MTH_SA.junkname) .. " junkSlot=" .. tostring(MTH_SA.junkslot)) else bag, slot = MTH_SA.curbag, MTH_SA.curslot - MTHSmartAmmo_Log("Swap JUNK->GOOD bag=" .. tostring(bag) .. " slot=" .. tostring(slot) .. " cur=" .. tostring(MTH_SA.curname) .. " curSlot=" .. tostring(MTH_SA.curslot) .. " junk=" .. tostring(MTH_SA.junkname) .. " junkSlot=" .. tostring(MTH_SA.junkslot)) end @@ -393,7 +516,6 @@ function MTH_SA_EquipAmmo(junk) --UseContainerItem(bag, slot) PickupContainerItem(bag,slot) EquipCursorItem(0) - MTHSmartAmmo_Log("EquipCursorItem applied bag=" .. tostring(bag) .. " slot=" .. tostring(slot)) if junk then MTH_SA_IsWaitingSwapJunk = nil MTH_SA_IsWaitingSwapGood = 1 @@ -401,7 +523,6 @@ function MTH_SA_EquipAmmo(junk) MTH_SA_IsWaitingSwapJunk = nil MTH_SA_IsWaitingSwapGood = nil end - MTHSmartAmmo_Log("Pending flags set waitJunk=" .. tostring(MTH_SA_IsWaitingSwapJunk) .. " waitGood=" .. tostring(MTH_SA_IsWaitingSwapGood)) --PickupInventoryItem(0) --AutoEquipCursorItem() --EquipCursorItem(0) @@ -410,20 +531,16 @@ function MTH_SA_EquipAmmo(junk) end function MTH_SA_FindAmmo() - MTHSmartAmmo_Log("FindAmmo start") MTH_SA = {} MTH_SA_List = {} local ammotype = MTH_SA_GetEquippedWeaponAmmoType() if not ammotype then - MTHSmartAmmo_Log("FindAmmo abort: no ranged weapon ammo type") return end local curammo = MTH_SA_GetEquippedAmmoName() if not curammo and not MTHSmartAmmo_IsReloadEnabled() then - MTHSmartAmmo_Log("FindAmmo abort: no equipped ammo and reload disabled") return end - MTHSmartAmmo_Log("FindAmmo type=" .. tostring(ammotype) .. " equipped=" .. tostring(curammo)) local ammolist = (ammotype == "Bullets" and MTH_AMMO_BULLET_RANK) or MTH_AMMO_ARROW_RANK or {} MTH_SA_List = ammolist local item, value @@ -473,11 +590,9 @@ function MTH_SA_FindAmmo() end end if not goodvalue or junkvalue > goodvalue then - MTHSmartAmmo_Log("FindAmmo failed: goodvalue=" .. tostring(goodvalue) .. " junkvalue=" .. tostring(junkvalue)) MTH_SA.error = 1 return end - MTHSmartAmmo_Log("FindAmmo selected cur=" .. tostring(MTH_SA.curname) .. " junk=" .. tostring(MTH_SA.junkname) .. " curValue=" .. tostring(MTH_SA.curvalue) .. " junkValue=" .. tostring(junkvalue)) return 1 end @@ -502,11 +617,8 @@ MTHSmartAmmo_CastSpell_Hook = function(spell, tab) if MTHSmartAmmo_IsSmartEnabled() then local name = GetSpellName(spell, tab) MTH_SA_LastSpell = name - MTHSmartAmmo_Log("HOOK CastSpell name=" .. tostring(name)) if name and MTH_AMMO_JUNKSHOT_SET and MTH_AMMO_JUNKSHOT_SET[name] then - MTHSmartAmmo_Log("HOOK CastSpell junk-shot detected name=" .. tostring(name)) if MTH_SA_Check() or MTH_SA_FindAmmo() then - MTHSmartAmmo_Log("HOOK CastSpell pre-swap -> junk") MTH_SA_EquipAmmo(1) end end @@ -539,11 +651,8 @@ MTHSmartAmmo_UseAction_Hook = function(slot, checkCursor, onSelf) MTH_SA_Tooltip:SetAction(slot) local name = MTH_SA_TooltipTextLeft1:GetText() MTH_SA_LastSpell = name - MTHSmartAmmo_Log("HOOK UseAction slot=" .. tostring(slot) .. " name=" .. tostring(name)) if name and MTH_AMMO_JUNKSHOT_SET and MTH_AMMO_JUNKSHOT_SET[name] then - MTHSmartAmmo_Log("HOOK UseAction junk-shot detected name=" .. tostring(name)) if MTH_SA_Check() or MTH_SA_FindAmmo() then - MTHSmartAmmo_Log("HOOK UseAction pre-swap -> junk") MTH_SA_EquipAmmo(1) end end @@ -573,11 +682,8 @@ MTHSmartAmmo_CastSpellByName_Hook = function(spell, onSelf) local _, _, name = string.find(spell or "", "([%w%'%s]+)") MTH_SA_LastSpell = name - MTHSmartAmmo_Log("HOOK CastSpellByName name=" .. tostring(name)) if name and MTHSmartAmmo_IsSmartEnabled() and MTH_AMMO_JUNKSHOT_SET and MTH_AMMO_JUNKSHOT_SET[name] then - MTHSmartAmmo_Log("HOOK CastSpellByName junk-shot detected name=" .. tostring(name)) if MTH_SA_Check() or MTH_SA_FindAmmo() then - MTHSmartAmmo_Log("HOOK CastSpellByName pre-swap -> junk") MTH_SA_EquipAmmo(1) end end @@ -598,26 +704,22 @@ end -- Defer hooking until after tables are initialized MTHSmartAmmo_InitializeHooks = function() if not MTH_SA_IsModuleEnabled() then - MTHSmartAmmo_Log("InitializeHooks skip: module disabled") return end if CastSpell ~= MTHSmartAmmo_CastSpell_Hook then MTH_SA_CastSpell = CastSpell CastSpell = MTHSmartAmmo_CastSpell_Hook - MTHSmartAmmo_Log("InitializeHooks: CastSpell hook installed") end if UseAction ~= MTHSmartAmmo_UseAction_Hook then MTH_SA_UseAction = UseAction UseAction = MTHSmartAmmo_UseAction_Hook - MTHSmartAmmo_Log("InitializeHooks: UseAction hook installed") end if CastSpellByName ~= MTHSmartAmmo_CastSpellByName_Hook then MTH_SA_CastSpellByName = CastSpellByName CastSpellByName = MTHSmartAmmo_CastSpellByName_Hook - MTHSmartAmmo_Log("InitializeHooks: CastSpellByName hook installed") end end diff --git a/modules/smartammo/module.lua b/modules/smartammo/module.lua index 4a11333..a8e1f26 100644 --- a/modules/smartammo/module.lua +++ b/modules/smartammo/module.lua @@ -7,7 +7,7 @@ MTH_SA_MANAGED_HOOKS = true local MTH_SmartAmmo = { name = "smartammo", enabled = true, - version = "1.0.3", + version = "1.0.4", events = { "VARIABLES_LOADED", "PLAYER_ENTERING_WORLD", @@ -80,6 +80,9 @@ local function MTH_SA_ApplySavedState() if moduleStore.reloadEnabled ~= nil then saved["reload"] = moduleStore.reloadEnabled and 1 or false end + if moduleStore.weaponSwapEnabled ~= nil then + saved["weaponSwap"] = moduleStore.weaponSwapEnabled and 1 or false + end end if saved["enabled"] == nil then saved["enabled"] = 1 @@ -90,11 +93,22 @@ local function MTH_SA_ApplySavedState() if saved["reload"] == nil and type(moduleStore) == "table" then moduleStore.reloadEnabled = saved["reload"] ~= false end + if saved["weaponSwap"] == nil then + saved["weaponSwap"] = 1 + if type(moduleStore) == "table" then + moduleStore.weaponSwapEnabled = true + end + elseif type(moduleStore) == "table" and moduleStore.weaponSwapEnabled == nil then + moduleStore.weaponSwapEnabled = saved["weaponSwap"] ~= false + end MTHSmartAmmo_SetSmartEnabled(saved["enabled"] and 1 or nil, 1) if type(MTHSmartAmmo_SetReloadEnabled) == "function" then MTHSmartAmmo_SetReloadEnabled(saved["reload"] ~= false and 1 or nil, 1) end + if type(MTHSmartAmmo_SetWeaponSwapEnabled) == "function" then + MTHSmartAmmo_SetWeaponSwapEnabled(saved["weaponSwap"] ~= false and 1 or nil, 1) + end if type(MTHSmartAmmo_EnsureHooks) == "function" then MTHSmartAmmo_EnsureHooks("module-apply") end diff --git a/modules/tooltips/module.lua b/modules/tooltips/module.lua index e1ab945..704e671 100644 --- a/modules/tooltips/module.lua +++ b/modules/tooltips/module.lua @@ -6,7 +6,7 @@ local MTH_Tooltips = { name = "tooltips", enabled = true, - version = "1.0.3", + version = "1.0.4", events = { "UPDATE_MOUSEOVER_UNIT", "UNIT_NAME_UPDATE", diff --git a/modules/zhunter/DeferredInit.lua b/modules/zhunter/DeferredInit.lua index 22d9f41..918c70c 100644 --- a/modules/zhunter/DeferredInit.lua +++ b/modules/zhunter/DeferredInit.lua @@ -64,6 +64,8 @@ local function ZHunterMod_EnsureButtonFrame(buttonName) created:SetPoint("CENTER", UIParent, "CENTER", 0, 0) elseif buttonName == "zButtonTrap" then created:SetPoint("CENTER", UIParent, "CENTER", 60, 0) + elseif buttonName == "zButtonRanged" then + created:SetPoint("CENTER", UIParent, "CENTER", 120, 0) elseif buttonName == "zButtonPet" then created:SetPoint("CENTER", UIParent, "CENTER", 0, 60) elseif buttonName == "zButtonMounts" then @@ -86,6 +88,7 @@ function ZHunterMod_DeferredInit() local aspect = ZHunterMod_EnsureButtonFrame("zButtonAspect") local track = ZHunterMod_EnsureButtonFrame("zButtonTrack") local trap = ZHunterMod_EnsureButtonFrame("zButtonTrap") + local ranged = ZHunterMod_EnsureButtonFrame("zButtonRanged") local ammo = ZHunterMod_EnsureButtonFrame("zButtonAmmo") local mounts = ZHunterMod_EnsureButtonFrame("zButtonMounts") local companions = ZHunterMod_EnsureButtonFrame("zButtonCompanions") @@ -95,6 +98,7 @@ function ZHunterMod_DeferredInit() ZHunterMod_LogDeferred("DeferredInit: Aspect=" .. tostring(aspect ~= nil)) ZHunterMod_LogDeferred("DeferredInit: Track=" .. tostring(track ~= nil)) ZHunterMod_LogDeferred("DeferredInit: Trap=" .. tostring(trap ~= nil)) + ZHunterMod_LogDeferred("DeferredInit: Ranged=" .. tostring(ranged ~= nil)) ZHunterMod_LogDeferred("DeferredInit: Ammo=" .. tostring(ammo ~= nil)) ZHunterMod_LogDeferred("DeferredInit: Mounts=" .. tostring(mounts ~= nil)) ZHunterMod_LogDeferred("DeferredInit: Companions=" .. tostring(companions ~= nil)) @@ -106,6 +110,7 @@ function ZHunterMod_DeferredInit() if not aspect then table.insert(missing, "Aspect") end if not track then table.insert(missing, "Track") end if not trap then table.insert(missing, "Trap") end + if not ranged then table.insert(missing, "Ranged") end if not ammo then table.insert(missing, "Ammo") end if not mounts then table.insert(missing, "Mounts") end if not companions then table.insert(missing, "Companions") end @@ -115,7 +120,7 @@ function ZHunterMod_DeferredInit() MTH_ZH_Print("[ZHUNTER] Warning: missing frames: " .. table.concat(missing, ", ") .. ". Continuing with available buttons.", "error") end - if not (pet or aspect or track or trap or ammo or mounts or companions or toys) then + if not (pet or aspect or track or trap or ranged or ammo or mounts or companions or toys) then MTH_ZH_Print("zhunter buttons not created - check for addon conflicts!", "error") return end @@ -159,6 +164,12 @@ function ZHunterMod_DeferredInit() initialized = initialized + 1 end end + + if ranged and zButtonRanged_OnEvent then + if ZHunterMod_SafeRunButtonInit(ranged, zButtonRanged_OnEvent, "zButtonRanged") then + initialized = initialized + 1 + end + end if ammo and zButtonAmmo_OnEvent then if ZHunterMod_SafeRunButtonInit(ammo, zButtonAmmo_OnEvent, "zButtonAmmo") then diff --git a/modules/zhunter/ZSpellButtonTemplate.lua b/modules/zhunter/ZSpellButtonTemplate.lua index 86eff17..eee910f 100644 --- a/modules/zhunter/ZSpellButtonTemplate.lua +++ b/modules/zhunter/ZSpellButtonTemplate.lua @@ -189,11 +189,17 @@ function ZSpellButton_SetSize(parent, size, setChildren) local button for i=1, parent.count do button = getglobal(parent.name..i) - button:SetHeight(size) - button:SetWidth(size) - button.background:SetWidth(size * bgscale) - button.background:SetHeight(size * bgscale) - button.cooldown:SetModelScale(size * cdscale) + if button then + button:SetHeight(size) + button:SetWidth(size) + if button.background then + button.background:SetWidth(size * bgscale) + button.background:SetHeight(size * bgscale) + end + if button.cooldown then + button.cooldown:SetModelScale(size * cdscale) + end + end end else local cscale = 100/36 @@ -208,16 +214,22 @@ function ZSpellButton_SetSize(parent, size, setChildren) end parent:SetHeight(size) parent:SetWidth(size) - parent.background:SetWidth(size * bgscale) - parent.background:SetHeight(size * bgscale) - parent.cooldown:SetModelScale(size * cdscale) - parent.circle:SetWidth(size * cscale) - parent.circle:SetHeight(size * cscale) - parent.circle:SetPoint("CENTER", size * cxscale, size * cyscale) - if circleVisible then - parent.circle:Show() - else - parent.circle:Hide() + if parent.background then + parent.background:SetWidth(size * bgscale) + parent.background:SetHeight(size * bgscale) + end + if parent.cooldown then + parent.cooldown:SetModelScale(size * cdscale) + end + if parent.circle then + parent.circle:SetWidth(size * cscale) + parent.circle:SetHeight(size * cscale) + parent.circle:SetPoint("CENTER", size * cxscale, size * cyscale) + if circleVisible then + parent.circle:Show() + else + parent.circle:Hide() + end end end end @@ -253,6 +265,13 @@ end function ZSpellButton_CreateChildren(parent, name, count) if not (parent and name and count) then return end + if parent.children and parent.count and parent.name == name then + parent.count = count + if type(ZSpellButton_ApplyChildrenExpanded) == "function" then + ZSpellButton_ApplyChildrenExpanded(parent) + end + return + end parent.children = CreateFrame("Frame", parent:GetName().."Children", UIParent) parent.count = count parent.name = name @@ -309,6 +328,7 @@ function ZSpellButton_GetChildrenExpanded(parent) return expanded end + function ZSpellButton_SetChildrenExpanded(parent, expanded) if not (parent and parent.name) then return @@ -322,11 +342,31 @@ function ZSpellButton_SetChildrenExpanded(parent, expanded) if parent.children then parent.children:Show() end + if parent.count then + for i = 1, parent.count do + local child = getglobal(parent.name .. i) + if child then + if child.id then + child:Show() + else + child:Hide() + end + end + end + end else saved["children"]["expanded"] = 0 if parent.children then parent.children:Hide() end + if parent.count then + for i = 1, parent.count do + local child = getglobal(parent.name .. i) + if child then + child:Hide() + end + end + end end end @@ -334,11 +374,7 @@ function ZSpellButton_ApplyChildrenExpanded(parent) if not (parent and parent.children) then return end - if ZSpellButton_GetChildrenExpanded(parent) then - parent.children:Show() - else - parent.children:Hide() - end + ZSpellButton_SetChildrenExpanded(parent, ZSpellButton_GetChildrenExpanded(parent)) end function ZSpellButton_OnEnter() diff --git a/modules/zhunter/loader.xml b/modules/zhunter/loader.xml index a8fd50b..20b8092 100644 --- a/modules/zhunter/loader.xml +++ b/modules/zhunter/loader.xml @@ -16,6 +16,7 @@ Loads all zhunter addon code and wraps it in the MTH module system + @@ -34,6 +35,8 @@ Loads all zhunter addon code and wraps it in the MTH module system + + diff --git a/modules/zhunter/module.lua b/modules/zhunter/module.lua index 920ff73..bce490d 100644 --- a/modules/zhunter/module.lua +++ b/modules/zhunter/module.lua @@ -8,7 +8,7 @@ MTH_ZH_MANAGED_HOOKS = true local MTH_ZHunter = { name = "zhunter", enabled = true, - version = "1.0.3", + version = "1.0.4", events = { "VARIABLES_LOADED", "PLAYER_ENTERING_WORLD", @@ -18,6 +18,7 @@ local MTH_ZHunter = { aspect = true, tracking = true, traps = true, + ranged = true, ammo = true, pet = true, } @@ -60,6 +61,7 @@ local function MTH_ZH_ApplyDefaultWidgetSpawnLayoutOnce() "zButtonAmmo", "zButtonTrack", "zButtonTrap", + "zButtonRanged", "zButtonPet", "zButtonMounts", "zButtonCompanions", @@ -195,6 +197,7 @@ MTH_ZH_SetButtonsVisible = function(visible) "zButtonAspect", "zButtonTrack", "zButtonTrap", + "zButtonRanged", "zButtonAmmo", "zButtonPet", "zButtonMounts", @@ -207,13 +210,34 @@ MTH_ZH_SetButtonsVisible = function(visible) return end - local showChildren = false - if show then - if type(ZSpellButton_GetChildrenExpanded) == "function" then - showChildren = ZSpellButton_GetChildrenExpanded(parentButton) - else - showChildren = true + if not show then + if parentButton.children then + parentButton.children:Hide() end + + if not parentButton.count then + return + end + + local hideBaseName = parentButton.name or parentName + if not hideBaseName then + return + end + + for index = 1, parentButton.count do + local child = getglobal(hideBaseName .. index) + if child then + child:Hide() + end + end + return + end + + local showChildren = false + if type(ZSpellButton_GetChildrenExpanded) == "function" then + showChildren = ZSpellButton_GetChildrenExpanded(parentButton) + else + showChildren = true end if parentButton.children then @@ -233,17 +257,15 @@ MTH_ZH_SetButtonsVisible = function(visible) return end - for index = 1, parentButton.count do - local child = getglobal(baseName .. index) - if child then - if showChildren then + if showChildren then + for index = 1, parentButton.count do + local child = getglobal(baseName .. index) + if child then if child.id then child:Show() else child:Hide() end - else - child:Hide() end end end diff --git a/modules/zhunter/zButtonAmmo.lua b/modules/zhunter/zButtonAmmo.lua index 9b42bb6..b6bf190 100644 --- a/modules/zhunter/zButtonAmmo.lua +++ b/modules/zhunter/zButtonAmmo.lua @@ -22,13 +22,13 @@ if not root["zButtonAmmo"] then root["zButtonAmmo"]["children"]["hideonclick"] = 1 root["zButtonAmmo"]["showammoname"] = 1 root["zButtonAmmo"]["lastEquipped"] = nil - root["zButtonAmmo"]["debug"] = false end ZHunterMod_Ammo_Buttons = nil local ZHUNTER_AMMO_MAX_COUNT = math.max(table.getn(MTH_AMMO_ARROWS or {}), table.getn(MTH_AMMO_BULLETS or {})) local zButtonAmmo_Cache = {} +local zButtonAmmo_LastCacheSignature = nil local function zButtonAmmo_GetSaved() local currentRoot = zButtonAmmo_GetRoot() @@ -257,6 +257,17 @@ local function zButtonAmmo_AssignButtonFromAmmoInfo(button, ammoInfo) return true end +local function zButtonAmmo_GetCacheSignature() + local names = {} + for ammoName, ammoInfo in pairs(zButtonAmmo_Cache or {}) do + if ammoName and ammoInfo and (tonumber(ammoInfo.count) or 0) > 0 then + table.insert(names, tostring(ammoName)) + end + end + table.sort(names) + return table.concat(names, "|") +end + local function zButtonAmmo_GetEquippedAmmoInfo() local ammoLink = zButtonAmmo_GetEquippedAmmoLink() if not ammoLink then @@ -350,6 +361,26 @@ end function zButtonAmmo_SetButtons(parent, ammoList) zButtonAmmo_RebuildCache() + local previousByName = {} + for i = 1, parent.count do + local previous = getglobal(parent.name .. i) + if previous and previous.ammoname and not previous.isspell then + previousByName[previous.ammoname] = { + ammo = previous.ammoname, + brol = previous.ammobrol, + quality = previous.ammoqual, + lvl = previous.ammolvl, + type = previous.ammotype, + bag = nil, + slot = nil, + id = previous.ammoid or previous.id, + link = previous.ammolink, + icon = previous.icon, + count = 0, + equip = nil, + } + end + end for i = 1, parent.count do local button = getglobal(parent.name .. i) @@ -375,21 +406,12 @@ function zButtonAmmo_SetButtons(parent, ammoList) end local ammoName = ammoList[i] local ammoInfo = ammoName and zButtonAmmo_Cache[ammoName] or nil + if not ammoInfo and ammoName then + ammoInfo = previousByName[ammoName] + end if ammoInfo then local button = getglobal(parent.name .. count) - button.id = ammoInfo.id - button.icon = ammoInfo.icon - button.isspell = nil - button.ammoname = ammoInfo.ammo - button.ammobrol = ammoInfo.brol - button.ammoqual = ammoInfo.quality - button.ammolvl = ammoInfo.lvl - button.ammotype = ammoInfo.type - button.ammobag = ammoInfo.bag - button.ammoslot = ammoInfo.slot - button.ammoid = ammoInfo.id - button.ammolink = ammoInfo.link - button.ammocount = ammoInfo.count + zButtonAmmo_AssignButtonFromAmmoInfo(button, ammoInfo) zButtonAmmo_UpdateButton(button) button:Show() @@ -439,6 +461,7 @@ function zButtonAmmo_SetButtons(parent, ammoList) else parent:Show() end + zButtonAmmo_LastCacheSignature = zButtonAmmo_GetCacheSignature() return count - 1 end @@ -553,21 +576,6 @@ local function zButtonAmmo_GetEquippedAmmoName() return ammoLink end -local function zButtonAmmo_IsDebugEnabled() - local saved = zButtonAmmo_GetSaved() - return saved["debug"] -end - -local function zButtonAmmo_LogInit(msg) - if not zButtonAmmo_IsDebugEnabled() then - return - end - if DEFAULT_CHAT_FRAME and DEFAULT_CHAT_FRAME.AddMessage then - MTH_ZH_Print("[AMMO INIT] " .. tostring(msg), "debug") - end - MTH_ZH_Print("[AMMO INIT] " .. tostring(msg), "debug") -end - local zButtonAmmo_EquipFromButton local function zButtonAmmo_DeferredStartupSync() @@ -590,26 +598,11 @@ local function zButtonAmmo_DeferredStartupSync() syncFrame:SetScript("OnUpdate", nil) local equippedNow = zButtonAmmo_GetEquippedAmmoName() local saved = zButtonAmmo_GetSaved() - zButtonAmmo_LogInit("deferred sync equippedNow=" .. tostring(equippedNow) .. " saved.lastEquipped=" .. tostring(saved and saved["lastEquipped"])) zButtonAmmo_RebuildCache() if equippedNow and (not saved["lastEquipped"] or saved["lastEquipped"] == "") then zButtonAmmo_SaveEquippedAmmo(equippedNow) - zButtonAmmo_LogInit("deferred sync seeded lastEquipped=" .. tostring(equippedNow)) - return - end - - if saved["lastEquipped"] and equippedNow and saved["lastEquipped"] ~= equippedNow and zButtonAmmo_Cache[saved["lastEquipped"]] then - local restored = false - for i = 1, zButtonAmmo.count do - local child = getglobal("zButtonAmmo" .. i) - if child and child.ammoname == saved["lastEquipped"] then - restored = zButtonAmmo_EquipFromButton(child) - break - end - end - zButtonAmmo_LogInit("deferred sync restore attempt target=" .. tostring(saved["lastEquipped"]) .. " ok=" .. tostring(restored)) end end) end @@ -678,13 +671,10 @@ end function zButtonAmmo_OnEvent() if event == "VARIABLES_LOADED" then - zButtonAmmo_LogInit("VARIABLES_LOADED fired") if not zButtonAmmo then - zButtonAmmo_LogInit("abort: zButtonAmmo frame missing") return end if UnitClass("player") ~= ZHUNTER_HUNTER then - zButtonAmmo_LogInit("abort: non-hunter") zButtonAmmo:UnregisterAllEvents() zButtonAmmo:Hide() return @@ -696,13 +686,7 @@ function zButtonAmmo_OnEvent() zButtonAmmoAdjustment:RegisterEvent("UNIT_INVENTORY_CHANGED") zButtonAmmoAdjustment:RegisterEvent("BAG_UPDATE") zButtonAmmoAdjustment:SetScript("OnEvent", zButtonAmmoAdjustment_OnEvent) - if zButtonAmmo_IsDebugEnabled() then - MTH_ZH_Print("[AMMO] zButtonAmmoAdjustment frame created and events registered", "debug") - end zButtonAmmo_SetupSizeAndPosition() - local saved = zButtonAmmo_GetSaved() - zButtonAmmo_LogInit("post-init saved.lastEquipped=" .. tostring(saved and saved["lastEquipped"])) - zButtonAmmo_LogInit("post-init equippedNow=" .. tostring(zButtonAmmo_GetEquippedAmmoName())) zButtonAmmo_DeferredStartupSync() end end @@ -714,9 +698,6 @@ function zButtonAmmo_SaveEquippedAmmo(ammoname) return end saved["lastEquipped"] = ammoname - if zButtonAmmo_IsDebugEnabled() then - MTH_ZH_Print("[AMMO] Saved equipped ammo to persistent storage: " .. ammoname, "debug") - end end function zButtonAmmo_LoadLastEquippedAmmo() @@ -760,84 +741,8 @@ function zButtonAmmo_CreateButtons() -- Try to restore the last equipped ammo from saved variables local lastEquipped = zButtonAmmo_LoadLastEquippedAmmo() local equippedAmmoNameAtInit = zButtonAmmo_GetEquippedAmmoName() - zButtonAmmo_LogInit("CreateButtons saved.lastEquipped=" .. tostring(lastEquipped) .. " equippedNow=" .. tostring(equippedAmmoNameAtInit)) - if lastEquipped and zButtonAmmo_Cache[lastEquipped] then - if zButtonAmmo_IsDebugEnabled() then - MTH_ZH_Print("[AMMO] Restoring last equipped ammo from save: " .. lastEquipped, "debug") - end - -- Set the parent button directly from ammo cache data - local ammoInfo = zButtonAmmo_Cache[lastEquipped] - zButtonAmmo.ammoname = lastEquipped - zButtonAmmo.ammoid = ammoInfo["id"] - zButtonAmmo.icon = ammoInfo["icon"] - zButtonAmmo.isspell = nil - zButtonAmmo.ammobrol = ammoInfo["brol"] - zButtonAmmo.ammoqual = ammoInfo["quality"] - zButtonAmmo.ammolvl = ammoInfo["lvl"] - zButtonAmmo.ammotype = ammoInfo["type"] - zButtonAmmo.ammobag = ammoInfo["bag"] - zButtonAmmo.ammoslot = ammoInfo["slot"] - zButtonAmmo.ammolink = ammoInfo["link"] - zButtonAmmo_UpdateButton(zButtonAmmo) - zButtonAmmo:Enable() - - local equippedAmmoName = zButtonAmmo_GetEquippedAmmoName() - if equippedAmmoName ~= lastEquipped then - local restored = false - for i = 1, zButtonAmmo.count do - local child = getglobal("zButtonAmmo" .. i) - if child and child.ammoname == lastEquipped then - restored = zButtonAmmo_EquipFromButton(child) - break - end - end - if not restored then - restored = zButtonAmmo_EquipFromButton({ - ammoname = lastEquipped, - ammobag = ammoInfo["bag"], - ammoslot = ammoInfo["slot"], - ammoid = ammoInfo["id"], - }) - end - if restored then - zButtonAmmo_SaveEquippedAmmo(lastEquipped) - zButtonAmmo_LogInit("restored to saved ammo=" .. tostring(lastEquipped)) - else - zButtonAmmo_LogInit("restore failed for saved ammo=" .. tostring(lastEquipped)) - end - else - zButtonAmmo_LogInit("restore skipped: equipped already matches saved") - end - else - zButtonAmmo_LogInit("restore skipped: no saved lastEquipped in cache") - if equippedAmmoNameAtInit then - zButtonAmmo_SaveEquippedAmmo(equippedAmmoNameAtInit) - zButtonAmmo_LogInit("seeded lastEquipped from equippedNow=" .. tostring(equippedAmmoNameAtInit)) - else - local bestAvailable = nil - for i = 1, table.getn(ammoList) do - local ammoName = ammoList[i] - if ammoName and zButtonAmmo_Cache[ammoName] then - bestAvailable = ammoName - end - end - - if bestAvailable and zButtonAmmo_Cache[bestAvailable] then - local bestInfo = zButtonAmmo_Cache[bestAvailable] - local equippedBest = zButtonAmmo_EquipFromButton({ - ammoname = bestAvailable, - ammobag = bestInfo["bag"], - ammoslot = bestInfo["slot"], - ammoid = bestInfo["id"], - }) - if equippedBest then - zButtonAmmo_SaveEquippedAmmo(bestAvailable) - zButtonAmmo_LogInit("fallback equip bestAvailable=" .. tostring(bestAvailable)) - else - zButtonAmmo_LogInit("fallback equip failed bestAvailable=" .. tostring(bestAvailable)) - end - end - end + if equippedAmmoNameAtInit then + zButtonAmmo_SaveEquippedAmmo(equippedAmmoNameAtInit) end end @@ -890,7 +795,6 @@ function zButtonAmmo_Reset() saved["children"]["hideonclick"] = 1 saved["showammoname"] = 1 saved["lastEquipped"] = nil - saved["debug"] = false end function zButtonAmmoAdjustment_OnEvent() @@ -901,8 +805,11 @@ function zButtonAmmoAdjustment_OnEvent() if event == "UNIT_INVENTORY_CHANGED" or event == "BAG_UPDATE" then local ammoList = zButtonAmmo_GetAmmoList() - if ZHunterMod_Ammo_Buttons ~= ammoList then - ZHunterMod_Ammo_Buttons = ammoList + local listChanged = (ZHunterMod_Ammo_Buttons ~= ammoList) + ZHunterMod_Ammo_Buttons = ammoList + zButtonAmmo_RebuildCache() + local cacheSignature = zButtonAmmo_GetCacheSignature() + if listChanged or cacheSignature ~= zButtonAmmo_LastCacheSignature then zButtonAmmo_EnsureSpellOrder(ammoList) local info = {} local infoIndex = 1 @@ -915,8 +822,8 @@ function zButtonAmmoAdjustment_OnEvent() end zButtonAmmo.found = ZSpellButton_SetButtons(zButtonAmmo, info) zButtonAmmo_SetupSizeAndPosition() + zButtonAmmo_LastCacheSignature = zButtonAmmo_GetCacheSignature() end - zButtonAmmo_RebuildCache() -- Update ammo counts for child buttons for i=1, zButtonAmmo.count do local button = getglobal("zButtonAmmo"..i) @@ -1013,25 +920,8 @@ SlashCmdList["zButtonAmmo"] = function(msg) zButtonAmmo:SetPoint("CENTER", UIParent, "CENTER", 0, 0) elseif msg == "options" then MTH_OpenOptions("Ammo") - elseif msg == "debug" then - -- Manually trigger ammo rescan with debug output - local currentAmmoList = ZHunterMod_Ammo_Buttons or zButtonAmmo_GetAmmoList() - zButtonAmmo_EnsureSpellOrder(currentAmmoList) - local saved = zButtonAmmo_GetSaved() - local info = {} - local infoIndex = 1 - for i=1, table.getn(currentAmmoList) do - local ammoIndex = saved["spells"][i] - if saved["visible"][ammoIndex] ~= false then - info[infoIndex] = currentAmmoList[ammoIndex] - infoIndex = infoIndex + 1 - end - end - zButtonAmmo.found = ZSpellButton_SetButtons(zButtonAmmo, info) - zButtonAmmo_UpdateButton(zButtonAmmo) - MTH_ZH_Print("Ammo button rescanned") else - MTH_ZH_Print("Possible Commands: \"options\", \"reset\", \"debug\"") + MTH_ZH_Print("Possible Commands: \"options\", \"reset\"") end end diff --git a/modules/zhunter/zButtonAspect.lua b/modules/zhunter/zButtonAspect.lua index 1e6cb03..0b913f6 100644 --- a/modules/zhunter/zButtonAspect.lua +++ b/modules/zhunter/zButtonAspect.lua @@ -99,6 +99,43 @@ local function zButtonAspect_ApplyRuntimeSettings() zButtonAspect.hideonclick = saved["children"] and saved["children"]["hideonclick"] and true or false end +local function zButtonAspect_IsKnownAspectSpellId(spellId) + if not spellId then + return false + end + local spellName = GetSpellName(spellId, "spell") + if not spellName or spellName == "" then + return false + end + for i = 1, table.getn(ZHunterMod_Aspect_Spells) do + if ZHunterMod_Aspect_Spells[i] == spellName then + return true + end + end + return false +end + +local function zButtonAspect_EnsureValidParentId() + if not (zButtonAspect and zButtonAspect.count) then + return + end + + if zButtonAspect_IsKnownAspectSpellId(zButtonAspect.id) then + return + end + + for i = 1, zButtonAspect.count do + local child = getglobal(zButtonAspect.name .. i) + if child and child.id and zButtonAspect_IsKnownAspectSpellId(child.id) then + zButtonAspect.id = child.id + zButtonAspect.isspell = 1 + ZSpellButton_UpdateButton(zButtonAspect) + ZSpellButton_UpdateCooldown(zButtonAspect) + return + end + end +end + function zButtonAspect_OnLoad() this:RegisterEvent("VARIABLES_LOADED") end @@ -117,6 +154,9 @@ function zButtonAspect_OnEvent() zButtonAspectAdjustment = CreateFrame("Frame", "zButtonAspectAdjustment") zButtonAspectAdjustment:RegisterEvent("PLAYER_AURAS_CHANGED") zButtonAspectAdjustment:RegisterEvent("PLAYER_ENTERING_WORLD") + zButtonAspectAdjustment:RegisterEvent("SPELLS_CHANGED") + zButtonAspectAdjustment:RegisterEvent("CHARACTER_POINTS_CHANGED") + zButtonAspectAdjustment:RegisterEvent("LEARNED_SPELL_IN_TAB") zButtonAspectAdjustment:SetScript("OnEvent", zButtonAspectAdjustment_OnEvent) zButtonAspect_Tooltip = CreateFrame("GameTooltip", "zButtonAspect_Tooltip", nil, "GameTooltipTemplate") zButtonAspect_SetupSizeAndPosition() @@ -144,6 +184,7 @@ function zButtonAspect_CreateButtons() end zButtonAspect.found = ZSpellButton_SetButtons(zButtonAspect, info) zButtonAspect_ApplyRuntimeSettings() + zButtonAspect_EnsureValidParentId() end function zButtonAspect_SetupSizeAndPosition() @@ -193,7 +234,14 @@ function zButtonAspectAdjustment_OnEvent() if not zButtonAspect or not zButtonAspect.count then return end - if event == "PLAYER_AURAS_CHANGED" or event == "PLAYER_ENTERING_WORLD" then + if event == "SPELLS_CHANGED" or event == "CHARACTER_POINTS_CHANGED" or event == "LEARNED_SPELL_IN_TAB" then + zButtonAspect_CreateButtons() + zButtonAspect_SetupSizeAndPosition() + zButtonAspect_EnsureValidParentId() + end + if event == "PLAYER_AURAS_CHANGED" or event == "PLAYER_ENTERING_WORLD" + or event == "SPELLS_CHANGED" or event == "CHARACTER_POINTS_CHANGED" or event == "LEARNED_SPELL_IN_TAB" then + zButtonAspect_EnsureValidParentId() if not zButtonAspect1.id then return end diff --git a/modules/zhunter/zButtonPet.lua b/modules/zhunter/zButtonPet.lua index 45dfa22..e2c52e3 100644 --- a/modules/zhunter/zButtonPet.lua +++ b/modules/zhunter/zButtonPet.lua @@ -42,6 +42,7 @@ ZHunterMod_Pet_Spells = { } local ZHUNTER_PET_MAX = table.getn(ZHunterMod_Pet_Spells) +local zButtonPet_SetButtons local function zButtonPet_GetSaved() local currentRoot = zButtonPet_GetRoot() @@ -147,6 +148,7 @@ function zButtonPet_OnEvent() zButtonPet:Hide() return end + zButtonPet.customSetButtons = zButtonPet_SetButtons zButtonPet_CreateButtons() zButtonPet.beforeclick = zButtonPetAdjustment_BeforeClick zButtonPet.afterclick = zButtonPet_AfterClick @@ -157,6 +159,7 @@ function zButtonPet_OnEvent() zButtonPetAdjustment:RegisterEvent("PET_BAR_UPDATE") zButtonPetAdjustment:RegisterEvent("PLAYER_ENTERING_WORLD") zButtonPetAdjustment:RegisterEvent("SPELLS_CHANGED") + zButtonPetAdjustment:RegisterEvent("LEARNED_SPELL_IN_TAB") zButtonPetAdjustment:SetScript("OnEvent", zButtonPetAdjustment_OnEvent) zButtonPet_Tooltip = CreateFrame("GameTooltip", "zButtonPet_Tooltip", nil, "GameTooltipTemplate") zButtonPet_SetupSizeAndPosition() @@ -300,17 +303,110 @@ local function zButtonPet_FindSpellIdByName(spellName) if not spellName or spellName == "" then return nil end - local maxSpells = tonumber((_G and _G["MAX_SPELLS"]) or nil) or 1024 - for i = 1, maxSpells do - local current = GetSpellName(i, "spell") - if not current then - break - end - if current == spellName then - return i + local lookup = {} + local foundAny = nil + + if type(GetNumSpellTabs) == "function" and type(GetSpellTabInfo) == "function" then + local numTabs = GetNumSpellTabs() or 0 + for tabIndex = 1, numTabs do + local _, _, offset, numSpells = GetSpellTabInfo(tabIndex) + offset = tonumber(offset) or 0 + numSpells = tonumber(numSpells) or 0 + if numSpells > 0 then + for spellIndex = (offset + 1), (offset + numSpells) do + local spellNameAtIndex = GetSpellName(spellIndex, "spell") + if spellNameAtIndex then + lookup[spellNameAtIndex] = spellIndex + foundAny = 1 + end + end + end end end - return nil + + if not foundAny then + local maxSpells = tonumber((_G and _G["MAX_SPELLS"]) or nil) or 1024 + local nilStreak = 0 + for spellIndex = 1, maxSpells do + local spellNameAtIndex = GetSpellName(spellIndex, "spell") + if spellNameAtIndex then + lookup[spellNameAtIndex] = spellIndex + nilStreak = 0 + else + nilStreak = nilStreak + 1 + if nilStreak >= 30 then + break + end + end + end + end + + if spellName == ZHUNTER_PET_POSITION then + if lookup[spellName] then + return lookup[spellName] + end + for currentName, currentId in lookup do + if string.find(currentName, "Take Position", 1, true) + or string.find(currentName, "Position", 1, true) + or string.find(currentName, "Stay", 1, true) then + return currentId + end + end + return nil + end + + return lookup[spellName] +end + +zButtonPet_SetButtons = function(parent, spells) + if not (parent and parent.count and parent.name and spells) then + return 0 + end + + local info = {} + for i = 1, table.getn(spells) do + local spellName = spells[i] + local spellId = zButtonPet_FindSpellIdByName(spellName) + if spellId then + table.insert(info, spellId) + end + end + + for i = 1, parent.count do + local child = getglobal(parent.name..i) + if child then + child:Hide() + child.id = nil + child.icon = nil + child.isspell = nil + end + end + + parent.id = nil + parent.isspell = nil + + local foundCount = 0 + for i = 1, table.getn(info) do + if i > parent.count then + break + end + local button = getglobal(parent.name..i) + if button then + button.id = info[i] + button.isspell = 1 + ZSpellButton_UpdateButton(button) + button:Show() + if i == 1 then + parent.id = info[i] + parent.isspell = 1 + ZSpellButton_UpdateButton(parent) + parent:Enable() + end + foundCount = foundCount + 1 + end + end + + return foundCount end function zButtonPetAdjustment_BeforeClick() @@ -437,18 +533,57 @@ function zButtonPet_FeedPet() end +local function zButtonPet_DebugVerify() + if not zButtonPet then + MTH_ZH_Print("zPet: button frame is not ready yet.") + return + end + + zButtonPet_CreateButtons() + zButtonPet_RefreshParentSpell() + + MTH_ZH_Print("zPet verify: expected spell availability") + for i = 1, table.getn(ZHunterMod_Pet_Spells) do + local spellName = ZHunterMod_Pet_Spells[i] + local spellId = zButtonPet_FindSpellIdByName(spellName) + if spellId then + MTH_ZH_Print(" + "..spellName.." (id "..spellId..")") + else + MTH_ZH_Print(" - "..spellName.." (missing)") + end + end + + if zButtonPet.id then + local parentName = GetSpellName(zButtonPet.id, "spell") or "" + MTH_ZH_Print("zPet parent: "..parentName.." (id "..zButtonPet.id..")") + else + MTH_ZH_Print("zPet parent: ") + end + + for i = 1, (zButtonPet.count or 0) do + local button = getglobal("zButtonPet"..i) + if button and button.id then + local name = GetSpellName(button.id, "spell") or "" + MTH_ZH_Print(" slot "..i..": "..name.." (id "..button.id..")") + end + end +end + SLASH_zButtonPet1 = "/ZPet" SlashCmdList["zButtonPet"] = function(msg) if MTH_ZH_HandleDisabledSlash and MTH_ZH_HandleDisabledSlash("Pet button is disabled while module 'zhunter' is disabled.") then return end + msg = (msg and string.lower(msg)) or "" if msg == "reset" then zButtonPet_Reset() zButtonPet:ClearAllPoints() zButtonPet:SetPoint("CENTER", UIParent, "CENTER", 0, 60) elseif msg == "options" then MTH_OpenOptions("Pet") + elseif msg == "verify" then + zButtonPet_DebugVerify() else - MTH_ZH_Print("Possible Commands: \"options\", \"reset\"") + MTH_ZH_Print("Possible Commands: \"options\", \"reset\", \"verify\"") end end \ No newline at end of file diff --git a/modules/zhunter/zButtonRanged.lua b/modules/zhunter/zButtonRanged.lua new file mode 100644 index 0000000..95d5e40 --- /dev/null +++ b/modules/zhunter/zButtonRanged.lua @@ -0,0 +1,717 @@ +local function zButtonRanged_GetRoot() + return MTH_ZH_GetSavedRoot() +end + +local root = zButtonRanged_GetRoot() +if not root["zButtonRanged"] then + root["zButtonRanged"] = {} + root["zButtonRanged"]["spells"] = {} + root["zButtonRanged"]["visible"] = {} + root["zButtonRanged"]["rows"] = 1 + root["zButtonRanged"]["horizontal"] = nil + root["zButtonRanged"]["vertical"] = nil + root["zButtonRanged"]["firstbutton"] = "RIGHT" + root["zButtonRanged"]["enabled"] = false + root["zButtonRanged"]["tooltip"] = 1 + root["zButtonRanged"]["parent"] = {} + root["zButtonRanged"]["parent"]["size"] = 36 + root["zButtonRanged"]["parent"]["hide"] = nil + root["zButtonRanged"]["parent"]["circle"] = 1 + root["zButtonRanged"]["children"] = {} + root["zButtonRanged"]["children"]["size"] = 36 + root["zButtonRanged"]["children"]["hideonclick"] = 1 +end + +ZHunterMod_Ranged_Weapons = ZHunterMod_Ranged_Weapons or {} + +local ZHUNTER_RANGED_MAX_COUNT = 80 +local zButtonRanged_Cache = {} +local zButtonRanged_TooltipWarmed = false + +local function zButtonRanged_GetKnownItemSpeed(itemId) + local idNum = tonumber(itemId) + if not idNum then + return nil + end + local items = _G["MTH_DS_Items"] or MTH_DS_AmmoItems + local item = items and items[idNum] + local speedVal = item and tonumber(item.speed) + if speedVal and speedVal > 0 then + return speedVal + end + return nil +end + +local function zButtonRanged_GetSaved() + local currentRoot = zButtonRanged_GetRoot() + if not currentRoot["zButtonRanged"] then + currentRoot["zButtonRanged"] = {} + end + return currentRoot["zButtonRanged"] +end + +local function zButtonRanged_GetColorGradient(perc) + perc = perc > 1 and 1 or perc + perc = perc < 0 and 0 or perc + local r1, g1, b1, r2, g2, b2 + if perc <= 0.5 then + perc = perc * 2 + r1, g1, b1 = 1, 0, 0 + r2, g2, b2 = 1, 1, 0 + else + perc = perc * 2 - 1 + r1, g1, b1 = 1, 1, 0 + r2, g2, b2 = 0, 1, 0 + end + local r = r1 + (r2 - r1) * perc + local g = g1 + (g2 - g1) * perc + local b = b1 + (b2 - b1) * perc + return r, g, b +end + +local function zButtonRanged_EnsureDurabilityText(button) + if button and not button.rangedDurabilityText then + button.rangedDurabilityText = button:CreateFontString(nil, "OVERLAY") + button.rangedDurabilityText:SetPoint("BOTTOMRIGHT", button) + button.rangedDurabilityText:SetFont("Fonts\\ARIALN.ttf", 13, "OUTLINE") + end + return button and button.rangedDurabilityText +end + +local function zButtonRanged_EnsureSpeedText(button) + if button and not button.rangedSpeedText then + button.rangedSpeedText = button:CreateFontString(nil, "OVERLAY") + button.rangedSpeedText:SetPoint("TOPLEFT", button, "TOPLEFT", 1, -1) + button.rangedSpeedText:SetFont("Fonts\\ARIALN.ttf", 9, "OUTLINE") + end + return button and button.rangedSpeedText +end + +local function zButtonRanged_IsRangedItem(subtype, equipLoc) + local subtypeText = tostring(subtype or "") + if subtypeText == tostring(MTH_WEAPON_BOWS or "Bows") then return true end + if subtypeText == tostring(MTH_WEAPON_GUNS or "Guns") then return true end + if subtypeText == tostring(MTH_WEAPON_CROSSBOWS or "Crossbows") then return true end + if subtypeText == "Thrown" then return true end + if equipLoc == "INVTYPE_RANGED" or equipLoc == "INVTYPE_RANGEDRIGHT" or equipLoc == "INVTYPE_THROWN" then + return true + end + return false +end + +local function zButtonRanged_RebuildCache() + zButtonRanged_Cache = {} + for bag = 0, 4 do + for slot = 1, GetContainerNumSlots(bag) do + local link = GetContainerItemLink(bag, slot) + if link then + local _, _, id = string.find(link, "Hitem:((%d+).-)") + if id then + local itemNameResolved, itemLink, itemQuality, itemReqLevel, _, itemSubtype, _, itemEquipLoc, itemIcon = GetItemInfo(id) + local _, _, linkName = string.find(link, "%[(.+)%]") + local itemName = itemNameResolved or linkName + if itemName and zButtonRanged_IsRangedItem(itemSubtype, itemEquipLoc) then + local _, itemCount = GetContainerItemInfo(bag, slot) + local knownSpeed = zButtonRanged_GetKnownItemSpeed(id) + local rangedInfo = zButtonRanged_Cache[itemName] + if not rangedInfo then + rangedInfo = { + name = itemName, + quality = itemQuality, + reqLevel = itemReqLevel, + subtype = itemSubtype, + equipLoc = itemEquipLoc, + bag = bag, + slot = slot, + id = id, + link = link, + icon = itemIcon, + speed = knownSpeed, + count = 0, + } + zButtonRanged_Cache[itemName] = rangedInfo + end + if rangedInfo.speed == nil and knownSpeed ~= nil then + rangedInfo.speed = knownSpeed + end + rangedInfo.count = (rangedInfo.count or 0) + (itemCount or 0) + end + end + end + end + end +end + +local function zButtonRanged_GetOrderedWeapons() + local names = {} + for weaponName, weaponInfo in pairs(zButtonRanged_Cache) do + if weaponName and weaponInfo and (tonumber(weaponInfo.count) or 0) > 0 then + table.insert(names, weaponName) + end + end + table.sort(names, function(a, b) + local infoA = zButtonRanged_Cache[a] or {} + local infoB = zButtonRanged_Cache[b] or {} + local lvlA = tonumber(infoA.reqLevel) or 0 + local lvlB = tonumber(infoB.reqLevel) or 0 + if lvlA ~= lvlB then + return lvlA < lvlB + end + local qualityA = tonumber(infoA.quality) or 0 + local qualityB = tonumber(infoB.quality) or 0 + if qualityA ~= qualityB then + return qualityA < qualityB + end + return tostring(a) < tostring(b) + end) + return names +end + +local function zButtonRanged_EnsureSpellOrder(weapons) + local saved = zButtonRanged_GetSaved() + if not saved["spells"] then + saved["spells"] = {} + end + if not saved["visible"] then + saved["visible"] = {} + end + + local maxWeapons = table.getn(weapons or {}) + local needsReset = false + for i = 1, maxWeapons do + local index = saved["spells"][i] + if not tonumber(index) or index < 1 or index > maxWeapons then + needsReset = true + break + end + end + + if needsReset or table.getn(saved["spells"]) ~= maxWeapons then + saved["spells"] = {} + for i = 1, maxWeapons do + saved["spells"][i] = i + end + end + + for i = 1, maxWeapons do + if saved["visible"][i] == nil then + saved["visible"][i] = 1 + end + end +end + +local function zButtonRanged_AssignButtonFromInfo(button, weaponInfo) + if not (button and weaponInfo) then + return false + end + button.id = weaponInfo.id + button.icon = weaponInfo.icon + button.isspell = nil + button.ammoname = weaponInfo.name + button.ammobag = weaponInfo.bag + button.ammoslot = weaponInfo.slot + button.ammoid = weaponInfo.id + button.ammolink = weaponInfo.link + button.ammocount = weaponInfo.count + button.rangedType = weaponInfo.subtype + button.rangedReqLevel = weaponInfo.reqLevel + button.rangedQuality = weaponInfo.quality + button.rangedSpeed = weaponInfo.speed + return true +end + +local function zButtonRanged_ApplyRuntimeSettings() + if not zButtonRanged then + return + end + local saved = zButtonRanged_GetSaved() + zButtonRanged.tooltip = saved["tooltip"] and true or false + zButtonRanged.hideonclick = saved["children"] and saved["children"]["hideonclick"] and true or false +end + +local function zButtonRanged_UpdateDurabilityText(button) + local text = zButtonRanged_EnsureDurabilityText(button) + if not text then + return + end + + if button ~= zButtonRanged then + text:SetText("") + return + end + + if type(GetInventoryItemDurability) ~= "function" then + text:SetText("") + return + end + + local cur, max = nil, nil + local okPlayer, cPlayer, mPlayer = pcall(GetInventoryItemDurability, "player", 18) + if okPlayer then + cur, max = cPlayer, mPlayer + else + local okSlot, cSlot, mSlot = pcall(GetInventoryItemDurability, 18) + if okSlot then + cur, max = cSlot, mSlot + end + end + + cur = tonumber(cur) + max = tonumber(max) + if not cur or not max or max <= 0 then + text:SetText("") + return + end + + local perc = math.floor(((cur / max) * 100) + 0.5) + if perc >= 100 then + text:SetText("") + return + end + + local r, g, b = zButtonRanged_GetColorGradient(cur / max) + text:SetTextColor(r, g, b) + text:SetText(tostring(perc) .. "%") +end + +local function zButtonRanged_UpdateSpeedText(button) + local text = zButtonRanged_EnsureSpeedText(button) + if not text then + return + end + local speedVal = tonumber(button and button.rangedSpeed) + if not speedVal then + text:SetText("") + return + end + text:SetText(string.format("%.2f", speedVal)) +end + +local function zButtonRanged_UpdateParentFromEquipped() + if not zButtonRanged then + return false + end + + local equippedLink = GetInventoryItemLink("player", 18) + if not equippedLink then + return false + end + local _, _, linkName = string.find(equippedLink, "%[(.+)%]") + + local _, _, itemId = string.find(equippedLink, "item:(%d+)") + if not itemId then + local _, _, altId = string.find(equippedLink, "Hitem:((%d+).-)") + itemId = altId + end + + local itemName, _, itemQuality, itemReqLevel, _, itemSubtype, _, itemEquipLoc, itemIcon = GetItemInfo(itemId) + itemName = itemName or linkName + if not itemName then + return false + end + if (itemSubtype or itemEquipLoc) and not zButtonRanged_IsRangedItem(itemSubtype, itemEquipLoc) then + return false + end + + local cacheInfo = zButtonRanged_Cache[itemName] + local info = { + name = itemName, + quality = itemQuality, + reqLevel = itemReqLevel, + subtype = itemSubtype, + equipLoc = itemEquipLoc, + bag = cacheInfo and cacheInfo.bag or nil, + slot = cacheInfo and cacheInfo.slot or nil, + id = itemId, + link = equippedLink, + icon = itemIcon or GetInventoryItemTexture("player", 18), + speed = (cacheInfo and cacheInfo.speed) or zButtonRanged_GetKnownItemSpeed(itemId), + count = cacheInfo and cacheInfo.count or 1, + } + + if not info.icon then + info.icon = GetInventoryItemTexture("player", 18) + end + + zButtonRanged_AssignButtonFromInfo(zButtonRanged, info) + zButtonRanged:Enable() + zButtonRanged:Show() + return true +end + +local function zButtonRanged_SetButtons(parent, weaponNames) + if not (parent and parent.count) then + return 0 + end + + for i = 1, parent.count do + local child = getglobal(parent.name .. i) + if child then + child:Hide() + child.id = nil + child.icon = nil + child.isspell = nil + child.ammoname = nil + child.ammobag = nil + child.ammoslot = nil + end + end + + local found = 0 + for i = 1, table.getn(weaponNames or {}) do + if found >= parent.count then + break + end + local weaponName = weaponNames[i] + local weaponInfo = weaponName and zButtonRanged_Cache[weaponName] or nil + if weaponInfo and weaponInfo.id then + found = found + 1 + local child = getglobal(parent.name .. found) + if child then + zButtonRanged_AssignButtonFromInfo(child, weaponInfo) + zButtonRanged_UpdateButton(child) + child:Show() + end + end + end + + local hasEquipped = zButtonRanged_UpdateParentFromEquipped() + if not hasEquipped and found > 0 then + local first = getglobal(parent.name .. 1) + if first then + zButtonRanged_AssignButtonFromInfo(parent, { + name = first.ammoname, + quality = first.rangedQuality, + reqLevel = first.rangedReqLevel, + subtype = first.rangedType, + equipLoc = nil, + bag = first.ammobag, + slot = first.ammoslot, + id = first.ammoid or first.id, + link = first.ammolink, + icon = first.icon, + speed = first.rangedSpeed, + count = first.ammocount, + }) + zButtonRanged_UpdateButton(parent) + parent:Enable() + parent:Show() + end + end + + if found <= 0 and not hasEquipped then + parent.id = nil + parent.icon = nil + parent.ammoname = nil + parent:Hide() + else + parent:Show() + end + + return found +end + +function zButtonRanged_UpdateButton(button) + if not button then + button = this + end + if not (button and button.icontexture) then + return + end + if not button.id then + button.icontexture:Hide() + zButtonRanged_UpdateSpeedText(button) + zButtonRanged_UpdateDurabilityText(button) + return + end + button.icontexture:SetTexture(button.icon) + button.icontexture:Show() + zButtonRanged_UpdateSpeedText(button) + zButtonRanged_UpdateDurabilityText(button) +end + +local function zButtonRanged_OnEnter(button) + if not button then + button = this + end + if not button then + return + end + if not (zButtonRanged and zButtonRanged.tooltip) then + return + end + GameTooltip:SetOwner(button, "ANCHOR_TOPLEFT") + if button == zButtonRanged then + if not GameTooltip:SetInventoryItem("player", 18) and button.ammobag and button.ammoslot then + GameTooltip:SetBagItem(button.ammobag, button.ammoslot) + end + elseif button.ammobag and button.ammoslot then + GameTooltip:SetBagItem(button.ammobag, button.ammoslot) + elseif button.ammolink then + GameTooltip:SetHyperlink(button.ammolink) + end + GameTooltip:Show() +end + +local function zButtonRanged_PrewarmTooltipOnce() + if zButtonRanged_TooltipWarmed then + return + end + zButtonRanged_TooltipWarmed = true + if not GameTooltip then + return + end + GameTooltip:SetOwner(UIParent, "ANCHOR_NONE") + GameTooltip:ClearLines() + if zButtonRanged and zButtonRanged.ammolink then + GameTooltip:SetHyperlink(zButtonRanged.ammolink) + elseif zButtonRanged and zButtonRanged.ammobag and zButtonRanged.ammoslot then + GameTooltip:SetBagItem(zButtonRanged.ammobag, zButtonRanged.ammoslot) + else + GameTooltip:SetInventoryItem("player", 18) + end + GameTooltip:Hide() +end + +local function zButtonRanged_EquipFromButton(button) + if not (button and button.ammobag and button.ammoslot) then + return false + end + + PickupContainerItem(button.ammobag, button.ammoslot) + if CursorHasItem() then + EquipCursorItem(18) + end + if CursorHasItem() then + if ClearCursor then ClearCursor() end + return false + end + + zButtonRanged_UpdateParentFromEquipped() + zButtonRanged_UpdateButton(zButtonRanged) + return true +end + +local function zButtonRanged_BeforeClick(button) + if not button then + return false + end + if button.isspell then + return false + end + zButtonRanged_EquipFromButton(button) + return true +end + +local function zButtonRanged_RefreshButtonsFromState() + if not zButtonRanged then + return + end + + local saved = zButtonRanged_GetSaved() + zButtonRanged_RebuildCache() + local weapons = zButtonRanged_GetOrderedWeapons() + ZHunterMod_Ranged_Weapons = weapons + zButtonRanged_EnsureSpellOrder(weapons) + + local info = {} + local infoIndex = 1 + for i = 1, table.getn(weapons) do + local weaponIndex = saved["spells"][i] + if weaponIndex and saved["visible"][weaponIndex] ~= false then + info[infoIndex] = weapons[weaponIndex] + infoIndex = infoIndex + 1 + end + end + + zButtonRanged.found = ZSpellButton_SetButtons(zButtonRanged, info) + zButtonRanged_ApplyRuntimeSettings() +end + +local function zButtonRanged_EnsureConfig() + local saved = zButtonRanged_GetSaved() + saved["count"] = nil + if saved["enabled"] == nil then + saved["enabled"] = false + end + if saved["tooltip"] == nil then + saved["tooltip"] = 1 + end + if not saved["children"] then + saved["children"] = {} + end + if saved["children"]["hideonclick"] == nil then + saved["children"]["hideonclick"] = 1 + end + if not saved["spells"] then + saved["spells"] = {} + end + if not saved["visible"] then + saved["visible"] = {} + end + if not saved["parent"] then + saved["parent"] = {} + end + if not saved["children"]["size"] then + saved["children"]["size"] = 36 + end + if not saved["parent"]["size"] then + saved["parent"]["size"] = 36 + end + if saved["parent"]["circle"] == nil then + saved["parent"]["circle"] = 1 + end + if not saved["rows"] or saved["rows"] < 1 then + saved["rows"] = 1 + end + if not saved["firstbutton"] then + saved["firstbutton"] = "RIGHT" + end +end + +function zButtonRanged_OnLoad() + this:RegisterEvent("VARIABLES_LOADED") +end + +function zButtonRanged_OnEvent() + if event == "VARIABLES_LOADED" then + if not zButtonRanged then + return + end + if UnitClass("player") ~= ZHUNTER_HUNTER then + zButtonRanged:UnregisterAllEvents() + zButtonRanged:Hide() + return + end + zButtonRanged.customSetButtons = zButtonRanged_SetButtons + zButtonRanged.customUpdateButton = zButtonRanged_UpdateButton + zButtonRanged.beforeclick = zButtonRanged_BeforeClick + zButtonRanged_CreateButtons() + zButtonRangedAdjustment = CreateFrame("Frame", "zButtonRangedAdjustment") + zButtonRangedAdjustment:RegisterEvent("UNIT_INVENTORY_CHANGED") + zButtonRangedAdjustment:RegisterEvent("BAG_UPDATE") + zButtonRangedAdjustment:RegisterEvent("PLAYER_ENTERING_WORLD") + zButtonRangedAdjustment:SetScript("OnEvent", zButtonRangedAdjustment_OnEvent) + zButtonRanged_SetupSizeAndPosition() + end +end + +function zButtonRanged_CreateButtons() + zButtonRanged_EnsureConfig() + if not zButtonRanged.children then + ZSpellButton_CreateChildren(zButtonRanged, "zButtonRanged", ZHUNTER_RANGED_MAX_COUNT) + else + zButtonRanged.count = ZHUNTER_RANGED_MAX_COUNT + end + zButtonRanged:SetScript("OnEnter", function() + zButtonRanged_OnEnter(this) + end) + for i = 1, zButtonRanged.count do + local child = getglobal("zButtonRanged" .. i) + if child then + child:SetScript("OnEnter", function() + zButtonRanged_OnEnter(this) + end) + end + end + zButtonRanged_RefreshButtonsFromState() +end + +function zButtonRanged_SetupSizeAndPosition() + local saved = zButtonRanged_GetSaved() + if saved["enabled"] == false or saved["enabled"] == 0 then + if zButtonRanged and zButtonRanged.Hide then + zButtonRanged:Hide() + end + return + end + local displayCount = zButtonRanged.found or 0 + if displayCount < 0 then + displayCount = 0 + end + ZSpellButton_SetSize(zButtonRanged, saved["parent"]["size"]) + ZSpellButton_SetSize(zButtonRanged, saved["children"]["size"], 1) + ZSpellButton_SetExpandDirection(zButtonRanged, saved["firstbutton"]) + ZSpellButton_ArrangeChildren(zButtonRanged, saved["rows"], displayCount, saved["horizontal"], saved["vertical"]) + zButtonRanged_UpdateButton(zButtonRanged) +end + +function zButtonRanged_Reset() + local currentRoot = zButtonRanged_GetRoot() + currentRoot["zButtonRanged"] = {} + local saved = zButtonRanged_GetSaved() + saved["spells"] = {} + saved["visible"] = {} + saved["rows"] = 1 + saved["horizontal"] = nil + saved["vertical"] = nil + saved["firstbutton"] = "RIGHT" + saved["enabled"] = false + saved["tooltip"] = 1 + saved["parent"] = {} + saved["parent"]["size"] = 36 + saved["parent"]["hide"] = nil + saved["parent"]["circle"] = 1 + saved["children"] = {} + saved["children"]["size"] = 36 + saved["children"]["hideonclick"] = 1 + zButtonRanged_EnsureConfig() +end + +function zButtonRangedAdjustment_OnEvent() + if not zButtonRanged then + return + end + if event == "UNIT_INVENTORY_CHANGED" and arg1 and arg1 ~= "player" then + return + end + zButtonRanged_RefreshButtonsFromState() + zButtonRanged_SetupSizeAndPosition() + if event == "PLAYER_ENTERING_WORLD" then + zButtonRanged_PrewarmTooltipOnce() + end + if GameTooltip:IsOwned(zButtonRanged) then + zButtonRanged_OnEnter(zButtonRanged) + end +end + +function zButtonRanged_KeyBinding(index) + if MTH_ZH_IsModuleEnabled and not MTH_ZH_IsModuleEnabled() then + return + end + + local button + if index then + button = getglobal("zButtonRanged" .. index) + else + button = zButtonRanged + end + if button then + zButtonRanged_EquipFromButton(button) + if zButtonRanged.hideonclick then + if type(ZSpellButton_SetChildrenExpanded) == "function" then + ZSpellButton_SetChildrenExpanded(zButtonRanged, false) + elseif zButtonRanged.children then + zButtonRanged.children:Hide() + end + end + end +end + +SLASH_zButtonRanged1 = "/ZRanged" +SlashCmdList["zButtonRanged"] = function(msg) + if MTH_ZH_HandleDisabledSlash and MTH_ZH_HandleDisabledSlash("Ranged button is disabled while module 'zhunter' is disabled.") then + return + end + if msg == "reset" then + zButtonRanged_Reset() + zButtonRanged:ClearAllPoints() + zButtonRanged:SetPoint("CENTER", UIParent, "CENTER", 120, 0) + zButtonRanged_RefreshButtonsFromState() + zButtonRanged_SetupSizeAndPosition() + elseif msg == "options" then + MTH_OpenOptions("Ranged") + else + MTH_ZH_Print("Possible Commands: \"reset\", \"options\"") + end +end diff --git a/modules/zhunter/zButtonRanged.xml b/modules/zhunter/zButtonRanged.xml new file mode 100644 index 0000000..2f9c9b4 --- /dev/null +++ b/modules/zhunter/zButtonRanged.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + diff --git a/modules/zhunter/zButtonTrack.lua b/modules/zhunter/zButtonTrack.lua index 49e6f9f..6a5b301 100644 --- a/modules/zhunter/zButtonTrack.lua +++ b/modules/zhunter/zButtonTrack.lua @@ -103,6 +103,7 @@ local function zButtonTrack_ApplyRuntimeSettings() zButtonTrack.hideonclick = saved["children"] and saved["children"]["hideonclick"] and true or false end + function zButtonTrack_OnLoad() this:RegisterEvent("VARIABLES_LOADED") end diff --git a/modules/zhunter/zButtonTrap.lua b/modules/zhunter/zButtonTrap.lua index 243cdee..2bd48c1 100644 --- a/modules/zhunter/zButtonTrap.lua +++ b/modules/zhunter/zButtonTrap.lua @@ -96,6 +96,7 @@ local function zButtonTrap_ApplyRuntimeSettings() zButtonTrap.hideonclick = saved["children"] and saved["children"]["hideonclick"] and true or false end + function zButtonTrap_OnLoad() this:RegisterEvent("VARIABLES_LOADED") end