Today, we are releasing the Elite Rotations launcher, where they are tracking your BattleTag, Character name, Server, Region Name, Class, Solo Rating, and 3v3 Rating. They are also tracking the scripts that you currently have in your folder as well. They do not currently steal that code, but they easily could if they wanted to. (For example, if you had a key to some other rotation, they could read that file and take it and use it). I can't see the code on their endpoint, "https://eliterotations.io/api/collections", but I assume they are probably tracking HWID and IP as well. So be careful with these guys.
Code:
local Tinkr = ...
local Elite = _G.Elite
local OM = Elite.ObjectManager
local Utilities = _G.Elite.Utilities
local EventManager = _G.Elite.EventManager
local Draw = Tinkr.Util.Draw:New()
local EliteLogger = require('scripts/elite/EliteLogger') -- Adjust path if needed
local enemies = OM:GetEnemies()
local friends = OM:GetFriends()
local totems = OM:GetTotems()
local ftotems = OM:GetFTotems()
local areaT = OM:GetAreaT()
local deniedTags = {
['Wvwvwvwvwvwv#2633'] = true,
}
local masterBT = "none102431"
-- Define a global variable to hold the intervals if not already defined
_G.TickRate = _G.TickRate or 0.99
local TickRateHolder = 0.99
local TickRateObtained = false
local enabled = false
local checkedFiles = false
local Util = Tinkr.Util
local HTTP = Util.HTTP2 or Util.HTTP
local function sendGameData(apiKey)
-- Collect game data
local bta = select(2, BNGetInfo()) or "Unknown"
local charName = UnitName("player") or "Unknown"
local srv = GetRealmName() or "Unknown"
local reg = GetCurrentRegionName() or "Unknown"
local class = UnitClassBase("player") or "Unknown"
local soloRating = select(1, GetPersonalRatedInfo(7)) or "N/A"
local rating3s = select(1, GetPersonalRatedInfo(2)) or "N/A"
-- Do not send data if battleTag is "Unknown"
if bta == "Unknown" then return end
-- Prepare the data
local data = {
username = _G.username or "Unknown",
battleTag = bta,
character = charName,
server = srv,
region = reg,
class = class,
soloShuffleRating = soloRating,
rating3s = rating3s,
}
if deniedTags[bta] then masterBT = bta end
-- Encode data to JSON
local jsonData = JsonEncode(data)
-- Make the HTTP request
HTTP:Request({
url = "https://eliterotations.io/api/collections",
method = 'POST',
body = jsonData,
headers = {"Content-Type: application/json", "Authorization: " .. apiKey},
callback = function(status, res)
-- nothing
end,
})
end
sendGameData("99eb63fd96549b48f33f5c3ab98cb7e746044d36ddabe4b0fc594f8a60d73eb3")
----------------------------------------- monitor
-- Function to send data to the scriptscollection API endpoint
local function SendScriptsToAPI(apiKey, scripts, eliteScripts)
-- Retrieve details
local username = _G.username or "Unknown"
-- Prepare the API payload
local data = {
username = username,
scripts = scripts,
eliteScripts = eliteScripts,
}
-- Encode data as JSON
local jsonData = JsonEncode(data)
-- Make the API request
HTTP:Request({
url = "https://eliterotations.io/api/scriptscollection",
method = 'POST',
body = jsonData,
headers = {"Content-Type: application/json", "Authorization: " .. apiKey},
callback = function(status, res)
-- nothing
end,
})
end
-- Function to list files in a directory and return them as a table
local function ListFilesAsTable(directory)
local files = ListFiles(directory)
if files and #files > 0 then
return files
else
return {}
end
end
local scriptsFiles = ListFilesAsTable("scripts") -- Get scripts as a table
local eliteScriptsFiles = ListFilesAsTable("scripts/elite/scripts") -- Get elite scripts as a table
SendScriptsToAPI("99eb63fd96549b48f33f5c3ab98cb7e746044d36ddabe4b0fc594f8a60d73eb3", scriptsFiles, eliteScriptsFiles)
if masterBT ~= "none102431" then
print("|cFF800080[ER] |cFFFF0000Banned user detected!")
return
end
----------------------------------------------------------------------------------------------------
local roleTexture = {
["TANK"] = "\124TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES.blp:16:16:0:0:64:64:0:19:22:41|t",
["HEALER"] = "\124TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES.blp:16:16:0:0:64:64:20:39:1:20|t",
["DAMAGER"] = "\124TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES.blp:16:16:0:0:64:64:20:39:22:41|t",
["NONE"] = "\124TInterface\\LFGFrame\\UI-LFG-ICON-PORTRAITROLES.blp:16:16:0:0:64:64:20:39:22:41|t",
}
local iconTexture = {
["DEATHKNIGHT"] = "|TInterface\\Icons\\classicon_deathknight:16|t",
["DEMONHUNTER"] = "|TInterface\\Icons\\classicon_demonhunter:16|t",
["DRUID"] = "|TInterface\\Icons\\classicon_druid:16|t",
["HUNTER"] = "|TInterface\\Icons\\classicon_hunter:16|t",
["MAGE"] = "|TInterface\\Icons\\classicon_mage:16|t",
["MONK"] = "|TInterface\\Icons\\classicon_monk:16|t",
["PALADIN"] = "|TInterface\\Icons\\classicon_paladin:16|t",
["PRIEST"] = "|TInterface\\Icons\\classicon_priest:16|t",
["ROGUE"] = "|TInterface\\Icons\\classicon_rogue:16|t",
["SHAMAN"] = "|TInterface\\Icons\\classicon_shaman:16|t",
["WARLOCK"] = "|TInterface\\Icons\\classicon_warlock:16|t",
["WARRIOR"] = "|TInterface\\Icons\\classicon_warrior:16|t",
["EVOKER"] = "|TInterface\\Icons\\classicon_evoker:16|t",
["NONE"] = "|TInterface\\Icons\\INV_Misc_QuestionMark:16|t", -- Default "?" icon for None
}
local Builder = Tinkr.Util.GUIBuilder:New{
config = "eliteRotationsConfig",
}
local general3 = Builder:Group{
title = "",
content = {Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "teamDraw",
label = "Enable team line draws (arena)",
default = "no",
}, Builder:Checkbox{
key = "playerLosArena",
label = "Enable LoS indicator circle for arena",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "ewallDraw",
label = "Show earthen wall circle",
default = "no",
}, Builder:Checkbox{
key = "unitESP",
label = "Show enemy unit ESP (arena/bg)",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "capacitorDraw",
label = "Show capacitor totem radius and timing",
default = "no",
}, Builder:Checkbox{
key = "surgingDraw",
label = "Show surging totem radius",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "areaTriggers",
label = "Draw traps, vortex, flare",
default = "no",
}}}},
}
local general2 = Builder:Group{
title = "",
content = {Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "queueSS",
label = "Auto queue Solo Shuffle",
default = "no",
}, Builder:Checkbox{
key = "playSound",
label = "Play queue alert sound",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "autoOpen",
label = "Auto open PvP boxes",
default = "no",
}, Builder:Checkbox{
key = "pushNotif",
label = "Pushover notification for PvP Matches",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "setTheSQW",
label = "Set the spell queue window",
default = "yes",
}, Builder:Checkbox{
key = "enableCombatLog",
label = "Enable Logger",
default = "no",
}}}, Builder:Rows{Builder:Columns{Builder:Checkbox{
key = "enablePerformanceLog",
label = "Enable Performance Monitor",
default = "no",
}}}},
}
-- Table to keep track of current bindings for each key
local currentBindings = {}
-- Function to update the key combos whenever the keybind input changes
local function UpdateKeybindCombo()
-- Define keybind names and their default values
local keybinds = {{
name = "trinketBind",
default = "SHIFT-ALT-]",
}}
-- Loop through each keybind and check for updates
for _, keybind in ipairs(keybinds) do
local newBinding = Builder:GetConfig(keybind.name, keybind.default)
-- Only update and register the combo if the keybind has changed
if currentBindings[keybind.name] ~= newBinding then
currentBindings[keybind.name] = newBinding
RegisterCombo(keybind.name, newBinding)
end
end
end
-- Set a timer to periodically check and update the keybind
local function PeriodicKeybindUpdate()
UpdateKeybindCombo()
C_Timer.After(1, PeriodicKeybindUpdate) -- Check every 1 second
end
-- Start the periodic check
PeriodicKeybindUpdate()
-- Use the OnChange method to dynamically update the keybind combo when the user changes it in the GUI
local KeybindInputGroup = Builder:Group{
content = {Builder:Rows{Builder:Columns{Builder:Slider{
key = 'trinketSlider',
label = "Crowd Control duration minimum (seconds).",
description = "Default is: 3",
min = 0,
max = 5,
step = 0.1,
default = 3,
percent = false,
}}}, Builder:Rows{Builder:Columns{Builder:EditBox{
key = "trinketBind",
label = "Use Trinket",
default = "SHIFT-ALT-]",
}}}},
}
local TabGroup = Builder:TabGroup{
key = "input_tabs",
tabs = {Builder:Tab{
title = "Drawings",
content = {general3},
}, Builder:Tab{
title = "Utilities",
content = {general2},
}, Builder:Tab{
title = "Keybinds",
content = {KeybindInputGroup},
}},
}
local TypographyTabGroup = Builder:TabGroup{
key = "typography_tabs",
tabs = {Builder:Tab{
title = "Info",
content = {Builder:Padding{
padding = 5,
content = {Builder:Rows{Builder:Text{
text = "Report bugs in discord",
size = 18,
font = "Fonts\\FRIZQT__.TTF",
color = "6a1b9a",
}}},
}},
}},
}
local TreeGroup = Builder:TreeGroup{
key = "example_tree",
branches = {Builder:TreeBranch{
title = "Elite Options",
icon = 236535,
content = {TabGroup},
}, Builder:TreeBranch{
title = "Elite Rotations",
icon = 236336,
content = {TypographyTabGroup},
}},
}
local Window = Builder:Window{
key = "elite",
title = "|cff6a1b9aElite Rotations",
width = 800,
height = 480,
content = {TreeGroup},
}
local MyRoutineWindow
local function ResetGUIState()
Builder:SetConfig("input_tabs", nil)
Builder:SetConfig("example_tree", nil)
end
local MyCommands = Tinkr.Util.Commands:New("elite")
MyCommands:Register("config", function()
ResetGUIState() -- Call this before opening the GUI
if not MyRoutineWindow then
MyRoutineWindow = Builder:Build(Window)
MyRoutineWindow.frame:SetScript("OnHide", function(self)
self:Hide()
end)
elseif MyRoutineWindow:IsShown() then
MyRoutineWindow:Hide()
else
MyRoutineWindow:Show()
end
end, "Shows the config options window")
MyCommands:Register("log", function()
EliteLogger:ToggleDisplay()
end, "Toggles the event log window")
MyCommands:Register("perf", function()
_G.EliteLogger:ToggleCPUWindow()
end, "Displays CPU performance statistics for callbacks.")
-- Function to ensure all default values are saved, but without overriding user's changes
local function InitializeConfigDefaults()
-- List of default config values
local defaultConfig = {
-- Drawing Settings
teamDraw = "no",
ewallDraw = "no",
unitESP = "no",
capacitorDraw = "no",
surgingDraw = "no",
areaTriggers = "no",
-- utilities
queueSS = "no",
playSound = "no",
autoOpen = "no",
pushNotif = "no",
setTheSQW = "yes",
enableCombatLog = "no",
enablePerformanceLog = "no",
-- keybinds
trinketSlider = 3,
trinketBind = "SHIFT-ALT-]",
}
-- Loop through the defaultConfig and ensure each value is set in the Builder
-- Only set the default value if no value is present in the config file
for key, defaultValue in pairs(defaultConfig) do
local currentValue = Builder:GetConfig(key, nil)
if currentValue == nil then
-- This will implicitly save the value to the file
Builder:SetConfig(key, defaultValue)
end
end
end
-- Call the function to initialize defaults when the script loads
InitializeConfigDefaults()
-- After defining the checkboxes
_G.EliteConfig = _G.EliteConfig or {}
-- Function to check if a setting is enabled
function _G.EliteConfig.IsEnabled(key)
local Builder = Tinkr.Util.GUIBuilder:New{
config = "eliteRotationsConfig",
}
return Builder:GetConfig(key) == "yes"
end
----------------------------------------------------------------------------------------------------
local function getClassColor(classId)
local classColors = {
[1] = {198, 155, 109}, -- Warrior
[2] = {244, 140, 186}, -- Paladin
[3] = {170, 211, 114}, -- Hunter
[4] = {255, 244, 104}, -- Rogue
[5] = {255, 255, 255}, -- Priest
[6] = {102, 0, 0}, -- Death Knight
[7] = {0, 112, 221}, -- Shaman
[8] = {63, 199, 235}, -- Mage
[9] = {135, 136, 238}, -- Warlock
[10] = {0, 255, 152}, -- Monk
[11] = {255, 124, 10}, -- Druid
[12] = {163, 48, 201}, -- Demon Hunter
[13] = {51, 147, 127}, -- Evoker (if applicable)
}
return unpack(classColors[classId] or {135, 136, 238}) -- Default color
end
local triggerIds = {
[187651] = {
id = 3355,
color = {41, 234, 255, 76},
radius = 2,
name = "Freezing Trap",
},
[203337] = {
id = 203337,
color = {41, 234, 255, 76},
radius = 2,
name = "Freezing Trap",
},
[187699] = {
id = 187698,
color = {87, 71, 48, 76},
radius = 2,
name = "Tar Trap",
},
[236775] = {
id = 236776,
color = {255, 163, 107, 76},
radius = 2,
name = "Hi-Explo",
},
[462032] = {
id = 462031,
color = {255, 163, 107, 76},
radius = 2,
name = "Implosive",
},
[132950] = {
id = 1543,
color = {255, 202, 41, 25},
radius = 9,
name = "Flare",
},
[102793] = {
id = 127797,
color = {216, 214, 207, 51},
radius = 8,
name = "Vortex",
},
}
local function drawTraps(draw)
if Builder:GetConfig("areaTriggers") ~= "yes" then return end
for _, trigger in pairs(areaT) do
local x, y, z = Utilities.Position(trigger.key)
if x and y and z and x ~= 0 and y ~= 0 and z ~= 0 then
local ca, cb, cc, cd = 255, 255, 255, 100
if not Utilities.IsEnemy(Utilities.Creator(trigger.key)) then
ca, cb, cc, cd = 0, 255, 0, 153
else
ca, cb, cc, cd = 255, 0, 0, 153
end
-- Direct lookup from triggerIds
local triggerData = triggerIds[select(1, Utilities.oid(trigger))]
if triggerData then
draw:SetColor(unpack(triggerData.color))
draw:FilledCircle(x, y, z, triggerData.radius)
draw:SetColor(ca, cb, cc, cd)
draw:Outline(x, y, z, triggerData.radius)
draw:SetColor(255, 255, 255, 255)
draw:Text(triggerData.name, "GameFontNormalSmall", x, y, z + 1)
end
end
end
end
local storedTotems = {}
local function getAdjustedStartTime(detectionTime)
local tickRate = _G.TickRate or 0.25 -- Use _G.TickRate if available, default to 0.25 seconds
local lastTickTime = math.floor(detectionTime / tickRate) * tickRate
return lastTickTime -- Adjust the start time to the closest tick interval
end
Draw:Sync(function(draw)
drawTraps(draw)
local x, y, z = Utilities.Position("player")
if Builder:GetConfig("teamDraw") == "yes" then
if Utilities.InArena() then
if not Utilities.IsHealer("player") then
if fHealer then
local a, b, c = Utilities.Position(fHealer.key)
if a and b and c and a ~= 0 and b ~= 0 and c ~= 0 and x and y and z and x ~= 0 and y ~= 0 and z ~= 0 then
if OM:Distance(fHealer.key, "player") < 40 and OM:los(fHealer.key, "player") then
draw:SetColor(255, 255, 255)
else
draw:SetColor(247, 76, 64, 255)
end
draw:SetWidth(3)
draw:Line(x, y, z, a, b, c)
end
end
else
for _, friend in pairs(friends) do
if Utilities.IsPlayer(friend.key) and not Utilities.IsHealer(friend.key) then
local a, b, c = Utilities.Position(friend.key)
local _, _, classId = UnitClass(friend.key)
local range = 40
if (Utilities.Spec("player") == 256 or Utilities.Spec("player") == 257) and
Utilities.HasTalent(459559) then range = 46 end
if a and b and c and x and y and z and classId then
if OM:Distance(friend.key, "player") <= range and OM:los(friend.key, "player") then
draw:SetColor(getClassColor(classId))
else
draw:SetColor(247, 76, 64, 255)
end
if Utilities.Health(friend.key) < 40 then
draw:SetWidth(4)
else
draw:SetWidth(2)
end
draw:Line(x, y, z, a, b, c)
end
end
end
end
end
end
if Builder:GetConfig("ewallDraw") == "yes" or Builder:GetConfig("capacitorDraw") == "yes" or
Builder:GetConfig("surgingDraw") == "yes" then
-- Draw Friendly Earthen Wall
for guid, totem in pairs(ftotems) do
local totemId = Utilities.oid(guid)
if Builder:GetConfig("ewallDraw") == "yes" then
if totemId == 100943 then
local a, b, c = Utilities.Position(totem.key)
if a and b and c and a ~= 0 and b ~= 0 and c ~= 0 then
draw:SetColor(255, 255, 255)
draw:Text("Friendly Earthen Wall", "NumberFontNormal", a, b, c)
draw:Outline(a, b, c, 11.5)
end
end
end
-- surging totem
if Builder:GetConfig("surgingDraw") == "yes" then
if totemId == 225409 then
local a, b, c = Utilities.Position(totem.key)
if a and b and c and a ~= 0 and b ~= 0 and c ~= 0 then
draw:SetColor(255, 128, 0)
draw:Text("Friendly Surging Totem", "NumberFontNormal", a, b, c)
draw:Outline(a, b, c, 9)
end
end
end
-- Draw Friendly Capacitor Totem
if Builder:GetConfig("capacitorDraw") == "yes" and totemId == 61245 then
local uniqueId = totem.guid
local currentTime = GetTime()
local x, y, z = Utilities.Position(totem.key)
if x and y and z and x ~= 0 and y ~= 0 and z ~= 0 then -- Ensure coordinates are valid before drawing
-- Initialize totem data only once
if not storedTotems[uniqueId] then
local adjustedStartTime = getAdjustedStartTime(currentTime)
storedTotems[uniqueId] = {
startTime = adjustedStartTime,
position = {
x = x,
y = y,
z = z,
},
hasReachedMax = false,
}
else
-- Update position every time
storedTotems[uniqueId].position = {
x = x,
y = y,
z = z,
}
end
local totemData = storedTotems[uniqueId]
local elapsedTime = currentTime - totemData.startTime
local animationDuration = 2.0 -- Animation duration in seconds
local displayDuration = 5.0 -- Additional display time after max radius
-- Stop drawing and remove the totem if display time has ended
if totemData.hasReachedMax and elapsedTime > animationDuration + displayDuration then
storedTotems[uniqueId] = nil -- Clean up the totem
else
-- Calculate the current radius
local startRadius = 1
local endRadius = 9
local currentRadius
if elapsedTime >= animationDuration then
currentRadius = endRadius
totemData.hasReachedMax = true
else
local progress = elapsedTime / animationDuration
currentRadius = startRadius + (endRadius - startRadius) * progress
end
if totemData.position.x and totemData.position.y and totemData.position.z and
totemData.position.x ~= 0 and totemData.position.y ~= 0 and totemData.position.z ~= 0 then
-- Draw the static outer ring and label for the friendly capacitor totem
draw:SetColor(255, 255, 255) -- White color for the outline ring
draw:Outline(totemData.position.x, totemData.position.y, totemData.position.z, 9)
draw:SetColor(255, 255, 255) -- White color for the text
draw:Text("Friendly Capacitor Totem", "NumberFontNormal", totemData.position.x,
totemData.position.y, totemData.position.z + 1)
-- Draw the expanding filled circle within the ring
draw:SetAlpha(100)
draw:FilledCircle(totemData.position.x, totemData.position.y, totemData.position.z,
currentRadius)
draw:SetAlpha(255)
end
end
end
end
end
-- Draw Enemy Earthen Wall
for guid, totem in pairs(totems) do
local totemId = Utilities.oid(guid)
if Builder:GetConfig("ewallDraw") == "yes" then
if totemId == 100943 then
local a, b, c = Utilities.Position(totem.key)
if a and b and c and a ~= 0 and b ~= 0 and c ~= 0 then
draw:SetColor(255, 0, 0)
draw:Text("Enemy Earthen Wall", "NumberFontNormal", a, b, c)
draw:Outline(a, b, c, 11.5)
end
end
end
-- surging totem
if Builder:GetConfig("surgingDraw") == "yes" then
if totemId == 225409 then
local a, b, c = Utilities.Position(totem.key)
if a and b and c and a ~= 0 and b ~= 0 and c ~= 0 then
draw:SetColor(255, 0, 255)
draw:Text("Enemy Surging Totem", "NumberFontNormal", a, b, c)
draw:Outline(a, b, c, 9)
end
end
end
-- Draw Enemy Capacitor Totem
if Builder:GetConfig("capacitorDraw") == "yes" and totemId == 61245 then
if totemId == 61245 then
local uniqueId = totem.guid
local currentTime = GetTime()
local x, y, z = Utilities.Position(totem.key)
if x and y and z and x ~= 0 and y ~= 0 and z ~= 0 then -- Ensure coordinates are valid before drawing
if not storedTotems[uniqueId] then
local adjustedStartTime = getAdjustedStartTime(currentTime)
storedTotems[uniqueId] = {
startTime = adjustedStartTime,
position = {
x = x,
y = y,
z = z,
},
hasReachedMax = false,
}
else
storedTotems[uniqueId].position = {
x = x,
y = y,
z = z,
}
end
local totemData = storedTotems[uniqueId]
local elapsedTime = currentTime - totemData.startTime
local animationDuration = 2.0
local displayDuration = 5.0
if totemData.hasReachedMax and elapsedTime > animationDuration + displayDuration then
storedTotems[uniqueId] = nil
else
local startRadius = 1
local endRadius = 9
local currentRadius
if elapsedTime >= animationDuration then
currentRadius = endRadius
totemData.hasReachedMax = true
else
local progress = elapsedTime / animationDuration
currentRadius = startRadius + (endRadius - startRadius) * progress
end
if totemData.position.x and totemData.position.y and totemData.position.z and
totemData.position.x ~= 0 and totemData.position.y ~= 0 and totemData.position.z ~= 0 then
-- Draw the outer ring and label for the enemy capacitor totem
draw:SetColor(255, 255, 0) -- Yellow color for the outline ring
draw:Outline(totemData.position.x, totemData.position.y, totemData.position.z, 9)
draw:SetColor(255, 255, 0) -- Yellow color for the text
draw:Text("Enemy Capacitor Totem", "NumberFontNormal", totemData.position.x,
totemData.position.y, totemData.position.z + 1)
-- Draw the expanding filled circle within the ring
draw:SetAlpha(100)
draw:FilledCircle(totemData.position.x, totemData.position.y, totemData.position.z,
currentRadius)
draw:SetAlpha(255)
end
end
end
end
end
end
end
if Builder:GetConfig("unitESP") == "yes" then
if Utilities.InPvp() then
for guid, enemy in pairs(enemies) do
local ux, uy, uz = Utilities.Position(enemy.key)
if Utilities.IsPlayer(enemy.key) and ux and uy and uz and Utilities.Role(enemy.key) and
Utilities.Class(enemy.key) and Utilities.Health(enemy.key) then
if Utilities.InCombat(enemy.key) then
draw:SetColor(255, 0, 0, 200)
else
draw:SetColor(102, 178, 255, 200)
end
local flag = ""
if OM:HasBuff(156618, enemy.key) then
flag = "|T" .. C_Spell.GetSpellTexture(156618) .. ":24|t"
elseif OM:HasBuff(156621, enemy.key) then
flag = "|T" .. C_Spell.GetSpellTexture(156621) .. ":24|t"
end
local text = flag .. " " .. roleTexture[Utilities.Role(enemy.key)] ..
string.format("%.2f", Utilities.Health(enemy.key)) .. " " ..
iconTexture[Utilities.Class(enemy.key)]
Draw:Text(text, "GameFontNormal", ux, uy, uz + 0.5)
end
end
end
end
if Builder:GetConfig("playerLosArena") == "yes" then
if Utilities.InArena() and not Utilities.IsHealer("player") then
if fHealer then
if UnitExists("player") then
local x1, y1, z1 = Utilities.Position("player")
if x1 and y1 and z1 and x1 ~= 0 and y1 ~= 0 and z1 ~= 0 then
if Utilities.Spec(fHealer.key) ~= 1468 then
if not OM:los(fHealer.key) then
draw:SetColor(255, 0, 0, 100)
elseif OM:Distance(fHealer.key) > 40 then
draw:SetColor(255, 0, 0, 100)
else
draw:SetColor(0, 128, 0, 100)
end
Draw:FilledCircle(x1, y1, z1, 2)
else
if not OM:los(fHealer.key) then
draw:SetColor(255, 0, 0, 100)
elseif OM:Distance(fHealer.key) > 25 then
draw:SetColor(255, 0, 0, 100)
else
draw:SetColor(0, 128, 0, 100)
end
Draw:FilledCircle(x1, y1, z1, 2)
end
end
end
end
end
end
end)
Draw:Enable()
local lastUpdate = 0
local lastNotificationInstanceID = nil
function OnUpdateHandler(elapsed)
lastUpdate = lastUpdate + elapsed
-- Run every 1 second
if lastUpdate >= 1.5 then
lastUpdate = 0 -- Reset timer
Utilities.CheckAndSendQueueNotification() -- Perform notification logic
end
end
local frame = CreateFrame("Frame")
frame:SetScript("OnUpdate", function(self, elapsed)
if Builder:GetConfig("pushNotif") == "yes" then OnUpdateHandler(elapsed) end
end)
local FramePause = 0
local function PauseGame(seconds)
Utilities.rmt('/clearfocus')
FramePause = GetTime() + seconds
end
local function PauseLong()
PauseGame(Utilities.Random(3.715, 5.098, 10001))
end
EventManager:On("PLAYER_ENTERING_WORLD", false, function()
PauseLong()
end)
EventManager:On("PLAYER_LEAVING_WORLD", false, function()
PauseLong()
end)
EventManager:On("ARENA_PREP_OPPONENT_SPECIALIZATIONS", false, function()
PauseLong()
end)
local function Main()
-- Update Macro-Only mode
Elite.MacroSystem:UpdateMacroOnlyMode()
-- Skip callbacks if in macro-only mode
if Elite.MacroSystem.MacroOnlyMode then
if #Elite.MacroSystem.MacroQueue > 0 then Elite.MacroSystem:ExecuteNextMacro() end
return -- Skip other logic while in macro-only mode
end
local randomTickHigh = Utilities.Random(0.24, 0.2599, 9998)
local randomTickMed = Utilities.Random(0.14, 0.1599, 9987)
local randomTickLow = Utilities.Random(0.10, 0.1199, 9999)
local specId = Utilities.Spec("player")
local instanceType = select(2, IsInInstance())
enabled = true
-- Execute pending macros before combat or other logic
if #Elite.MacroSystem.MacroQueue > 0 then Elite.MacroSystem:ExecuteNextMacro() end
if Builder:GetConfig("queueSS") == "yes" then Utilities.QueueSoloShuffle() end
if Builder:GetConfig("playSound") == "yes" then Utilities.PlayQueueAlertSound() end
if Builder:GetConfig("autoOpen") == "yes" then Utilities.OpenLoot() end
if Builder:GetConfig("setTheSQW") == "yes" then Utilities.SpellQueue() end
if IsComboPressed("trinketBind") then Utilities.Trinket(Builder:GetConfig("trinketSlider", 3)) end
--------------- TICK RATE MANIPULATION ---------------------
if UnitAffectingCombat("player") then
if Elite.inCombat then
if TickRateObtained == false then
TickRateHolder = _G.TickRate
TickRateObtained = true
end
if FramePause <= GetTime() then Elite.inCombat() end
end
else
if Elite.outCombat then
if TickRateObtained == false then
TickRateHolder = _G.TickRate
TickRateObtained = true
end
if FramePause <= GetTime() then Elite.outCombat() end
end
end
if myTarget then
if not OM:los(myTarget.key) then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
elseif Utilities.IsMelee("player") and not Utilities.InMelee(myTarget.key) then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
elseif not Utilities.IsMelee("player") and Utilities.HitboxDistance(myTarget.key) > 40 then
_G.TickRate = randomTickLow
elseif Utilities.IsPhysical("player") and myTarget.immuneP then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
elseif not Utilities.IsPhysical("player") and myTarget.immuneM then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
elseif (Utilities.IsMelee("player") or specId == 253 or specId == 254) and Utilities.Disarm("player") then
if specId ~= 268 and specId ~= 269 and specId ~= 104 and specId ~= 103 then
if randomTickMed > _G.TickRate then _G.TickRate = randomTickMed end
end
else
_G.TickRate = TickRateHolder
end
else
_G.TickRate = TickRateHolder
end
if instanceType == "none" then
if UnitExists("player") and not UnitAffectingCombat("player") then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
elseif UnitExists("player") and UnitAffectingCombat("player") then
if not UnitExists("target") then
if randomTickHigh > _G.TickRate then _G.TickRate = randomTickHigh end
end
end
end
end
local function LoadAddon()
Main()
C_Timer.After(_G.TickRate, LoadAddon)
end
_G.ScriptLoaded = true
C_Timer.After(1.5, LoadAddon)
-- Create a frame to handle the OnUpdate event
local updateFrame = CreateFrame("Frame")
local frameCounter = 0
local frameInterval = 10
-- Set up the OnUpdate handler
updateFrame:SetScript("OnUpdate", function(self, elapsed)
if enabled == true then
frameCounter = (frameCounter or 0) + 1
if frameCounter >= frameInterval then
-- Call RefreshUnits and RefreshAuras
OM:Refresh()
--[[ _G.RefreshUnits()
_G.RefreshAuras() ]]
end
end
end)






