Register for your free account! | Forgot your password?

Go Back   elitepvpers > Popular Games > World of Warcraft
You last visited: Today at 05:12

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Elite Rotations Tracking User Information

Discussion on Elite Rotations Tracking User Information within the World of Warcraft forum part of the Popular Games category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jan 2025
Posts: 1
Received Thanks: 1
Elite Rotations Tracking User Information

Hello friends. We are the wow script police, we are here to make you aware of potentially malicious things that the developers in the community are doing to you without your knowledge, since the Unlocker devs don't seem to really care.

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)
wow_script_police is offline  
Thanks
1 User
Old 01/20/2025, 21:39   #2
 
tamedbeast's Avatar
 
elite*gold: 0
Join Date: Sep 2017
Posts: 1,183
Received Thanks: 560
To be fair this is pretty common in the unlocker addon space. If it should be done is another thing.

Now if they're stealing your Anime ****, that's crossing the line.
tamedbeast is offline  
Old 01/21/2025, 16:43   #3
 
elite*gold: 0
Join Date: Dec 2017
Posts: 10
Received Thanks: 0
Does anyone have an invite code or mind vouching for me to join this community?
rslueshi is offline  
Old 01/26/2025, 00:32   #4
 
elite*gold: 0
Join Date: Jan 2025
Posts: 8
Received Thanks: 0
where do we get an invite code for elite rotations?
Bswn is offline  
Old 02/21/2025, 23:26   #5
 
elite*gold: 0
Join Date: Jul 2016
Posts: 23
Received Thanks: 9
Why would anyone even touch these? The same unlocker and rotations have been around under similar or identical names for so long, and they've all been hit multiple times. Touching these is a death wish. Get in touch with a programmer (<) who’s interested in the game and can build something worthy, semi-private and non-invasive (Not talking about scam crappy AHKs) that performs even better than these if well maintained (at least for DPS and tank, though probably less optimized for healing).
trooper2015 is offline  
Reply


Similar Threads Similar Threads
[Windows/OSX] Soapbox Rotations Free Level 1-99 Automated Rotations
08/11/2016 - WoW Exploits, Hacks, Tools & Macros - 21 Replies
http://puu.sh/kdpCP/8311150574.jpg Soapbox Rotations - WoW Rotation Bot <Post Updated: 5/1/2016>
[Soapbox Rotations] Automated FFXIV Rotations (All base classes are free)
11/21/2015 - Final Fantasy XIV - 6 Replies
= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = Rotations for Final Fantasy XIV: Heavensward = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ~ Supports : Windows: DirectX 9.0 ~ = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =



All times are GMT +1. The time now is 05:12.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.