-- [[ 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 Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local RUN_STATE = getfenv().STATE if not RUN_STATE then RUN_STATE = { connect = function(signal, fn) return signal:Connect(fn) end, onCleanup = function() end, } end local LOCAL_PLAYER = Players.LocalPlayer local FONT = Drawing.Fonts.Plex local MAX_DISTANCE = 3000 local RESCAN = 0.5 local COLORS = { candy = Color3.fromRGB(255, 92, 178), chest = Color3.fromRGB(255, 148, 36), cauldron = Color3.fromRGB(118, 255, 138), } local settings = { candy = true, chest = true, cauldron = true, tracer = false, legend = true, } local targets = {} local draws = {} local legendRows = {} local function utilFolder() local map = workspace:FindFirstChild("Map") return map and map:FindFirstChild("Util") end local function releaseDraw(instance) local d = draws[instance] if not d then return end d.box:Remove() d.label:Remove() d.trail:Remove() draws[instance] = nil end local function refreshTargets() local found = {} local util = utilFolder() if util then local items = util:FindFirstChild("Items") if items then for _, item in ipairs(items:GetChildren()) do if item:IsA("Tool") and item.Name:match("^Candy") then found[item] = { kind = "candy", label = item.Name } end end end local chests = util:FindFirstChild("PumpkinChests") if chests then for _, chest in ipairs(chests:GetChildren()) do if chest:IsA("Model") then found[chest] = { kind = "chest", label = "Candy Chest" } end end end local cauldron = util:FindFirstChild("Cauldron") if cauldron and cauldron:IsA("Model") then found[cauldron] = { kind = "cauldron", label = "Cauldron" } end end local stale = {} for instance in pairs(draws) do if not found[instance] then stale[#stale + 1] = instance end end for _, instance in ipairs(stale) do releaseDraw(instance) end targets = found end local function getDraw(instance) local d = draws[instance] if d then return d end d = { box = Drawing.new("Square"), label = Drawing.new("Text"), trail = Drawing.new("Line"), } d.box.Filled = false d.box.Thickness = 1 d.box.Transparency = 0.35 d.box.Color = Color3.new(1, 1, 1) d.label.Size = 14 d.label.Center = true d.label.Outline = true d.label.Font = FONT d.trail.Thickness = 1 d.trail.Transparency = 0.5 draws[instance] = d return d end local function hideDraw(d) d.box.Visible = false d.label.Visible = false d.trail.Visible = false end local function projectBox(camera, cf, size) local minX, minY = math.huge, math.huge local maxX, maxY = -math.huge, -math.huge local visible = false for sx = -0.5, 0.5, 1 do for sy = -0.5, 0.5, 1 do for sz = -0.5, 0.5, 1 do local world = (cf * CFrame.new(size.X * sx, size.Y * sy, size.Z * sz)).Position local point = camera:WorldToViewportPoint(world) if point.Z > 0 then visible = true minX = math.min(minX, point.X) maxX = math.max(maxX, point.X) minY = math.min(minY, point.Y) maxY = math.max(maxY, point.Y) end end end end if not visible then return nil end return minX, minY, maxX, maxY end local legendBg = Drawing.new("Square") local legendTitle = Drawing.new("Text") local function buildLegend() legendBg.Filled = true legendBg.Thickness = 0 legendBg.Color = Color3.fromRGB(10, 10, 14) legendBg.Transparency = 0.4 legendBg.Position = Vector2.new(12, 12) legendBg.Size = Vector2.new(272, 152) legendTitle.Text = "SURVIVE OVERNIGHT - ESP" legendTitle.Size = 14 legendTitle.Font = FONT legendTitle.Outline = true legendTitle.Color = Color3.fromRGB(255, 255, 255) legendTitle.Position = Vector2.new(24, 20) for i = 1, 6 do local row = Drawing.new("Text") row.Size = 13 row.Font = FONT row.Outline = true row.Position = Vector2.new(24, 42 + (i - 1) * 18) row.Visible = false legendRows[i] = row end end local function updateLegend() local on = settings.legend legendBg.Visible = on legendTitle.Visible = on local candyCount, chestCount = 0, 0 for _, meta in pairs(targets) do if meta.kind == "candy" then candyCount = candyCount + 1 elseif meta.kind == "chest" then chestCount = chestCount + 1 end end local rows = { { text = string.format("[F1] Candy %s", settings.candy and "ON" or "OFF"), color = COLORS.candy }, { text = string.format("[F2] Candy Chests %s", settings.chest and "ON" or "OFF"), color = COLORS.chest }, { text = string.format("[F3] Cauldron %s", settings.cauldron and "ON" or "OFF"), color = COLORS.cauldron }, { text = string.format("[F4] Tracers %s", settings.tracer and "ON" or "OFF"), color = Color3.fromRGB(220, 220, 220) }, { text = string.format("[F5] Panel %s", settings.legend and "ON" or "OFF"), color = Color3.fromRGB(220, 220, 220) }, { text = string.format("candy %d chests %d", candyCount, chestCount), color = Color3.fromRGB(150, 150, 160) }, } for i, row in ipairs(legendRows) do row.Visible = on row.Text = rows[i].text row.Color = rows[i].color end end local function render() local camera = workspace.CurrentCamera if not camera then return end local viewport = camera.ViewportSize local character = LOCAL_PLAYER.Character local root = character and character:FindFirstChild("HumanoidRootPart") local origin = root and root.Position or camera.CFrame.Position for instance, meta in pairs(targets) do local d = getDraw(instance) local enabled = settings[meta.kind] and instance.Parent ~= nil if not enabled then hideDraw(d) else local ok, cf, size = pcall(function() local boxCf, boxSize = instance:GetBoundingBox() return boxCf, boxSize end) local minX, minY, maxX, maxY if ok then minX, minY, maxX, maxY = projectBox(camera, cf, size) end local distance = ok and (cf.Position - origin).Magnitude or math.huge if minX and distance <= MAX_DISTANCE then local color = COLORS[meta.kind] local centerX = (minX + maxX) * 0.5 d.box.Visible = true d.box.Color = color d.box.Position = Vector2.new(minX, minY) d.box.Size = Vector2.new(math.max(1, maxX - minX), math.max(1, maxY - minY)) local text = meta.label if meta.kind == "cauldron" then local state = instance:GetAttribute("CauldronState") if state then text = text .. " - " .. tostring(state) end end text = text .. " [" .. math.floor(distance + 0.5) .. "m]" d.label.Visible = true d.label.Text = text d.label.Color = color d.label.Position = Vector2.new(centerX, minY - 17) if settings.tracer then d.trail.Visible = true d.trail.Color = color d.trail.From = Vector2.new(viewport.X * 0.5, viewport.Y) d.trail.To = Vector2.new(centerX, maxY) else d.trail.Visible = false end else hideDraw(d) end end end end local KEYMAP = { [Enum.KeyCode.F1] = "candy", [Enum.KeyCode.F2] = "chest", [Enum.KeyCode.F3] = "cauldron", [Enum.KeyCode.F4] = "tracer", [Enum.KeyCode.F5] = "legend", } buildLegend() refreshTargets() updateLegend() RUN_STATE.connect(UserInputService.InputBegan, function(input, gameProcessed) if gameProcessed then return end local field = KEYMAP[input.KeyCode] if not field then return end settings[field] = not settings[field] updateLegend() end) local elapsed = 0 RUN_STATE.connect(RunService.RenderStepped, function(dt) elapsed = elapsed + dt if elapsed >= RESCAN then elapsed = 0 refreshTargets() updateLegend() end render() end) RUN_STATE.onCleanup(function() for instance in pairs(draws) do releaseDraw(instance) end legendBg:Remove() legendTitle:Remove() for _, row in ipairs(legendRows) do row:Remove() end end)