Description
a friend of mine gave me ts and said to upload so i have no idea what ts does he just said inf dmg or sm
GAMEThe Cul De Sac [⚔️ NEW BOSS]
UPDATEDOct 29, 2026
ACCESSKeyless
PLATFORMDesktop & Mobile
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts Risk Notice ]]
--[[
Cul De Sac RPG — Aura Suite (Rayfield Gen2)
Combat : one-shots every monster in range (money + Fighting XP)
Chop : zeroes Hearts on trees (wood + Chopping XP)
Mine : zeroes Hearts on ore (ore + Mining XP)
Forage : dissolves plants (items + Foraging XP)
Catch : fires the critter catch batch (Catching XP)
Fishing : asks the server for a fishing session, then reports every
fish in that table as caught. Pays fish + Fishing XP from
anywhere on the map, no rod, no water, no minigame.
The character is NEVER moved. Every proven payout here breaks the
moment the server thinks the player teleported, so this script only
reads positions and never writes CFrame.
]]
-- stop a previous copy of this script's loops (live-reload does the rest)
if type(getgenv) == "function" and type(getgenv().CDS_AURA) == "table" then
pcall(function() getgenv().CDS_AURA.stop() end)
end
local Players = game:GetService("Players")
local RS = game:GetService("ReplicatedStorage")
local lp = Players.LocalPlayer
-- drop the interface a previous run of this script left behind
if getgenv().CDS_GUI then
pcall(function() getgenv().CDS_GUI:Destroy() end)
getgenv().CDS_GUI = nil
end
local containers = {}
local function addContainer(c)
if c then containers[#containers + 1] = c end
end
pcall(function() addContainer(game:GetService("CoreGui")) end)
pcall(function() addContainer(gethui()) end)
addContainer(lp:FindFirstChild("PlayerGui"))
for _, container in ipairs(containers) do
for _, gui in ipairs(container:GetChildren()) do
if gui:IsA("ScreenGui") then
local n = gui.Name:lower()
if n:find("rayfield") or n:find("sirius") then
pcall(function() gui:Destroy() end)
end
end
end
end
local okLoad, Rayfield = pcall(function()
return loadstring(game:HttpGet("https://sirius.menu/gen2"))()
end)
if not okLoad or not Rayfield then
warn("[CulDeSac] Rayfield failed to load: " .. tostring(Rayfield))
return
end
-- game modules (loaded defensively: the script may run mid-teleport)
local Modules = RS:WaitForChild("Modules", 30)
local Combat, PhysicalEffects
if Modules then
local cm = Modules:FindFirstChild("Combat")
if cm then pcall(function() Combat = require(cm) end) end
local pm = Modules:FindFirstChild("PhysicalEffects")
if pm then pcall(function() PhysicalEffects = require(pm) end) end
end
local EReplication
do
local ok, ev = pcall(function()
return RS.ClientToServer.DataEvents.EReplication
end)
if ok then EReplication = ev end
end
-- fishing / economy remotes
local GenerateFishing, SellItem, LoadItemData
do
local ok, v = pcall(function()
return RS.LocalReplicated.FishingHandlerReplicated.GenerateFishing
end)
if ok then GenerateFishing = v end
local ok2, v2 = pcall(function()
return RS.LocalReplicated.Items.SellItem
end)
if ok2 then SellItem = v2 end
local m = Modules and Modules:FindFirstChild("LoadItemData")
if m then pcall(function() LoadItemData = require(m) end) end
end
if not Combat then warn("[CulDeSac] Combat module missing — the kill aura will idle.") end
if not EReplication then warn("[CulDeSac] EReplication missing — catching will idle.") end
if not GenerateFishing then warn("[CulDeSac] GenerateFishing missing — auto fishing will idle.") end
if not SellItem then warn("[CulDeSac] SellItem missing — auto sell will idle.") end
--------------------------------------------------------------------------------
-- state
--------------------------------------------------------------------------------
local cfg = {
combat = { on = false, radius = 200, damage = 100000, speed = 6 },
chop = { on = false, radius = 300, speed = 5 },
mine = { on = false, radius = 300, speed = 5 },
forage = { on = false, radius = 300, speed = 2 },
catch = { on = false, radius = 250, speed = 2 },
fish = { on = false, table = "CrystalCave", delay = 1.2, gap = 0.15, sell = false, sellEvery = 8 },
}
local stats = { kills = 0, chops = 0, mines = 0, forages = 0, catches = 0, cycles = 0, sold = 0 }
local hitAt = setmetatable({}, { __mode = "k" }) -- per-instance cooldown
local pendingForage = setmetatable({}, { __mode = "k" })
local running = true
--------------------------------------------------------------------------------
-- helpers
--------------------------------------------------------------------------------
local function getRoot()
local ch = lp.Character
if not ch then return nil end
local hum = ch:FindFirstChildOfClass("Humanoid")
if hum and hum.Health <= 0 then return nil end
local hrp = ch:FindFirstChild("HumanoidRootPart")
if hrp and hrp:IsA("BasePart") then return hrp end
return nil
end
local function partOf(v)
if v:IsA("BasePart") then return v end
local p = v.PrimaryPart
if p and p:IsA("BasePart") then return p end
p = v:FindFirstChild("HumanoidRootPart")
if p and p:IsA("BasePart") then return p end
if v:IsA("Model") then return v:FindFirstChildWhichIsA("BasePart") end
return nil
end
-- children of a container (plus one level of sub-folders), filtered by an
-- attribute and sorted nearest-first
local function scan(container, attr, radius)
local root = getRoot()
local out = {}
if not root or not container then return out end
local function consider(v)
if v:GetAttribute(attr) == true then
local p = partOf(v)
if p then
local d = (p.Position - root.Position).Magnitude
if d <= radius then
out[#out + 1] = { obj = v, d = d, part = p }
end
end
end
end
for _, v in ipairs(container:GetChildren()) do
if v:IsA("Folder") then
for _, c in ipairs(v:GetChildren()) do consider(c) end
else
consider(v)
end
end
table.sort(out, function(a, b) return a.d < b.d end)
return out
end
local function anyContainer(names)
local list = {}
for _, n in ipairs(names) do
local v = workspace:FindFirstChild(n)
if v then list[#list + 1] = v end
end
return list
end
--------------------------------------------------------------------------------
-- modes
--------------------------------------------------------------------------------
local function tickCombat(budget, now)
if not Combat then return end
local list = scan(workspace:FindFirstChild("EntityHandler"), "Entity", cfg.combat.radius)
local acted = 0
for _, e in ipairs(list) do
if acted >= budget then break end
local o = e.obj
if o:GetAttribute("Critter") ~= true and o:GetAttribute("Death") ~= true then
local last = hitAt[o]
if not last or now - last > 0.6 then
hitAt[o] = now
local ok = pcall(function()
Combat:AttackMain(lp, o, { Damage = cfg.combat.damage, ItemName = "OldSword" }, nil)
end)
if ok then
acted = acted + 1
stats.kills = stats.kills + 1
end
end
end
end
end
local function tickHarvest(attr, containerNames, radius, budget, now, counter)
local acted = 0
for _, cname in ipairs(containerNames) do
if acted >= budget then return end
for _, e in ipairs(scan(workspace:FindFirstChild(cname), attr, radius)) do
if acted >= budget then return end
local o = e.obj
local hearts = o:GetAttribute("Hearts")
local last = hitAt[o]
if o:GetAttribute("Death") ~= true
and type(hearts) == "number"
and hearts > 0
and (not last or now - last > 1) then
hitAt[o] = now
if pcall(function() o:SetAttribute("Hearts", 0) end) then
acted = acted + 1
stats[counter] = stats[counter] + 1
end
end
end
end
end
local function tickForage(budget, now)
if not PhysicalEffects then return end
local list = scan(workspace:FindFirstChild("Collectables"), "Foragable", cfg.forage.radius)
local acted = 0
for _, e in ipairs(list) do
if acted >= budget then break end
local o = e.obj
if o:GetAttribute("Used") == nil
and o:GetAttribute("Death") ~= true
and not pendingForage[o] then
local tag = o:GetAttribute("Tag")
local part = e.part
if tag and part then
pendingForage[o] = true
task.spawn(function()
pcall(function()
-- dot call: the function takes the player as its first argument
PhysicalEffects.DissolveForagableItem(lp, o, tag, nil, part, nil)
end)
pendingForage[o] = nil
end)
acted = acted + 1
stats.forages = stats.forages + 1
end
end
end
end
local function tickCatch(budget, now)
if not EReplication then return end
local list = scan(workspace:FindFirstChild("EntityHandler"), "Critter", cfg.catch.radius)
local acted = 0
for _, e in ipairs(list) do
if acted >= budget then break end
local o = e.obj
local hrp = o:FindFirstChild("HumanoidRootPart")
if hrp and o:GetAttribute("Death") ~= true then
local last = hitAt[o]
if not last or now - last > 3 then
hitAt[o] = now
local payload = { {
"Entity",
o.Name,
hrp.Position,
o.Parent,
o:GetAttribute("Tag"),
nil,
o:GetAttribute("Shiny") == true,
nil,
} }
if pcall(function() EReplication:FireServer("Batch", payload) end) then
acted = acted + 1
stats.catches = stats.catches + 1
end
end
end
end
end
local function tickMode(mode, budget, now)
local c = cfg[mode]
if mode == "combat" then
tickCombat(budget, now)
elseif mode == "chop" then
tickHarvest("Choppable", { "Collectables", "EventParts" }, c.radius, budget, now, "chops")
elseif mode == "mine" then
tickHarvest("Minable", { "MineHandler", "EventParts" }, c.radius, budget, now, "mines")
elseif mode == "forage" then
tickForage(budget, now)
elseif mode == "catch" then
tickCatch(budget, now)
end
end
-------------------------------------------------------------------------------
-- fishing + selling
-------------------------------------------------------------------------------
-- Verified live from ReplicatedStorage.Modules.LoadItemData:GetRandomFish.
-- The list is topped up at runtime anyway, so a game update cannot leave us
-- firing a stale set of names.
local FISH_TABLES = {
CrystalCave = { "GemstoneNarwhal", "Glowmaw", "RuneSquid" },
RainbowGrove = { "RainbowTuna", "PeanutButterCrab" },
FairyPond = {
"Starfish", "Plumplet", "Glimmer", "Shimmerfin",
"FlutterFish", "SolarSchool", "FairyDolphin",
},
IceLake = {
"Shimmerfin", "IcyEel", "FrostbiteBarracuda", "GleeGill",
"StoneFish", "SnowSpottedChar", "GlacierShark",
},
Beach = {
"Bass", "Shrubfin", "Piranha", "CherrySalmon", "CiderTrout",
"DandelionDart", "GleeGill", "MossCarp", "SunFish", "Leech",
"Glimmer", "Splashtail", "Glassyray", "LilacSnapper",
"SolarSchool", "IcyEel", "FrostbiteBarracuda", "StoneFish",
},
Mountain = { "GlitchFish", "ELGGOB", "ToxicFish", "NuclearBass", "LotusSerpent" },
CaveLake = {
"Bass", "CherrySalmon", "CiderTrout", "Crawfish", "DandelionDart",
"Fluke", "FlutterFish", "FrostbiteBarracuda", "GleeGill", "Glimmer",
"Guppy", "IcyEel", "Leech", "LilacSnapper", "MossCarp", "Petalfin",
"Shrubfin", "SkeletonCatFish", "SolarSchool", "Splashtail",
"StoneFish", "Tadpole",
},
CityLake = { "Bass", "Crawfish", "GleeGill", "Guppy", "Leech", "MoltenBoxfish", "StoneFish", "SunkenShark", "Tadpole" },
River = { "Guppy", "Crawfish", "Bass", "StoneFish", "Tadpole" },
}
local FISH_ORDER = {
"CrystalCave", "RainbowGrove", "FairyPond", "IceLake",
"Beach", "Mountain", "CaveLake", "CityLake", "River",
}
local LOOT = {
"Wood", "Stone", "Coal", "IronOre", "GoldOre", "CrystalOre",
"FirestoneOre", "WaterstoneOre", "RubyOre", "FrostOre", "DryOre",
"Fur", "String", "Ichor", "EvilFang", "RockScale", "RockFang",
}
local fishLists = {}
local function fishList(tbl)
local cached = fishLists[tbl]
if cached then return cached end
local seen, list = {}, {}
for _, n in ipairs(FISH_TABLES[tbl] or {}) do
seen[n] = true
list[#list + 1] = n
end
if LoadItemData then
for _, rarity in ipairs({
"Common", "Uncommon", "Unique", "Rare",
"Mythic", "Legendary", "Divine", "Fabled",
}) do
for _ = 1, 8 do
local ok, n = pcall(function()
return LoadItemData:GetRandomFish("Summer", rarity, tbl)
end)
if ok and type(n) == "string" and not seen[n] then
seen[n] = true
list[#list + 1] = n
end
end
end
end
fishLists[tbl] = list
return list
end
local function sellName(name)
if not SellItem or type(name) ~= "string" then return end
pcall(function() SellItem:FireServer(name, 999999, "Fawn") end)
stats.sold = stats.sold + 1
end
local function sellFish()
local seen = {}
for _, tbl in ipairs(FISH_ORDER) do
for _, n in ipairs(fishList(tbl)) do
if not seen[n] then
seen[n] = true
sellName(n)
task.wait(0.04)
end
end
end
end
local function sellLoot()
for _, n in ipairs(LOOT) do
sellName(n)
task.wait(0.04)
end
end
local fishToken = 0
local function fishLoop()
local token = fishToken
while running and cfg.fish.on and token == fishToken do
local tbl = cfg.fish.table
if GenerateFishing and EReplication then
pcall(function() GenerateFishing:FireServer(tbl) end)
task.wait(math.max(cfg.fish.delay, 0.4))
for _, n in ipairs(fishList(tbl)) do
if not (running and cfg.fish.on and token == fishToken) then break end
pcall(function() EReplication:FireServer("Fishing", n, tbl, nil, nil, nil) end)
task.wait(cfg.fish.gap)
end
stats.cycles = stats.cycles + 1
end
task.wait(0.4)
end
end
--------------------------------------------------------------------------------
-- interface
--------------------------------------------------------------------------------
-- remember what was already in gethui so we can spot the GUI Rayfield builds
local preExisting = {}
pcall(function()
local h = gethui()
if h then
for _, v in ipairs(h:GetChildren()) do preExisting[v] = true end
end
end)
local window = Rayfield:CreateWindow({
name = "Cul De Sac",
subtitle = "Aura Suite",
configuration = {
autoSave = true,
autoLoad = false,
fileName = "CulDeSacAura",
},
sidebarLayout = true,
})
-- track that ScreenGui so the next reload replaces it instead of stacking
pcall(function()
local h = gethui()
if h then
for _, v in ipairs(h:GetChildren()) do
if v:IsA("ScreenGui") and not preExisting[v] then
getgenv().CDS_GUI = v
end
end
end
end)
local combatTab = window:CreateTab({ name = "Combat" })
local skillsTab = window:CreateTab({ name = "Skills" })
local fishingTab = window:CreateTab({ name = "Fishing" })
local settingsTab = window:CreateTab({ name = "Settings" })
-- Combat -----------------------------------------------------------------------
local statusText = combatTab:CreateText({ name = "Live stats", text = "Starting…" })
combatTab:CreateDivider()
local auraToggle
auraToggle = combatTab:CreateToggle({
name = "Kill aura",
description = "One-shots every monster in range. Money + Fighting XP.",
value = false,
flag = "CombatAura",
callback = function(v)
cfg.combat.on = v
if v then window:Notify({ title = "Kill aura", content = "On — clearing monsters in " .. cfg.combat.radius .. " studs." }) end
end,
})
local radiusSlider = combatTab:CreateSlider({
name = "Aura radius",
range = { 20, 600 },
increment = 10,
value = 200,
suffix = " studs",
flag = "CombatRadius",
callback = function(v) cfg.combat.radius = v end,
})
local damageSlider = combatTab:CreateSlider({
name = "Damage",
range = { 1000, 100000 },
increment = 1000,
value = 100000,
flag = "CombatDamage",
callback = function(v) cfg.combat.damage = v end,
})
local combatSpeedSlider = combatTab:CreateSlider({
name = "Hits per second",
range = { 1, 20 },
increment = 1,
value = 6,
flag = "CombatSpeed",
callback = function(v) cfg.combat.speed = v end,
})
combatTab:CreateKeybind({
name = "Toggle aura",
value = Enum.KeyCode.Z,
callback = function()
auraToggle:Set(not cfg.combat.on)
end,
})
-- Skills -----------------------------------------------------------------------
skillsTab:CreateText({
name = "Harvesting",
text = "Same trick as the aura: the client owns the Hearts attribute and the reward packet, so the server pays for every node cleared in range.",
})
local chopToggle, mineToggle, forageToggle, catchToggle
chopToggle = skillsTab:CreateToggle({
name = "Chop trees",
description = "Wood + Chopping XP.",
value = false,
flag = "ChopOn",
callback = function(v) cfg.chop.on = v end,
})
mineToggle = skillsTab:CreateToggle({
name = "Mine ore",
description = "Ore + Mining XP.",
value = false,
flag = "MineOn",
callback = function(v) cfg.mine.on = v end,
})
forageToggle = skillsTab:CreateToggle({
name = "Forage plants",
description = "Items + Foraging XP.",
value = false,
flag = "ForageOn",
callback = function(v) cfg.forage.on = v end,
})
catchToggle = skillsTab:CreateToggle({
name = "Catch critters",
description = "Catching XP. Re-catches the same critter every few seconds.",
value = false,
flag = "CatchOn",
callback = function(v) cfg.catch.on = v end,
})
local skillRadiusSlider = skillsTab:CreateSlider({
name = "Skill radius",
range = { 50, 800 },
increment = 10,
value = 300,
suffix = " studs",
flag = "SkillRadius",
callback = function(v)
for _, m in ipairs({ "chop", "mine", "forage", "catch" }) do cfg[m].radius = v end
end,
})
local skillSpeedSlider = skillsTab:CreateSlider({
name = "Actions per second",
range = { 1, 12 },
increment = 1,
value = 4,
flag = "SkillSpeed",
callback = function(v)
for _, m in ipairs({ "chop", "mine", "forage", "catch" }) do cfg[m].speed = v end
end,
})
-- Fishing ----------------------------------------------------------------------
local fishStatus = fishingTab:CreateText({ name = "Live stats", text = "Idle." })
fishingTab:CreateText({
name = "How this pays",
text = "The server opens a fishing session the moment the client asks for one, then trusts the client's catch report. Ask, wait ~1s, report every fish in that table: no rod, no cast, no minigame. Crystal Cave pays best (Gemstone Narwhal is the 400k-XP fish and the table only has three). If catches ever stop paying, stand near any water and try again — every test that failed did so away from a bank.",
})
fishingTab:CreateDivider()
local fishToggle
fishToggle = fishingTab:CreateToggle({
name = "Auto fish",
description = "Fish + Fishing XP forever. Levels hand out money on their own.",
value = false,
flag = "FishOn",
callback = function(v)
cfg.fish.on = v
fishToken = fishToken + 1
if v then
if not GenerateFishing or not EReplication then
cfg.fish.on = false
window:Notify({ title = "Auto fish", content = "Fishing remotes not found — rejoin and reload." })
return
end
window:Notify({ title = "Auto fish", content = "On — casting on " .. cfg.fish.table .. "." })
task.spawn(fishLoop)
end
end,
})
fishingTab:CreateDropdown({
name = "Fishing spot",
options = FISH_ORDER,
value = "CrystalCave",
flag = "FishSpot",
callback = function(v)
if type(v) == "table" then v = v[1] end
if type(v) == "string" and v ~= "" then cfg.fish.table = v end
end,
})
fishingTab:CreateSlider({
name = "Cast delay",
description = "Time between asking for a session and reporting the catch.",
range = { 0.5, 2.5 },
increment = 0.1,
value = 1.2,
suffix = " s",
flag = "FishDelay",
callback = function(v) cfg.fish.delay = v end,
})
fishingTab:CreateDivider()
local fishSellToggle
fishSellToggle = fishingTab:CreateToggle({
name = "Auto-sell fish",
description = "Sells every fish in the bag so the money keeps climbing.",
value = false,
flag = "FishSell",
callback = function(v)
cfg.fish.sell = v
if v and not SellItem then
cfg.fish.sell = false
window:Notify({ title = "Auto-sell", content = "SellItem not found — rejoin and reload." })
end
end,
})
fishingTab:CreateSlider({
name = "Auto-sell every",
range = { 3, 30 },
increment = 1,
value = 8,
suffix = " s",
flag = "FishSellEvery",
callback = function(v) cfg.fish.sellEvery = v end,
})
fishingTab:CreateButton({
name = "Sell all fish now",
callback = function()
task.spawn(function()
sellFish()
window:Notify({ title = "Sold", content = "Every fish in the bag, at full price." })
end)
end,
})
fishingTab:CreateButton({
name = "Sell all ore / wood / drops",
callback = function()
task.spawn(function()
sellLoot()
window:Notify({ title = "Sold", content = "Raw materials sold." })
end)
end,
})
-- Settings ---------------------------------------------------------------------
settingsTab:CreateText({
name = "The one rule",
text = "Never teleport. Kills made after a CFrame teleport are silently ignored by the server; everything here works from wherever you actually stand. Walk or use the game's own portals.",
})
local function stopAll(announce)
for _, h in ipairs({ auraToggle, chopToggle, mineToggle, forageToggle, catchToggle, fishToggle, fishSellToggle }) do
pcall(function() h:Set(false) end)
end
if announce then
window:Notify({ title = "Stopped", content = "All modes off." })
end
end
settingsTab:CreateButton({
name = "Stop everything",
callback = function() stopAll(true) end,
})
settingsTab:CreateKeybind({
name = "Panic — stop all",
value = Enum.KeyCode.End,
callback = function() stopAll(true) end,
})
settingsTab:CreateDivider()
settingsTab:CreateText({
name = "Session",
text = "Reload this script with the same live-reload label to replace it cleanly. Closing the window does not stop the loops.",
})
-- saving can restore element values without firing their callbacks, so make
-- the runtime state agree with whatever the interface is actually showing
do
local function num(handle, fallback)
local ok, v = pcall(function() return handle.value end)
if ok and type(v) == "number" then return v end
return fallback
end
local function bool(handle)
local ok, v = pcall(function() return handle.value end)
return (ok and v) and true or false
end
cfg.combat.on = bool(auraToggle)
cfg.chop.on = bool(chopToggle)
cfg.mine.on = bool(mineToggle)
cfg.forage.on = bool(forageToggle)
cfg.catch.on = bool(catchToggle)
cfg.fish.on = bool(fishToggle)
cfg.fish.sell = bool(fishSellToggle)
if cfg.fish.on then
fishToken = fishToken + 1
task.spawn(fishLoop)
end
cfg.combat.radius = num(radiusSlider, cfg.combat.radius)
cfg.combat.damage = num(damageSlider, cfg.combat.damage)
cfg.combat.speed = num(combatSpeedSlider, cfg.combat.speed)
local sr = num(skillRadiusSlider, 300)
local ss = num(skillSpeedSlider, 4)
for _, m in ipairs({ "chop", "mine", "forage", "catch" }) do
cfg[m].radius = sr
cfg[m].speed = ss
end
end
--------------------------------------------------------------------------------
-- loops
--------------------------------------------------------------------------------
getgenv().CDS_AURA = {
stop = function()
running = false
pcall(function() stopAll(false) end)
end,
cfg = cfg,
stats = stats,
-- same path the Fishing tab uses, for scripted runs
fish = function(on)
cfg.fish.on = on and true or false
fishToken = fishToken + 1
pcall(function() fishToggle:Set(cfg.fish.on) end)
if cfg.fish.on then task.spawn(fishLoop) end
end,
sellFish = function() task.spawn(sellFish) end,
sellLoot = function() task.spawn(sellLoot) end,
}
-- main ticker: 10 Hz, per-mode token bucket
task.spawn(function()
local acc = { combat = 0, chop = 0, mine = 0, forage = 0, catch = 0 }
local last = os.clock()
while running do
task.wait(0.1)
if not running then break end
local now = os.clock()
local dt = math.min(now - last, 0.5)
last = now
if getRoot() then
for _, mode in ipairs({ "combat", "chop", "mine", "forage", "catch" }) do
local c = cfg[mode]
if c.on then
acc[mode] = math.min(acc[mode] + dt * c.speed, 12)
local n = math.floor(acc[mode])
if n > 0 then
acc[mode] = acc[mode] - n
local ok, err = pcall(tickMode, mode, n, now)
if not ok then warn("[CulDeSac] " .. mode .. ": " .. tostring(err)) end
end
else
acc[mode] = 0
end
end
else
for k in pairs(acc) do acc[k] = 0 end
end
end
end)
-- auto-sell watchdog (kept out of the fishing loop so a slow sell run cannot
-- stall the catches)
task.spawn(function()
local lastSale = 0
while running do
task.wait(1)
if not running then break end
if cfg.fish.sell and SellItem and os.clock() - lastSale >= cfg.fish.sellEvery then
lastSale = os.clock()
local ok, err = pcall(sellFish)
if not ok then warn("[CulDeSac] sell: " .. tostring(err)) end
end
end
end)
-- live stats
task.spawn(function()
while running do
task.wait(1)
if not running then break end
local function a(k) return tostring(lp:GetAttribute(k) or 0) end
local ok = pcall(function()
statusText:Set(string.format(
"Money %s Fight Lv %s (%s xp)\nChop Lv %s (%s xp) Mine Lv %s (%s xp)\nForage Lv %s (%s xp) Catch Lv %s (%s xp)\nFish Lv %s (%s xp)\n\nKills %d · Trees %d · Ore %d · Plants %d · Critters %d",
a("Money"),
a("Fighting"), a("FightingExp"),
a("Chopping"), a("ChoppingExp"),
a("Mining"), a("MiningExp"),
a("Foraging"), a("ForagingExp"),
a("Catching"), a("CatchingExp"),
a("Fishing"), a("FishingExp"),
stats.kills, stats.chops, stats.mines, stats.forages, stats.catches
))
end)
if not ok then break end
pcall(function()
fishStatus:Set(string.format(
"%s · cycles %d\nMoney %s · Fish Lv %s (%s xp)\nSells fired %d",
cfg.fish.on and ("Fishing " .. cfg.fish.table .. "…") or "Idle.",
stats.cycles,
a("Money"),
a("Fishing"), a("FishingExp"),
stats.sold
))
end)
end
end)
window:Notify({
title = "Aura Suite ready",
content = "Z = kill aura · End = stop all · Fishing tab = money printer.",
})Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place