├── Textures
├── Cycle.blp
├── DRUID.blp
├── MAGE.blp
├── MONK.blp
├── Pause.blp
├── ROGUE.blp
├── RedX.tga
├── Cancel.blp
├── HUNTER.png
├── PALADIN.blp
├── PRIEST.blp
├── SHAMAN.blp
├── TACODOG.blp
├── Taco256.blp
├── WARLOCK.blp
├── WARNING.blp
├── WARRIOR.blp
├── WhiteUp.tga
├── BlueReset.tga
├── GreenPlus.tga
├── GreyStar.tga
├── LOGO-WHITE.blp
├── WhiteCopy.tga
├── WhiteDown.tga
├── WhiteEye.tga
├── WhiteMag.tga
├── WhiteReset.tga
├── WhiteRight.tga
├── WhiteStar.tga
├── YellowStar.tga
├── DEATHKNIGHT.blp
├── LOGO-ORANGE.blp
├── MonoCircle2.tga
├── MonoCircle5.tga
└── GreenPlusOutline.tga
├── release.json
├── Libs
└── SpellFlashCore
│ ├── Load.xml
│ ├── SpellFlashCore.toc
│ ├── libs
│ └── BigLibTimer
│ │ ├── LibStub
│ │ └── LibStub.lua
│ │ └── BigLibTimer.lua
│ └── Localization.lua
├── .travis.yml
├── .github
├── ISSUE_TEMPLATE
│ ├── config.yml
│ ├── Feature-Request.yml
│ ├── Bug-Report-Form.yml
│ └── Recommendation-Report.yml
├── FUNDING.yml
└── workflows
│ └── main.yml
├── .gitattributes
├── Cataclysm
└── Items.lua
├── TheWarWithin
├── Warrior
│ └── ReflectableSpells.lua
└── Priorities
│ ├── EvokerPreservation.simc
│ ├── PaladinHoly.simc
│ ├── ShamanRestoration.simc
│ ├── MonkMistweaver.simc
│ ├── DruidRestoration.simc
│ ├── DeathKnightBlood.simc
│ ├── WarriorProtection.simc
│ ├── MonkBrewmaster.simc
│ ├── PriestHoly.simc
│ ├── DruidGuardian.simc
│ ├── PaladinProtection.simc
│ ├── RogueSubtlety.simc
│ ├── PaladinRetribution.simc
│ ├── HunterBeastMastery.simc
│ ├── WarriorFury.simc
│ ├── HunterSurvival.simc
│ └── DruidFeral.simc
├── Bindings.xml
├── Wrath
└── Items.lua
├── TheBurningCrusade
└── Items.lua
├── embeds.xml
├── UI
├── PopupSlider.lua
└── PopupSlider.xml
├── .gitignore
├── Hekili.toc
├── .pkgmeta
├── Dragonflight
└── Classes.lua
├── README.md
├── Options
└── Translation.lua
└── Legion
└── Items.lua
/Textures/Cycle.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/Cycle.blp
--------------------------------------------------------------------------------
/Textures/DRUID.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/DRUID.blp
--------------------------------------------------------------------------------
/Textures/MAGE.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/MAGE.blp
--------------------------------------------------------------------------------
/Textures/MONK.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/MONK.blp
--------------------------------------------------------------------------------
/Textures/Pause.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/Pause.blp
--------------------------------------------------------------------------------
/Textures/ROGUE.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/ROGUE.blp
--------------------------------------------------------------------------------
/Textures/RedX.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/RedX.tga
--------------------------------------------------------------------------------
/Textures/Cancel.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/Cancel.blp
--------------------------------------------------------------------------------
/Textures/HUNTER.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/HUNTER.png
--------------------------------------------------------------------------------
/Textures/PALADIN.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/PALADIN.blp
--------------------------------------------------------------------------------
/Textures/PRIEST.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/PRIEST.blp
--------------------------------------------------------------------------------
/Textures/SHAMAN.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/SHAMAN.blp
--------------------------------------------------------------------------------
/Textures/TACODOG.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/TACODOG.blp
--------------------------------------------------------------------------------
/Textures/Taco256.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/Taco256.blp
--------------------------------------------------------------------------------
/Textures/WARLOCK.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WARLOCK.blp
--------------------------------------------------------------------------------
/Textures/WARNING.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WARNING.blp
--------------------------------------------------------------------------------
/Textures/WARRIOR.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WARRIOR.blp
--------------------------------------------------------------------------------
/Textures/WhiteUp.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteUp.tga
--------------------------------------------------------------------------------
/Textures/BlueReset.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/BlueReset.tga
--------------------------------------------------------------------------------
/Textures/GreenPlus.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/GreenPlus.tga
--------------------------------------------------------------------------------
/Textures/GreyStar.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/GreyStar.tga
--------------------------------------------------------------------------------
/Textures/LOGO-WHITE.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/LOGO-WHITE.blp
--------------------------------------------------------------------------------
/Textures/WhiteCopy.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteCopy.tga
--------------------------------------------------------------------------------
/Textures/WhiteDown.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteDown.tga
--------------------------------------------------------------------------------
/Textures/WhiteEye.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteEye.tga
--------------------------------------------------------------------------------
/Textures/WhiteMag.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteMag.tga
--------------------------------------------------------------------------------
/Textures/WhiteReset.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteReset.tga
--------------------------------------------------------------------------------
/Textures/WhiteRight.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteRight.tga
--------------------------------------------------------------------------------
/Textures/WhiteStar.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/WhiteStar.tga
--------------------------------------------------------------------------------
/Textures/YellowStar.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/YellowStar.tga
--------------------------------------------------------------------------------
/Textures/DEATHKNIGHT.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/DEATHKNIGHT.blp
--------------------------------------------------------------------------------
/Textures/LOGO-ORANGE.blp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/LOGO-ORANGE.blp
--------------------------------------------------------------------------------
/Textures/MonoCircle2.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/MonoCircle2.tga
--------------------------------------------------------------------------------
/Textures/MonoCircle5.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/MonoCircle5.tga
--------------------------------------------------------------------------------
/Textures/GreenPlusOutline.tga:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/huchang47/hekili_zhCN/HEAD/Textures/GreenPlusOutline.tga
--------------------------------------------------------------------------------
/release.json:
--------------------------------------------------------------------------------
1 | {"releases":[{"name":"Hekili","version":"v11.2.0-1.0.1h-CN","filename":"Hekili-v11.2.0-1.0.1h-CN.zip","nolib":false,"metadata":[{"flavor":"mainline","interface":110200}]}]}
--------------------------------------------------------------------------------
/Libs/SpellFlashCore/Load.xml:
--------------------------------------------------------------------------------
1 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 | language: c
3 |
4 | addons:
5 | apt:
6 | packages:
7 | - pandoc
8 |
9 | branches:
10 | only:
11 | - /^v?\d+\.\d+(\.\d+)?(-\S*)?$/
12 |
13 | script: curl -s https://raw.githubusercontent.com/BigWigsMods/packager/master/release.sh | bash
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/config.yml:
--------------------------------------------------------------------------------
1 | blank_issues_enabled: false
2 | contact_links:
3 | - name: Performance Issues (CPU, Framerate, Stutter...)
4 | url: https://github.com/Hekili/hekili/issues/2624
5 | about: Add information to the linked ticket. Follow the instructions noted in the initial post.
6 |
--------------------------------------------------------------------------------
/Libs/SpellFlashCore/SpellFlashCore.toc:
--------------------------------------------------------------------------------
1 | ## Interface: 100002
2 | ## Version: 2.4.1
3 | ## Author: BigRedBrent & LightSpell
4 | ## Title: SpellFlashCore
5 | ## Notes: This addon contains the button flashing functionality.
6 | ## SavedVariables: SpellFlashCoreAddonConfig
7 | ## OptionalDeps: BigLibTimer, ButtonForge
8 | libs\BigLibTimer\LibStub\LibStub.lua
9 | libs\BigLibTimer\BigLibTimer.lua
10 | Load.xml
11 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
4 | # Custom for Visual Studio
5 | *.cs diff=csharp
6 |
7 | # Standard to msysgit
8 | *.doc diff=astextplain
9 | *.DOC diff=astextplain
10 | *.docx diff=astextplain
11 | *.DOCX diff=astextplain
12 | *.dot diff=astextplain
13 | *.DOT diff=astextplain
14 | *.pdf diff=astextplain
15 | *.PDF diff=astextplain
16 | *.rtf diff=astextplain
17 | *.RTF diff=astextplain
18 |
--------------------------------------------------------------------------------
/Cataclysm/Items.lua:
--------------------------------------------------------------------------------
1 | -- Cataclysm/Items.lua
2 |
3 | local addon, ns = ...
4 | local Hekili = _G[ addon ]
5 |
6 | local class, state = Hekili.Class, Hekili.State
7 | local all = Hekili.Class.specs[ 0 ]
8 |
9 | all:RegisterAbility( "skardyns_grace", {
10 | cast = 0,
11 | cooldown = 120,
12 | gcd = "off",
13 |
14 | item = 133282,
15 | toggle = "cooldowns",
16 |
17 | handler = function ()
18 | applyBuff( "speed_of_thought" )
19 | end,
20 |
21 | auras = {
22 | speed_of_thought = {
23 | id = 92099,
24 | duration = 35,
25 | max_stack = 1
26 | }
27 | }
28 | } )
29 |
--------------------------------------------------------------------------------
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: Hekili
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: # Replace with a single Ko-fi username
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: ['http://paypal.me/Hekili']
13 |
--------------------------------------------------------------------------------
/TheWarWithin/Warrior/ReflectableSpells.lua:
--------------------------------------------------------------------------------
1 | -- Warrior/ReflectableSpells.lua (for The War Within)
2 |
3 | if UnitClassBase( "player" ) ~= "WARRIOR" then return end
4 |
5 | local addon, ns = ...
6 | local Hekili = _G[ addon ]
7 | local class = Hekili.Class
8 |
9 | local reflectableFilters = {}
10 |
11 | for zoneID, zoneData in pairs( class.spellFilters ) do
12 | for npcID, npcData in pairs( zoneData ) do
13 | if npcID ~= "name" then
14 | for spellID, spellData in pairs( npcData ) do
15 | if spellID ~= "name" and spellData.spell_reflection then
16 | reflectableFilters[ spellID ] = true
17 | end
18 | end
19 | end
20 | end
21 | end
22 |
23 | class.reflectableFilters = reflectableFilters
24 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/EvokerPreservation.simc:
--------------------------------------------------------------------------------
1 | actions.precombat+=/blessing_of_the_bronze
2 |
3 | actions+=/quell
4 | actions+=/cauterizing_flame
5 | actions+=/unravel
6 | actions+=/deep_breath
7 | actions+=/potion
8 | actions+=/use_items
9 | actions+=/fire_breath,empower_to=1,if=fight_remains>14+cast_time
10 | actions+=/fire_breath,empower_to=2,if=fight_remains>8+cast_time
11 | actions+=/fire_breath,empower_to=3,if=fight_remains>2+cast_time
12 | actions+=/fire_breath,empower_to=4,if=empowering.fire_breath|fight_remains>cast_time
13 | actions+=/hover,if=moving&buff.hover.down&settings.use_hover
14 | actions+=/disintegrate,if=buff.essence_burst.up&(!moving|buff.hover.remains>cast_time)|essence.time_to_max2
16 | actions+=/living_flame,if=!moving|buff.hover.remains>cast_time
17 | actions+=/azure_strike,if=moving&buff.hover.down
--------------------------------------------------------------------------------
/Bindings.xml:
--------------------------------------------------------------------------------
1 |
2 |
14 |
15 |
--------------------------------------------------------------------------------
/Wrath/Items.lua:
--------------------------------------------------------------------------------
1 | -- Wrath/Items.lua
2 |
3 | local addon, ns = ...
4 | local Hekili = _G[ addon ]
5 |
6 | local class, state = Hekili.Class, Hekili.State
7 | local all = Hekili.Class.specs[ 0 ]
8 |
9 | all:RegisterAbilities( {
10 | wrathstone = {
11 | cast = 0,
12 | cooldown = 120,
13 | gcd = "off",
14 |
15 | item = function ()
16 | -- Short-circuit the most likely match first.
17 | if equipped[156000] then return 156000 end
18 | return 45263
19 | end,
20 | items = { 45263, 156000 },
21 | toggle = "cooldowns",
22 |
23 | handler = function ()
24 | applyBuff( "wrathstone" )
25 | end,
26 |
27 | auras = {
28 | wrathstone = {
29 | id = 64800,
30 | duration = 20,
31 | max_stack = 1
32 | }
33 | }
34 | },
35 |
36 | scale_of_fates = {
37 | cast = 0,
38 | cooldown = 120,
39 | gcd = "off",
40 |
41 | item = 156187,
42 | toggle = "cooldowns",
43 |
44 | proc = "haste",
45 | self_buff = "scale_of_fates",
46 |
47 | handler = function()
48 | applyBuff( "scale_of_fates" )
49 | end,
50 |
51 | auras = {
52 | scale_of_fates = {
53 | id = 64707,
54 | duration = 20,
55 | max_stack = 1
56 | },
57 | },
58 | },
59 | } )
60 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/PaladinHoly.simc:
--------------------------------------------------------------------------------
1 | actions.precombat+=/devotion_aura,if=buff.paladin_aura.down
2 | actions.precombat+=/beacon_of_light,if=active_dot.beacon_of_light=0
3 | actions.precombat+=/beacon_of_faith,if=group&active_dot.beacon_of_faith=0
4 |
5 | actions+=/rebuke
6 | actions+=/avenging_wrath
7 | actions+=/avenging_crusader
8 | actions+=/holy_armament
9 | actions+=/blessing_of_summer
10 | actions+=/blessing_of_autumn
11 | actions+=/blessing_of_winter
12 | actions+=/blessing_of_spring
13 | actions+=/lights_judgment
14 | actions+=/potion
15 | actions+=/fireblood,if=buff.bloodlust.up|buff.avenging_wrath.up|buff.avenging_crusader.up
16 | actions+=/use_items
17 | actions+=/call_action_list,name=spenders,strict=1,if=!talent.avenging_crusader|cooldown.avenging_crusader.remains>gcd.max|holy_power.deficit=0
18 | actions+=/divine_toll
19 | actions+=/holy_prism
20 | actions+=/beacon_of_virtue,if=group
21 | actions+=/crusader_strike,if=talent.avenging_crusader&full_recharge_timegcd.max
28 | actions+=/arcane_torrent
29 |
30 | actions.spenders+=/word_of_glory,if=solo&(health.pct<70|!equipped.shield)&buff.shining_righteousness_ready.up|buff.empyrean_legacy.up
31 | actions.spenders+=/light_of_dawn,if=group&buff.shining_righteousness_ready.up
32 | actions.spenders+=/shield_of_the_righteous
--------------------------------------------------------------------------------
/TheBurningCrusade/Items.lua:
--------------------------------------------------------------------------------
1 | -- TheBurningCrusade/Items.lua
2 |
3 | local addon, ns = ...
4 | local Hekili = _G[ addon ]
5 |
6 | local class, state = Hekili.Class, Hekili.State
7 | local all = Hekili.Class.specs[ 0 ]
8 |
9 | --[[ WiP: Timewarped Trinkets
10 | do
11 | local timewarped_trinkets = {
12 | { "runed_fungalcap", 127184, "shell_of_deterrence", 31771, 20, 1 },
13 | { "icon_of_the_silver_crescent", 129850, "blessing_of_the_silver_crescent", 194645, 20, 1 },
14 | { "essence_of_the_martyr", 129851, "essence_of_the_martyr", 194637, 20, 1 },
15 | { "gnomeregan_autoblocker_601", 129849, "gnome_ingenuity", 194543, 40, 1 },
16 | { "emblem_of_fury", 129937, "lust_for_battle_str", 194638, 20, 1 },
17 | { "bloodlust_brooch", 129848, "lust_for_battle_agi", 194632, 20, 1 },
18 | {}
19 |
20 | }
21 |
22 | { "vial_of_the_sunwell", 133462, "vessel_of_the_naaru", 45059, 3600, 1 }, -- vessel_of_the_naaru on-use 45064, 120 sec CD.
23 | end ]]
24 |
25 |
26 | all:RegisterAbility( "shadowmoon_insignia", {
27 | cast = 0,
28 | cooldown = 60,
29 | gcd = "off",
30 |
31 | item = 150526,
32 | toggle = "defensives",
33 |
34 | proc = "health",
35 |
36 | handler = function ()
37 | applyBuff( "protectors_vigor" )
38 | end,
39 |
40 | auras = {
41 | protectors_vigor = {
42 | id = 244189,
43 | duration = 20,
44 | max_stack = 1
45 | }
46 | }
47 | } )
48 |
--------------------------------------------------------------------------------
/embeds.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
--------------------------------------------------------------------------------
/UI/PopupSlider.lua:
--------------------------------------------------------------------------------
1 | local strformat = string.format
2 | local noop = function() end
3 |
4 | HekiliPopupDropdownMixin = {};
5 |
6 | function HekiliPopupDropdownMixin:OnLoad()
7 | local function UpdateText(slider, value, isMouse)
8 | if value % 1 > 0 then
9 | self.Text:SetText( strformat( "%.1f", value ) )
10 | else
11 | self.Text:SetText( strformat( "%d", value ) )
12 | end
13 | end
14 | self.Slider:RegisterPropertyChangeHandler( "OnValueChanged", UpdateText )
15 | end
16 |
17 | function HekiliPopupDropdownMixin:OnShow()
18 | -- self.Toggle:RegisterEvents();
19 | if ElvUI then
20 | local E = ElvUI[1]
21 | local S = E:GetModule( "Skins" )
22 | S:HandleSliderFrame( self.Slider )
23 |
24 | local r, g, b = unpack( E.media.rgbvaluecolor )
25 |
26 | local name = self:GetName()
27 | local highlight = _G[ name .. "Highlight" ]
28 |
29 | highlight:SetTexture( E.Media.Textures.Highlight )
30 | highlight:SetBlendMode( 'BLEND' )
31 | highlight:SetDrawLayer( 'BACKGROUND' )
32 | highlight:SetVertexColor( r, g, b )
33 |
34 | self.Slider.backdrop:SetFrameLevel( self:GetFrameLevel() + 1 )
35 | end
36 |
37 | self.Slider:SetFrameLevel( self:GetFrameLevel() + 2 )
38 |
39 | self:ClearAllPoints()
40 | self:SetAllPoints( self.owningButton )
41 | end
42 |
43 | function HekiliPopupDropdownMixin:OnHide()
44 | -- self.Toggle:UnregisterEvents();
45 | end
46 |
47 | function HekiliPopupDropdownMixin:OnSetOwningButton()
48 | -- self.Toggle:UpdateVisibleState();
49 | self.Slider:UpdateVisibleState()
50 | end
51 |
52 |
53 | HekiliPopupDropdownSliderMixin = {};
54 |
55 | function HekiliPopupDropdownSliderMixin:OnLoad()
56 | self:SetAccessorFunction(self.Set or noop);
57 | self:SetMutatorFunction(self.Get or noop);
58 | end
--------------------------------------------------------------------------------
/.github/workflows/main.yml:
--------------------------------------------------------------------------------
1 | # description of this workflow, can be anything you want
2 | name: Package and Release
3 |
4 | # we need to let GitHub know _when_ we want to release, typically only when we create a new tag.
5 | # this will target only tags, and not all pushes to the master branch.
6 | # this part can be heavily customized to your liking, like targeting only tags that match a certain word,
7 | # other branches or even pullrequests.
8 | on:
9 | push:
10 | tags:
11 | - "v*"
12 |
13 | # a workflow is built up as jobs, and within these jobs are steps
14 | jobs:
15 |
16 | # "release" is a job, you can name it anything you want
17 | release:
18 |
19 | # we can run our steps on pretty much anything, but the "ubuntu-latest" image is a safe bet
20 | runs-on: ubuntu-latest
21 |
22 | # specify the environment variables used by the packager, matching the secrets from the project on GitHub
23 | env:
24 | CF_API_KEY: ${{ secrets.CF_API_KEY }}
25 | WOWI_API_TOKEN: ${{ secrets.WOWI_API_TOKEN }}
26 | WAGO_API_TOKEN: ${{ secrets.WAGO_API_TOKEN }}
27 | GITHUB_OAUTH: ${{ secrets.GITHUB_TOKEN }} # "GITHUB_TOKEN" is a secret always provided to the workflow
28 | # for your own token, the name cannot start with "GITHUB_"
29 |
30 | # "steps" holds a list of all the steps needed to package and release our AddOn
31 | steps:
32 |
33 | # we first have to clone the AddOn project, this is a required step
34 | - name: Clone Project
35 | uses: actions/checkout@v1 # note: checkout@v2 breaks git history, so generating a changelog and
36 | # file naming for non-tagged builds will not work properly
37 |
38 | # once cloned, we just run the GitHub Action for the packager project
39 | - name: Package and Release
40 | uses: BigWigsMods/packager@v2
41 |
42 | # another example where we supply additional arguments, this example is specifically to release
43 | # for the Classic version of the game
44 | # - name: Package and release for Classic
45 | # uses: BigWigsMods/packager@v1
46 | # with:
47 | # args: -g classic -w 0
48 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Windows image file caches
2 | Thumbs.db
3 | ehthumbs.db
4 |
5 | # Folder config file
6 | Desktop.ini
7 |
8 | # Recycle Bin used on file shares
9 | $RECYCLE.BIN/
10 |
11 | # Windows Installer files
12 | *.cab
13 | *.msi
14 | *.msm
15 | *.msp
16 |
17 | # Windows shortcuts
18 | *.lnk
19 |
20 | # =========================
21 | # Operating System Files
22 | # =========================
23 |
24 | # OSX
25 | # =========================
26 |
27 | .DS_Store
28 | .AppleDouble
29 | .LSOverride
30 |
31 | # Thumbnails
32 | ._*
33 |
34 | # Files that might appear in the root of a volume
35 | .DocumentRevisions-V100
36 | .fseventsd
37 | .Spotlight-V100
38 | .TemporaryItems
39 | .Trashes
40 | .VolumeIcon.icns
41 |
42 | # Directories potentially created on remote AFP share
43 | .AppleDB
44 | .AppleDesktop
45 | Network Trash Folder
46 | Temporary Items
47 | .apdisk
48 |
49 | # Actual Stuff in my folder.
50 | Libs/AceAddon-3.0
51 | Libs/AceBucket-3.0
52 | Libs/AceComm-3.0
53 | Libs/AceConfig-3.0
54 | Libs/AceConsole-3.0
55 | Libs/AceDB-3.0
56 | Libs/AceDBOptions-3.0
57 | Libs/AceEvent-3.0
58 | Libs/AceGUI-3.0
59 | Libs/AceGUI-3.0_SFX-Widgets/
60 | Libs/AceGUI-3.0-SharedMediaWidgets
61 | Libs/AceHook-3.0
62 | Libs/AceLocale-3.0
63 | Libs/AceSerializer-3.0
64 | Libs/AceTab-3.0
65 | Libs/AceTimer-3.0
66 | Libs/CallbackHandler-1.0
67 | Libs/LibArtifactData-1.0
68 | Libs/LibChatAnims/
69 | Libs/LibCompress
70 | Libs/LibDeflate
71 | Libs/LibCustomGlow-1.0/
72 | Libs/LibDataBroker-1-1
73 | Libs/LibDBIcon-1.0
74 | Libs/LibDualSpec-1.0
75 | Libs/LibItemBuffs-1.0
76 | Libs/LibNameplateRegistry-1.0/
77 | Libs/LibRangeCheck-3.0
78 | Libs/LibSharedMedia-3.0
79 | Libs/LibSpellRange-1.0
80 | Libs/LibStub
81 | Libs/LibTranslit-1.0/
82 | # Libs/SpellFlashCore
83 | Libs/TaintLess
84 | CHANGES.txt
85 | Textures/LOGO-ORANGE.png
86 | Textures/LOGO-WHITE.png
87 | TODO.txt
88 | Textures/BLPconv.exe
89 | CHANGELOG.md
90 | .vscode/
91 | .release/
92 | Dragonflight/Drafts/
93 | Dragonflight/APLs/Tier28/
94 | Libs/TaintLess/TaintLess.toc
95 | Libs/TaintLess/TaintLess.xml
96 | Specs.md
97 |
98 | Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua
99 | Libs/LibDataBroker-1.1/README.textile
100 |
--------------------------------------------------------------------------------
/UI/PopupSlider.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/Feature-Request.yml:
--------------------------------------------------------------------------------
1 | name: Feature Request
2 | description: I would like the addon to have a new feature, and I'll explain why. This template is NOT for anything related to the addon's current recommendations.
3 | title: "[FEATURE] REPLACE THIS TEXT WITH A BRIEF DESCRIPTION OF YOUR NEW FEATURE"
4 | labels: [enhancement, triage]
5 | assignees:
6 | - Hekili
7 | body:
8 | - type: checkboxes
9 | id: precheck
10 | attributes:
11 | label: Before You Begin
12 | description: Please confirm that you've taken these preliminary steps before submitting your feature request.
13 | options:
14 | - label: I confirm that I have downloaded the latest version of the addon.
15 | required: true
16 | - label: I am not playing on a private server.
17 | required: true
18 | - label: I checked for an [existing, open ticket](https://github.com/Hekili/hekili/labels/enhancement) for this request and was not able to find one.
19 | required: true
20 | - label: I edited the title of this feature request (above) so that it describes the issue I am reporting.
21 | required: true
22 | - type: textarea
23 | id: request
24 | attributes:
25 | label: Feature Request
26 | description: |
27 | Please describe the new feature. Why would it be helpful? Explain the benefits.
28 | You can CTRL+V to paste a screenshot (image) or supply links to screenshot images.
29 | placeholder: "Example: I'd like Hekili to flip all the recommendations upside down. This would help me because I hang like a bat while playing WoW."
30 | validations:
31 | required: true
32 | - type: textarea
33 | id: addl-info
34 | attributes:
35 | label: Additional Information
36 | description: Please provide any additional information regarding this issue that was not included above.
37 | placeholder: If there's nothing else to provide, you may leave this blank.
38 | - type: input
39 | id: contact
40 | attributes:
41 | label: Contact Information
42 | description: |
43 | I will contact you via this GitHub ticket with questions and updates.
44 | If you do not regularly check your GitHub email, please provide an alternate contact method (i.e., Discord ID) so that I can reach you if needed.
45 | placeholder: Hekili#0001
46 |
--------------------------------------------------------------------------------
/Libs/SpellFlashCore/libs/BigLibTimer/LibStub/LibStub.lua:
--------------------------------------------------------------------------------
1 | -- $Id: LibStub.lua 103 2014-10-16 03:02:50Z mikk $
2 | -- LibStub is a simple versioning stub meant for use in Libraries. http://www.wowace.com/addons/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 |
--------------------------------------------------------------------------------
/Hekili.toc:
--------------------------------------------------------------------------------
1 | ## Interface: 110200
2 | ## Version: v11.2.0-1.0.1h
3 | ## Title: Hekili
4 | ## Author: Hekili
5 | ## IconTexture: Interface\AddOns\Hekili\Textures\LOGO-ORANGE.blp
6 | ## Notes: Priority helper based on SimulationCraft action lists.
7 | ## Notes-zhCN: 基于 SimulationCraft 动作列表的输出技能助手。
8 | ## SavedVariables: HekiliDB
9 | ## OptionalDeps: AddOnSkins, ButtonForge, ConsolePort, ElvUI, LibDualSpec-1.0, Masque, WeakAuras
10 | ## X-Curse-Project-ID: 69254
11 | ## X-WoWI-ID: 24608
12 | ## X-Wago-ID: WYK9WXNL
13 |
14 | embeds.xml
15 |
16 | Hekili.lua
17 | Utils.lua
18 | Formatting.lua
19 | MultilineEditor.lua
20 | Constants.lua
21 | State.lua
22 | Events.lua
23 |
24 | Classes.lua
25 |
26 | TheBurningCrusade\Items.lua
27 | Wrath\Items.lua
28 | Cataclysm\Items.lua
29 | Legion\Items.lua
30 |
31 | BfA\AzeritePowers.lua
32 | BfA\Essences.lua
33 | BfA\Items.lua
34 |
35 | Shadowlands\AnimaPowers.lua
36 | Shadowlands\Covenants.lua
37 | Shadowlands\SoulbindConduits.lua
38 | Shadowlands\Trinkets.lua
39 | Shadowlands\Legendaries.lua
40 |
41 | Dragonflight\Items.lua
42 | Dragonflight\Classes.lua
43 |
44 | TheWarWithin\Items.lua
45 |
46 | TheWarWithin\Classes.lua
47 | TheWarWithin\DeathKnightBlood.lua
48 | TheWarWithin\DeathKnightFrost.lua
49 | TheWarWithin\DeathKnightUnholy.lua
50 | TheWarWithin\DemonHunterHavoc.lua
51 | TheWarWithin\DemonHunterVengeance.lua
52 | TheWarWithin\DruidBalance.lua
53 | TheWarWithin\DruidFeral.lua
54 | TheWarWithin\DruidGuardian.lua
55 | TheWarWithin\DruidRestoration.lua
56 | TheWarWithin\EvokerDevastation.lua
57 | TheWarWithin\EvokerPreservation.lua
58 | TheWarWithin\EvokerAugmentation.lua
59 | TheWarWithin\HunterBeastMastery.lua
60 | TheWarWithin\HunterMarksmanship.lua
61 | TheWarWithin\HunterSurvival.lua
62 | TheWarWithin\MageArcane.lua
63 | TheWarWithin\MageFire.lua
64 | TheWarWithin\MageFrost.lua
65 | TheWarWithin\MonkBrewmaster.lua
66 | TheWarWithin\MonkMistweaver.lua
67 | TheWarWithin\MonkWindwalker.lua
68 | TheWarWithin\PaladinHoly.lua
69 | TheWarWithin\PaladinProtection.lua
70 | TheWarWithin\PaladinRetribution.lua
71 | TheWarWithin\PriestDiscipline.lua
72 | TheWarWithin\PriestHoly.lua
73 | TheWarWithin\PriestShadow.lua
74 | TheWarWithin\RogueAssassination.lua
75 | TheWarWithin\RogueOutlaw.lua
76 | TheWarWithin\RogueSubtlety.lua
77 | TheWarWithin\ShamanElemental.lua
78 | TheWarWithin\ShamanEnhancement.lua
79 | TheWarWithin\ShamanRestoration.lua
80 | TheWarWithin\WarlockAffliction.lua
81 | TheWarWithin\WarlockDemonology.lua
82 | TheWarWithin\WarlockDestruction.lua
83 | TheWarWithin\Warrior\ReflectableSpells.lua
84 | TheWarWithin\WarriorArms.lua
85 | TheWarWithin\WarriorFury.lua
86 | TheWarWithin\WarriorProtection.lua
87 |
88 | Targets.lua
89 | Options\Translation.lua
90 | Options\DevTools.lua
91 | Options\ChatCommands.lua
92 | Options\Options.lua
93 | UI.lua
94 | Scripts.lua
95 | Core.lua
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/ShamanRestoration.simc:
--------------------------------------------------------------------------------
1 | actions.precombat+=/earthliving_weapon
2 | actions.precombat+=/tidecallers_guard
3 | actions.precombat+=/water_shield,if=buff.water_shield.up+buff.earth_shield.up+buff.lightning_shield.up<1+talent.elemental_orbit.rank|(!buff.water_shield.up&settings.healing_mode)
4 | actions.precombat+=/lightning_shield,if=(buff.water_shield.up+buff.earth_shield.up+buff.lightning_shield.up<1+talent.elemental_orbit.rank)&settings.second_shield=lightning_shield
5 | actions.precombat+=/earth_shield,if=(buff.water_shield.up+buff.earth_shield.up+buff.lightning_shield.up<1+talent.elemental_orbit.rank)&settings.second_shield=earth_shield
6 | actions.precombat+=/earth_elemental
7 | actions.precombat+=/potion
8 |
9 | actions+=/spiritwalkers_grace,moving=1,if=movement.distance>6
10 | # Interrupt of casts.
11 | actions+=/wind_shear
12 | actions+=/call_action_list,name=healing,strict=1,if=settings.healing_mode
13 | actions+=/potion
14 | actions+=/use_items
15 | actions+=/blood_fury
16 | actions+=/berserking
17 | actions+=/fireblood
18 | actions+=/ancestral_call
19 | actions+=/bag_of_tricks
20 | actions+=/surging_totem,if=talent.acid_rain
21 | actions+=/healing_rain,if=!moving&talent.acid_rain
22 | actions+=/flame_shock,cycle_targets=1,if=active_enemies<3&refreshable
23 | # actions+=/primordial_wave
24 | actions+=/lava_burst,if=(active_enemies=1|active_enemies=2&buff.lava_surge.up)&dot.flame_shock.remains>cast_time&cooldown_react
25 | actions+=/earth_elemental
26 | actions+=/lightning_bolt,if=spell_targets.chain_lightning<2|!talent.chain_lightning
27 | actions+=/chain_lightning,if=spell_targets.chain_lightning>1
28 | actions+=/flame_shock,moving=1
29 | actions+=/frost_shock,moving=1
30 |
31 | actions.healing+=/downpour,if=buff.unleash_life.up|buff.downpour.up&buff.downpour.remains<2
32 | actions.healing+=/mana_tide_totem,if=mana.pct<85
33 | actions.healing+=/totemic_recall,if=prev_gcd.earthen_wall_totem
34 | actions.healing+=/earthen_wall_totem
35 | actions.healing+=/chain_heal,if=buff.high_tide.up
36 | actions.healing+=/call_action_list,strict=1,name=unleash,if=buff.unleash_life.up
37 | actions.healing+=/surging_totem
38 | actions.healing+=/healing_rain
39 | actions.healing+=/earth_shield,if=active_dot.earth_shield<1+talent.elemental_orbit.rank&buff.earth_shield.up
40 | actions.healing+=/earth_shield,if=(!buff.earth_shield.up&settings.second_shield=earth_shield&talent.elemental_orbit.enabled)
41 | actions.healing+=/healing_stream_totem,if=totem.surging_totem.up&!totem.healing_stream_totem.up
42 | actions.healing+=/riptide,if=cooldown.riptide.charges=cooldown.riptide.charges_max
43 | actions.healing+=/unleash_life,if=talent.call_of_the_ancestors.enabled|cooldown.wellspring.remains<2|(cooldown.surging_totem.remains<3|buff.downpour.up&buff.downpour.remains>3)
44 | actions.healing+=/wellspring
45 |
46 | actions.unleash+=/downpour
47 | actions.unleash+=/wellspring
48 | actions.unleash+=/riptide
49 |
--------------------------------------------------------------------------------
/.pkgmeta:
--------------------------------------------------------------------------------
1 | package-as: Hekili
2 |
3 | enable-nolib-creation: no
4 |
5 | externals:
6 | Libs/LibStub:
7 | url: https://repos.wowace.com/wow/libstub/trunk
8 | Libs/AceAddon-3.0:
9 | url: https://repos.wowace.com/wow/ace3/trunk/AceAddon-3.0
10 | Libs/AceBucket-3.0:
11 | url: https://repos.wowace.com/wow/ace3/trunk/AceBucket-3.0
12 | Libs/AceComm-3.0:
13 | url: https://repos.wowace.com/wow/ace3/trunk/AceComm-3.0
14 | Libs/AceConfig-3.0:
15 | url: https://repos.wowace.com/wow/ace3/trunk/AceConfig-3.0
16 | Libs/AceConsole-3.0:
17 | url: https://repos.wowace.com/wow/ace3/trunk/AceConsole-3.0
18 | Libs/AceDB-3.0:
19 | url: https://repos.wowace.com/wow/ace3/trunk/AceDB-3.0
20 | Libs/AceDBOptions-3.0:
21 | url: https://repos.wowace.com/wow/ace3/trunk/AceDBOptions-3.0
22 | Libs/AceEvent-3.0:
23 | url: https://repos.wowace.com/wow/ace3/trunk/AceEvent-3.0
24 | Libs/AceGUI-3.0:
25 | url: https://repos.wowace.com/wow/ace3/trunk/AceGUI-3.0
26 | Libs/AceHook-3.0:
27 | url: https://repos.wowace.com/wow/ace3/trunk/AceHook-3.0
28 | Libs/AceLocale-3.0:
29 | url: https://repos.wowace.com/wow/ace3/trunk/AceLocale-3.0
30 | Libs/AceSerializer-3.0:
31 | url: https://repos.wowace.com/wow/ace3/trunk/AceSerializer-3.0
32 | Libs/AceTab-3.0:
33 | url: https://repos.wowace.com/wow/ace3/trunk/AceTab-3.0
34 | Libs/AceTimer-3.0:
35 | url: https://repos.wowace.com/wow/ace3/trunk/AceTimer-3.0
36 | Libs/CallbackHandler-1.0:
37 | url: https://repos.wowace.com/wow/callbackhandler/trunk/CallbackHandler-1.0
38 | Libs/LibSharedMedia-3.0:
39 | url: https://repos.wowace.com/wow/libsharedmedia-3-0/trunk/LibSharedMedia-3.0
40 | Libs/AceGUI-3.0-SharedMediaWidgets:
41 | url: https://repos.wowace.com/wow/ace-gui-3-0-shared-media-widgets/trunk/AceGUI-3.0-SharedMediaWidgets
42 | Libs/AceGUI-3.0_SFX-Widgets:
43 | url: https://github.com/SFX-WoW/AceGUI-3.0_SFX-Widgets.git
44 | tag: latest
45 | Libs/LibSpellRange-1.0:
46 | url: https://github.com/ascott18/LibSpellRange-1.0.git
47 | Libs/LibRangeCheck-3.0:
48 | url: https://github.com/WeakAuras/LibRangeCheck-3.0/
49 | Libs/LibCompress:
50 | url: https://repos.wowace.com/wow/libcompress/trunk
51 | Libs/LibDBIcon-1.0:
52 | url: https://repos.wowace.com/wow/libdbicon-1-0/trunk/LibDBIcon-1.0
53 | Libs/LibDeflate:
54 | url: https://github.com/SafeteeWoW/LibDeflate.git
55 | Libs/LibDualSpec-1.0:
56 | url: https://git.wowace.com/wow/libdualspec-1-0/mainline.git
57 | Libs/LibItemBuffs-1.0:
58 | url: https://github.com/AdiAddons/LibItemBuffs-1.0.git
59 | Libs/LibCustomGlow-1.0:
60 | url: https://github.com/Stanzilla/LibCustomGlow.git
61 | Libs/LibChatAnims:
62 | url: https://repos.wowace.com/wow/libchatanims/trunk/LibChatAnims
63 | Libs/LibTranslit-1.0:
64 | url: https://github.com/Vardex/LibTranslit.git
65 | Libs/LibDataBroker-1.1:
66 | url: https://github.com/tekkub/libdatabroker-1-1
67 |
68 | move-folders:
69 | Hekili/Libs/LibRangeCheck-3.0/LibRangeCheck-3.0: Hekili/Libs/LibRangeCheck-3.0
--------------------------------------------------------------------------------
/Dragonflight/Classes.lua:
--------------------------------------------------------------------------------
1 | -- Classes.lua (for Dragonflight)
2 | -- Overrides legacy class/spec registration methods as needed.
3 |
4 | local addon, ns = ...
5 | local Hekili = _G[ addon ]
6 |
7 | if not Hekili.IsDragonflight() then return end
8 |
9 | local C_ClassTalents, C_Traits = _G.C_ClassTalents, _G.C_Traits
10 | local IsPlayerSpell = _G.IsPlayerSpell
11 |
12 | local ResetDisabledGearAndSpells, WipeCovenantCache = ns.ResetDisabledGearAndSpells, ns.WipeCovenantCache
13 | local getActiveHeroTreeName = ns.getActiveHeroTreeName
14 |
15 | local state, class = Hekili.State, Hekili.Class
16 |
17 | -- Revise state.talent to use trait metatables instead of legacy talent API.
18 | table.wipe( state.talent )
19 | setmetatable( state.talent, ns.metatables.mt_generic_traits )
20 | state.talent.no_trait = { rank = 0, max = 1 }
21 |
22 | -- Replace ns.updateTalents() as DF talents use new Traits and ClassTalents API.
23 | do
24 | function ns.updateTalents()
25 | for _, data in pairs( state.talent ) do
26 | data.rank = 0
27 | end
28 |
29 | WipeCovenantCache()
30 | ResetDisabledGearAndSpells()
31 |
32 | if GetSpecialization() == 5 then return end
33 |
34 | local configID = C_ClassTalents.GetActiveConfigID() or -1
35 |
36 | for token, data in pairs( class.talents ) do
37 | local node = C_Traits.GetNodeInfo( configID, data[1] )
38 | local talent = rawget( state.talent, token ) or {}
39 |
40 | if not node or not node.activeEntry then
41 | talent.rank = 0
42 | talent.max = data[3] or 1
43 | else
44 | local entryID = node.activeEntry.entryID
45 | local entry = entryID and C_Traits.GetEntryInfo( configID, entryID )
46 | local defn = entry and C_Traits.GetDefinitionInfo( entry.definitionID )
47 |
48 | talent.rank = defn and defn.spellID == data[2] and ( not node.subTreeID or node.subTreeActive ) and node.activeEntry.rank or 0
49 | talent.max = node.maxRanks
50 | end
51 |
52 | -- Perform a sanity check on maxRanks vs. data[3]. If they don't match, the talent model is likely wrong.
53 | if data[3] and node and node.maxRanks > 0 and node.maxRanks ~= data[3] then
54 | Hekili:Error( "Talent '%s' model expects %d ranks but actual max ranks was %d.", token, data[3], node.maxRanks )
55 | end
56 |
57 | state.talent[ token ] = talent
58 | end
59 |
60 | for k, _ in pairs( state.pvptalent ) do
61 | state.pvptalent[ k ]._enabled = false
62 | end
63 |
64 | for k, v in pairs( class.pvptalents ) do
65 | local _, name, _, enabled, _, sID, _, _, _, known = GetPvpTalentInfoByID( v, 1 )
66 |
67 | if not name then
68 | enabled = IsPlayerSpell( v )
69 | end
70 |
71 | enabled = enabled or known
72 |
73 | if rawget( state.pvptalent, k ) then
74 | state.pvptalent[ k ]._enabled = enabled
75 | else
76 | state.pvptalent[ k ] = {
77 | _enabled = enabled
78 | }
79 | end
80 | end
81 |
82 | state.hero_tree.current = getActiveHeroTreeName()
83 |
84 | ns.callHook( "TALENTS_UPDATED" )
85 | end
86 | end
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/MonkMistweaver.simc:
--------------------------------------------------------------------------------
1 | ## https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/monk_mistweaver.simc
2 |
3 | actions.precombat+=/potion
4 | actions.precombat+=/chi_burst
5 | actions.precombat+=/variable,name=tea_up,value=buff.tea_of_plenty_rsk.up|buff.tea_of_plenty_em.up|buff.tea_of_plenty_eh.up|buff.tea_of_serenity_em.up|buff.tea_of_serenity_rm.up|buff.tea_of_serenity_v.up|buff.thunder_focus_tea.up
6 |
7 | actions+=/spear_hand_strike
8 | actions+=/use_items
9 | actions+=/blood_fury
10 | actions+=/berserking
11 | actions+=/lights_judgment
12 | actions+=/fireblood
13 | actions+=/ancestral_call
14 | actions+=/bag_of_tricks
15 | actions+=/potion
16 | actions+=/renewing_mist,if=time_to_max_charges<=gcd.max
17 | actions+=/call_action_list,name=focus_tea,if=variable.tea_up
18 | actions+=/run_action_list,name=crane,strict=1,if=pet.chiji.up
19 | actions+=/jadefire_stomp,if=!settings.save_faeline|talent.awakened_jadefire&buff.awakened_jadefire.down|talent.jadefire_teachings&buff.jadefire_teachings.down
20 | actions+=/call_action_list,name=aoe,strict=1,if=active_enemies>=3
21 | actions+=/call_action_list,name=st,strict=1,if=active_enemies<3
22 |
23 |
24 | actions.focus_tea+=/renewing_mist,if=raid|buff.tea_of_serenity_rm.up
25 | actions.focus_tea+=/rising_sun_kick
26 | ## only use these 3 if their rng buffs are up, don't spend real focus tea
27 | actions.focus_tea+=/expel_harm,if=buff.tea_of_plenty_eh.up
28 | actions.focus_tea+=/vivify,if=buff.tea_of_serenity_v.up
29 | actions.focus_tea+=/enveloping_mist,if=buff.tea_of_serenity_em.up|buff.tea_of_plenty_em.up
30 |
31 | actions.st+=/thunder_focus_tea
32 | actions.st+=/rising_sun_kick
33 | actions.st+=/rushing_wind_kick
34 | actions.st+=/tiger_palm,if=talent.awakened_jadefire.enabled&buff.jadefire_stomp.up&buff.teachings_of_the_monastery.stack<4|buff.teachings_of_the_monastery.stack<1
35 | actions.st+=/blackout_kick,if=((!talent.awakened_jadefire|buff.jadefire_stomp.down)&buff.teachings_of_the_monastery.up|buff.teachings_of_the_monastery.stack>3)&(!talent.rushing_wind_kick&cooldown.rising_sun_kick.remains>2*gcd.max|cooldown.rushing_wind_kick.remains>2*gcd.max)
36 | actions.st+=/vivify,if=settings.single_zen_pulse&buff.zen_pulse.up
37 | actions.st+=/chi_burst
38 | actions.st+=/tiger_palm
39 |
40 | actions.aoe+=/thunder_focus_tea
41 | actions.aoe+=/crackling_jade_lightning,if=buff.jade_empowerment.up&buff.jadefire_teachings.up
42 | actions.aoe+=/vivify,if=buff.zen_pulse.up
43 | actions.aoe+=/rising_sun_kick,if=settings.aoe_rsk
44 | actions.aoe+=/rushing_wind_kick,if=settings.aoe_rsk
45 | actions.aoe+=/spinning_crane_kick,if=(talent.celestial_conduit&!talent.xuens_guidance)|active_enemies>=4
46 | actions.aoe+=/tiger_palm,if=talent.awakened_jadefire.enabled&buff.jadefire_stomp.up&buff.teachings_of_the_monastery.stack<4|buff.teachings_of_the_monastery.stack<1
47 | actions.aoe+=/blackout_kick,if=(!talent.rushing_wind_kick&cooldown.rising_sun_kick.remains>2*gcd.max|cooldown.rushing_wind_kick.remains>2*gcd.max)&(buff.teachings_of_the_monastery.stack>3)
48 | actions.aoe+=/chi_burst
49 | actions.aoe+=/spinning_crane_kick
50 |
51 |
52 | actions.crane+=/thunder_focus_tea,if=talent.ancient_teachings&buff.ancient_teachings.remains1
56 | actions.crane+=/rising_sun_kick
57 | actions.crane+=/rushing_wind_kick
58 | actions.crane+=/blackout_kick,if=((!talent.awakened_jadefire|buff.jadefire_stomp.down)&buff.teachings_of_the_monastery.up|buff.teachings_of_the_monastery.stack>3)&(!talent.rushing_wind_kick&cooldown.rising_sun_kick.remains>2*gcd.max|cooldown.rushing_wind_kick.remains>2*gcd.max)
59 | actions.crane+=/spinning_crane_kick,if=active_enemies>3|active_enemies>1&!talent.ancient_concordance&!talent.awakened_jadefire
60 | actions.crane+=/blackout_kick
61 | actions.crane+=/tiger_palm
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Hekili
2 |
3 | **Hekili** 是一个功能强大、高度可配置的**魔兽世界优先级助手**。它支持**所有🗡️输出和🛡️坦克专精**。➕治疗专精也受支持,主要关注**输出技能**,非常适合单人内容或PvE战斗中的空闲时间。
4 |
5 | [➡️ 最新中文版](https://github.com/huchang47/hekili_zhCN/releases/latest)
6 |
7 |
8 | ## ✨ 它能做什么?
9 |
10 | Hekili 通过推荐战斗中应该使用的技能来帮助你更有效地游戏。
11 |
12 | 它的**核心特性**是显示多个即将到来的连续动作,让你能够提前计划,而不是仅仅对单个不断变化的图标做出反应。这种方法减少了视野局限,帮助你更好地专注于战斗本身。
13 |
14 | 这些建议是基于从[**SimulationCraft**](https://www.simulationcraft.org)和[**RaidBots**](https://www.raidbots.com/simbot)继承的**技能优先级列表(APL)逻辑**提供的。这种集成有助于确保你在游戏中的决策与你已经在使用的天赋、装备和属性优化工具保持一致。APL会**经常更新**以反映职业平衡、机制和理论研究的变化。
15 |
16 | **Hekili** 可以帮助你:
17 | - 提高输出伤害
18 | - 学习和掌握新的专精
19 | - 提高操作的一致性,并将你的决策与理论模拟进行对比
20 |
21 | ## 🔧 它是如何工作的?
22 |
23 | **Hekili** 使用你当前角色状态 — 包括冷却时间、资源、增益/减益效果和附近的敌人 — 来**模拟未来几个技能**,使用你专精的 APL 逻辑。它假设你按顺序执行其建议。
24 |
25 | 如果你施放了其他技能,插件会**立即重新评估**你的游戏状态并实时更新建议。
26 |
27 | 其他功能包括:
28 | - 可选的独立显示:
29 | - AOE 技能
30 | - 冷却技能
31 | - 防御技能
32 | - 打断技能
33 | - 引导你在敌人施法后期进行打断
34 | - 过滤显示史诗钥石优先级技能
35 | - 冷却、防御、打断、药水的开关控制:
36 | - 你可以通过启用或禁用开关选项来手动控制是否使用像 2 分钟冷却这样的主要技能。
37 | - 这些开关可以绑定到快捷键或宏,让你能够根据每场战斗灵活控制。
38 | - 除了使用开关,你还可以在专门的冷却显示中显示这些技能,让你在时机最佳时手动施放。
39 | - 当与战斗机制知识结合时,这个系统特别强大 — 例如,为爆发阶段或小怪刷新保留冷却可以带来可观的 DPS 提升。
40 | - 兼容 **ElvUI**、**Bartender** 和其他界面插件
41 | - 自定义选项
42 | - 从多种显示风格中选择以满足你的需求 — 从单一的自动显示到 AOE 专用或双显示设置
43 | - 调整外观和感觉:调整图标大小、间距、布局、字体和透明度
44 | - 在图标上显示技能快捷键,或将默认图标替换为其他技能或材质
45 | - 禁用单个技能以适应你的游戏风格 — 例如,如果你更喜欢将使用饰品宏写入冷却技能中,你可以完全隐藏该饰品
46 | - 高级用户可以使用熟悉的 **SimulationCraft 风格语法**编辑或创建自己的动作列表
47 |
48 | ## 🚀 开始使用
49 |
50 | ### 1. **安装插件**
51 |
52 | 安装 **Hekili** 有两种主要方式:
53 |
54 | - **插件管理器**(推荐):自动安装并保持插件更新
55 | - **手动下载**:从 [**GitHub Releases**](https://github.com/huchang47/hekili_zhCN/releases/latest) 下载并解压 `.zip` 文件到 `Interface/AddOns` 目录
56 |
57 | #### 推荐的插件管理器
58 | 由于 **Hekili** 经常更新,我们建议使用以下可信赖的工具之一:
59 | - [**新手盒子**](https://www.wclbox.com/) - 一个简单易用的插件管理器,对中文用户友好。
60 | - [**CurseForge**](https://www.curseforge.com/download) – 一个广泛使用的通用插件管理器。我们推荐使用 Windows 或 macOS 的独立桌面版本,以避免额外的界面叠加。
61 | - [**Wago App**](https://addons.wago.io/download) – 如果你同时使用 **WeakAuras**、**Plater scripts** 或其他 Wago 托管的内容,这是理想的选择。
62 | - [**WowUp**](https://wowup.io/) – 支持 **CurseForge** 和 **Wago** 后端,并包含自己的插件库。除非你使用其他工具来管理 WeakAuras,否则我们建议使用 **CurseForge** 版本。
63 | - [**CurseBreaker**](https://github.com/AcidWeb/CurseBreaker) (适合💪进阶用户) – 一个轻量级命令行界面(CLI)工具,支持 **Wago**、**WoWInterface**、**Tukui**、**ElvUI**、**GitHub** 等。使用 **WoWInterface** 更新时无需额外设置。
64 |
65 | ### 2. 游戏内设置
66 |
67 | 使用小地图图标或输入命令:`/hekili`
68 |
69 | ## 🛠 需要帮助?
70 |
71 | ### 🐛 错误报告
72 |
73 | 如果遇到问题:
74 |
75 | 1. 安装 [**BugSack**](https://www.curseforge.com/wow/addons/bugsack) 和 [**BugGrabber**](https://www.curseforge.com/wow/addons/bug-grabber)
76 | 2. 重现问题,生成一个[**快照**](https://github.com/Hekili/hekili/wiki/Report-An-Issue#how-do-i-get-a-snapshot),然后打开 BugSack 检查 LUA 错误
77 | 3. 在[**问题页面**](https://github.com/Hekili/hekili/issues/new/choose)提交报告,请务必包含你刚刚获取的快照和 LUA 错误(如果有)
78 |
79 | ### ❓ 其他支持
80 |
81 | - 在[**大漩涡数据港**](https://www.wowdata.cn)获取最新资讯和数据统计
82 | - 查看[**Wiki**](https://github.com/Hekili/hekili/wiki)
83 | - 在[**Hekili Discord**](https://discord.gg/3cCTFxM)中提问
84 |
85 | ---
86 |
87 | ## 🙏 致谢
88 |
89 | - 基于[**SimulationCraft**](https://www.simulationcraft.org/)的逻辑,该项目由众多优秀的开发者和理论研究者维护
90 | - 使用了[**Ace3**](https://www.wowace.com/projects/ace3)、[**LibRangeCheck**](https://www.wowace.com/projects/librangecheck-2-0)等库
91 | - 由[**Hekili**](https://github.com/Hekili)、[**Syrif**](https://github.com/syrifgit)、[**Nerien**](https://github.com/johnnylam88)维护,并得到社区贡献者的大力帮助
92 | - 本中文版由[**胡里胡涂(huchang47)**](https://github.com/huchang47)长期更新维护
93 |
94 | ---
95 |
96 | ## 🧪 开发者说明
97 |
98 | 如果你正在开发自定义专精模块、改进现有逻辑或为插件开发做贡献:
99 |
100 | - 查看[**开发者资源**](https://github.com/Hekili/hekili/wiki/Developer-Stuff)页面
101 | - 使用 `/hekili` 命令并在快照标签页中检查实时决策过程
102 | - 查看现有和历史[**拉取请求**](https://github.com/Hekili/hekili/pulls)
103 | - 查看现有和历史[**问题**](https://github.com/Hekili/hekili/issues)
104 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/Bug-Report-Form.yml:
--------------------------------------------------------------------------------
1 | name: In-Game Error
2 | description: |
3 | Use this ticket for in-game error messages or when the addon fails to load.
4 | Install BugSack and BugGrabber to easily collect error messages.
5 | title: "[BUG] Provide a short, clear title for your Bug Report"
6 | labels: [bug, triage]
7 | assignees:
8 | - Hekili
9 | body:
10 | - type: checkboxes
11 | id: precheck
12 | attributes:
13 | label: Before You Begin
14 | description: Please confirm that you've taken these preliminary steps before submitting your issue report.
15 | options:
16 | - label: I confirm that I have downloaded the latest version of the addon.
17 | required: true
18 | - label: I am not playing on a private server.
19 | required: true
20 | - label: I checked for an [existing, open ticket](https://github.com/Hekili/hekili/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc) for this issue and was not able to find one.
21 | required: true
22 | - label: I edited the title of this bug report (above) so that it describes the issue I am reporting.
23 | required: true
24 | - type: textarea
25 | id: description
26 | attributes:
27 | label: Describe the Issue
28 | description: Please describe the issue in question. Be specific and describe what you see. You can CTRL+V to paste a screenshot (image) or supply links to screenshot images.
29 | placeholder: "Example: The addon is not loading for my Beast Mastery Demon Hunter. The following error message appears in my BugSack."
30 | validations:
31 | required: true
32 | - type: textarea
33 | id: reproduction
34 | attributes:
35 | label: How to Reproduce
36 | description: "Steps to reproduce the behavior"
37 | placeholder: |
38 | 1. Enter game as a Havoc Demon Hunter.
39 | 2. Change specialization to Beast Mastery.
40 | 3. Realize Beast Mastery Demon Hunters don't exist.
41 | validations:
42 | required: true
43 | - type: input
44 | id: player-info
45 | attributes:
46 | label: Player Information (Link)
47 | description: |
48 | Please supply your character information by completing the following steps.
49 | * Log into your WoW character.
50 | * Type `/hekili` and press Enter.
51 | * Open the `Snapshots (Troubleshooting)` section (left panel).
52 | * Copy all of the text from the text box.
53 | * Paste the text to Pastebin.
54 | * Provide the Pastebin link here.
55 |
56 | This step is essential, as most issues are related to specific classes, specializations, gear, talent choices, or other game systems.
57 | If you do not provide this information, I cannot triage your problem.
58 | **Note:** Some errors may prevent you from opening `/hekili`. If that's true for you, please note that in this box instead of providing the link.
59 | placeholder: http://pastebin.com/AbCdEfGh
60 | validations:
61 | required: true
62 | - type: input
63 | id: error-messages
64 | attributes:
65 | label: Error Messages (Link)
66 | description: |
67 | If there are error messages in-game, please install [BugSack](https://www.curseforge.com/wow/addons/bugsack) and [BugGrabber](https://www.curseforge.com/wow/addons/bug-grabber) -- both! -- in order to collect the error message.
68 | * Install BugSack and BugGrabber if you don't already have them.
69 | * Log into WoW, open BugSack and clear the sack.
70 | * Reload WoW (/rl).
71 | * When WoW finishes reloading, open BugSack and copy the **first** error message.
72 | * If you need to do something to trigger the error message, do that and then open BugSack and copy the error message.
73 | * Paste the message to Pastebin (it's free!).
74 | * Provide the Pastebin link here.
75 | placeholder: http://pastebin.com/aBcDeFgH
76 | validations:
77 | required: true
78 | - type: textarea
79 | id: addl-info
80 | attributes:
81 | label: Additional Information
82 | description: Please provide any additional information regarding this issue that was not included above.
83 | placeholder: Leave blank, if all necessary details are included above.
84 | - type: input
85 | id: contact
86 | attributes:
87 | label: Contact Information
88 | description: I will contact you via this GitHub ticket with questions and updates. If you do not regularly check your GitHub email, please provide an alternate contact method (i.e., Discord ID) so that I can reach you if needed.
89 | placeholder: Hekili#0001
90 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/DruidRestoration.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/druid_restoration.simc
2 | ## SimulationCraft Commit Sync: d1a271e
3 | ## Date: 2025-06-11
4 |
5 | # Snapshot raid buffed stats before combat begins and pre-potting is done.
6 | actions.precombat+=/mark_of_the_wild
7 | actions.precombat+=/symbiotic_relationship,if=down&active_allies>1
8 | actions.precombat+=/prowl,if=talent.rake.enabled
9 | actions.precombat+=/cat_form,if=talent.rake.enabled1
10 |
11 | actions+=/skull_bash
12 | actions+=/berserking
13 | actions+=/natures_vigil,if=!buff.prowl.up&!buff.shadowmeld.up
14 | actions+=/call_action_list,name=healing,strict=1,if=settings.healing_mode&buff.prowl.down
15 | actions+=/heart_of_the_wild,if=!buff.prowl.up&!buff.shadowmeld.up
16 | actions+=/use_items,if=!buff.prowl.up&!buff.shadowmeld.up
17 | actions+=/potion,if=!buff.prowl.up&!buff.shadowmeld.up
18 | actions+=/run_action_list,name=cat,strict=1,if=talent.rake.enabled|buff.cat_form.up
19 | actions+=/cat_form,if=talent.rake.enabled
20 | actions+=/convoke_the_spirits,if=(buff.heart_of_the_wild.up|cooldown.heart_of_the_wild.remains>60-30*talent.cenarius_guidance.enabled|!talent.heart_of_the_wild.enabled)
21 | actions+=/sunfire,cycle_targets=1,if=refreshable&target.time_to_die>5&talent.improved_sunfire.enabled
22 | actions+=/moonfire,cycle_targets=1,if=refreshable&time_to_die>12
23 | actions+=/starsurge,if=active_enemies<8
24 | actions+=/sunfire,cycle_targets=1,if=refreshable&target.time_to_die>7&active_enemies<7
25 | actions+=/starfire,if=spell_targets.starfire>1|buff.heart_of_the_wild.up
26 | actions+=/wrath
27 |
28 | actions.cat+=/rake,if=buff.shadowmeld.up|buff.prowl.up|buff.sudden_ambush.up
29 | actions.cat+=/heart_of_the_wild,if=(cooldown.convoke_the_spirits.remains<40|!talent.convoke_the_spirits.enabled)|boss&fight_remains<46
30 | actions.cat+=/cat_form,if=!talent.fluid_form&talent.convoke_the_spirits.enabled&(active_enemies<=6)&(!buff.cat_form.up&cooldown.convoke_the_spirits.remains<=gcd.max&(buff.heart_of_the_wild.up|cooldown.heart_of_the_wild.remains>60-30*talent.cenarius_guidance.enabled|!talent.heart_of_the_wild.enabled))
31 | actions.cat+=/convoke_the_spirits,if=(buff.cat_form.up)&(buff.heart_of_the_wild.up|cooldown.heart_of_the_wild.remains>60-30*talent.cenarius_guidance.enabled|!talent.heart_of_the_wild.enabled)
32 | actions.cat+=/rip,cycle_targets=1,if=((refreshable|energy>90&remains<=10)&(combo_points=5&time_to_die>remains+24|(remains+combo_points*4time_to_die))|!ticking&combo_points>2+spell_targets.swipe_cat*2)
33 | actions.cat+=/pool_resource,for_next=1
34 | actions.cat+=/thrash_cat,cycle_targets=1,if=refreshable&target.time_to_die>5&spell_targets.thrash_cat>4
35 | actions.cat+=/sunfire,cycle_targets=1,if=(refreshable&target.time_to_die>5)&!prev_gcd.1.cat_form
36 | actions.cat+=/rake,cycle_targets=1,if=refreshable&(time_to_die>8&!ticking)|(active_dot.rake<1&talent.primal_fury.enabled&talent.master_shapeshifter.enabled&spell_targets.swipe_cat>4)
37 | # [Hekili] Modified as cooldown.healing and druid.time_spend_healing are not supported.
38 | actions.cat+=/cat_form,if=!buff.cat_form.up&energy>60&!talent.fluid_form.enabled
39 | actions.cat+=/moonfire,cycle_targets=1,if=(refreshable&time_to_die>12&!ticking|(prev_gcd.1.sunfire&remains4|(buff.heart_of_the_wild.up&spell_targets.starfire>5))|(buff.heart_of_the_wild.up&spell_targets.starfire>7))
42 | actions.cat+=/starsurge,if=active_enemies=1|(active_enemies<8&!buff.cat_form.up)
43 | actions.cat+=/cat_form,if=!buff.cat_form.up&energy>50&!talent.fluid_form.enabled
44 | actions.cat+=/pool_resource,for_next=1
45 | actions.cat+=/ferocious_bite,cycle_targets=1,if=(combo_points>3&target.time_to_die<3)|(combo_points=5&energy>=50&dot.rip.remains>10)&spell_targets.swipe_cat<4
46 | actions.cat+=/thrash_cat,cycle_targets=1,if=refreshable&target.time_to_die>5&spell_targets.thrash_cat>2
47 | actions.cat+=/rake,cycle_targets=1,if=refreshable&time_to_die>10&(!talent.primal_fury.enabled|!talent.master_shapeshifter.enabled|!spell_targets.swipe_cat>4)
48 | actions.cat+=/swipe_cat,if=active_enemies>2&combo_points<5
49 | actions.cat+=/thrash_cat,if=refreshable&fight_remains>5
50 | actions.cat+=/pool_resource,for_next=1
51 | actions.cat+=/shred,if=energy>60&combo_points<5
52 | actions.cat+=/ferocious_bite,if=energy>50&combo_points.deficit=0
53 | actions.cat+=/cat_form,if=!talent.fluid_form&!buff.cat_form.up
54 |
55 | # On the tank
56 | actions.healing+=/rejuvenation,if=active_dot.rejuvenation<1
57 | # On an ally
58 | actions.healing+=/lifebloom,if=(active_dot.lifebloom<1)|(active_dot.lifebloom<2&buff.lifebloom.up&talent.undergrowth.enabled)
59 | # On yourself
60 | actions.healing+=/lifebloom,if=(active_dot.lifebloom<2&buff.lifebloom.down&talent.undergrowth.enabled)
61 | # Maintain Efflo
62 | actions.healing+=/efflorescence,if=buff.efflorescence.down
63 | # transform into tree
64 | actions.healing+=/swiftmend,if=(active_dot.regrowth+active_dot.wild_growth+active_dot.rejuvenation)>1&talent.reforestation.enabled&buff.reforestation.stack=3
65 | # Always wild growth after swiftmend
66 | actions.healing+=/wild_growth,if=prev.1.swiftmend
67 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/DeathKnightBlood.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/deathknight_blood.simc
2 | ## SimulationCraft Commit Sync: 7877e91
3 | ## Date: 2025-08-26
4 |
5 |
6 | actions.precombat+=/deaths_caress
7 | actions.precombat+=/variable,name=bone_shield_refresh_value,value=7
8 |
9 | actions+=/mind_freeze
10 | actions+=/use_item,name=tome_of_lights_devotion,if=buff.inner_resilience.up,use_off_gcd=1
11 | actions+=/use_item,name=unyielding_netherprism,if=cooldown.dancing_rune_weapon.remains<1|boss&fight_remains<=20,use_off_gcd=1
12 | actions+=/use_items
13 | actions+=/use_item,name=bestinslots,use_off_gcd=1
14 | actions+=/blood_fury,if=buff.dancing_rune_weapon.up
15 | actions+=/berserking,if=buff.dancing_rune_weapon.up
16 | actions+=/ancestral_call,if=buff.dancing_rune_weapon.up
17 | actions+=/fireblood,if=buff.dancing_rune_weapon.up
18 | actions+=/potion,if=buff.dancing_rune_weapon.up
19 | actions+=/vampiric_blood,if=tanking&incoming_damage_5s>=vb_damage&!(buff.dancing_rune_weapon.up|buff.icebound_fortitude.up)
20 | actions+=/variable,name=rp_deficit_threshold,value=15+(10*talent.relish_in_blood.enabled)+(3*talent.runic_attenuation.enabled)+(spell_targets.heart_strike*talent.heartbreaker.enabled*2)
21 | actions+=/raise_dead,use_off_gcd=1
22 | actions+=/blood_tap,if=(rune<=2&rune.time_to_3>gcd&charges_fractional>=1.8)
23 | actions+=/blood_tap,if=(rune<=1&rune.time_to_3>gcd)
24 | actions+=/deaths_caress,if=buff.bone_shield.remains4
34 | actions.deathbringer+=/bonestorm,if=buff.bone_shield.stack>=5&buff.death_and_decay.remains
35 | actions.deathbringer+=/death_strike,if=runic_power.deficit(dot.soul_reaper.remains+5)
37 | actions.deathbringer+=/soul_reaper,if=active_enemies<=2&target.time_to_pct_35<5&target.time_to_die>(dot.soul_reaper.remains+5)
38 | actions.deathbringer+=/reapers_mark
39 | actions.deathbringer+=/blood_boil,if=buff.dancing_rune_weapon.up&!drw.bp_ticking
40 | actions.deathbringer+=/death_and_decay,if=!buff.death_and_decay.up
41 | actions.deathbringer+=/marrowrend,if=buff.exterminate.up|(buff.bone_shield.stack<5&!dot.bonestorm.ticking)
42 | actions.deathbringer+=/death_strike
43 | actions.deathbringer+=/tombstone,if=buff.bone_shield.stack>=8&buff.death_and_decay.remains&cooldown.dancing_rune_weapon.remains>=25
44 | actions.deathbringer+=/blooddrinker,if=!buff.dancing_rune_weapon.up&active_enemies<=2&buff.coagulopathy.remains>3
45 | actions.deathbringer+=/consumption
46 | actions.deathbringer+=/blood_boil
47 | actions.deathbringer+=/heart_strike,if=buff.coagulopathy.stack<5
48 | actions.deathbringer+=/heart_strike
49 | actions.deathbringer+=/soul_reaper,if=buff.reaper_of_souls.up
50 | actions.deathbringer+=/arcane_torrent,if=runic_power.deficit>20
51 |
52 | actions.san_drw+=/heart_strike,if=buff.essence_of_the_blood_queen.remains<1.5&buff.essence_of_the_blood_queen.remains
53 | actions.san_drw+=/bonestorm,if=buff.bone_shield.stack>=5
54 | actions.san_drw+=/death_strike,if=runic_power.deficit<36
55 | actions.san_drw+=/blood_boil,if=!drw.bp_ticking
56 | actions.san_drw+=/any_dnd,if=(active_enemies<=3&buff.crimson_scourge.remains)|(active_enemies>3&!buff.death_and_decay.remains)
57 | actions.san_drw+=/heart_strike
58 | actions.san_drw+=/death_strike
59 | actions.san_drw+=/consumption
60 | actions.san_drw+=/blood_boil
61 |
62 | actions.sanlayn+=/blood_boil,if=(!buff.bone_shield.up|buff.bone_shield.remains<1.5|buff.bone_shield.stack<=1)&active_enemies>=2
63 | actions.sanlayn+=/deaths_caress,if=!buff.bone_shield.up|buff.bone_shield.remains<1.5|buff.bone_shield.stack<=1
64 | actions.sanlayn+=/blood_boil,if=dot.blood_plague.remains<3
65 | actions.sanlayn+=/heart_strike,if=(buff.essence_of_the_blood_queen.remains<1.5&buff.essence_of_the_blood_queen.remains&buff.vampiric_strike.remains)
66 | actions.sanlayn+=/bonestorm,if=buff.bone_shield.stack>=5&(buff.death_and_decay.remains|active_enemies<=3)
67 | actions.sanlayn+=/death_strike,if=runic_power.deficit<20
68 | actions.sanlayn+=/marrowrend,if=buff.bone_shield.stack<6&!dot.bonestorm.ticking
69 | actions.sanlayn+=/consumption,if=buff.infliction_of_sorrow.up&buff.death_and_decay.up
70 | actions.sanlayn+=/heart_strike,if=(buff.infliction_of_sorrow.up|buff.vampiric_strike.up)&buff.death_and_decay.up
71 | actions.sanlayn+=/soul_reaper,if=active_enemies<=2&target.time_to_pct_35<5&target.time_to_die>(dot.soul_reaper.remains+5)
72 | actions.sanlayn+=/blood_boil,if=buff.bone_shield.stack<6&!dot.bonestorm.ticking&active_enemies>=2
73 | actions.sanlayn+=/deaths_caress,if=buff.bone_shield.stack<6&!dot.bonestorm.ticking
74 | actions.sanlayn+=/tombstone,if=buff.bone_shield.stack>=6&(buff.death_and_decay.remains|active_enemies<=3)&cooldown.dancing_rune_weapon.remains>=25
75 | actions.sanlayn+=/any_dnd,if=(active_enemies<=3&buff.crimson_scourge.remains)|(active_enemies>3&!buff.death_and_decay.remains)
76 | actions.sanlayn+=/blooddrinker,if=active_enemies<=2&buff.coagulopathy.remains>3
77 | actions.sanlayn+=/heart_strike,if=buff.vampiric_strike.up
78 | actions.sanlayn+=/death_strike
79 | actions.sanlayn+=/heart_strike,if=rune>=2
80 | actions.sanlayn+=/consumption
81 | actions.sanlayn+=/blood_boil
82 | actions.sanlayn+=/heart_strike
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/WarriorProtection.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/warrior_protection.simc
2 | ## SimulationCraft Commit Sync: bc73745
3 | ## Date: 2025-08-12
4 |
5 | actions.precombat+=/battle_stance,toggle=on
6 | actions.precombat+=/battle_shout
7 |
8 | actions+=/pummel
9 | actions+=/charge,if=time=0|movement.distance>8
10 | actions+=/use_item,name=tome_of_lights_devotion,if=buff.inner_resilience.up
11 | actions+=/use_items
12 | actions+=/avatar,if=buff.thunder_blast.down|buff.thunder_blast.stack<=2
13 | actions+=/shield_wall,use_off_gcd=1,if=tanking&incoming_damage_5s>shield_wall_damage_taken&health.pct<=shield_wall_health_pct&!(buff.shield_wall.up|buff.last_stand.up|buff.rallying_cry.up|buff.potion.up|talent.immovable_object.enabled&buff.avatar.down)
14 | actions+=/blood_fury
15 | actions+=/berserking
16 | actions+=/arcane_torrent
17 | actions+=/lights_judgment
18 | actions+=/fireblood
19 | actions+=/ancestral_call
20 | actions+=/bag_of_tricks
21 | actions+=/potion,if=buff.avatar.up|buff.avatar.up&target.health.pct<=20
22 | actions+=/ignore_pain,if=target.health.pct>=20&(rage.deficit<=15&cooldown.shield_slam.ready|rage.deficit<=40&cooldown.shield_charge.ready&talent.champions_bulwark.enabled|rage.deficit<=20&cooldown.shield_charge.ready|rage.deficit<=30&cooldown.demoralizing_shout.ready&talent.booming_voice.enabled|rage.deficit<=20&cooldown.avatar.ready|rage.deficit<=45&cooldown.demoralizing_shout.ready&talent.booming_voice.enabled&buff.last_stand.up&talent.unnerving_focus.enabled|rage.deficit<=30&cooldown.avatar.ready&buff.last_stand.up&talent.unnerving_focus.enabled|rage.deficit<=20|rage.deficit<=40&cooldown.shield_slam.ready&buff.violent_outburst.up&talent.heavy_repercussions.enabled&talent.impenetrable_wall.enabled|rage.deficit<=55&cooldown.shield_slam.ready&buff.violent_outburst.up&buff.last_stand.up&talent.unnerving_focus.enabled&talent.heavy_repercussions.enabled&talent.impenetrable_wall.enabled|rage.deficit<=17&cooldown.shield_slam.ready&talent.heavy_repercussions.enabled|rage.deficit<=18&cooldown.shield_slam.ready&talent.impenetrable_wall.enabled)|(rage>=70|buff.seeing_red.stack=7&rage>=35)&cooldown.shield_slam.remains<=1&buff.shield_block.remains>=4&set_bonus.tier31_2pc,use_off_gcd=1
23 | actions+=/last_stand,use_off_gcd=1,if=tanking&incoming_damage_5s>last_stand_damage_taken&health.pct<=last_stand_health_pct&!(buff.shield_wall.up|buff.last_stand.up|buff.rallying_cry.up|buff.potion.up)
24 | actions+=/rallying_cry,if=tanking&incoming_damage_5s>rallying_cry_damage_taken&health.pct<=rallying_cry_health_pct&!(buff.shield_wall.up|buff.last_stand.up|buff.rallying_cry.up|buff.potion.up)
25 | actions+=/victory_rush,if=health.pct=2&buff.thunder_blast.stack=2
31 | actions+=/demolish,if=buff.colossal_might.stack>=3
32 | actions+=/thunderous_roar
33 | actions+=/shield_charge
34 | actions+=/shield_block,if=buff.shield_block.remains<=10
35 | actions+=/run_action_list,name=aoe,strict=1,if=active_enemies>=3
36 | actions+=/call_action_list,name=generic
37 |
38 | actions.aoe+=/thunder_blast,if=dot.rend.remains<=1
39 | actions.aoe+=/thunder_clap,if=dot.rend.remains<=1
40 | actions.aoe+=/thunder_blast,if=buff.violent_outburst.up&active_enemies>=2&buff.avatar.up&talent.unstoppable_force.enabled
41 | actions.aoe+=/execute,if=spell_targets.execute>=2&(rage>=50|buff.sudden_death.up)&talent.heavy_handed.enabled
42 | actions.aoe+=/thunder_clap,if=buff.violent_outburst.up&active_enemies>=4&buff.avatar.up&talent.unstoppable_force.enabled&talent.crashing_thunder.enabled|buff.violent_outburst.up&active_enemies>6&buff.avatar.up&talent.unstoppable_force.enabled
43 | actions.aoe+=/revenge,if=rage>=70&talent.seismic_reverberation.enabled&active_enemies>=3
44 | actions.aoe+=/shield_slam,if=rage<=60|buff.violent_outburst.up&active_enemies<=4&talent.crashing_thunder.enabled
45 | actions.aoe+=/thunder_blast
46 | actions.aoe+=/thunder_clap
47 | actions.aoe+=/revenge,if=rage>=30|rage>=40&talent.barbaric_training.enabled
48 |
49 | actions.generic+=/thunder_blast,if=(buff.thunder_blast.stack=2&buff.burst_of_power.stack<=1&buff.avatar.up&talent.unstoppable_force.enabled)
50 | actions.generic+=/shield_slam,if=(buff.burst_of_power.stack=2&buff.thunder_blast.stack<=1|buff.violent_outburst.up)|rage<=70&talent.demolish.enabled
51 | actions.generic+=/execute,if=rage>=70|(rage>=40&cooldown.shield_slam.remains&talent.demolish.enabled|rage>=50&cooldown.shield_slam.remains)|buff.sudden_death.up&talent.sudden_death.enabled
52 | actions.generic+=/shield_slam
53 | actions.generic+=/thunder_blast,if=dot.rend.remains<=2&buff.violent_outburst.down
54 | actions.generic+=/thunder_blast
55 | actions.generic+=/thunder_clap,if=dot.rend.remains<=2&buff.violent_outburst.down
56 | actions.generic+=/thunder_blast,if=(active_enemies>1|cooldown.shield_slam.remains&!buff.violent_outburst.up)
57 | actions.generic+=/thunder_clap,if=(active_enemies>1|cooldown.shield_slam.remains&!buff.violent_outburst.up)
58 | actions.generic+=/revenge,if=(rage>=80&target.health.pct>20|buff.revenge.up&target.health.pct<=20&rage<=18&cooldown.shield_slam.remains|buff.revenge.up&target.health.pct>20)|(rage>=80&target.health.pct>35|buff.revenge.up&target.health.pct<=35&rage<=18&cooldown.shield_slam.remains|buff.revenge.up&target.health.pct>35)&talent.massacre.enabled
59 | actions.generic+=/execute
60 | actions.generic+=/revenge
61 | actions.generic+=/thunder_blast,if=(active_enemies>=1|cooldown.shield_slam.remains&buff.violent_outburst.up)
62 | actions.generic+=/thunder_clap,if=(active_enemies>=1|cooldown.shield_slam.remains&buff.violent_outburst.up)
63 | actions.generic+=/devastate
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/MonkBrewmaster.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/monk_brewmaster.simc
2 | ## SimulationCraft Commit Sync: 14cbb0c
3 | ## Date: 2025-08-12
4 |
5 | ## TODO - squish the celestial brew entries
6 |
7 | actions.precombat+=/potion
8 |
9 | actions+=/spear_hand_strike
10 | actions+=/diffuse_magic
11 | actions+=/vivify,if=health.pct<=settings.vivify_percent&buff.vivacious_vivification.up
12 | actions+=/purifying_brew,if=tanking&settings.purify_for_celestial&(time_to_max_charges1.5
13 | actions+=/celestial_brew,if=tanking&(buff.celestial_brew.down&buff.celestial_infusion.down)&(!talent.improved_celestial_brew|buff.purified_chi.up)&(!settings.max_damage|buff.blackout_combo.down)
14 | ## actions+=/purifying_brew,line_cd=5,if=talent.improved_invoke_niuzao_the_black_ox&settings.purify_for_niuzao&pet.niuzao_the_black_ox.active
15 | actions+=/purifying_brew,if=group&(!settings.max_damage|buff.blackout_combo.down)&settings.purify_stagger_currhp>0&stagger.pct>=settings.purify_stagger_currhp
16 | actions+=/purifying_brew,if=solo&(!settings.max_damage|buff.blackout_combo.down)&settings.purify_stagger_currhp>0&stagger.pct>=settings.purify_stagger_currhp*0.5
17 | actions+=/purifying_brew,if=group&(settings.max_damage&buff.blackout_combo.down)&settings.purify_stagger_maxhp>0&stagger.pct>=settings.purify_stagger_maxhp
18 | actions+=/purifying_brew,if=solo&(!settings.max_damage|buff.blackout_combo.down)&settings.purify_stagger_maxhp>0&stagger.pct>=settings.purify_stagger_maxhp*0.5
19 | actions+=/purifying_brew,if=group&(!settings.max_damage|buff.blackout_combo.down)&settings.purify_stagger_currhp=0&settings.purify_stagger_maxhp=0&stagger.pct>20
20 | actions+=/purifying_brew,if=solo&(!settings.max_damage|buff.blackout_combo.down)&settings.purify_stagger_currhp=0&settings.purify_stagger_maxhp=0&stagger.pct>10
21 | actions+=/dampen_harm,if=health.pct<75&incoming_damage_3s>health.max*(0.2+(0.2*group))&buff.fortifying_brew.down
22 | actions+=/fortifying_brew,if=health.pct<50&incoming_damage_3s>health.max*(0.2+(0.2*group))&(buff.dampen_harm.down)
23 | actions+=/touch_of_death
24 | actions+=/expel_harm,if=buff.gift_of_the_ox.stack>4&health.pct0.3*health.max&buff.weapons_of_order.up&!dot.aspect_of_harmony_damage.ticking
44 | actions+=/celestial_brew,if=(!settings.max_damage|buff.blackout_combo.down)&buff.aspect_of_harmony_accumulator.value>0.3*health.max&!talent.weapons_of_order.enabled&!dot.aspect_of_harmony_damage.ticking
45 | actions+=/celestial_brew,if=(!settings.max_damage|buff.blackout_combo.down)&fight_remains<20&fight_remains>14&buff.aspect_of_harmony_accumulator.value>0.2*health.max
46 | actions+=/celestial_brew,if=(!settings.max_damage|buff.blackout_combo.down)&buff.aspect_of_harmony_accumulator.value>0.3*health.max&cooldown.weapons_of_order.remains>20&!dot.aspect_of_harmony_damage.ticking
47 | actions+=/celestial_brew,if=(!settings.max_damage|buff.blackout_combo.down)&(cooldown.celestial_brew.charges_fractional>1.8|(cooldown.celestial_brew.charges_fractional>1.2&cooldown.black_ox_brew.up))
48 | actions+=/blackout_kick
49 | actions+=/chi_burst,if=!talent.aspect_of_harmony.enabled|buff.balanced_stratagem_magic.stack>3
50 | actions+=/weapons_of_order
51 | actions+=/invoke_niuzao,if=!talent.call_to_arms.enabled
52 | actions+=/invoke_niuzao,if=talent.call_to_arms.enabled&buff.call_to_arms_invoke_niuzao.down&buff.weapons_of_order.remains<16
53 | actions+=/rising_sun_kick,if=!talent.fluidity_of_motion.enabled
54 | actions+=/keg_smash,if=buff.weapons_of_order.up&(debuff.weapons_of_order_debuff.remains<1.8|debuff.weapons_of_order_debuff.stack<3-buff.blackout_combo.up|(buff.weapons_of_order.remains<3-buff.blackout_combo.up&buff.weapons_of_order.remains<1+cooldown.rising_sun_kick.remains))
55 | actions+=/tiger_palm,if=buff.blackout_combo.up
56 | actions+=/keg_smash,if=talent.scalding_brew.enabled
57 | actions+=/spinning_crane_kick,if=talent.charred_passions.enabled&talent.scalding_brew.enabled&buff.charred_passions.up&buff.charred_passions.remains<3&dot.breath_of_fire.remains<9&active_enemies>4
58 | actions+=/rising_sun_kick,if=talent.fluidity_of_motion.enabled
59 | actions+=/purifying_brew,if=buff.blackout_combo.down&!(talent.call_to_arms.enabled|talent.invoke_niuzao_the_black_ox.enabled)
60 | actions+=/purifying_brew,if=buff.blackout_combo.down&(talent.call_to_arms.enabled|talent.invoke_niuzao_the_black_ox.enabled)&(buff.invoke_niuzao_the_black_ox.up|buff.call_to_arms_invoke_niuzao.up)
61 | actions+=/purifying_brew,if=buff.blackout_combo.down&(talent.call_to_arms.enabled|talent.invoke_niuzao_the_black_ox.enabled)&cooldown.weapons_of_order.remains>10&cooldown.invoke_niuzao_the_black_ox.remains>10
62 | actions+=/breath_of_fire,if=(buff.charred_passions.down&(!talent.scalding_brew.enabled|active_enemies<5))|!talent.charred_passions.enabled|(dot.breath_of_fire.remains<3&talent.scalding_brew.enabled)
63 | actions+=/exploding_keg,if=!talent.rushing_jade_wind.enabled|buff.rushing_jade_wind.up
64 | actions+=/rushing_jade_wind,if=talent.aspect_of_harmony.enabled&((buff.rushing_jade_wind.remains<2.5&buff.rushing_jade_wind.up)|!buff.rushing_jade_wind.up)
65 | actions+=/keg_smash
66 | actions+=/rushing_jade_wind,if=!talent.aspect_of_harmony.enabled&((buff.rushing_jade_wind.remains<2.5&buff.rushing_jade_wind.up)|!buff.rushing_jade_wind.up)
67 | actions+=/tiger_palm,if=energy>40-cooldown.keg_smash.remains*energy.regen
68 | actions+=/spinning_crane_kick,if=energy>40-cooldown.keg_smash.remains*energy.regen
69 |
--------------------------------------------------------------------------------
/.github/ISSUE_TEMPLATE/Recommendation-Report.yml:
--------------------------------------------------------------------------------
1 | name: Priority/Recommendation Issue
2 | description: The addon appears fully functional, but its recommendations are incomplete or don't match my expectations.
3 | title: "[REC] Provide a short, descriptive title of you Recommendation issue"
4 | labels: [recommendation, triage]
5 | assignees:
6 | - Hekili
7 | body:
8 | - type: checkboxes
9 | id: precheck
10 | attributes:
11 | label: Before You Begin
12 | description: Please confirm that you've taken these preliminary steps before submitting your issue report.
13 | options:
14 | - label: I confirm that I have downloaded the latest version of the addon.
15 | required: true
16 | - label: I am not playing on a private server.
17 | required: true
18 | - label: I checked for an [existing, open ticket](https://github.com/Hekili/hekili/labels/recommendation) for this issue and was not able to find one.
19 | required: true
20 | - label: I edited the title of this issue (above) so that it describes the issue I am reporting.
21 | required: true
22 | - label: I am reporting an issue with the default priority included with the specialization (imported or edited priorities are not supported).
23 | required: true
24 | - type: dropdown
25 | id: spec
26 | attributes:
27 | label: Spec
28 | description: Which spec
29 | options:
30 | - DK - Blood
31 | - DK - Frost
32 | - DK - Unholy
33 | - DH - Havoc
34 | - DH - Vengeance
35 | - Druid - Balance
36 | - Druid - Feral
37 | - Druid - Guardian
38 | - Druid - Restoration
39 | - Evoker - Augmentation
40 | - Evoker - Devastation
41 | - Evoker - Preservation
42 | - Hunter - Beast Mastery
43 | - Hunter - Marksmanship
44 | - Hunter - Survival
45 | - Mage - Arcane
46 | - Mage - Fire
47 | - Mage - Frost
48 | - Monk - Brewmaster
49 | - Monk - Windwalker
50 | - Paladin - Holy
51 | - Paladin - Protection
52 | - Paladin - Retribution
53 | - Priest - Discipline
54 | - Priest - Holy
55 | - Priest - Shadow
56 | - Rogue - Assassination
57 | - Rogue - Outlaw
58 | - Rogue - subtlety
59 | - Shaman - Elemental
60 | - Shaman - Enhancement
61 | - Shaman - Restoration
62 | - Warlock - Affliction
63 | - Warlock - Demonology
64 | - Warlock - Destruction
65 | - Warrior - Arms
66 | - Warrior - Fury
67 | - Warrior - Protection
68 | default: 0
69 | validations:
70 | required: true
71 | - type: textarea
72 | id: description
73 | attributes:
74 | label: Describe the Issue
75 | description: Please describe the issue in question. Be specific and describe what you see. You can CTRL+V to paste a screenshot (image) or supply links to screenshot images.
76 | placeholder: "Example: For my Retribution Paladin, I expect the addon to recommend a Holy Power spender when I have 5 Holy Power. However, the addon recommended Crusader Strike instead."
77 | validations:
78 | required: true
79 | - type: textarea
80 | id: reproduction
81 | attributes:
82 | label: How to Reproduce
83 | description: Tell me what I need to do to see the issue you are reporting.
84 | placeholder: |
85 | 1. Enter game as a Retribution Paladin.
86 | 2. Take the Seraphim, Final Reckoning, and Execution Sentence talents.
87 | 3. Use Final Reckoning.
88 | 4. Build to 5 Holy Power.
89 | 5. See recommendations.
90 | validations:
91 | required: true
92 | - type: input
93 | id: player-info
94 | attributes:
95 | label: Snapshot (Link)
96 | description: |
97 | Please supply a Snapshot of the addon's decision-making when you are seeing this issue in-game. **This is not a screenshot.** To generate a Snapshot, please complete the following steps.
98 | * Log into your WoW character.
99 | * Recreate the issue you are reporting (i.e., generate 5 Holy Power).
100 | * When you see the recommendation you disagree with, press `ALT-SHIFT-P` to Pause and Snapshot (or use `ALT-SHIFT-[` to Snapshot without pausing).
101 | * You can change these keybindings in `/hekili` > Toggles if needed.
102 | * Type `/hekili` and press Enter.
103 | * Open the Snapshots section on the left side.
104 | * Select the display which is showing the recommendation (usually Primary).
105 | * Select the snapshot number (usually 1, if you took only 1 snapshot).
106 | * Copy all of the text in the lower box.
107 | * Paste the text to Pastebin (https://pastebin.com).
108 | * Provide the Pastebin link here.
109 |
110 | This step is essential, as most issues are related to specific classes, specializations, gear, talent choices, or other game systems.
111 | If you do not provide this information, I cannot triage your problem.
112 | placeholder: http://pastebin.com/AbCdEfGh
113 | validations:
114 | required: true
115 | - type: input
116 | id: sim-result
117 | attributes:
118 | label: Raidbots Sim Report (Link)
119 | description: |
120 | The addon's recommendations are based on the SimulationCraft profiles generated for each specialization. It is very helpful, for testing purposes, to compare the addon's recommendations to your sim's actions. [Raidbots](https://www.raidbots.com/) is the fastest, easiest way to simulate your character.
121 | * If the issue happens in single-target, link to your Patchwerk sim with 1 boss target.
122 | * If the issue happens in sustained multi-target, link to your Patchwerk sim with the appropriate number of boss targets.
123 | * If the issue happens in more chaotic scenarios, link to your Hectic Add Cleave sim with 1 boss target.
124 | * You're welcome to link multiple sims using the **Additional Information** box, below.
125 | placeholder: https://www.raidbots.com/simbot/report/abcdEFghIjKlMNOPqrst
126 | - type: textarea
127 | id: addl-info
128 | attributes:
129 | label: Additional Information
130 | description: Please provide any additional information regarding this issue that was not included above.
131 | placeholder: Leave blank, if all necessary details are included above.
132 | - type: input
133 | id: contact
134 | attributes:
135 | label: Contact Information
136 | description: |
137 | I will contact you via this GitHub ticket with questions and updates.
138 | If you do not regularly check your GitHub email, please provide an alternate contact method (i.e., Discord ID) so that I can reach you if needed.
139 | placeholder: Hekili#0001
140 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/PriestHoly.simc:
--------------------------------------------------------------------------------
1 | actions.precombat+=/power_word_fortitude
2 |
3 | actions+=/call_action_list,name=cooldowns
4 | # Always use HF if we have empyreal blaze (dot extension) or harmonious apparatus (cd reduction) or if it's not currently ticking. Otherwise, only use when refreshable to be sure we get the longest duration possible. It's worth it to cast even when the target will die soon based on just the initial hit damage. We also don't want to cast immediately once empyreal blaze is up when we are prepping divine word
5 | actions+=/holy_fire,cycle_targets=1,if=(talent.empyreal_blaze|talent.harmonious_apparatus|!ticking|refreshable)&!(buff.empyreal_blaze.up&(cooldown.divine_word.up|buff.divine_word.up)&cooldown.holy_word_chastise.up)
6 | # Don't cast SW:P during apotheosis or divine favor: chastise. We also don't cycle targets because it isn't worth the GCDs, since Smite deals slightly more damage than a full SW:P.
7 | actions+=/shadow_word_pain,if=(refreshable|!ticking)&(target.time_to_die>=dot.shadow_word_pain.duration)&!buff.divine_favor_chastise.up&!buff.apotheosis.up
8 | # Prepare to enter divine favor: chastise
9 | actions+=/call_action_list,name=divine_favor_chastise_prep,if=talent.divine_word&talent.holy_word_chastise&buff.divine_favor_chastise.down
10 | # Enter Divine Favor rotation with divine favor: chastise buff up
11 | actions+=/run_action_list,name=divine_favor_chastise_active,strict=1,if=buff.divine_favor_chastise.up
12 | # Run divine favor fillers rotation with buff down
13 | actions+=/run_action_list,name=divine_favor_filler,if=talent.divine_word&talent.holy_word_chastise&buff.divine_favor_chastise.down
14 | # Run divine image rotation with divine image talented
15 | actions+=/run_action_list,name=divine_image,strict=1,if=talent.divine_image
16 | # Otherwise generic rotation
17 | actions+=/run_action_list,name=generic
18 |
19 | actions.divine_favor_chastise_prep+=/variable,name=empyreal_exec_time,op=set,value=0
20 | # apotheosis_exec_time: Store how long Apotheosis will take to execute
21 | actions.divine_favor_chastise_prep+=/variable,name=apotheosis_exec_time,op=setif,condition=talent.apotheosis,value=action.apotheosis.execute_time,value_else=0
22 | # Use apotheosis to get Chastise back if its on cooldown and Divine Word will be up soon. We can use Apotheosis (2min CD) to reset Chastise for every other Divine Word (1min CD).
23 | actions.divine_favor_chastise_prep+=/apotheosis,if=(cooldown.holy_word_chastise.remains>cooldown.divine_word.remains)&(cooldown.divine_word.remains<=(variable.empyreal_exec_time+variable.apotheosis_exec_time))
24 | # Divine Word only if we can sync with Chastise and (if talented) Empyreal Blaze
25 | actions.divine_favor_chastise_prep+=/divine_word,if=cooldown.holy_word_chastise.up&(!talent.empyreal_blaze|buff.empyreal_blaze.up)
26 | # Holy word chastise to trigger divine favor: chastise
27 | actions.divine_favor_chastise_prep+=/holy_word_chastise,if=!talent.empyreal_blaze&buff.divine_word.up|talent.empyreal_blaze&buff.empyreal_blaze.down
28 |
29 | actions.divine_favor_chastise_active+=/halo,if=spell_targets.halo>=2
30 | actions.divine_favor_chastise_active+=/divine_star,if=spell_targets.divine_star>=2
31 | # There are particular breakpoints combinations of rhapsody and spell targets beyond which holy nova beats everything else we can do
32 | actions.divine_favor_chastise_active+=/holy_nova,if=(spell_targets.holy_nova>=2&buff.rhapsody.stack>=18)|(spell_targets.holy_nova>=3&buff.rhapsody.stack>=9)|(spell_targets.holy_nova>=4&buff.rhapsody.stack>=4)|spell_targets.holy_nova>=5
33 | actions.divine_favor_chastise_active+=/mindgames
34 | actions.divine_favor_chastise_active+=/shadow_word_death,if=target.health.pct<20
35 | actions.divine_favor_chastise_active+=/holy_word_chastise
36 | # We want to cycle smite to different targets to spread holy fire dots in AOE situations, this will buff holy nova's damage
37 | actions.divine_favor_chastise_active+=/smite,cycle_targets=1,if=spell_targets.holy_nova>=2
38 | actions.divine_favor_chastise_active+=/smite
39 |
40 | actions.divine_favor_filler+=/halo,if=spell_targets.halo>=2
41 | actions.divine_favor_filler+=/divine_star,if=spell_targets.divine_star>=2
42 | # There are particular breakpoints combinations of rhapsody and spell targets beyond which holy nova beats everything else we can do
43 | actions.divine_favor_filler+=/holy_nova,if=(spell_targets.holy_nova>=2&buff.rhapsody.stack>=18)|(spell_targets.holy_nova>=3&buff.rhapsody.stack>=9)|(spell_targets.holy_nova>=4&buff.rhapsody.stack>=4)|spell_targets.holy_nova>=5
44 | actions.divine_favor_filler+=/mindgames
45 | actions.divine_favor_filler+=/shadow_word_death,if=target.health.pct<20
46 | # We can use chastise for damage as long as we will have apotheosis available before the next divine word, otherwise only use it when it will be back up at the same time as divine word
47 | actions.divine_favor_filler+=/holy_word_chastise,if=(cooldown.apotheosis.remains=2
56 | actions.divine_image+=/divine_star,if=spell_targets.divine_star>=2
57 | # There are particular breakpoints combinations of rhapsody and spell targets beyond which holy nova beats everything else we can do
58 | actions.divine_image+=/holy_nova,if=(spell_targets.holy_nova>=2&buff.rhapsody.stack>=18)|(spell_targets.holy_nova>=3&buff.rhapsody.stack>=9)|(spell_targets.holy_nova>=4&buff.rhapsody.stack>=4)|spell_targets.holy_nova>=5
59 | actions.divine_image+=/mindgames
60 | actions.divine_image+=/shadow_word_death,if=target.health.pct<20
61 | actions.divine_image+=/smite
62 |
63 | actions.generic+=/holy_word_chastise
64 | # Hold Apotheosis if chastise will be up soon
65 | actions.generic+=/apotheosis,if=cooldown.holy_word_chastise.remains>(gcd.max*3)
66 | actions.generic+=/halo,if=spell_targets.halo>=2
67 | actions.generic+=/divine_star,if=spell_targets.divine_star>=2
68 | # There are particular breakpoints combinations of rhapsody and spell targets beyond which holy nova beats everything else we can do
69 | actions.generic+=/holy_nova,if=(spell_targets.holy_nova>=2&buff.rhapsody.stack>=18)|(spell_targets.holy_nova>=3&buff.rhapsody.stack>=9)|(spell_targets.holy_nova>=4&buff.rhapsody.stack>=4)|spell_targets.holy_nova>=5
70 | actions.generic+=/mindgames
71 | actions.generic+=/shadow_word_death,if=target.health.pct<20
72 | actions.generic+=/smite
73 |
74 | actions.cooldowns+=/shadowfiend
75 | # Sync PI with divine favor: chastise if we took divine word
76 | actions.cooldowns+=/power_infusion,if=(!talent.divine_word|(cooldown.divine_word.up&cooldown.holy_word_chastise.up))
77 | # Only potion in sync with power infusion
78 | actions.cooldowns+=/potion,if=buff.power_infusion.up
79 | # hold trinkets to use with PI
80 | actions.cooldowns+=/use_items,if=buff.power_infusion.up
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/DruidGuardian.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/druid_guardian.simc
2 | ## SimulationCraft Commit Sync: e9cc3d7
3 | ## Date: 2025-08-27
4 |
5 | actions.precombat+=/mark_of_the_wild
6 | actions.precombat+=/variable,name=if_build,value=1,value_else=0,if=talent.thorns_of_iron.enabled&talent.ursocs_endurance.enabled
7 | ## actions.precombat+=/heart_of_the_wild,if=talent.heart_of_the_wild.enabled&!talent.rip.enabled
8 | actions.precombat+=/bear_form,if=time=0|!talent.fluid_form.enabled
9 | ## [Hekili] Disabled these because it'll just get tanks to die.
10 | ## actions.precombat+=/cat_form,if=talent.rip.enabled
11 | ## actions.precombat+=/prowl,if=talent.rip.enabled
12 | ## actions.precombat+=/bear_form,if=!talent.rip.enabled
13 |
14 | actions+=/skull_bash
15 | actions+=/soothe
16 | actions+=/rake,if=buff.prowl.up
17 | actions+=/use_item,name=bestinslots,if=buff.incarnation_guardian_of_ursoc.up|buff.berserk_bear.up
18 | actions+=/use_item,name=tome_of_lights_devotion,if=buff.inner_resilience.up
19 | actions+=/use_item,slot=trinket1
20 | actions+=/use_item,slot=trinket2
21 | actions+=/potion,if=(buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up)
22 | actions+=/call_action_list,name=mitigation
23 | ## [Hekili] Disabled until/unless I strategize for off-tank DPS.
24 | ## actions+=/prowl,if=!tanking&talent.rip.enabled
25 | actions+=/run_action_list,name=bear
26 |
27 | actions.bear+=/maul,if=buff.ravage.up&active_enemies>1
28 | ## actions.bear+=/heart_of_the_wild,if=(talent.heart_of_the_wild.enabled&!talent.rip.enabled)|talent.heart_of_the_wild.enabled&buff.feline_potential_counter.stack=6&active_enemies<3
29 | actions.bear+=/thrash_bear,if=refreshable|(dot.thrash_bear.stack<5&talent.flashing_claws.rank=2|dot.thrash_bear.stack<4&talent.flashing_claws.rank=1|dot.thrash_bear.stack<3&!talent.flashing_claws.enabled)
30 | actions.bear+=/bristling_fur,if=tanking&cooldown.rage_of_the_sleeper.remains>8
31 | actions.bear+=/barkskin,if=buff.bear_form.up
32 | actions.bear+=/lunar_beam
33 | actions.bear+=/convoke_the_spirits,if=(talent.wildpower_surge.enabled&buff.cat_form.up&buff.feline_potential.up)|!talent.wildpower_surge.enabled
34 | actions.bear+=/berserk_bear
35 | actions.bear+=/incarnation
36 | actions.bear+=/rage_of_the_sleeper,if=(((buff.incarnation_guardian_of_ursoc.down&cooldown.incarnation_guardian_of_ursoc.remains>60)|buff.berserk_bear.down)&rage>40&(!talent.convoke_the_spirits.enabled)|(buff.incarnation_guardian_of_ursoc.up|buff.berserk_bear.up)&rage>40&(!talent.convoke_the_spirits.enabled)|(talent.convoke_the_spirits.enabled)&rage>40)
37 | actions.bear+=/berserking,if=(buff.berserk_bear.up|buff.incarnation_guardian_of_ursoc.up)
38 | actions.bear+=/maul,if=buff.ravage.up&active_enemies<2
39 | actions.bear+=/raze,if=(buff.tooth_and_claw.stack>1|buff.tooth_and_claw.up&buff.tooth_and_claw.remains<1+gcd|buff.vicious_cycle_maul.stack=3)
40 | actions.bear+=/thrash_bear,if=active_enemies>=5&talent.lunar_calling.enabled
41 | actions.bear+=/ironfur,cycle_targets=1,if=!debuff.tooth_and_claw.up&!buff.ironfur.up&rage>50&tanking&variable.if_build=0&!buff.rage_of_the_sleeper.up|rage>90&variable.if_build=0|!debuff.tooth_and_claw.up&!buff.ironfur.up&rage>50&tanking&variable.if_build=0&!buff.rage_of_the_sleeper.up
42 | actions.bear+=/ironfur,if=!buff.ravage.up&((rage>40&variable.if_build=1|rage>90&variable.if_build=1&!talent.fount_of_strength.enabled|rage>110&variable.if_build=1&talent.fount_of_strength.enabled|(buff.incarnation.up|buff.berserk_bear.up)&rage>20&variable.if_build=1&buff.rage_of_the_sleeper.up&talent.rage_of_the_sleeper.enabled))
43 | actions.bear+=/ironfur,if=!buff.ravage.up&(buff.incarnation.up|buff.berserk_bear.up)&rage>20&variable.if_build=1
44 | actions.bear+=/ferocious_bite,if=(buff.cat_form.up&buff.feline_potential.up&(buff.incarnation.up|buff.berserk_bear.up)&!dot.rip.refreshable)
45 | actions.bear+=/rip,if=(buff.cat_form.up&buff.feline_potential.up)
46 | actions.bear+=/mangle,if=buff.gore.up&active_enemies<11|buff.incarnation_guardian_of_ursoc.up&buff.feline_potential_counter.stack<6&talent.wildpower_surge.enabled
47 | actions.bear+=/shred,if=cooldown.rage_of_the_sleeper.remains<=52&buff.feline_potential_counter.stack=6&!buff.cat_form.up&!dot.rake.refreshable&talent.fluid_form.enabled
48 | actions.bear+=/rake,if=cooldown.rage_of_the_sleeper.remains<=52&buff.feline_potential_counter.stack=6&!buff.cat_form.up&talent.fluid_form.enabled
49 | actions.bear+=/mangle,if=buff.cat_form.up&talent.fluid_form.enabled
50 | actions.bear+=/maul,if=variable.if_build=1&(((buff.tooth_and_claw.stack>1|buff.tooth_and_claw.up&buff.tooth_and_claw.remains<1+gcd)&active_enemies<=5&!talent.raze.enabled)|((buff.tooth_and_claw.stack>1|buff.tooth_and_claw.up&buff.tooth_and_claw.remains<1+gcd)&active_enemies=1&talent.raze.enabled)|((buff.tooth_and_claw.stack>1|buff.tooth_and_claw.up&buff.tooth_and_claw.remains<1+gcd)&active_enemies<=5&!talent.raze.enabled))
51 | actions.bear+=/maul,if=variable.if_build=0&((buff.tooth_and_claw.up&active_enemies<=5&!talent.raze.enabled)|(buff.tooth_and_claw.up&active_enemies=1&talent.raze.enabled))
52 | actions.bear+=/maul,if=(active_enemies<=5&!talent.raze.enabled&variable.if_build=0)|(active_enemies=1&talent.raze.enabled&variable.if_build=0)|buff.vicious_cycle_maul.stack=3&active_enemies<=5&!talent.raze.enabled
53 | actions.bear+=/thrash_bear,if=active_enemies>=5
54 | actions.bear+=/mangle,if=(buff.incarnation.up&active_enemies<=4)|(buff.incarnation.up&talent.soul_of_the_forest.enabled&active_enemies<=5)|((rage<88)&active_enemies<11)|((rage<83)&active_enemies<11&talent.soul_of_the_forest.enabled)
55 | actions.bear+=/rip,if=buff.cat_form.up&(!dot.rip.ticking|refreshable)&combo_points>=3&active_enemies<3&!talent.empowered_shapeshifting.enabled
56 | actions.bear+=/ferocious_bite,if=buff.cat_form.up&dot.rip.ticking&combo_points>4&active_enemies<3&!talent.empowered_shapeshifting.enabled
57 | actions.bear+=/rake,if=talent.fluid_form.enabled&buff.bear_form.up&!buff.incarnation_guardian_of_ursoc.up&(refreshable|!dot.rake.ticking)&active_enemies<3&!talent.lunar_insight.enabled&energy>70&!talent.empowered_shapeshifting.enabled|buff.cat_form.up&active_enemies<3&!talent.lunar_insight.enabled&talent.fluid_form.enabled&energy>70&(refreshable|!dot.rake.ticking)&!talent.empowered_shapeshifting.enabled
58 | actions.bear+=/thrash_bear,if=active_enemies>1
59 | actions.bear+=/pulverize,cycle_targets=1
60 | actions.bear+=/thrash_bear
61 | actions.bear+=/rake,if=talent.fluid_form.enabled&buff.bear_form.up&!buff.incarnation_guardian_of_ursoc.up&(refreshable|!dot.rake.ticking)&active_enemies>3&!talent.lunar_insight.enabled&cooldown.mangle.remains70&!talent.empowered_shapeshifting.enabled|buff.cat_form.up&active_enemies<3&!talent.lunar_insight.enabled&talent.fluid_form.enabled&energy>70&!talent.empowered_shapeshifting.enabled
63 | actions.bear+=/moonfire,if=buff.galactic_guardian.up&buff.bear_form.up&talent.boundless_moonlight.enabled
64 | actions.bear+=/starsurge,if=talent.starsurge.enabled&rage<20
65 | actions.bear+=/swipe_bear,if=(talent.lunar_insight.enabled&active_enemies>4)|!talent.lunar_insight.enabled|talent.lunar_insight.enabled&active_enemies<2
66 | actions.bear+=/moonfire,if=(talent.lunar_insight.enabled&active_enemies>1)&buff.bear_form.up
67 | actions.bear+=/swipe_bear,if=(talent.lunar_insight.enabled&active_enemies>4)|!talent.lunar_insight.enabled
68 | actions.bear+=/moonfire,if=(talent.lunar_insight.enabled)&buff.bear_form.up
69 |
70 | actions.mitigation+=/ironfur,if=tanking&!variable.if_build&incoming_damage_5s>ironfur_damage_threshold&buff.ironfur.remains<3*haste&buff.ironfur.stack<5
71 | actions.mitigation+=/regrowth,if=health.pct<65
72 | actions.mitigation+=/renewal,if=health.pct<65
73 | actions.mitigation+=/frenzied_regeneration,if=tanking&health.pct<65
74 | actions.mitigation+=/barkskin,if=tanking&health.pct<75&incoming_damage_5s>0.1*health.max
75 | actions.mitigation+=/survival_instincts,if=buff.survival_instincts.down&buff.barkskin.down&health.pct<60&incoming_damage_5s>0.25*health.max
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/PaladinProtection.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/paladin_protection.simc
2 | ## https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/paladin_protection.simc
3 | ## Up to date with SimC: August 28 2025 - 5340e2f
4 |
5 | ## actions.precombat+=/rite_of_sanctification
6 | ## actions.precombat+=/rite_of_adjuration
7 | actions.precombat+=/devotion_aura
8 | actions.precombat+=/lights_judgment
9 | actions.precombat+=/arcane_torrent
10 | actions.precombat+=/consecration
11 | actions.precombat+=/variable,name=trinket_sync_slot,value=1,if=trinket.1.has_cooldown&trinket.1.has_stat.any_dps&(!trinket.2.has_stat.any_dps|trinket.1.cooldown.duration>=trinket.2.cooldown.duration)|!trinket.2.has_cooldown
12 | actions.precombat+=/variable,name=trinket_sync_slot,value=2,if=trinket.2.has_cooldown&trinket.2.has_stat.any_dps&(!trinket.1.has_stat.any_dps|trinket.2.cooldown.duration>trinket.1.cooldown.duration)|!trinket.1.has_cooldown
13 |
14 | actions+=/rebuke
15 | actions+=/call_action_list,name=mitigation
16 | actions+=/call_action_list,name=cooldowns
17 | actions+=/call_action_list,name=trinkets
18 | actions+=/call_action_list,name=standard
19 |
20 | actions.cooldowns+=/lights_judgment,if=spell_targets.lights_judgment>=2|!raid_event.adds.exists|raid_event.adds.in>75|raid_event.adds.up
21 | actions.cooldowns+=/avenging_wrath
22 | actions.cooldowns+=/potion,if=buff.avenging_wrath.up
23 | actions.cooldowns+=/moment_of_glory,if=(buff.avenging_wrath.remains<15|(time>10))
24 | actions.cooldowns+=/divine_toll,if=spell_targets.shield_of_the_righteous>=3
25 | actions.cooldowns+=/bastion_of_light,if=buff.avenging_wrath.up|cooldown.avenging_wrath.remains<=30
26 | ## actions.cooldowns+=/invoke_external_buff,name=power_infusion,if=buff.avenging_wrath.up
27 | actions.cooldowns+=/fireblood,if=buff.avenging_wrath.remains>8
28 |
29 | actions.mitigation+=/shield_of_the_righteous,if=tanking&buff.shield_of_the_righteous.down&(holy_power.deficit=0|buff.divine_purpose.up)
30 | # [Hekili] Recommend BoSP if the filter is enabled in spec options. Custom priorities can use BoSP with or without this feature.
31 | actions.mitigation+=/blessing_of_spellwarding,if=settings.bosp_filter
32 | actions.mitigation+=/word_of_glory,if=health.pctds_damage&!(buff.ardent_defender.up|buff.guardian_of_ancient_kings.up|buff.divine_shield.up|buff.potion.up)
34 | actions.mitigation+=/guardian_of_ancient_kings,if=tanking&incoming_damage_5s>goak_damage&!(buff.ardent_defender.up|buff.guardian_of_ancient_kings.up|buff.divine_shield.up|buff.potion.up)
35 | actions.mitigation+=/sentinel,if=defensive_sentinel&tanking&incoming_damage_5s>goak_damage&!(buff.ardent_defender.up|buff.guardian_of_ancient_kings.up|buff.divine_shield.up|buff.potion.up)
36 | actions.mitigation+=/ardent_defender,if=tanking&incoming_damage_5s>ad_damage&!(buff.ardent_defender.up|buff.guardian_of_ancient_kings.up|buff.divine_shield.up|buff.potion.up)
37 | actions.mitigation+=/lay_on_hands,if=health.pct=2|full_recharge_time<=gcd.max
40 | actions.standard+=/hammer_of_light,if=(buff.blessing_of_dawn.up|fight_remains<2)&(debuff.judgment.up|buff.hammer_of_light_ready.remains<2|buff.hammer_of_light_ready.stack>1|buff.hammer_of_light_free.up|(cooldown.eye_of_tyr.remains<3))
41 | actions.standard+=/eye_of_tyr,if=talent.lights_guidance.enabled
42 | actions.standard+=/shield_of_the_righteous,if=(!talent.righteous_protector.enabled|cooldown.righteous_protector_icd.remains=0)&!buff.hammer_of_light_ready.up
43 | # during luck of the draw(TWW2 4P)spam sotr as much as possible without wasting icd where possible
44 | actions.standard+=/shield_of_the_righteous,if=!buff.hammer_of_light_ready.up&(buff.luck_of_the_draw.up&((holy_power+judgment_holy_power>=5)|(!talent.righteous_protector.enabled|cooldown.righteous_protector_icd.remains=0)))
45 | # outside of luck of the draw, pool holy power as much as possible to be able to enter luck of the draw windows with more holy power
46 | actions.standard+=/shield_of_the_righteous,if=set_bonus.thewarwithin_season_2_4pc&!buff.hammer_of_light_ready.up&((holy_power+judgment_holy_power>5)|(holy_power+judgment_holy_power>=5&cooldown.righteous_protector_icd.remains=0))
47 | actions.standard+=/shield_of_the_righteous,if=!set_bonus.thewarwithin_season_2_4pc&(!talent.righteous_protector.enabled|cooldown.righteous_protector_icd.remains=0)&!buff.hammer_of_light_ready.up
48 | actions.standard+=/shield_of_the_righteous,if=holy_power=5&(!buff.blessing_of_dawn.up|!talent.lights_guidance.enabled)
49 | actions.standard+=/judgment,target_if=min:debuff.judgment.remains,if=spell_targets.shield_of_the_righteous>3&buff.bulwark_of_righteous_fury.stack>=3&holy_power<3
50 | # Lightsmith wants to not waste any masterwork stacks on holy bulwark, if it overflows its 50/50 it spawns a lesser weapon, rather than 0% chance
51 | actions.standard+=/holy_armaments,if=next_armament=holy_bulwark&set_bonus.thewarwithin_season_3_4pc
52 | # Lightsmith with 4pc spams blessed hammer if it can, trying to trigger the 2pc effect as much as possible
53 | actions.standard+=/blessed_hammer,if=set_bonus.thewarwithin_season_3_4pc&talent.hammer_and_anvil.enabled
54 | actions.standard+=/avengers_shield,if=!buff.bulwark_of_righteous_fury.up&talent.bulwark_of_righteous_fury.enabled&spell_targets.shield_of_the_righteous>=3
55 | actions.standard+=/hammer_of_the_righteous,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3&!buff.avenging_wrath.up
56 | actions.standard+=/blessed_hammer,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3
57 | actions.standard+=/crusader_strike,if=buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<2&!buff.avenging_wrath.up
58 | actions.standard+=/consecration,if=buff.divine_guidance.stack=5
59 | actions.standard+=/holy_armaments,if=next_armament=sacred_weapon&((!buff.sacred_weapon.up|(buff.sacred_weapon.remains<6&!buff.avenging_wrath.up&cooldown.avenging_wrath.remains<=30))&(!set_bonus.thewarwithin_season_3_4pc|buff.masterwork.stack=5))
60 | actions.standard+=/hammer_of_wrath
61 | actions.standard+=/divine_toll
62 | actions.standard+=/judgment,cycle_targets=1,if=buff.avenging_wrath.up&talent.hammer_and_anvil.enabled
63 | actions.standard+=/holy_armaments,if=next_armament=holy_bulwark&charges=2
64 | actions.standard+=/judgment,cycle_targets=1
65 | actions.standard+=/hammer_of_the_righteous,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3)|buff.shake_the_heavens.up
66 | actions.standard+=/blessed_hammer,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<3)|buff.shake_the_heavens.up
67 | actions.standard+=/crusader_strike,if=(buff.blessed_assurance.up&spell_targets.shield_of_the_righteous<2)|buff.shake_the_heavens.up
68 | actions.standard+=/avengers_shield,if=!talent.lights_guidance.enabled
69 | actions.standard+=/consecration,if=!consecration.up
70 | actions.standard+=/eye_of_tyr,if=(talent.inmost_light.enabled&raid_event.adds.in>=45|spell_targets.shield_of_the_righteous>=3)&!talent.lights_deliverance.enabled
71 | actions.standard+=/holy_armaments,if=next_armament=holy_bulwark
72 | actions.standard+=/blessed_hammer
73 | actions.standard+=/hammer_of_the_righteous
74 | actions.standard+=/crusader_strike
75 | actions.standard+=/word_of_glory,if=buff.shining_light_free.up&(talent.blessed_assurance.enabled|(talent.lights_guidance.enabled&cooldown.hammerfall_icd.remains=0))
76 | actions.standard+=/eye_of_tyr,if=!talent.lights_deliverance.enabled
77 | actions.standard+=/word_of_glory,if=buff.shining_light_free.up
78 | actions.standard+=/arcane_torrent,if=holy_power<5
79 | actions.standard+=/avengers_shield
80 | actions.standard+=/consecration
81 |
82 | actions.trinkets+=/use_item,name=tome_of_lights_devotion,if=buff.inner_resilience.up
83 | actions.trinkets+=/use_item,name=unyielding_netherprism,if=buff.avenging_wrath.remains>15
84 | actions.trinkets+=/use_items,slots=trinket1,if=(variable.trinket_sync_slot=1&(buff.avenging_wrath.up|fight_remains<=40)|(variable.trinket_sync_slot=2&(!trinket.2.cooldown.ready|!buff.avenging_wrath.up))|!variable.trinket_sync_slot)
85 | actions.trinkets+=/use_items,slots=trinket2,if=(variable.trinket_sync_slot=2&(buff.avenging_wrath.up|fight_remains<=40)|(variable.trinket_sync_slot=1&(!trinket.1.cooldown.ready|!buff.avenging_wrath.up))|!variable.trinket_sync_slot)
86 |
--------------------------------------------------------------------------------
/Libs/SpellFlashCore/libs/BigLibTimer/BigLibTimer.lua:
--------------------------------------------------------------------------------
1 |
2 | local MajorVersion = "BigLibTimer6"
3 | local BigLibTimer = LibStub:NewLibrary(MajorVersion, tonumber("20230411150302") or tonumber(date("%Y%m%d%H%M%S")))
4 | if not BigLibTimer then return end
5 |
6 | BigLibTimer.API = BigLibTimer.API or {}
7 |
8 | function BigLibTimer:Register(handler)
9 | if type(handler) ~= "table" then
10 | handler = {}
11 | elseif handler[MajorVersion] then
12 | return
13 | end
14 | handler[MajorVersion] = {}
15 | handler[MajorVersion].RECYCLE_TABLES = setmetatable({}, {__mode = "k"})
16 | handler[MajorVersion].TimerFrame = CreateFrame("Frame")
17 | handler[MajorVersion].TimerFrame:Hide()
18 | handler[MajorVersion].TIMER = {}
19 | handler[MajorVersion].OnUpdate = function() BigLibTimer.OnUpdate(handler) end
20 | handler[MajorVersion].TimerFrame:SetScript("OnUpdate", handler[MajorVersion].OnUpdate)
21 | for key in pairs(BigLibTimer.API) do
22 | handler[key] = function(...) return BigLibTimer.API[key](...) end
23 | end
24 | return handler
25 | end
26 |
27 | function BigLibTimer.OnUpdate(handler)
28 | local TIMER = handler[MajorVersion].TIMER
29 | if next(TIMER) then
30 | if not handler[MajorVersion].Running then
31 | handler[MajorVersion].Running = 1
32 | for Name in pairs(TIMER) do
33 | if TIMER and TIMER[Name] and not TIMER[Name].Running and TIMER[Name].Seconds <= GetTime() then
34 | if TIMER[Name].Function then
35 | TIMER[Name].Function(unpack(TIMER[Name].Args))
36 | if TIMER and TIMER[Name] and TIMER[Name].Seconds <= GetTime() then
37 | if TIMER[Name].RepeatSeconds > 0 then
38 | TIMER[Name].Seconds = GetTime() + TIMER[Name].RepeatSeconds
39 | else
40 | TIMER[Name].Args = handler:RecycleTable(TIMER[Name].Args)
41 | TIMER[Name] = handler:RecycleTable(TIMER[Name])
42 | end
43 | end
44 | elseif TIMER[Name].RepeatSeconds > 0 then
45 | TIMER[Name].Seconds = GetTime() + TIMER[Name].RepeatSeconds
46 | else
47 | TIMER[Name].Args = handler:RecycleTable(TIMER[Name].Args)
48 | TIMER[Name] = handler:RecycleTable(TIMER[Name])
49 | end
50 | end
51 | end
52 | if not next(TIMER) then
53 | handler[MajorVersion].TimerFrame:Hide()
54 | end
55 | handler[MajorVersion].Running = nil
56 | end
57 | elseif not handler[MajorVersion].Running then
58 | handler[MajorVersion].TimerFrame:Hide()
59 | end
60 | end
61 |
62 | function BigLibTimer.API:SetTimer(Name, Seconds, RepeatSeconds, Function, ...)
63 | local TIMER = self[MajorVersion].TIMER
64 | if type(Name) == "string" and TIMER then
65 | if TIMER[Name] then
66 | TIMER[Name].Args = self:RecycleTable(TIMER[Name].Args)
67 | end
68 | TIMER[Name] = self:CreateTable(TIMER[Name])
69 | TIMER[Name].Running = 1
70 | if type(Seconds) == "number" and Seconds > 0 then
71 | TIMER[Name].Seconds = GetTime() + Seconds
72 | else
73 | TIMER[Name].Seconds = 0
74 | end
75 | if type(RepeatSeconds) == "number" and RepeatSeconds > 0 then
76 | TIMER[Name].RepeatSeconds = RepeatSeconds
77 | else
78 | TIMER[Name].RepeatSeconds = 0
79 | end
80 | if type(Function) == "function" then
81 | TIMER[Name].Function = Function
82 | TIMER[Name].Args = self:CreateTable(TIMER[Name].Args)
83 | local n = select("#", ...)
84 | if n > 0 then
85 | for i = 1, n do
86 | TIMER[Name].Args[i] = select(i, ...)
87 | end
88 | end
89 | end
90 | if TIMER[Name].Seconds == 0 and TIMER[Name].Function then
91 | Function(...)
92 | if TIMER and TIMER[Name] and TIMER[Name].Seconds <= GetTime() then
93 | if TIMER[Name].RepeatSeconds > 0 then
94 | TIMER[Name].Seconds = GetTime() + TIMER[Name].RepeatSeconds
95 | else
96 | TIMER[Name].Args = self:RecycleTable(TIMER[Name].Args)
97 | TIMER[Name] = self:RecycleTable(TIMER[Name])
98 | end
99 | end
100 | end
101 | if TIMER and TIMER[Name] then
102 | TIMER[Name].Running = nil
103 | self[MajorVersion].TimerFrame:Show()
104 | end
105 | end
106 | end
107 |
108 | function BigLibTimer.API:ReplaceTimer(Name, Seconds, RepeatSeconds, Function, ...)
109 | local TIMER = self[MajorVersion].TIMER
110 | if type(Name) == "string" and TIMER[Name] then
111 | if type(Seconds) == "number" and Seconds > 0 then
112 | TIMER[Name].Seconds = GetTime() + Seconds
113 | elseif Seconds ~= nil then
114 | TIMER[Name].Seconds = 0
115 | end
116 | if type(RepeatSeconds) == "number" and RepeatSeconds > 0 then
117 | TIMER[Name].RepeatSeconds = RepeatSeconds
118 | elseif RepeatSeconds ~= nil then
119 | TIMER[Name].RepeatSeconds = 0
120 | end
121 | if type(Function) == "function" then
122 | TIMER[Name].Function = Function
123 | TIMER[Name].Args = self:CreateTable(TIMER[Name].Args)
124 | local n = select("#", ...)
125 | if n > 0 then
126 | for i = 1, n do
127 | TIMER[Name].Args[i] = select(i, ...)
128 | end
129 | end
130 | elseif Function ~= nil then
131 | TIMER[Name].Function = nil
132 | end
133 | return true
134 | end
135 | return false
136 | end
137 |
138 | function BigLibTimer.API:ClearTimer(Name, Search)
139 | local TIMER = self[MajorVersion].TIMER
140 | local found = nil
141 | if type(Name) == "string" then
142 | if Search then
143 | for key in pairs(TIMER) do
144 | if key:match(Name) and ( TIMER[key].RepeatSeconds > 0 or TIMER[key].Seconds - GetTime() > 0 ) then
145 | TIMER[key].Args = self:RecycleTable(TIMER[key].Args)
146 | TIMER[key] = self:RecycleTable(TIMER[key])
147 | found = true
148 | end
149 | end
150 | elseif TIMER[Name] and ( TIMER[Name].RepeatSeconds > 0 or TIMER[Name].Seconds - GetTime() > 0 ) then
151 | TIMER[Name].Args = self:RecycleTable(TIMER[Name].Args)
152 | TIMER[Name] = self:RecycleTable(TIMER[Name])
153 | return true
154 | end
155 | end
156 | return found
157 | end
158 |
159 | function BigLibTimer.API:ClearAllTimers()
160 | wipe(self[MajorVersion].TIMER)
161 | end
162 |
163 | function BigLibTimer.API:IsTimer(Name, Search)
164 | local TIMER = self[MajorVersion].TIMER
165 | if type(Name) == "string" then
166 | if Search then
167 | for key in pairs(TIMER) do
168 | if key:match(Name) and ( TIMER[key].RepeatSeconds > 0 or TIMER[key].Seconds - GetTime() > 0 ) then
169 | return true
170 | end
171 | end
172 | elseif TIMER[Name] and ( TIMER[Name].RepeatSeconds > 0 or TIMER[Name].Seconds - GetTime() > 0 ) then
173 | return true
174 | end
175 | end
176 | return false
177 | end
178 |
179 | function BigLibTimer.API:IsRepeatTimer(Name, Search)
180 | local TIMER = self[MajorVersion].TIMER
181 | if type(Name) == "string" then
182 | if Search then
183 | for key in pairs(TIMER) do
184 | if key:match(Name) and TIMER[key].RepeatSeconds > 0 then
185 | return true
186 | end
187 | end
188 | elseif TIMER[Name] and TIMER[Name].RepeatSeconds > 0 then
189 | return true
190 | end
191 | end
192 | return false
193 | end
194 |
195 | function BigLibTimer.API:GetTimer(Name)
196 | local TIMER = self[MajorVersion].TIMER
197 | if type(Name) == "string" and TIMER[Name] then
198 | local TimeRemaining = TIMER[Name].Seconds - GetTime()
199 | if TimeRemaining > 0 then
200 | return TimeRemaining
201 | end
202 | end
203 | return 0
204 | end
205 |
206 | function BigLibTimer.API:CreateTable(Table, All)
207 | if type(Table) == "table" and type(Table[0]) ~= "userdata" then
208 | if All then
209 | self:RecycleTable(Table, All)
210 | else
211 | wipe(Table)
212 | return Table
213 | end
214 | end
215 | local t = next(self[MajorVersion].RECYCLE_TABLES)
216 | if t then
217 | self[MajorVersion].RECYCLE_TABLES[t] = nil
218 | if next(t) then
219 | return self:CreateTable()
220 | end
221 | return t
222 | end
223 | return {}
224 | end
225 |
226 | function BigLibTimer.RecycleAllTables(self, Table, CompareList)
227 | if not CompareList[Table] then
228 | CompareList[Table] = 1
229 | for k, v in pairs(Table) do
230 | if type(v) == "table" and type(v[0]) ~= "userdata" then
231 | BigLibTimer.RecycleAllTables(self, v, CompareList)
232 | end
233 | if type(k) == "table" and type(k[0]) ~= "userdata" then
234 | BigLibTimer.RecycleAllTables(self, k, CompareList)
235 | end
236 | end
237 | self:RecycleTable(Table)
238 | end
239 | end
240 |
241 | function BigLibTimer.API:RecycleTable(Table, All)
242 | if type(Table) == "table" and type(Table[0]) ~= "userdata" then
243 | if All then
244 | local CompareList = self:CreateTable()
245 | BigLibTimer.RecycleAllTables(self, Table, CompareList)
246 | self:RecycleTable(CompareList)
247 | else
248 | wipe(Table)
249 | self[MajorVersion].RECYCLE_TABLES[Table] = 1
250 | end
251 | end
252 | return nil
253 | end
254 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/RogueSubtlety.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/rogue_subtlety.simc
2 | ## SimulationCraft Commit Sync: 51e69ad
3 | ## Date: 2025-09-06
4 |
5 | actions.precombat+=/apply_poison
6 | # Swap to priority rotation if the variable is enabled
7 | actions.precombat+=/variable,name=priority_rotation,value=toggle.funnel
8 | actions.precombat+=/variable,name=trinket_sync_slot,value=1,if=trinket.1.has_use_buff&(!trinket.2.has_use_buff|trinket.1.is.treacherous_transmitter|trinket.1.cooldown.duration>=trinket.2.cooldown.duration)
9 | actions.precombat+=/variable,name=trinket_sync_slot,value=2,if=trinket.2.has_use_buff&(!trinket.1.has_use_buff|trinket.2.cooldown.duration>trinket.1.cooldown.duration)
10 | actions.precombat+=/stealth
11 |
12 | actions+=/stealth
13 | actions+=/kick
14 | actions+=/variable,name=stealth,value=buff.shadow_dance.up|buff.stealth.up|buff.vanish.up
15 | ## [Syrif] -Replaced below variable with active_enemies
16 | ## actions+=/variable,name=targets,value=spell_targets.shuriken_storm
17 | actions+=/variable,name=skip_rupture,value=buff.shadow_dance.up|buff.darkest_night.up|active_enemies>=4&(!talent.replicating_shadows&talent.unseen_blade|raid_event.adds.up)
18 | actions+=/variable,name=maintenance,value=(dot.rupture.ticking|variable.skip_rupture)&(buff.slice_and_dice.up|active_enemies<=2)
19 | actions+=/variable,name=secret,value=buff.shadow_dance.up&!buff.darkest_night.up|(cooldown.flagellation.remains<60&cooldown.flagellation.remains>30&talent.death_perception&talent.unseen_blade)
20 | actions+=/variable,name=racial_sync,value=(buff.shadow_blades.up&buff.shadow_dance.up)|!talent.shadow_blades&buff.symbols_of_death.up|boss&fight_remains<20
21 | actions+=/variable,name=shd_cp,value=combo_points<=1|buff.darkest_night.up&combo_points>=7|effective_combo_points>=6&talent.unseen_blade
22 | # Cooldowns
23 | actions+=/call_action_list,name=cds
24 | # Racials
25 | actions+=/blood_fury,if=variable.racial_sync
26 | actions+=/berserking,if=variable.racial_sync
27 | actions+=/fireblood,if=variable.racial_sync&buff.shadow_dance.up
28 | actions+=/ancestral_call,if=variable.racial_sync
29 | ## actions+=/invoke_external_buff,name=power_infusion,if=buff.shadow_dance.up
30 | # Items (Trinkets)
31 | actions+=/use_item,name=treacherous_transmitter,if=cooldown.flagellation.remains<=2|boss&fight_remains<=15
32 | ## actions+=/do_treacherous_transmitter_task,if=buff.shadow_dance.up|boss&fight_remains<=15
33 | actions+=/use_item,name=imperfect_ascendancy_serum,use_off_gcd=1,if=dot.rupture.ticking&buff.flagellation_buff.up
34 | actions+=/use_item,name=cursed_stone_idol,use_off_gcd=1,if=dot.rupture.remains>=25&buff.flagellation_buff.up|boss&fight_remains<=20
35 | actions+=/use_item,name=unyielding_netherprism,use_off_gcd=1,if=buff.shadow_blades.up&(buff.latent_energy.stack>=8+8*(trinket.arazs_ritual_forge.cooldown.ready|!equipped.arazs_ritual_forge)|!equipped.arazs_ritual_forge&fight_remains<=90)|boss&fight_remains<=20
36 | actions+=/use_item,name=mad_queens_mandate,if=(!talent.lingering_darkness|buff.lingering_darkness.up|equipped.treacherous_transmitter)&(!equipped.treacherous_transmitter|trinket.treacherous_transmitter.cooldown.remains>20)|boss&fight_remains<=15
37 | actions+=/use_items,slots=trinket1,if=(variable.trinket_sync_slot=1&(buff.shadow_blades.up|boss&fight_remains<=20)|(variable.trinket_sync_slot=2&(!trinket.2.cooldown.ready&cooldown.shadow_blades.remains>20))|!variable.trinket_sync_slot)
38 | actions+=/use_items,slots=trinket2,if=(variable.trinket_sync_slot=2&(buff.shadow_blades.up|boss&fight_remains<=20)|(variable.trinket_sync_slot=1&(!trinket.1.cooldown.ready&cooldown.shadow_blades.remains>20))|!variable.trinket_sync_slot)
39 |
40 | # Cooldowns for Stealth
41 | actions+=/call_action_list,name=stealth_cds,if=!variable.stealth
42 | # Finishing Rules
43 | actions+=/call_action_list,name=finish,if=!buff.darkest_night.up&effective_combo_points>=6|buff.darkest_night.up&combo_points==cp_max_spend|action.coup_de_grace.ready&cooldown.secret_technique.remains>0
44 | # Combo Point Builder
45 | actions+=/call_action_list,name=build
46 | # Filler, Spells used if you can use nothing else.
47 | actions+=/call_action_list,name=fill,if=!variable.stealth
48 |
49 | actions.build+=/backstab,if=(talent.unseen_blade|active_enemies<=2)&(buff.shadow_dance.up&(buff.premeditation.up|buff.shadow_blades.up)&!used_for_danse|!variable.stealth&buff.shadow_blades.up)
50 | actions.build+=/gloomblade,if=buff.shadow_dance.up&!used_for_danse|!variable.stealth&buff.shadow_blades.up
51 | actions.build+=/shadowstrike,cycle_targets=1,if=debuff.find_weakness.remains<=2&active_enemies=2&talent.unseen_blade|!used_for_danse&!talent.premeditation
52 | actions.build+=/shuriken_tornado,if=buff.lingering_darkness.up|talent.deathstalkers_mark&cooldown.shadow_blades.remains>=32&active_enemies>=3
53 | actions.build+=/shuriken_tornado,if=talent.unseen_blade&!buff.stealth.up&((buff.shadow_dance.up&!talent.shadowcraft&active_enemies>=3)|(talent.shadowcraft&active_enemies>=3)|!variable.stealth&active_enemies<=2)&(buff.symbols_of_death.up|!raid_event.adds.up)
54 | actions.build+=/shuriken_storm,if=buff.clear_the_witnesses.up&(active_enemies>=2|!buff.symbols_of_death.up)
55 | actions.build+=/shadowstrike,cycle_targets=1,if=talent.deathstalkers_mark&!debuff.deathstalkers_mark.up&active_enemies>=3&(buff.shadow_blades.up|buff.premeditation.up|talent.the_rotten)
56 | actions.build+=/shuriken_storm,if=talent.deathstalkers_mark&active_enemies>=(2+3*buff.shadow_dance.up)
57 | actions.build+=/shuriken_storm,if=talent.unseen_blade&(buff.flawless_form.up&active_enemies>=3&!variable.stealth|buff.silent_storm.up&active_enemies>=5&buff.shadow_dance.up)
58 | actions.build+=/shuriken_storm,if=(buff.tww3_trickster_4pc.up|buff.escalating_blade.stack=4)&!used_for_danse&(buff.shadow_blades.up|active_enemies>=4)
59 | actions.build+=/shadowstrike
60 | actions.build+=/goremaws_bite,if=combo_points.deficit>=3
61 | actions.build+=/gloomblade
62 | actions.build+=/backstab
63 |
64 | # Cooldowns
65 | actions.cds+=/cold_blood,if=cooldown.secret_technique.up&buff.shadow_dance.up&combo_points>=6&variable.secret&(buff.flagellation_persist.up|buff.flagellation_buff.remains<=3)
66 | actions.cds+=/potion,if=buff.bloodlust.up|boss&fight_remains<30|buff.flagellation_buff.up
67 | ## [Syrif] - Add buff.symbols_of_death.down to dump condition to prevent dumping all charges on a mythic+ boss
68 | actions.cds+=/symbols_of_death,if=(buff.symbols_of_death.remains<=3.5&variable.maintenance&(active_enemies>1|raid_event.adds.up|!buff.flagellation_buff.up|dot.rupture.remains>=30)&(!talent.flagellation|cooldown.flagellation.remains>=30-15*!talent.death_perception&cooldown.secret_technique.remains<8|!talent.death_perception)|boss&fight_remains<=15&buff.symbols_of_death.down)
69 | actions.cds+=/shadow_blades,if=variable.maintenance&variable.shd_cp&buff.shadow_dance.up&!buff.premeditation.up
70 | actions.cds+=/thistle_tea,if=buff.shadow_dance.remains>2&!buff.thistle_tea.up
71 | actions.cds+=/flagellation,if=combo_points>=5&cooldown.shadow_blades.remains<=3|boss&fight_remains<=25
72 |
73 | # This list usually contains Cooldowns with neglectable impact that causes global cooldowns
74 | actions.fill+=/arcane_torrent,if=energy.deficit>=15+energy.regen
75 | actions.fill+=/arcane_pulse
76 | actions.fill+=/lights_judgment
77 | actions.fill+=/bag_of_tricks
78 |
79 | actions.finish+=/secret_technique,if=variable.secret
80 | # Maintenance Finisher
81 | actions.finish+=/rupture,if=!variable.skip_rupture&(!dot.rupture.ticking|refreshable|buff.flagellation_buff.up&!buff.symbols_of_death.up&active_enemies<=2)&target.time_to_die-remains>6&cooldown.flagellation.remains>=10
82 | actions.finish+=/rupture,cycle_targets=1,if=!variable.skip_rupture&!variable.priority_rotation&target.time_to_die>=(2*combo_points)&refreshable&active_enemies>=2
83 | # Direct Damage Finisher
84 | actions.finish+=/coup_de_grace,if=debuff.fazed.up&(cooldown.flagellation.remains>=20|!talent.flagellation)|fight_remains<=10
85 | actions.finish+=/black_powder,if=!variable.priority_rotation&variable.maintenance&(((active_enemies>=2&talent.deathstalkers_mark&(!buff.darkest_night.up|buff.shadow_dance.up&active_enemies>=5))|talent.unseen_blade&active_enemies>=4)|action.coup_de_grace.ready&active_enemies>=3)
86 | actions.finish+=/eviscerate,if=(cooldown.flagellation.remains>=10|!talent.flagellation)|active_enemies>=3|!settings.allow_overcap_cp
87 |
88 | # Shadow Dance, Vanish, Shadowmeld
89 | actions.stealth_cds+=/shadow_dance,if=(variable.shd_cp|!talent.premeditation)&variable.maintenance&(cooldown.secret_technique.remains<=24|talent.the_first_dance&buff.shadow_blades.up)&(buff.symbols_of_death.remains>=6|buff.shadow_blades.remains>=6)|boss&fight_remains<=10
90 | actions.stealth_cds+=/vanish,if=energy>=40&!buff.subterfuge.up&effective_combo_points<=3
91 | actions.stealth_cds+=/shadowmeld,if=energy>=40&combo_points.deficit>=3
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/PaladinRetribution.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/paladin_retribution.simc
2 | ## SimulationCraft Commit Sync: db6e3c4
3 | ## Date: 2025-08-18
4 |
5 | ## [Syrif] - references to spell_targets.divine_storm replaced with active_enemies
6 |
7 | actions.precombat+=/shield_of_vengeance
8 | actions.precombat+=/variable,name=trinket_1_buffs,value=trinket.1.has_buff.strength|trinket.1.has_buff.mastery|trinket.1.has_buff.versatility|trinket.1.has_buff.haste|trinket.1.has_buff.crit
9 | actions.precombat+=/variable,name=trinket_2_buffs,value=trinket.2.has_buff.strength|trinket.2.has_buff.mastery|trinket.2.has_buff.versatility|trinket.2.has_buff.haste|trinket.2.has_buff.crit
10 | actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_1_buffs&(trinket.1.cooldown.duration%%cooldown.crusade.duration=0|cooldown.crusade.duration%%trinket.1.cooldown.duration=0|trinket.1.cooldown.duration%%cooldown.avenging_wrath.duration=0|cooldown.avenging_wrath.duration%%trinket.1.cooldown.duration=0)
11 | actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=variable.trinket_2_buffs&(trinket.2.cooldown.duration%%cooldown.crusade.duration=0|cooldown.crusade.duration%%trinket.2.cooldown.duration=0|trinket.2.cooldown.duration%%cooldown.avenging_wrath.duration=0|cooldown.avenging_wrath.duration%%trinket.2.cooldown.duration=0)
12 | actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&variable.trinket_2_buffs|variable.trinket_2_buffs&((trinket.2.cooldown.duration%trinket.2.proc.any_dps.duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.proc.any_dps.duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
13 |
14 | actions+=/rebuke
15 | actions+=/call_action_list,name=cooldowns
16 | actions+=/call_action_list,name=generators
17 |
18 | actions.cooldowns+=/potion,if=buff.avenging_wrath.up|buff.crusade.up|debuff.execution_sentence.up|boss&fight_remains<30
19 | ## actions.cooldowns+=/invoke_external_buff,name=power_infusion,if=buff.avenging_wrath.up|buff.crusade.up|debuff.execution_sentence.up
20 | actions.cooldowns+=/lights_judgment,if=spell_targets.lights_judgment>=2|!raid_event.adds.exists|raid_event.adds.in>75|raid_event.adds.up
21 | actions.cooldowns+=/fireblood,if=buff.avenging_wrath.up|buff.crusade.up&buff.crusade.stack=10|debuff.execution_sentence.up
22 | actions.cooldowns+=/use_item,slot=trinket1,if=((buff.avenging_wrath.up&cooldown.avenging_wrath.remains>40|buff.crusade.up&buff.crusade.stack=10)&!talent.radiant_glory|talent.radiant_glory&(!talent.execution_sentence&cooldown.wake_of_ashes.remains=0|debuff.execution_sentence.up))&(!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|trinket.1.proc.any_dps.duration>=fight_remains&boss
23 | actions.cooldowns+=/use_item,slot=trinket2,if=((buff.avenging_wrath.up&cooldown.avenging_wrath.remains>40|buff.crusade.up&buff.crusade.stack=10)&!talent.radiant_glory|talent.radiant_glory&(!talent.execution_sentence&cooldown.wake_of_ashes.remains=0|debuff.execution_sentence.up))&(!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|trinket.2.proc.any_dps.duration>=fight_remains&boss
24 | actions.cooldowns+=/use_item,name=bestinslots,if=((buff.avenging_wrath.up&cooldown.avenging_wrath.remains>40|buff.crusade.up&buff.crusade.stack=10)&!talent.radiant_glory|talent.radiant_glory&(!talent.execution_sentence&cooldown.wake_of_ashes.remains=0|debuff.execution_sentence.up))
25 | actions.cooldowns+=/use_item,slot=trinket1,if=!variable.trinket_1_buffs&(trinket.2.cooldown.remains|!variable.trinket_2_buffs|!buff.crusade.up&cooldown.crusade.remains>20|!buff.avenging_wrath.up&cooldown.avenging_wrath.remains>20)
26 | actions.cooldowns+=/use_item,slot=trinket2,if=!variable.trinket_2_buffs&(trinket.1.cooldown.remains|!variable.trinket_1_buffs|!buff.crusade.up&cooldown.crusade.remains>20|!buff.avenging_wrath.up&cooldown.avenging_wrath.remains>20)
27 | actions.cooldowns+=/shield_of_vengeance,if=fight_remains>15&(!talent.execution_sentence|!debuff.execution_sentence.up)&!buff.divine_hammer.up
28 | actions.cooldowns+=/execution_sentence,if=(!buff.crusade.up&cooldown.crusade.remains>15|buff.crusade.stack=10|cooldown.avenging_wrath.remains<0.75|cooldown.avenging_wrath.remains>15|talent.radiant_glory)&(holy_power>=4&time<5|holy_power>=3&time>5|(holy_power>=2|time<5)&(talent.divine_auxiliary|talent.radiant_glory))&(cooldown.divine_hammer.remains>5|buff.divine_hammer.up|!talent.divine_hammer)&(target.time_to_die>8&!talent.executioners_will|target.time_to_die>12)&cooldown.wake_of_ashes.remains=4&time<5|holy_power>=3&time>5|holy_power>=2&talent.divine_auxiliary&(cooldown.execution_sentence.remains=0|cooldown.final_reckoning.remains=0))&(!raid_event.adds.up|target.time_to_die>10)
30 | actions.cooldowns+=/crusade,if=holy_power>=5&time<5|holy_power>=3&time>5
31 | actions.cooldowns+=/final_reckoning,if=(holy_power>=4&time<8|holy_power>=3&time>=8|holy_power>=2&(talent.divine_auxiliary|talent.radiant_glory))&(cooldown.avenging_wrath.remains>10|cooldown.crusade.remains&(!buff.crusade.up|buff.crusade.stack>=10)|talent.radiant_glory&(buff.avenging_wrath.up|talent.crusade&cooldown.wake_of_ashes.remains40)&(cooldown.divine_hammer.remains>5|buff.divine_hammer.up|!talent.divine_hammer)
32 |
33 | actions.finishers+=/variable,name=ds_castable,value=(active_enemies>=3|active_enemies>=2&talent.tempest_of_the_lightbringer&!talent.rush_of_light|buff.empyrean_power.up|!talent.final_verdict&talent.tempest_of_the_lightbringer)&!buff.empyrean_legacy.up&!(buff.divine_arbiter.up&buff.divine_arbiter.stack>24)
34 | actions.finishers+=/hammer_of_light,if=buff.hammer_of_light_ready.up|!talent.divine_hammer|buff.divine_hammer.up|cooldown.divine_hammer.remains>10
35 | actions.finishers+=/divine_hammer,if=!buff.divine_hammer.up
36 | actions.finishers+=/divine_storm,if=variable.ds_castable&(!buff.hammer_of_light_ready.up|buff.empyrean_power.up)&(cooldown.divine_hammer.remains|buff.divine_hammer.up|!talent.divine_hammer)&(!talent.crusade|cooldown.crusade.remains>gcd*3|buff.crusade.up&buff.crusade.stack<10|talent.radiant_glory)
37 | actions.finishers+=/justicars_vengeance,if=(!talent.crusade|cooldown.crusade.remains>gcd*3|buff.crusade.up&buff.crusade.stack<10|talent.radiant_glory)&!buff.hammer_of_light_ready.up&(cooldown.divine_hammer.remains|buff.divine_hammer.up|!talent.divine_hammer)
38 | actions.finishers+=/templars_verdict,if=(!talent.crusade|cooldown.crusade.remains>gcd*3|buff.crusade.up&buff.crusade.stack<10|talent.radiant_glory)&!buff.hammer_of_light_ready.up&(cooldown.divine_hammer.remains|buff.divine_hammer.up|!talent.divine_hammer)
39 | actions.finishers+=/variable,name=finished,op=set,value=true
40 |
41 | actions.generators+=/variable,name=finished,op=set,value=false
42 | actions.generators+=/call_action_list,name=finishers,strict=1,if=(holy_power=5|holy_power=4&buff.divine_resonance.up|buff.all_in.up)&cooldown.wake_of_ashes.remains
43 | actions.generators+=/templar_slash,if=buff.templar_strikes.remains=2&talent.lights_guidance)&(cooldown.avenging_wrath.remains>6|cooldown.crusade.remains>6|talent.radiant_glory)&(!talent.execution_sentence|cooldown.execution_sentence.remains>4|target.time_to_die<8)&(!talent.final_reckoning|cooldown.final_reckoning.remains>4)&(!raid_event.adds.exists|raid_event.adds.in>10|raid_event.adds.up)
46 | actions.generators+=/divine_toll,if=holy_power<=2&(!raid_event.adds.exists|raid_event.adds.in>10|raid_event.adds.up)&(cooldown.avenging_wrath.remains>15|cooldown.crusade.remains>15|talent.radiant_glory|fight_remains<8)
47 | actions.generators+=/call_action_list,name=finishers,strict_if=!variable.finished,if=holy_power>=4|buff.crusade.up&buff.crusade.stack<10|buff.divine_hammer.up|active_enemies>=4
48 | actions.generators+=/templar_slash,if=buff.templar_strikes.remains=2
49 | actions.generators+=/blade_of_justice,if=active_enemies>=2&talent.blade_of_vengeance
50 | actions.generators+=/hammer_of_wrath,if=(active_enemies<2|!talent.blessed_champion)&buff.blessing_of_anshe.up
51 | actions.generators+=/templar_strike
52 | actions.generators+=/judgment
53 | actions.generators+=/blade_of_justice
54 | actions.generators+=/call_action_list,name=finishers,strict=1,if=!variable.finished
55 | actions.generators+=/hammer_of_wrath,if=(active_enemies<2|!talent.blessed_champion)
56 | actions.generators+=/templar_slash
57 | actions.generators+=/crusader_strike
58 | actions.generators+=/hammer_of_wrath
59 | actions.generators+=/arcane_torrent
60 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/HunterBeastMastery.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/hunter_beast_mastery.simc
2 | ## SimulationCraft Commit Sync: f18680e
3 | ## Date: 2025-09-12
4 |
5 | actions.precombat+=/summon_pet
6 | # Determine the stronger trinket to sync with cooldowns. In descending priority: buff effects > damage effects, longer > shorter cooldowns, longer > shorter cast times. Special case to consider Mirror of Fractured Tomorrows weaker than other buff effects since its power is split between the dmg effect and the buff effect.
7 | actions.precombat+=/variable,name=trinket_1_stronger,value=!trinket.2.has_cooldown|trinket.1.has_use_buff&(!trinket.2.has_use_buff|!trinket.1.is.mirror_of_fractured_tomorrows&(trinket.2.is.mirror_of_fractured_tomorrows|trinket.2.cooldown.duration20
18 | actions+=/call_action_list,name=cds
19 | actions+=/call_action_list,name=trinkets
20 | actions+=/call_action_list,name=drst,if=talent.black_arrow&(active_enemies<2|!talent.beast_cleave&active_enemies<3)
21 | actions+=/call_action_list,name=drcleave,if=talent.black_arrow&(active_enemies>2|talent.beast_cleave&active_enemies>1)
22 | actions+=/call_action_list,name=st,if=!talent.black_arrow&(active_enemies<2|!talent.beast_cleave&active_enemies<3)
23 | actions+=/call_action_list,name=cleave,if=!talent.black_arrow&(active_enemies>2|talent.beast_cleave&active_enemies>1)
24 |
25 | ## actions.cds+=/invoke_external_buff,name=power_infusion,if=buff.call_of_the_wild.up|talent.bloodshed&(prev_gcd.1.bloodshed)|!talent.call_of_the_wild&(buff.bestial_wrath.up|cooldown.bestial_wrath.remains<30)|fight_remains<16
26 | actions.cds+=/berserking,if=buff.call_of_the_wild.up|!talent.call_of_the_wild&buff.bestial_wrath.up|boss&fight_remains<13
27 | actions.cds+=/blood_fury,if=buff.call_of_the_wild.up|!talent.call_of_the_wild&buff.bestial_wrath.up|boss&fight_remains<16
28 | actions.cds+=/ancestral_call,if=buff.call_of_the_wild.up|!talent.call_of_the_wild&buff.bestial_wrath.up|boss&fight_remains<16
29 | actions.cds+=/fireblood,if=buff.call_of_the_wild.up|!talent.call_of_the_wild&buff.bestial_wrath.up|boss&fight_remains<9
30 | actions.cds+=/potion,if=buff.call_of_the_wild.up|!talent.call_of_the_wild&buff.bestial_wrath.up|boss&fight_remains<31
31 |
32 | ## [Syrif] - Modified to import better, and be more readable.
33 | ## actions.cleave=bestial_wrath,if=buff.howl_of_the_pack_leader_cooldown.remains-buff.lead_from_the_front.duration=cooldown.kill_command.charges_fractional|talent.call_of_the_wild&cooldown.call_of_the_wild.ready|howl_summon.ready&full_recharge_time<8
36 | actions.cleave+=/bloodshed
37 | actions.cleave+=/multishot,if=pet.main.buff.beast_cleave.down&(!talent.bloody_frenzy|cooldown.call_of_the_wild.remains)
38 | actions.cleave+=/call_of_the_wild
39 | actions.cleave+=/explosive_shot,if=talent.thundering_hooves
40 | actions.cleave+=/kill_command
41 | actions.cleave+=/cobra_shot,if=focus.time_to_max3|!talent.multishot
42 |
43 | actions.drcleave+=/bestial_wrath,if=buff.call_of_the_wild.remains
44 | actions.drcleave+=/kill_shot
45 | actions.drcleave+=/bestial_wrath,if=cooldown.call_of_the_wild.remains>20|!talent.call_of_the_wild
46 | actions.drcleave+=/barbed_shot,cycle_targets=1,if=full_recharge_time=cooldown.kill_command.charges_fractional
52 | actions.drcleave+=/kill_command
53 | actions.drcleave+=/cobra_shot,if=focus.time_to_max30|!talent.call_of_the_wild|fight_remainsgcd&cooldown.black_arrow.remains>0.5
62 | actions.drst+=/kill_command,if=buff.withering_fire.down
63 | actions.drst+=/barbed_shot,cycle_targets=1,if=buff.withering_fire.tick_time_remains>0.5&cooldown.black_arrow.remains>0.5
64 | actions.drst+=/cobra_shot,if=buff.withering_fire.tick_time_remains>0.5&cooldown.black_arrow.remains>0.5
65 |
66 | ## [Syrif] - Modified to import better, and be more readable.
67 | ## actions.st=bestial_wrath,if=buff.howl_of_the_pack_leader_cooldown.remains-buff.lead_from_the_front.duration=cooldown.barbed_shot.charges_fractional&!(buff.lead_from_the_front.remains>gcd&buff.lead_from_the_front.remainsgcd)
73 | actions.st+=/barbed_shot,cycle_targets=1
74 | actions.st+=/cobra_shot
75 |
76 | actions.trinkets+=/variable,name=buff_sync_ready,value=talent.call_of_the_wild&(prev_gcd.1.call_of_the_wild)|talent.bloodshed&(prev_gcd.1.bloodshed)|(!talent.call_of_the_wild&!talent.bloodshed)&(buff.bestial_wrath.up|cooldown.bestial_wrath.remains_guess<5)
77 | actions.trinkets+=/variable,name=buff_sync_remains,op=setif,value=cooldown.bestial_wrath.remains_guess,value_else=cooldown.call_of_the_wild.remains|cooldown.bloodshed.remains,condition=!talent.call_of_the_wild&!talent.bloodshed
78 | actions.trinkets+=/variable,name=buff_sync_active,value=talent.call_of_the_wild&buff.call_of_the_wild.up|talent.bloodshed&prev_gcd.1.bloodshed|(!talent.call_of_the_wild&!talent.bloodshed)&buff.bestial_wrath.up
79 | actions.trinkets+=/variable,name=damage_sync_active,value=1
80 | actions.trinkets+=/variable,name=damage_sync_remains,value=0
81 | actions.trinkets+=/use_item,use_off_gcd=1,slot=trinket1,if=trinket.1.has_use_buff&(variable.buff_sync_ready&(variable.trinket_1_stronger|trinket.2.cooldown.remains)|!variable.buff_sync_ready&(variable.trinket_1_stronger&(variable.buff_sync_remains>trinket.1.cooldown.duration%3&boss&fight_remains>trinket.1.cooldown.duration+20|trinket.2.has_use_buff&trinket.2.cooldown.remains>variable.buff_sync_remains-15&trinket.2.cooldown.remains-5fight_remains&boss)|variable.trinket_2_stronger&(trinket.2.cooldown.remains&(trinket.2.cooldown.remains-5=20|trinket.2.cooldown.remains-5>=variable.buff_sync_remains&(variable.buff_sync_remains>trinket.1.cooldown.duration%3|trinket.1.cooldown.durationfight_remains)))|trinket.2.cooldown.ready&variable.buff_sync_remains>20&variable.buff_sync_remains20|trinket.2.cooldown.remains>20))|boss&fight_remains<25&(variable.trinket_1_stronger|trinket.2.cooldown.remains)
82 | actions.trinkets+=/use_item,use_off_gcd=1,slot=trinket2,if=trinket.2.has_use_buff&(variable.buff_sync_ready&(variable.trinket_2_stronger|trinket.1.cooldown.remains)|!variable.buff_sync_ready&(variable.trinket_2_stronger&(variable.buff_sync_remains>trinket.2.cooldown.duration%3&boss&fight_remains>trinket.2.cooldown.duration+20|trinket.1.has_use_buff&trinket.1.cooldown.remains>variable.buff_sync_remains-15&trinket.1.cooldown.remains-5fight_remains&boss)|variable.trinket_1_stronger&(trinket.1.cooldown.remains&(trinket.1.cooldown.remains-5=20|trinket.1.cooldown.remains-5>=variable.buff_sync_remains&(variable.buff_sync_remains>trinket.2.cooldown.duration%3|trinket.2.cooldown.durationfight_remains)))|trinket.1.cooldown.ready&variable.buff_sync_remains>20&variable.buff_sync_remains20|trinket.1.cooldown.remains>20))|boss&fight_remains<25&(variable.trinket_2_stronger|trinket.1.cooldown.remains)
--------------------------------------------------------------------------------
/Libs/SpellFlashCore/Localization.lua:
--------------------------------------------------------------------------------
1 | -- To update a translation please use the localization utility at:
2 | -- http://wow.curseforge.com/addons/spellflashcore/localization/
3 |
4 | local AddonName, a = ...
5 | a.Localize = setmetatable({}, {__index = function(_, key) return key end})
6 | local L = a.Localize
7 |
8 | -- Example:
9 | L["English text goes here."] = "Translated text goes here."
10 |
11 | if GetLocale() == "ptBR" then -- Brazilian Portuguese
12 | L[" has not been defined in a table!"] = " não foi definido em uma função!"
13 | L["Asleep"] = "Adormecido"
14 | L["Blink Spells"] = "Piscar das Magias"
15 | L["Configure Class Module"] = "Configure o módulo de classe"
16 | L["Default Proc Highlighting"] = "Padrão Destacar Proc"
17 | L["Error loading:"] = "Erro ao carregar"
18 | L["Flash Brightness:"] = "Intensidade do Brilho:"
19 | L["Flash Macros"] = "Macros de Brilho"
20 | L["Flash Size:"] = "Tamanho do Brilho:"
21 | L["In Combat Only"] = "Somente em Combate"
22 | L["Movement Check"] = "Verifique movimento"
23 | L["Range Check"] = "Verifique o Alcance"
24 | L["Selected Class Module:"] = "Módulo de classe selecionada:"
25 | L["Shields"] = "Escudo"
26 | L["Spell Flashing"] = "Brilho do Feitiço"
27 | L["SpellFlash settings have been reset for all players"] = "Brilho do Feitiço foram redefinidas para todos os jogadores"
28 | L["This module has not been updated to work with the latest expansion:"] = "Este módulo não foi atualizado para trabalhar com a mais recente expansão:"
29 | L["Use All Class Modules"] = "Use todos os módulos de classe"
30 |
31 | elseif GetLocale() == "frFR" then -- French
32 | L[" has not been defined in a table!"] = " n'a pas été défini dans une table ! "
33 | L["Asleep"] = "Endormi"
34 | L["Blink Spells"] = "Clignotement des sorts"
35 | L["Configure Class Module"] = "Configurer le module de la classe"
36 | L["Default Proc Highlighting"] = "Surbrillance du proc par défaut"
37 | L["Error loading:"] = "Erreur de chargement :"
38 | L["Flash Brightness:"] = "Luminosité du flash"
39 | L["Flash Macros"] = "Flash sur les macro "
40 | L["Flash Size:"] = "Taille du flash"
41 | L["In Combat Only"] = "En combat seulement"
42 | L["Movement Check"] = "vérification du mouvement"
43 | L["Range Check"] = "vérification de la distance"
44 | L["Selected Class Module:"] = "Module de classe sélectionné"
45 | L["Shields"] = "Boucliers"
46 | L["Spell Flashing"] = "Flash du sort"
47 | L["SpellFlash settings have been reset for all players"] = "Les paramètres de Flash du sort ont été réinitialisés pour tous les personnages"
48 | L["This module has not been updated to work with the latest expansion:"] = "Ce module n'a pas été mis à jour pour fonctionner avec la dernière extension :"
49 | L["Use All Class Modules"] = "Utiliser tous les modules de classe"
50 |
51 | elseif GetLocale() == "deDE" then -- German
52 | L[" has not been defined in a table!"] = " wurde in keiner Liste definiert!"
53 | L["Asleep"] = "Schlafend"
54 | L["Blink Spells"] = "Zaubersprüche aufblinken"
55 | L["Configure Class Module"] = "Klassen-Module konfigurieren"
56 | L["Default Proc Highlighting"] = "Standard Proc Hervorhebung"
57 | L["Error loading:"] = "Fehler beim Laden:"
58 | L["Flash Brightness:"] = "Aufblitz-Leuchtkraft:"
59 | L["Flash Macros"] = "Aufblitz-Makros"
60 | L["Flash Size:"] = "Aufblitz-Größe:"
61 | L["In Combat Only"] = "Nur im Kampf"
62 | L["Movement Check"] = "Bewegungsüberprüfung"
63 | L["Range Check"] = "Reichweitenüberprüfung"
64 | L["Selected Class Module:"] = "Ausgewählte Klassen-Module:"
65 | L["Shields"] = "Schilde"
66 | L["Spell Flashing"] = "Aufblitzende Zauber"
67 | L["SpellFlash settings have been reset for all players"] = "SpellFlash-Einstellungen wurden für alle Spieler zurückgesetzt."
68 | L["This module has not been updated to work with the latest expansion:"] = "Dieses Modul ist nicht aktualisiert worden, um mit der neuesten Erweiterung kompatibel zu sein:"
69 | L["Use All Class Modules"] = "Alle Klassen-Module verwenden"
70 |
71 | elseif GetLocale() == "koKR" then -- Korean
72 | --[[Translation missing --]]
73 | --[[ L[" has not been defined in a table!"] = ""--]]
74 | L["Asleep"] = "수면"
75 | L["Blink Spells"] = "주문 깜박거림"
76 | L["Configure Class Module"] = "직업 모듈 설정"
77 | L["Default Proc Highlighting"] = "기본 발동 효과 강조"
78 | --[[Translation missing --]]
79 | --[[ L["Error loading:"] = ""--]]
80 | L["Flash Brightness:"] = "번쩍임 밝기:"
81 | L["Flash Macros"] = "매크로 번쩍임"
82 | L["Flash Size:"] = "번쩍임 크기:"
83 | L["In Combat Only"] = "전투 중에 한해"
84 | L["Movement Check"] = "이동 확인"
85 | L["Range Check"] = "사정 거리 확인"
86 | L["Selected Class Module:"] = "선택된 직업 모듈:"
87 | L["Shields"] = "방패"
88 | L["Spell Flashing"] = "주문 번쩍임"
89 | L["SpellFlash settings have been reset for all players"] = "SpellFlash 설정이 모든 플레이어에 대해 초기화 되었습니다."
90 | --[[Translation missing --]]
91 | --[[ L["This module has not been updated to work with the latest expansion:"] = ""--]]
92 | L["Use All Class Modules"] = "모든 직업 모듈 사용"
93 |
94 | elseif GetLocale() == "esMX" then -- Latin American Spanish
95 | L[" has not been defined in a table!"] = "¡ no se ha definido en una tabla!"
96 | L["Asleep"] = "Dormido"
97 | L["Blink Spells"] = "Parpadear hechizos"
98 | L["Configure Class Module"] = "Configurar módulo de clase"
99 | L["Default Proc Highlighting"] = "Resaltar proc por defecto"
100 | L["Error loading:"] = "Error de carga:"
101 | L["Flash Brightness:"] = "Brillo de destello:"
102 | L["Flash Macros"] = "Hacer destellar las macros"
103 | L["Flash Size:"] = "Tamaño de destello:"
104 | L["In Combat Only"] = "Sólo en combate"
105 | L["Movement Check"] = "Comprobación de movimiento"
106 | L["Range Check"] = "Comprobación de rango"
107 | L["Selected Class Module:"] = "Módulo de clase seleccionado:"
108 | L["Shields"] = "Escudos"
109 | L["Spell Flashing"] = "Destello de hechizo"
110 | L["SpellFlash settings have been reset for all players"] = "Las opciones de SpellFlash han sido reiniciadas para todos los personajes"
111 | L["This module has not been updated to work with the latest expansion:"] = "Este módulo no ha sido actualizado para trabajar con la última expansión:"
112 | L["Use All Class Modules"] = "Usar todos los módulos de clase"
113 |
114 | elseif GetLocale() == "ruRU" then -- Russian
115 | L[" has not been defined in a table!"] = "Заклинание не найдено в списке!"
116 | L["Asleep"] = "Сон"
117 | L["Blink Spells"] = "Мигать заклинаниями"
118 | L["Configure Class Module"] = "Настройка модуля класса"
119 | L["Default Proc Highlighting"] = "Подсветка прока по умолчанию"
120 | L["Error loading:"] = "Ошибка загрузки:"
121 | L["Flash Brightness:"] = "Яркость подсветки:"
122 | L["Flash Macros"] = "Подсвечивать макросы"
123 | L["Flash Size:"] = "Размер подсветки:"
124 | L["In Combat Only"] = "Только в режиме боя"
125 | L["Movement Check"] = "Проверка движения"
126 | L["Range Check"] = "Проверка дистанции"
127 | L["Selected Class Module:"] = "Модуль выбранного класса"
128 | L["Shields"] = "Щиты"
129 | L["Spell Flashing"] = "Подсветка заклинания"
130 | L["SpellFlash settings have been reset for all players"] = "Настройки SpellFlash были сброшены для всех игроков"
131 | L["This module has not been updated to work with the latest expansion:"] = "Этот модуль не был обновлен для работы с последним дополнением:"
132 | L["Use All Class Modules"] = "Использовать все модули классов"
133 |
134 | elseif GetLocale() == "zhCN" then -- Simplified Chinese
135 | L[" has not been defined in a table!"] = " 还没有定义在函数式中"
136 | L["Asleep"] = "睡眠"
137 | L["Blink Spells"] = "闪动法术"
138 | L["Configure Class Module"] = "设置职业分类"
139 | L["Default Proc Highlighting"] = "默认Proc闪动"
140 | L["Error loading:"] = "加载错误:"
141 | L["Flash Brightness:"] = "闪动亮度"
142 | L["Flash Macros"] = "闪动集合"
143 | L["Flash Size:"] = "闪动尺寸"
144 | L["In Combat Only"] = "只在战斗中"
145 | L["Movement Check"] = "移动确定"
146 | L["Range Check"] = "距离确定"
147 | L["Selected Class Module:"] = "选定职业分类"
148 | L["Shields"] = "盾牌"
149 | L["Spell Flashing"] = "法术闪动"
150 | L["SpellFlash settings have been reset for all players"] = "重置所有角色的SpellFlash设定"
151 | L["This module has not been updated to work with the latest expansion:"] = "这个模组没有升级至最新版本,可能无法正常工作:"
152 | L["Use All Class Modules"] = "使用所有职业分类"
153 |
154 | elseif GetLocale() == "esES" then -- Spanish
155 | L[" has not been defined in a table!"] = "¡ no ha sido definido en la tabla!"
156 | L["Asleep"] = "Dormido"
157 | L["Blink Spells"] = "Parpadear hechizos"
158 | L["Configure Class Module"] = "Configurar Módulo de Clase"
159 | L["Default Proc Highlighting"] = "Resaltado de proc por defecto"
160 | L["Error loading:"] = "Error al cargar:"
161 | L["Flash Brightness:"] = "Brillo de Destello"
162 | L["Flash Macros"] = "Hacer destellar las Macros"
163 | L["Flash Size:"] = "Tamaño de Destello:"
164 | L["In Combat Only"] = "Sólo en combate"
165 | L["Movement Check"] = "Comprobación de Movimiento"
166 | L["Range Check"] = "Comprobación de Rango"
167 | L["Selected Class Module:"] = "Módulo de Clase Seleccionado:"
168 | L["Shields"] = "Escudos"
169 | L["Spell Flashing"] = "Destello de Hechizo"
170 | L["SpellFlash settings have been reset for all players"] = "Las opciones de SpellFlash han sido reiniciadas para todos los personajes"
171 | L["This module has not been updated to work with the latest expansion:"] = "Este módulo no ha sido actualizado para funcionar con la última expansión:"
172 | L["Use All Class Modules"] = "Usar Todos los Módulos de Clase"
173 |
174 | elseif GetLocale() == "zhTW" then -- Traditional Chinese
175 | L[" has not been defined in a table!"] = " 還沒有定義在函式中"
176 | L["Asleep"] = "睡眠"
177 | L["Blink Spells"] = "閃爍的法術"
178 | L["Configure Class Module"] = "設定職業模組"
179 | L["Default Proc Highlighting"] = "預設Proc顏色"
180 | L["Error loading:"] = "載入錯誤:"
181 | L["Flash Brightness:"] = "閃爍亮度"
182 | L["Flash Macros"] = "閃爍巨集"
183 | L["Flash Size:"] = "閃爍尺寸"
184 | L["In Combat Only"] = "只用於戰門中"
185 | L["Movement Check"] = "移動確認"
186 | L["Range Check"] = "距離確認"
187 | L["Selected Class Module:"] = "選定職業模組"
188 | L["Shields"] = "盾牌"
189 | L["Spell Flashing"] = "法術閃爍"
190 | L["SpellFlash settings have been reset for all players"] = "重設所有角色的法術閃爍設定"
191 | L["This module has not been updated to work with the latest expansion:"] = "這個模組沒有升級至最新版本,可能無法正常使用:"
192 | L["Use All Class Modules"] = "使用所有職業模組"
193 |
194 | end
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/WarriorFury.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/warrior_fury.simc
2 | ## SimulationCraft Commit Sync: 89266d4
3 | ## Date: 2025-09-05
4 |
5 | actions.precombat+=/battle_shout
6 | actions.precombat+=/berserker_stance,toggle=on
7 | actions.precombat+=/variable,name=trinket_1_exclude,value=trinket.1.is.treacherous_transmitter
8 | actions.precombat+=/variable,name=trinket_2_exclude,value=trinket.2.is.treacherous_transmitter
9 | # Evaluates a trinkets cooldown, divided by avatar or odyns fury. If it's value has no remainder return 1, else return 0.5.
10 | actions.precombat+=/variable,name=trinket_1_sync,op=setif,value=1,value_else=0.5,condition=trinket.1.has_use_buff&(trinket.1.cooldown.duration%%cooldown.avatar.duration=0|trinket.1.cooldown.duration%%cooldown.odyns_fury.duration=0)
11 | actions.precombat+=/variable,name=trinket_2_sync,op=setif,value=1,value_else=0.5,condition=trinket.2.has_use_buff&(trinket.2.cooldown.duration%%cooldown.avatar.duration=0|trinket.2.cooldown.duration%%cooldown.odyns_fury.duration=0)
12 | actions.precombat+=/variable,name=trinket_1_buffs,value=trinket.1.has_use_buff|(trinket.1.has_stat.any_dps&!variable.trinket_1_exclude)
13 | actions.precombat+=/variable,name=trinket_2_buffs,value=trinket.2.has_use_buff|(trinket.2.has_stat.any_dps&!variable.trinket_2_exclude)
14 | actions.precombat+=/variable,name=trinket_priority,op=setif,value=2,value_else=1,condition=!variable.trinket_1_buffs&variable.trinket_2_buffs|variable.trinket_2_buffs&((trinket.2.cooldown.duration%trinket.2.proc.any_dps.duration)*(1.5+trinket.2.has_buff.strength)*(variable.trinket_2_sync))>((trinket.1.cooldown.duration%trinket.1.proc.any_dps.duration)*(1.5+trinket.1.has_buff.strength)*(variable.trinket_1_sync))
15 | actions.precombat+=/variable,name=trinket_1_manual,value=trinket.1.is.algethar_puzzle_box
16 | actions.precombat+=/variable,name=trinket_2_manual,value=trinket.2.is.algethar_puzzle_box
17 | actions.precombat+=/variable,name=treacherous_transmitter_precombat_cast,value=2
18 | actions.precombat+=/use_item,name=treacherous_transmitter
19 | actions.precombat+=/recklessness,if=!equipped.fyralath_the_dreamrender
20 | actions.precombat+=/avatar,if=!equipped.cursed_stone_idol
21 |
22 | # Executed every time the actor is available.
23 | actions+=/charge,if=time<=0.5|movement.distance>5
24 | actions+=/heroic_leap,if=movement.distance>25
25 | actions+=/potion,if=fight_remains>300|fight_remains<300&target.health.pct<35&buff.recklessness.up|boss&fight_remains<25
26 | actions+=/use_item,name=treacherous_transmitter
27 | actions+=/pummel
28 | # Trinkets
29 | ## actions+=/do_treacherous_transmitter_task
30 | actions+=/use_item,name=cursed_stone_idol,if=cooldown.avatar.remains<2
31 | actions+=/use_item,name=unyielding_netherprism,if=cooldown.avatar.remains<=85
32 | # Trinkets The trinket with the highest estimated value, will be used first and paired with Avatar.
33 | actions+=/use_item,slot=trinket1,if=variable.trinket_1_buffs&!variable.trinket_1_manual&(!buff.avatar.up&trinket.1.cast_time>0|!trinket.1.cast_time>0)&buff.avatar.up&(variable.trinket_2_exclude|!trinket.2.has_cooldown|trinket.2.cooldown.remains|variable.trinket_priority=1)|trinket.1.proc.any_dps.duration>=fight_remains
34 | actions+=/use_item,slot=trinket2,if=variable.trinket_2_buffs&!variable.trinket_2_manual&(!buff.avatar.up&trinket.2.cast_time>0|!trinket.2.cast_time>0)&buff.avatar.up&(variable.trinket_1_exclude|!trinket.1.has_cooldown|trinket.1.cooldown.remains|variable.trinket_priority=2)|trinket.2.proc.any_dps.duration>=fight_remains
35 | # If only one on use trinket provides a buff, use the other on cooldown. Or if neither trinket provides a buff, use both on cooldown.
36 | actions+=/use_item,slot=trinket1,if=!variable.trinket_1_buffs&(trinket.1.cast_time>0&!buff.avatar.up|!trinket.1.cast_time>0)&!variable.trinket_1_manual&(!variable.trinket_1_buffs&(trinket.2.cooldown.remains|!variable.trinket_2_buffs)|(trinket.1.cast_time>0&!buff.avatar.up|!trinket.1.cast_time>0)|cooldown.avatar.remains_expected>20)
37 | actions+=/use_item,slot=trinket2,if=!variable.trinket_2_buffs&(trinket.2.cast_time>0&!buff.avatar.up|!trinket.2.cast_time>0)&!variable.trinket_2_manual&(!variable.trinket_2_buffs&(trinket.1.cooldown.remains|!variable.trinket_1_buffs)|(trinket.2.cast_time>0&!buff.avatar.up|!trinket.2.cast_time>0)|cooldown.avatar.remains_expected>20)
38 | actions+=/use_item,slot=main_hand,if=!equipped.fyralath_the_dreamrender&!equipped.bestinslots&(!variable.trinket_1_buffs|trinket.1.cooldown.remains)&(!variable.trinket_2_buffs|trinket.2.cooldown.remains)
39 | actions+=/use_item,name=bestinslots,if=target.time_to_die>120&(cooldown.avatar.remains>20&(trinket.1.cooldown.remains|trinket.2.cooldown.remains)|cooldown.avatar.remains>20&(!trinket.1.has_cooldown|!trinket.2.has_cooldown))|target.time_to_die<=120&target.health.pct<35&cooldown.avatar.remains>85|target.time_to_die<15
40 | # Variables
41 | actions+=/variable,name=st_planning,value=active_enemies=1&(raid_event.adds.in>15|!raid_event.adds.exists)
42 | actions+=/variable,name=adds_remain,value=active_enemies>=2&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.remains>5)
43 | actions+=/variable,name=execute_phase,value=(talent.massacre.enabled&target.health.pct<35)|target.health.pct<20
44 | actions+=/variable,name=on_gcd_racials,value=buff.recklessness.down&buff.avatar.down&rage<80&buff.sudden_death.down&!cooldown.bladestorm.ready&(!cooldown.execute.ready|!variable.execute_phase)
45 | actions+=/lights_judgment,if=variable.on_gcd_racials
46 | actions+=/bag_of_tricks,if=variable.on_gcd_racials
47 | actions+=/berserking,if=buff.recklessness.up
48 | actions+=/blood_fury
49 | actions+=/fireblood
50 | actions+=/ancestral_call
51 | ## actions+=/invoke_external_buff,name=power_infusion,if=buff.avatar.remains>15&fight_remains>=135|variable.execute_phase&buff.avatar.up|fight_remains<=25
52 | actions+=/run_action_list,name=slayer,strict=1,if=!talent.lightning_strikes
53 | actions+=/run_action_list,name=thane,strict=1,if=talent.lightning_strikes
54 |
55 | actions.slayer+=/recklessness
56 | actions.slayer+=/avatar
57 | actions.slayer+=/execute,if=buff.ashen_juggernaut.up&buff.ashen_juggernaut.remains<=gcd
58 | actions.slayer+=/execute,if=buff.sudden_death.remains<2&!variable.execute_phase
59 | actions.slayer+=/thunderous_roar,if=active_enemies>1&buff.enrage.up
60 | actions.slayer+=/champions_spear,if=!cooldown.bladestorm.remains&(!cooldown.avatar.remains|!cooldown.recklessness.remains|buff.avatar.up|buff.recklessness.up)&buff.enrage.up
61 | actions.slayer+=/odyns_fury,if=active_enemies>1&talent.titanic_rage&buff.meat_cleaver.stack=0
62 | actions.slayer+=/bladestorm,if=buff.enrage.up&(talent.reckless_abandon&cooldown.avatar.remains>=24|talent.anger_management&cooldown.recklessness.remains>=15&(buff.avatar.up|cooldown.avatar.remains>=8))
63 | actions.slayer+=/whirlwind,if=active_enemies>=2&talent.meat_cleaver&buff.meat_cleaver.stack=0
64 | actions.slayer+=/onslaught,if=talent.tenderize&buff.brutal_finish.up
65 | actions.slayer+=/rampage,if=buff.enrage.remains1&buff.enrage.up
68 | actions.slayer+=/odyns_fury,if=active_enemies>1&!talent.titanic_rage
69 | actions.slayer+=/crushing_blow,if=action.raging_blow.charges=2|buff.brutal_finish.up&(!debuff.champions_might.up|debuff.champions_might.up&debuff.champions_might.remains>gcd)
70 | actions.slayer+=/bloodbath,if=buff.bloodcraze.stack>=1|(talent.uproar&dot.bloodbath_dot.remains<40&talent.bloodborne)|buff.enrage.up&buff.enrage.remainsgcd)
72 | actions.slayer+=/rampage,if=rage>115
73 | actions.slayer+=/execute,if=variable.execute_phase&debuff.marked_for_execution.up&buff.enrage.up&active_enemies=1
74 | actions.slayer+=/bloodthirst,if=target.health.pct<35&talent.vicious_contempt&buff.brutal_finish.up&buff.enrage.up&crit_pct_current>=85&active_enemies=1|(!set_bonus.tww3_4pc&active_enemies>4)
75 | actions.slayer+=/crushing_blow
76 | actions.slayer+=/bloodbath
77 | actions.slayer+=/raging_blow,if=buff.opportunist.up
78 | actions.slayer+=/bloodthirst,if=target.health.pct<35&talent.vicious_contempt&crit_pct_current>=70
79 | actions.slayer+=/raging_blow,if=action.raging_blow.charges=2
80 | actions.slayer+=/onslaught,if=talent.tenderize
81 | actions.slayer+=/raging_blow
82 | actions.slayer+=/rampage
83 | actions.slayer+=/odyns_fury,if=buff.enrage.up|talent.titanic_rage
84 | actions.slayer+=/execute,if=buff.sudden_death.up
85 | actions.slayer+=/bloodthirst
86 | actions.slayer+=/thunderous_roar
87 | actions.slayer+=/wrecking_throw
88 | actions.slayer+=/whirlwind
89 | ## [Syrif] - use_off_gcd isn't in SimC, but is needed for the addon to handle storm bolt while bladestorming
90 | actions.slayer+=/storm_bolt,if=buff.bladestorm.up,use_off_gcd=1
91 |
92 | actions.thane+=/recklessness
93 | actions.thane+=/avatar
94 | actions.thane+=/ravager
95 | actions.thane+=/thunderous_roar,if=active_enemies>1&buff.enrage.up
96 | actions.thane+=/champions_spear,if=buff.enrage.up&talent.champions_might
97 | actions.thane+=/thunder_clap,if=buff.meat_cleaver.stack=0&talent.meat_cleaver&active_enemies>=2
98 | actions.thane+=/thunder_blast,if=buff.enrage.up&talent.meat_cleaver
99 | actions.thane+=/rampage,if=buff.enrage.down|(talent.bladestorm&cooldown.bladestorm.remains<=gcd&!debuff.champions_might.up)
100 | actions.thane+=/execute,if=talent.ashen_juggernaut&buff.ashen_juggernaut.remains<=gcd
101 | actions.thane+=/bladestorm,if=buff.enrage.up&talent.unhinged
102 | actions.thane+=/bloodbath
103 | actions.thane+=/rampage,if=rage>=115&talent.reckless_abandon&buff.recklessness.up&buff.slaughtering_strikes.stack>=3
104 | actions.thane+=/crushing_blow
105 | actions.thane+=/onslaught,if=talent.tenderize
106 | actions.thane+=/bloodthirst,if=talent.vicious_contempt&target.health.pct<35
107 | actions.thane+=/rampage,if=rage>=100
108 | actions.thane+=/bloodthirst
109 | actions.thane+=/odyns_fury,if=active_enemies>1&(buff.enrage.up|talent.titanic_rage)
110 | actions.thane+=/raging_blow
111 | actions.thane+=/rampage
112 | actions.thane+=/thunder_blast,if=!talent.meat_cleaver
113 | actions.thane+=/thunderous_roar
114 | actions.thane+=/odyns_fury,if=buff.enrage.up|talent.titanic_rage
115 | actions.thane+=/champions_spear,if=!talent.champions_might
116 | actions.thane+=/execute
117 | actions.thane+=/wrecking_throw
118 | actions.thane+=/thunder_clap
119 | actions.thane+=/whirlwind
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/HunterSurvival.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/hunter_survival.simc
2 | ## SimulationCraft Commit Sync: 7badbb5
3 | ## Date: 2025-08-04
4 |
5 | actions.precombat+=/summon_pet
6 | actions.precombat+=/hunters_mark,if=(settings.mark_any|target.is_boss)&active_dot.hunters_mark=0&target.time_to_pct_80>20
7 | actions.precombat+=/variable,name=stronger_trinket_slot,op=setif,value=1,value_else=2,condition=!trinket.2.is.house_of_cards&(trinket.1.is.house_of_cards|!trinket.2.has_cooldown|trinket.1.has_use_buff&(!trinket.2.has_use_buff|trinket.2.cooldown.duration20
12 | actions+=/mend_pet,if=pet.health_pct2&talent.howl_of_the_pack_leader
16 | actions+=/call_action_list,name=sentst,strict=1,if=active_enemies<3&!talent.howl_of_the_pack_leader
17 | actions+=/call_action_list,name=sentcleave,strict=1,if=active_enemies>2&!talent.howl_of_the_pack_leader
18 | # Use Kill Command if there's nothing else to press
19 | actions+=/kill_command,cycle_targets=1
20 | actions+=/arcane_torrent
21 | actions+=/bag_of_tricks
22 | actions+=/lights_judgment
23 |
24 | # COOLDOWNS ACTIONLIST
25 | actions.cds+=/harpoon,if=settings.use_harpoon&prev.kill_command
26 | actions.cds+=/blood_fury,if=buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault
27 | ## actions.cds+=/invoke_external_buff,name=power_infusion,if=buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault
28 | actions.cds+=/ancestral_call,if=buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault
29 | actions.cds+=/fireblood,if=buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault
30 | actions.cds+=/berserking,if=buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault|time_to_die<13
31 | actions.cds+=/potion,if=boss&fight_remains<25|buff.coordinated_assault.up|!talent.coordinated_assault&cooldown.spearhead.remains|!talent.spearhead&!talent.coordinated_assault
32 | actions.cds+=/use_item,name=imperfect_ascendancy_serum,use_off_gcd=1,if=gcd.remains>gcd.max-0.1
33 | actions.cds+=/use_items,if=cooldown.coordinated_assault.remains|cooldown.spearhead.remains
34 | actions.cds+=/aspect_of_the_eagle,if=target.distance>=6
35 | actions.cds+=/use_item,name=spellstrike_warplance
36 |
37 |
38 | #PACK LEADER | AOE ACTIONLIST
39 | actions.plcleave+=/spearhead,if=cooldown.coordinated_assault.remains
40 | actions.plcleave+=/kill_command,if=buff.relentless_primal_ferocity.up&buff.tip_of_the_spear.stack<1
41 | actions.plcleave+=/fury_of_the_eagle,if=buff.tip_of_the_spear.stack>0
42 | actions.plcleave+=/wildfire_bomb,if=cooldown.wildfire_bomb.charges_fractional>1.7
43 | actions.plcleave+=/explosive_shot,if=buff.tip_of_the_spear.stack>0
44 | actions.plcleave+=/raptor_bite,cycle_targets=1,if=buff.strike_it_rich.up&buff.strike_it_rich.remains0|buff.hogstrider.remains0
46 | actions.plcleave+=/kill_command,if=(buff.howl_of_the_pack_leader_wyvern.remains|buff.howl_of_the_pack_leader_boar.remains|buff.howl_of_the_pack_leader_bear.remains)
47 | actions.plcleave+=/flanking_strike,if=buff.tip_of_the_spear.stack>0
48 | actions.plcleave+=/butchery,if=cooldown.wildfire_bomb.charges_fractional<1.5
49 | actions.plcleave+=/coordinated_assault,if=buff.howl_of_the_pack_leader_cooldown.remains-buff.lead_from_the_front.duration0&(cooldown.spearhead.remains>5|!talent.spearhead&cooldown.coordinated_assault.remains>5)
60 | actions.plst+=/raptor_bite,cycle_targets=1,if=!dot.serpent_sting.ticking&target.time_to_die>12&(!talent.contagious_reagents|active_dot.serpent_sting=0)
61 | actions.plst+=/raptor_bite,cycle_targets=1,if=talent.contagious_reagents&active_dot.serpent_sting0
64 | actions.plst+=/fury_of_the_eagle,if=buff.tip_of_the_spear.stack>0&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.in>40)
65 | actions.plst+=/coordinated_assault,if=buff.howl_of_the_pack_leader_cooldown.remains-buff.lead_from_the_front.duration0
67 | actions.plst+=/raptor_bite,cycle_targets=1,if=buff.howl_of_the_pack_leader_cooldown.up&buff.howl_of_the_pack_leader_cooldown.remains<2*gcd
68 | actions.plst+=/kill_command,if=focus+cast_regen1
70 | actions.plst+=/kill_shot,if=talent.cull_the_herd
71 | ## actions.plst+=/raptor_bite,cycle_targets=1,if=!talent.contagious_reagents
72 | actions.plst+=/raptor_bite,cycle_targets=1
73 | actions.plst+=/kill_shot
74 | actions.plst+=/explosive_shot
75 |
76 | # SENTINEL | DEFAULT AOE ACTIONLIST
77 | actions.sentcleave+=/wildfire_bomb,if=!buff.lunar_storm_cooldown.remains
78 | actions.sentcleave+=/kill_command,if=buff.relentless_primal_ferocity.up&buff.tip_of_the_spear.stack<1
79 | actions.sentcleave+=/wildfire_bomb,if=buff.tip_of_the_spear.stack>0|cooldown.wildfire_bomb.charges_fractional>1.9|(talent.bombardier&cooldown.coordinated_assault.remains<2*gcd)|talent.butchery&cooldown.butchery.remains0
81 | actions.sentcleave+=/raptor_bite,cycle_targets=1,if=buff.strike_it_rich.up&buff.strike_it_rich.remains0
84 | actions.sentcleave+=/coordinated_assault
85 | actions.sentcleave+=/flanking_strike,if=(buff.tip_of_the_spear.stack=2|buff.tip_of_the_spear.stack=1)
86 | actions.sentcleave+=/kill_command,if=focus+cast_regen0
88 | actions.sentcleave+=/explosive_shot
89 | actions.sentcleave+=/kill_shot,if=buff.deathblow.remains&talent.sic_em
90 | ## actions.sentcleave+=/raptor_bite,cycle_targets=1,if=!talent.contagious_reagents
91 | actions.sentcleave+=/raptor_bite,cycle_targets=1
92 |
93 | # SENTINEL | DEFAULT SINGLE TARGET ACTIONLIST.
94 | actions.sentst+=/wildfire_bomb,if=!buff.lunar_storm_cooldown.remains&buff.tip_of_the_spear.stack>0
95 | actions.sentst+=/kill_command,if=(buff.relentless_primal_ferocity.up&buff.tip_of_the_spear.stack<1)
96 | actions.sentst+=/spearhead,if=cooldown.coordinated_assault.remains
97 | actions.sentst+=/flanking_strike,if=buff.tip_of_the_spear.stack>0
98 | actions.sentst+=/kill_command,if=buff.strike_it_rich.remains&buff.tip_of_the_spear.stack<1
99 | actions.sentst+=/mongoose_bite,if=buff.strike_it_rich.remains&buff.coordinated_assault.up
100 | actions.sentst+=/wildfire_bomb,if=cooldown.wildfire_bomb.charges_fractional>1.7
101 | actions.sentst+=/butchery
102 | actions.sentst+=/coordinated_assault,if=!talent.bombardier|talent.bombardier&cooldown.wildfire_bomb.charges_fractional<2
103 | actions.sentst+=/fury_of_the_eagle,if=buff.tip_of_the_spear.stack>0
104 | actions.sentst+=/kill_command,if=buff.tip_of_the_spear.stack<1&cooldown.flanking_strike.remains0
107 | actions.sentst+=/wildfire_bomb,if=buff.tip_of_the_spear.stack>0
108 | actions.sentst+=/explosive_shot
109 | actions.sentst+=/mongoose_bite,if=buff.mongoose_fury.remains
110 | actions.sentst+=/kill_shot
111 | ## actions.sentst+=/raptor_bite,cycle_targets=1,if=!talent.contagious_reagents
112 | actions.sentst+=/raptor_bite,cycle_targets=1
113 |
114 | # SENTINEL | DEFAULT SINGLE TARGET ACTIONLIST.
115 | actions.sentst+=/wildfire_bomb,if=!buff.lunar_storm_cooldown.remains
116 | actions.sentst+=/kill_command,cycle_targets=1,if=(buff.relentless_primal_ferocity.up&buff.tip_of_the_spear.stack<1)
117 | actions.sentst+=/spearhead,if=cooldown.coordinated_assault.remains
118 | actions.sentst+=/flanking_strike,if=buff.tip_of_the_spear.stack>0
119 | actions.sentst+=/kill_command,if=buff.strike_it_rich.remains&buff.tip_of_the_spear.stack<1
120 | actions.sentst+=/mongoose_bite,if=buff.strike_it_rich.remains&buff.coordinated_assault.up
121 | actions.sentst+=/wildfire_bomb,if=(buff.lunar_storm_cooldown.remains>full_recharge_time-gcd)&(buff.tip_of_the_spear.stack>0&cooldown.wildfire_bomb.charges_fractional>1.7|cooldown.wildfire_bomb.charges_fractional>1.9)|(talent.bombardier&cooldown.coordinated_assault.remains<2*gcd)
122 | actions.sentst+=/butchery
123 | actions.sentst+=/coordinated_assault,if=!talent.bombardier|talent.bombardier&cooldown.wildfire_bomb.charges_fractional<1
124 | actions.sentst+=/fury_of_the_eagle,if=buff.tip_of_the_spear.stack>0
125 | actions.sentst+=/kill_command,cycle_targets=1,if=buff.tip_of_the_spear.stack<1&cooldown.flanking_strike.remains0
128 | actions.sentst+=/wildfire_bomb,if=buff.tip_of_the_spear.stack>0&buff.lunar_storm_cooldown.remains>full_recharge_time&(!raid_event.adds.exists|raid_event.adds.exists&raid_event.adds.in>15)
129 | actions.sentst+=/mongoose_bite,if=buff.mongoose_fury.remains
130 | actions.sentst+=/explosive_shot
131 | actions.sentst+=/kill_shot
132 | actions.sentst+=/raptor_bite,cycle_targets=1,if=!talent.contagious_reagents
133 | actions.sentst+=/raptor_bite,cycle_targets=1
--------------------------------------------------------------------------------
/Options/Translation.lua:
--------------------------------------------------------------------------------
1 | -- Translation.lua
2 | -- 技能名称翻译功能模块
3 | -- 提供中英文技能名称互转功能
4 | -- 适用于Hekili插件
5 | -- 作者:胡里胡涂
6 |
7 | local addon, ns = ...
8 | local Hekili = _G[ addon ]
9 |
10 | -- 获取Hekili的类和状态引用
11 | local class = Hekili.Class
12 | local state = Hekili.State
13 |
14 | -- 常用字符串和表操作函数本地化
15 | local format, lower, match = string.format, string.lower, string.match
16 | local insert, remove, sort, wipe = table.insert, table.remove, table.sort, table.wipe
17 |
18 | -- 获取游戏API函数
19 | local GetSpellInfo = ns.GetUnpackedSpellInfo
20 | local GetSpellDescription = C_Spell.GetSpellDescription
21 |
22 | -- 判断字符串是否包含中文
23 | -- @param str 要检查的字符串
24 | -- @return boolean 如果包含中文返回true,否则返回false
25 | local function isChinese(str)
26 | if str == "" then
27 | return str
28 | end
29 | if string.match(str, "^%d+$") then
30 | return true -- 纯数字视为中文处理
31 | end
32 | -- 使用UTF-8编码范围匹配中文字符
33 | -- 添加中文标点符号和全角字符支持
34 | return string.find(str, "[\228-\233][\128-\191][\128-\191]") ~= nil or
35 | string.find(str, "[\239-\241][\128-\191][\128-\191]") ~= nil or -- 中文标点
36 | string.find(str, "[\227][\128-\191][\128-\191]") ~= nil or -- 全角字符
37 | string.find(str, "[\194-\223][\128-\191]") ~= nil -- 其他中文符号
38 | end
39 |
40 | -- 天赋查询缓存表
41 | local talentCache = {}
42 | local lastCacheUpdate = 0
43 | local CACHE_EXPIRE_TIME = 300 -- 5分钟缓存过期时间
44 |
45 | -- 通过天赋名称获取法术ID
46 | -- @param talentName 天赋名称
47 | -- @return number|nil 法术ID,找不到返回nil
48 | local function getTalentSpellID(talentName)
49 | -- 参数检查
50 | if not talentName or type(talentName) ~= "string" or talentName == "" then
51 | return nil, "无效的天赋名称"
52 | end
53 |
54 | -- 检查缓存是否过期
55 | local now = GetTime()
56 | if now - lastCacheUpdate > CACHE_EXPIRE_TIME then
57 | wipe(talentCache)
58 | lastCacheUpdate = now
59 | end
60 |
61 | -- 先检查缓存
62 | if talentCache[talentName] ~= nil then
63 | return talentCache[talentName]
64 | end
65 |
66 | -- 获取当前天赋配置
67 | local configID = C_ClassTalents.GetActiveConfigID()
68 | if not configID then
69 | return nil, "无法获取天赋配置ID"
70 | end
71 |
72 | -- 批量获取天赋树信息
73 | local configInfo = C_Traits.GetConfigInfo(configID)
74 | if not configInfo or not configInfo.treeIDs or #configInfo.treeIDs == 0 then
75 | return nil, "无法获取天赋树信息"
76 | end
77 |
78 | -- 预加载所有天赋节点
79 | local nodes = {}
80 | for _, treeID in ipairs(configInfo.treeIDs) do
81 | local treeNodes = C_Traits.GetTreeNodes(treeID)
82 | if treeNodes then
83 | for _, nodeID in ipairs(treeNodes) do
84 | insert(nodes, nodeID)
85 | end
86 | end
87 | end
88 |
89 | if #nodes == 0 then
90 | return nil, "天赋树节点为空"
91 | end
92 |
93 | -- 批量处理节点
94 | for _, nodeID in ipairs(nodes) do
95 | local nodeInfo = C_Traits.GetNodeInfo(configID, nodeID)
96 | if nodeInfo and nodeInfo.entryIDs then
97 | for _, entryID in ipairs(nodeInfo.entryIDs) do
98 | local entryInfo = C_Traits.GetEntryInfo(configID, entryID)
99 | if entryInfo and entryInfo.definitionID then
100 | local defInfo = C_Traits.GetDefinitionInfo(entryInfo.definitionID)
101 | if defInfo and defInfo.spellID then
102 | local spellInfo = C_Spell.GetSpellInfo(defInfo.spellID)
103 | if spellInfo and spellInfo.name == talentName then
104 | -- 存入缓存
105 | talentCache[talentName] = defInfo.spellID
106 | return defInfo.spellID
107 | end
108 | end
109 | end
110 | end
111 | end
112 | end
113 |
114 | -- 未找到时也缓存nil结果,避免重复查询
115 | talentCache[talentName] = nil
116 | return nil, "未找到匹配的天赋"
117 | end
118 |
119 | -- 翻译缓存表
120 | local spellCache = {}
121 | local lastSpellCacheUpdate = 0
122 | local SPELL_CACHE_EXPIRE = 300 -- 5分钟缓存过期时间
123 |
124 | -- 翻译技能名称(中英文互转)
125 | -- @param input 输入的名称(可以是中文或英文)
126 | -- @return string|nil 翻译后的名称,找不到返回nil
127 | local function transSpell(input)
128 | if not input or type(input) ~= "string" or input == "" then
129 | return nil, "无效的输入"
130 | end
131 |
132 | -- 检查缓存是否过期
133 | local now = GetTime()
134 | if now - lastSpellCacheUpdate > SPELL_CACHE_EXPIRE then
135 | wipe(spellCache)
136 | lastSpellCacheUpdate = now
137 | end
138 |
139 | -- 先检查缓存
140 | if spellCache[input] ~= nil then
141 | return spellCache[input]
142 | end
143 |
144 | -- 处理英文转中文的情况
145 | if not isChinese(input) then
146 | -- 检查是否是技能
147 | local ability = Hekili.Class.abilities[input]
148 | if ability then
149 | local result = ability.name
150 | spellCache[input] = result
151 | print(format("查询到的技能:%s", C_Spell.GetSpellLink(ability.id)))
152 | return result
153 | end
154 |
155 | -- 检查是否是光环
156 | local aura = Hekili.Class.auras[input]
157 | if aura then
158 | local result = aura.name
159 | spellCache[input] = result
160 | print(format("查询到的光环:%s", C_Spell.GetSpellLink(aura.id)))
161 | return result
162 | end
163 |
164 | -- 检查是否是天赋
165 | local talent = Hekili.Class.talents[input]
166 | if talent then
167 | local spellInfo = C_Spell.GetSpellInfo(talent[2])
168 | if spellInfo then
169 | local result = spellInfo.name
170 | spellCache[input] = result
171 | print(format("查询到的天赋:%s", C_Spell.GetSpellLink(spellInfo.spellID)))
172 | return result
173 | end
174 | end
175 | else
176 | -- 处理中文转英文的情况
177 |
178 | -- 在技能表中查找匹配的中文名称
179 | for key, ability in pairs(Hekili.Class.abilities) do
180 | if ability.name == input then
181 | local result = (type(key) == "number" or isChinese(key)) and ability.key or key
182 | spellCache[input] = result
183 | print(format("查询到的技能:%s", C_Spell.GetSpellLink(ability.itemSpellID or ability.id)))
184 | return result
185 | end
186 | end
187 |
188 | -- 在光环表中查找匹配的中文名称
189 | for key, ability in pairs(Hekili.Class.auras) do
190 | if ability.name == input and not isChinese(key) then
191 | spellCache[input] = key
192 | print(format("查询到的光环:%s", C_Spell.GetSpellLink(ability.id)))
193 | return key
194 | end
195 | end
196 |
197 | -- 在天赋表中查找匹配的中文名称
198 | local spellid = getTalentSpellID(input)
199 | if spellid then
200 | for key, ability in pairs(Hekili.Class.talents) do
201 | if ability[2] == spellid and not isChinese(key) then
202 | spellCache[input] = key
203 | print(format("查询到的天赋:%s", C_Spell.GetSpellLink(ability[2])))
204 | return key
205 | end
206 | end
207 | end
208 | end
209 |
210 | -- 未找到时也缓存nil结果,避免重复查询
211 | spellCache[input] = nil
212 | return nil, "未找到匹配项"
213 | end
214 |
215 | -- 导出数据到JSON文件
216 | -- @param filePath 导出文件的路径
217 |
218 | -- 自定义简单的JSON转换函数
219 | local function tableToJSON(obj, padding)
220 | padding = padding or ""
221 | local t = type(obj)
222 | if t == "number" then
223 | return tostring(obj)
224 | end
225 | if t == "string" then
226 | return "\"" .. obj:gsub("\\", "\\\\"):gsub("\"", "\\\""):gsub("\n", "\\n"):gsub("\r", "\\r"):gsub("\t", "\\t") .. "\""
227 | end
228 | if t == "boolean" then
229 | return tostring(obj)
230 | end
231 | local json = ""
232 | if t == "table" then
233 | local indent = padding .. " "
234 | local isArray = true
235 | local i = 1
236 | for k in pairs(obj) do
237 | if k ~= i then
238 | isArray = false
239 | break
240 | end
241 | i = i + 1
242 | end
243 | if isArray then
244 | json = padding .. "[\n"
245 | local elements = {}
246 | for _, v in ipairs(obj) do
247 | table.insert(elements, indent .. tableToJSON(v, indent))
248 | end
249 | json = json .. table.concat(elements, ",\n") .. "\n" .. padding .. "]"
250 | else
251 | json = padding .. "{\n"
252 | local keyValues = {}
253 | for k, v in pairs(obj) do
254 | table.insert(keyValues, indent .. tableToJSON(k) .. ": " .. tableToJSON(v, indent))
255 | end
256 | json = json .. table.concat(keyValues, ",\n") .. "\n" .. padding .. "}"
257 | end
258 | end
259 | return json
260 | end
261 |
262 | -- 创建窗口和文本框
263 | local exportWindow = CreateFrame("Frame", "HekiliExportWindow", UIParent, "BasicFrameTemplateWithInset")
264 | exportWindow:SetSize(600, 400)
265 | exportWindow:SetPoint("CENTER")
266 | exportWindow:SetMovable(true)
267 | exportWindow:EnableMouse(true)
268 | exportWindow:RegisterForDrag("LeftButton")
269 | exportWindow:SetScript("OnDragStart", exportWindow.StartMoving)
270 | exportWindow:SetScript("OnDragStop", exportWindow.StopMovingOrSizing)
271 |
272 | exportWindow.title = exportWindow:CreateFontString(nil, "ARTWORK", "GameFontHighlight")
273 | exportWindow.title:SetPoint("TOP", 0, -5)
274 | exportWindow.title:SetText("Hekili 导出数据")
275 |
276 | local scrollFrame = CreateFrame("ScrollFrame", nil, exportWindow, "UIPanelScrollFrameTemplate")
277 | scrollFrame:SetPoint("TOPLEFT", 10, -30)
278 | scrollFrame:SetPoint("BOTTOMRIGHT", -30, 10) -- 调整位置为顶部按钮留出空间
279 |
280 | local editBox = CreateFrame("EditBox", nil, scrollFrame)
281 | editBox:SetMultiLine(true)
282 | editBox:SetFontObject("GameFontHighlight")
283 | editBox:SetWidth(scrollFrame:GetWidth())
284 | editBox:SetAutoFocus(true)
285 | editBox:SetTextInsets(5, 5, 5, 5)
286 | scrollFrame:SetScrollChild(editBox)
287 |
288 | -- 平时隐藏窗口
289 | exportWindow:Hide()
290 |
291 | local function updateExportWindow()
292 | local jsonData = {
293 | keywords = {},
294 | }
295 | -- 提取abilities中的中英文名称,过滤数字key和中文key
296 | for key, ability in pairs(Hekili.Class.abilities) do
297 | if type(key) ~= 'number' and not isChinese(key) then
298 | local enName = key
299 | local zhName = ability.name
300 | jsonData.keywords[enName] = zhName
301 | end
302 | end
303 | -- 提取auras中的中英文名称,过滤数字key和中文key
304 | for key, aura in pairs(Hekili.Class.auras) do
305 | if type(key) ~= 'number' and not isChinese(key) then
306 | local enName = key
307 | local zhName = aura.name
308 | jsonData.keywords[enName] = zhName
309 | end
310 | end
311 | -- 提取talents中的中英文名称,过滤数字key和中文key
312 | for key, talent in pairs(Hekili.Class.talents) do
313 | if type(key) ~= 'number' and not isChinese(key) then
314 | local spellInfo = C_Spell.GetSpellInfo(talent[2])
315 | if spellInfo then
316 | local enName = key
317 | local zhName = spellInfo.name
318 | jsonData.keywords[enName] = zhName
319 | end
320 | end
321 | end
322 | -- 将数据转换为JSON字符串
323 | local jsonString = tableToJSON(jsonData)
324 | editBox:SetText(jsonString)
325 | exportWindow:Show()
326 | end
327 |
328 | -- 修改斜杠命令以显示窗口
329 | SLASH_HekiliExportJSON1 = '/hky'
330 | SlashCmdList['HekiliExportJSON'] = function(arg)
331 | updateExportWindow()
332 | end
333 |
334 | Hekili.Trans = {
335 | isChinese = isChinese, -- 中文检测函数
336 | getTalentSpellID = getTalentSpellID, -- 天赋名称转法术ID
337 | transSpell = transSpell, -- 技能名称翻译主函数
338 | exportToJSON = exportToJSON -- 导出数据到JSON文件
339 | }
--------------------------------------------------------------------------------
/Legion/Items.lua:
--------------------------------------------------------------------------------
1 | -- Legion/Items.lua
2 |
3 | local addon, ns = ...
4 | local Hekili = _G[ addon ]
5 |
6 | local class, state = Hekili.Class, Hekili.State
7 | local all = Hekili.Class.specs[ 0 ]
8 |
9 | -- LEGION LEGENDARIES
10 | all:RegisterGear( "rethus_incessant_courage", 146667 )
11 | all:RegisterAura( "rethus_incessant_courage", { id = 241330 } )
12 |
13 | all:RegisterGear( "vigilance_perch", 146668 )
14 | all:RegisterAura( "vigilance_perch", { id = 241332, duration = 60, max_stack = 5 } )
15 |
16 | all:RegisterGear( "the_sentinels_eternal_refuge", 146669 )
17 | all:RegisterAura( "the_sentinels_eternal_refuge", { id = 241331, duration = 60, max_stack = 5 } )
18 |
19 | all:RegisterGear( "prydaz_xavarics_magnum_opus", 132444 )
20 | all:RegisterAura( "xavarics_magnum_opus", { id = 207428, duration = 30 } )
21 |
22 |
23 |
24 | all:RegisterAbility( "draught_of_souls", {
25 | cast = 0,
26 | cooldown = 80,
27 | gcd = "off",
28 |
29 | item = 140808,
30 |
31 | toggle = "cooldowns",
32 |
33 | handler = function ()
34 | applyBuff( "fel_crazed_rage", 3 )
35 | setCooldown( "global_cooldown", 3 )
36 | end,
37 | } )
38 |
39 | all:RegisterAura( "fel_crazed_rage", {
40 | id = 225141,
41 | duration = 3,
42 | })
43 |
44 |
45 | all:RegisterAbility( "faulty_countermeasure", {
46 | cast = 0,
47 | cooldown = 120,
48 | gcd = "off",
49 |
50 | item = 137539,
51 |
52 | toggle = "cooldowns",
53 |
54 | handler = function ()
55 | applyBuff( "sheathed_in_frost" )
56 | end
57 | } )
58 |
59 | all:RegisterAura( "sheathed_in_frost", {
60 | id = 214962,
61 | duration = 30
62 | } )
63 |
64 |
65 | all:RegisterAbility( "feloiled_infernal_machine", {
66 | cast = 0,
67 | cooldown = 80,
68 | gcd = "off",
69 |
70 | item = 144482,
71 |
72 | toggle = "cooldowns",
73 |
74 | handler = function ()
75 | applyBuff( "grease_the_gears" )
76 | end,
77 | } )
78 |
79 | all:RegisterAura( "grease_the_gears", {
80 | id = 238534,
81 | duration = 20
82 | } )
83 |
84 |
85 | all:RegisterAbility( "forgefiends_fabricator", {
86 | item = 151963,
87 | spend = 0,
88 | cast = 0,
89 | cooldown = 30,
90 | gcd = "off",
91 | } )
92 |
93 |
94 | all:RegisterAbility( "horn_of_valor", {
95 | item = 133642,
96 | spend = 0,
97 | cast = 0,
98 | cooldown = 120,
99 | gcd = "off",
100 | toggle = "cooldowns",
101 | handler = function () applyBuff( "valarjars_path" ) end
102 | } )
103 |
104 | all:RegisterAura( "valarjars_path", {
105 | id = 215956,
106 | duration = 30,
107 | max_stack = 1
108 | } )
109 |
110 |
111 | all:RegisterAbility( "kiljaedens_burning_wish", {
112 | item = 144259,
113 |
114 | cast = 0,
115 | cooldown = 75,
116 | gcd = "off",
117 |
118 | texture = 1357805,
119 |
120 | toggle = "cooldowns",
121 | } )
122 |
123 |
124 | all:RegisterAbility( "might_of_krosus", {
125 | item = 140799,
126 | spend = 0,
127 | cast = 0,
128 | cooldown = 30,
129 | gcd = "off",
130 | handler = function () if active_enemies > 3 then setCooldown( "might_of_krosus", 15 ) end end
131 | } )
132 |
133 |
134 | all:RegisterAbility( "ring_of_collapsing_futures", {
135 | item = 142173,
136 | spend = 0,
137 | cast = 0,
138 | cooldown = 15,
139 | gcd = "off",
140 | readyTime = function () return debuff.temptation.remains end,
141 | handler = function () applyDebuff( "player", "temptation", 30, debuff.temptation.stack + 1 ) end
142 | } )
143 |
144 | all:RegisterAura( "temptation", {
145 | id = 234143,
146 | duration = 30,
147 | max_stack = 20
148 | } )
149 |
150 |
151 | all:RegisterAbility( "specter_of_betrayal", {
152 | item = 151190,
153 | spend = 0,
154 | cast = 0,
155 | cooldown = 45,
156 | gcd = "off",
157 | } )
158 |
159 |
160 | all:RegisterAbility( "tiny_oozeling_in_a_jar", {
161 | item = 137439,
162 | spend = 0,
163 | cast = 0,
164 | cooldown = 20,
165 | gcd = "off",
166 | usable = function () return buff.congealing_goo.stack == 6 end,
167 | handler = function () removeBuff( "congealing_goo" ) end
168 | } )
169 |
170 | all:RegisterAura( "congealing_goo", {
171 | id = 215126,
172 | duration = 60,
173 | max_stack = 6
174 | } )
175 |
176 |
177 | all:RegisterAbility( "umbral_moonglaives", {
178 | item = 147012,
179 | spend = 0,
180 | cast = 0,
181 | cooldown = 90,
182 | gcd = "off",
183 | toggle = "cooldowns",
184 | } )
185 |
186 |
187 | all:RegisterAbility( "unbridled_fury", {
188 | item = 139327,
189 | spend = 0,
190 | cast = 0,
191 | cooldown = 120,
192 | gcd = "off",
193 | toggle = "cooldowns",
194 | handler = function () applyBuff( "wild_gods_fury" ) end
195 | } )
196 |
197 | all:RegisterAura( "wild_gods_fury", {
198 | id = 221695,
199 | duration = 30
200 | } )
201 |
202 |
203 | all:RegisterAbility( "vial_of_ceaseless_toxins", {
204 | item = 147011,
205 | spend = 0,
206 | cast = 0,
207 | cooldown = 60,
208 | gcd = "off",
209 | toggle = "cooldowns",
210 | handler = function () applyDebuff( "target", "ceaseless_toxin", 20 ) end
211 | } )
212 |
213 | all:RegisterAura( "ceaseless_toxin", {
214 | id = 242497,
215 | duration = 20
216 | } )
217 |
218 |
219 | all:RegisterAbility( "tome_of_unraveling_sanity", {
220 | item = 147019,
221 | spend = 0,
222 | cast = 0,
223 | cooldown = 60,
224 | gcd = "off",
225 | toggle = "cooldowns",
226 | handler = function () applyDebuff( "target", "insidious_corruption", 12 ) end
227 | } )
228 |
229 | all:RegisterAura( "insidious_corruption", {
230 | id = 243941,
231 | duration = 12
232 | } )
233 | all:RegisterAura( "extracted_sanity", {
234 | id = 243942,
235 | duration = 24
236 | } )
237 |
238 | all:RegisterGear( "aggramars_stride", 132443 )
239 | all:RegisterAura( "aggramars_stride", {
240 | id = 207438,
241 | duration = 3600
242 | } )
243 |
244 | all:RegisterGear( "sephuzs_secret", 132452 )
245 | all:RegisterAura( "sephuzs_secret", {
246 | id = 208051,
247 | duration = 10
248 | } )
249 | all:RegisterAbility( "buff_sephuzs_secret", {
250 | name = "Sephuz's Secret (ICD)",
251 | cast = 0,
252 | cooldown = 30,
253 | gcd = "off",
254 |
255 | unlisted = true,
256 | usable = function () return false end,
257 | } )
258 |
259 | all:RegisterGear( "archimondes_hatred_reborn", 144249 )
260 | all:RegisterAura( "archimondes_hatred_reborn", {
261 | id = 235169,
262 | duration = 10,
263 | max_stack = 1
264 | } )
265 |
266 | all:RegisterGear( "amanthuls_vision", 154172 )
267 | all:RegisterAura( "glimpse_of_enlightenment", {
268 | id = 256818,
269 | duration = 12
270 | } )
271 | all:RegisterAura( "amanthuls_grandeur", {
272 | id = 256832,
273 | duration = 15
274 | } )
275 |
276 | all:RegisterGear( "insignia_of_the_grand_army", 152626 )
277 |
278 | all:RegisterGear( "eonars_compassion", 154172 )
279 | all:RegisterAura( "mark_of_eonar", {
280 | id = 256824,
281 | duration = 12
282 | } )
283 | all:RegisterAura( "eonars_verdant_embrace", {
284 | id = function ()
285 | if class.file == "SHAMAN" then return 257475 end
286 | if class.file == "DRUID" then return 257470 end
287 | if class.file == "MONK" then return 257471 end
288 | if class.file == "PALADIN" then return 257472 end
289 | if class.file == "PRIEST" then
290 | if spec.discipline then return 257473 end
291 | if spec.holy then return 257474 end
292 | end
293 | return 257475
294 | end,
295 | duration = 20,
296 | copy = { 257470, 257471, 257472, 257473, 257474, 257475 }
297 | } )
298 | all:RegisterAura( "verdant_embrace", {
299 | id = 257444,
300 | duration = 30
301 | } )
302 |
303 |
304 | all:RegisterGear( "aggramars_conviction", 154173 )
305 | all:RegisterAura( "celestial_bulwark", {
306 | id = 256816,
307 | duration = 14
308 | } )
309 | all:RegisterAura( "aggramars_fortitude", {
310 | id = 256831,
311 | duration = 15
312 | } )
313 |
314 | all:RegisterGear( "golganneths_vitality", 154174 )
315 | all:RegisterAura( "golganneths_thunderous_wrath", {
316 | id = 256833,
317 | duration = 15
318 | } )
319 |
320 | all:RegisterGear( "khazgoroths_courage", 154176 )
321 | all:RegisterAura( "worldforgers_flame", {
322 | id = 256826,
323 | duration = 12
324 | } )
325 | all:RegisterAura( "khazgoroths_shaping", {
326 | id = 256835,
327 | duration = 15
328 | } )
329 |
330 | all:RegisterGear( "norgannons_prowess", 154177 )
331 | all:RegisterAura( "rush_of_knowledge", {
332 | id = 256828,
333 | duration = 12
334 | } )
335 | all:RegisterAura( "norgannons_command", {
336 | id = 256836,
337 | duration = 15,
338 | max_stack = 6
339 | } )
340 |
341 |
342 | -- Legion TW
343 | all:RegisterAbilities( {
344 | windscar_whetstone = {
345 | cast = 0,
346 | cooldown = 120,
347 | gcd = "off",
348 |
349 | item = 137486,
350 |
351 | toggle = "cooldowns",
352 |
353 | handler = function ()
354 | applyBuff( "slicing_maelstrom" )
355 | end,
356 |
357 | proc = "damage",
358 |
359 | auras = {
360 | slicing_maelstrom = {
361 | id = 214980,
362 | duration = 6,
363 | max_stack = 1
364 | }
365 | }
366 | },
367 |
368 | giant_ornamental_pearl = {
369 | cast = 0,
370 | cooldown = 60,
371 | gcd = "off",
372 |
373 | item = 137369,
374 |
375 | toggle = "cooldowns",
376 |
377 | handler = function ()
378 | applyBuff( "gaseous_bubble" )
379 | end,
380 |
381 | auras = {
382 | gaseous_bubble = {
383 | id = 214971,
384 | duration = 8,
385 | max_stack = 1
386 | }
387 | }
388 | },
389 |
390 | bottled_hurricane = {
391 | cast = 0,
392 | gcd = "off",
393 |
394 | item = 137369,
395 |
396 | toggle = "cooldowns",
397 |
398 | buff = "gathering_clouds",
399 |
400 | handler = function ()
401 | removeBuff( "gathering_clouds" )
402 | end,
403 |
404 | auras = {
405 | gathering_clouds = {
406 | id = 215294,
407 | duration = 60,
408 | max_stack = 10
409 | }
410 | }
411 | },
412 |
413 | shard_of_rokmora = {
414 | cast = 0,
415 | cooldown = 120,
416 | gcd = "off",
417 |
418 | item = 137338,
419 |
420 | toggle = "defensives",
421 |
422 | handler = function ()
423 | applyBuff( "crystalline_body" )
424 | end,
425 |
426 | auras = {
427 | crystalline_body = {
428 | id = 214366,
429 | duration = 30,
430 | max_stack = 1
431 | }
432 | }
433 | },
434 |
435 | talisman_of_the_cragshaper = {
436 | cast = 0,
437 | cooldown = 60,
438 | gcd = "off",
439 |
440 | item = 137344,
441 |
442 | toggle = "defensives",
443 |
444 | handler = function ()
445 | applyBuff( "stance_of_the_mountain" )
446 | end,
447 |
448 | auras = {
449 | stance_of_the_mountain = {
450 | id = 214423,
451 | duration = 15,
452 | max_stack = 1
453 | }
454 | }
455 | },
456 |
457 | tirathons_betrayal = {
458 | cast = 0,
459 | cooldown = 75,
460 | gcd = "off",
461 |
462 | item = 137537,
463 |
464 | toggle = "cooldowns",
465 |
466 | handler = function ()
467 | applyBuff( "darkstrikes" )
468 | end,
469 |
470 | auras = {
471 | darkstrikes = {
472 | id = 215658,
473 | duration = 15,
474 | max_stack = 1
475 | }
476 | }
477 | },
478 |
479 | orb_of_torment = {
480 | cast = 0,
481 | cooldown = 120,
482 | gcd = "off",
483 |
484 | item = 137538,
485 |
486 | toggle = "defensives",
487 |
488 | handler = function ()
489 | applyDebuff( "target", "soul_sap" )
490 | end,
491 |
492 | auras = {
493 | soul_sap = {
494 | id = 215936,
495 | duration = 20,
496 | max_stack = 1
497 | }
498 | }
499 | },
500 |
501 | moonlit_prism = {
502 | cast = 0,
503 | cooldown = 90,
504 | gcd = "off",
505 |
506 | item = 137541,
507 |
508 | toggle = "cooldowns",
509 |
510 | handler = function ()
511 | applyBuff( "elunes_light" )
512 | end,
513 |
514 | auras = {
515 | elunes_light = {
516 | id = 215648,
517 | duration = 20,
518 | max_stack = 20
519 | }
520 | }
521 | },
522 | } )
523 |
--------------------------------------------------------------------------------
/TheWarWithin/Priorities/DruidFeral.simc:
--------------------------------------------------------------------------------
1 | ## Upstream: https://github.com/simulationcraft/simc/blob/thewarwithin/ActionPriorityLists/default/druid_feral.simc
2 | ## SimulationCraft Commit Sync: 5340e2f
3 | ## Date: 2025-08-17
4 |
5 | ## [Syrif] - This APL is VERY edited with CelestialRepose's rubber stamp. The true feral APL has 29 variables in it to essentially min-max trinkets, and CD sync on long fights.
6 | actions.precombat+=/mark_of_the_wild
7 | actions.precombat+=/prowl,if=!buff.prowl.up
8 | actions.precombat+=/cat_form,if=!buff.cat_form.up
9 |
10 | actions+=/prowl,if=buff.bs_inc.down&!buff.prowl.up
11 | actions+=/cat_form,if=!buff.cat_form.up&!talent.fluid_form
12 | actions+=/skull_bash
13 | actions+=/soothe
14 | ## Line up Power Infusion with Berserk.
15 | ## actions+=/invoke_external_buff,name=power_infusion,if=buff.bs_inc.up|!talent.berserk_heart_of_the_lion
16 | actions+=/call_action_list,name=variable
17 | ## actions+=/stop_moving,if=gcd.remains=0&equipped.ovinaxs_mercurial_egg
18 | actions+=/tigers_fury,if=(energy.deficit>35|combo_points=5|combo_points>=3&dot.rip.refreshable&buff.bloodtalons.up&hero_tree.wildstalker)&(boss&fight_remains<=15|(cooldown.bs_inc.remains>20&fight_remains>5)|(cooldown.bs_inc.ready&fight_remains>12|boss))
19 | actions+=/rake,cycle_targets=1,if=buff.shadowmeld.up|buff.prowl.up
20 | actions+=/natures_vigil,if=variable.regrowth&health.percent<70&(buff.bs_inc.up|buff.tigers_fury.up)
21 | actions+=/renewal,if=variable.regrowth&health.percent<70
22 | actions+=/adaptive_swarm,cycle_targets=1,if=dot.adaptive_swarm_damage.stack<3&(!dot.adaptive_swarm_damage.ticking|dot.adaptive_swarm_damage.remains<2)&!action.adaptive_swarm.in_flight&(spell_targets=1|!talent.unbridled_swarm)&(dot.rip.ticking|hero_tree.druid_of_the_claw)
23 | actions+=/adaptive_swarm,cycle_targets=1,if=buff.cat_form.up&dot.adaptive_swarm_damage.stack<3&talent.unbridled_swarm.enabled&spell_targets.swipe_cat>1&dot.rip.ticking
24 | actions+=/ferocious_bite,if=buff.apex_predators_craving.up&!(variable.need_bt&active_bt_triggers=2)
25 | actions+=/call_action_list,name=cooldown,strict=1,if=dot.rip.ticking
26 | # with rip and tear, as wildstalker, we do 3cp rips
27 | actions+=/rip,if=talent.rip_and_tear&spell_targets=1&hero_tree.wildstalker&buff.tigers_fury.up&!buff.bs_inc.up&(buff.bloodtalons.up|!talent.bloodtalons)&(combo_points>=3&refreshable&cooldown.tigers_fury.remains>25|buff.tigers_fury.remains<5&variable.rip_duration>cooldown.tigers_fury.remains&cooldown.tigers_fury.remains>=dot.rip.remains)
28 | actions+=/call_action_list,name=builder,if=(buff.bs_inc.up&!buff.ravage.up&!buff.coiled_to_spring.up&hero_tree.druid_of_the_claw&talent.coiled_to_spring&spell_targets<=2)|buff.bloodtalons.stack=0&active_bt_triggers=2
29 | actions+=/wait,sec=cooldown.tigers_fury.remains,if=combo_points=5&cooldown.tigers_fury.remains>0&cooldown.tigers_fury.remains<3&spell_targets=1
30 | actions+=/call_action_list,name=finisher,if=combo_points=5
31 | ## [Syrif] - combo_points<5 added to stop from sending generators inappropriately
32 | actions+=/call_action_list,name=builder,if=spell_targets.swipe_cat=1&combo_points<5
33 | actions+=/call_action_list,name=aoe_builder,if=spell_targets.swipe_cat>=2&combo_points<5
34 | # if we cant do anything else, then sure, tigers fury early
35 | actions+=/tigers_fury
36 | actions+=/regrowth,if=buff.predatory_swiftness.up&variable.regrowth
37 |
38 | # maintain thrash highest prio
39 | actions.aoe_builder+=/thrash_cat,if=refreshable&!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)
40 | # avoid capping brs charges. Also send brutal slashes/ws swipe in aoe, even if we need to proc bloodtalons, during berserk.
41 | actions.aoe_builder+=/brutal_slash,if=(cooldown.brutal_slash.full_recharge_time<4|time_to_die<4|raid_event.adds.remains<4|(buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw))&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))
42 | actions.aoe_builder+=/swipe_cat,if=talent.wild_slashes&(time_to_die<4|raid_event.adds.remains<4|buff.bs_inc.up&spell_targets>=3-hero_tree.druid_of_the_claw)&!(variable.need_bt&buff.bt_swipe.up&(buff.bs_inc.down|spell_targets<3-hero_tree.druid_of_the_claw))
43 | # with wild slashes we swipe at 5+ targets over raking/moonfire
44 | actions.aoe_builder+=/swipe_cat,if=time_to_die<4|(talent.wild_slashes&spell_targets.swipe_cat>4&!(variable.need_bt&buff.bt_swipe.up))
45 | actions.aoe_builder+=/prowl,if=(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&gcd.remains=0&!buff.sudden_ambush.up&!buff.clearcasting.at_max_stacks
46 | actions.aoe_builder+=/shadowmeld,if=(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&action.rake.ready&!buff.sudden_ambush.up&!buff.prowl.up&!buff.clearcasting.at_max_stacks
47 | # dcr rake > moonfire
48 | actions.aoe_builder+=/rake,cycle_targets=1,if=refreshable&talent.doubleclawed_rake&!(variable.need_bt&buff.bt_rake.up)&!buff.clearcasting.at_max_stacks
49 | # at 3t with wild slashes, swipe is better than moonfiring/st rake
50 | actions.aoe_builder+=/swipe_cat,if=talent.wild_slashes&spell_targets.swipe_cat>2&!(variable.need_bt&buff.bt_swipe.up)
51 | # if wildstalker make sure you have at least one rake up
52 | actions.aoe_builder+=/rake,cycle_targets=1,if=!dot.rake.ticking&hero_tree.wildstalker
53 | # li moonfire is better than non-dcr rake in aoe if we already have 1 rake
54 | actions.aoe_builder+=/moonfire_cat,cycle_targets=1,if=refreshable&!(variable.need_bt&buff.bt_moonfire.up)&!buff.clearcasting.at_max_stacks
55 | actions.aoe_builder+=/rake,cycle_targets=1,if=refreshable&!(variable.need_bt&buff.bt_rake.up)&!buff.clearcasting.at_max_stacks
56 | ## fillers
57 | actions.aoe_builder+=/brutal_slash,if=!(variable.need_bt&buff.bt_swipe.up)
58 | actions.aoe_builder+=/swipe_cat,if=!(variable.need_bt&buff.bt_swipe.up)
59 | actions.aoe_builder+=/shred,if=!buff.sudden_ambush.up&!variable.easy_swipe&!(variable.need_bt&buff.bt_shred.up)
60 | actions.aoe_builder+=/thrash_cat,if=!talent.thrashing_claws&!(variable.need_bt&buff.bt_thrash.up)
61 | ## fallback bt actions
62 | actions.aoe_builder+=/rake,cycle_targets=1,if=talent.doubleclawed_rake&buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down
63 | actions.aoe_builder+=/moonfire_cat,cycle_targets=1,if=variable.need_bt&buff.bt_moonfire.down
64 | actions.aoe_builder+=/rake,cycle_targets=1,if=buff.sudden_ambush.up&variable.need_bt&buff.bt_rake.down
65 | actions.aoe_builder+=/shred,if=variable.need_bt&buff.bt_shred.down&!variable.easy_swipe
66 | actions.aoe_builder+=/rake,cycle_targets=1,if=dot.rake.pmultiplier<1.6&variable.need_bt&buff.bt_rake.down
67 | actions.aoe_builder+=/thrash_cat,if=variable.need_bt&buff.bt_thrash.down
68 |
69 | actions.builder+=/prowl,if=gcd.remains=0&energy>=35&!buff.sudden_ambush.up&(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&buff.tigers_fury.up&!buff.shadowmeld.up
70 | actions.builder+=/shadowmeld,if=gcd.remains=0&energy>=35&!buff.sudden_ambush.up&(dot.rake.refreshable|dot.rake.pmultiplier<1.4)&!(variable.need_bt&buff.bt_rake.up)&buff.tigers_fury.up&!buff.prowl.up
71 | # upgrade to stealth rakes, otherwise refresh in pandemic. Delay rake as long as possible if it would downgrade
72 | actions.builder+=/rake,if=((refreshable&persistent_multiplier>=dot.rake.pmultiplier|dot.rake.remains<3.5)|buff.sudden_ambush.up&persistent_multiplier>dot.rake.pmultiplier)&!(variable.need_bt&buff.bt_rake.up)&(hero_tree.wildstalker|!buff.bs_inc.up)
73 | # bt check is due to the overcap line, comes up with convoke/apex bites
74 | actions.builder+=/shred,if=buff.sudden_ambush.up&buff.bs_inc.up&!(variable.need_bt&buff.bt_shred.up&active_bt_triggers=2)
75 | actions.builder+=/brutal_slash,if=cooldown.brutal_slash.full_recharge_time<4&!(variable.need_bt&buff.bt_swipe.up)
76 | actions.builder+=/moonfire_cat,if=refreshable
77 | actions.builder+=/thrash_cat,if=refreshable&!talent.thrashing_claws&!buff.bs_inc.up
78 | actions.builder+=/shred,if=buff.clearcasting.up&!(variable.need_bt&buff.bt_shred.up)
79 | # pool energy if we need to refresh dot in the next 1.5s [Hekili] TODO: Sim character to see how frequently this fires, determine if `wait` value should be adjusted.
80 | actions.builder+=/pool_resource,if=variable.dot_refresh_soon&energy.deficit>70&!variable.need_bt&!buff.bs_inc.up&cooldown.tigers_fury.remains>3
81 | actions.builder+=/brutal_slash,if=!(variable.need_bt&buff.bt_swipe.up)
82 | actions.builder+=/shred,if=!(variable.need_bt&buff.bt_shred.up)
83 | actions.builder+=/rake,if=refreshable
84 | actions.builder+=/thrash_cat,if=refreshable&!talent.thrashing_claws
85 | actions.builder+=/swipe_cat,if=variable.need_bt&buff.bt_swipe.down
86 | # clip rake for bt if it wont downgrade its snapshot
87 | actions.builder+=/rake,if=variable.need_bt&buff.bt_rake.down&persistent_multiplier>=dot.rake.pmultiplier
88 | actions.builder+=/moonfire_cat,if=variable.need_bt&buff.bt_moonfire.down
89 | actions.builder+=/thrash_cat,if=variable.need_bt&buff.bt_thrash.down
90 |
91 | # Trinket usage - damage on CD, buffs with cooldowns or short holds, fallbacks for fight end
92 | actions.cooldown+=/use_item,slot=trinket1,use_off_gcd=1,if=trinket.1.has_use_damage&(trinket.2.cooldown.remains>20|!trinket.2.has_use_buff)|trinket.1.has_use_buff&(buff.bs_inc.up|cooldown.bs_inc.remains<5|cooldown.bs_inc.remains<20&cooldown.convoke_the_spirits.remains>30)|boss&fight_remains<20
93 | actions.cooldown+=/use_item,slot=trinket2,use_off_gcd=1,if=trinket.2.has_use_damage&(trinket.1.cooldown.remains>20|!trinket.1.has_use_buff)|trinket.2.has_use_buff&(buff.bs_inc.up|trinket.2.cooldown.duration<=cooldown.bs_inc.remains)&(!trinket.1.has_use_buff|trinket.1.cooldown.remains>20)|boss&fight_remains<20
94 | actions.cooldown+=/berserking,if=buff.bs_inc.up
95 | actions.cooldown+=/potion,if=buff.bs_inc.up|boss&fight_remains<32
96 | ## actions.cooldown+=/use_items
97 | ## actions.cooldown+=/do_treacherous_transmitter_task,if=buff.tigers_fury.up|fight_remains<22
98 | actions.cooldown+=/incarnation
99 | actions.cooldown+=/berserk
100 | actions.cooldown+=/feral_frenzy,if=combo_points<=1+buff.bs_inc.up
101 | # always line up convoke with berserk if you can
102 | actions.cooldown+=/convoke_the_spirits,if=boss&fight_remains<5|buff.bs_inc.up&buff.bs_inc.remains<5-talent.ashamanes_guidance|buff.tigers_fury.up&!(fight_remains(20+cooldown.bs_inc.remains)&cooldown.bs_inc.remains<60)&(combo_points<=4|buff.bs_inc.up&combo_points<=3)
103 |
104 | # maintain/upgrade pws, if we have 6.5+s left on pw, we will instead bite if we have rampant ferocity talented. Without rampant, we will bite a vined target with 6 or fewer targets. If we have Ravage, we use specifically Ravage at 7 or fewer targets.
105 | actions.finisher+=/primal_wrath,if=spell_targets.primal_wrath>1&((dot.primal_wrath.remains<6.5&!buff.bs_inc.up|dot.primal_wrath.refreshable)|(!talent.rampant_ferocity.enabled&(spell_targets.primal_wrath>1&!dot.bloodseeker_vines.ticking&!buff.ravage.up|spell_targets.primal_wrath>6+talent.ravage)))
106 | # rip if single target or pw isnt up. Rip with bloodtalons if talented. If tigers fury will be up before rip falls off, then delay refresh
107 | actions.finisher+=/rip,cycle_targets=1,if=refreshable&(!talent.primal_wrath|spell_targets=1)&(buff.bloodtalons.up|!talent.bloodtalons)&(buff.tigers_fury.up|dot.rip.remains=2
110 | ## actions.finisher+=/call_action_list,name=builder,if=buff.ravage.up&buff.preparing_to_strike.remains<2&buff.preparing_to_strike.up&buff.bs_inc.up
111 | ## [Hekili] Removing SbT wait and merging into Ferocious Bite conditions.
112 | ## [Hekili] Note: This takes advantage of the fact there are no other (real) recommendations after these FBs in the *whole* priority.
113 | ## actions.finisher+=/wait,sec=debuff.sabertooth.remains,if=debuff.sabertooth.up&energy.deficit>40
114 | actions.finisher+=/pool_resource,for_next=1
115 | actions.finisher+=/ferocious_bite,max_energy=1,cycle_targets=1,if=!buff.bs_inc.up&(debuff.sabertooth.down|energy.deficit<40)
116 | actions.finisher+=/pool_resource,for_next=1
117 | actions.finisher+=/ferocious_bite,cycle_targets=1,if=buff.bs_inc.up&(debuff.sabertooth.down|energy.deficit<40)
118 |
119 | # what rips new duration would be if applied in current state
120 | actions.variable+=/variable,name=rip_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))+(variable.rip_max_pandemic_duration>?dot.rip.remains)
121 | actions.variable+=/variable,name=rip_max_pandemic_duration,value=((4+(4*combo_points))*(1-(0.2*talent.circle_of_life_and_death))*(1+(0.25*talent.veinripper)))*0.3
122 | # this returns true if we have a dot nearing pandemic range
123 | actions.variable+=/variable,name=dot_refresh_soon,value=(!talent.thrashing_claws&(dot.thrash_cat.remains-dot.thrash_cat.duration*0.3<=2))|(talent.lunar_inspiration&(dot.moonfire_cat.remains-dot.moonfire_cat.duration*0.3<=2))|((dot.rake.pmultiplier<1.6|buff.sudden_ambush.up)&(dot.rake.remains-dot.rake.duration*0.3<=2))
124 | # try to proc bt if we have 1 or 0 stacks of bloodtalons
125 | actions.variable+=/variable,name=need_bt,value=talent.bloodtalons&buff.bloodtalons.stack<=1
126 | # optional variable that sends regrowth and renewal casts. Turned off by default
127 | actions.variable+=/variable,name=regrowth,op=reset,value=settings.regrowth
128 | # optional variable that forgoes shredding in AoE. Turned off by default
129 | actions.variable+=/variable,name=easy_swipe,op=reset
130 |
--------------------------------------------------------------------------------