-- [[ Rscripts Risk Notice ]]
-- This script is not verified by rscripts.net. Deal with caution.
--
-- Stay safe:
-- • Never log in on unofficial Roblox sites or lookalike domains.
-- • Real Roblox links use roblox.com (check the .com ending).
-- • Treat fake Roblox login / "claim reward" pages as phishing.
-- [[ End Rscripts Risk Notice ]]
local ENV = (typeof(getgenv) == "function" and getgenv()) or _G
if ENV.ElementalShowdownUnload then
pcall(ENV.ElementalShowdownUnload)
end
local Config = {
GuiName = "Elemental Showdown",
SaveFolder = "ElementalShowdown",
MenuKeybind = "RightControl",
RemotePath = { "ReplicatedStorage", "EBShared", "Remotes" },
RemoteNames = {
ApplyDamage = "ApplyDamage",
UseAbility = "UseAbility",
UpdateAim = "UpdateAim",
StatsUpdated = "StatsUpdated",
AbilityFeedback = "AbilityFeedback",
},
RemoteBudget = 110,
KillAura = {
Damage = 1000,
Radius = 250,
HitsPerSecond = 9,
MaxTargets = 10,
ComboMax = 4,
ScanInterval = 0.35,
},
Farm = {
CastInterval = 0.4,
RetryDelay = 2.5,
StunBackoff = 1.2,
Radius = 900,
Charge = 0,
ElementRefresh = 2,
},
Movement = {
Speed = 60,
},
NoobFarm = {
Offset = Vector3.new(0, 0, 4),
TeleportInterval = 0.12,
Tolerance = 7,
RepickInterval = 0.4,
SwitchDelay = 3.5,
},
ElementPoll = 1,
}
local function cloneService(instance)
if typeof(cloneref) == "function" then
local ok, result = pcall(cloneref, instance)
if ok and result then
return result
end
end
return instance
end
local Players = cloneService(game:GetService("Players"))
local RunService = cloneService(game:GetService("RunService"))
local UserInputService = cloneService(game:GetService("UserInputService"))
local ReplicatedStorage = cloneService(game:GetService("ReplicatedStorage"))
local Workspace = game:GetService("Workspace")
local LocalPlayer = Players.LocalPlayer
local tableInsert = table.insert
local tableClear = table.clear
local clock = os.clock
local jumpingState = Enum.HumanoidStateType.Jumping
local State = { KillAura = false, AutoFarm = false, Speed = false, InfJump = false, NoobFarm = false }
local Connections = {}
local targets = {}
local hitClock = {}
local remoteCache = {}
local abilityReady = {}
local abilityIds = {}
local Character, Root, Humanoid
local comboIndex = 1
local lastScan = 0
local lastCast = 0
local lastElementCheck = 0
local lastElementPoll = 0
local hotbarConnections = {}
local stunnedUntil = 0
local abilityCursor = 1
local budgetWindow = 0
local budgetUsed = 0
local activeElement = "unknown"
local magicData
local Library
local focusPlayer
local playerLookup = {}
local deadUntil = {}
local currentNoob
local lastNoobPick = 0
local lastTeleport = 0
local refreshPlayerList
local function track(connection)
if connection then
tableInsert(Connections, connection)
end
return connection
end
local remotesFolder
local function resolveRemotes()
if remotesFolder and remotesFolder.Parent then
return remotesFolder
end
local path = Config.RemotePath
local node = game:GetService(path[1])
for index = 2, #path do
if not node then
return nil
end
local child = node:FindFirstChild(path[index])
if not child then
local ok, waited = pcall(node.WaitForChild, node, path[index], 5)
child = ok and waited or nil
end
node = child
end
remotesFolder = node
return node
end
local function getRemote(key)
local name = Config.RemoteNames[key] or key
local cached = remoteCache[name]
if cached and cached.Parent then
return cached
end
local folder = resolveRemotes()
local found = folder and folder:FindFirstChild(name) or nil
remoteCache[name] = found
return found
end
local function takeBudget()
local now = clock()
if now - budgetWindow >= 1 then
budgetWindow = now
budgetUsed = 0
end
if budgetUsed >= Config.RemoteBudget then
return false
end
budgetUsed += 1
return true
end
local function fire(key, ...)
local remote = getRemote(key)
if not remote or not takeBudget() then
return false
end
local args = table.pack(...)
return (pcall(function()
remote:FireServer(table.unpack(args, 1, args.n))
end))
end
local function refreshCharacter(character)
Character = character or LocalPlayer.Character
Root = Character and (Character:FindFirstChild("HumanoidRootPart") or Character.PrimaryPart) or nil
Humanoid = Character and Character:FindFirstChildOfClass("Humanoid") or nil
end
refreshCharacter()
local function loadMagicData()
if magicData ~= nil then
return magicData
end
local shared = ReplicatedStorage:FindFirstChild("EBShared")
local module = shared and shared:FindFirstChild("MagicData")
if not module then
magicData = false
return false
end
local ok, result = pcall(require, module)
magicData = (ok and typeof(result) == "table") and result or false
return magicData
end
local function maxCharge()
local data = loadMagicData()
if data and typeof(data.Config) == "table" and typeof(data.Config.MaxChargeTime) == "number" then
return data.Config.MaxChargeTime
end
return Config.Farm.Charge
end
local function hotbarAbilityIds()
local collected = {}
local gui = LocalPlayer:FindFirstChild("PlayerGui")
local hud = gui and gui:FindFirstChild("EB_HUD")
local hotbar = hud and hud:FindFirstChild("Hotbar")
if not hotbar then
return collected
end
local seen = {}
for index = 1, 8 do
local slot = hotbar:FindFirstChild("Slot" .. tostring(index))
if slot then
local id = slot:GetAttribute("abId")
if typeof(id) == "string" and id ~= "" and not seen[id] then
seen[id] = true
tableInsert(collected, id)
end
end
end
return collected
end
local function looksLikeAbility(value)
if typeof(value) ~= "table" then
return false
end
return value.damage ~= nil or value.cooldown ~= nil or value.unlockLevel ~= nil or value.range ~= nil
end
local function magicDataAbilityIds(element)
local data = loadMagicData()
if not data or typeof(element) ~= "string" then
return {}
end
local lowered = string.lower(element)
local node
local function scan(container)
if typeof(container) ~= "table" then
return
end
for key, value in pairs(container) do
if typeof(key) == "string" and typeof(value) == "table" and string.lower(key) == lowered then
node = value
return
end
end
end
scan(data)
if not node then
scan(data.Elements or data.Magics or data.magics or data.Magic)
end
local collected = {}
if typeof(node) == "table" then
local pool = node.Abilities or node.abilities or node
if typeof(pool) == "table" then
for key, value in pairs(pool) do
if typeof(key) == "string" and looksLikeAbility(value) then
tableInsert(collected, key)
end
end
end
end
table.sort(collected)
return collected
end
local function sameList(a, b)
if #a ~= #b then
return false
end
for index = 1, #a do
if a[index] ~= b[index] then
return false
end
end
return true
end
local function setAbilityIds(list)
if #list == 0 or sameList(list, abilityIds) then
return
end
abilityIds = list
abilityCursor = 1
tableClear(abilityReady)
end
local function elementFromAbilities()
for _, id in ipairs(abilityIds) do
local prefix = string.match(id, "^([%a]+)_")
if prefix then
local data = loadMagicData()
if data then
for key, value in pairs(data) do
if typeof(key) == "string" and typeof(value) == "table" then
local pool = value.Abilities or value.abilities or value
if typeof(pool) == "table" and pool[id] ~= nil then
return key
end
end
end
end
return prefix
end
end
return nil
end
local function refreshAbilities()
local fromHotbar = hotbarAbilityIds()
if #fromHotbar > 0 then
setAbilityIds(fromHotbar)
if activeElement == "unknown" then
local guessed = elementFromAbilities()
if guessed then
activeElement = guessed
end
end
return
end
if activeElement ~= "unknown" then
setAbilityIds(magicDataAbilityIds(activeElement))
end
end
local function bindHotbar()
for _, connection in ipairs(hotbarConnections) do
pcall(function()
connection:Disconnect()
end)
end
tableClear(hotbarConnections)
local gui = LocalPlayer:FindFirstChild("PlayerGui")
local hud = gui and gui:FindFirstChild("EB_HUD")
local hotbar = hud and hud:FindFirstChild("Hotbar")
if not hotbar then
return false
end
local function watchSlot(slot)
if slot:IsA("GuiObject") or slot:IsA("Frame") then
tableInsert(hotbarConnections, slot:GetAttributeChangedSignal("abId"):Connect(refreshAbilities))
end
end
for _, slot in ipairs(hotbar:GetChildren()) do
watchSlot(slot)
end
tableInsert(hotbarConnections, hotbar.ChildAdded:Connect(function(slot)
watchSlot(slot)
task.defer(refreshAbilities)
end))
for _, connection in ipairs(hotbarConnections) do
track(connection)
end
return true
end
local function setElement(element)
if typeof(element) ~= "string" or element == "" then
return
end
if element ~= activeElement then
activeElement = element
tableClear(abilityReady)
end
refreshAbilities()
end
local stats = getRemote("StatsUpdated")
if stats then
track(stats.OnClientEvent:Connect(function(payload)
if typeof(payload) == "table" then
setElement(payload.active or payload.Active or payload.element)
end
end))
end
local feedback = getRemote("AbilityFeedback")
if feedback then
track(feedback.OnClientEvent:Connect(function(abilityId, ok, cooldown, status)
local now = clock()
if typeof(abilityId) == "string" then
if ok == true and typeof(cooldown) == "number" and cooldown > 0 then
abilityReady[abilityId] = now + cooldown
elseif ok == false then
abilityReady[abilityId] = now + Config.Farm.RetryDelay
end
end
if status == "stunned" then
stunnedUntil = now + Config.Farm.StunBackoff
end
end))
end
local hotbarBound = bindHotbar()
refreshAbilities()
task.spawn(function()
for _ = 1, 40 do
if #abilityIds > 0 and activeElement ~= "unknown" then
break
end
if not hotbarBound then
hotbarBound = bindHotbar()
end
refreshAbilities()
task.wait(0.5)
end
end)
local function considerModel(model, seen)
if seen[model] or model == Character or not model:IsA("Model") then
return
end
local humanoid = model:FindFirstChildOfClass("Humanoid")
if not humanoid or humanoid.Health <= 0 then
return
end
local root = model:FindFirstChild("HumanoidRootPart") or model.PrimaryPart
if not root then
return
end
seen[model] = true
tableInsert(targets, { humanoid = humanoid, root = root, model = model })
end
local function scanTargets(now)
if now - lastScan = settings.MaxTargets then
break
end
local root = entry.root
if root.Parent and entry.humanoid.Health > 0 and (root.Position - origin).Magnitude = interval then
if fire("ApplyDamage", entry.humanoid, settings.Damage, comboIndex, root.Position) then
hitClock[entry.humanoid] = now
comboIndex += 1
if comboIndex > settings.ComboMax then
comboIndex = 1
end
used += 1
end
end
end
end
end
local function nearestTarget(origin)
local best, bestDistance
for _, entry in ipairs(targets) do
if entry.root.Parent and entry.humanoid.Health > 0 then
local distance = (entry.root.Position - origin).Magnitude
if distance <= Config.Farm.Radius and (not bestDistance or distance count then
abilityCursor = 1
end
local readyAt = abilityReady[id]
if not readyAt or now >= readyAt then
return id
end
end
return nil
end
local function runAutoFarm(now, origin)
if now - lastElementCheck >= Config.Farm.ElementRefresh then
lastElementCheck = now
refreshAbilities()
end
if now < stunnedUntil or now - lastCast 0 then
return root
end
return nil
end
local function pickNoob(now, origin)
if focusPlayer then
if focusPlayer.Parent and characterRoot(focusPlayer) then
return focusPlayer
end
return nil
end
local best, bestDistance
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer and (deadUntil[player] or 0) <= now then
local root = characterRoot(player)
if root then
local distance = (root.Position - origin).Magnitude
if not bestDistance or distance < bestDistance then
best = player
bestDistance = distance
end
end
end
end
return best
end
local function runNoobFarm(now, origin)
if not Root or not Humanoid or Humanoid.Health = settings.RepickInterval then
lastNoobPick = now
local picked = pickNoob(now, origin)
if picked then
currentNoob = picked
end
end
if not currentNoob then
return
end
local root = characterRoot(currentNoob)
if not root then
return
end
if now - lastTeleport < settings.TeleportInterval then
return
end
local goal = root.CFrame * CFrame.new(settings.Offset)
if (Root.Position - goal.Position).Magnitude <= settings.Tolerance then
return
end
lastTeleport = now
Root.CFrame = goal
Root.AssemblyLinearVelocity = Vector3.zero
end
local function applySpeed()
if not Humanoid or Humanoid.Health 0) and base or 18
end
track(RunService.PostSimulation:Connect(function()
local now = clock()
if not Root or not Root.Parent or not Humanoid or not Humanoid.Parent then
refreshCharacter()
end
if State.Speed then
applySpeed()
end
if now - lastElementPoll >= Config.ElementPoll then
lastElementPoll = now
if not hotbarBound then
hotbarBound = bindHotbar()
end
refreshAbilities()
end
if not Root then
return
end
if not (State.KillAura or State.AutoFarm or State.NoobFarm) then
return
end
if State.NoobFarm then
runNoobFarm(now, Root.Position)
end
local origin = Root.Position
scanTargets(now)
if State.KillAura then
runKillAura(now, origin)
end
if State.AutoFarm then
runAutoFarm(now, origin)
end
end))
track(UserInputService.JumpRequest:Connect(function()
if State.InfJump and Humanoid and Humanoid.Health > 0 then
Humanoid:ChangeState(jumpingState)
end
end))
track(LocalPlayer.CharacterAdded:Connect(function(character)
task.defer(function()
refreshCharacter(character)
tableClear(hitClock)
tableClear(abilityReady)
stunnedUntil = 0
refreshAbilities()
end)
end))
local repo = "https://raw.githubusercontent.com/deividcomsono/Obsidian/main/"
Library = loadstring(game:HttpGet(repo .. "Library.lua"))()
local SaveManager = loadstring(game:HttpGet(repo .. "addons/SaveManager.lua"))()
local ThemeManager = loadstring(game:HttpGet(repo .. "addons/ThemeManager.lua"))()
Library.ForceCheckbox = false
Library.ShowToggleFrameInKeybinds = true
local Window = Library:CreateWindow({
Title = Config.GuiName,
Footer = Config.GuiName,
AutoShow = true,
NotifySide = "Right",
ShowCustomCursor = false,
})
local CombatTab = Window:AddTab("Combat", "swords")
local FarmTab = Window:AddTab("Farm", "sprout")
local NoobTab = Window:AddTab("Farm Noobs", "crosshair")
local MovementTab = Window:AddTab("Movement", "footprints")
local SettingsTab = Window:AddTab("Settings", "sliders-horizontal")
local AuraBox = CombatTab:AddLeftGroupbox("Kill Aura", "swords")
AuraBox:AddToggle("KillAura", {
Text = "Kill Aura",
Default = false,
Callback = function(value)
State.KillAura = value
if not value then
tableClear(hitClock)
tableClear(targets)
comboIndex = 1
lastScan = 0
end
end,
})
local FarmBox = FarmTab:AddLeftGroupbox("Auto Farm", "sprout")
FarmBox:AddToggle("AutoFarmLevel", {
Text = "Auto Farm LVL",
Default = false,
Callback = function(value)
State.AutoFarm = value
if value then
refreshAbilities()
lastCast = 0
lastElementCheck = 0
else
stunnedUntil = 0
end
end,
})
local NoobBox = NoobTab:AddLeftGroupbox("Farm Noobs", "crosshair")
NoobBox:AddToggle("NoobFarm", {
Text = "Auto TP Players",
Default = false,
Callback = function(value)
State.NoobFarm = value
if value then
currentNoob = nil
lastNoobPick = 0
lastTeleport = 0
tableClear(deadUntil)
else
currentNoob = nil
end
end,
})
NoobBox:AddDropdown("FocusPlayer", {
Text = "Focus player",
Values = {},
AllowNull = true,
Callback = function(value)
focusPlayer = value and playerLookup[value] or nil
currentNoob = nil
lastNoobPick = 0
end,
})
NoobBox:AddButton("Refresh players", function()
refreshPlayerList()
end)
refreshPlayerList = function()
local values = {}
tableClear(playerLookup)
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LocalPlayer then
local label = player.DisplayName
if label ~= player.Name then
label = label .. " (@" .. player.Name .. ")"
end
playerLookup[label] = player
tableInsert(values, label)
end
end
table.sort(values)
pcall(function()
local option = Library.Options.FocusPlayer
option:SetValues(values)
if option.Value and not playerLookup[option.Value] then
option:SetValue(nil)
end
end)
end
refreshPlayerList()
track(Players.PlayerAdded:Connect(function()
task.defer(refreshPlayerList)
end))
track(Players.PlayerRemoving:Connect(function(player)
if player == focusPlayer then
focusPlayer = nil
end
if player == currentNoob then
currentNoob = nil
end
deadUntil[player] = nil
task.defer(refreshPlayerList)
end))
local MovementBox = MovementTab:AddLeftGroupbox("Movement", "footprints")
MovementBox:AddToggle("SpeedEnabled", {
Text = "Speed",
Default = false,
Callback = function(value)
State.Speed = value
if not value then
restoreSpeed()
end
end,
})
MovementBox:AddSlider("SpeedValue", {
Text = "Speed value",
Default = 60,
Min = 18,
Max = 250,
Rounding = 0,
Callback = function(value)
Config.Movement.Speed = value
end,
})
MovementBox:AddToggle("InfJump", {
Text = "Infinite Jump",
Default = false,
Callback = function(value)
State.InfJump = value
end,
})
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
SaveManager:SetFolder(Config.SaveFolder)
ThemeManager:SetLibrary(Library)
ThemeManager:SetFolder(Config.SaveFolder)
local ConfigGroupbox = SettingsTab:AddRightGroupbox("Configuration", "folder-cog")
ConfigGroupbox:AddInput("SaveManager_ConfigName", {
Text = "Config name",
Placeholder = "My Config",
})
ConfigGroupbox:AddButton("Create config", function()
local name = Library.Options.SaveManager_ConfigName.Value
if name:gsub(" ", "") == "" then
Library:Notify("Invalid config name (empty)", 2)
return
end
local success, err = SaveManager:Save(name)
if not success then
Library:Notify("Failed to create config: " .. err)
return
end
Library:Notify(string.format("Created config %q", name))
Library.Options.SaveManager_ConfigList:SetValues(SaveManager:RefreshConfigList())
Library.Options.SaveManager_ConfigList:SetValue(nil)
end)
ConfigGroupbox:AddDivider()
ConfigGroupbox:AddDropdown("SaveManager_ConfigList", {
Text = "Config list",
Values = SaveManager:RefreshConfigList(),
AllowNull = true,
})
ConfigGroupbox:AddButton("Load config", function()
local name = Library.Options.SaveManager_ConfigList.Value
local success, err = SaveManager:Load(name)
if not success then
Library:Notify("Failed to load config: " .. err)
return
end
Library:Notify(string.format("Loaded config %q", name))
end)
ConfigGroupbox:AddButton("Overwrite config", function()
local name = Library.Options.SaveManager_ConfigList.Value
local success, err = SaveManager:Save(name)
if not success then
Library:Notify("Failed to overwrite config: " .. err)
return
end
Library:Notify(string.format("Overwrote config %q", name))
end)
ConfigGroupbox:AddButton("Delete config", function()
local name = Library.Options.SaveManager_ConfigList.Value
local success, err = SaveManager:Delete(name)
if not success then
Library:Notify("Failed to delete config: " .. err)
return
end
Library:Notify(string.format("Deleted config %q", name))
Library.Options.SaveManager_ConfigList:SetValues(SaveManager:RefreshConfigList())
Library.Options.SaveManager_ConfigList:SetValue(nil)
end)
ConfigGroupbox:AddButton("Refresh list", function()
Library.Options.SaveManager_ConfigList:SetValues(SaveManager:RefreshConfigList())
Library.Options.SaveManager_ConfigList:SetValue(nil)
end)
local AutoloadLabel = ConfigGroupbox:AddLabel("Current autoload config: " .. SaveManager:GetAutoloadConfig(), true)
ConfigGroupbox:AddButton("Set as autoload", function()
local name = Library.Options.SaveManager_ConfigList.Value
local success, err = SaveManager:SaveAutoloadConfig(name)
if not success then
Library:Notify("Failed to set autoload config: " .. err)
return
end
Library:Notify(string.format("Set %q to auto load", name))
AutoloadLabel:SetText("Current autoload config: " .. name)
end)
ConfigGroupbox:AddButton("Reset autoload", function()
local success, err = SaveManager:DeleteAutoLoadConfig()
if not success then
Library:Notify("Failed to reset autoload config: " .. err)
return
end
Library:Notify("Set autoload to none")
AutoloadLabel:SetText("Current autoload config: none")
end)
local MenuGroup = SettingsTab:AddLeftGroupbox("Menu", "wrench")
MenuGroup:AddLabel("Menu bind"):AddKeyPicker("MenuKeybind", {
Default = Config.MenuKeybind,
NoUI = true,
Text = "Menu keybind",
})
MenuGroup:AddButton("Unload", function()
Library:Unload()
end)
SaveManager:SetIgnoreIndexes({ "SaveManager_ConfigList", "SaveManager_ConfigName", "MenuKeybind", "FocusPlayer" })
Library.ToggleKeybind = Library.Options.MenuKeybind
ThemeManager:ApplyToTab(SettingsTab)
SaveManager:LoadAutoloadConfig()
local function cleanup()
for key in pairs(State) do
State[key] = false
end
restoreSpeed()
for _, connection in ipairs(Connections) do
pcall(function()
connection:Disconnect()
end)
end
tableClear(Connections)
tableClear(targets)
tableClear(hitClock)
tableClear(abilityReady)
tableClear(deadUntil)
tableClear(playerLookup)
focusPlayer = nil
currentNoob = nil
tableClear(hotbarConnections)
tableClear(remoteCache)
remotesFolder = nil
ENV.ElementalShowdownUnload = nil
end
ENV.ElementalShowdownUnload = function()
pcall(cleanup)
pcall(function()
Library:Unload()
end)
end
Library:OnUnload(function()
cleanup()
end)