├── .github ├── ISSUE_TEMPLATE │ ├── bug_report_retail.md │ ├── bug_report_wow_wotlkc.md │ ├── bug_report_wowbcc.md │ ├── bug_report_wowclassic.md │ └── config.yml ├── README.md └── workflows │ ├── build.yml │ └── pull_request.yml ├── .luacheckrc ├── .pkgmeta ├── Capping.toc ├── Capping_Cata.toc ├── Capping_Mists.toc ├── Capping_TBC.toc ├── Capping_Vanilla.toc ├── Capping_Wrath.toc ├── Core.lua ├── Core_BCC.lua ├── Core_Vanilla.lua ├── Core_Wrath.lua ├── Libs ├── CallbackHandler-1.0 │ └── CallbackHandler-1.0.lua └── LibStub │ └── LibStub.lua ├── Locales ├── deDE.lua ├── enUS.lua ├── esES.lua ├── esMX.lua ├── frFR.lua ├── itIT.lua ├── koKR.lua ├── ptBR.lua ├── ruRU.lua ├── zhCN.lua └── zhTW.lua ├── Modules ├── AlteracValley.lua ├── AlteracValley_TBC.lua ├── AlteracValley_Vanilla.lua ├── AlteracValley_Wrath.lua ├── ArathiBasin.lua ├── ArathiBasin_Classic.lua ├── ArathiBasin_Wrath.lua ├── Arena.lua ├── Arena_Classic.lua ├── Ashran.lua ├── DeephaulRavine.lua ├── DeepwindGorge.lua ├── EyeOfTheStorm.lua ├── EyeOfTheStorm_TBC.lua ├── EyeOfTheStorm_Wrath.lua ├── Gilneas.lua ├── IsleOfConquest.lua ├── IsleOfConquest_Wrath.lua ├── QueueTimers.lua ├── QueueTimers_TBC.lua ├── QueueTimers_Vanilla.lua ├── QueueTimers_Wrath.lua ├── WarsongGulchTwinPeaks.lua └── Wintergrasp.lua ├── Options ├── Capping_Options.toc ├── Locales │ ├── deDE.lua │ ├── enUS.lua │ ├── esES.lua │ ├── esMX.lua │ ├── frFR.lua │ ├── itIT.lua │ ├── koKR.lua │ ├── ptBR.lua │ ├── ruRU.lua │ ├── zhCN.lua │ └── zhTW.lua ├── Options.lua ├── embeds.xml └── locales.xml ├── embeds.xml ├── locales.xml └── modules.xml /.github/ISSUE_TEMPLATE/bug_report_retail.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue for Retail/Live 3 | about: Create a report about current WoW. 4 | title: '' 5 | labels: retail 6 | assignees: '' 7 | --- 8 | 9 | ## Describe the problem 10 | 11 | 12 | ### What steps will reproduce the problem? 13 | 14 | 1. 15 | 2. 16 | 3. 17 | 18 | ### Consider attaching a screenshot below to help describe your issue (Attach directly, do not link to other websites) 19 | 20 | 21 | ### What version of the addon are you using? (Stating 'latest' is not useful) 22 | 23 | 24 | ### Do you have an error log of what happened? 25 | 26 | 27 | ### Any additional information? (example: WoW language if not English) 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report_wow_wotlkc.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue for Wrath of the Lich King Classic 3 | about: Create a report about Wrath of the Lich King Classic WoW. 4 | title: '' 5 | labels: wotlkc 6 | assignees: '' 7 | --- 8 | 9 | ## Describe the problem 10 | 11 | 12 | ### What steps will reproduce the problem? 13 | 14 | 1. 15 | 2. 16 | 3. 17 | 18 | ### Consider attaching a screenshot below to help describe your issue (Attach directly, do not link to other websites) 19 | 20 | 21 | ### What version of the addon are you using? (Stating 'latest' is not useful) 22 | 23 | 24 | ### Do you have an error log of what happened? 25 | 26 | 27 | ### Any additional information? (example: WoW language if not English) 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report_wowbcc.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue for Burning Crusade Classic 3 | about: Create a report about Burning Crusade Classic WoW. 4 | title: '' 5 | labels: bcc 6 | assignees: '' 7 | --- 8 | 9 | ## Describe the problem 10 | 11 | 12 | ### What steps will reproduce the problem? 13 | 14 | 1. 15 | 2. 16 | 3. 17 | 18 | ### Consider attaching a screenshot below to help describe your issue (Attach directly, do not link to other websites) 19 | 20 | 21 | ### What version of the addon are you using? (Stating 'latest' is not useful) 22 | 23 | 24 | ### Do you have an error log of what happened? 25 | 26 | 27 | ### Any additional information? (example: WoW language if not English) 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report_wowclassic.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Issue for Classic 3 | about: Create a report about Classic WoW. 4 | title: '' 5 | labels: classic 6 | assignees: '' 7 | --- 8 | 9 | ## Describe the problem 10 | 11 | 12 | ### What steps will reproduce the problem? 13 | 14 | 1. 15 | 2. 16 | 3. 17 | 18 | ### Consider attaching a screenshot below to help describe your issue (Attach directly, do not link to other websites) 19 | 20 | 21 | ### What version of the addon are you using? (Stating 'latest' is not useful) 22 | 23 | 24 | ### Do you have an error log of what happened? 25 | 26 | 27 | ### Any additional information? (example: WoW language if not English) 28 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Question 4 | url: https://discord.gg/jGveg85 5 | about: Please ask questions on our Discord! 6 | -------------------------------------------------------------------------------- /.github/README.md: -------------------------------------------------------------------------------- 1 | # Capping 2 | Battleground timers and other PvP features. 3 | 4 | Configure by right-clicking the anchor or by typing /capping 5 | 6 | ## Features 7 | * All battlegrounds/arenas have queue timers 8 | * Arenas - Shadow Sight timer, arena time remaining 9 | * Alterac Valley - Node timers, auto quest turnins 10 | * Arathi Basin - Node timers and final score estimation 11 | * Eye of the Storm - Flag respawn timer, final score estimation 12 | * Isle of Conquest - Node timers and siege engine timer 13 | * Warsong Gulch - Flag respawn timer 14 | * Wintergrasp - Wall attack alerts 15 | * Battle for Gilneas - Node timers and final score estimation 16 | * Deepwind Gorge - Node timers and final score estimation 17 | 18 | ## Download 19 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: Package addon 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - '*' 9 | paths-ignore: 10 | - '.github/**' 11 | 12 | jobs: 13 | build: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - name: Checkout addon 18 | uses: actions/checkout@v4 19 | with: 20 | fetch-depth: 0 21 | 22 | - name: Run luacheck 23 | uses: BigWigsMods/actions/luacheck@master 24 | with: 25 | args: -q 26 | 27 | - name: Package 28 | uses: BigWigsMods/packager@master 29 | env: 30 | CF_API_KEY: ${{ secrets.CF_API_KEY }} 31 | WOWI_API_TOKEN: ${{ secrets.WOWI_API_TOKEN }} 32 | WAGO_API_TOKEN: ${{ secrets.WAGO_API_TOKEN }} 33 | GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} 34 | -------------------------------------------------------------------------------- /.github/workflows/pull_request.yml: -------------------------------------------------------------------------------- 1 | name: Check PR 2 | 3 | on: [pull_request] 4 | 5 | jobs: 6 | test: 7 | runs-on: ubuntu-latest 8 | 9 | steps: 10 | - name: Checkout addon 11 | uses: actions/checkout@v4 12 | 13 | - name: Run luacheck 14 | uses: BigWigsMods/actions/luacheck@master 15 | with: 16 | args: -q 17 | 18 | -------------------------------------------------------------------------------- /.luacheckrc: -------------------------------------------------------------------------------- 1 | std = "lua51" 2 | max_line_length = false 3 | codes = true 4 | exclude_files = { 5 | "**/Libs", 6 | } 7 | ignore = { 8 | "111/SLASH_Capping1", -- slash handlers 9 | "113/BasicMessageDialog", -- Alterac Valley popup 10 | "212/self", -- (W212) unused argument self 11 | } 12 | globals = { 13 | -- Addon 14 | "CappingAPI", 15 | "CappingFrame", 16 | "LibStub", 17 | 18 | -- WoW (general API) 19 | "C_AddOns", 20 | "C_AreaPoiInfo", 21 | "C_ChatInfo", 22 | "C_CurrencyInfo", 23 | "C_CVar", 24 | "C_GossipInfo", 25 | "C_Item", 26 | "C_Map", 27 | "C_Minimap", 28 | "C_PvP", 29 | "C_Spell", 30 | "C_Texture", 31 | "C_Timer", 32 | "C_UIWidgetManager", 33 | "CombatLogGetCurrentEventInfo", 34 | "CompleteQuest", 35 | "CreateFrame", 36 | "GetBattlefieldEstimatedWaitTime", 37 | "GetBattlefieldPortExpiration", 38 | "GetBattlefieldStatus", 39 | "GetBattlefieldTimeWaited", 40 | "GetBattlegroundInfo", 41 | "geterrorhandler", 42 | "GetInstanceInfo", 43 | "GetItemCount", 44 | "GetLocale", 45 | "GetNumBattlegroundTypes", 46 | "GetNumQuestRewards", 47 | "GetQuestReward", 48 | "GetRealmName", 49 | "GetSpellInfo", 50 | "GetSpellTexture", 51 | "GetTime", 52 | "IsAltKeyDown", 53 | "IsControlKeyDown", 54 | "IsInGroup", 55 | "IsQuestCompletable", 56 | "IsShiftKeyDown", 57 | "PlaySound", 58 | "RaidNotice_AddMessage", 59 | "RaidWarningFrame_OnEvent", 60 | "ReloadUI", 61 | "RequestBattlefieldScoreData", 62 | "SendChatMessage", 63 | "StopSound", 64 | "strmatch", 65 | "strsplit", 66 | "UnitGUID", 67 | "UnitHealth", 68 | "UnitHealthMax", 69 | "UnitName", 70 | "UnitPosition", 71 | 72 | -- WoW (global tables) 73 | "RaidBossEmoteFrame", 74 | "SlashCmdList", 75 | "TimerTracker", 76 | "UIParent", 77 | 78 | -- WoW (global strings) 79 | "ARENA", 80 | 81 | -- Classic WoW 82 | "GetBattlefieldScore", 83 | } 84 | -------------------------------------------------------------------------------- /.pkgmeta: -------------------------------------------------------------------------------- 1 | package-as: Capping 2 | wowi-archive-previous: no 3 | 4 | externals: 5 | Options/Libs/AceGUI-3.0: https://repos.wowace.com/wow/ace3/trunk/AceGUI-3.0 6 | Options/Libs/AceConfigDialog-3.0: https://repos.wowace.com/wow/ace3/trunk/AceConfig-3.0/AceConfigDialog-3.0 7 | Options/Libs/AceConfigRegistry-3.0: https://repos.wowace.com/wow/ace3/trunk/AceConfig-3.0/AceConfigRegistry-3.0 8 | Options/Libs/LibDDI-1.0: https://repos.wowace.com/wow/libddi-1-0/trunk 9 | Options/Libs/AceDBOptions-3.0: https://repos.wowace.com/wow/ace3/trunk/AceDBOptions-3.0 10 | Libs/LibSharedMedia-3.0: https://repos.wowace.com/wow/libsharedmedia-3-0/trunk/LibSharedMedia-3.0 11 | Libs/LibCandyBar-3.0: https://repos.wowace.com/wow/libcandybar-3-0/trunk/LibCandyBar-3.0 12 | Libs/LibChatAnims: https://repos.wowace.com/wow/libchatanims/trunk/LibChatAnims 13 | Libs/AceDB-3.0: https://repos.wowace.com/wow/ace3/trunk/AceDB-3.0 14 | 15 | move-folders: 16 | Capping/Options: Capping_Options 17 | 18 | ignore: 19 | - .luacheckrc 20 | -------------------------------------------------------------------------------- /Capping.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 110105, 110107, 110100 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core.lua 32 | Modules\AlteracValley.lua 33 | Modules\ArathiBasin.lua 34 | Modules\Arena.lua 35 | Modules\Ashran.lua 36 | Modules\DeephaulRavine.lua 37 | Modules\DeepwindGorge.lua 38 | Modules\EyeOfTheStorm.lua 39 | Modules\Gilneas.lua 40 | Modules\IsleOfConquest.lua 41 | Modules\QueueTimers.lua 42 | Modules\WarsongGulchTwinPeaks.lua 43 | Modules\Wintergrasp.lua 44 | 45 | modules.xml 46 | -------------------------------------------------------------------------------- /Capping_Cata.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 40402, 40401 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core_Wrath.lua 32 | Modules\AlteracValley_Wrath.lua 33 | Modules\ArathiBasin_Wrath.lua 34 | Modules\Arena_Classic.lua 35 | Modules\EyeOfTheStorm_Wrath.lua 36 | Modules\Gilneas.lua 37 | Modules\IsleOfConquest_Wrath.lua 38 | Modules\QueueTimers_Wrath.lua 39 | Modules\WarsongGulchTwinPeaks.lua 40 | 41 | modules.xml 42 | -------------------------------------------------------------------------------- /Capping_Mists.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 50500 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core_Wrath.lua 32 | Modules\AlteracValley_Wrath.lua 33 | Modules\ArathiBasin_Wrath.lua 34 | Modules\Arena_Classic.lua 35 | Modules\DeepwindGorge.lua 36 | Modules\EyeOfTheStorm_Wrath.lua 37 | Modules\Gilneas.lua 38 | Modules\IsleOfConquest_Wrath.lua 39 | Modules\QueueTimers_Wrath.lua 40 | Modules\WarsongGulchTwinPeaks.lua 41 | 42 | modules.xml 43 | -------------------------------------------------------------------------------- /Capping_TBC.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 20504 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core_BCC.lua 32 | Modules\AlteracValley_TBC.lua 33 | Modules\ArathiBasin_Classic.lua 34 | Modules\Arena_Classic.lua 35 | Modules\EyeOfTheStorm_TBC.lua 36 | Modules\QueueTimers_TBC.lua 37 | Modules\WarsongGulchTwinPeaks.lua 38 | 39 | modules.xml 40 | -------------------------------------------------------------------------------- /Capping_Vanilla.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 11506, 11507 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core_Vanilla.lua 32 | Modules\AlteracValley_Vanilla.lua 33 | Modules\ArathiBasin_Classic.lua 34 | Modules\QueueTimers_Vanilla.lua 35 | Modules\WarsongGulchTwinPeaks.lua 36 | 37 | modules.xml 38 | -------------------------------------------------------------------------------- /Capping_Wrath.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 30404 2 | ## Version: @project-version@ 3 | ## Title: Capping 4 | ## Author: Funkydude 5 | ## Notes: Battleground timers and other PvP features. 6 | ## Notes-deDE: Battleground timers and other PvP features. 7 | ## Notes-ruRU: Battleground timers and other PvP features. 8 | ## Notes-zhCN: 战场计时工具和其他 PvP 特性。 9 | ## Notes-zhTW: Battleground timers and other PvP features. 10 | ## Notes-koKR: 전장 타이머와 기타 PvP 기능입니다. 11 | ## Notes-frFR: Battleground timers and other PvP features. 12 | ## Notes-esES: Battleground timers and other PvP features. 13 | ## Notes-esMX: Battleground timers and other PvP features. 14 | ## Notes-itIT: Battleground timers and other PvP features. 15 | ## Notes-ptBR: Battleground timers and other PvP features. 16 | ## SavedVariables: CappingSettings 17 | 18 | ## X-Category: Battlegrounds/PvP 19 | ## X-Credits: TotalPackage 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## OptionalDeps: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 22 | ## X-Embeds: Ace3, LibSharedMedia-3.0, LibCandyBar-3.0, LibChatAnims, LibDDI-1.0 23 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 24 | ## X-Curse-Project-ID: 20143 25 | ## X-WoWI-ID: 11177 26 | ## X-Wago-ID: Rn6VXOGd 27 | 28 | embeds.xml 29 | locales.xml 30 | 31 | Core_Wrath.lua 32 | Modules\AlteracValley_Wrath.lua 33 | Modules\ArathiBasin_Wrath.lua 34 | Modules\Arena_Classic.lua 35 | Modules\EyeOfTheStorm_Wrath.lua 36 | Modules\IsleOfConquest_Wrath.lua 37 | Modules\QueueTimers_Wrath.lua 38 | Modules\WarsongGulchTwinPeaks.lua 39 | 40 | modules.xml 41 | -------------------------------------------------------------------------------- /Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua: -------------------------------------------------------------------------------- 1 | --[[ $Id: CallbackHandler-1.0.lua 26 2022-12-12 15:09:39Z nevcairiel $ ]] 2 | local MAJOR, MINOR = "CallbackHandler-1.0", 8 3 | local CallbackHandler = LibStub:NewLibrary(MAJOR, MINOR) 4 | 5 | if not CallbackHandler then return end -- No upgrade needed 6 | 7 | local meta = {__index = function(tbl, key) tbl[key] = {} return tbl[key] end} 8 | 9 | -- Lua APIs 10 | local securecallfunction, error = securecallfunction, error 11 | local setmetatable, rawget = setmetatable, rawget 12 | local next, select, pairs, type, tostring = next, select, pairs, type, tostring 13 | 14 | 15 | local function Dispatch(handlers, ...) 16 | local index, method = next(handlers) 17 | if not method then return end 18 | repeat 19 | securecallfunction(method, ...) 20 | index, method = next(handlers, index) 21 | until not method 22 | end 23 | 24 | -------------------------------------------------------------------------- 25 | -- CallbackHandler:New 26 | -- 27 | -- target - target object to embed public APIs in 28 | -- RegisterName - name of the callback registration API, default "RegisterCallback" 29 | -- UnregisterName - name of the callback unregistration API, default "UnregisterCallback" 30 | -- UnregisterAllName - name of the API to unregister all callbacks, default "UnregisterAllCallbacks". false == don't publish this API. 31 | 32 | function CallbackHandler.New(_self, target, RegisterName, UnregisterName, UnregisterAllName) 33 | 34 | RegisterName = RegisterName or "RegisterCallback" 35 | UnregisterName = UnregisterName or "UnregisterCallback" 36 | if UnregisterAllName==nil then -- false is used to indicate "don't want this method" 37 | UnregisterAllName = "UnregisterAllCallbacks" 38 | end 39 | 40 | -- we declare all objects and exported APIs inside this closure to quickly gain access 41 | -- to e.g. function names, the "target" parameter, etc 42 | 43 | 44 | -- Create the registry object 45 | local events = setmetatable({}, meta) 46 | local registry = { recurse=0, events=events } 47 | 48 | -- registry:Fire() - fires the given event/message into the registry 49 | function registry:Fire(eventname, ...) 50 | if not rawget(events, eventname) or not next(events[eventname]) then return end 51 | local oldrecurse = registry.recurse 52 | registry.recurse = oldrecurse + 1 53 | 54 | Dispatch(events[eventname], eventname, ...) 55 | 56 | registry.recurse = oldrecurse 57 | 58 | if registry.insertQueue and oldrecurse==0 then 59 | -- Something in one of our callbacks wanted to register more callbacks; they got queued 60 | for event,callbacks in pairs(registry.insertQueue) do 61 | local first = not rawget(events, event) or not next(events[event]) -- test for empty before. not test for one member after. that one member may have been overwritten. 62 | for object,func in pairs(callbacks) do 63 | events[event][object] = func 64 | -- fire OnUsed callback? 65 | if first and registry.OnUsed then 66 | registry.OnUsed(registry, target, event) 67 | first = nil 68 | end 69 | end 70 | end 71 | registry.insertQueue = nil 72 | end 73 | end 74 | 75 | -- Registration of a callback, handles: 76 | -- self["method"], leads to self["method"](self, ...) 77 | -- self with function ref, leads to functionref(...) 78 | -- "addonId" (instead of self) with function ref, leads to functionref(...) 79 | -- all with an optional arg, which, if present, gets passed as first argument (after self if present) 80 | target[RegisterName] = function(self, eventname, method, ... --[[actually just a single arg]]) 81 | if type(eventname) ~= "string" then 82 | error("Usage: "..RegisterName.."(eventname, method[, arg]): 'eventname' - string expected.", 2) 83 | end 84 | 85 | method = method or eventname 86 | 87 | local first = not rawget(events, eventname) or not next(events[eventname]) -- test for empty before. not test for one member after. that one member may have been overwritten. 88 | 89 | if type(method) ~= "string" and type(method) ~= "function" then 90 | error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - string or function expected.", 2) 91 | end 92 | 93 | local regfunc 94 | 95 | if type(method) == "string" then 96 | -- self["method"] calling style 97 | if type(self) ~= "table" then 98 | error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): self was not a table?", 2) 99 | elseif self==target then 100 | error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): do not use Library:"..RegisterName.."(), use your own 'self'", 2) 101 | elseif type(self[method]) ~= "function" then 102 | error("Usage: "..RegisterName.."(\"eventname\", \"methodname\"): 'methodname' - method '"..tostring(method).."' not found on self.", 2) 103 | end 104 | 105 | if select("#",...)>=1 then -- this is not the same as testing for arg==nil! 106 | local arg=select(1,...) 107 | regfunc = function(...) self[method](self,arg,...) end 108 | else 109 | regfunc = function(...) self[method](self,...) end 110 | end 111 | else 112 | -- function ref with self=object or self="addonId" or self=thread 113 | if type(self)~="table" and type(self)~="string" and type(self)~="thread" then 114 | error("Usage: "..RegisterName.."(self or \"addonId\", eventname, method): 'self or addonId': table or string or thread expected.", 2) 115 | end 116 | 117 | if select("#",...)>=1 then -- this is not the same as testing for arg==nil! 118 | local arg=select(1,...) 119 | regfunc = function(...) method(arg,...) end 120 | else 121 | regfunc = method 122 | end 123 | end 124 | 125 | 126 | if events[eventname][self] or registry.recurse<1 then 127 | -- if registry.recurse<1 then 128 | -- we're overwriting an existing entry, or not currently recursing. just set it. 129 | events[eventname][self] = regfunc 130 | -- fire OnUsed callback? 131 | if registry.OnUsed and first then 132 | registry.OnUsed(registry, target, eventname) 133 | end 134 | else 135 | -- we're currently processing a callback in this registry, so delay the registration of this new entry! 136 | -- yes, we're a bit wasteful on garbage, but this is a fringe case, so we're picking low implementation overhead over garbage efficiency 137 | registry.insertQueue = registry.insertQueue or setmetatable({},meta) 138 | registry.insertQueue[eventname][self] = regfunc 139 | end 140 | end 141 | 142 | -- Unregister a callback 143 | target[UnregisterName] = function(self, eventname) 144 | if not self or self==target then 145 | error("Usage: "..UnregisterName.."(eventname): bad 'self'", 2) 146 | end 147 | if type(eventname) ~= "string" then 148 | error("Usage: "..UnregisterName.."(eventname): 'eventname' - string expected.", 2) 149 | end 150 | if rawget(events, eventname) and events[eventname][self] then 151 | events[eventname][self] = nil 152 | -- Fire OnUnused callback? 153 | if registry.OnUnused and not next(events[eventname]) then 154 | registry.OnUnused(registry, target, eventname) 155 | end 156 | end 157 | if registry.insertQueue and rawget(registry.insertQueue, eventname) and registry.insertQueue[eventname][self] then 158 | registry.insertQueue[eventname][self] = nil 159 | end 160 | end 161 | 162 | -- OPTIONAL: Unregister all callbacks for given selfs/addonIds 163 | if UnregisterAllName then 164 | target[UnregisterAllName] = function(...) 165 | if select("#",...)<1 then 166 | error("Usage: "..UnregisterAllName.."([whatFor]): missing 'self' or \"addonId\" to unregister events for.", 2) 167 | end 168 | if select("#",...)==1 and ...==target then 169 | error("Usage: "..UnregisterAllName.."([whatFor]): supply a meaningful 'self' or \"addonId\"", 2) 170 | end 171 | 172 | 173 | for i=1,select("#",...) do 174 | local self = select(i,...) 175 | if registry.insertQueue then 176 | for eventname, callbacks in pairs(registry.insertQueue) do 177 | if callbacks[self] then 178 | callbacks[self] = nil 179 | end 180 | end 181 | end 182 | for eventname, callbacks in pairs(events) do 183 | if callbacks[self] then 184 | callbacks[self] = nil 185 | -- Fire OnUnused callback? 186 | if registry.OnUnused and not next(callbacks) then 187 | registry.OnUnused(registry, target, eventname) 188 | end 189 | end 190 | end 191 | end 192 | end 193 | end 194 | 195 | return registry 196 | end 197 | 198 | 199 | -- CallbackHandler purposefully does NOT do explicit embedding. Nor does it 200 | -- try to upgrade old implicit embeds since the system is selfcontained and 201 | -- relies on closures to work. 202 | 203 | -------------------------------------------------------------------------------- /Libs/LibStub/LibStub.lua: -------------------------------------------------------------------------------- 1 | -- $Id: LibStub.lua 76 2007-09-03 01:50:17Z mikk $ 2 | -- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/wiki/LibStub for more info 3 | -- LibStub is hereby placed in the Public Domain 4 | -- Credits: Kaelten, Cladhaire, ckknight, Mikk, Ammo, Nevcairiel, joshborke 5 | local LIBSTUB_MAJOR, LIBSTUB_MINOR = "LibStub", 2 -- NEVER MAKE THIS AN SVN REVISION! IT NEEDS TO BE USABLE IN ALL REPOS! 6 | local LibStub = _G[LIBSTUB_MAJOR] 7 | 8 | -- Check to see is this version of the stub is obsolete 9 | if not LibStub or LibStub.minor < LIBSTUB_MINOR then 10 | LibStub = LibStub or {libs = {}, minors = {} } 11 | _G[LIBSTUB_MAJOR] = LibStub 12 | LibStub.minor = LIBSTUB_MINOR 13 | 14 | -- LibStub:NewLibrary(major, minor) 15 | -- major (string) - the major version of the library 16 | -- minor (string or number ) - the minor version of the library 17 | -- 18 | -- returns nil if a newer or same version of the lib is already present 19 | -- returns empty library object or old library object if upgrade is needed 20 | function LibStub:NewLibrary(major, minor) 21 | assert(type(major) == "string", "Bad argument #2 to `NewLibrary' (string expected)") 22 | minor = assert(tonumber(strmatch(minor, "%d+")), "Minor version must either be a number or contain a number.") 23 | 24 | local oldminor = self.minors[major] 25 | if oldminor and oldminor >= minor then return nil end 26 | self.minors[major], self.libs[major] = minor, self.libs[major] or {} 27 | return self.libs[major], oldminor 28 | end 29 | 30 | -- LibStub:GetLibrary(major, [silent]) 31 | -- major (string) - the major version of the library 32 | -- silent (boolean) - if true, library is optional, silently return nil if its not found 33 | -- 34 | -- throws an error if the library can not be found (except silent is set) 35 | -- returns the library object if found 36 | function LibStub:GetLibrary(major, silent) 37 | if not self.libs[major] and not silent then 38 | error(("Cannot find a library instance of %q."):format(tostring(major)), 2) 39 | end 40 | return self.libs[major], self.minors[major] 41 | end 42 | 43 | -- LibStub:IterateLibraries() 44 | -- 45 | -- Returns an iterator for the currently registered libraries 46 | function LibStub:IterateLibraries() 47 | return pairs(self.libs) 48 | end 49 | 50 | setmetatable(LibStub, { __call = LibStub.GetLibrary }) 51 | end 52 | -------------------------------------------------------------------------------- /Locales/deDE.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "deDE" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "Schlachtfeld beginnt" 7 | L.finalScore = "Endstand: %d - %d" 8 | L.flagRespawns = "Flaggen" 9 | L.timeRemaining = "Verbleibende Zeit" 10 | 11 | L.takenTheFlagTrigger = "^(.+) hat die Fahne erobert!" 12 | L.hasTakenTheTrigger = "eingenommen!" 13 | L.droppedTrigger = "fallen lassen!" 14 | L.capturedTheTrigger = "errungen!" 15 | 16 | L.hordeGate = "Hordentor" 17 | L.allianceGate = "Allianztor" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "West" 20 | L.front = "Vorne" 21 | L.east = "Ost" 22 | L.hordeBoss = "Hordenboss" 23 | L.allianceBoss = "Allianzboss" 24 | L.galvangar = "Galvangar" -- Hauptmann Galvangar 25 | L.balinda = "Balinda" -- Hauptmann Balinda Steinbruch 26 | L.ivus = "Ivus" -- Ivus der Waldlord 27 | L.lokholar = "Lokholar" -- Lokholar der Eislord 28 | L.handIn = "|cFF33FF99Capping|r: Gebe Quest-Gegenstände automatisch ab." 29 | L.anchorTooltip = "|cffeda55fRechtsklick|r, um auf die Optionen zuzugreifen" 30 | L.anchorTooltipNote = "Öffne die Optionen und sperre die Balken, um diesen beweglichen Anker auszublenden." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Gnomenmechaniker: Ich hab's gleich! Haltet die Horde von hier fern. Kämpfen stand in der Ingenieursschule nicht auf dem 34 | -- Gnomenmechaniker: Es ist schon kaputt?! Ach, keine Sorge, nichts, was ich nicht reparieren kann. 35 | --- Horde IoC Workshop yells: 36 | -- Goblinmechaniker: Ich hab's gleich! Haltet mir die Allianz vom Leib. Kämpfen steht nicht in meinem Vertrag! 37 | -- Goblinmechaniker: Schon wieder kaputt?! Ich werde es richten... Ihr solltet allerdings nicht davon ausgehen, dass das noch unter die Garantie 38 | L.halfway = "gleich!" 39 | L.broken = "kaputt?" 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s beschädigt" 43 | L.destroyed = "|cFF33FF99Capping|r: %s zerstört" 44 | L.northEastKeep = "Nord-östlicher Festungsturm" 45 | L.southEastKeep = "Süd-östlicher Festungsturm" 46 | L.northWestKeep = "Nord-westlicher Festungsturm" 47 | L.southWestKeep = "Süd-westlicher Festungsturm" 48 | L.northWest = "Nord-westliche Wand" 49 | L.southWest = "Süd-westliche Wand" 50 | L.south = "Südliche Wand" 51 | L.southEast = "Süd-östliche Wand" 52 | L.northEast = "Nord-östliche Wand" 53 | L.innerWest = "Innere westliche Wand" 54 | L.innerSouth = "Innere südliche Wand" 55 | L.innerEast = "Innere östliche Wand" 56 | L.southGate = "Südliches Tor" 57 | L.mainEntrance = "Haupteingang" 58 | L.westTower = "Westlicher Turm" 59 | L.southTower = "Südlicher Turm" 60 | L.eastTower = "Östlicher Turm" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "Horde Wächter" 64 | L.allianceGuardian = "Allianz Wächter" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "Der Arenakampf hat begonnen!" 70 | L.arenaStart60s = "Noch eine Minute bis der Arenakampf beginnt!" 71 | L.arenaStart30s = "Noch dreißig Sekunden bis der Arenakampf beginnt!" 72 | L.arenaStart15s = "Noch fünfzehn Sekunden bis der Arenakampf beginnt!" 73 | -------------------------------------------------------------------------------- /Locales/enUS.lua: -------------------------------------------------------------------------------- 1 | 2 | local _, mod = ... 3 | mod.L = {} 4 | local L = mod.L 5 | 6 | L.battleBegins = "Battle Begins" 7 | L.finalScore = "Final: %d - %d" 8 | L.flagRespawns = "Flag respawns" 9 | L.timeRemaining = "Time Remaining" 10 | 11 | L.takenTheFlagTrigger = "^(.+) has taken the flag!" 12 | L.hasTakenTheTrigger = "has taken the" 13 | L.droppedTrigger = "dropped" 14 | L.capturedTheTrigger = "captured the" 15 | 16 | L.hordeGate = "Horde Gate" 17 | L.allianceGate = "Alliance Gate" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "West" 20 | L.front = "Front" 21 | L.east = "East" 22 | L.hordeBoss = "Horde Boss" 23 | L.allianceBoss = "Alliance Boss" 24 | L.galvangar = "Galvangar" 25 | L.balinda = "Balinda" 26 | L.ivus = "Ivus" 27 | L.lokholar = "Lokholar" 28 | L.handIn = "|cFF33FF99Capping|r: Automatically handing in quest items." 29 | L.anchorTooltip = "|cffeda55fRight-Click|r to access options" 30 | L.anchorTooltipNote = "Open the options and lock the bars to hide this moving anchor." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Gnomish Mechanic yells: I'm halfway there! Keep the Horde away from here. They don't teach fighting in engineering school! 34 | -- Gnomish Mechanic yells: It's broken already?! No worries. It's nothing I can't fix. 35 | --- Horde IoC Workshop yells: 36 | -- Goblin Mechanic yells: I'm about halfway done! Keep the Alliance away - fighting's not in my contract! 37 | -- Goblin Mechanic yells: It's broken again?! I'll fix it... just don't expect the warranty to cover this. 38 | L.halfway = "halfway" -- Needs to match the in game text exactly 39 | L.broken = "broken" -- Needs to match the in game text exactly 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s Damaged" 43 | L.destroyed = "|cFF33FF99Capping|r: %s Destroyed" 44 | L.northEastKeep = "North-East Fortress Tower" 45 | L.southEastKeep = "South-East Fortress Tower" 46 | L.northWestKeep = "North-West Fortress Tower" 47 | L.southWestKeep = "South-West Fortress Tower" 48 | L.northWest = "North-West Wall" 49 | L.southWest = "South-West Wall" 50 | L.south = "South Wall" 51 | L.southEast = "South-East Wall" 52 | L.northEast = "North-East Wall" 53 | L.innerWest = "Inner-West Wall" 54 | L.innerSouth = "Inner-South Wall" 55 | L.innerEast = "Inner-East Wall" 56 | L.southGate = "South Gate" 57 | L.mainEntrance = "Main Entrance" 58 | L.westTower = "West Tower" 59 | L.southTower = "South Tower" 60 | L.eastTower = "East Tower" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "Horde Guardian" 64 | L.allianceGuardian = "Alliance Guardian" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "The Arena battle has begun!" -- Needs to match the in game text exactly 70 | L.arenaStart60s = "One minute until the Arena battle begins!" -- Needs to match the in game text exactly 71 | L.arenaStart30s = "Thirty seconds until the Arena battle begins!" -- Needs to match the in game text exactly 72 | L.arenaStart15s = "Fifteen seconds until the Arena battle begins!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/esES.lua: -------------------------------------------------------------------------------- 1 | if GetLocale() ~= "esES" then return end 2 | local _, mod = ... 3 | local L = mod.L 4 | 5 | L.battleBegins = "La batalla ha comenzado" 6 | L.finalScore = "Final: %d - %d" 7 | L.flagRespawns = "La bandera se ha restablecido" 8 | L.timeRemaining = "Tiempo" 9 | 10 | L.takenTheFlagTrigger = "^(.+) ha cogido la bandera!" 11 | L.hasTakenTheTrigger = "ha cogido" 12 | L.droppedTrigger = "soltado" 13 | L.capturedTheTrigger = "capturado" 14 | 15 | L.hordeGate = "Puerta de la Horda" 16 | L.allianceGate = "Puerta de la Alianza" 17 | L.gatePosition = "%s (%s)" 18 | L.west = "Oeste" 19 | L.front = "Frente" 20 | L.east = "Este" 21 | L.hordeBoss = "Jefe de la Horda" 22 | L.allianceBoss = "Jefe de la Alianza" 23 | L.galvangar = "Galvangar" 24 | L.balinda = "Balinda" 25 | L.ivus = "Ivus" -- Ivus el Señor del Bosque 26 | L.lokholar = "Lokholar" -- Lokholar el Señor del Hielo 27 | L.handIn = "|cFF33FF99Capping|r: Entregando objetos de misión automáticamente." 28 | L.anchorTooltip = "|cffeda55fRight-Clic|r para acceder a las opciones" 29 | L.anchorTooltipNote = "Abre las opciones y bloquea las barras para esconder este ancla móvil." 30 | 31 | --- Alliance IoC Workshop yells: 32 | -- Mecánico gnomo grita: ¡Estoy a medias! Mantén a la Horda alejada de aquí. ¡En la escuela de ingeniería no enseñan a luchar! 33 | -- Mecánico gnomo grita: ¿Ya está rota? No pasa nada. No es nada que no pueda arreglar. 34 | --- Horde IoC Workshop yells: 35 | -- Mecánico goblin grita: ¡Ya casi estoy! Mantén a la Alianza alejada... ¡Luchar no entra en mi contrato! 36 | -- Mecánico goblin grita: ¿Está estropeada otra vez? Lo arreglaré... pero no esperes que la garantía cubra esto. 37 | L.halfway = "alejada" -- Needs to match the in game text exactly 38 | L.broken = "arreglar" -- Needs to match the in game text exactly 39 | 40 | -- Wintergrasp 41 | L.damaged = "|cFF33FF99Capping|r: %s Dañado" 42 | L.destroyed = "|cFF33FF99Capping|r: %s Destruido" 43 | L.northEastKeep = "Torre de la Fortaleza Noreste" 44 | L.southEastKeep = "Torre de la Fortaleza Sureste" 45 | L.northWestKeep = "Torre de la Fortaleza Noroeste" 46 | L.southWestKeep = "Torre de la Fortaleza Suroeste" 47 | L.northWest = "Muralla del Noroeste" 48 | L.southWest = "Muralla del Suroeste" 49 | L.south = "Muralla del Sur" 50 | L.southEast = "Muralla del Sureste" 51 | L.northEast = "Muralla del Noreste" 52 | L.innerWest = "Muralla interior Oeste" 53 | L.innerSouth = "Muralla interior Sur" 54 | L.innerEast = "Muralla interior Este" 55 | L.southGate = "Puerta del Sur" 56 | L.mainEntrance = "Entrada principal" 57 | L.westTower = "Torre del Oeste" 58 | L.southTower = "Torre del Sur" 59 | L.eastTower = "Torre del Este" 60 | 61 | -- Ashran 62 | L.hordeGuardian = "Guardián de la Horda" 63 | L.allianceGuardian = "Guardián de la Alianza" 64 | L.kronus = "Kronus" 65 | L.fangraal = "Fangraal" 66 | 67 | -- Arena 68 | L.arenaStartTrigger = "¡La batalla de arena ha comenzado!" -- Needs to match the in game text exactly 69 | L.arenaStart60s = "¡Un minuto hasta que comience la batalla de arena!" -- Needs to match the in game text exactly 70 | L.arenaStart30s = "¡Treinta segundos hasta que comience la batalla de arena!" -- Needs to match the in game text exactly 71 | L.arenaStart15s = "¡Quince segundos para que comience la batalla de arena!" -- Needs to match the in game text exactly 72 | -------------------------------------------------------------------------------- /Locales/esMX.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "esMX" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "La batalla ha comenzado" 7 | L.finalScore = "Final: %d - %d" 8 | L.flagRespawns = "La bandera se ha restablecido" 9 | L.timeRemaining = "Tiempo" 10 | 11 | L.takenTheFlagTrigger = "^(.+) ha cogido la bandera!" 12 | L.hasTakenTheTrigger = "ha cogido" 13 | L.droppedTrigger = "soltado" 14 | L.capturedTheTrigger = "capturado" 15 | 16 | L.hordeGate = "Puerta de la Horda" 17 | L.allianceGate = "Puerta de la Alianza" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "Oeste" 20 | L.front = "Frente" 21 | L.east = "Este" 22 | L.hordeBoss = "Jefe de la Horda" 23 | L.allianceBoss = "Jefe de la Alianza" 24 | L.galvangar = "Galvangar" 25 | L.balinda = "Balinda" 26 | L.ivus = "Ivus" -- Ivus el Señor del Bosque 27 | L.lokholar = "Lokholar" -- Lokholar el Señor del Hielo 28 | L.handIn = "|cFF33FF99Capping|r: Entregando objetos de misión automáticamente." 29 | L.anchorTooltip = "|cffeda55fRight-Clic|r para acceder a las opciones" 30 | L.anchorTooltipNote = "Abre las opciones y bloquea las barras para esconder este ancla móvil." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Mecánico gnomo grita: ¡Estoy a medias! Mantén a la Horda alejada de aquí. ¡En la escuela de ingeniería no enseñan a luchar! 34 | -- Mecánico gnomo grita: ¿Ya está rota? No pasa nada. No es nada que no pueda arreglar. 35 | --- Horde IoC Workshop yells: 36 | -- Mecánico goblin grita: ¡Ya casi estoy! Mantén a la Alianza alejada... ¡Luchar no entra en mi contrato! 37 | -- Mecánico goblin grita: ¿Está estropeada otra vez? Lo arreglaré... pero no esperes que la garantía cubra esto. 38 | L.halfway = "alejada" -- Needs to match the in game text exactly 39 | L.broken = "arreglar" -- Needs to match the in game text exactly 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s Dañada" 43 | L.destroyed = "|cFF33FF99Capping|r: %s Destruida" 44 | L.northEastKeep = "Torre de la Fortaleza Noreste" 45 | L.southEastKeep = "Torre de la Fortaleza Sureste" 46 | L.northWestKeep = "Torre de la Fortaleza Noroeste" 47 | L.southWestKeep = "Torre de la Fortaleza Suroeste" 48 | L.northWest = "Muralla del Noroeste" 49 | L.southWest = "Muralla del Suroeste" 50 | L.south = "Muralla del Sur" 51 | L.southEast = "Muralla del Sureste" 52 | L.northEast = "Muralla del Noreste" 53 | L.innerWest = "Muralla interior Oeste" 54 | L.innerSouth = "Muralla interior Sur" 55 | L.innerEast = "Muralla interior Este" 56 | L.southGate = "Puerta del Sur" 57 | L.mainEntrance = "Entrada principal" 58 | L.westTower = "Torre del Oeste" 59 | L.southTower = "Torre del Sur" 60 | L.eastTower = "Torre del Este" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "Guardián de la Horda" 64 | L.allianceGuardian = "Guardián de la Alianza" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "¡La batalla de arena ha comenzado!" -- Needs to match the in game text exactly 70 | L.arenaStart60s = "¡Un minuto hasta que comience la batalla de arena!" -- Needs to match the in game text exactly 71 | L.arenaStart30s = "¡Treinta segundos hasta que comience la batalla de arena!" -- Needs to match the in game text exactly 72 | L.arenaStart15s = "¡Quince segundos para que comience la batalla de arena!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/frFR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "frFR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "Début de la bataille" 7 | L.finalScore = "Final : %d - %d" 8 | L.flagRespawns = "Réapparition drapeau(x)" 9 | L.timeRemaining = "Temps restant" 10 | 11 | L.takenTheFlagTrigger = "^(.+) a pris le drapeau !" 12 | L.hasTakenTheTrigger = "s'est emparée" 13 | L.droppedTrigger = "a été lâché" 14 | L.capturedTheTrigger = "a pris le drapeau de" 15 | 16 | L.hordeGate = "Porte de la Horde" 17 | L.allianceGate = "Porte de l'Alliance" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "Ouest" 20 | L.front = "Devant" 21 | L.east = "Est" 22 | L.hordeBoss = "Chef de la Horde" 23 | L.allianceBoss = "Chef de l'Alliance" 24 | L.galvangar = "Galvangar" -- Capitaine Galvangar 25 | L.balinda = "Balinda" -- Capitaine Balinda Gîtepierre 26 | L.ivus = "Ivus" -- Ivus le Seigneur de la forêt 27 | L.lokholar = "Lokholar" -- Lokholar le Seigneur des glaces 28 | L.handIn = "|cFF33FF99Capping|r: Remise automatique des objets de quête." 29 | L.anchorTooltip = "|cffeda55fClic droit|r pour accéder aux options." 30 | L.anchorTooltipNote = "Ouvre les options et verrouille les barres afin de cacher l'ancre à déplacer." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Mécano gnome crie : J'en suis à la moitié ! Tenez la Horde à distance. On n'apprend pas à se battre dans les écoles d'ingénieurs ! 34 | -- Mécano gnome crie : Déjà cassé ?! Pas de souci. Ce n'est que je ne puisse pas réparer. 35 | --- Horde IoC Workshop yells: 36 | -- Mécano goblin crie : J'en suis à la moitié ! Tenez l'alliance à distance - combattre n'est pas dans mon contrat ! 37 | -- Mécano goblin crie : C'est déjà cassé ?! Je le répare... Ne pensez pas que la garantie va couvrir ça. 38 | L.halfway = "moitié" 39 | L.broken = "cassé" 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s endommagé" 43 | L.destroyed = "|cFF33FF99Capping|r: %s détruit" 44 | L.northEastKeep = "Tour de la Forteresse Nord-Est" 45 | L.southEastKeep = "Tour de la Forteresse Sud-Est" 46 | L.northWestKeep = "Tour de la Forteresse Nord-Ouest" 47 | L.southWestKeep = "Tour de la Forteresse Sud-Ouest" 48 | L.northWest = "Mur Nord-Ouest" 49 | L.southWest = "Mur Sud-Ouest" 50 | L.south = "Mur Sud" 51 | L.southEast = "Mur Sud-Est" 52 | L.northEast = "Mur Nord-Est" 53 | L.innerWest = "Mur intérieur Ouest" 54 | L.innerSouth = "Mur intérieur Sud" 55 | L.innerEast = "Mur intérieur Est" 56 | L.southGate = "Porte Sud" 57 | L.mainEntrance = "Entrée principale" 58 | L.westTower = "Tour Ouest" 59 | L.southTower = "Tour Sud" 60 | L.eastTower = "Tour Est" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "Gardien de la Horde" 64 | L.allianceGuardian = "Gardien de l'Alliance" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Crograal" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "Le combat commence !" -- Needs to match the in game text exactly 70 | L.arenaStart60s = "Le combat d'arène commence dans une minute !" -- Needs to match the in game text exactly 71 | L.arenaStart30s = "Le combat d'arène commence dans trente secondes !" -- Needs to match the in game text exactly 72 | L.arenaStart15s = "Le combat d'arène commence dans quinze secondes !" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/itIT.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "itIT" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --L.battleBegins = "Battle Begins" 7 | --L.finalScore = "Final: %d - %d" 8 | --L.flagRespawns = "Flag respawns" 9 | L.timeRemaining = "Tempo restante" 10 | 11 | --L.takenTheFlagTrigger = "^(.+) has taken the flag!" 12 | --L.hasTakenTheTrigger = "has taken the" 13 | --L.droppedTrigger = "dropped" 14 | --L.capturedTheTrigger = "captured the" 15 | 16 | --L.hordeGate = "Horde Gate" 17 | --L.allianceGate = "Alliance Gate" 18 | --L.gatePosition = "%s (%s)" 19 | --L.west = "West" 20 | --L.front = "Front" 21 | --L.east = "East" 22 | --L.hordeBoss = "Horde Boss" 23 | --L.allianceBoss = "Alliance Boss" 24 | --L.galvangar = "Galvangar" 25 | --L.balinda = "Balinda" 26 | L.ivus = "Ivus" -- Ivus il Signore della Foresta 27 | L.lokholar = "Lokholar" -- Lokholar il Signore del Ghiaccio 28 | --L.handIn = "|cFF33FF99Capping|r: Automatically handing in quest items." 29 | L.anchorTooltip = "|cffeda55fClic-Destro|r per aprire le Opzioni" 30 | --L.anchorTooltipNote = "Open the options and lock the bars to hide this moving anchor." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Gnomish Mechanic yells: I'm halfway there! Keep the Horde away from here. They don't teach fighting in engineering school! 34 | -- Gnomish Mechanic yells: It's broken already?! No worries. It's nothing I can't fix. 35 | --- Horde IoC Workshop yells: 36 | -- Goblin Mechanic yells: I'm about halfway done! Keep the Alliance away - fighting's not in my contract! 37 | -- Goblin Mechanic yells: It's broken again?! I'll fix it... just don't expect the warranty to cover this. 38 | --L.halfway = "halfway" -- Needs to match the in game text exactly 39 | --L.broken = "broken" -- Needs to match the in game text exactly 40 | 41 | -- Wintergrasp 42 | --L.damaged = "|cFF33FF99Capping|r: %s Damaged" 43 | --L.destroyed = "|cFF33FF99Capping|r: %s Destroyed" 44 | --L.northEastKeep = "North-East Fortress Tower" 45 | --L.southEastKeep = "South-East Fortress Tower" 46 | --L.northWestKeep = "North-West Fortress Tower" 47 | --L.southWestKeep = "South-West Fortress Tower" 48 | --L.northWest = "North-West Wall" 49 | --L.southWest = "South-West Wall" 50 | --L.south = "South Wall" 51 | --L.southEast = "South-East Wall" 52 | --L.northEast = "North-East Wall" 53 | --L.innerWest = "Inner-West Wall" 54 | --L.innerSouth = "Inner-South Wall" 55 | --L.innerEast = "Inner-East Wall" 56 | --L.southGate = "South Gate" 57 | --L.mainEntrance = "Main Entrance" 58 | --L.westTower = "West Tower" 59 | --L.southTower = "South Tower" 60 | --L.eastTower = "East Tower" 61 | 62 | -- Ashran 63 | --L.hordeGuardian = "Horde Guardian" 64 | --L.allianceGuardian = "Alliance Guardian" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | --L.arenaStartTrigger = "The Arena battle has begun!" -- Needs to match the in game text exactly 70 | --L.arenaStart60s = "One minute until the Arena battle begins!" -- Needs to match the in game text exactly 71 | --L.arenaStart30s = "Thirty seconds until the Arena battle begins!" -- Needs to match the in game text exactly 72 | --L.arenaStart15s = "Fifteen seconds until the Arena battle begins!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/koKR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "koKR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "전투 개시" 7 | L.finalScore = "종료: %d - %d" 8 | L.flagRespawns = "깃발 생성" 9 | L.timeRemaining = "남은 시간" 10 | 11 | L.takenTheFlagTrigger = "^(.+)|1이;가; 깃발을 차지했습니다!" 12 | L.hasTakenTheTrigger = "점령했습니다" 13 | L.droppedTrigger = "([^ ]*)|1이;가; ([^!]*) 깃발을 떨어뜨렸습니다!" 14 | L.capturedTheTrigger = "([^ ]*)|1이;가; ([^!]*) 깃발 쟁탈에 성공했습니다!" 15 | 16 | L.hordeGate = "호드 관문" 17 | L.allianceGate = "얼라이언스 관문" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "서쪽" 20 | L.front = "정면" 21 | L.east = "동쪽" 22 | L.hordeBoss = "호드 우두머리" 23 | L.allianceBoss = "얼라이언스 우두머리" 24 | L.galvangar = "갈반가르" 25 | L.balinda = "발린다" 26 | L.ivus = "이부스" 27 | L.lokholar = "로크홀라" 28 | L.handIn = "|cFF33FF99Capping|r: 퀘스트 아이템 자동 반납 중." 29 | L.anchorTooltip = "옵션에 접근하려면 |cffeda55f오른쪽 클릭|r하세요" 30 | L.anchorTooltipNote = "옵션을 열고 바를 잠그면 이 이동 앵커가 숨겨집니다." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- 노움 정비사의 외침: 반쯤 됐다고! 호드가 절 못 때리게 해주세요. 기계 공학 학교에서는 싸움은 안 가르친다구요! 34 | -- 노움 정비사의 외침: 벌써 부서졌어요?! 괜찮아요. 제가 못 고칠 정도는 아니에요. 35 | --- Horde IoC Workshop yells: 36 | -- 고블린 정비사의 외침: 반쯤 됐다고! 얼라이언스 놈들이 가까이 못 오게 해줘. 계약서에 전투 얘긴 없었다고! 37 | -- 고블린 정비사의 외침: 또 부서졌어요?! 제가 고쳐드릴게요... 다만 보증이 적용될 거라고 기대하지 마세요. 38 | L.halfway = "반쯤" -- Needs to match the in game text exactly 39 | L.broken = "부서" -- Needs to match the in game text exactly 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s 손상됨" 43 | L.destroyed = "|cFF33FF99Capping|r: %s 파괴됨" 44 | L.northEastKeep = "북동쪽 요새 탑" 45 | L.southEastKeep = "남동쪽 요새 탑" 46 | L.northWestKeep = "북서쪽 요새 탑" 47 | L.southWestKeep = "남서쪽 요새 탑" 48 | L.northWest = "북서쪽 벽" 49 | L.southWest = "남서쪽 벽" 50 | L.south = "남쪽 벽" 51 | L.southEast = "남동쪽 벽" 52 | L.northEast = "북동쪽 벽" 53 | L.innerWest = "서쪽 내벽" 54 | L.innerSouth = "남쪽 내벽" 55 | L.innerEast = "동쪽 내벽" 56 | L.southGate = "남쪽 관문" 57 | L.mainEntrance = "정문" 58 | L.westTower = "서쪽 탑" 59 | L.southTower = "남쪽 탑" 60 | L.eastTower = "동쪽 탑" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "호드 수호자" 64 | L.allianceGuardian = "얼라이언스 수호자" 65 | L.kronus = "크로너스" 66 | L.fangraal = "팡그랄" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "투기장 전투가 시작되었습니다!" -- Needs to match the in game text exactly 70 | L.arenaStart60s = "투기장 전투 시작 1분 전입니다!" -- Needs to match the in game text exactly 71 | L.arenaStart30s = "투기장 전투 시작 30초 전입니다!" -- Needs to match the in game text exactly 72 | L.arenaStart15s = "투기장 전투 시작 15초 전입니다!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/ptBR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "ptBR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "Batalha Começa" 7 | L.finalScore = "Final: %d - %d" 8 | L.flagRespawns = "Bandeira reaparece" 9 | L.timeRemaining = "Tempo restante" 10 | 11 | L.takenTheFlagTrigger = "^(.+) pegou a bandeira!" 12 | --L.hasTakenTheTrigger = "has taken the" 13 | L.droppedTrigger = "largada" 14 | L.capturedTheTrigger = "capturou" 15 | 16 | L.hordeGate = "Portão da Horda" 17 | L.allianceGate = "Portão da Aliança" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "Oeste" 20 | L.front = "Frente" 21 | L.east = "Leste" 22 | L.hordeBoss = "Chefe da Horda" 23 | L.allianceBoss = "Chefe da Aliança" 24 | L.galvangar = "Galvangar" 25 | L.balinda = "Balinda" 26 | L.ivus = "Ivus" 27 | L.lokholar = "Lokholar" 28 | L.handIn = "|cFF33FF99Capping|r: Automaticamente entregando items de quest." 29 | L.anchorTooltip = "|cffeda55fClique-Direito|r para acessar as opções" 30 | --L.anchorTooltipNote = "Open the options and lock the bars to hide this moving anchor." 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Mecânico Gnômico grita: Estou na metade do caminho! Mantenha a Horda longe. Não ensinam luta na faculdade de engenharia! 34 | -- Mecânico Gnômico grita: Já quebrou?! Não esquenta. Não é nada que eu não possa consertar. 35 | --- Horde IoC Workshop yells: 36 | -- Mecânico Goblin grita: Estou quase acabando! Mantenha a Aliança longe de mim. Lutar não está no meu contrato! 37 | -- Mecânico Goblin grita: Quebrou de novo?! Eu conserto... Mas não fique esperando que a garantia cubra isso. 38 | L.halfway = "[Ll]utar? " 39 | L.broken = "uebrou" 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s Danificada" 43 | L.destroyed = "|cFF33FF99Capping|r: %s Destruída" 44 | L.northEastKeep = "Torre Nordeste da Fortaleza" 45 | L.southEastKeep = "Torre Sudeste da Fortaleza" 46 | L.northWestKeep = "Torre Noroeste da Fortaleza" 47 | L.southWestKeep = "Torre Sudoeste da Fortaleza" 48 | L.northWest = "Muralha Noroeste" 49 | L.southWest = "Muralha Sudoeste" 50 | L.south = "Muralha Sul" 51 | L.southEast = "Muralha Suldeste" 52 | L.northEast = "Muralha Nordeste" 53 | L.innerWest = "Muralha Interior Oeste" 54 | L.innerSouth = "Muralha Interior Sul" 55 | L.innerEast = "Muralha Interior Leste" 56 | L.southGate = "Portão Sul" 57 | L.mainEntrance = "Entrada Principal" 58 | L.westTower = "Torre Oeste" 59 | L.southTower = "Torre Sul" 60 | L.eastTower = "Torre Leste" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "Guardião da Horda" 64 | L.allianceGuardian = "Guardião da Aliança" 65 | L.kronus = "Kronus" 66 | L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | --L.arenaStartTrigger = "The Arena battle has begun!" -- Needs to match the in game text exactly 70 | --L.arenaStart60s = "One minute until the Arena battle begins!" -- Needs to match the in game text exactly 71 | --L.arenaStart30s = "Thirty seconds until the Arena battle begins!" -- Needs to match the in game text exactly 72 | --L.arenaStart15s = "Fifteen seconds until the Arena battle begins!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/ruRU.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "ruRU" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "Начало сражения" 7 | L.finalScore = "Финал: %d - %d" 8 | L.flagRespawns = "Появление Флагов" 9 | L.timeRemaining = "Осталось" 10 | 11 | L.takenTheFlagTrigger = "^(.+) захватывает флаг!" 12 | L.hasTakenTheTrigger = "захватил" 13 | L.droppedTrigger = "уронил" 14 | L.capturedTheTrigger = "захватил" 15 | 16 | L.hordeGate = "Врата крепости Орды" 17 | L.allianceGate = "Врата крепости Альянса" 18 | L.gatePosition = "%s (%s)" -- тут точно нужен перевод?// check on live 19 | L.west = "Запад" 20 | L.front = "Передовая" -- тут еще вопрос (!) проверить на проде // spellcheck on live 21 | L.east = "Восток" 22 | L.hordeBoss = "Босс Орды" 23 | L.allianceBoss = "Босс Альянса" 24 | L.galvangar = "Гальвангар" -- Капитан Гальвангар <Капитан клана Северного Волка> 25 | L.balinda = "Балинда" -- Капитан Балинда Каменный Очаг <Капитан клана Грозовой Вершины> 26 | L.ivus = "Ивус" -- Ивус Лесной Властелин 27 | L.lokholar = "Локолар" -- Локолар Владыка Льда 28 | L.handIn = "|cFF33FF99Capping|r: Автоматическая сдача квестовых предметов." -- проверить на проде // spellcheck on live 29 | L.anchorTooltip = "|cffeda55fПравый клик|r открыть настройки" 30 | --L.anchorTooltipNote = "Open the options and lock the bars to hide this moving anchor." 31 | 32 | --- Alliance IoC Workshop yells: 33 | --Гном-механик кричит: Я уже почти закончил! Только не подпускай ко мне Орду – в инженерной школе не учат махать мечом! 34 | --Гном-механик кричит: Уже сломалась? Не о чем беспокоиться. Я могу починить что угодно. 35 | --- Horde IoC Workshop yells: 36 | --Гоблинский механик кричит: я на полпути! Держите Альянс подальше - боевые действия не входят в мой контракт! 37 | --Механик Гоблин кричит: «Он снова сломан ?!» Я исправлю это ... просто не ожидайте, что гарантия покроет это. 38 | L.halfway = " по[^ ]+ти[! ]" 39 | L.broken = "слома" 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s подвергается нападению" -- проверить на проде, подумать над универсальным вариантом // spellcheck on live 43 | L.destroyed = "|cFF33FF99Capping|r: %s разрушена" -- проверить на проде, подумать над универсальным вариантом // spellcheck on live 44 | L.northEastKeep = "Северо-восточная башня крепости" 45 | L.southEastKeep = "Юго-восточная башня крепости" 46 | L.northWestKeep = "Северо-западная башня крепости" 47 | L.southWestKeep = "Юго-западная башня крепости" 48 | L.northWest = "Северо-западная стена" 49 | L.southWest = "Юго-западная стена" 50 | L.south = "Юная стена" 51 | L.southEast = "Юго-восточная стена" 52 | L.northEast = "Северо-восточная стена" 53 | L.innerWest = "Внутренняя западная стена" 54 | L.innerSouth = "Внутренняя южная стена" 55 | L.innerEast = "Внутренняя востовная стена" 56 | L.southGate = "Южные ворота" 57 | L.mainEntrance = "Главный вход" 58 | L.westTower = "Западная башня" 59 | L.southTower = "Южная башня" 60 | L.eastTower = "Восточная башня" 61 | 62 | -- Ashran 63 | --L.hordeGuardian = "Horde Guardian" 64 | --L.allianceGuardian = "Alliance Guardian" 65 | L.kronus = "Крон" 66 | L.fangraal = "Фанграал" 67 | 68 | -- Arena 69 | --L.arenaStartTrigger = "The Arena battle has begun!" -- Needs to match the in game text exactly 70 | --L.arenaStart60s = "One minute until the Arena battle begins!" -- Needs to match the in game text exactly 71 | --L.arenaStart30s = "Thirty seconds until the Arena battle begins!" -- Needs to match the in game text exactly 72 | --L.arenaStart15s = "Fifteen seconds until the Arena battle begins!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Locales/zhCN.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "zhCN" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "战斗即将开始" 7 | L.finalScore = "最终:%d - %d" 8 | L.flagRespawns = "旗帜即将刷新" 9 | L.timeRemaining = "剩余时间" 10 | 11 | L.takenTheFlagTrigger = "^(.+)夺走了旗帜!" 12 | L.hasTakenTheTrigger = "夺取了" 13 | L.droppedTrigger = "丢掉了" 14 | L.capturedTheTrigger = "夺取" 15 | 16 | L.hordeGate = "部落大门" 17 | L.allianceGate = "联盟大门" 18 | L.gatePosition = "%s(%s)" 19 | L.west = "机场" 20 | L.front = "工坊" 21 | L.east = "码头" 22 | L.hordeBoss = "部落将军" 23 | L.allianceBoss = "联盟将军" 24 | L.galvangar = "加尔范上尉" 25 | L.balinda = "巴琳达" 26 | L.ivus = "伊弗斯" 27 | L.lokholar = "洛克霍拉" 28 | L.handIn = "|cFF33FF99Capping|r: 自动交任务物品。" 29 | L.anchorTooltip = "|cffeda55f右击|r打开选项" 30 | L.anchorTooltipNote = "打开选项并锁定来隐藏移动锚点。" 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- 侏儒技师喊道:我就要完成了!挡住那帮部落的家伙。他们可不是在工程学校进行战斗教学! 34 | -- 侏儒技师喊道:它已经坏了?!别担心,没有我修不好的。 35 | --- Horde IoC Workshop yells: 36 | -- 地精机械师喊道:我就要完成了!挡住那帮联盟的家伙,合同上没说我还得打仗! 37 | -- 地精机械师喊道:它又坏了?!我会把它修好……但我可不保证它一定能好用。 38 | L.halfway = "我就要完成了" 39 | L.broken = "坏了" 40 | 41 | -- Wintergrasp 冬拥湖之战 42 | L.damaged = "|cFF33FF99Capping|r: %s 遭到破坏" 43 | L.destroyed = "|cFF33FF99Capping|r: %s 被摧毁了" 44 | L.northEastKeep = "东北堡垒塔楼" 45 | L.southEastKeep = "东南堡垒塔楼" 46 | L.northWestKeep = "西北堡垒塔楼" 47 | L.southWestKeep = "西南堡垒塔楼" 48 | L.northWest = "西北城墙" 49 | L.southWest = "东南城墙" 50 | L.south = "南城墙" 51 | L.southEast = "东南城墙" 52 | L.northEast = "东北城墙" 53 | L.innerWest = "西内墙" 54 | L.innerSouth = "南内墙" 55 | L.innerEast = "东内墙" 56 | L.southGate = "堡垒大门(南)" 57 | L.mainEntrance = "堡垒塔楼之门(最后一面墙)" 58 | L.westTower = "影目塔楼(西塔)" 59 | L.southTower = "冬缘塔楼(南塔)" 60 | L.eastTower = "火光塔楼(东塔)" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "部落守卫" 64 | L.allianceGuardian = "联盟守卫" 65 | L.kronus = "克鲁努斯" 66 | L.fangraal = "范加尔" 67 | 68 | -- Arena 69 | L.arenaStartTrigger = "竞技场战斗开始了!" 70 | L.arenaStart60s = "竞技场战斗将在一分钟后开始!" 71 | L.arenaStart30s = "竞技场战斗将在三十秒后开始!" 72 | L.arenaStart15s = "竞技场战斗将在十五秒后开始!" 73 | -------------------------------------------------------------------------------- /Locales/zhTW.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "zhTW" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | L.battleBegins = "開始" 7 | L.finalScore = "預估最終比數:%d - %d" 8 | L.flagRespawns = "旗幟已重置" 9 | L.timeRemaining = "剩餘時間" 10 | 11 | L.takenTheFlagTrigger = "^(.+)已經奪走了旗幟!" 12 | L.hasTakenTheTrigger = "奪取了" 13 | L.droppedTrigger = "丟掉了" 14 | L.capturedTheTrigger = "佔據了" 15 | 16 | L.hordeGate = "部落大門" 17 | L.allianceGate = "聯盟大門" 18 | L.gatePosition = "%s (%s)" 19 | L.west = "碼頭" 20 | L.front = "工坊" 21 | L.east = "機場" 22 | L.hordeBoss = "部落將軍" 23 | L.allianceBoss = "聯盟將軍" 24 | L.galvangar = "加爾凡加" 25 | L.balinda = "巴琳達" 26 | L.ivus = "伊弗斯" 27 | L.lokholar = "洛克霍拉" 28 | L.handIn = "|cFF33FF99Capping|r: 自動上交任務物品。" 29 | L.anchorTooltip = "|cffeda55f右鍵點擊|r打開選項" 30 | L.anchorTooltipNote = "打開選項,並鎖定位置,就能隱藏此綠色移動錨點。" 31 | 32 | --- Alliance IoC Workshop yells: 33 | -- Gnomish Mechanic yells: I'm halfway there! Keep the Horde away from here. They don't teach fighting in engineering school! 34 | -- Gnomish Mechanic yells: It's broken already?! No worries. It's nothing I can't fix. 35 | --- Horde IoC Workshop yells: 36 | -- Goblin Mechanic yells: I'm about halfway done! Keep the Alliance away - fighting's not in my contract! 37 | -- Goblin Mechanic yells: It's broken again?! I'll fix it... just don't expect the warranty to cover this. 38 | --L.halfway = "halfway" -- Needs to match the in game text exactly 39 | --L.broken = "broken" -- Needs to match the in game text exactly 40 | 41 | -- Wintergrasp 42 | L.damaged = "|cFF33FF99Capping|r: %s 受到攻擊" 43 | L.destroyed = "|cFF33FF99Capping|r: %s 被摧毀了" 44 | L.northEastKeep = "冬握保壘哨塔 (東北)" 45 | L.southEastKeep = "冬握保壘哨塔 (東南)" 46 | L.northWestKeep = "冬握保壘哨塔 (西北)" 47 | L.southWestKeep = "冬握保壘哨塔 (西南)" 48 | L.northWest = "西北城牆" 49 | L.southWest = "西南城牆" 50 | L.south = "南面城牆" 51 | L.southEast = "東南城牆" 52 | L.northEast = "東北城牆" 53 | L.innerWest = "西面內牆" 54 | L.innerSouth = "南面內牆" 55 | L.innerEast = "東面內牆" 56 | L.southGate = "冬握堡壘城門" 57 | L.mainEntrance = "冬握堡壘大門" 58 | L.westTower = "西側焰望哨塔" 59 | L.southTower = "南側冬際哨塔" 60 | L.eastTower = "東側影景哨塔" 61 | 62 | -- Ashran 63 | L.hordeGuardian = "部落守衛" 64 | L.allianceGuardian = "聯盟守衛" 65 | --L.kronus = "Kronus" 66 | --L.fangraal = "Fangraal" 67 | 68 | -- Arena 69 | --L.arenaStartTrigger = "The Arena battle has begun!" -- Needs to match the in game text exactly 70 | --L.arenaStart60s = "One minute until the Arena battle begins!" -- Needs to match the in game text exactly 71 | --L.arenaStart30s = "Thirty seconds until the Arena battle begins!" -- Needs to match the in game text exactly 72 | --L.arenaStart15s = "Fifteen seconds until the Arena battle begins!" -- Needs to match the in game text exactly 73 | -------------------------------------------------------------------------------- /Modules/AlteracValley.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | do 9 | local UnitGUID, strsplit, GetNumGossipActiveQuests, SelectGossipActiveQuest = UnitGUID, strsplit, C_GossipInfo.GetNumActiveQuests, C_GossipInfo.SelectActiveQuest 10 | local tonumber, GetGossipOptions = tonumber, C_GossipInfo.GetOptions 11 | local GetItemCount = C_Item and C_Item.GetItemCount or GetItemCount -- XXX 10.2.6 12 | local blockedIds = { 13 | [30907] = true, -- alliance 14 | [30908] = true, -- alliance 15 | [30909] = true, -- alliance 16 | [35739] = true, -- horde 17 | [35740] = true, -- horde 18 | [35741] = true, -- horde 19 | } 20 | function mod:GOSSIP_SHOW() 21 | if not cap.db.profile.autoTurnIn then return end 22 | 23 | local target = UnitGUID("npc") 24 | if target then 25 | local _, _, _, _, _, id = strsplit("-", target) 26 | local mobId = tonumber(id) 27 | if mobId == 13176 or mobId == 13257 then -- Smith Regzar, Murgot Deepforge 28 | -- Open Quest to Smith or Murgot 29 | if self:GetGossipID(30904) then -- Alliance 30 | self:SelectGossipID(30904) -- Upgrade to seasoned units! 31 | elseif self:GetGossipID(30905) then -- Alliance 32 | self:SelectGossipID(30905) -- Upgrade to veteran units! 33 | elseif self:GetGossipID(30906) then -- Alliance 34 | self:SelectGossipID(30906) -- Upgrade to champion units! 35 | elseif self:GetGossipID(35736) then -- Horde 36 | self:SelectGossipID(35736) -- Upgrade to seasoned units! 37 | elseif self:GetGossipID(35737) then -- Horde 38 | self:SelectGossipID(35737) -- Upgrade to veteran units! 39 | elseif self:GetGossipID(35738) then -- Horde 40 | self:SelectGossipID(35738) -- Upgrade to champion units! 41 | else 42 | local gossipOptions = GetGossipOptions() 43 | if gossipOptions[1] then 44 | for i = 1, #gossipOptions do 45 | local gossipTable = gossipOptions[i] 46 | if not blockedIds[gossipTable.gossipOptionID] then 47 | print("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS!", gossipTable.gossipOptionID, mobId, gossipTable.name) 48 | geterrorhandler()("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS! ".. tostring(gossipTable.gossipOptionID) ..", ".. mobId ..", ".. tostring(gossipTable.name)) 49 | BasicMessageDialog.Text:SetText("Capping error, see chat for details") 50 | BasicMessageDialog:Show() 51 | return 52 | end 53 | end 54 | end 55 | end 56 | 57 | if GetItemCount(17422) >= 20 then -- Armor Scraps 17422 58 | if self:GetGossipAvailableQuestID(6781) then -- Alliance, More Armor Scraps 59 | self:SelectGossipAvailableQuestID(6781) 60 | elseif self:GetGossipAvailableQuestID(6741) then -- Horde, More Booty! 61 | self:SelectGossipAvailableQuestID(6741) 62 | elseif self:GetGossipAvailableQuestID(57318) then -- Horde, More Booty! [Specific to Korrak's Revenge] 63 | self:SelectGossipAvailableQuestID(57318) 64 | elseif self:GetGossipAvailableQuestID(57306) then -- Alliance, More Armor Scraps [Specific to Korrak's Revenge] 65 | self:SelectGossipAvailableQuestID(57306) 66 | end 67 | end 68 | elseif mobId == 13236 then -- Horde, Primalist Thurloga 69 | local num = GetItemCount(17306) -- Stormpike Soldier's Blood 17306 70 | if num > 0 then 71 | if GetNumGossipActiveQuests() > 0 then 72 | local tbl = C_GossipInfo.GetActiveQuests() 73 | for i = 1, #tbl do 74 | local questTable = tbl[i] 75 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 76 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 77 | end 78 | return 79 | SelectGossipActiveQuest(1) 80 | elseif self:GetGossipAvailableQuestID(7385) and num >= 5 then -- A Gallon of Blood 81 | self:SelectGossipAvailableQuestID(7385) 82 | elseif self:GetGossipAvailableQuestID(6801) then -- Lokholar the Ice Lord 83 | self:SelectGossipAvailableQuestID(6801) 84 | end 85 | end 86 | elseif mobId == 13442 then -- Alliance, Archdruid Renferal 87 | local num = GetItemCount(17423) -- Storm Crystal 17423 88 | if num > 0 then 89 | if GetNumGossipActiveQuests() > 0 then 90 | local tbl = C_GossipInfo.GetActiveQuests() 91 | for i = 1, #tbl do 92 | local questTable = tbl[i] 93 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 94 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 95 | end 96 | return 97 | SelectGossipActiveQuest(1) 98 | elseif self:GetGossipAvailableQuestID(7386) and num >= 5 then -- Crystal Cluster 99 | self:SelectGossipAvailableQuestID(7386) 100 | elseif self:GetGossipAvailableQuestID(6881) then -- Ivus the Forest Lord 101 | self:SelectGossipAvailableQuestID(6881) 102 | end 103 | end 104 | elseif mobId == 13577 then -- Alliance, Stormpike Ram Rider Commander 105 | -- Only in Korrak's Revenge on retail 106 | if GetItemCount(17643) > 0 then -- Frost Wolf Hide 17643 107 | if self:GetGossipAvailableQuestID(7026) then 108 | self:SelectGossipAvailableQuestID(7026) 109 | else 110 | print("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 111 | geterrorhandler()("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 112 | end 113 | end 114 | elseif mobId == 13441 then -- Horde, Frostwolf Wolf Rider Commander 115 | -- Only in Korrak's Revenge on retail 116 | if GetItemCount(17642) > 0 then -- Alterac Ram Hide 17642 117 | if self:GetGossipAvailableQuestID(7002) then 118 | self:SelectGossipAvailableQuestID(7002) -- Ram Hide Harnesses 119 | else 120 | print("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 121 | geterrorhandler()("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 122 | end 123 | end 124 | end 125 | end 126 | end 127 | end 128 | 129 | do 130 | local hasPrinted = false 131 | local function allowPrints() 132 | hasPrinted = false 133 | end 134 | local IsQuestCompletable, CompleteQuest = IsQuestCompletable, CompleteQuest 135 | function mod:QUEST_PROGRESS() 136 | if not cap.db.profile.autoTurnIn then return end 137 | if IsQuestCompletable() then 138 | CompleteQuest() 139 | if not hasPrinted then 140 | hasPrinted = true 141 | C_Timer.After(10, allowPrints) 142 | print(L.handIn) 143 | end 144 | end 145 | end 146 | end 147 | 148 | do 149 | local GetNumQuestRewards, GetQuestReward = GetNumQuestRewards, GetQuestReward 150 | function mod:QUEST_COMPLETE() 151 | if not cap.db.profile.autoTurnIn then return end 152 | if GetNumQuestRewards() == 0 then 153 | GetQuestReward(0) 154 | end 155 | end 156 | end 157 | 158 | local NewTicker = C_Timer.NewTicker 159 | local hereFromTheStart, hasData = true, true 160 | local stopTimer = nil 161 | local function allow() hereFromTheStart = false end 162 | local function stop() hereFromTheStart = true hasData = true stopTimer = nil end 163 | local GetScoreInfo = C_PvP.GetScoreInfo 164 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 165 | local function AVSyncRequest() 166 | for i = 1, 80 do 167 | local scoreTbl = GetScoreInfo(i) 168 | if scoreTbl and scoreTbl.damageDone and scoreTbl.damageDone ~= 0 then 169 | hereFromTheStart = true 170 | hasData = false 171 | mod:Timer(0.5, allow) 172 | stopTimer = NewTicker(3, stop, 1) 173 | SendAddonMessage("Capping", "tr", "INSTANCE_CHAT") 174 | return 175 | end 176 | end 177 | 178 | hereFromTheStart = true 179 | hasData = true 180 | end 181 | 182 | do 183 | local timer = nil 184 | local function SendAVTimers() 185 | timer = nil 186 | if IsInGroup(2) then -- We've not just ragequit 187 | local str = "" 188 | for bar in next, CappingFrame.bars do 189 | local poiId = bar:Get("capping:poiid") 190 | if poiId then 191 | str = string.format("%s%d-%d~", str, poiId, math.floor(bar.remaining)) 192 | end 193 | end 194 | 195 | if str ~= "" and string.len(str) < 250 then 196 | SendAddonMessage("Capping", str, "INSTANCE_CHAT") 197 | end 198 | end 199 | end 200 | 201 | do 202 | local function Unwrap(self, ...) 203 | local inProgressDataTbl = {} 204 | for i = 1, select("#", ...) do 205 | local arg = select(i, ...) 206 | local id, remaining = strsplit("-", arg) 207 | if id and remaining then 208 | local widget, barTime = tonumber(id), tonumber(remaining) 209 | if widget and barTime and barTime > 5 and barTime < 245 then 210 | inProgressDataTbl[widget] = barTime 211 | end 212 | end 213 | end 214 | 215 | if next(inProgressDataTbl) then 216 | self:RestoreFlagCaptures(inProgressDataTbl, 242) 217 | end 218 | end 219 | 220 | local me = UnitName("player").. "-" ..GetRealmName() 221 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 222 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 223 | if msg == "tr" and sender ~= me then -- timer request 224 | if hasData then -- Joined a late game, don't send data 225 | if timer then timer:Cancel() end 226 | timer = NewTicker(1, SendAVTimers, 1) 227 | elseif stopTimer then 228 | stopTimer:Cancel() 229 | stopTimer = NewTicker(3, stop, 1) 230 | end 231 | elseif not hereFromTheStart and sender ~= me and msg:find("~", nil, true) then 232 | hereFromTheStart = true 233 | hasData = true 234 | Unwrap(self, strsplit("~", msg)) 235 | end 236 | end 237 | end 238 | end 239 | end 240 | 241 | do 242 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 243 | function mod:EnterZone(id) 244 | if id == 2197 then 245 | self:StartFlagCaptures(241) -- Korrak's Revenge (WoW 15th) 246 | else 247 | self:StartFlagCaptures(242) 248 | end 249 | self:SetupHealthCheck("11946", L.hordeBoss, "Horde Boss", 236452, "colorAlliance") -- Interface/Icons/Achievement_Character_Orc_Male 250 | self:SetupHealthCheck("11948", L.allianceBoss, "Alliance Boss", 236444, "colorHorde") -- Interface/Icons/Achievement_Character_Dwarf_Male 251 | self:SetupHealthCheck("11947", L.galvangar, "Galvangar", 236452, "colorAlliance") -- Interface/Icons/Achievement_Character_Orc_Male 252 | self:SetupHealthCheck("11949", L.balinda, "Balinda", 236447, "colorHorde") -- Interface/Icons/Achievement_Character_Human_Female 253 | self:SetupHealthCheck("13419", L.ivus, "Ivus", 874581, "colorAlliance") -- Interface/Icons/inv_pet_ancientprotector_winter 254 | self:SetupHealthCheck("13256", L.lokholar, "Lokholar", 1373132, "colorHorde") -- Interface/Icons/Inv_infernalmounice.blp 255 | self:RegisterEvent("CHAT_MSG_ADDON") 256 | self:RegisterEvent("GOSSIP_SHOW") 257 | self:RegisterEvent("QUEST_PROGRESS") 258 | self:RegisterEvent("QUEST_COMPLETE") 259 | RequestBattlefieldScoreData() 260 | self:Timer(1, function() RequestBattlefieldScoreData() end) 261 | self:Timer(2, AVSyncRequest) 262 | end 263 | end 264 | 265 | function mod:ExitZone() 266 | self:UnregisterEvent("GOSSIP_SHOW") 267 | self:UnregisterEvent("QUEST_PROGRESS") 268 | self:UnregisterEvent("QUEST_COMPLETE") 269 | self:UnregisterEvent("CHAT_MSG_ADDON") 270 | self:StopFlagCaptures() 271 | self:StopHealthCheck() 272 | end 273 | 274 | mod:RegisterZone(30) 275 | mod:RegisterZone(2197) -- Korrak's Revenge (WoW 15th) 276 | -------------------------------------------------------------------------------- /Modules/AlteracValley_TBC.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | do 9 | local UnitGUID, strsplit, GetNumGossipActiveQuests, SelectGossipActiveQuest = UnitGUID, strsplit, C_GossipInfo.GetNumActiveQuests, C_GossipInfo.SelectActiveQuest 10 | local tonumber, GetGossipOptions = tonumber, C_GossipInfo.GetOptions 11 | local GetItemCount = C_Item and C_Item.GetItemCount or GetItemCount -- XXX 10.2.6 12 | local blockedIds = { 13 | [30907] = true, -- alliance 14 | [30908] = true, -- alliance 15 | [30909] = true, -- alliance 16 | [35739] = true, -- horde 17 | [35740] = true, -- horde 18 | [35741] = true, -- horde 19 | } 20 | function mod:GOSSIP_SHOW() 21 | if not cap.db.profile.autoTurnIn then return end 22 | 23 | local target = UnitGUID("npc") 24 | if target then 25 | local _, _, _, _, _, id = strsplit("-", target) 26 | local mobId = tonumber(id) 27 | if mobId == 13176 or mobId == 13257 then -- Smith Regzar, Murgot Deepforge 28 | -- Open Quest to Smith or Murgot 29 | if self:GetGossipID(30904) then -- Alliance 30 | self:SelectGossipID(30904) -- Upgrade to seasoned units! 31 | elseif self:GetGossipID(30905) then -- Alliance 32 | self:SelectGossipID(30905) -- Upgrade to veteran units! 33 | elseif self:GetGossipID(30906) then -- Alliance 34 | self:SelectGossipID(30906) -- Upgrade to champion units! 35 | elseif self:GetGossipID(35736) then -- Horde 36 | self:SelectGossipID(35736) -- Upgrade to seasoned units! 37 | elseif self:GetGossipID(35737) then -- Horde 38 | self:SelectGossipID(35737) -- Upgrade to veteran units! 39 | elseif self:GetGossipID(35738) then -- Horde 40 | self:SelectGossipID(35738) -- Upgrade to champion units! 41 | else 42 | local gossipOptions = GetGossipOptions() 43 | if gossipOptions[1] then 44 | for i = 1, #gossipOptions do 45 | local gossipTable = gossipOptions[i] 46 | if not blockedIds[gossipTable.gossipOptionID] then 47 | print("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS!", gossipTable.gossipOptionID, mobId, gossipTable.name) 48 | geterrorhandler()("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS! ".. tostring(gossipTable.gossipOptionID) ..", ".. mobId ..", ".. tostring(gossipTable.name)) 49 | BasicMessageDialog.Text:SetText("Capping error, see chat for details") 50 | BasicMessageDialog:Show() 51 | return 52 | end 53 | end 54 | end 55 | end 56 | 57 | if GetItemCount(17422) >= 20 then -- Armor Scraps 17422 58 | if self:GetGossipAvailableQuestID(6781) then -- Alliance, More Armor Scraps 59 | self:SelectGossipAvailableQuestID(6781) 60 | elseif self:GetGossipAvailableQuestID(6741) then -- Horde, More Booty! 61 | self:SelectGossipAvailableQuestID(6741) 62 | elseif self:GetGossipAvailableQuestID(57318) then -- Horde, More Booty! [Specific to Korrak's Revenge] 63 | self:SelectGossipAvailableQuestID(57318) 64 | elseif self:GetGossipAvailableQuestID(57306) then -- Alliance, More Armor Scraps [Specific to Korrak's Revenge] 65 | self:SelectGossipAvailableQuestID(57306) 66 | end 67 | end 68 | elseif mobId == 13236 then -- Horde, Primalist Thurloga 69 | local num = GetItemCount(17306) -- Stormpike Soldier's Blood 17306 70 | if num > 0 then 71 | if GetNumGossipActiveQuests() > 0 then 72 | local tbl = C_GossipInfo.GetActiveQuests() 73 | for i = 1, #tbl do 74 | local questTable = tbl[i] 75 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 76 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 77 | end 78 | return 79 | SelectGossipActiveQuest(1) 80 | elseif self:GetGossipAvailableQuestID(7385) and num >= 5 then -- A Gallon of Blood 81 | self:SelectGossipAvailableQuestID(7385) 82 | elseif self:GetGossipAvailableQuestID(6801) then -- Lokholar the Ice Lord 83 | self:SelectGossipAvailableQuestID(6801) 84 | end 85 | end 86 | elseif mobId == 13442 then -- Alliance, Archdruid Renferal 87 | local num = GetItemCount(17423) -- Storm Crystal 17423 88 | if num > 0 then 89 | if GetNumGossipActiveQuests() > 0 then 90 | local tbl = C_GossipInfo.GetActiveQuests() 91 | for i = 1, #tbl do 92 | local questTable = tbl[i] 93 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 94 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 95 | end 96 | return 97 | SelectGossipActiveQuest(1) 98 | elseif self:GetGossipAvailableQuestID(7386) and num >= 5 then -- Crystal Cluster 99 | self:SelectGossipAvailableQuestID(7386) 100 | elseif self:GetGossipAvailableQuestID(6881) then -- Ivus the Forest Lord 101 | self:SelectGossipAvailableQuestID(6881) 102 | end 103 | end 104 | elseif mobId == 13577 then -- Alliance, Stormpike Ram Rider Commander 105 | if GetItemCount(17643) > 0 then -- Frost Wolf Hide 17643 106 | if self:GetGossipAvailableQuestID(7026) then 107 | self:SelectGossipAvailableQuestID(7026) 108 | else 109 | print("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 110 | geterrorhandler()("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 111 | end 112 | end 113 | elseif mobId == 13441 then -- Horde, Frostwolf Wolf Rider Commander 114 | if GetItemCount(17642) > 0 then -- Alterac Ram Hide 17642 115 | if self:GetGossipAvailableQuestID(7002) then 116 | self:SelectGossipAvailableQuestID(7002) -- Ram Hide Harnesses 117 | else 118 | print("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 119 | geterrorhandler()("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 120 | end 121 | end 122 | end 123 | end 124 | end 125 | end 126 | 127 | do 128 | local hasPrinted = false 129 | local function allowPrints() 130 | hasPrinted = false 131 | end 132 | local IsQuestCompletable, CompleteQuest = IsQuestCompletable, CompleteQuest 133 | function mod:QUEST_PROGRESS() 134 | if not cap.db.profile.autoTurnIn then return end 135 | if IsQuestCompletable() then 136 | CompleteQuest() 137 | if not hasPrinted then 138 | hasPrinted = true 139 | C_Timer.After(10, allowPrints) 140 | print(L.handIn) 141 | end 142 | end 143 | end 144 | end 145 | 146 | do 147 | local GetNumQuestRewards, GetQuestReward = GetNumQuestRewards, GetQuestReward 148 | function mod:QUEST_COMPLETE() 149 | if not cap.db.profile.autoTurnIn then return end 150 | if GetNumQuestRewards() == 0 then 151 | GetQuestReward(0) 152 | end 153 | end 154 | end 155 | 156 | local NewTicker = C_Timer.NewTicker 157 | local hereFromTheStart, hasData = true, true 158 | local stopTimer = nil 159 | local function allow() hereFromTheStart = false end 160 | local function stop() hereFromTheStart = true hasData = true stopTimer = nil end 161 | --local GetScoreInfo = C_PvP.GetScoreInfo 162 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 163 | local function AVSyncRequest() 164 | for i = 1, 80 do 165 | local _, _, _, _, _, _, _, _, _, _, damageDone = GetBattlefieldScore(i) 166 | if damageDone and damageDone ~= 0 then 167 | hereFromTheStart = true 168 | hasData = false 169 | mod:Timer(0.5, allow) 170 | stopTimer = NewTicker(3, stop, 1) 171 | SendAddonMessage("Capping", "tr", "INSTANCE_CHAT") 172 | return 173 | end 174 | end 175 | 176 | hereFromTheStart = true 177 | hasData = true 178 | end 179 | 180 | do 181 | local timer = nil 182 | local function SendAVTimers() 183 | timer = nil 184 | if IsInGroup(2) then -- We've not just ragequit 185 | local str = "" 186 | for bar in next, CappingFrame.bars do 187 | local poiId = bar:Get("capping:poiid") 188 | if poiId then 189 | str = string.format("%s%d-%d~", str, poiId, math.floor(bar.remaining)) 190 | end 191 | end 192 | 193 | if str ~= "" and string.len(str) < 250 then 194 | SendAddonMessage("Capping", str, "INSTANCE_CHAT") 195 | end 196 | end 197 | end 198 | 199 | do 200 | local function Unwrap(self, ...) 201 | local inProgressDataTbl = {} 202 | for i = 1, select("#", ...) do 203 | local arg = select(i, ...) 204 | local id, remaining = strsplit("-", arg) 205 | if id and remaining then 206 | local widget, barTime = tonumber(id), tonumber(remaining) 207 | if widget and barTime and barTime > 5 and barTime < 245 then 208 | inProgressDataTbl[widget] = barTime 209 | end 210 | end 211 | end 212 | 213 | if next(inProgressDataTbl) then 214 | self:RestoreFlagCaptures(inProgressDataTbl, 242) 215 | end 216 | end 217 | 218 | local me = UnitName("player").. "-" ..GetRealmName() 219 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 220 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 221 | if msg == "tr" and sender ~= me then -- timer request 222 | if hasData then -- Joined a late game, don't send data 223 | if timer then timer:Cancel() end 224 | timer = NewTicker(1, SendAVTimers, 1) 225 | elseif stopTimer then 226 | stopTimer:Cancel() 227 | stopTimer = NewTicker(3, stop, 1) 228 | end 229 | elseif not hereFromTheStart and sender ~= me and msg:find("~", nil, true) then 230 | hereFromTheStart = true 231 | hasData = true 232 | Unwrap(self, strsplit("~", msg)) 233 | end 234 | end 235 | end 236 | end 237 | end 238 | 239 | do 240 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 241 | function mod:EnterZone(id) 242 | if id == 2197 then 243 | self:StartFlagCaptures(241) -- Korrak's Revenge (WoW 15th) 244 | else 245 | self:StartFlagCaptures(245) 246 | end 247 | self:SetupHealthCheck("11946", L.hordeBoss, "Horde Boss", 134170, "colorAlliance") -- Interface/Icons/Inv_misc_head_orc_01 248 | self:SetupHealthCheck("11948", L.allianceBoss, "Alliance Boss", 134159, "colorHorde") -- Interface/Icons/inv_misc_head_dwarf_01 249 | self:SetupHealthCheck("11947", L.galvangar, "Galvangar", 134170, "colorAlliance") -- Interface/Icons/Inv_misc_head_orc_01 250 | self:SetupHealthCheck("11949", L.balinda, "Balinda", 134167, "colorHorde") -- Interface/Icons/inv_misc_head_human_02 251 | self:SetupHealthCheck("13419", L.ivus, "Ivus", 132129, "colorAlliance") -- Interface/Icons/ability_druid_forceofnature 252 | self:SetupHealthCheck("13256", L.lokholar, "Lokholar", 135861, "colorHorde") -- Interface/Icons/spell_frost_summonwaterelemental 253 | self:RegisterEvent("CHAT_MSG_ADDON") 254 | self:RegisterEvent("GOSSIP_SHOW") 255 | self:RegisterEvent("QUEST_PROGRESS") 256 | self:RegisterEvent("QUEST_COMPLETE") 257 | RequestBattlefieldScoreData() 258 | self:Timer(1, function() RequestBattlefieldScoreData() end) 259 | self:Timer(2, AVSyncRequest) 260 | end 261 | end 262 | 263 | function mod:ExitZone() 264 | self:UnregisterEvent("GOSSIP_SHOW") 265 | self:UnregisterEvent("QUEST_PROGRESS") 266 | self:UnregisterEvent("QUEST_COMPLETE") 267 | self:UnregisterEvent("CHAT_MSG_ADDON") 268 | self:StopFlagCaptures() 269 | self:StopHealthCheck() 270 | end 271 | 272 | mod:RegisterZone(30) 273 | mod:RegisterZone(2197) -- Korrak's Revenge (WoW 15th) 274 | -------------------------------------------------------------------------------- /Modules/AlteracValley_Vanilla.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | do 9 | local UnitGUID, strsplit, GetNumGossipActiveQuests, SelectGossipActiveQuest = UnitGUID, strsplit, C_GossipInfo.GetNumActiveQuests, C_GossipInfo.SelectActiveQuest 10 | local tonumber, GetGossipOptions = tonumber, C_GossipInfo.GetOptions 11 | local GetItemCount = C_Item and C_Item.GetItemCount or GetItemCount -- XXX 10.2.6 12 | local blockedIds = { 13 | [30907] = true, -- alliance 14 | [30908] = true, -- alliance 15 | [30909] = true, -- alliance 16 | [97828] = true, -- alliance (classic era) 17 | [97829] = true, -- alliance (classic era) 18 | [97830] = true, -- alliance (classic era) 19 | [35739] = true, -- horde 20 | [35740] = true, -- horde 21 | [35741] = true, -- horde 22 | [97507] = true, -- horde (classic era) 23 | [97508] = true, -- horde (classic era) 24 | [97509] = true, -- horde (classic era) 25 | } 26 | function mod:GOSSIP_SHOW() 27 | if not cap.db.profile.autoTurnIn then return end 28 | 29 | local target = UnitGUID("npc") 30 | if target then 31 | local _, _, _, _, _, id = strsplit("-", target) 32 | local mobId = tonumber(id) 33 | if mobId == 13176 or mobId == 13257 then -- Smith Regzar, Murgot Deepforge 34 | -- Open Quest to Smith or Murgot 35 | if self:GetGossipID(30904) then -- Alliance 36 | self:SelectGossipID(30904) -- Upgrade to seasoned units! 37 | elseif self:GetGossipID(30905) then -- Alliance 38 | self:SelectGossipID(30905) -- Upgrade to veteran units! 39 | elseif self:GetGossipID(30906) then -- Alliance 40 | self:SelectGossipID(30906) -- Upgrade to champion units! 41 | elseif self:GetGossipID(35736) then -- Horde 42 | self:SelectGossipID(35736) -- Upgrade to seasoned units! 43 | elseif self:GetGossipID(35737) then -- Horde 44 | self:SelectGossipID(35737) -- Upgrade to veteran units! 45 | elseif self:GetGossipID(35738) then -- Horde 46 | self:SelectGossipID(35738) -- Upgrade to champion units! 47 | -- Classic 48 | elseif self:GetGossipID(97833) then -- Alliance (classic era) 49 | self:SelectGossipID(97833) -- Upgrade to seasoned units! 50 | elseif self:GetGossipID(90270) then -- Alliance (WotLK classic) 51 | self:SelectGossipID(90270) -- Upgrade to seasoned units! 52 | elseif self:GetGossipID(97511) then -- Horde (classic era) 53 | self:SelectGossipID(97511) -- Upgrade to veteran units! 54 | elseif self:GetGossipID(97512) then -- Horde (classic era) 55 | self:SelectGossipID(97512) -- Upgrade to seasoned units! 56 | else 57 | local gossipOptions = GetGossipOptions() 58 | if gossipOptions[1] then 59 | for i = 1, #gossipOptions do 60 | local gossipTable = gossipOptions[i] 61 | if not blockedIds[gossipTable.gossipOptionID] then 62 | print("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS!", gossipTable.gossipOptionID, mobId, gossipTable.name) 63 | geterrorhandler()("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS! ".. tostring(gossipTable.gossipOptionID) ..", ".. mobId ..", ".. tostring(gossipTable.name)) 64 | BasicMessageDialog.Text:SetText("Capping error, see chat for details") 65 | BasicMessageDialog:Show() 66 | return 67 | end 68 | end 69 | end 70 | end 71 | 72 | if GetItemCount(17422) >= 20 then -- Armor Scraps 17422 73 | if self:GetGossipAvailableQuestID(6781) then -- Alliance, More Armor Scraps 74 | self:SelectGossipAvailableQuestID(6781) 75 | elseif self:GetGossipAvailableQuestID(6741) then -- Horde, More Booty! 76 | self:SelectGossipAvailableQuestID(6741) 77 | elseif self:GetGossipAvailableQuestID(57318) then -- Horde, More Booty! [Specific to Korrak's Revenge] 78 | self:SelectGossipAvailableQuestID(57318) 79 | elseif self:GetGossipAvailableQuestID(57306) then -- Alliance, More Armor Scraps [Specific to Korrak's Revenge] 80 | self:SelectGossipAvailableQuestID(57306) 81 | end 82 | end 83 | elseif mobId == 13236 then -- Horde, Primalist Thurloga 84 | local num = GetItemCount(17306) -- Stormpike Soldier's Blood 17306 85 | if num > 0 then 86 | if GetNumGossipActiveQuests() > 0 then 87 | local tbl = C_GossipInfo.GetActiveQuests() 88 | for i = 1, #tbl do 89 | local questTable = tbl[i] 90 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 91 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 92 | end 93 | return 94 | SelectGossipActiveQuest(1) 95 | elseif self:GetGossipAvailableQuestID(7385) and num >= 5 then -- A Gallon of Blood 96 | self:SelectGossipAvailableQuestID(7385) 97 | elseif self:GetGossipAvailableQuestID(6801) then -- Lokholar the Ice Lord 98 | self:SelectGossipAvailableQuestID(6801) 99 | end 100 | end 101 | elseif mobId == 13442 then -- Alliance, Archdruid Renferal 102 | local num = GetItemCount(17423) -- Storm Crystal 17423 103 | if num > 0 then 104 | if GetNumGossipActiveQuests() > 0 then 105 | local tbl = C_GossipInfo.GetActiveQuests() 106 | for i = 1, #tbl do 107 | local questTable = tbl[i] 108 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 109 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 110 | end 111 | return 112 | SelectGossipActiveQuest(1) 113 | elseif self:GetGossipAvailableQuestID(7386) and num >= 5 then -- Crystal Cluster 114 | self:SelectGossipAvailableQuestID(7386) 115 | elseif self:GetGossipAvailableQuestID(6881) then -- Ivus the Forest Lord 116 | self:SelectGossipAvailableQuestID(6881) 117 | end 118 | end 119 | elseif mobId == 13577 then -- Alliance, Stormpike Ram Rider Commander 120 | if GetItemCount(17643) > 0 then -- Frost Wolf Hide 17643 121 | if self:GetGossipAvailableQuestID(7026) then 122 | self:SelectGossipAvailableQuestID(7026) 123 | else 124 | print("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 125 | geterrorhandler()("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 126 | end 127 | end 128 | elseif mobId == 13441 then -- Horde, Frostwolf Wolf Rider Commander 129 | if GetItemCount(17642) > 0 then -- Alterac Ram Hide 17642 130 | if self:GetGossipAvailableQuestID(7002) then 131 | self:SelectGossipAvailableQuestID(7002) -- Ram Hide Harnesses 132 | else 133 | print("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 134 | geterrorhandler()("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 135 | end 136 | end 137 | end 138 | end 139 | end 140 | end 141 | 142 | do 143 | local hasPrinted = false 144 | local function allowPrints() 145 | hasPrinted = false 146 | end 147 | local IsQuestCompletable, CompleteQuest = IsQuestCompletable, CompleteQuest 148 | function mod:QUEST_PROGRESS() 149 | if not cap.db.profile.autoTurnIn then return end 150 | if IsQuestCompletable() then 151 | CompleteQuest() 152 | if not hasPrinted then 153 | hasPrinted = true 154 | C_Timer.After(10, allowPrints) 155 | print(L.handIn) 156 | end 157 | end 158 | end 159 | end 160 | 161 | do 162 | local GetNumQuestRewards, GetQuestReward = GetNumQuestRewards, GetQuestReward 163 | function mod:QUEST_COMPLETE() 164 | if not cap.db.profile.autoTurnIn then return end 165 | if GetNumQuestRewards() == 0 then 166 | GetQuestReward(0) 167 | end 168 | end 169 | end 170 | 171 | local NewTicker = C_Timer.NewTicker 172 | local hereFromTheStart, hasData = true, true 173 | local stopTimer = nil 174 | local function allow() hereFromTheStart = false end 175 | local function stop() hereFromTheStart = true hasData = true stopTimer = nil end 176 | --local GetScoreInfo = C_PvP.GetScoreInfo 177 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 178 | local function AVSyncRequest() 179 | for i = 1, 80 do 180 | local _, _, _, _, _, _, _, _, _, _, damageDone = GetBattlefieldScore(i) 181 | if damageDone and damageDone ~= 0 then 182 | hereFromTheStart = true 183 | hasData = false 184 | mod:Timer(0.5, allow) 185 | stopTimer = NewTicker(3, stop, 1) 186 | SendAddonMessage("Capping", "tr", "INSTANCE_CHAT") 187 | return 188 | end 189 | end 190 | 191 | hereFromTheStart = true 192 | hasData = true 193 | end 194 | 195 | do 196 | local timer = nil 197 | local function SendAVTimers() 198 | timer = nil 199 | if IsInGroup(2) then -- We've not just ragequit 200 | local str = "" 201 | for bar in next, CappingFrame.bars do 202 | local poiId = bar:Get("capping:poiid") 203 | if poiId then 204 | str = string.format("%s%d-%d~", str, poiId, math.floor(bar.remaining)) 205 | end 206 | end 207 | 208 | if str ~= "" and string.len(str) < 250 then 209 | SendAddonMessage("Capping", str, "INSTANCE_CHAT") 210 | end 211 | end 212 | end 213 | 214 | do 215 | local function Unwrap(self, ...) 216 | local inProgressDataTbl = {} 217 | for i = 1, select("#", ...) do 218 | local arg = select(i, ...) 219 | local id, remaining = strsplit("-", arg) 220 | if id and remaining then 221 | local widget, barTime = tonumber(id), tonumber(remaining) 222 | if widget and barTime and barTime > 5 and barTime < 245 then 223 | inProgressDataTbl[widget] = barTime 224 | end 225 | end 226 | end 227 | 228 | if next(inProgressDataTbl) then 229 | self:RestoreFlagCaptures(inProgressDataTbl, 242) 230 | end 231 | end 232 | 233 | local me = UnitName("player").. "-" ..GetRealmName() 234 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 235 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 236 | if msg == "tr" and sender ~= me then -- timer request 237 | if hasData then -- Joined a late game, don't send data 238 | if timer then timer:Cancel() end 239 | timer = NewTicker(1, SendAVTimers, 1) 240 | elseif stopTimer then 241 | stopTimer:Cancel() 242 | stopTimer = NewTicker(3, stop, 1) 243 | end 244 | elseif not hereFromTheStart and sender ~= me and msg:find("~", nil, true) then 245 | hereFromTheStart = true 246 | hasData = true 247 | Unwrap(self, strsplit("~", msg)) 248 | end 249 | end 250 | end 251 | end 252 | end 253 | 254 | do 255 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 256 | function mod:EnterZone(id) 257 | if id == 2197 then 258 | self:StartFlagCaptures(241) -- Korrak's Revenge (WoW 15th) 259 | else 260 | self:StartFlagCaptures(300) 261 | end 262 | self:SetupHealthCheck("11946", L.hordeBoss, "Horde Boss", 134170, "colorAlliance") -- Interface/Icons/Inv_misc_head_orc_01 263 | self:SetupHealthCheck("11948", L.allianceBoss, "Alliance Boss", 134159, "colorHorde") -- Interface/Icons/inv_misc_head_dwarf_01 264 | self:SetupHealthCheck("11947", L.galvangar, "Galvangar", 134170, "colorAlliance") -- Interface/Icons/Inv_misc_head_orc_01 265 | self:SetupHealthCheck("11949", L.balinda, "Balinda", 134167, "colorHorde") -- Interface/Icons/inv_misc_head_human_02 266 | self:SetupHealthCheck("13419", L.ivus, "Ivus", 132129, "colorAlliance") -- Interface/Icons/ability_druid_forceofnature 267 | self:SetupHealthCheck("13256", L.lokholar, "Lokholar", 135861, "colorHorde") -- Interface/Icons/spell_frost_summonwaterelemental 268 | self:RegisterEvent("CHAT_MSG_ADDON") 269 | self:RegisterEvent("GOSSIP_SHOW") 270 | self:RegisterEvent("QUEST_PROGRESS") 271 | self:RegisterEvent("QUEST_COMPLETE") 272 | RequestBattlefieldScoreData() 273 | self:Timer(1, function() RequestBattlefieldScoreData() end) 274 | self:Timer(2, AVSyncRequest) 275 | end 276 | end 277 | 278 | function mod:ExitZone() 279 | self:UnregisterEvent("GOSSIP_SHOW") 280 | self:UnregisterEvent("QUEST_PROGRESS") 281 | self:UnregisterEvent("QUEST_COMPLETE") 282 | self:UnregisterEvent("CHAT_MSG_ADDON") 283 | self:StopFlagCaptures() 284 | self:StopHealthCheck() 285 | end 286 | 287 | mod:RegisterZone(30) 288 | mod:RegisterZone(2197) -- Korrak's Revenge (WoW 15th) 289 | -------------------------------------------------------------------------------- /Modules/AlteracValley_Wrath.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | do 9 | local UnitGUID, strsplit, GetNumGossipActiveQuests, SelectGossipActiveQuest = UnitGUID, strsplit, C_GossipInfo.GetNumActiveQuests, C_GossipInfo.SelectActiveQuest 10 | local tonumber, GetGossipOptions = tonumber, C_GossipInfo.GetOptions 11 | local GetItemCount = C_Item and C_Item.GetItemCount or GetItemCount -- XXX 10.2.6 12 | local blockedIds = { 13 | [30907] = true, -- alliance 14 | [30908] = true, -- alliance 15 | [30909] = true, -- alliance 16 | [97828] = true, -- alliance (classic era) 17 | [97829] = true, -- alliance (classic era) 18 | [97830] = true, -- alliance (classic era) 19 | [35739] = true, -- horde 20 | [35740] = true, -- horde 21 | [35741] = true, -- horde 22 | [97507] = true, -- horde (classic era) 23 | [97508] = true, -- horde (classic era) 24 | [97509] = true, -- horde (classic era) 25 | } 26 | function mod:GOSSIP_SHOW() 27 | if not cap.db.profile.autoTurnIn then return end 28 | 29 | local target = UnitGUID("npc") 30 | if target then 31 | local _, _, _, _, _, id = strsplit("-", target) 32 | local mobId = tonumber(id) 33 | if mobId == 13176 or mobId == 13257 then -- Smith Regzar, Murgot Deepforge 34 | -- Open Quest to Smith or Murgot 35 | if self:GetGossipID(30904) then -- Alliance 36 | self:SelectGossipID(30904) -- Upgrade to seasoned units! 37 | elseif self:GetGossipID(30905) then -- Alliance 38 | self:SelectGossipID(30905) -- Upgrade to veteran units! 39 | elseif self:GetGossipID(30906) then -- Alliance 40 | self:SelectGossipID(30906) -- Upgrade to champion units! 41 | elseif self:GetGossipID(35736) then -- Horde 42 | self:SelectGossipID(35736) -- Upgrade to seasoned units! 43 | elseif self:GetGossipID(35737) then -- Horde 44 | self:SelectGossipID(35737) -- Upgrade to veteran units! 45 | elseif self:GetGossipID(35738) then -- Horde 46 | self:SelectGossipID(35738) -- Upgrade to champion units! 47 | -- Classic 48 | elseif self:GetGossipID(97833) then -- Alliance (classic era) 49 | self:SelectGossipID(97833) -- Upgrade to seasoned units! 50 | elseif self:GetGossipID(90270) then -- Alliance (WotLK classic) 51 | self:SelectGossipID(90270) -- Upgrade to seasoned units! 52 | elseif self:GetGossipID(97511) then -- Horde (classic era) 53 | self:SelectGossipID(97511) -- Upgrade to veteran units! 54 | elseif self:GetGossipID(97512) then -- Horde (classic era) 55 | self:SelectGossipID(97512) -- Upgrade to seasoned units! 56 | else 57 | local gossipOptions = GetGossipOptions() 58 | if gossipOptions[1] then 59 | for i = 1, #gossipOptions do 60 | local gossipTable = gossipOptions[i] 61 | if not blockedIds[gossipTable.gossipOptionID] then 62 | print("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS!", gossipTable.gossipOptionID, mobId, gossipTable.name) 63 | geterrorhandler()("|cFF33FF99Capping|r: NEW ID FOUND, TELL THE DEVS! ".. tostring(gossipTable.gossipOptionID) ..", ".. mobId ..", ".. tostring(gossipTable.name)) 64 | BasicMessageDialog.Text:SetText("Capping error, see chat for details") 65 | BasicMessageDialog:Show() 66 | return 67 | end 68 | end 69 | end 70 | end 71 | 72 | if GetItemCount(17422) >= 20 then -- Armor Scraps 17422 73 | if self:GetGossipAvailableQuestID(6781) then -- Alliance, More Armor Scraps 74 | self:SelectGossipAvailableQuestID(6781) 75 | elseif self:GetGossipAvailableQuestID(6741) then -- Horde, More Booty! 76 | self:SelectGossipAvailableQuestID(6741) 77 | elseif self:GetGossipAvailableQuestID(57318) then -- Horde, More Booty! [Specific to Korrak's Revenge] 78 | self:SelectGossipAvailableQuestID(57318) 79 | elseif self:GetGossipAvailableQuestID(57306) then -- Alliance, More Armor Scraps [Specific to Korrak's Revenge] 80 | self:SelectGossipAvailableQuestID(57306) 81 | end 82 | end 83 | elseif mobId == 13236 then -- Horde, Primalist Thurloga 84 | local num = GetItemCount(17306) -- Stormpike Soldier's Blood 17306 85 | if num > 0 then 86 | if GetNumGossipActiveQuests() > 0 then 87 | local tbl = C_GossipInfo.GetActiveQuests() 88 | for i = 1, #tbl do 89 | local questTable = tbl[i] 90 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 91 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 92 | end 93 | return 94 | SelectGossipActiveQuest(1) 95 | elseif self:GetGossipAvailableQuestID(7385) and num >= 5 then -- A Gallon of Blood 96 | self:SelectGossipAvailableQuestID(7385) 97 | elseif self:GetGossipAvailableQuestID(6801) then -- Lokholar the Ice Lord 98 | self:SelectGossipAvailableQuestID(6801) 99 | end 100 | end 101 | elseif mobId == 13442 then -- Alliance, Archdruid Renferal 102 | local num = GetItemCount(17423) -- Storm Crystal 17423 103 | if num > 0 then 104 | if GetNumGossipActiveQuests() > 0 then 105 | local tbl = C_GossipInfo.GetActiveQuests() 106 | for i = 1, #tbl do 107 | local questTable = tbl[i] 108 | print("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS!", questTable.questID, mobId, questTable.title) 109 | geterrorhandler()("|cFF33FF99Capping|r: NEW ACTIVE QUEST, TELL THE DEVS! ".. tostring(questTable.questID) ..", ".. mobId ..", ".. tostring(questTable.title)) 110 | end 111 | return 112 | SelectGossipActiveQuest(1) 113 | elseif self:GetGossipAvailableQuestID(7386) and num >= 5 then -- Crystal Cluster 114 | self:SelectGossipAvailableQuestID(7386) 115 | elseif self:GetGossipAvailableQuestID(6881) then -- Ivus the Forest Lord 116 | self:SelectGossipAvailableQuestID(6881) 117 | end 118 | end 119 | elseif mobId == 13577 then -- Alliance, Stormpike Ram Rider Commander 120 | if GetItemCount(17643) > 0 then -- Frost Wolf Hide 17643 121 | if self:GetGossipAvailableQuestID(7026) then 122 | self:SelectGossipAvailableQuestID(7026) 123 | else 124 | print("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 125 | geterrorhandler()("|cFF33FF99Capping|r: RAM RIDER, TELL THE DEVS! 7026 was not found!") 126 | end 127 | end 128 | elseif mobId == 13441 then -- Horde, Frostwolf Wolf Rider Commander 129 | if GetItemCount(17642) > 0 then -- Alterac Ram Hide 17642 130 | if self:GetGossipAvailableQuestID(7002) then 131 | self:SelectGossipAvailableQuestID(7002) -- Ram Hide Harnesses 132 | else 133 | print("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 134 | geterrorhandler()("|cFF33FF99Capping|r: WOLF RIDER, TELL THE DEVS! 7002 was not found!") 135 | end 136 | end 137 | end 138 | end 139 | end 140 | end 141 | 142 | do 143 | local hasPrinted = false 144 | local function allowPrints() 145 | hasPrinted = false 146 | end 147 | local IsQuestCompletable, CompleteQuest = IsQuestCompletable, CompleteQuest 148 | function mod:QUEST_PROGRESS() 149 | if not cap.db.profile.autoTurnIn then return end 150 | if IsQuestCompletable() then 151 | CompleteQuest() 152 | if not hasPrinted then 153 | hasPrinted = true 154 | C_Timer.After(10, allowPrints) 155 | print(L.handIn) 156 | end 157 | end 158 | end 159 | end 160 | 161 | do 162 | local GetNumQuestRewards, GetQuestReward = GetNumQuestRewards, GetQuestReward 163 | function mod:QUEST_COMPLETE() 164 | if not cap.db.profile.autoTurnIn then return end 165 | if GetNumQuestRewards() == 0 then 166 | GetQuestReward(0) 167 | end 168 | end 169 | end 170 | 171 | local NewTicker = C_Timer.NewTicker 172 | local hereFromTheStart, hasData = true, true 173 | local stopTimer = nil 174 | local function allow() hereFromTheStart = false end 175 | local function stop() hereFromTheStart = true hasData = true stopTimer = nil end 176 | --local GetScoreInfo = C_PvP.GetScoreInfo 177 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 178 | local function AVSyncRequest() 179 | for i = 1, 80 do 180 | local _, _, _, _, _, _, _, _, _, _, damageDone = GetBattlefieldScore(i) 181 | if damageDone and damageDone ~= 0 then 182 | hereFromTheStart = true 183 | hasData = false 184 | mod:Timer(0.5, allow) 185 | stopTimer = NewTicker(3, stop, 1) 186 | SendAddonMessage("Capping", "tr", "INSTANCE_CHAT") 187 | return 188 | end 189 | end 190 | 191 | hereFromTheStart = true 192 | hasData = true 193 | end 194 | 195 | do 196 | local timer = nil 197 | local function SendAVTimers() 198 | timer = nil 199 | if IsInGroup(2) then -- We've not just ragequit 200 | local str = "" 201 | for bar in next, CappingFrame.bars do 202 | local poiId = bar:Get("capping:poiid") 203 | if poiId then 204 | str = string.format("%s%d-%d~", str, poiId, math.floor(bar.remaining)) 205 | end 206 | end 207 | 208 | if str ~= "" and string.len(str) < 250 then 209 | SendAddonMessage("Capping", str, "INSTANCE_CHAT") 210 | end 211 | end 212 | end 213 | 214 | do 215 | local function Unwrap(self, ...) 216 | local inProgressDataTbl = {} 217 | for i = 1, select("#", ...) do 218 | local arg = select(i, ...) 219 | local id, remaining = strsplit("-", arg) 220 | if id and remaining then 221 | local widget, barTime = tonumber(id), tonumber(remaining) 222 | if widget and barTime and barTime > 5 and barTime < 245 then 223 | inProgressDataTbl[widget] = barTime 224 | end 225 | end 226 | end 227 | 228 | if next(inProgressDataTbl) then 229 | self:RestoreFlagCaptures(inProgressDataTbl, 242) 230 | end 231 | end 232 | 233 | local me = UnitName("player").. "-" ..GetRealmName() 234 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 235 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 236 | if msg == "tr" and sender ~= me then -- timer request 237 | if hasData then -- Joined a late game, don't send data 238 | if timer then timer:Cancel() end 239 | timer = NewTicker(1, SendAVTimers, 1) 240 | elseif stopTimer then 241 | stopTimer:Cancel() 242 | stopTimer = NewTicker(3, stop, 1) 243 | end 244 | elseif not hereFromTheStart and sender ~= me and msg:find("~", nil, true) then 245 | hereFromTheStart = true 246 | hasData = true 247 | Unwrap(self, strsplit("~", msg)) 248 | end 249 | end 250 | end 251 | end 252 | end 253 | 254 | do 255 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 256 | function mod:EnterZone(id) 257 | if id == 2197 then 258 | self:StartFlagCaptures(241) -- Korrak's Revenge (WoW 15th) 259 | else 260 | self:StartFlagCaptures(245) 261 | end 262 | self:SetupHealthCheck("11946", L.hordeBoss, "Horde Boss", 236452, "colorAlliance") -- Interface/Icons/Achievement_Character_Orc_Male 263 | self:SetupHealthCheck("11948", L.allianceBoss, "Alliance Boss", 236444, "colorHorde") -- Interface/Icons/Achievement_Character_Dwarf_Male 264 | self:SetupHealthCheck("11947", L.galvangar, "Galvangar", 236452, "colorAlliance") -- Interface/Icons/Achievement_Character_Orc_Male 265 | self:SetupHealthCheck("11949", L.balinda, "Balinda", 236447, "colorHorde") -- Interface/Icons/Achievement_Character_Human_Female 266 | self:SetupHealthCheck("13419", L.ivus, "Ivus", 132129, "colorAlliance") -- Interface/Icons/ability_druid_forceofnature 267 | self:SetupHealthCheck("13256", L.lokholar, "Lokholar", 135861, "colorHorde") -- Interface/Icons/spell_frost_summonwaterelemental 268 | self:RegisterEvent("CHAT_MSG_ADDON") 269 | self:RegisterEvent("GOSSIP_SHOW") 270 | self:RegisterEvent("QUEST_PROGRESS") 271 | self:RegisterEvent("QUEST_COMPLETE") 272 | RequestBattlefieldScoreData() 273 | self:Timer(1, function() RequestBattlefieldScoreData() end) 274 | self:Timer(2, AVSyncRequest) 275 | end 276 | end 277 | 278 | function mod:ExitZone() 279 | self:UnregisterEvent("GOSSIP_SHOW") 280 | self:UnregisterEvent("QUEST_PROGRESS") 281 | self:UnregisterEvent("QUEST_COMPLETE") 282 | self:UnregisterEvent("CHAT_MSG_ADDON") 283 | self:StopFlagCaptures() 284 | self:StopHealthCheck() 285 | end 286 | 287 | mod:RegisterZone(30) 288 | mod:RegisterZone(2197) -- Korrak's Revenge (WoW 15th) 289 | -------------------------------------------------------------------------------- /Modules/ArathiBasin.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartFlagCaptures(60) 10 | self:StartScoreEstimator() 11 | end 12 | 13 | function mod:ExitZone() 14 | self:StopScoreEstimator() 15 | self:StopFlagCaptures() 16 | end 17 | 18 | mod:RegisterZone(2107) -- Arathi Basin 19 | mod:RegisterZone(529) -- Arathi Basin Classic 20 | mod:RegisterZone(1681) -- Arathi Basin Snowy PvP Brawl 21 | mod:RegisterZone(2177) -- Arathi Basin Brawl Vs AI 22 | -------------------------------------------------------------------------------- /Modules/ArathiBasin_Classic.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartFlagCaptures(60) 10 | self:StartScoreEstimatorAB() 11 | end 12 | 13 | function mod:ExitZone() 14 | self:StopScoreEstimator() 15 | self:StopFlagCaptures() 16 | end 17 | 18 | mod:RegisterZone(2107) -- Arathi Basin 19 | mod:RegisterZone(529) -- Arathi Basin Classic 20 | mod:RegisterZone(1681) -- Arathi Basin Snowy PvP Brawl 21 | mod:RegisterZone(2177) -- Arathi Basin Brawl Vs AI 22 | -------------------------------------------------------------------------------- /Modules/ArathiBasin_Wrath.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartFlagCaptures(65) 10 | self:StartScoreEstimatorAB() 11 | end 12 | 13 | function mod:ExitZone() 14 | self:StopScoreEstimator() 15 | self:StopFlagCaptures() 16 | end 17 | 18 | mod:RegisterZone(2107) -- Arathi Basin 19 | mod:RegisterZone(529) -- Arathi Basin Classic 20 | mod:RegisterZone(1681) -- Arathi Basin Snowy PvP Brawl 21 | mod:RegisterZone(2177) -- Arathi Basin Brawl Vs AI 22 | -------------------------------------------------------------------------------- /Modules/Arena.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | do 9 | local GetIconAndTextWidgetVisualizationInfo = C_UIWidgetManager.GetIconAndTextWidgetVisualizationInfo 10 | local tonumber, strmatch = tonumber, string.match 11 | local GetSpellName = C_Spell.GetSpellName 12 | local GetSpellTexture = C_Spell.GetSpellTexture 13 | function mod:UPDATE_UI_WIDGET(tbl) 14 | if tbl.widgetSetID == 1 and tbl.widgetType == 0 then 15 | local id = tbl.widgetID 16 | local dataTbl = GetIconAndTextWidgetVisualizationInfo(id) 17 | if dataTbl and dataTbl.text and dataTbl.state == 1 then 18 | local minutes, seconds = strmatch(dataTbl.text, "(%d+):(%d+)") 19 | minutes = tonumber(minutes) 20 | seconds = tonumber(seconds) 21 | if minutes and seconds then 22 | local remaining = seconds + (minutes*60) + 1 23 | if remaining > 4 then 24 | self:UnregisterEvent("UPDATE_UI_WIDGET") 25 | local spell = GetSpellName(34709) 26 | local icon = GetSpellTexture(34709) 27 | self:StartBar(spell, 93, icon, "colorOther") 28 | self:StartBar(L.timeRemaining, remaining, nil, "colorOther") 29 | end 30 | end 31 | end 32 | end 33 | end 34 | end 35 | 36 | function mod:EnterZone() 37 | -- What we can NOT use for Shadow Sight timer 38 | -- COMBAT_LOG_EVENT_UNFILTERED for Arena Preparation removal event, it randomly removes and reapplies itself during the warmup 39 | -- UNIT_SPELLCAST_SUCCEEDED arena1-5 events, probably won't work if the entire enemy team is stealth 40 | -- What we CAN use for Shadow Sight timer 41 | -- CHAT_MSG_BG_SYSTEM_NEUTRAL#The Arena battle has begun! - Requires localization 42 | -- UPDATE_UI_WIDGET The first event fired with a valid remaining time (the current chosen method) 43 | self:RegisterEvent("UPDATE_UI_WIDGET") 44 | end 45 | 46 | function mod:ExitZone() 47 | self:UnregisterEvent("UPDATE_UI_WIDGET") 48 | end 49 | 50 | mod:RegisterZone("arena") 51 | -------------------------------------------------------------------------------- /Modules/Arena_Classic.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | do 9 | local GetSpellName = C_Spell.GetSpellName 10 | local GetSpellTexture = C_Spell.GetSpellTexture 11 | function mod:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) 12 | if msg == L.arenaStartTrigger then 13 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") 14 | local spell = GetSpellName(34709) 15 | local icon = GetSpellTexture(34709) 16 | self:StartBar(spell, 95, icon, "colorOther") 17 | end 18 | end 19 | end 20 | 21 | function mod:EnterZone() 22 | -- What we can NOT use for Shadow Sight timer 23 | -- COMBAT_LOG_EVENT_UNFILTERED for Arena Preparation removal event, it randomly removes and reapplies itself during the warmup 24 | -- UNIT_SPELLCAST_SUCCEEDED arena1-5 events, probably won't work if the entire enemy team is stealth 25 | -- What we CAN use for Shadow Sight timer 26 | -- CHAT_MSG_BG_SYSTEM_NEUTRAL#The Arena battle has begun! - Requires localization 27 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") 28 | end 29 | 30 | function mod:ExitZone() 31 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") 32 | end 33 | 34 | mod:RegisterZone(559) -- Nagrand Arena 35 | mod:RegisterZone(562) -- Blade's Edge Arena 36 | mod:RegisterZone(572) -- Ruins of Lordaeron 37 | mod:RegisterZone(617) -- Dalaran Sewers 38 | -------------------------------------------------------------------------------- /Modules/Ashran.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | do 9 | local GetCurrencyInfo = C_CurrencyInfo.GetCurrencyInfo 10 | function mod:GOSSIP_SHOW() 11 | if not cap.db.profile.autoTurnIn then return end 12 | local alliance = self:GetGossipID(43063) 13 | local horde = self:GetGossipID(52320) 14 | if alliance or horde then 15 | local tbl = GetCurrencyInfo(944) -- Artifact Fragment 16 | if tbl and tbl.quantity > 0 and self:GetGossipNumOptions() == 3 then -- Have the currency and boss isn't already summoned 17 | self:SelectGossipID(alliance and 43063 or 52320) 18 | print(L.handIn) 19 | end 20 | end 21 | end 22 | end 23 | 24 | function mod:EnterZone() 25 | self:RegisterEvent("GOSSIP_SHOW") 26 | self:SetupHealthCheck("88178", L.hordeGuardian, "Horde Guardian", 236440, "colorAlliance") -- Jeron Emberfall -- Interface/Icons/achievement_character_bloodelf_male 27 | self:SetupHealthCheck("88224", L.allianceGuardian, "Alliance Guardian", 236447, "colorHorde") -- Rylai Crestfall -- Interface/Icons/Achievement_character_human_female 28 | self:SetupHealthCheck("82877", L.hordeBoss, "Horde Boss", 236456, "colorAlliance") -- Interface/Icons/Achievement_character_troll_male 29 | self:SetupHealthCheck("82876", L.allianceBoss, "Alliance Boss", 236447, "colorHorde") -- Interface/Icons/Achievement_character_human_female 30 | self:SetupHealthCheck("82201", L.kronus, "Kronus", 1006111, "colorAlliance") -- Interface/Icons/achievement_boss_highmaul_earthenfury 31 | self:SetupHealthCheck("81859", L.fangraal, "Fangraal", 874857, "colorHorde") -- Interface/Icons/inv_pet_ancientprotector 32 | end 33 | 34 | function mod:ExitZone() 35 | self:UnregisterEvent("GOSSIP_SHOW") 36 | self:StopHealthCheck() 37 | end 38 | 39 | mod:RegisterZone(1191) 40 | -------------------------------------------------------------------------------- /Modules/DeephaulRavine.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartScoreEstimator() 10 | end 11 | 12 | function mod:ExitZone() 13 | self:StopScoreEstimator() 14 | end 15 | 16 | mod:RegisterZone(2656) 17 | -------------------------------------------------------------------------------- /Modules/DeepwindGorge.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartFlagCaptures(60) 10 | self:StartScoreEstimator() 11 | end 12 | 13 | function mod:ExitZone() 14 | self:StopScoreEstimator() 15 | self:StopFlagCaptures() 16 | end 17 | 18 | mod:RegisterZone(2245) 19 | -------------------------------------------------------------------------------- /Modules/EyeOfTheStorm.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | do 9 | -- GetPOITextureCoords(45) 10 | local icon = {136441, 0.21484375, 0.28125, 0.107421875, 0.140625} 11 | function mod:CHAT_MSG(msg) 12 | local found = strmatch(msg, L.takenTheFlagTrigger) 13 | if (found and found == "L'Alliance") or strmatch(msg, L.capturedTheTrigger) then -- frFR 14 | self:StartBar(L.flagRespawns, 21, icon, "colorOther") -- White flag 15 | end 16 | end 17 | end 18 | 19 | do 20 | -- EotS PvP Brawl: Gravity Lapse 21 | local ticker1, ticker2 = nil, nil 22 | local extraMsg = nil 23 | local color = {r=0,g=1,b=0} 24 | local NewTicker = C_Timer.NewTicker 25 | local GetSpellName = C_Spell.GetSpellName 26 | local GetSpellTexture = C_Spell.GetSpellTexture 27 | local function PrintExtraMessage() 28 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 29 | if extraMsg and id == 566 then -- Check the game isn't over 30 | RaidNotice_AddMessage(RaidBossEmoteFrame, extraMsg, color, 3) 31 | end 32 | end 33 | local function StartNextGravTimer() 34 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 35 | if id == 566 then -- Check the game isn't over 36 | local name = GetSpellName(44224) -- Gravity Lapse 37 | local icon = GetSpellTexture(44224) -- Gravity Lapse 38 | mod:StartBar(name, 55, icon, "colorOther") 39 | ticker1 = NewTicker(55, StartNextGravTimer, 1) -- Compensate for being dead (you don't get the message) 40 | ticker2 = NewTicker(50, PrintExtraMessage, 1) 41 | end 42 | end 43 | function mod:RAID_BOSS_WHISPER(msg) 44 | if msg:find("15", nil, true) then 45 | if not extraMsg then 46 | extraMsg = msg:gsub("1", "") 47 | end 48 | local name = GetSpellName(44224) -- Gravity Lapse 49 | local icon = GetSpellTexture(44224) -- Gravity Lapse 50 | self:StartBar(name, 15, icon, "colorOther") 51 | self:Timer(15, StartNextGravTimer) 52 | self:Timer(10, PrintExtraMessage) 53 | if ticker1 then 54 | ticker1:Cancel() 55 | ticker2:Cancel() 56 | ticker1, ticker2 = nil, nil 57 | end 58 | end 59 | end 60 | end 61 | 62 | do 63 | local colors = { 64 | ["eots_capPts-leftIcon2-state1"] = "colorAlliance", 65 | ["eots_capPts-leftIcon3-state1"] = "colorAlliance", 66 | ["eots_capPts-leftIcon4-state1"] = "colorAlliance", 67 | ["eots_capPts-leftIcon5-state1"] = "colorAlliance", 68 | ["eots_capPts-rightIcon2-state1"] = "colorHorde", 69 | ["eots_capPts-rightIcon3-state1"] = "colorHorde", 70 | ["eots_capPts-rightIcon4-state1"] = "colorHorde", 71 | ["eots_capPts-rightIcon5-state1"] = "colorHorde", 72 | } 73 | function mod:EnterZone(id) 74 | self:StartScoreEstimator() 75 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE", "CHAT_MSG") 76 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE", "CHAT_MSG") 77 | if id == 566 then -- Normal/Brawl 78 | self:RegisterEvent("RAID_BOSS_WHISPER") 79 | else -- Rated 80 | self:StartFlagCaptures(60, colors) -- 30 sec when solo RBG, 60 otherwise 81 | end 82 | end 83 | end 84 | 85 | function mod:ExitZone() 86 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_HORDE") 87 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE") 88 | self:UnregisterEvent("RAID_BOSS_WHISPER") 89 | self:StopScoreEstimator() 90 | self:StopFlagCaptures() 91 | end 92 | 93 | mod:RegisterZone(566) 94 | mod:RegisterZone(968) -- In RBG the four points have flags that need to be assaulted, like AB 95 | -------------------------------------------------------------------------------- /Modules/EyeOfTheStorm_TBC.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | do 9 | -- GetPOITextureCoords(45) 10 | local icon = {136441, 0.625, 0.75, 0.625, 0.75} 11 | function mod:CHAT_MSG(msg) 12 | local found = strmatch(msg, L.takenTheFlagTrigger) 13 | if (found and found == "L'Alliance") or strmatch(msg, L.capturedTheTrigger) then -- frFR 14 | self:StartBar(L.flagRespawns, 21, icon, "colorOther") -- White flag 15 | end 16 | end 17 | end 18 | 19 | do 20 | -- EotS PvP Brawl: Gravity Lapse 21 | local ticker1, ticker2 = nil, nil 22 | local extraMsg = nil 23 | local color = {r=0,g=1,b=0} 24 | local NewTicker = C_Timer.NewTicker 25 | local GetSpellName = C_Spell.GetSpellName 26 | local GetSpellTexture = C_Spell.GetSpellTexture 27 | local function PrintExtraMessage() 28 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 29 | if extraMsg and id == 566 then -- Check the game isn't over 30 | RaidNotice_AddMessage(RaidBossEmoteFrame, extraMsg, color, 3) 31 | end 32 | end 33 | local function StartNextGravTimer() 34 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 35 | if id == 566 then -- Check the game isn't over 36 | local name = GetSpellName(44224) -- Gravity Lapse 37 | local icon = GetSpellTexture(44224) -- Gravity Lapse 38 | mod:StartBar(name, 55, icon, "colorOther") 39 | ticker1 = NewTicker(55, StartNextGravTimer, 1) -- Compensate for being dead (you don't get the message) 40 | ticker2 = NewTicker(50, PrintExtraMessage, 1) 41 | end 42 | end 43 | function mod:RAID_BOSS_WHISPER(msg) 44 | if msg:find("15", nil, true) then 45 | if not extraMsg then 46 | extraMsg = msg:gsub("1", "") 47 | end 48 | local name = GetSpellName(44224) -- Gravity Lapse 49 | local icon = GetSpellTexture(44224) -- Gravity Lapse 50 | self:StartBar(name, 15, icon, "colorOther") 51 | self:Timer(15, StartNextGravTimer) 52 | self:Timer(10, PrintExtraMessage) 53 | if ticker1 then 54 | ticker1:Cancel() 55 | ticker2:Cancel() 56 | ticker1, ticker2 = nil, nil 57 | end 58 | end 59 | end 60 | end 61 | 62 | do 63 | --local colors = { 64 | -- ["eots_capPts-leftIcon2-state1"] = "colorAlliance", 65 | -- ["eots_capPts-leftIcon3-state1"] = "colorAlliance", 66 | -- ["eots_capPts-leftIcon4-state1"] = "colorAlliance", 67 | -- ["eots_capPts-leftIcon5-state1"] = "colorAlliance", 68 | -- ["eots_capPts-rightIcon2-state1"] = "colorHorde", 69 | -- ["eots_capPts-rightIcon3-state1"] = "colorHorde", 70 | -- ["eots_capPts-rightIcon4-state1"] = "colorHorde", 71 | -- ["eots_capPts-rightIcon5-state1"] = "colorHorde", 72 | --} 73 | function mod:EnterZone() 74 | self:StartScoreEstimator() 75 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE", "CHAT_MSG") 76 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE", "CHAT_MSG") 77 | --if id == 566 then -- Normal/Brawl 78 | -- self:RegisterEvent("RAID_BOSS_WHISPER") 79 | --else -- Rated 80 | -- self:StartFlagCaptures(60, colors) 81 | --end 82 | end 83 | end 84 | 85 | function mod:ExitZone() 86 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_HORDE") 87 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE") 88 | --self:UnregisterEvent("RAID_BOSS_WHISPER") 89 | self:StopScoreEstimator() 90 | self:StopFlagCaptures() 91 | end 92 | 93 | mod:RegisterZone(566) 94 | --mod:RegisterZone(968) -- In RBG the four points have flags that need to be assaulted, like AB 95 | -------------------------------------------------------------------------------- /Modules/EyeOfTheStorm_Wrath.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | do 9 | -- GetPOITextureCoords(45) 10 | local icon = {136441, 0.21484375, 0.28125, 0.21484375, 0.28125} 11 | function mod:CHAT_MSG(msg) 12 | local found = strmatch(msg, L.takenTheFlagTrigger) 13 | if (found and found == "L'Alliance") or strmatch(msg, L.capturedTheTrigger) then -- frFR 14 | self:StartBar(L.flagRespawns, 21, icon, "colorOther") -- White flag 15 | end 16 | end 17 | end 18 | 19 | do 20 | -- EotS PvP Brawl: Gravity Lapse 21 | local ticker1, ticker2 = nil, nil 22 | local extraMsg = nil 23 | local color = {r=0,g=1,b=0} 24 | local NewTicker = C_Timer.NewTicker 25 | local GetSpellName = C_Spell.GetSpellName 26 | local GetSpellTexture = C_Spell.GetSpellTexture 27 | local function PrintExtraMessage() 28 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 29 | if extraMsg and id == 566 then -- Check the game isn't over 30 | RaidNotice_AddMessage(RaidBossEmoteFrame, extraMsg, color, 3) 31 | end 32 | end 33 | local function StartNextGravTimer() 34 | local _, _, _, _, _, _, _, id = GetInstanceInfo() 35 | if id == 566 then -- Check the game isn't over 36 | local name = GetSpellName(44224) -- Gravity Lapse 37 | local icon = GetSpellTexture(44224) -- Gravity Lapse 38 | mod:StartBar(name, 55, icon, "colorOther") 39 | ticker1 = NewTicker(55, StartNextGravTimer, 1) -- Compensate for being dead (you don't get the message) 40 | ticker2 = NewTicker(50, PrintExtraMessage, 1) 41 | end 42 | end 43 | function mod:RAID_BOSS_WHISPER(msg) 44 | if msg:find("15", nil, true) then 45 | if not extraMsg then 46 | extraMsg = msg:gsub("1", "") 47 | end 48 | local name = GetSpellName(44224) -- Gravity Lapse 49 | local icon = GetSpellTexture(44224) -- Gravity Lapse 50 | self:StartBar(name, 15, icon, "colorOther") 51 | self:Timer(15, StartNextGravTimer) 52 | self:Timer(10, PrintExtraMessage) 53 | if ticker1 then 54 | ticker1:Cancel() 55 | ticker2:Cancel() 56 | ticker1, ticker2 = nil, nil 57 | end 58 | end 59 | end 60 | end 61 | 62 | do 63 | --local colors = { 64 | -- ["eots_capPts-leftIcon2-state1"] = "colorAlliance", 65 | -- ["eots_capPts-leftIcon3-state1"] = "colorAlliance", 66 | -- ["eots_capPts-leftIcon4-state1"] = "colorAlliance", 67 | -- ["eots_capPts-leftIcon5-state1"] = "colorAlliance", 68 | -- ["eots_capPts-rightIcon2-state1"] = "colorHorde", 69 | -- ["eots_capPts-rightIcon3-state1"] = "colorHorde", 70 | -- ["eots_capPts-rightIcon4-state1"] = "colorHorde", 71 | -- ["eots_capPts-rightIcon5-state1"] = "colorHorde", 72 | --} 73 | function mod:EnterZone() 74 | self:StartScoreEstimator() 75 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE", "CHAT_MSG") 76 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE", "CHAT_MSG") 77 | --if id == 566 then -- Normal/Brawl 78 | -- self:RegisterEvent("RAID_BOSS_WHISPER") 79 | --else -- Rated 80 | -- self:StartFlagCaptures(60, colors) 81 | --end 82 | end 83 | end 84 | 85 | function mod:ExitZone() 86 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_HORDE") 87 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE") 88 | --self:UnregisterEvent("RAID_BOSS_WHISPER") 89 | self:StopScoreEstimator() 90 | self:StopFlagCaptures() 91 | end 92 | 93 | mod:RegisterZone(566) 94 | --mod:RegisterZone(968) -- In RBG the four points have flags that need to be assaulted, like AB 95 | -------------------------------------------------------------------------------- /Modules/Gilneas.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod 3 | do 4 | local _, core = ... 5 | mod = core:NewMod() 6 | end 7 | 8 | function mod:EnterZone() 9 | self:StartFlagCaptures(60) 10 | self:StartScoreEstimator() 11 | end 12 | 13 | function mod:ExitZone() 14 | self:StopScoreEstimator() 15 | self:StopFlagCaptures() 16 | end 17 | 18 | mod:RegisterZone(761) 19 | -------------------------------------------------------------------------------- /Modules/IsleOfConquest.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 9 | local baseGateHealth = 2400000 10 | local lowestAllianceHp, lowestHordeHp = baseGateHealth, baseGateHealth 11 | local hordeGates, allianceGates = {}, {} 12 | local hordeGateBar, allianceGateBar = nil, nil 13 | local englishNames = { 14 | ["195494"] = "Horde Gate (Front)/", 15 | ["195495"] = "Horde Gate (West)/", 16 | ["195496"] = "Horde Gate (East)/", 17 | ["195698"] = "Alliance Gate (Front)/", 18 | ["195699"] = "Alliance Gate (West)/", 19 | ["195700"] = "Alliance Gate (East)/", 20 | } 21 | 22 | do 23 | local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo 24 | function mod:COMBAT_LOG_EVENT_UNFILTERED() 25 | local _, event, _, _, _, _, _, destGUID, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo() 26 | if event == "SPELL_BUILDING_DAMAGE" then 27 | local _, _, _, _, _, strid = strsplit("-", destGUID) 28 | if hordeGates[strid] then 29 | local newHp = hordeGates[strid] - amount 30 | hordeGates[strid] = newHp 31 | if newHp < lowestHordeHp then 32 | lowestHordeHp = newHp 33 | local bar = hordeGateBar 34 | if bar then 35 | local hp = newHp / baseGateHealth * 100 36 | if hp < 0.5 then 37 | bar:Stop() 38 | else 39 | bar.candyBarBar:SetValue(hp) 40 | bar.candyBarDuration:SetFormattedText("%.1f%%", hp) 41 | local gate = strid == "195494" and L.front or strid == "195495" and L.west or L.east 42 | bar.candyBarLabel:SetFormattedText(L.gatePosition, L.hordeGate, gate) 43 | bar:Set("capping:englishprint", englishNames[strid]) 44 | end 45 | end 46 | end 47 | elseif allianceGates[strid] then 48 | local newHp = allianceGates[strid] - amount 49 | allianceGates[strid] = newHp 50 | if newHp < lowestAllianceHp then 51 | lowestAllianceHp = newHp 52 | local bar = allianceGateBar 53 | if bar then 54 | local hp = newHp / baseGateHealth * 100 55 | if hp < 0.5 then 56 | bar:Stop() 57 | else 58 | bar.candyBarBar:SetValue(hp) 59 | bar.candyBarDuration:SetFormattedText("%.1f%%", hp) 60 | local gate = strid == "195698" and L.front or strid == "195699" and L.west or L.east 61 | bar.candyBarLabel:SetFormattedText(L.gatePosition, L.allianceGate, gate) 62 | bar:Set("capping:englishprint", englishNames[strid]) 63 | end 64 | end 65 | end 66 | end 67 | elseif event == "UNIT_DIED" then 68 | local _, _, _, _, _, strid = strsplit("-", destGUID) 69 | if strid == "34776" or strid == "35069" then -- Alliance Siege, Horde Siege 70 | SendAddonMessage("Capping", "rb", "INSTANCE_CHAT") 71 | end 72 | end 73 | end 74 | end 75 | 76 | local function initGateBars() 77 | mod:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") 78 | local aBar = mod:StartBar(L.allianceGate, 100, 2054277, "colorHorde", true) -- Interface/Icons/spell_tailor_defenceup01 79 | aBar:Pause() 80 | aBar.candyBarBar:SetValue(100) 81 | aBar.candyBarDuration:SetText("100%") 82 | aBar:Set("capping:englishprint", "Alliance Gate/") 83 | aBar:Set("capping:customchat", function(bar) 84 | if L.allianceGate ~= "Alliance Gate" then 85 | return bar:Get("capping:englishprint") .. bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 86 | else 87 | return bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 88 | end 89 | end) 90 | local hBar = mod:StartBar(L.hordeGate, 100, 2054277, "colorAlliance", true) -- Interface/Icons/spell_tailor_defenceup01 91 | hBar:Pause() 92 | hBar.candyBarBar:SetValue(100) 93 | hBar.candyBarDuration:SetText("100%") 94 | hBar:Set("capping:englishprint", "Horde Gate/") 95 | hBar:Set("capping:customchat", function(bar) 96 | if L.hordeGate ~= "Horde Gate" then 97 | return bar:Get("capping:englishprint") .. bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 98 | else 99 | return bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 100 | end 101 | end) 102 | allianceGateBar, hordeGateBar = aBar, hBar 103 | end 104 | 105 | local IoCSyncRequest 106 | do 107 | local timer = nil 108 | local NewTicker = C_Timer.NewTicker 109 | local function SendIoCGates() 110 | timer = nil 111 | if IsInGroup(2) then -- We've not just ragequit 112 | local msg = string.format( 113 | "195494:%d:195495:%d:195496:%d:195698:%d:195699:%d:195700:%d", 114 | hordeGates["195494"], hordeGates["195495"], hordeGates["195496"], 115 | allianceGates["195698"], allianceGates["195699"], allianceGates["195700"] 116 | ) 117 | SendAddonMessage("Capping", msg, "INSTANCE_CHAT") 118 | end 119 | end 120 | 121 | local hereFromTheStart, hasData = true, true 122 | local stopTimer = nil 123 | local function allow() hereFromTheStart = false end 124 | local function stop() hereFromTheStart = true stopTimer = nil end 125 | local GetScoreInfo = C_PvP.GetScoreInfo 126 | function IoCSyncRequest() 127 | for i = 1, 80 do 128 | local scoreTbl = GetScoreInfo(i) 129 | if scoreTbl and scoreTbl.damageDone and scoreTbl.damageDone ~= 0 then 130 | hereFromTheStart = true 131 | hasData = false 132 | mod:Timer(0.5, allow) 133 | stopTimer = NewTicker(3, stop, 1) 134 | SendAddonMessage("Capping", "gr", "INSTANCE_CHAT") 135 | return 136 | end 137 | end 138 | 139 | hereFromTheStart = true 140 | hasData = true 141 | initGateBars() 142 | end 143 | 144 | local me = UnitName("player").. "-" ..GetRealmName() 145 | local GetAreaPOIForMap = C_AreaPoiInfo.GetAreaPOIForMap 146 | local GetAreaPOIInfo = C_AreaPoiInfo.GetAreaPOIInfo 147 | local GetSpellName = C_Spell and C_Spell.GetSpellName or GetSpellInfo 148 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 149 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 150 | if msg == "gr" and sender ~= me then -- gate request 151 | if hasData then -- Joined a late game, don't send data 152 | if timer then timer:Cancel() end 153 | timer = NewTicker(1, SendIoCGates, 1) 154 | elseif stopTimer then 155 | stopTimer:Cancel() 156 | stopTimer = NewTicker(3, stop, 1) 157 | end 158 | elseif msg == "rb" or msg == "rbh" then -- Re-Build / Re-Build Halfway 159 | local pois = GetAreaPOIForMap(169) 160 | for i = 1, #pois do 161 | local tbl = GetAreaPOIInfo(169, pois[i]) 162 | local icon = tbl.textureIndex 163 | if icon == 136 or icon == 138 then -- Workshop in IoC 164 | local text = GetSpellName(56661) -- Build Siege Engine 165 | local bar = self:GetBar(text) 166 | if not bar then 167 | self:StartBar(text, msg == "rb" and 181 or 90.5, 252187, icon == 136 and "colorAlliance" or "colorHorde") -- 252187 = ability_vehicle_siegeengineram 168 | end 169 | end 170 | end 171 | elseif not hereFromTheStart and sender ~= me then 172 | local h1, h1hp, h2, h2hp, h3, h3hp, a1, a1hp, a2, a2hp, a3, a3hp = strsplit(":", msg) 173 | local hGate1, hGate2, hGate3, aGate1, aGate2, aGate3 = tonumber(h1hp), tonumber(h2hp), tonumber(h3hp), tonumber(a1hp), tonumber(a2hp), tonumber(a3hp) 174 | if hGate1 and hGate2 and hGate3 and aGate1 and aGate2 and aGate3 and -- Safety dance 175 | h1 == "195494" and h2 == "195495" and h3 == "195496" and a1 =="195698" and a2 == "195699" and a3 == "195700" then 176 | hereFromTheStart = true 177 | hasData = true 178 | initGateBars() 179 | lowestHordeHp = math.min(hGate1, hGate2, hGate3) 180 | lowestAllianceHp = math.min(aGate1, aGate2, aGate3) 181 | hordeGates["195494"] = hGate1 182 | hordeGates["195495"] = hGate2 183 | hordeGates["195496"] = hGate3 184 | allianceGates["195698"] = aGate1 185 | allianceGates["195699"] = aGate2 186 | allianceGates["195700"] = aGate3 187 | 188 | if hordeGateBar then 189 | local hp = lowestHordeHp / baseGateHealth * 100 190 | if hp < 1 then 191 | hordeGateBar:Stop() 192 | else 193 | hordeGateBar.candyBarBar:SetValue(hp) 194 | hordeGateBar.candyBarDuration:SetFormattedText("%.1f%%", hp) 195 | if lowestHordeHp ~= baseGateHealth then 196 | local gate = lowestHordeHp == hGate1 and h1 or lowestHordeHp == hGate2 and h2 or h3 197 | hordeGateBar.candyBarLabel:SetFormattedText(L.gatePosition, L.hordeGate, gate == h1 and L.front or gate == h2 and L.west or L.east) 198 | hordeGateBar:Set("capping:englishprint", englishNames[gate]) 199 | end 200 | end 201 | end 202 | if allianceGateBar then 203 | local hp = lowestAllianceHp / baseGateHealth * 100 204 | if hp < 1 then 205 | allianceGateBar:Stop() 206 | else 207 | allianceGateBar.candyBarBar:SetValue(hp) 208 | allianceGateBar.candyBarDuration:SetFormattedText("%.1f%%", hp) 209 | if lowestAllianceHp ~= baseGateHealth then 210 | local gate = lowestAllianceHp == aGate1 and a1 or lowestAllianceHp == aGate2 and a2 or a3 211 | allianceGateBar.candyBarLabel:SetFormattedText(L.gatePosition, L.allianceGate, gate == a1 and L.front or gate == a2 and L.west or L.east) 212 | allianceGateBar:Set("capping:englishprint", englishNames[gate]) 213 | end 214 | end 215 | end 216 | end 217 | end 218 | end 219 | end 220 | end 221 | 222 | function mod:CHAT_MSG_MONSTER_YELL(msg) 223 | if msg:find(L.broken, nil, true) then 224 | SendAddonMessage("Capping", "rb", "INSTANCE_CHAT") 225 | elseif msg:find(L.halfway) then -- Need pattern matching for ruRU 226 | SendAddonMessage("Capping", "rbh", "INSTANCE_CHAT") 227 | end 228 | end 229 | 230 | do 231 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 232 | function mod:EnterZone() 233 | lowestAllianceHp, lowestHordeHp = baseGateHealth, baseGateHealth 234 | hordeGates = { 235 | ["195494"] = baseGateHealth, 236 | ["195495"] = baseGateHealth, 237 | ["195496"] = baseGateHealth, 238 | } 239 | allianceGates = { 240 | ["195698"] = baseGateHealth, 241 | ["195699"] = baseGateHealth, 242 | ["195700"] = baseGateHealth, 243 | } 244 | self:StartFlagCaptures(61) 245 | self:SetupHealthCheck("34922", L.hordeBoss, "Horde Boss", 236452, "colorAlliance") -- Overlord Agmar -- Interface/Icons/Achievement_Character_Orc_Male 246 | self:SetupHealthCheck("34924", L.allianceBoss, "Alliance Boss", 236448, "colorHorde") -- Halford Wyrmbane -- Interface/Icons/Achievement_Character_Human_Male 247 | C_ChatInfo.RegisterAddonMessagePrefix("Capping") 248 | self:RegisterEvent("CHAT_MSG_ADDON") 249 | self:RegisterEvent("CHAT_MSG_MONSTER_YELL") 250 | RequestBattlefieldScoreData() 251 | self:Timer(1, function() RequestBattlefieldScoreData() end) 252 | self:Timer(2, IoCSyncRequest) 253 | end 254 | end 255 | 256 | function mod:ExitZone() 257 | self:UnregisterEvent("CHAT_MSG_ADDON") 258 | self:UnregisterEvent("CHAT_MSG_MONSTER_YELL") 259 | self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED") 260 | self:StopFlagCaptures() 261 | end 262 | 263 | mod:RegisterZone(628) 264 | -------------------------------------------------------------------------------- /Modules/IsleOfConquest_Wrath.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | end 7 | 8 | local SendAddonMessage = C_ChatInfo.SendAddonMessage 9 | local baseGateHealth = 600000 10 | local lowestAllianceHp, lowestHordeHp = baseGateHealth, baseGateHealth 11 | local hordeGates, allianceGates = {}, {} 12 | local hordeGateBar, allianceGateBar = nil, nil 13 | local englishNames = { 14 | ["195494"] = "Horde Gate (Front)/", 15 | ["195495"] = "Horde Gate (West)/", 16 | ["195496"] = "Horde Gate (East)/", 17 | ["195698"] = "Alliance Gate (Front)/", 18 | ["195699"] = "Alliance Gate (West)/", 19 | ["195700"] = "Alliance Gate (East)/", 20 | } 21 | 22 | do 23 | local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo 24 | function mod:COMBAT_LOG_EVENT_UNFILTERED() 25 | local _, event, _, _, _, _, _, destGUID, _, _, _, _, _, _, amount = CombatLogGetCurrentEventInfo() 26 | if event == "SPELL_BUILDING_DAMAGE" then 27 | local _, _, _, _, _, strid = strsplit("-", destGUID) 28 | if hordeGates[strid] then 29 | local newHp = hordeGates[strid] - amount 30 | hordeGates[strid] = newHp 31 | if newHp < lowestHordeHp then 32 | lowestHordeHp = newHp 33 | local bar = hordeGateBar 34 | if bar then 35 | local hp = newHp / baseGateHealth * 100 36 | if hp < 0.5 then 37 | bar:Stop() 38 | else 39 | bar.candyBarBar:SetValue(hp) 40 | bar.candyBarDuration:SetFormattedText("%.1f%%", hp) 41 | local gate = strid == "195494" and L.front or strid == "195495" and L.west or L.east 42 | bar.candyBarLabel:SetFormattedText(L.gatePosition, L.hordeGate, gate) 43 | bar:Set("capping:englishprint", englishNames[strid]) 44 | end 45 | end 46 | end 47 | elseif allianceGates[strid] then 48 | local newHp = allianceGates[strid] - amount 49 | allianceGates[strid] = newHp 50 | if newHp < lowestAllianceHp then 51 | lowestAllianceHp = newHp 52 | local bar = allianceGateBar 53 | if bar then 54 | local hp = newHp / baseGateHealth * 100 55 | if hp < 0.5 then 56 | bar:Stop() 57 | else 58 | bar.candyBarBar:SetValue(hp) 59 | bar.candyBarDuration:SetFormattedText("%.1f%%", hp) 60 | local gate = strid == "195698" and L.front or strid == "195699" and L.west or L.east 61 | bar.candyBarLabel:SetFormattedText(L.gatePosition, L.allianceGate, gate) 62 | bar:Set("capping:englishprint", englishNames[strid]) 63 | end 64 | end 65 | end 66 | end 67 | elseif event == "UNIT_DIED" then 68 | local _, _, _, _, _, strid = strsplit("-", destGUID) 69 | if strid == "34776" or strid == "35069" then -- Alliance Siege, Horde Siege 70 | SendAddonMessage("Capping", "rb", "INSTANCE_CHAT") 71 | end 72 | end 73 | end 74 | end 75 | 76 | local function initGateBars() 77 | mod:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED") 78 | local aBar = mod:StartBar(L.allianceGate, 100, 132362, "colorHorde", true) -- Interface/Icons/ability_warrior_shieldwall 79 | aBar:Pause() 80 | aBar.candyBarBar:SetValue(100) 81 | aBar.candyBarDuration:SetText("100%") 82 | aBar:Set("capping:englishprint", "Alliance Gate/") 83 | aBar:Set("capping:customchat", function(bar) 84 | if L.allianceGate ~= "Alliance Gate" then 85 | return bar:Get("capping:englishprint") .. bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 86 | else 87 | return bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 88 | end 89 | end) 90 | local hBar = mod:StartBar(L.hordeGate, 100, 132362, "colorAlliance", true) -- Interface/Icons/ability_warrior_shieldwall 91 | hBar:Pause() 92 | hBar.candyBarBar:SetValue(100) 93 | hBar.candyBarDuration:SetText("100%") 94 | hBar:Set("capping:englishprint", "Horde Gate/") 95 | hBar:Set("capping:customchat", function(bar) 96 | if L.hordeGate ~= "Horde Gate" then 97 | return bar:Get("capping:englishprint") .. bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 98 | else 99 | return bar.candyBarLabel:GetText() .." - ".. bar.candyBarDuration:GetText() 100 | end 101 | end) 102 | allianceGateBar, hordeGateBar = aBar, hBar 103 | end 104 | 105 | local IoCSyncRequest 106 | do 107 | local timer = nil 108 | local NewTicker = C_Timer.NewTicker 109 | local function SendIoCGates() 110 | timer = nil 111 | if IsInGroup(2) then -- We've not just ragequit 112 | local msg = string.format( 113 | "195494:%d:195495:%d:195496:%d:195698:%d:195699:%d:195700:%d", 114 | hordeGates["195494"], hordeGates["195495"], hordeGates["195496"], 115 | allianceGates["195698"], allianceGates["195699"], allianceGates["195700"] 116 | ) 117 | SendAddonMessage("Capping", msg, "INSTANCE_CHAT") 118 | end 119 | end 120 | 121 | local hereFromTheStart, hasData = true, true 122 | local stopTimer = nil 123 | local function allow() hereFromTheStart = false end 124 | local function stop() hereFromTheStart = true stopTimer = nil end 125 | --local GetScoreInfo = C_PvP.GetScoreInfo 126 | function IoCSyncRequest() 127 | for i = 1, 80 do 128 | local _, _, _, _, _, _, _, _, _, _, damageDone = GetBattlefieldScore(i) 129 | if damageDone and damageDone ~= 0 then 130 | hereFromTheStart = true 131 | hasData = false 132 | mod:Timer(0.5, allow) 133 | stopTimer = NewTicker(3, stop, 1) 134 | SendAddonMessage("Capping", "gr", "INSTANCE_CHAT") 135 | return 136 | end 137 | end 138 | 139 | hereFromTheStart = true 140 | hasData = true 141 | initGateBars() 142 | end 143 | 144 | local me = UnitName("player").. "-" ..GetRealmName() 145 | local GetAreaPOIForMap = C_AreaPoiInfo.GetAreaPOIForMap 146 | local GetAreaPOIInfo = C_AreaPoiInfo.GetAreaPOIInfo 147 | local GetSpellName = C_Spell and C_Spell.GetSpellName or GetSpellInfo 148 | function mod:CHAT_MSG_ADDON(prefix, msg, channel, sender) 149 | if prefix == "Capping" and channel == "INSTANCE_CHAT" then 150 | if msg == "gr" and sender ~= me then -- gate request 151 | if hasData then -- Joined a late game, don't send data 152 | if timer then timer:Cancel() end 153 | timer = NewTicker(1, SendIoCGates, 1) 154 | elseif stopTimer then 155 | stopTimer:Cancel() 156 | stopTimer = NewTicker(3, stop, 1) 157 | end 158 | elseif msg == "rb" or msg == "rbh" then -- Re-Build / Re-Build Halfway 159 | local pois = GetAreaPOIForMap(169) 160 | for i = 1, #pois do 161 | local tbl = GetAreaPOIInfo(169, pois[i]) 162 | local icon = tbl.textureIndex 163 | if icon == 136 or icon == 138 then -- Workshop in IoC 164 | local text = GetSpellName(56661) -- Build Siege Engine 165 | local bar = self:GetBar(text) 166 | if not bar then 167 | self:StartBar(text, msg == "rb" and 181 or 90.5, 252187, icon == 136 and "colorAlliance" or "colorHorde") -- 252187 = ability_vehicle_siegeengineram 168 | end 169 | end 170 | end 171 | elseif not hereFromTheStart and sender ~= me then 172 | local h1, h1hp, h2, h2hp, h3, h3hp, a1, a1hp, a2, a2hp, a3, a3hp = strsplit(":", msg) 173 | local hGate1, hGate2, hGate3, aGate1, aGate2, aGate3 = tonumber(h1hp), tonumber(h2hp), tonumber(h3hp), tonumber(a1hp), tonumber(a2hp), tonumber(a3hp) 174 | if hGate1 and hGate2 and hGate3 and aGate1 and aGate2 and aGate3 and -- Safety dance 175 | h1 == "195494" and h2 == "195495" and h3 == "195496" and a1 =="195698" and a2 == "195699" and a3 == "195700" then 176 | hereFromTheStart = true 177 | hasData = true 178 | initGateBars() 179 | lowestHordeHp = math.min(hGate1, hGate2, hGate3) 180 | lowestAllianceHp = math.min(aGate1, aGate2, aGate3) 181 | hordeGates["195494"] = hGate1 182 | hordeGates["195495"] = hGate2 183 | hordeGates["195496"] = hGate3 184 | allianceGates["195698"] = aGate1 185 | allianceGates["195699"] = aGate2 186 | allianceGates["195700"] = aGate3 187 | 188 | if hordeGateBar then 189 | local hp = lowestHordeHp / baseGateHealth * 100 190 | if hp < 1 then 191 | hordeGateBar:Stop() 192 | else 193 | hordeGateBar.candyBarBar:SetValue(hp) 194 | hordeGateBar.candyBarDuration:SetFormattedText("%.1f%%", hp) 195 | if lowestHordeHp ~= baseGateHealth then 196 | local gate = lowestHordeHp == hGate1 and h1 or lowestHordeHp == hGate2 and h2 or h3 197 | hordeGateBar.candyBarLabel:SetFormattedText(L.gatePosition, L.hordeGate, gate == h1 and L.front or gate == h2 and L.west or L.east) 198 | hordeGateBar:Set("capping:englishprint", englishNames[gate]) 199 | end 200 | end 201 | end 202 | if allianceGateBar then 203 | local hp = lowestAllianceHp / baseGateHealth * 100 204 | if hp < 1 then 205 | allianceGateBar:Stop() 206 | else 207 | allianceGateBar.candyBarBar:SetValue(hp) 208 | allianceGateBar.candyBarDuration:SetFormattedText("%.1f%%", hp) 209 | if lowestAllianceHp ~= baseGateHealth then 210 | local gate = lowestAllianceHp == aGate1 and a1 or lowestAllianceHp == aGate2 and a2 or a3 211 | allianceGateBar.candyBarLabel:SetFormattedText(L.gatePosition, L.allianceGate, gate == a1 and L.front or gate == a2 and L.west or L.east) 212 | allianceGateBar:Set("capping:englishprint", englishNames[gate]) 213 | end 214 | end 215 | end 216 | end 217 | end 218 | end 219 | end 220 | end 221 | 222 | function mod:CHAT_MSG_MONSTER_YELL(msg) 223 | if msg:find(L.broken, nil, true) then 224 | SendAddonMessage("Capping", "rb", "INSTANCE_CHAT") 225 | elseif msg:find(L.halfway) then -- Need pattern matching for ruRU 226 | SendAddonMessage("Capping", "rbh", "INSTANCE_CHAT") 227 | end 228 | end 229 | 230 | do 231 | local RequestBattlefieldScoreData = RequestBattlefieldScoreData 232 | function mod:EnterZone() 233 | lowestAllianceHp, lowestHordeHp = baseGateHealth, baseGateHealth 234 | hordeGates = { 235 | ["195494"] = baseGateHealth, 236 | ["195495"] = baseGateHealth, 237 | ["195496"] = baseGateHealth, 238 | } 239 | allianceGates = { 240 | ["195698"] = baseGateHealth, 241 | ["195699"] = baseGateHealth, 242 | ["195700"] = baseGateHealth, 243 | } 244 | self:StartFlagCaptures(61) 245 | self:SetupHealthCheck("34922", L.hordeBoss, "Horde Boss", 236452, "colorAlliance") -- Overlord Agmar -- Interface/Icons/Achievement_Character_Orc_Male 246 | self:SetupHealthCheck("34924", L.allianceBoss, "Alliance Boss", 236448, "colorHorde") -- Halford Wyrmbane -- Interface/Icons/Achievement_Character_Human_Male 247 | C_ChatInfo.RegisterAddonMessagePrefix("Capping") 248 | self:RegisterEvent("CHAT_MSG_ADDON") 249 | self:RegisterEvent("CHAT_MSG_MONSTER_YELL") 250 | RequestBattlefieldScoreData() 251 | self:Timer(1, function() RequestBattlefieldScoreData() end) 252 | self:Timer(2, IoCSyncRequest) 253 | end 254 | end 255 | 256 | function mod:ExitZone() 257 | self:UnregisterEvent("CHAT_MSG_ADDON") 258 | self:UnregisterEvent("CHAT_MSG_MONSTER_YELL") 259 | self:UnregisterEvent("COMBAT_LOG_EVENT_UNFILTERED") 260 | self:StopFlagCaptures() 261 | end 262 | 263 | mod:RegisterZone(628) 264 | -------------------------------------------------------------------------------- /Modules/QueueTimers.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | --[[ 9 | Timer.lua line 2 10 | TIMER_TYPE_PVP = 1; 11 | TIMER_TYPE_CHALLENGE_MODE = 2; 12 | TIMER_TYPE_PLAYER_COUNTDOWN = 3; 13 | ]] 14 | function mod:START_TIMER(timerType, timeSeconds) 15 | if timerType == 3 then return end 16 | 17 | for i = 1, #TimerTracker.timerList do 18 | TimerTracker.timerList[i].bar:Hide() -- Hide the Blizz start timer 19 | end 20 | 21 | local bar = self:GetBar(L.battleBegins) 22 | if not bar or timeSeconds > bar.remaining+1 or timeSeconds < bar.remaining-1 then -- Don't restart bars for subtle changes +/- 1s 23 | self:StartBar(L.battleBegins, timeSeconds, 618859, "colorOther") -- 618859 = Interface/Icons/achievement_challengemode_platinum 24 | end 25 | end 26 | mod:RegisterEvent("START_TIMER") 27 | 28 | do -- estimated wait timer and port timer 29 | local GetBattlefieldStatus = GetBattlefieldStatus 30 | local GetBattlefieldPortExpiration = GetBattlefieldPortExpiration 31 | local GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited = GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited 32 | local ARENA = ARENA 33 | local queueBars = {} 34 | 35 | function mod:PLAYER_ENTERING_WORLD() 36 | self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 37 | self:UnregisterEvent("PLAYER_ENTERING_WORLD") 38 | end 39 | 40 | function mod:UPDATE_BATTLEFIELD_STATUS(queueId) 41 | local status, mapName, _, _, _, queueType, gameType = GetBattlefieldStatus(queueId) 42 | 43 | if queueType == "ARENASKIRMISH" then 44 | mapName = string.format("%s (%d)", ARENA, queueId) -- No size or name distinction given for casual arena 2v2/3v3, separate them manually. Messy :( 45 | end 46 | 47 | if status == "confirm" then -- BG has popped, time until cancelled 48 | local bar = queueBars[queueId] 49 | if bar and bar:Get("capping:queueid") then 50 | bar:Stop() 51 | end 52 | 53 | bar = self:StartBar(mapName, GetBattlefieldPortExpiration(queueId), 132327, "colorOther", true) -- 132327 = Interface/Icons/Ability_TownWatch 54 | bar:Set("capping:queueid", queueId) 55 | queueBars[queueId] = bar 56 | 57 | if cap.db.profile.useMasterForQueue then 58 | local _, id = PlaySound(8459, "Master", false) -- SOUNDKIT.PVP_THROUGH_QUEUE 59 | if id then 60 | StopSound(id-1) -- Should work most of the time to stop the blizz sound 61 | end 62 | end 63 | elseif status == "queued" and cap.db.profile.queueBars then -- Waiting for BG to pop 64 | if not mapName then -- Brawl queue after a ReloadUI() is nil cuz lul 65 | if gameType then 66 | mapName = gameType 67 | else 68 | return 69 | end 70 | end 71 | 72 | local esttime = GetBattlefieldEstimatedWaitTime(queueId) / 1000 -- 0 when queue is paused 73 | local waited = GetBattlefieldTimeWaited(queueId) / 1000 74 | local estremain = esttime - waited 75 | local bar = queueBars[queueId] 76 | if bar and not bar:Get("capping:queueid") then 77 | bar = nil 78 | end 79 | 80 | if estremain > 1 then -- Not a paused queue (0) and not a negative queue (in queue longer than estimated time). 81 | if not bar or estremain > bar.remaining+10 or estremain < bar.remaining-10 or bar:GetLabel() ~= mapName then -- Don't restart bars for subtle changes +/- 10s 82 | local icon 83 | for i = 1, GetNumBattlegroundTypes() do 84 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 85 | if name == mapName then 86 | icon = bgIcon 87 | break 88 | end 89 | end 90 | if bar then 91 | bar:Stop() 92 | end 93 | bar = self:StartBar(mapName, estremain, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 94 | bar:Set("capping:queueid", queueId) 95 | queueBars[queueId] = bar 96 | end 97 | else -- Negative queue (in queue longer than estimated time) or 0 queue (paused) 98 | if not bar or bar.remaining ~= 1 then 99 | local icon 100 | for i = 1, GetNumBattlegroundTypes() do 101 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 102 | if name == mapName then 103 | icon = bgIcon 104 | break 105 | end 106 | end 107 | if bar then 108 | bar:Stop() 109 | end 110 | bar = self:StartBar(mapName, 1, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 111 | bar:Pause() 112 | bar.remaining = 1 113 | bar:SetTimeVisibility(false) 114 | bar:Set("capping:queueid", queueId) 115 | queueBars[queueId] = bar 116 | end 117 | end 118 | elseif status == "none" then -- Leaving queue 119 | local bar = queueBars[queueId] 120 | if bar and bar:Get("capping:queueid") then 121 | bar:Stop() 122 | end 123 | queueBars[queueId] = nil 124 | elseif status == "active" then -- Entered Zone, stop all queue bars 125 | self:UnregisterEvent("UPDATE_BATTLEFIELD_STATUS") 126 | self:RegisterEvent("PLAYER_ENTERING_WORLD") 127 | for id, bar in next, queueBars do 128 | if bar:Get("capping:queueid") then 129 | bar:Stop() 130 | end 131 | queueBars[id] = nil 132 | end 133 | end 134 | end 135 | end 136 | mod:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 137 | -------------------------------------------------------------------------------- /Modules/QueueTimers_TBC.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | function mod:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) 9 | local timeSeconds 10 | local num = msg:match("(%d+)") 11 | if num then num = tonumber(num) end 12 | 13 | if num == 30 or msg == L.arenaStart30s then 14 | timeSeconds = 30 15 | elseif num == 2 then 16 | timeSeconds = 120 17 | elseif num == 1 or msg == L.arenaStart60s then 18 | timeSeconds = 60 19 | elseif msg == L.arenaStart15s then 20 | timeSeconds = 15 21 | else 22 | return 23 | end 24 | 25 | self:StartBar(L.battleBegins, timeSeconds, 136106, "colorOther", nil, timeSeconds == 120 and timeSeconds or 60) -- 136106 = Interface/Icons/Spell_nature_timestop 26 | end 27 | mod:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") 28 | 29 | do -- estimated wait timer and port timer 30 | local GetBattlefieldStatus = GetBattlefieldStatus 31 | local GetBattlefieldPortExpiration = GetBattlefieldPortExpiration 32 | local GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited = GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited 33 | local ARENA = ARENA 34 | local queueBars = {} 35 | 36 | function mod:PLAYER_ENTERING_WORLD() 37 | self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 38 | self:UnregisterEvent("PLAYER_ENTERING_WORLD") 39 | end 40 | 41 | function mod:UPDATE_BATTLEFIELD_STATUS(queueId) 42 | local status, mapName, _, _, _, queueType, gameType = GetBattlefieldStatus(queueId) 43 | 44 | if queueType == "ARENASKIRMISH" then 45 | mapName = string.format("%s (%d)", ARENA, queueId) -- No size or name distinction given for casual arena 2v2/3v3, separate them manually. Messy :( 46 | end 47 | 48 | if status == "confirm" then -- BG has popped, time until cancelled 49 | local bar = queueBars[queueId] 50 | if bar and bar:Get("capping:queueid") then 51 | bar:Stop() 52 | end 53 | 54 | bar = self:StartBar(mapName, GetBattlefieldPortExpiration(queueId), 132327, "colorOther", true) -- 132327 = Interface/Icons/Ability_TownWatch 55 | bar:Set("capping:queueid", queueId) 56 | queueBars[queueId] = bar 57 | 58 | if cap.db.profile.useMasterForQueue then 59 | local _, id = PlaySound(8459, "Master", false) -- SOUNDKIT.PVP_THROUGH_QUEUE 60 | if id then 61 | StopSound(id-1) -- Should work most of the time to stop the blizz sound 62 | end 63 | end 64 | elseif status == "queued" and cap.db.profile.queueBars then -- Waiting for BG to pop 65 | if not mapName then -- Brawl queue after a ReloadUI() is nil cuz lul 66 | if gameType then 67 | mapName = gameType 68 | else 69 | return 70 | end 71 | end 72 | 73 | local esttime = GetBattlefieldEstimatedWaitTime(queueId) / 1000 -- 0 when queue is paused 74 | local waited = GetBattlefieldTimeWaited(queueId) / 1000 75 | local estremain = esttime - waited 76 | local bar = queueBars[queueId] 77 | if bar and not bar:Get("capping:queueid") then 78 | bar = nil 79 | end 80 | 81 | if estremain > 1 then -- Not a paused queue (0) and not a negative queue (in queue longer than estimated time). 82 | if not bar or estremain > bar.remaining+10 or estremain < bar.remaining-10 or bar:GetLabel() ~= mapName then -- Don't restart bars for subtle changes +/- 10s 83 | if bar then 84 | bar:Stop() 85 | end 86 | bar = self:StartBar(mapName, estremain, 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 87 | bar:Set("capping:queueid", queueId) 88 | queueBars[queueId] = bar 89 | end 90 | else -- Negative queue (in queue longer than estimated time) or 0 queue (paused) 91 | if not bar or bar.remaining ~= 1 then 92 | if bar then 93 | bar:Stop() 94 | end 95 | bar = self:StartBar(mapName, 1, 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 96 | bar:Pause() 97 | bar.remaining = 1 98 | bar:SetTimeVisibility(false) 99 | bar:Set("capping:queueid", queueId) 100 | queueBars[queueId] = bar 101 | end 102 | end 103 | elseif status == "none" then -- Leaving queue 104 | local bar = queueBars[queueId] 105 | if bar and bar:Get("capping:queueid") then 106 | bar:Stop() 107 | end 108 | queueBars[queueId] = nil 109 | elseif status == "active" then -- Entered Zone, stop all queue bars 110 | self:UnregisterEvent("UPDATE_BATTLEFIELD_STATUS") 111 | self:RegisterEvent("PLAYER_ENTERING_WORLD") 112 | for id, bar in next, queueBars do 113 | if bar:Get("capping:queueid") then 114 | bar:Stop() 115 | end 116 | queueBars[id] = nil 117 | end 118 | end 119 | end 120 | end 121 | mod:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 122 | -------------------------------------------------------------------------------- /Modules/QueueTimers_Vanilla.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | --[[ 9 | Enum.StartTimerType.PvPBeginTimer = 0 10 | Enum.StartTimerType.ChallengeModeCountdown = 1 11 | Enum.StartTimerType.PlayerCountdown = 2 12 | Enum.StartTimerType.PlunderstormCountdown = 3 13 | ]] 14 | function mod:START_TIMER(timerType, timeSeconds) 15 | if timerType ~= 0 then return end 16 | 17 | for i = 1, #TimerTracker.timerList do 18 | TimerTracker.timerList[i].bar:Hide() -- Hide the Blizz start timer 19 | end 20 | 21 | local bar = self:GetBar(L.battleBegins) 22 | if not bar or timeSeconds > bar.remaining+1 or timeSeconds < bar.remaining-1 then -- Don't restart bars for subtle changes +/- 1s 23 | self:StartBar(L.battleBegins, timeSeconds, 136106, "colorOther") -- 136106 = Interface/Icons/Spell_nature_timestop 24 | end 25 | end 26 | mod:RegisterEvent("START_TIMER") 27 | 28 | do -- estimated wait timer and port timer 29 | local GetBattlefieldStatus = GetBattlefieldStatus 30 | local GetBattlefieldPortExpiration = GetBattlefieldPortExpiration 31 | local GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited = GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited 32 | local ARENA = ARENA 33 | local queueBars = {} 34 | 35 | function mod:PLAYER_ENTERING_WORLD() 36 | self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 37 | self:UnregisterEvent("PLAYER_ENTERING_WORLD") 38 | end 39 | 40 | function mod:UPDATE_BATTLEFIELD_STATUS(queueId) 41 | local status, mapName, _, _, _, _, _, _, _, queueType = GetBattlefieldStatus(queueId) 42 | 43 | if queueType == "ARENASKIRMISH" then 44 | mapName = string.format("%s (%d)", ARENA, queueId) -- No size or name distinction given for casual arena 2v2/3v3, separate them manually. Messy :( 45 | end 46 | 47 | if status == "confirm" then -- BG has popped, time until cancelled 48 | local bar = queueBars[queueId] 49 | if bar and bar:Get("capping:queueid") then 50 | bar:Stop() 51 | end 52 | 53 | bar = self:StartBar(mapName, GetBattlefieldPortExpiration(queueId), 132327, "colorOther", true) -- 132327 = Interface/Icons/Ability_TownWatch 54 | bar:Set("capping:queueid", queueId) 55 | queueBars[queueId] = bar 56 | 57 | if cap.db.profile.useMasterForQueue then 58 | local _, id = PlaySound(8459, "Master", false) -- SOUNDKIT.PVP_THROUGH_QUEUE 59 | if id then 60 | StopSound(id-1) -- Should work most of the time to stop the blizz sound 61 | end 62 | end 63 | elseif status == "queued" and cap.db.profile.queueBars then -- Waiting for BG to pop 64 | --if not mapName then -- Brawl queue after a ReloadUI() is nil cuz lul 65 | -- if gameType then 66 | -- mapName = gameType 67 | -- else 68 | -- return 69 | -- end 70 | --end 71 | 72 | local esttime = GetBattlefieldEstimatedWaitTime(queueId) / 1000 -- 0 when queue is paused 73 | local waited = GetBattlefieldTimeWaited(queueId) / 1000 74 | local estremain = esttime - waited 75 | local bar = queueBars[queueId] 76 | if bar and not bar:Get("capping:queueid") then 77 | bar = nil 78 | end 79 | 80 | if estremain > 1 then -- Not a paused queue (0) and not a negative queue (in queue longer than estimated time). 81 | if not bar or estremain > bar.remaining+10 or estremain < bar.remaining-10 or bar:GetLabel() ~= mapName then -- Don't restart bars for subtle changes +/- 10s 82 | local icon 83 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo() 84 | if name == mapName then 85 | icon = bgIcon 86 | end 87 | --for i = 1, GetNumBattlegroundTypes() do 88 | -- local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 89 | -- if name == mapName then 90 | -- icon = bgIcon 91 | -- break 92 | -- end 93 | --end 94 | if bar then 95 | bar:Stop() 96 | end 97 | bar = self:StartBar(mapName, estremain, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 98 | bar:Set("capping:queueid", queueId) 99 | queueBars[queueId] = bar 100 | end 101 | else -- Negative queue (in queue longer than estimated time) or 0 queue (paused) 102 | if not bar or bar.remaining ~= 1 then 103 | local icon 104 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo() 105 | if name == mapName then 106 | icon = bgIcon 107 | end 108 | --for i = 1, GetNumBattlegroundTypes() do 109 | -- local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 110 | -- if name == mapName then 111 | -- icon = bgIcon 112 | -- break 113 | -- end 114 | --end 115 | if bar then 116 | bar:Stop() 117 | end 118 | bar = self:StartBar(mapName, 1, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 119 | bar:Pause() 120 | bar.remaining = 1 121 | bar:SetTimeVisibility(false) 122 | bar:Set("capping:queueid", queueId) 123 | queueBars[queueId] = bar 124 | end 125 | end 126 | elseif status == "none" then -- Leaving queue 127 | local bar = queueBars[queueId] 128 | if bar and bar:Get("capping:queueid") then 129 | bar:Stop() 130 | end 131 | queueBars[queueId] = nil 132 | elseif status == "active" then -- Entered Zone, stop all queue bars 133 | self:UnregisterEvent("UPDATE_BATTLEFIELD_STATUS") 134 | self:RegisterEvent("PLAYER_ENTERING_WORLD") 135 | for id, bar in next, queueBars do 136 | if bar:Get("capping:queueid") then 137 | bar:Stop() 138 | end 139 | queueBars[id] = nil 140 | end 141 | end 142 | end 143 | end 144 | mod:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 145 | -------------------------------------------------------------------------------- /Modules/QueueTimers_Wrath.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, cap 3 | do 4 | local _, core = ... 5 | mod, L, cap = core:NewMod() 6 | end 7 | 8 | function mod:CHAT_MSG_BG_SYSTEM_NEUTRAL(msg) 9 | local timeSeconds 10 | local num = msg:match("(%d+)") 11 | if num then num = tonumber(num) end 12 | 13 | if num == 30 or msg == L.arenaStart30s then 14 | timeSeconds = 30 15 | elseif num == 2 then 16 | timeSeconds = 120 17 | elseif num == 1 or msg == L.arenaStart60s then 18 | timeSeconds = 60 19 | elseif msg == L.arenaStart15s then 20 | timeSeconds = 15 21 | else 22 | return 23 | end 24 | 25 | self:StartBar(L.battleBegins, timeSeconds, 136106, "colorOther", nil, timeSeconds == 120 and timeSeconds or 60) -- 136106 = Interface/Icons/Spell_nature_timestop 26 | end 27 | mod:RegisterEvent("CHAT_MSG_BG_SYSTEM_NEUTRAL") 28 | 29 | do -- estimated wait timer and port timer 30 | local GetBattlefieldStatus = GetBattlefieldStatus 31 | local GetBattlefieldPortExpiration = GetBattlefieldPortExpiration 32 | local GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited = GetBattlefieldEstimatedWaitTime, GetBattlefieldTimeWaited 33 | local ARENA = ARENA 34 | local queueBars = {} 35 | 36 | function mod:PLAYER_ENTERING_WORLD() 37 | self:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 38 | self:UnregisterEvent("PLAYER_ENTERING_WORLD") 39 | end 40 | 41 | function mod:UPDATE_BATTLEFIELD_STATUS(queueId) 42 | local status, mapName, _, _, _, queueType, gameType = GetBattlefieldStatus(queueId) 43 | 44 | if queueType == "ARENASKIRMISH" then 45 | mapName = string.format("%s (%d)", ARENA, queueId) -- No size or name distinction given for casual arena 2v2/3v3, separate them manually. Messy :( 46 | end 47 | 48 | if status == "confirm" then -- BG has popped, time until cancelled 49 | local bar = queueBars[queueId] 50 | if bar and bar:Get("capping:queueid") then 51 | bar:Stop() 52 | end 53 | 54 | bar = self:StartBar(mapName, GetBattlefieldPortExpiration(queueId), 132327, "colorOther", true) -- 132327 = Interface/Icons/Ability_TownWatch 55 | bar:Set("capping:queueid", queueId) 56 | queueBars[queueId] = bar 57 | 58 | if cap.db.profile.useMasterForQueue then 59 | local _, id = PlaySound(8459, "Master", false) -- SOUNDKIT.PVP_THROUGH_QUEUE 60 | if id then 61 | StopSound(id-1) -- Should work most of the time to stop the blizz sound 62 | end 63 | end 64 | elseif status == "queued" and cap.db.profile.queueBars then -- Waiting for BG to pop 65 | if not mapName then -- Brawl queue after a ReloadUI() is nil cuz lul 66 | if gameType then 67 | mapName = gameType 68 | else 69 | return 70 | end 71 | end 72 | 73 | local esttime = GetBattlefieldEstimatedWaitTime(queueId) / 1000 -- 0 when queue is paused 74 | local waited = GetBattlefieldTimeWaited(queueId) / 1000 75 | local estremain = esttime - waited 76 | local bar = queueBars[queueId] 77 | if bar and not bar:Get("capping:queueid") then 78 | bar = nil 79 | end 80 | 81 | if estremain > 1 then -- Not a paused queue (0) and not a negative queue (in queue longer than estimated time). 82 | if not bar or estremain > bar.remaining+10 or estremain < bar.remaining-10 or bar:GetLabel() ~= mapName then -- Don't restart bars for subtle changes +/- 10s 83 | local icon 84 | for i = 1, GetNumBattlegroundTypes() do 85 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 86 | if name == mapName then 87 | icon = bgIcon 88 | break 89 | end 90 | end 91 | if bar then 92 | bar:Stop() 93 | end 94 | bar = self:StartBar(mapName, estremain, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 95 | bar:Set("capping:queueid", queueId) 96 | queueBars[queueId] = bar 97 | end 98 | else -- Negative queue (in queue longer than estimated time) or 0 queue (paused) 99 | if not bar or bar.remaining ~= 1 then 100 | local icon 101 | for i = 1, GetNumBattlegroundTypes() do 102 | local name,_,_,_,_,_,_,_,_,bgIcon = GetBattlegroundInfo(i) 103 | if name == mapName then 104 | icon = bgIcon 105 | break 106 | end 107 | end 108 | if bar then 109 | bar:Stop() 110 | end 111 | bar = self:StartBar(mapName, 1, icon or 134400, "colorQueue", true) -- Question mark icon for random battleground (134400) Interface/Icons/INV_Misc_QuestionMark 112 | bar:Pause() 113 | bar.remaining = 1 114 | bar:SetTimeVisibility(false) 115 | bar:Set("capping:queueid", queueId) 116 | queueBars[queueId] = bar 117 | end 118 | end 119 | elseif status == "none" then -- Leaving queue 120 | local bar = queueBars[queueId] 121 | if bar and bar:Get("capping:queueid") then 122 | bar:Stop() 123 | end 124 | queueBars[queueId] = nil 125 | elseif status == "active" then -- Entered Zone, stop all queue bars 126 | self:UnregisterEvent("UPDATE_BATTLEFIELD_STATUS") 127 | self:RegisterEvent("PLAYER_ENTERING_WORLD") 128 | for id, bar in next, queueBars do 129 | if bar:Get("capping:queueid") then 130 | bar:Stop() 131 | end 132 | queueBars[id] = nil 133 | end 134 | end 135 | end 136 | end 137 | mod:RegisterEvent("UPDATE_BATTLEFIELD_STATUS") 138 | -------------------------------------------------------------------------------- /Modules/WarsongGulchTwinPeaks.lua: -------------------------------------------------------------------------------- 1 | 2 | local mod, L, isRetail 3 | do 4 | local _, core = ... 5 | mod, L = core:NewMod() 6 | isRetail = core.isRetail 7 | end 8 | 9 | local strmatch = string.match 10 | do 11 | local icon = {136441, C_Minimap.GetPOITextureCoords(45)} 12 | function mod:CHAT_MSG(msg) 13 | if strmatch(msg, L.capturedTheTrigger) then -- flag was captured 14 | self:StartBar(L.flagRespawns, 12, isRetail and icon or 134420, "colorOther") -- White flag, or inv_misc_rune_07 (WSG rune) 15 | end 16 | end 17 | end 18 | 19 | do 20 | local GetIconAndTextWidgetVisualizationInfo = C_UIWidgetManager.GetIconAndTextWidgetVisualizationInfo 21 | local tonumber = tonumber 22 | local function GetTimeRemaining(self) 23 | -- 6: WSG & TP, 630: TP old versions (changed at some point prior to 11.1.5) 24 | local tbl = GetIconAndTextWidgetVisualizationInfo(6) or GetIconAndTextWidgetVisualizationInfo(630) 25 | if tbl and tbl.state == 1 then 26 | local minutes, seconds = strmatch(tbl.text, "(%d%d)[^%d]+(%d%d)") 27 | minutes = tonumber(minutes) 28 | seconds = tonumber(seconds) 29 | if minutes and seconds then 30 | local remaining = seconds + (minutes*60) + 1 31 | local bar = self:GetBar(L.timeRemaining) 32 | if remaining > 3 and (not bar or bar.remaining > remaining+5 or bar.remaining < remaining-5) then -- Don't restart bars for subtle changes +/- 5s 33 | self:StartBar(L.timeRemaining, remaining, 134420, "colorOther") -- Interface/Icons/INV_Misc_Rune_07 34 | end 35 | end 36 | end 37 | end 38 | 39 | function mod:WSGTimeLeft(widgetInfo) 40 | if widgetInfo and widgetInfo.widgetID == 4330 then -- Wrath, not sure about Vanilla/TBC/Cata/Mists 41 | local tbl = GetIconAndTextWidgetVisualizationInfo(widgetInfo.widgetID) 42 | if tbl and tbl.state == 1 then 43 | local minutes = strmatch(tbl.text, "(%d+)") 44 | minutes = tonumber(minutes) 45 | if minutes and minutes < 16 then -- Starts at 25min, wait until 15min is left 46 | local remaining = minutes * 60 47 | self:StartBar(L.timeRemaining, remaining, 134420, "colorOther", nil, minutes > 5 and 900 or 300) -- Interface/Icons/INV_Misc_Rune_07 48 | end 49 | end 50 | end 51 | end 52 | 53 | function mod:EnterZone() 54 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_HORDE", "CHAT_MSG") 55 | self:RegisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE", "CHAT_MSG") 56 | if isRetail then 57 | local func = function() GetTimeRemaining(self) end 58 | self:Timer(5, func) 59 | self:Timer(30, func) 60 | self:Timer(60, func) 61 | self:Timer(130, func) 62 | self:Timer(240, func) 63 | else 64 | self:RegisterEvent("UPDATE_UI_WIDGET", "WSGTimeLeft") 65 | end 66 | end 67 | end 68 | 69 | function mod:ExitZone() 70 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_HORDE") 71 | self:UnregisterEvent("CHAT_MSG_BG_SYSTEM_ALLIANCE") 72 | end 73 | 74 | mod:RegisterZone(2106) -- Warsong Gultch 75 | mod:RegisterZone(489) -- Warsong Gultch classic 76 | mod:RegisterZone(726) -- Twin Peaks 77 | -------------------------------------------------------------------------------- /Options/Capping_Options.toc: -------------------------------------------------------------------------------- 1 | ## Interface: 11506, 11507, 20504, 30404, 40402, 40401, 50500, 110105, 110107, 110100 2 | ## Title: Capping_Options 3 | ## Author: Funkydude 4 | ## Notes: Capping Configuration Options. 5 | ## Notes-esES: Opciones de configuración de Capping. 6 | ## Notes-esMX: Opciones de configuración de Capping. 7 | ## Notes-zhCN: Capping 配置选项。 8 | ## Notes-zhTW: Capping 配置選項。 9 | ## Notes-deDE: Capping Einstellungen. 10 | ## Notes-frFR: Options de configuration de Capping. 11 | ## Notes-itIT: Capping Configuration Options. 12 | ## Notes-koKR: Capping|1을;를; 설정하는 옵션입니다. 13 | ## Notes-ptBR: Capping Opções de Configuração. 14 | ## Notes-ruRU: Capping параметры настроек. 15 | ## Version: @project-version@ 16 | ## LoadOnDemand: 1 17 | ## Dependencies: Capping 18 | 19 | ## X-Category: Battlegrounds/PvP 20 | ## X-Website: https://github.com/BigWigsMods/Capping 21 | ## X-License: All Rights Reserved: You are free to fork and modify on GitHub, please ask us about anything else. 22 | ## X-Curse-Project-ID: 20143 23 | ## X-WoWI-ID: 11177 24 | ## X-Wago-ID: Rn6VXOGd 25 | 26 | embeds.xml 27 | locales.xml 28 | Options.lua 29 | 30 | -------------------------------------------------------------------------------- /Options/Locales/deDE.lua: -------------------------------------------------------------------------------- 1 | if GetLocale() ~= "deDE" then return end 2 | local _, mod = ... 3 | local L = mod.L 4 | 5 | --- Options 6 | L.introduction = "Auf die folgenden Optionen kannst du immer zugreifen, indem du im Chat den folgenden Befehl eingibst: /capping" 7 | L.general = "Generell" 8 | L.test = "Test" 9 | L.lock = "Fenster fixieren" 10 | L.lockDesc = "Aktiviere die Sperre, um den Anker zum Verschieben der Stäbe auszublenden und zu verhindern, dass die Stäbe verschoben werden." 11 | L.barIcon = "Leistensymbol" 12 | L.showTime = "Zeit anzeigen" 13 | L.fillBar = "Leiste füllen" 14 | L.font = "Schriftart" 15 | L.fontSize = "Schriftgröße" 16 | L.monochrome = "Monochromer Text" 17 | L.outline = "Umriss" 18 | L.none = "Keine" 19 | L.thin = "Dünn" 20 | L.thick = "Dick" 21 | L.texture = "Textur" 22 | L.barSpacing = "Leistenabstand" 23 | L.barWidth = "Leistenbreite" 24 | L.barHeight = "Leistenhöhe" 25 | L.alignText = "Text ausrichten" 26 | L.alignTime = "Zeit ausrichten" 27 | L.alignIcon = "Leiste ausrichten Symbol" 28 | L.left = "Links" 29 | L.center = "Zentriert" 30 | L.right = "Rechts" 31 | L.growUpwards = "Nach oben erweitern" 32 | L.textColor = "Schriftfarbe" 33 | L.allianceBars = "Allianz Leisten" 34 | L.hordeBars = "Horde Leisten" 35 | L.queueBars = "Warteschlangen Leisten" 36 | L.otherBars = "Andere Leisten" 37 | L.barBackground = "Leistenhintergrund" 38 | 39 | --- Features 40 | L.features = "Eigenschaften" 41 | L.queueBarsDesc = "Aktivieren Sie die Leisten, die anzeigen, welchen Warteschlangen Sie beigetreten sind und wie lange Sie sich voraussichtlich in Ihnen befinden werden." 42 | L.barClickDesc = "Konfigurieren Sie den Tastaturmodifikator, den Sie für bestimmte Chatausgaben beim Klicken auf eine Leiste verwenden möchten. Wenn Sie alle 3 auf 'Keine' setzen, werden klickbare Leisten deaktiviert, so dass Sie sich durch sie hindurchklicken können." 43 | L.shiftClick = "Shift-Klick" 44 | L.controlClick = "Control-Klick" 45 | L.altClick = "Alt-Klick" 46 | L.sayChat = "Sagen Chat" 47 | L.raidChat = "Gruppenchat" 48 | L.clickableBars = "Klickbare Leisten" 49 | L.loudQueue = "Laute Warteschlange" 50 | L.loudQueueDesc = "Wenn die Warteschlange bereit ist, wird eine akustische Benachrichtigung, über den 'Haupt'-Tonkanal abgespielt." 51 | L.autoTurnIn = "Automatisches Abgeben" 52 | L.autoTurnInDesc = "Gib in Zonen wie dem Alteractal und Ashran automatisch Questgegenstände ab." 53 | -------------------------------------------------------------------------------- /Options/Locales/enUS.lua: -------------------------------------------------------------------------------- 1 | 2 | local _, mod = ... 3 | if not mod.L then -- Support repo users by checking if it already exists 4 | mod.L = {} 5 | end 6 | local L = mod.L 7 | 8 | --- Options 9 | L.introduction = "The options below can always be accessed by typing the following command in chat: /capping" 10 | L.general = "General" 11 | L.test = "Test" 12 | L.lock = "Lock" 13 | L.lockDesc = "Enable the lock to hide the bar moving anchor, preventing the bars from being moved." 14 | L.barIcon = "Bar Icon" 15 | L.showTime = "Show Time" 16 | L.fillBar = "Fill Bar" 17 | L.font = "Font" 18 | L.fontSize = "Font Size" 19 | L.monochrome = "Monochrome Text" 20 | L.outline = "Outline" 21 | L.none = "None" 22 | L.thin = "Thin" 23 | L.thick = "Thick" 24 | L.texture = "Texture" 25 | L.barSpacing = "Bar Spacing" 26 | L.barWidth = "Bar Width" 27 | L.barHeight = "Bar Height" 28 | L.alignText = "Align Text" 29 | L.alignTime = "Align Time" 30 | L.alignIcon = "Align Bar Icon" 31 | L.left = "Left" 32 | L.center = "Center" 33 | L.right = "Right" 34 | L.growUpwards = "Grow Upwards" 35 | L.textColor = "Text Color" 36 | L.allianceBars = "Alliance Bars" 37 | L.hordeBars = "Horde Bars" 38 | L.queueBars = "Queue Bars" 39 | L.otherBars = "Other Bars" 40 | L.barBackground = "Bar Background" 41 | 42 | --- Features 43 | L.features = "Features" 44 | L.queueBarsDesc = "Enable the bars showing which queues you have joined and the estimated time you will be in the queue for." 45 | L.barClickDesc = "Configure the keyboard modifier you wish to use for specific chat output when clicking on a bar. Setting all 3 to 'None' will disable clickable bars, allowing you to click through them." 46 | L.shiftClick = "Shift-Click" 47 | L.controlClick = "Control-Click" 48 | L.altClick = "Alt-Click" 49 | L.sayChat = "Say Chat" 50 | L.raidChat = "Group Chat" 51 | L.clickableBars = "Clickable Bars" 52 | L.loudQueue = "Loud Queue" 53 | L.loudQueueDesc = "When the queue is ready the sound notification will be forced to play over the 'Master' sound channel." 54 | L.autoTurnIn = "Auto Turn-In" 55 | L.autoTurnInDesc = "Automatically turn in quest items in zones like Alterac Valley and Ashran." 56 | -------------------------------------------------------------------------------- /Options/Locales/esES.lua: -------------------------------------------------------------------------------- 1 | if GetLocale() ~= "esES" then return end 2 | local _, mod = ... 3 | local L = mod.L 4 | 5 | --- Options 6 | L.introduction = "Puedes acceder a las opciones de abajo escribiendo el siguiente comando en el chat: /capping" 7 | L.general = "General" 8 | L.test = "Prueba" 9 | L.lock = "Bloqueo" 10 | L.lockDesc = "Activa el bloqueo para esconder el ancla móvil de la barra, evitando que las barras se muevan" 11 | L.barIcon = "Icono de barra" 12 | L.showTime = "Mostrar tiempo" 13 | L.fillBar = "Rellenar barra" 14 | L.font = "Fuente" 15 | L.fontSize = "Tamaño de fuente" 16 | L.monochrome = "Texto monocromo" 17 | L.outline = "Borde de línea" 18 | L.none = "Ninguno" 19 | L.thin = "Estrecho" 20 | L.thick = "Grueso" 21 | L.texture = "Textura" 22 | L.barSpacing = "Espacio de barra" 23 | L.barWidth = "Anchura de barra" 24 | L.barHeight = "Altura de barra" 25 | L.alignText = "Alinear texto" 26 | L.alignTime = "Alinear tiempo" 27 | L.alignIcon = "Alinear icono de barra" 28 | L.left = "Izquierda" 29 | L.center = "Centro" 30 | L.right = "Derecha" 31 | L.growUpwards = "Crecer hacia arriba" 32 | L.textColor = "Color de texto" 33 | L.allianceBars = "Barras de la Alianza" 34 | L.hordeBars = "Barras de la Horda" 35 | L.queueBars = "Barras de cola" 36 | L.otherBars = "Otras barras" 37 | L.barBackground = "Fondo de barra" 38 | 39 | --- Features 40 | L.features = "Características" 41 | L.queueBarsDesc = "Activa las barras mostrando a qué colas te has unido y qué tiempo estimado en cola estarás." 42 | L.barClickDesc = "Configura el modificador de teclado que desees usar para la salida de chat específica cuando hagas click en una barra. Seleccionando las 3 a 'Ninguno' desactivará las barras clicables, permitiéndote clicar a través de ellas." 43 | L.shiftClick = "Shift-Clic" 44 | L.controlClick = "Control-Clic" 45 | L.altClick = "Alt-Clic" 46 | L.sayChat = "Chat decir" 47 | L.raidChat = "Chat de grupo" 48 | L.clickableBars = "Barras clicables" 49 | L.loudQueue = "Cola ruidosa" 50 | L.loudQueueDesc = "Cuando la cola esté lista el sonido de notificación será forzado a sonar a través del canal de sonido 'General'." 51 | L.autoTurnIn = "Entregar automáticamente" 52 | L.autoTurnInDesc = "Automáticamente entrega objetos de misión en zonas como Valle de Alterac y Ashran." 53 | -------------------------------------------------------------------------------- /Options/Locales/esMX.lua: -------------------------------------------------------------------------------- 1 | if GetLocale() ~= "esMX" then return end 2 | local _, mod = ... 3 | local L = mod.L 4 | 5 | --- Options 6 | L.introduction = "Puedes acceder a los opciones de abajo escribiendo el siguiente comando en el chat: /capping" 7 | L.general = "General" 8 | L.test = "Prueba" 9 | L.lock = "Bloqueo" 10 | L.lockDesc = "Activa el bloqueo para esconder el ancla móvil de la barra, evitando que las barras se muevan" 11 | L.barIcon = "Icono de barra" 12 | L.showTime = "Mostrar tiempo" 13 | L.fillBar = "Rellenar barra" 14 | L.font = "Fuente" 15 | L.fontSize = "Tamaño de fuente" 16 | L.monochrome = "Texto monocromo" 17 | L.outline = "Borde de línea" 18 | L.none = "Ninguno" 19 | L.thin = "Estrecho" 20 | L.thick = "Grueso" 21 | L.texture = "Textura" 22 | L.barSpacing = "Espacio de barra" 23 | L.barWidth = "Anchura de barra" 24 | L.barHeight = "Altura de barra" 25 | L.alignText = "Alinear texto" 26 | L.alignTime = "Alinear tiempo" 27 | L.alignIcon = "Alinear icono de barra" 28 | L.left = "Izquierda" 29 | L.center = "Centro" 30 | L.right = "Derecha" 31 | L.growUpwards = "Crecer hacia arriba" 32 | L.textColor = "Color de texto" 33 | L.allianceBars = "Barras de la Alianza" 34 | L.hordeBars = "Barras de la Horda" 35 | L.queueBars = "Barras de cola" 36 | L.otherBars = "Otras barras" 37 | L.barBackground = "Fondo de barra" 38 | 39 | --- Features 40 | L.features = "Características" 41 | L.queueBarsDesc = "Activa las barras mostrando a qué colas te has unido y qué tiempo estimado en cola estarás." 42 | L.barClickDesc = "Configura el modificador de teclado que desees usar para la salida de chat específica cuando hagas click en una barra. Seleccionando las 3 a 'Ninguno' desactivará las barras clicables, permitiéndote clicar a través de ellas." 43 | L.shiftClick = "Shift-Clic" 44 | L.controlClick = "Control-Clic" 45 | L.altClick = "Alt-Clic" 46 | L.sayChat = "Chat decir" 47 | L.raidChat = "Chat de grupo" 48 | L.clickableBars = "Barras clicables" 49 | L.loudQueue = "Cola ruidosa" 50 | L.loudQueueDesc = "Cuando la cola esté lista el sonido de notificación será forzado a sonar a través del canal de sonido 'General'." 51 | L.autoTurnIn = "Entregar automáticamente" 52 | L.autoTurnInDesc = "Automáticamente entrega objetos de misión en zonas como Valle de Alterac y Ashran." 53 | -------------------------------------------------------------------------------- /Options/Locales/frFR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "frFR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | L.introduction = "Les options ci-dessous peuvent être accédées à tout moment en tapant dans le tchat la commande : /capping" 8 | L.general = "Général" 9 | L.test = "Test" 10 | L.lock = "Verrouiller" 11 | L.lockDesc = "Active le verrou afin de cacher la barre permettant de déplacer l'ancre, empêchant les barres d'être déplacées." 12 | L.barIcon = "Icône sur la barre " 13 | L.showTime = "Afficher le temps" 14 | L.fillBar = "Remplissage des barres" 15 | L.font = "Police" 16 | L.fontSize = "Taille de la police" 17 | L.monochrome = "Texte en noir et blanc" 18 | L.outline = "Contour du texte (ombre)" 19 | L.none = "Aucun" 20 | L.thin = "Léger" 21 | L.thick = "Épais" 22 | L.texture = "Texture" 23 | L.barSpacing = "Espacement des barres" 24 | L.barWidth = "Largeur de la barre" 25 | L.barHeight = "Hauteur de la barre" 26 | L.alignText = "Alignement du texte" 27 | L.alignTime = "Alignement du temps" 28 | L.alignIcon = "Alignement de la barre d'icone" 29 | L.left = "Gauche" 30 | L.center = "Centre" 31 | L.right = "Droite" 32 | L.growUpwards = "Ajouts des barres au-dessus de l'ancre" 33 | L.textColor = "Couleur du texte" 34 | L.allianceBars = "Barres de l'Alliance" 35 | L.hordeBars = "Barres de la Horde" 36 | L.queueBars = "Barres de des files d'attentes" 37 | L.otherBars = "Autres barres" 38 | L.barBackground = "Fond de la barre" 39 | 40 | --- Features 41 | L.features = "Fonctionnalités" 42 | L.queueBarsDesc = "Activez les barres indiquant les files d'attente auxquelles vous vous êtes joint et le temps estimé pendant lequel vous serez dans la file d'attente." 43 | L.barClickDesc = "Configurez le modificateur de clavier que vous souhaitez utiliser pour une sortie de discussion spécifique lorsque vous cliquez sur une barre. Régler les 3 sur «Aucun» désactivera les barres cliquables, vous permettant de cliquer dessus." 44 | L.shiftClick = "Maj + clic" 45 | L.controlClick = "Ctrl + clic" 46 | L.altClick = "Alt + clic" 47 | L.sayChat = "Canal général" 48 | L.raidChat = "Canal du groupe" 49 | L.clickableBars = "Barres cliquables" 50 | L.loudQueue = "File d'attente bruyante" 51 | L.loudQueueDesc = "Lorsque la file d'attente est prête, la notification sonore sera forcée de jouer sur le canal sonore «Principal»." 52 | L.autoTurnIn = "Rendre les quêtes automatiquement" 53 | L.autoTurnInDesc = "Rend automatiquement les quêtes d'objets dans les zones telles que la Vallée d'Alterac et A'shran." 54 | -------------------------------------------------------------------------------- /Options/Locales/itIT.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "itIT" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | --L.introduction = "The options below can always be accessed by typing the following command in chat: /capping" 8 | L.general = "General" 9 | --L.test = "Test" 10 | --L.lock = "Lock" 11 | --L.lockDesc = "Enable the lock to hide the bar moving anchor, preventing the bars from being moved." 12 | --L.barIcon = "Bar Icon" 13 | --L.showTime = "Show Time" 14 | --L.fillBar = "Fill Bar" 15 | --L.font = "Font" 16 | --L.fontSize = "Font Size" 17 | --L.monochrome = "Monochrome Text" 18 | --L.outline = "Outline" 19 | --L.none = "None" 20 | --L.thin = "Thin" 21 | --L.thick = "Thick" 22 | --L.texture = "Texture" 23 | --L.barSpacing = "Bar Spacing" 24 | --L.barWidth = "Bar Width" 25 | --L.barHeight = "Bar Height" 26 | --L.alignText = "Align Text" 27 | --L.alignTime = "Align Time" 28 | --L.alignIcon = "Align Bar Icon" 29 | --L.left = "Left" 30 | --L.center = "Center" 31 | --L.right = "Right" 32 | --L.growUpwards = "Grow Upwards" 33 | --L.textColor = "Text Color" 34 | --L.allianceBars = "Alliance Bars" 35 | --L.hordeBars = "Horde Bars" 36 | --L.queueBars = "Queue Bars" 37 | --L.otherBars = "Other Bars" 38 | --L.barBackground = "Bar Background" 39 | 40 | --- Features 41 | --L.features = "Features" 42 | --L.queueBarsDesc = "Enable the bars showing which queues you have joined and the estimated time you will be in the queue for." 43 | --L.barClickDesc = "Configure the keyboard modifier you wish to use for specific chat output when clicking on a bar. Setting all 3 to 'None' will disable clickable bars, allowing you to click through them." 44 | --L.shiftClick = "Shift-Click" 45 | --L.controlClick = "Control-Click" 46 | --L.altClick = "Alt-Click" 47 | --L.sayChat = "Say Chat" 48 | --L.raidChat = "Group Chat" 49 | --L.clickableBars = "Clickable Bars" 50 | --L.loudQueue = "Loud Queue" 51 | --L.loudQueueDesc = "When the queue is ready the sound notification will be forced to play over the 'Master' sound channel." 52 | --L.autoTurnIn = "Auto Turn-In" 53 | --L.autoTurnInDesc = "Automatically turn in quest items in zones like Alterac Valley and Ashran." 54 | -------------------------------------------------------------------------------- /Options/Locales/koKR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "koKR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | L.introduction = "아래 옵션들은 항상 다음 명령어를 채팅창에 입력하여 접근할 수 있습니다: /capping" 8 | L.general = "일반" 9 | L.test = "테스트" 10 | L.lock = "고정시키기" 11 | L.lockDesc = "잠금을 활성화하여 바 이동 앵커를 숨기고, 바가 이동되지 않도록 합니다." 12 | L.barIcon = "바 아이콘" 13 | L.showTime = "시간 표시" 14 | L.fillBar = "바 채우기" 15 | L.font = "글꼴" 16 | L.fontSize = "글꼴 크기" 17 | L.monochrome = "모노크롬 문자" 18 | L.outline = "외곽선" 19 | L.none = "안 함" 20 | L.thin = "얇게" 21 | L.thick = "두껍게" 22 | L.texture = "텍스쳐" 23 | L.barSpacing = "바 간격" 24 | L.barWidth = "바 너비" 25 | L.barHeight = "바 높이" 26 | L.alignText = "텍스트 정렬" 27 | L.alignTime = "시간 정렬" 28 | L.alignIcon = "바 아이콘 정렬" 29 | L.left = "왼쪽" 30 | L.center = "중앙" 31 | L.right = "오른쪽" 32 | L.growUpwards = "위쪽으로 성장" 33 | L.textColor = "문자 색상" 34 | L.allianceBars = "얼라이언스 바" 35 | L.hordeBars = "호드 바" 36 | L.queueBars = "대기열 바" 37 | L.otherBars = "기타 바" 38 | L.barBackground = "바 배경" 39 | 40 | --- Features 41 | L.features = "기능" 42 | L.queueBarsDesc = "대기열과 예상 대기 시간을 보여주는 바를 활성화합니다." 43 | L.barClickDesc = "바를 클릭할 때 특정 채팅 출력을 위한 키보드 수정자를 설정합니다. 세 가지 모두 '없음'으로 설정하면 클릭 가능한 바가 비활성화되어 바를 통과하여 클릭할 수 있습니다." 44 | L.shiftClick = "Shift-Click" 45 | L.controlClick = "Ctrl-Click" 46 | L.altClick = "Alt-Click" 47 | L.sayChat = "일반 채팅" 48 | L.raidChat = "파티/공격대 채팅" 49 | L.clickableBars = "클릭 가능한 바" 50 | L.loudQueue = "대기열 알림" 51 | L.loudQueueDesc = "대기열이 준비되면 알림이 '주 음량' 사운드 채널을 통해 강제로 재생됩니다." 52 | L.autoTurnIn = "자동 반납" 53 | L.autoTurnInDesc = "알터랙 계곡이나 아쉬란과 같은 지역에서 퀘스트 아이템을 자동으로 반납합니다." 54 | -------------------------------------------------------------------------------- /Options/Locales/ptBR.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "ptBR" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | --L.introduction = "The options below can always be accessed by typing the following command in chat: /capping" 8 | L.general = "Geral" 9 | L.test = "Teste" 10 | L.lock = "Fixar" 11 | --L.lockDesc = "Enable the lock to hide the bar moving anchor, preventing the bars from being moved." 12 | L.barIcon = "Ícone da barra" 13 | L.showTime = "Exibir Tempo" 14 | L.fillBar = "Preencher barra" 15 | L.font = "Fonte" 16 | L.fontSize = "Tamanho da fonte" 17 | L.monochrome = "Texto monocromático" 18 | L.outline = "Borda do texto" 19 | L.none = "Nenhuma" 20 | L.thin = "Fina" 21 | L.thick = "Grossa" 22 | L.texture = "Textura" 23 | L.barSpacing = "Espaçamento da barra" 24 | L.barWidth = "Largura da barra" 25 | L.barHeight = "Altura da barra" 26 | L.alignText = "Alinhar Texto" 27 | L.alignTime = "Alinhar Tempo" 28 | L.alignIcon = "Alinhar Icone da Barra" 29 | L.left = "Esquerda" 30 | L.center = "Centro" 31 | L.right = "Direita" 32 | L.growUpwards = "Crescer para cima" 33 | L.textColor = "Cor do texto" 34 | L.allianceBars = "Barras da Aliança" 35 | L.hordeBars = "Barras da Horda" 36 | L.queueBars = "Barras de Filas" 37 | L.otherBars = "Outras Barras" 38 | L.barBackground = "Fundo da Barra" 39 | 40 | --- Features 41 | L.features = "Características" 42 | L.queueBarsDesc = "Ativa as barras que mostram em quais filas você entrou e o tempo estimado que ficará na fila." 43 | L.barClickDesc = "Configure o modificador de teclado que deseja usar para saída de bate-papo específica ao clicar em uma barra. Definir todos os 3 como 'Nenhuma' desativará as barras clicáveis, permitindo que você clique através delas." 44 | L.shiftClick = "Shift-Clique" 45 | L.controlClick = "Control-Clique" 46 | L.altClick = "Alt-Clique" 47 | L.sayChat = "Bate-papo Dizer" 48 | L.raidChat = "Bate-papo do Grupo" 49 | L.clickableBars = "Barras Clicáveis" 50 | L.loudQueue = "Alerta da Fila" 51 | L.loudQueueDesc = "Quando a fila estiver pronta, a notificação de som será forçada a tocar no canal de som 'Mestre'." 52 | --L.autoTurnIn = "Auto Turn-In" 53 | --L.autoTurnInDesc = "Automatically turn in quest items in zones like Alterac Valley and Ashran." 54 | -------------------------------------------------------------------------------- /Options/Locales/ruRU.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "ruRU" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | --L.introduction = "The options below can always be accessed by typing the following command in chat: /capping" 8 | L.general = "Общие" -- возможно нужно заменить на главные 9 | L.test = "Тест" 10 | L.lock = "Закреплен" 11 | --L.lockDesc = "Enable the lock to hide the bar moving anchor, preventing the bars from being moved." 12 | L.barIcon = "Иконка полоски" 13 | L.showTime = "Показ времени" 14 | L.fillBar = "Заполнение полоски" 15 | L.font = "Шрифт" 16 | L.fontSize = "Размер шрифта" 17 | L.monochrome = "Монохромный текст" 18 | L.outline = "Контур" 19 | L.none = "Нет" 20 | L.thin = "Тонкий" 21 | L.thick = "Толстый" 22 | L.texture = "Текстура" 23 | L.barSpacing = "Расстояние полоски" 24 | L.barWidth = "Ширина полоски" 25 | L.barHeight = "Высота полоски" 26 | L.alignText = "Выровнить текст" 27 | L.alignTime = "Выровнить время" 28 | L.alignIcon = "Выровнить иконки" 29 | L.left = "Влево" 30 | L.center = "По центру" 31 | L.right = "Вправо" 32 | L.growUpwards = "Направить вверх" 33 | L.textColor = "Цвет текста" 34 | L.allianceBars = "Полоски Альянса" 35 | L.hordeBars = "Полоски Орды" 36 | L.queueBars = "Полоски очерди" 37 | L.otherBars = "Иные полоски" 38 | L.barBackground = "Задний план полоски" 39 | 40 | --- Features 41 | L.features = "Возможности" -- возможно нужно заменить 42 | L.queueBarsDesc = "Включить полоски, отображающие в какие очереди вы записаны и ориентировочное время до окончания ожидания" -- Enable the bars showing which queues you have joined and the estimated time you will be in the queue for." 43 | L.barClickDesc = "Установить модификаторы клавиатуры, используя которые, при клике по полоске, будут направляться оповещения в чат. Если установить 'Нет' для всех 3х полосок, будут разрешены клики 'сквозь' строки" -- "Configure the keyboard modifier you wish to use for specific chat output when clicking on a bar. Setting all 3 to 'None' will disable clickable bars, allowing you to click through them." 44 | L.shiftClick = "Shift + клик" 45 | L.controlClick = "Control + клик" 46 | L.altClick = "Alt + клик" 47 | L.sayChat = "Общий (/s) чат" 48 | L.raidChat = "Группой чат" 49 | L.clickableBars = "Полоски, реагирующие на клик" 50 | L.loudQueue = "Звук очереди" -- loud, посмотреть на проде // spellcheck on live 51 | L.loudQueueDesc = "Когда наступит очередь, звуковое оповещение будет принудительно направлено через основной звуковой канал" -- посмотреть на проде // spellcheck on live // "When the queue is ready the sound notification will be forced to play over the 'Master' sound channel." 52 | --L.autoTurnIn = "Auto Turn-In" 53 | --L.autoTurnInDesc = "Automatically turn in quest items in zones like Alterac Valley and Ashran." 54 | -------------------------------------------------------------------------------- /Options/Locales/zhCN.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "zhCN" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | L.introduction = "您始终可以通过在聊天框内输入命令: /capping 来访问选项。" 8 | L.general = "常规" 9 | L.test = "测试" 10 | L.lock = "锁定" 11 | L.lockDesc = "启用锁定来隐藏计时条的移动锚点,防止被移动。" 12 | L.barIcon = "计时条图标" 13 | L.showTime = "显示时间" 14 | L.fillBar = "反转条" 15 | L.font = "字体" 16 | L.fontSize = "字体尺寸" 17 | L.monochrome = "点阵字" 18 | L.outline = "字体描边" 19 | L.none = "无" 20 | L.thin = "细" 21 | L.thick = "粗" 22 | L.texture = "材质" 23 | L.barSpacing = "计时条间距" 24 | L.barWidth = "计时条宽度" 25 | L.barHeight = "计时条高度" 26 | L.alignText = "文本对齐" 27 | L.alignTime = "时间对齐" 28 | L.alignIcon = "图标对齐" 29 | L.left = "左" 30 | L.center = "中" 31 | L.right = "右" 32 | L.growUpwards = "向上增长" 33 | L.textColor = "文本颜色" 34 | L.allianceBars = "联盟计时条" 35 | L.hordeBars = "部落计时条" 36 | L.queueBars = "队列计时条" 37 | L.otherBars = "其他计时条" 38 | L.barBackground = "计时条背景" 39 | 40 | --- Features 41 | L.features ="特色" 42 | L.queueBarsDesc ="启用队列计时条,显示您已加入的队列以及您在队列中的估计时间。" 43 | L.barClickDesc ="设置组合键,使您用组合键点击计时条时可以发送计时条信息至指定频道。将三个选项均设置为 '无' 将启用点击穿透,禁用可点击计时条。" 44 | L.shiftClick ="Shift-点击" 45 | L.controlClick ="Control-点击" 46 | L.altClick ="Alt-点击" 47 | L.sayChat ="Say/说 频道" 48 | L.raidChat ="Group/队伍团队 频道" 49 | L.clickableBars ="可点击计时条" 50 | L.loudQueue ="队列就绪音效" 51 | L.loudQueueDesc ="当队列准备好时,主声道将强制播放音效通知。" 52 | L.autoTurnIn = "自动上交" 53 | L.autoTurnInDesc = "在奥特兰克山谷和阿什兰战场等区域自动上交任务物品。" 54 | -------------------------------------------------------------------------------- /Options/Locales/zhTW.lua: -------------------------------------------------------------------------------- 1 | 2 | if GetLocale() ~= "zhTW" then return end 3 | local _, mod = ... 4 | local L = mod.L 5 | 6 | --- Options 7 | L.introduction = "在聊天框輸入 /capping 可以開啟設定選項。" 8 | L.general = "一般" 9 | L.test = "測試" 10 | L.lock = "鎖定位置" 11 | L.lockDesc = "鎖定位置可以隱藏綠色的移動錨點,防止計時條被拖動。" 12 | L.barIcon = "顯示圖示" 13 | L.showTime = "顯示時間" 14 | L.fillBar = "反向填充" 15 | L.font = "字型" 16 | L.fontSize = "文字大小" 17 | L.monochrome = "點陣字描邊" 18 | L.outline = "字型描邊" 19 | L.none = "無" 20 | L.thin = "細" 21 | L.thick = "粗" 22 | L.texture = "材質" 23 | L.barSpacing = "計時條間距" 24 | L.barWidth = "計時條寬度" 25 | L.barHeight = "計時條高度" 26 | L.alignText = "文字對齊" 27 | L.alignTime = "時間對齊" 28 | L.alignIcon = "圖示對齊" 29 | L.left = "左" 30 | L.center = "中" 31 | L.right = "右" 32 | L.growUpwards = "往上增長" 33 | L.textColor = "文字顏色" 34 | L.allianceBars = "聯盟計時" 35 | L.hordeBars = "部落計時" 36 | L.queueBars = "隊列計時" 37 | L.otherBars = "其他計時" 38 | L.barBackground = "計時條背景" 39 | 40 | --- Features 41 | L.features = "功能" 42 | L.queueBarsDesc = "啟用此計時條可以顯示你正在等待的隊列,以及隊列就緒的預估時間。" 43 | L.barClickDesc = "設定組合鍵,當你用組合鍵點擊計時條時,會在指定頻道通報剩餘時間。將三個選項均設為「無」可以禁用點擊功能,使計時條可以點擊穿透。" 44 | L.shiftClick = "Shift-點擊" 45 | L.controlClick = "Control-點擊" 46 | L.altClick = "Alt-點擊" 47 | L.sayChat = "Say/說頻道" 48 | L.raidChat = "Group/隊伍頻道" 49 | L.clickableBars = "可點擊計時條" 50 | L.loudQueue = "隊列就緒提示音" 51 | L.loudQueueDesc = "當隊列就緒時,使用主聲道播放提示音。" 52 | --L.autoTurnIn = "Auto Turn-In" 53 | --L.autoTurnInDesc = "Automatically turn in quest items in zones like Alterac Valley and Ashran." 54 | -------------------------------------------------------------------------------- /Options/Options.lua: -------------------------------------------------------------------------------- 1 | 2 | local acr = LibStub("AceConfigRegistry-3.0") 3 | local acd = LibStub("AceConfigDialog-3.0") 4 | local media = LibStub("LibSharedMedia-3.0") 5 | local adbo = LibStub("AceDBOptions-3.0") 6 | local cap = CappingFrame 7 | local L 8 | do 9 | local _, mod = ... 10 | L = mod.L 11 | end 12 | 13 | local function updateFlags() 14 | local flags = nil 15 | if cap.db.profile.monochrome and cap.db.profile.outline ~= "NONE" then 16 | flags = "MONOCHROME," .. cap.db.profile.outline 17 | elseif cap.db.profile.monochrome then 18 | flags = "MONOCHROME" 19 | elseif cap.db.profile.outline ~= "NONE" then 20 | flags = cap.db.profile.outline 21 | end 22 | return flags 23 | end 24 | 25 | local barClickOptions = { 26 | NONE = L.none, 27 | SAY = L.sayChat, 28 | INSTANCE_CHAT = L.raidChat, 29 | } 30 | local barClickSetOptions = function(info, value) 31 | cap.db.profile[info[#info]] = value 32 | if cap.db.profile.barOnShift ~= "NONE" or cap.db.profile.barOnControl ~= "NONE" or cap.db.profile.barOnAlt ~= "NONE" then 33 | for bar in next, cap.bars do 34 | bar:EnableMouse(true) 35 | end 36 | else 37 | for bar in next, cap.bars do 38 | bar:EnableMouse(false) 39 | end 40 | end 41 | end 42 | 43 | local options = function() 44 | local acOptions = { 45 | name = "Capping", 46 | type = "group", childGroups = "tab", 47 | get = function(info) 48 | return cap.db.profile[info[#info]] 49 | end, 50 | set = function(info, value) 51 | cap.db.profile[info[#info]] = value 52 | end, 53 | args = { 54 | introduction = { 55 | type = "description", 56 | name = L.introduction, 57 | order = 0, 58 | fontSize = "small", 59 | width = "full", 60 | }, 61 | general = { 62 | name = L.general, 63 | order = 1, type = "group", 64 | args = { 65 | test = { 66 | type = "execute", 67 | name = L.test, 68 | order = 0.1, 69 | width = 2, 70 | func = function() 71 | cap:Test(L) 72 | end, 73 | }, 74 | lock = { 75 | type = "toggle", 76 | name = L.lock, 77 | desc = L.lockDesc, 78 | order = 1, 79 | set = function(_, value) 80 | cap.db.profile.lock = value 81 | if value then 82 | value = false 83 | cap.bg:Hide() 84 | cap.header:Hide() 85 | else 86 | value = true 87 | cap.bg:Show() 88 | cap.header:Show() 89 | end 90 | cap:EnableMouse(value) 91 | cap:SetMovable(value) 92 | end, 93 | }, 94 | icon = { 95 | type = "toggle", 96 | name = L.barIcon, 97 | order = 2, 98 | set = function(_, value) 99 | cap.db.profile.icon = value 100 | for bar in next, cap.bars do 101 | if value then 102 | bar:SetIcon(bar:Get("capping:iconoptionrestore") or 236396) -- Interface/Icons/Achievement_BG_winWSG 103 | else 104 | bar:Set("capping:iconoptionrestore", bar:GetIcon()) 105 | bar:SetIcon(nil) 106 | end 107 | end 108 | end, 109 | }, 110 | timeText = { 111 | type = "toggle", 112 | name = L.showTime, 113 | order = 3, 114 | set = function(_, value) 115 | cap.db.profile.timeText = value 116 | for bar in next, cap.bars do 117 | bar:SetTimeVisibility(value) 118 | end 119 | end, 120 | }, 121 | fill = { 122 | type = "toggle", 123 | name = L.fillBar, 124 | order = 4, 125 | set = function(_, value) 126 | cap.db.profile.fill = value 127 | for bar in next, cap.bars do 128 | bar:SetFill(value) 129 | end 130 | end, 131 | }, 132 | font = { 133 | type = "select", 134 | name = L.font, 135 | order = 5, 136 | values = media:List("font"), 137 | itemControl = "DDI-Font", 138 | get = function() 139 | for i, v in next, media:List("font") do 140 | if v == cap.db.profile.font then return i end 141 | end 142 | end, 143 | set = function(_, value) 144 | local list = media:List("font") 145 | local font = list[value] 146 | cap.db.profile.font = font 147 | for bar in next, cap.bars do 148 | bar.candyBarLabel:SetFont(media:Fetch("font", font), cap.db.profile.fontSize, updateFlags()) 149 | bar.candyBarDuration:SetFont(media:Fetch("font", font), cap.db.profile.fontSize, updateFlags()) 150 | end 151 | end, 152 | }, 153 | fontSize = { 154 | type = "range", 155 | name = L.fontSize, 156 | order = 6, 157 | max = 200, 158 | min = 1, 159 | step = 1, 160 | set = function(_, value) 161 | cap.db.profile.fontSize = value 162 | for bar in next, cap.bars do 163 | bar.candyBarLabel:SetFont(media:Fetch("font", cap.db.profile.font), value, updateFlags()) 164 | bar.candyBarDuration:SetFont(media:Fetch("font", cap.db.profile.font), value, updateFlags()) 165 | end 166 | end, 167 | }, 168 | monochrome = { 169 | type = "toggle", 170 | name = L.monochrome, 171 | order = 7, 172 | set = function(_, value) 173 | cap.db.profile.monochrome = value 174 | for bar in next, cap.bars do 175 | bar.candyBarLabel:SetFont(media:Fetch("font", cap.db.profile.font), cap.db.profile.fontSize, updateFlags()) 176 | bar.candyBarDuration:SetFont(media:Fetch("font", cap.db.profile.font), cap.db.profile.fontSize, updateFlags()) 177 | end 178 | end, 179 | }, 180 | outline = { 181 | type = "select", 182 | name = L.outline, 183 | order = 8, 184 | values = { 185 | NONE = L.none, 186 | OUTLINE = L.thin, 187 | THICKOUTLINE = L.thick, 188 | }, 189 | set = function(_, value) 190 | cap.db.profile.outline = value 191 | for bar in next, cap.bars do 192 | bar.candyBarLabel:SetFont(media:Fetch("font", cap.db.profile.font), cap.db.profile.fontSize, updateFlags()) 193 | bar.candyBarDuration:SetFont(media:Fetch("font", cap.db.profile.font), cap.db.profile.fontSize, updateFlags()) 194 | end 195 | end, 196 | }, 197 | barTexture = { 198 | type = "select", 199 | name = L.texture, 200 | order = 9, 201 | values = media:List("statusbar"), 202 | itemControl = "DDI-Statusbar", 203 | width = 2, 204 | get = function() 205 | for i, v in next, media:List("statusbar") do 206 | if v == cap.db.profile.barTexture then return i end 207 | end 208 | end, 209 | set = function(_, value) 210 | local list = media:List("statusbar") 211 | local texture = list[value] 212 | cap.db.profile.barTexture = texture 213 | for bar in next, cap.bars do 214 | bar:SetTexture(media:Fetch("statusbar", texture)) 215 | end 216 | end, 217 | }, 218 | width = { 219 | type = "range", 220 | name = L.barWidth, 221 | order = 10, 222 | max = 2000, 223 | min = 10, 224 | step = 1, 225 | set = function(_, value) 226 | cap.db.profile.width = value 227 | for bar in next, cap.bars do 228 | bar:SetWidth(value) 229 | end 230 | end, 231 | }, 232 | height = { 233 | type = "range", 234 | name = L.barHeight, 235 | order = 11, 236 | max = 100, 237 | min = 5, 238 | step = 1, 239 | set = function(_, value) 240 | cap.db.profile.height = value 241 | for bar in next, cap.bars do 242 | bar:SetHeight(value) 243 | end 244 | end, 245 | }, 246 | alignIcon = { 247 | type = "select", 248 | name = L.alignIcon, 249 | order = 12, 250 | values = { 251 | LEFT = L.left, 252 | RIGHT = L.right, 253 | }, 254 | set = function(_, value) 255 | cap.db.profile.alignIcon = value 256 | for bar in next, cap.bars do 257 | bar:SetIconPosition(value) 258 | end 259 | end, 260 | disabled = function() return not cap.db.profile.icon end, 261 | }, 262 | spacing = { 263 | type = "range", 264 | name = L.barSpacing, 265 | order = 13, 266 | max = 100, 267 | min = 0, 268 | step = 1, 269 | set = function(_, value) 270 | cap.db.profile.spacing = value 271 | cap.RearrangeBars() 272 | end, 273 | }, 274 | alignText = { 275 | type = "select", 276 | name = L.alignText, 277 | order = 14, 278 | values = { 279 | LEFT = L.left, 280 | CENTER = L.center, 281 | RIGHT = L.right, 282 | }, 283 | set = function(_, value) 284 | cap.db.profile.alignText = value 285 | for bar in next, cap.bars do 286 | bar.candyBarLabel:SetJustifyH(value) 287 | end 288 | end, 289 | }, 290 | alignTime = { 291 | type = "select", 292 | name = L.alignTime, 293 | order = 15, 294 | values = { 295 | LEFT = L.left, 296 | CENTER = L.center, 297 | RIGHT = L.right, 298 | }, 299 | set = function(_, value) 300 | cap.db.profile.alignTime = value 301 | for bar in next, cap.bars do 302 | bar.candyBarDuration:SetJustifyH(value) 303 | end 304 | end, 305 | }, 306 | growUp = { 307 | type = "toggle", 308 | name = L.growUpwards, 309 | order = 16, 310 | width = 2, 311 | set = function(_, value) 312 | cap.db.profile.growUp = value 313 | cap.RearrangeBars() 314 | end, 315 | }, 316 | colorText = { 317 | name = L.textColor, 318 | type = "color", 319 | hasAlpha = true, 320 | order = 17, 321 | get = function() 322 | return unpack(cap.db.profile.colorText) 323 | end, 324 | set = function(_, r, g, b, a) 325 | cap.db.profile.colorText = {r, g, b, a} 326 | for bar in next, cap.bars do 327 | bar:SetTextColor(r, g, b, a) 328 | end 329 | end, 330 | }, 331 | colorBarBackground = { 332 | name = L.barBackground, 333 | type = "color", 334 | hasAlpha = true, 335 | order = 18, 336 | get = function() 337 | return unpack(cap.db.profile.colorBarBackground) 338 | end, 339 | set = function(_, r, g, b, a) 340 | cap.db.profile.colorBarBackground = {r, g, b, a} 341 | for bar in next, cap.bars do 342 | if bar then 343 | bar.candyBarBackground:SetVertexColor(r, g, b, a) 344 | end 345 | end 346 | end, 347 | }, 348 | colorAlliance = { 349 | name = L.allianceBars, 350 | type = "color", 351 | hasAlpha = true, 352 | order = 19, 353 | get = function() 354 | return unpack(cap.db.profile.colorAlliance) 355 | end, 356 | set = function(_, r, g, b, a) 357 | cap.db.profile.colorAlliance = {r, g, b, a} 358 | for bar in next, cap.bars do 359 | if bar:Get("capping:colorid") == "colorAlliance" then 360 | bar:SetColor(r, g, b, a) 361 | end 362 | end 363 | end, 364 | }, 365 | colorHorde = { 366 | name = L.hordeBars, 367 | type = "color", 368 | hasAlpha = true, 369 | order = 20, 370 | get = function() 371 | return unpack(cap.db.profile.colorHorde) 372 | end, 373 | set = function(_, r, g, b, a) 374 | cap.db.profile.colorHorde = {r, g, b, a} 375 | for bar in next, cap.bars do 376 | if bar:Get("capping:colorid") == "colorHorde" then 377 | bar:SetColor(r, g, b, a) 378 | end 379 | end 380 | end, 381 | }, 382 | colorQueue = { 383 | name = L.queueBars, 384 | type = "color", 385 | hasAlpha = true, 386 | order = 21, 387 | get = function() 388 | return unpack(cap.db.profile.colorQueue) 389 | end, 390 | set = function(_, r, g, b, a) 391 | cap.db.profile.colorQueue = {r, g, b, a} 392 | for bar in next, cap.bars do 393 | if bar:Get("capping:colorid") == "colorQueue" then 394 | bar:SetColor(r, g, b, a) 395 | end 396 | end 397 | end, 398 | }, 399 | colorOther = { 400 | name = L.otherBars, 401 | type = "color", 402 | hasAlpha = true, 403 | order = 22, 404 | get = function() 405 | return unpack(cap.db.profile.colorOther) 406 | end, 407 | set = function(_, r, g, b, a) 408 | cap.db.profile.colorOther = {r, g, b, a} 409 | for bar in next, cap.bars do 410 | if bar:Get("capping:colorid") == "colorOther" then 411 | bar:SetColor(r, g, b, a) 412 | end 413 | end 414 | end, 415 | }, 416 | }, 417 | }, 418 | features = { 419 | name = L.features, 420 | order = 2, type = "group", 421 | args = { 422 | queueBars = { 423 | type = "toggle", 424 | name = L.queueBars, 425 | desc = L.queueBarsDesc, 426 | order = 1, 427 | set = function(_, value) 428 | cap.db.profile.queueBars = value 429 | if not value then 430 | for bar in next, cap.bars do 431 | if bar:Get("capping:queueid") then 432 | bar:Stop() 433 | end 434 | end 435 | end 436 | end, 437 | }, 438 | useMasterForQueue = { 439 | type = "toggle", 440 | name = L.loudQueue, 441 | desc = L.loudQueueDesc, 442 | order = 2, 443 | }, 444 | clickBarsHeader = { 445 | type = "header", 446 | name = L.clickableBars, 447 | order = 3, 448 | }, 449 | barOnShift = { 450 | type = "select", 451 | name = L.shiftClick, 452 | desc = L.barClickDesc, 453 | order = 4, 454 | values = barClickOptions, 455 | set = barClickSetOptions, 456 | }, 457 | barOnControl = { 458 | type = "select", 459 | name = L.controlClick, 460 | desc = L.barClickDesc, 461 | order = 5, 462 | values = barClickOptions, 463 | set = barClickSetOptions, 464 | }, 465 | barOnAlt = { 466 | type = "select", 467 | name = L.altClick, 468 | desc = L.barClickDesc, 469 | order = 6, 470 | values = barClickOptions, 471 | set = barClickSetOptions, 472 | }, 473 | autoTurnInHeader = { 474 | type = "header", 475 | name = "", 476 | order = 7, 477 | }, 478 | autoTurnIn = { 479 | type = "toggle", 480 | name = L.autoTurnIn, 481 | desc = L.autoTurnInDesc, 482 | order = 8, 483 | width = "full", 484 | }, 485 | }, 486 | }, 487 | profiles = adbo:GetOptionsTable(cap.db), 488 | }, 489 | } 490 | acOptions.args.profiles.order = 3 491 | return acOptions 492 | end 493 | 494 | acr:RegisterOptionsTable("Capping", options, true) 495 | acd:SetDefaultSize("Capping", 420, 640) 496 | 497 | -------------------------------------------------------------------------------- /Options/embeds.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Options/locales.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 |