Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
328059f
MoP Classic Support
CuteOne Aug 17, 2025
ecb6b42
Feral - Bug Fixes
CuteOne Aug 18, 2025
4d4409f
Feral - Only if the buff doesnt exist
CuteOne Aug 18, 2025
3f83391
Feral - More Fixes and Spell online
CuteOne Aug 18, 2025
85aab77
QuestTracker - solved API error
CuteOne Aug 19, 2025
87f0694
Testing potential Tinkr fix
CuteOne Aug 19, 2025
7c4cb6d
its return not reeturn
CuteOne Aug 19, 2025
5d5eea7
Let's try Object instead of ObjectUnit
CuteOne Aug 19, 2025
c654218
Revert "Let's try Object instead of ObjectUnit"
CuteOne Aug 19, 2025
c324a64
QuestTracker - bug fix
CuteOne Aug 19, 2025
199a6c7
Let's try this
CuteOne Aug 19, 2025
cc61bea
Tinkr wrapper tweaks
CuteOne Aug 19, 2025
a99e642
Update tinkr.lua
CuteOne Aug 19, 2025
523d9db
Update tinkr.lua
CuteOne Aug 19, 2025
dba524d
Update tinkr.lua
CuteOne Aug 20, 2025
20c5257
Update tinkr.lua
CuteOne Aug 20, 2025
6c13757
Reenable Unit function overrides
CuteOne Aug 20, 2025
eb77301
Comment out AuraUtil
CuteOne Aug 20, 2025
93f9275
Tinkr - remove :unit()
CuteOne Aug 20, 2025
d406ede
TInkr - Objectively Speaking
CuteOne Aug 20, 2025
5a70637
Does not need to be objectified
CuteOne Aug 20, 2025
7de19f1
Hey should it be IsSpellInRange not InSpellInRange?
CuteOne Aug 20, 2025
96aaa63
let's just not then
CuteOne Aug 20, 2025
ad86245
Readding...
CuteOne Aug 20, 2025
ba5d6c8
secret code
CuteOne Aug 20, 2025
f35380b
bad secret
CuteOne Aug 20, 2025
b21e57d
Let's try removing the function wrappers again
CuteOne Aug 20, 2025
249ff06
Debugging
CuteOne Aug 20, 2025
a3f262f
Only return if value
CuteOne Aug 20, 2025
d476bed
What about this
CuteOne Aug 20, 2025
2f03da3
oops not ...
CuteOne Aug 20, 2025
9fabd24
another one
CuteOne Aug 20, 2025
5218a98
maybe?
CuteOne Aug 20, 2025
65d9126
System - Updates for MoP Classic
CuteOne Sep 2, 2025
fa9af89
Feral - Updated for MoP Classic
CuteOne Sep 2, 2025
856f614
System - Reorganization
CuteOne Oct 4, 2025
c413e4f
Feral - Update to level 90
CuteOne Oct 4, 2025
03393e3
Windwalker Monk
CuteOne Oct 4, 2025
6c243fb
More stuff and things
CuteOne Oct 6, 2025
6e6e13c
Fixes and updates
CuteOne Oct 7, 2025
2b37671
More mass changes
CuteOne Oct 12, 2025
c07d3fe
Feral - Fixes
CuteOne Oct 12, 2025
65e6681
Tracking Engine - Quest Tracker Fixes
CuteOne Oct 12, 2025
59db7e2
More Updates
CuteOne Oct 19, 2025
00ba60b
Another update
CuteOne Oct 27, 2025
5cb75c4
More fixes
CuteOne Oct 28, 2025
1567a71
Another mass update
CuteOne Nov 1, 2025
ea38c75
More updates including Sub Rogue
CuteOne Nov 17, 2025
923c4ec
More non-descript updates
CuteOne Dec 2, 2025
d15dc3c
Latest including Arms Warrior
CuteOne Dec 7, 2025
4915b8d
More updates
CuteOne Dec 16, 2025
22f0fe6
Another mass system change
CuteOne Jan 2, 2026
e9f2259
Rotation updates
CuteOne Jan 2, 2026
baf785a
Enhancement Update
CuteOne Jan 3, 2026
003afdb
Merging codebase to work regardless of WoW Version
CuteOne Jan 17, 2026
7a653a1
Update for TBC Anniversary
CuteOne Feb 3, 2026
52eb0c5
Use proxy calls
CuteOne Feb 3, 2026
e4c00f9
TBC Druid Cat Working Order
CuteOne Feb 3, 2026
93b0ddf
More updates
CuteOne Feb 17, 2026
922df4f
More Druid TBC / Shaman TBC updates
CuteOne Feb 28, 2026
335b00c
System optimization improvements
CuteOne Mar 15, 2026
09a0590
ID reference fixes
CuteOne Mar 23, 2026
08dedb9
Linter Warning Fixes
CuteOne Mar 23, 2026
9cd1cb1
TBC Shaman - Interrupt Fix
CuteOne Mar 23, 2026
cbb67e8
TBC Druid - Several Tweaks
CuteOne Mar 23, 2026
6e05dbc
Merge branch 'master' into mopc
CuteOne Mar 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,5 @@ Settings/*
Unlockers/mmb.lua
Unlockers/daemonic.lua
Unlockers/icc.lua
Rotations/Rogue/Outlaw/OutlawRavens\.lua
Rotations/Rogue/Outlaw/OutlawRavens\.lua
Deprecated/*
93 changes: 54 additions & 39 deletions 3rd Party Files/NoName/_BRLoader.lua
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
local Nn = ...

-- if --[[(...).name ~= "Nn" or]] Nn == nil then return end
-- local read = Nn.Utils.Storage.read
-- local write = Nn.Utils.Storage.write
-- local JSON = Nn.Utils.JSON
-- local AceGUI = Nn.Utils.AceGUI

--Only load BR if in retail 10.2.7 (UI Update); Classic/Cata Not Supported.
if select(4,GetBuildInfo()) < 100207 then return end
-- if select(4,GetBuildInfo()) < 100207 then return end

local toc = ""
local tocPath = '/scripts/BadRotations/BadRotations.toc'
local FileExists = _G["FileExists"]
local ReadFile = _G["ReadFile"]
if not FileExists(tocPath) then print(tocPath, 'does not exist') return end
if FileExists(tocPath) then
toc = ReadFile(tocPath)
else
print('TOC file does not exist:', tocPath)
end

local toc = ReadFile('/scripts/BadRotations/BadRotations.toc')
local br = {}
br.files = {}

Expand Down Expand Up @@ -51,46 +62,50 @@ br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalStyle-1.0/Media/UbuntuM
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalStyle-1.0/Media/UbuntuMono-R.ttf', load = true}

-- Add Lua Files from .toc
for line in toc:gmatch("([^\n]*)\n?") do
local thisLine = line:trim()
if thisLine:find('#') == nil and thisLine:len() > 0
and thisLine:find('.lua') ~= nil
then
thisLine = thisLine:gsub("\\","/")
thisLine = thisLine:gsub(" ","")
thisLine = thisLine:gsub(".lua","")
thisLine = 'BadRotations/'..thisLine
br.files[#br.files+1] = {
file = thisLine,
load = true
}
-- Lua Files loaded via XML Files
if thisLine == "BadRotations/Libs/DiesalStyle-1.0/DiesalStyle-1.0" then
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/DiesalGUI-1.0', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Window', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollFrame', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollingEditBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollingMessageFrame', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/CheckBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Button', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Spinner', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Input', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Dropdown', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/DropdownItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ComboBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ComboBoxItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Accordian', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/AccordianSection', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Tree', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Branch', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Bar', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/DiesalMenu-1.0', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/Objects/MenuItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/Objects/Menu', load = true}
function LoadFilesFromTOC(tocFile)
for line in tocFile:gmatch("([^\n]*)\n?") do
local thisLine = line:trim()
if thisLine:find('#') == nil and thisLine:len() > 0
and thisLine:find('.lua') ~= nil
then
thisLine = thisLine:gsub("\\","/")
thisLine = thisLine:gsub(" ","")
thisLine = thisLine:gsub(".lua","")
thisLine = 'BadRotations/'..thisLine
br.files[#br.files+1] = {
file = thisLine,
load = true
}
-- Lua Files loaded via XML Files
if thisLine == "BadRotations/Libs/DiesalStyle-1.0/DiesalStyle-1.0" then
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/DiesalGUI-1.0', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Window', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollFrame', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollingEditBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ScrollingMessageFrame', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/CheckBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Button', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Spinner', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Input', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Dropdown', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/DropdownItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ComboBox', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/ComboBoxItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Accordian', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/AccordianSection', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Tree', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Branch', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalGUI-1.0/Objects/Bar', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/DiesalMenu-1.0', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/Objects/MenuItem', load = true}
br.files[#br.files+1] = {file = 'BadRotations/Libs/DiesalMenu-1.0/Objects/Menu', load = true}
end
end
end
end

LoadFilesFromTOC(toc)

-- Unlocker Lua Files
br.files[#br.files+1] = {file = 'BadRotations/Unlockers/tinkr', load = false}
br.files[#br.files+1] = {file = 'BadRotations/Unlockers/nn', load = true}
Expand All @@ -109,4 +124,4 @@ end
if UnitExists('player') then
print "[Nn] Loading BR"
br.load()
end
end
69 changes: 0 additions & 69 deletions BR2-ROADMAP.md

This file was deleted.

60 changes: 30 additions & 30 deletions BadRotations API.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,54 +13,54 @@

---

`br.UnitBuffID(UnitID, SpellID, Filter) - 1/nil` Returns 1 if Buff found on target
`br.UnitDebuffID(UnitID, SpellID, Filter) - 1/nil` Returns 1 if Debuff found on target
`br.functions.aura:UnitBuffID(UnitID, SpellID, Filter) - 1/nil` Returns 1 if Buff found on target
`br.functions.aura:UnitDebuffID(UnitID, SpellID, Filter) - 1/nil` Returns 1 if Debuff found on target
**CAN - Booleans**

---

`canAttack(Unit1,Unit2) - Bool` Returns true if Unit1 can attack Unit2
`br.canDispel(Unit,spellID) - Bool` Retruns true if the Unit have a valid Dispel
`br.functions.aura:canDispel(Unit,spellID) - Bool` Retruns true if the Unit have a valid Dispel
`canHeal(Unit) - Bool` Returns true if we can heal that Unit
`br.canInterrupt(spellID,percentint) - Bool` Returns true if we can Interrupt that target
`br.functions.spell:canInterrupt(spellID,percentint) - Bool` Returns true if we can Interrupt that target
`canPrepare() - Bool` Returns true if ready to buff(ooc)
`br.canRun() - Bool` Returns true if we can Run profile(incombat)
`br.canUseItem(itemID) - Bool` Returns true if the item can be used
`br.functions.action:canRun() - Bool` Returns true if we can Run profile(incombat)
`br.functions.item:canUseItem(itemID) - Bool` Returns true if the item can be used
**CAST - Function Methods**

---

`castGround(Unit,SpellID,maxDistance)` Used to cast Spells on ground. Returns true if everything passes.
`castGroundBetween(Unit,SpellID,maxDistance) ` Used to ground cast between yourself and target. Returns true if everything passes.
`castHealGround(SpellID,Radius,Health,NumberOfPlayers)` Used to ground cast between lowest br.friend members. Returns true if everything passes.
`castHealGround(SpellID,Radius,Health,NumberOfPlayers)` Used to ground cast between lowest br.engines.healingEngine.friend members. Returns true if everything passes.
[castSpell(Unit,SpellID,FacingCheck,MovementCheck,SpamAllowed,KnownSkip)](https://github.com/CuteOne/BadRotations/wiki/castSpell-Method#castspell) Used to cast Spells. Returns true if everything passes.
**GET - Mixed**

---

`getAllies(Target,Radius) - Table` Returns a table of the allies found within Radius of the target
`br.getBuffRemain(Unit,BuffID) - Num` Returns how long remain on this Unit buff.
`br.getBuffStacks(Unit,BuffID) - Num` Returns number of stacks of this Units buff.
`br.getCombatTime() - Num` Returns time since combat started.
`br.functions.aura:getBuffRemain(Unit,BuffID) - Num` Returns how long remain on this Unit buff.
`br.functions.aura:getBuffStacks(Unit,BuffID) - Num` Returns number of stacks of this Units buff.
`br.functions.combat:getCombatTime() - Num` Returns time since combat started.
`getCreatureType(Unit) - Bool` Returns true if Unit is not a pet battle or a totem.
`getCombo() - Num` Returns combo points on current target.
`br.getDebuffRemain(Unit,DebuffID) - Num` Returns how long remain on this Units Debuff.
`br.getDebuffStacks(Unit,DebuffID) - Num` Returns number of stacks of this Units Debuff.
`br.getDistance(Unit1,Unit2) - Num` Returns distance to target in yards.
`br.getEnemies(Target,Radius) - Table` Returns a table of the Enemies found within Radius of the target
`br.getFacing(Unit1,Unit2) - Bool` Returns true if Unit1 is facing Unit2
`br.functions.aura:getDebuffRemain(Unit,DebuffID) - Num` Returns how long remain on this Units Debuff.
`br.functions.aura:getDebuffStacks(Unit,DebuffID) - Num` Returns number of stacks of this Units Debuff.
`br.functions.range:getDistance(Unit1,Unit2) - Num` Returns distance to target in yards.
`br.engines.enemiesEngineFunctions:getEnemies(Target,Radius) - Table` Returns a table of the Enemies found within Radius of the target
`br.functions.unit:getFacing(Unit1,Unit2) - Bool` Returns true if Unit1 is facing Unit2
`getFallTime() - Num` Returns the time the character has been falling.
`getGround(Unit) - Bool` Returns true if ground is found under the target
`br.getHP(Unit) - Num` Returns Unit HP %
`br.getLineOfSight(Unit1,Unit2) - Bool` Returns true if the Unit1 can see Unit2
`getLowAllies(Value) - Num` Returns number of units under Value HP in br.friend
`br.functions.unit:getHP(Unit) - Num` Returns Unit HP %
`br.functions.misc:getLineOfSight(Unit1,Unit2) - Bool` Returns true if the Unit1 can see Unit2
`getLowAllies(Value) - Num` Returns number of units under Value HP in br.engines.healingEngine.friend
`getMana(Unit) - Num` Returns Unit Mana %
`getNumEnemies(Target,Radius) - Num` Returns number of Enemies found within Radius of the target
`getPetLineOfSight(Unit) - Bool` Returns true if our pet is in sight of target
`br.getPower(Unit) - Num` Returns Unit Power %
`br.getRegen(Unit) - Num` Returns power regen rate of Unit
`br.functions.power:getPower(Unit) - Num` Returns Unit Power %
`br.functions.power:getRegen(Unit) - Num` Returns power regen rate of Unit
`round2(num, idp) - Num` Used to round numbers
`br.getSpellCD(SpellID) - Num` Returns how long remain until the CD is ready
`br.functions.spell:getSpellCD(SpellID) - Num` Returns how long remain until the CD is ready
`getTimeToDie(unit) - Num` Returns approximative Time To Die for Unit
`getTimeToMax(Unit) - Num` Returns how long it will take until our ressources are maxed
`getTotemDistance(Unit1) - Num` Returns distance from totem to target
Expand All @@ -74,18 +74,18 @@

---

`br.isAlive(Unit) - Bool` Returns true if Unit is alive
`br.isBoss() - Bool` Returns true if a boss is found in boss 1-2-3-4-5
`br.functions.unit:isAlive(Unit) - Bool` Returns true if Unit is alive
`br.functions.unit:isBoss() - Bool` Returns true if a boss is found in boss 1-2-3-4-5
`isBuffed(UnitID,SpellID,TimeLeft) - Bool` Rturns true if Unit have at least Timeleft remaining on SpellId Buff
`isCasting(SpellID,Unit) - Bool` Returns true if Unit is casting given spell
`br.isCastingSpell(spellID) - Bool` returns true if WE are casting spellid
`br.isDummy(Unit) - Bool` Returns true if Unit is a dummy
`br.functions.cast:isCastingSpell(spellID) - Bool` returns true if WE are casting spellid
`br.functions.unit:isDummy(Unit) - Bool` Returns true if Unit is a dummy
`isEnnemy(Unit) - Bool` Returns true if we can attack the Unit
`isGarrMCd(Unit) - Bool` Returns true if Unit if affected by Garrosh MC
`isInCombat(Unit) - Bool` Returns true if Unit is in combat
`isInMelee(Unit) - Bool` Returns true if we are withing 4 yard of the Unit
`isInPvP() - Bool` Returns true if we are in PvP
`br.isKnown(spellID) - Bool` Returns true if we know this spell(via spellbook check)
`br.functions.spell:isKnown(spellID) - Bool` Returns true if we know this spell(via spellbook check)
`isLooting() - Bool` Returns true if we are currently looting
`isMoving(Unit) - Num` Returns Unit movement speed
`IsMovingTime(time) - Bool` Returns true if we have been moving for time seconds
Expand All @@ -95,19 +95,19 @@

---

`makeEnemiesTable()` - does not return anything but create br.enemy that hold br.enemy[i].unit br.enemy[i].distance and br.enemy[i].hp of all enemies in 40 yards
`makeEnemiesTable()` - does not return anything but create br.engines.enemiesEngine.enemy that hold br.engines.enemiesEngine.enemy[i].unit br.engines.enemiesEngine.enemy[i].distance and br.engines.enemiesEngine.enemy[i].hp of all enemies in 40 yards
`nDbDmg(tar, spellID, player) - Num` Returns tooltip damage
`pause() - Bool` Returns true if pause is engaged
`castingUnit() - Bool` Returns true is said unit is casting.
`br.useItem(itemID)` Use item via ID
`br.functions.item:useItem(itemID)` Use item via ID
`shouldStopCasting(SpellID) - Bool` Built into casts methods. Prevents spell locking.
**Config Queries - Mixed**

---

`br.isChecked(Value) - Bool` Returns true if Value Checkbox is checked in UI
`br.functions.misc:isChecked(Value) - Bool` Returns true if Value Checkbox is checked in UI
`isSelected(Value) - Bool` Returns true if Value Checkbox is checked in UI and CD requirements are met.
`br.getValue(Value) - Num` Returns drop or box Value from UI
`br.functions.misc:getValue(Value) - Num` Returns drop or box Value from UI
`CreateNewCheck(value, textString, tip1, state)`

- Used to create checkboxes in UI
Expand Down
Loading
Loading