-- Steal or Die | Ultra Light v3.4 -- Монстр: IsEntity + EntityKind | Лут: $500+ золото, вес kg, дальняя дистанция local Players = game:GetService("Players") local Lighting = game:GetService("Lighting") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local HttpService = game:GetService("HttpService") local CoreGui = game:GetService("CoreGui") local LocalPlayer = Players.LocalPlayer local env = (getgenv and getgenv()) or _G if env.SOD_Unload then pcall(env.SOD_Unload) end local Config = { ItemESP = true, MonsterESP = true, PlayerESP = true, FullBright = true, InfStamina = true, InstantPrompt = true, MonsterWarn = true, ItemFilter = "", ItemColor = Color3.fromRGB(80, 255, 120), HighValueColor = Color3.fromRGB(255, 215, 0), MonsterColor = Color3.fromRGB(255, 55, 55), PlayerColor = Color3.fromRGB(70, 170, 255), HighValue = 500, MaxDistance = 400, MaxItems = 20, MaxMonsters = 5, WarnDistance = 50, HideDisabledPrompts = true, HideInvisible = true, StaleSeconds = 20, SpawnRadius = 50, MonsterBlacklist = {}, ESPInterval = 0.2, } local running = true local connections = {} local function connect(signal, fn) local c = signal:Connect(fn) connections[#connections + 1] = c return c end local CONFIG_FILE = "SOD_Ultra_config.json" local saveKeys = {"ItemESP", "MonsterESP", "PlayerESP", "FullBright", "InfStamina", "InstantPrompt", "MonsterWarn", "ItemFilter"} local savedWinPos, dirtyAt = nil, nil local function markDirty() dirtyAt = os.clock() end pcall(function() if isfile and readfile and isfile(CONFIG_FILE) then local data = HttpService:JSONDecode(readfile(CONFIG_FILE)) if type(data) == "table" then for _, k in ipairs(saveKeys) do if data[k] ~= nil and type(data[k]) == type(Config[k]) then Config[k] = data[k] end end if type(data.WinPos) == "table" and #data.WinPos == 4 then savedWinPos = data.WinPos end end end end) local function getGuiParent() local ok, h = pcall(function() return gethui and gethui() end) if ok and h then return h end return CoreGui end local gui = Instance.new("ScreenGui") gui.Name = "SOD_Ultra" gui.ResetOnSpawn = false gui.IgnoreGuiInset = true if not pcall(function() gui.Parent = getGuiParent() end) then gui.Parent = LocalPlayer:WaitForChild("PlayerGui") end local espFolder = Instance.new("Folder") espFolder.Name = "ESP" espFolder.Parent = gui local warnFrame = Instance.new("Frame") warnFrame.Size = UDim2.new(1, 0, 1, 0) warnFrame.BackgroundTransparency = 1 warnFrame.Visible = false warnFrame.Active = false warnFrame.Parent = gui local warnStroke = Instance.new("UIStroke") warnStroke.Color = Color3.fromRGB(255, 30, 30) warnStroke.Thickness = 14 warnStroke.ApplyStrokeMode = Enum.ApplyStrokeMode.Border warnStroke.Transparency = 0.6 warnStroke.Parent = warnFrame local warnText = Instance.new("TextLabel") warnText.Size = UDim2.new(0, 300, 0, 28) warnText.Position = UDim2.new(0.5, -150, 0, 40) warnText.BackgroundTransparency = 1 warnText.TextColor3 = Color3.fromRGB(255, 70, 70) warnText.TextStrokeTransparency = 0.3 warnText.Font = Enum.Font.GothamBold warnText.TextSize = 20 warnText.Text = "" warnText.Parent = warnFrame local main = Instance.new("Frame") main.Size = UDim2.new(0, 195, 0, 332) main.Position = UDim2.new(0, 15, 0.4, 0) main.BackgroundColor3 = Color3.fromRGB(15, 15, 18) main.BorderSizePixel = 0 main.Parent = gui Instance.new("UICorner", main).CornerRadius = UDim.new(0, 8) if savedWinPos then pcall(function() main.Position = UDim2.new(savedWinPos[1], savedWinPos[2], savedWinPos[3], savedWinPos[4]) end) end local top = Instance.new("Frame") top.Size = UDim2.new(1, 0, 0, 30) top.BackgroundColor3 = Color3.fromRGB(24, 24, 30) top.BorderSizePixel = 0 top.Parent = main Instance.new("UICorner", top).CornerRadius = UDim.new(0, 8) local title = Instance.new("TextLabel") title.Size = UDim2.new(1, -8, 1, 0) title.Position = UDim2.new(0, 8, 0, 0) title.BackgroundTransparency = 1 title.Text = "Steal or Die [RShift]" title.TextColor3 = Color3.fromRGB(235, 235, 240) title.Font = Enum.Font.GothamBold title.TextSize = 13 title.TextXAlignment = Enum.TextXAlignment.Left title.Parent = top do local dragging, dragStart, startPos = false, nil, nil connect(top.InputBegan, function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging, dragStart, startPos = true, i.Position, main.Position end end) connect(UserInputService.InputChanged, function(i) if dragging and (i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch) then local d = i.Position - dragStart main.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end end) connect(UserInputService.InputEnded, function(i) if dragging and (i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch) then dragging = false markDirty() end end) end connect(UserInputService.InputBegan, function(i, gp) if not gp and i.KeyCode == Enum.KeyCode.RightShift then main.Visible = not main.Visible end end) local COLOR_ON = Color3.fromRGB(30, 100, 50) local COLOR_OFF = Color3.fromRGB(30, 30, 36) local function makeToggle(name, y, key, onChange) local b = Instance.new("TextButton") b.Size = UDim2.new(1, -12, 0, 26) b.Position = UDim2.new(0, 6, 0, y) b.Text = "" b.AutoButtonColor = false b.Parent = main Instance.new("UICorner", b).CornerRadius = UDim.new(0, 5) local t = Instance.new("TextLabel") t.Size = UDim2.new(1, -42, 1, 0) t.Position = UDim2.new(0, 9, 0, 0) t.BackgroundTransparency = 1 t.Text = name t.TextColor3 = Color3.fromRGB(225, 225, 230) t.Font = Enum.Font.GothamMedium t.TextSize = 12 t.TextXAlignment = Enum.TextXAlignment.Left t.Parent = b local s = Instance.new("TextLabel") s.Size = UDim2.new(0, 34, 1, 0) s.Position = UDim2.new(1, -38, 0, 0) s.BackgroundTransparency = 1 s.Font = Enum.Font.GothamBold s.TextSize = 11 s.Parent = b local function paint() local on = Config[key] b.BackgroundColor3 = on and COLOR_ON or COLOR_OFF s.Text = on and "ON" or "OFF" s.TextColor3 = on and Color3.fromRGB(100, 255, 130) or Color3.fromRGB(130, 130, 140) end paint() connect(b.MouseButton1Click, function() Config[key] = not Config[key] paint() markDirty() if onChange then pcall(onChange, Config[key]) end end) end local status = Instance.new("TextLabel") status.Size = UDim2.new(1, -12, 0, 16) status.Position = UDim2.new(0, 6, 0, 310) status.BackgroundTransparency = 1 status.Text = "Загрузка..." status.TextColor3 = Color3.fromRGB(85, 190, 110) status.Font = Enum.Font.Gotham status.TextSize = 10 status.Parent = main local function saveNow() if not writefile then return end pcall(function() local data = {} for _, k in ipairs(saveKeys) do data[k] = Config[k] end local p = main.Position data.WinPos = {p.X.Scale, p.X.Offset, p.Y.Scale, p.Y.Offset} writefile(CONFIG_FILE, HttpService:JSONEncode(data)) end) end local lightProps = {"Brightness", "ClockTime", "FogEnd", "GlobalShadows", "OutdoorAmbient", "Ambient"} local origLighting = {} for _, p in ipairs(lightProps) do origLighting[p] = Lighting[p] end local fbValues = { Brightness = 2, ClockTime = 14, FogEnd = 1e6, GlobalShadows = false, OutdoorAmbient = Color3.fromRGB(160, 160, 160), Ambient = Color3.fromRGB(140, 140, 140), } local function applyFullBright() for k, v in pairs(fbValues) do if Lighting[k] ~= v then Lighting[k] = v end end end local function restoreLighting() for k, v in pairs(origLighting) do Lighting[k] = v end end local origHold = setmetatable({}, {__mode = "k"}) local function setInstant(prompt, on) pcall(function() if on then if origHold[prompt] == nil then origHold[prompt] = prompt.HoldDuration end if prompt.HoldDuration ~= 0 then prompt.HoldDuration = 0 end elseif origHold[prompt] ~= nil then prompt.HoldDuration = origHold[prompt] origHold[prompt] = nil end end) end local blacklist = { "door", "vent", "locker", "closet", "button", "switch", "barricade", "exit", "gate", "wall", "floor", "light", "chair", "table", "desk", "bed", "shelf", "cabinet", "plant", "trash", "pipe", "stair", "sign", "handle", "hitbox", "attachment" } local goodWords = { "phone", "wallet", "gold", "laptop", "safe", "bar", "watch", "key", "tablet", "camera", "painting", "statue", "jewelry", "console", "headphones", "cash", "ring", "drive", "usb", "bag", "purse", "loot", "item", "pickup" } local genericNames = { handle = true, part = true, main = true, root = true, primarypart = true, hitbox = true, meshpart = true, attachment = true } local valueKeys = {"Value", "Price", "Worth", "Cash", "Amount"} local weightKeys = {"Weight", "Mass", "Kg", "KG", "CarryWeight", "ItemWeight"} local monsterWords = {"entity", "monster", "locust", "hollow", "hunter", "creature", "killer", "beast", "wendell", "rictus"} local function hasWord(name, list) for _, w in ipairs(list) do if name:find(w, 1, true) then return true end end return false end local function hasValueAttr(inst) if not inst then return false end return inst:GetAttribute("Value") ~= nil or inst:GetAttribute("Rarity") ~= nil or inst:GetAttribute("Price") ~= nil end local function isLoot(inst, nameLower) if not inst then return false end if nameLower and hasWord(nameLower, blacklist) then return false end if hasValueAttr(inst) then return true end if nameLower and hasWord(nameLower, goodWords) then return true end local par = inst.Parent if par and par ~= workspace then if hasValueAttr(par) then return true end local pn = par.Name:lower() if not hasWord(pn, blacklist) and hasWord(pn, goodWords) then return true end end return false end local function readNumberAttr(o, keys) if not o then return nil end for _, k in ipairs(keys) do local v = o:GetAttribute(k) if typeof(v) == "number" then return v end local nv = o:FindFirstChild(k) if nv and (nv:IsA("NumberValue") or nv:IsA("IntValue")) then return nv.Value end end return nil end local function getValue(inst) local v = readNumberAttr(inst, valueKeys) if v then return v end local par = inst and inst.Parent if par and par ~= workspace then return readNumberAttr(par, valueKeys) end return nil end local function getWeight(inst) local w = readNumberAttr(inst, weightKeys) if w then return w end local par = inst and inst.Parent if par and par ~= workspace then return readNumberAttr(par, weightKeys) end return nil end local function fmt(n) local s = tostring(math.floor(n + 0.5)) local r = s:reverse():gsub("(%d%d%d)", "%1,"):reverse() return (r:gsub("^,", "")) end local function fmtWeight(w) if w >= 10 then return tostring(math.floor(w + 0.5)) end local s = string.format("%.1f", w) if s:sub(-2) == ".0" then return s:sub(1, -3) end return s end local function resolvePart(prompt) local p = prompt.Parent if not p then return nil end if p:IsA("BasePart") then return p end if p:IsA("Attachment") then local pp = p.Parent return (pp and pp:IsA("BasePart")) and pp or nil end if p:IsA("Model") then return p.PrimaryPart or p:FindFirstChildWhichIsA("BasePart", true) end return p:FindFirstChildWhichIsA("BasePart", true) end local function displayName(inst) local base = inst if inst:IsA("Attachment") and inst.Parent then base = inst.Parent end if base:IsA("BasePart") and genericNames[base.Name:lower()] and base.Parent and base.Parent ~= workspace then return base.Parent.Name end return base.Name end local prompts, monsters, spawnPoints = {}, {}, {} local function addPrompt(prompt) if prompts[prompt] then return end local inst = prompt.Parent if not inst then return end local name = displayName(inst) local nameLower = name:lower() local loot = isLoot(inst, nameLower) prompts[prompt] = { inst = inst, part = resolvePart(prompt), name = name, nameLower = nameLower, loot = loot, } if loot and Config.InstantPrompt then setInstant(prompt, true) end end local function handleDescendant(d) if d:IsA("ProximityPrompt") then addPrompt(d) elseif d:IsA("Humanoid") then local m = d.Parent if m and m:IsA("Model") then monsters[m] = true end elseif d:IsA("SpawnLocation") then spawnPoints[#spawnPoints + 1] = d.Position end end local function handleChild(obj) if obj:IsA("Model") then if obj:GetAttribute("EntityKind") ~= nil or hasWord(obj.Name:lower(), monsterWords) then monsters[obj] = true end end end connect(workspace.DescendantAdded, function(d) pcall(handleDescendant, d) end) connect(workspace.DescendantRemoving, function(d) if d:IsA("ProximityPrompt") then setInstant(d, false) prompts[d] = nil elseif d:IsA("Humanoid") then if d.Parent then monsters[d.Parent] = nil end end end) connect(workspace.ChildAdded, function(c) pcall(handleChild, c) end) task.spawn(function() for _, c in ipairs(workspace:GetChildren()) do pcall(handleChild, c) end local n = 0 for _, d in ipairs(workspace:GetDescendants()) do if not running then return end pcall(handleDescendant, d) n += 1 if n % 400 == 0 then task.wait() end end end) -- ==================== МОНСТРЫ (IsEntity / EntityKind) ==================== local posTrack = setmetatable({}, {__mode = "k"}) local function nearSpawn(pos) for _, sp in ipairs(spawnPoints) do if (sp - pos).Magnitude <= Config.SpawnRadius then return true end end return false end local function isMonsterPlayer(plr) if not plr or plr == LocalPlayer then return false end if plr:GetAttribute("IsEntity") == true then return true end local kind = plr:GetAttribute("EntityKind") if kind ~= nil and kind ~= "" then return true end local char = plr.Character if char then if char:GetAttribute("IsEntity") == true then return true end if char:GetAttribute("EntityKind") ~= nil then return true end end return false end local function getEntityLabel(model, plr) local kind = model and model:GetAttribute("EntityKind") if not kind and plr then kind = plr:GetAttribute("EntityKind") end if typeof(kind) == "string" and kind ~= "" then if plr then return plr.Name .. " [" .. kind .. "]" end return tostring(kind) end if plr then return plr.Name .. " [ENTITY]" end return (model and model.Name) or "ENTITY" end local function isStale(model, part, now) local hum = model:FindFirstChildOfClass("Humanoid") if hum and hum.Health <= 0 then return true end if model:GetAttribute("EntityKind") ~= nil then return false end local owner = Players:GetPlayerFromCharacter(model) if owner and (owner:GetAttribute("IsEntity") == true or owner:GetAttribute("EntityKind") ~= nil) then return false end if Config.HideInvisible then local parts, visible = 0, 0 for _, c in ipairs(model:GetChildren()) do if c:IsA("BasePart") and c.Name ~= "HumanoidRootPart" then parts += 1 if c.Transparency < 0.95 then visible += 1 break end end end if parts > 0 and visible == 0 then return true end end if not owner then local pos = part.Position local tr = posTrack[model] if not tr then tr = {pos = pos, t = now} posTrack[model] = tr elseif (pos - tr.pos).Magnitude > 0.5 then tr.pos, tr.t = pos, now end local limit = part.Anchored and 8 or Config.StaleSeconds if now - tr.t > limit and nearSpawn(pos) then return true end end return false end -- ==================== ESP UI ==================== local function newTag(color, height) local bb = Instance.new("BillboardGui") bb.Size = UDim2.new(0, 150, 0, height) bb.StudsOffset = Vector3.new(0, 2.5, 0) bb.AlwaysOnTop = true bb.MaxDistance = Config.MaxDistance bb.Enabled = false bb.Parent = espFolder local l = Instance.new("TextLabel") l.Size = UDim2.new(1, 0, 1, 0) l.BackgroundTransparency = 1 l.TextColor3 = color l.TextStrokeTransparency = 0.4 l.Font = Enum.Font.GothamBold l.TextSize = 11 l.Parent = bb return {bb = bb, label = l} end local function setTag(tag, part, text, color) if not part or not part.Parent then return end local bb = tag.bb if bb.Adornee ~= part then bb.Adornee = part end if tag.label.Text ~= text then tag.label.Text = text end if color and tag.label.TextColor3 ~= color then tag.label.TextColor3 = color end if not bb.Enabled then bb.Enabled = true end end local function hideTag(tag) if tag.bb.Enabled then tag.bb.Enabled = false tag.bb.Adornee = nil end end local function hidePoolFrom(pool, from) for i = from, #pool do hideTag(pool[i]) end end local itemPool, monsterPool, monsterHL, playerTags = {}, {}, {}, {} local function getPoolTag(pool, i, color, height) if not pool[i] then pool[i] = newTag(color, height) end return pool[i] end local function getHighlight(i) if not monsterHL[i] then local h = Instance.new("Highlight") h.FillTransparency = 0.7 h.OutlineTransparency = 0 h.FillColor = Color3.fromRGB(255, 40, 40) h.OutlineColor = Color3.fromRGB(255, 80, 80) h.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop h.Enabled = false h.Parent = espFolder monsterHL[i] = h end return monsterHL[i] end connect(Players.PlayerRemoving, function(plr) if playerTags[plr] then pcall(function() playerTags[plr].bb:Destroy() end) playerTags[plr] = nil end end) -- Stamina local staminaList, seenMax, stamWarned = {}, setmetatable({}, {__mode = "k"}), false local function isStaminaName(n) n = n:lower() return n:find("stamina", 1, true) and not n:find("max", 1, true) and not n:find("regen", 1, true) and not n:find("drain", 1, true) and not n:find("cost", 1, true) end local function scanStamina() table.clear(staminaList) local char = LocalPlayer.Character local holders = {LocalPlayer} if char then holders[#holders + 1] = char local hum = char:FindFirstChildOfClass("Humanoid") if hum then holders[#holders + 1] = hum end end for _, h in ipairs(holders) do for k, v in pairs(h:GetAttributes()) do if typeof(v) == "number" and isStaminaName(k) then staminaList[#staminaList + 1] = {kind = "attr", obj = h, key = k} end end end local function checkVal(o) if (o:IsA("NumberValue") or o:IsA("IntValue")) and isStaminaName(o.Name) then staminaList[#staminaList + 1] = {kind = "val", obj = o} end end if char then for _, d in ipairs(char:GetDescendants()) do checkVal(d) end end for _, c in ipairs(LocalPlayer:GetChildren()) do checkVal(c) if c:IsA("Folder") then for _, cc in ipairs(c:GetChildren()) do checkVal(cc) end end end end local function bumpMax(obj, key, cur, extra) local t = seenMax[obj] if not t then t = {} seenMax[obj] = t end local m = math.max(t[key] or 0, cur, extra or 0) t[key] = m return m end local function fillStamina() for _, e in ipairs(staminaList) do local o = e.obj if o and o.Parent then if e.kind == "attr" then local cur = o:GetAttribute(e.key) if typeof(cur) == "number" then local extra = o:GetAttribute("MaxStamina") local m = bumpMax(o, e.key, cur, typeof(extra) == "number" and extra or nil) if cur < m then o:SetAttribute(e.key, m) end end else local m = bumpMax(o, "Value", o.Value) if o.Value < m then o.Value = m end end end end end env.SOD_Dump = function() print("======== SOD_Dump ========") for _, plr in ipairs(Players:GetPlayers()) do print("---", plr.Name) print(" IsEntity:", plr:GetAttribute("IsEntity")) print(" EntityKind:", plr:GetAttribute("EntityKind")) print(" isMonsterPlayer:", isMonsterPlayer(plr)) if plr.Character then print(" char.EntityKind:", plr.Character:GetAttribute("EntityKind")) print(" char.IsEntity:", plr.Character:GetAttribute("IsEntity")) end end print("--- workspace EntityKind ---") for _, obj in ipairs(workspace:GetChildren()) do if obj:IsA("Model") and obj:GetAttribute("EntityKind") ~= nil then print(" ", obj.Name, obj:GetAttribute("EntityKind")) end end print("==========================") end local found, mons, monPlr = {}, {}, {} local lastStatus, warnDist, startPosSaved = "", nil, false local function sortByDist(a, b) return a.dist < b.dist end local function tryAddMonster(model, origin, maxDist, now, label) if not model or not model.Parent then return end local part = model:FindFirstChild("HumanoidRootPart") or model.PrimaryPart or model:FindFirstChildWhichIsA("BasePart") if not part or not part.Parent then return end if isStale(model, part, now) then return end local dist = (part.Position - origin).Magnitude if dist > maxDist or dist < 2 then return end for i = 1, #mons do if mons[i].model == model then return end end mons[#mons + 1] = {model = model, part = part, dist = dist, label = label or model.Name} end local function hideWarn() warnDist = nil warnFrame.Visible = false end local function refreshESP() local char = LocalPlayer.Character local root = char and char:FindFirstChild("HumanoidRootPart") if not root then hidePoolFrom(itemPool, 1) hidePoolFrom(monsterPool, 1) for _, h in ipairs(monsterHL) do h.Enabled = false h.Adornee = nil end for _, t in pairs(playerTags) do hideTag(t) end hideWarn() return end local origin = root.Position local maxDist = Config.MaxDistance local now = os.clock() if not startPosSaved then startPosSaved = true spawnPoints[#spawnPoints + 1] = origin end -- ITEMS local itemsShown, itemsTotal = 0, 0 if Config.ItemESP then table.clear(found) local filter = Config.ItemFilter for prompt, e in pairs(prompts) do if e.loot and (not Config.HideDisabledPrompts or prompt.Enabled) and (filter == "" or e.nameLower:find(filter, 1, true)) then local part = e.part if not part or not part.Parent then part = resolvePart(prompt) e.part = part end if part and part.Parent then local dist = (part.Position - origin).Magnitude if dist <= maxDist then found[#found + 1] = {part = part, inst = e.inst, name = e.name, dist = dist} end end end end itemsTotal = #found table.sort(found, sortByDist) itemsShown = math.min(itemsTotal, Config.MaxItems) for i = 1, itemsShown do local d = found[i] local v = getValue(d.inst) local w = getWeight(d.inst) local hi = v and v >= Config.HighValue local line2 = {} if v then line2[#line2 + 1] = "$" .. fmt(v) end if w then line2[#line2 + 1] = fmtWeight(w) .. "kg" end line2[#line2 + 1] = math.floor(d.dist) .. "m" local text = (hi and "★ " or "") .. d.name .. "\n" .. table.concat(line2, " | ") setTag(getPoolTag(itemPool, i, Config.ItemColor, 34), d.part, text, hi and Config.HighValueColor or Config.ItemColor) end end hidePoolFrom(itemPool, itemsShown + 1) -- MONSTERS table.clear(mons) table.clear(monPlr) for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer and isMonsterPlayer(plr) and plr.Character then monPlr[plr] = true tryAddMonster(plr.Character, origin, maxDist, now, getEntityLabel(plr.Character, plr)) end end for _, obj in ipairs(workspace:GetChildren()) do if obj:IsA("Model") and obj:GetAttribute("EntityKind") ~= nil then local plr = Players:GetPlayerFromCharacter(obj) if plr ~= LocalPlayer then if plr then monPlr[plr] = true end tryAddMonster(obj, origin, maxDist, now, getEntityLabel(obj, plr)) end end end for model in pairs(monsters) do if not model.Parent then monsters[model] = nil posTrack[model] = nil elseif not Players:GetPlayerFromCharacter(model) and not Config.MonsterBlacklist[model.Name] then if model:GetAttribute("EntityKind") ~= nil or hasWord(model.Name:lower(), monsterWords) then tryAddMonster(model, origin, maxDist, now, getEntityLabel(model, nil)) end end end table.sort(mons, sortByDist) local monShown = 0 if Config.MonsterESP then for i = 1, math.min(#mons, Config.MaxMonsters) do local d = mons[i] monShown += 1 setTag(getPoolTag(monsterPool, monShown, Config.MonsterColor, 30), d.part, d.label .. "\n" .. math.floor(d.dist) .. "m", Config.MonsterColor) local h = getHighlight(monShown) if h.Adornee ~= d.model then h.Adornee = d.model end h.Enabled = true end end hidePoolFrom(monsterPool, monShown + 1) for i = monShown + 1, #monsterHL do monsterHL[i].Enabled = false monsterHL[i].Adornee = nil end local nearest = mons[1] if Config.MonsterWarn and nearest and nearest.dist <= Config.WarnDistance then warnDist = nearest.dist warnFrame.Visible = true local t = "!! ENTITY " .. math.floor(nearest.dist) .. "m !!" if warnText.Text ~= t then warnText.Text = t end else hideWarn() end -- PLAYERS for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer then local tag = playerTags[plr] local show = false if Config.PlayerESP and not monPlr[plr] then local pc = plr.Character local hrp = pc and pc:FindFirstChild("HumanoidRootPart") local hum = pc and pc:FindFirstChildOfClass("Humanoid") if hrp and hrp.Parent and (not hum or hum.Health > 0) then local dist = (hrp.Position - origin).Magnitude if dist <= maxDist then if not tag then tag = newTag(Config.PlayerColor, 28) playerTags[plr] = tag end setTag(tag, hrp, plr.Name .. "\n" .. math.floor(dist) .. "m", Config.PlayerColor) show = true end end end if not show and tag then hideTag(tag) end end end local st = string.format("I %d | E %d | S %d", itemsTotal, #mons, #staminaList) if st ~= lastStatus then lastStatus = st status.Text = st end end makeToggle("Item ESP", 38, "ItemESP") makeToggle("Monster ESP", 68, "MonsterESP") makeToggle("Player ESP", 98, "PlayerESP") makeToggle("FullBright", 128, "FullBright", function(v) if v then applyFullBright() else restoreLighting() end end) makeToggle("Inf Stamina", 158, "InfStamina") makeToggle("Instant Prompt", 188, "InstantPrompt", function(v) for prompt, e in pairs(prompts) do if e.loot then setInstant(prompt, v) end end end) makeToggle("Monster Warn", 218, "MonsterWarn", function(v) if not v then hideWarn() end end) local box = Instance.new("TextBox") box.Size = UDim2.new(1, -12, 0, 24) box.Position = UDim2.new(0, 6, 0, 250) box.BackgroundColor3 = COLOR_OFF box.BorderSizePixel = 0 box.Text = Config.ItemFilter box.PlaceholderText = "Фильтр предметов..." box.PlaceholderColor3 = Color3.fromRGB(120, 120, 130) box.TextColor3 = Color3.fromRGB(225, 225, 230) box.Font = Enum.Font.Gotham box.TextSize = 12 box.ClearTextOnFocus = false box.Parent = main Instance.new("UICorner", box).CornerRadius = UDim.new(0, 5) connect(box.FocusLost, function() Config.ItemFilter = (box.Text:lower():match("^%s*(.-)%s*$")) or "" markDirty() end) local function unload() running = false saveNow() for _, c in ipairs(connections) do pcall(function() c:Disconnect() end) end table.clear(connections) for prompt in pairs(prompts) do setInstant(prompt, false) end pcall(restoreLighting) pcall(function() gui:Destroy() end) env.SOD_Unload = nil print("[SOD] выгружен") end env.SOD_Unload = unload local unloadBtn = Instance.new("TextButton") unloadBtn.Size = UDim2.new(1, -12, 0, 24) unloadBtn.Position = UDim2.new(0, 6, 0, 280) unloadBtn.BackgroundColor3 = Color3.fromRGB(90, 30, 30) unloadBtn.Text = "Unload" unloadBtn.TextColor3 = Color3.fromRGB(235, 200, 200) unloadBtn.Font = Enum.Font.GothamBold unloadBtn.TextSize = 12 unloadBtn.Parent = main Instance.new("UICorner", unloadBtn).CornerRadius = UDim.new(0, 5) connect(unloadBtn.MouseButton1Click, unload) if Config.FullBright then pcall(applyFullBright) end pcall(scanStamina) local accESP, accStam, accLight, accSlow = 0, 0, 0, 0 connect(RunService.Heartbeat, function(dt) if not running then return end accESP += dt accStam += dt accLight += dt accSlow += dt if accESP >= Config.ESPInterval then accESP = 0 local ok, err = pcall(refreshESP) if not ok then warn("[SOD] ESP: " .. tostring(err)) end end if warnDist and warnFrame.Visible then local k = 1 - math.clamp(warnDist / Config.WarnDistance, 0, 1) local pulse = (math.sin(os.clock() * (6 + 8 * k)) + 1) / 2 warnStroke.Transparency = 1 - (0.35 + 0.5 * k) * (0.5 + 0.5 * pulse) end if accStam >= 0.25 then accStam = 0 if Config.InfStamina then pcall(fillStamina) end end if accLight >= 1 then accLight = 0 if Config.FullBright then pcall(applyFullBright) end if dirtyAt and os.clock() - dirtyAt > 1 then dirtyAt = nil saveNow() end end if accSlow >= 3 then accSlow = 0 pcall(scanStamina) pcall(function() for prompt, e in pairs(prompts) do local inst = e.inst if inst and inst.Parent then if not e.loot then local n = displayName(inst) if isLoot(inst, n:lower()) then e.loot, e.name, e.nameLower = true, n, n:lower() end end if e.loot and Config.InstantPrompt then setInstant(prompt, true) end end end end) end end) print("[SOD] Ultra Light v3.4 loaded — monster via IsEntity/EntityKind")