local RS = game:GetService("ReplicatedStorage") local Players = game:GetService("Players") local RunService = game:GetService("RunService") local Camera = workspace.CurrentCamera local LocalPlayer = Players.LocalPlayer local ok, WeaponConfig = pcall(function() return require(RS.Config.WeaponConfig) end) if not ok then WeaponConfig = nil end local Library local notifyText = Drawing.new("Text") notifyText.Font = 2 notifyText.Size = 14 notifyText.Outline = true notifyText.Color = Color3.new(1, 1, 1) notifyText.Position = Vector2.new(10, 50) notifyText.Center = true local function notify(msg) notifyText.Text = msg notifyText.Visible = true task.delay(4, function() for i = 1, 0, -0.05 do notifyText.Transparency = i task.wait() end notifyText.Visible = false notifyText.Transparency = 0 end) end local knifeBases = {"ButterflyKnife","ClassKnife","CordKnife","FlipKnife","GutKnife","OutDoorKnife","TacticalKnife","Karambit","Kukri","Wakizashi","CrookSword","Axe","Chainsaw","Shovel","Skeleton","RadishBlade","Lollipop","Trumpet","Bayonet_M9","BeamSaber","PrismTwins","ScalySawTeeth","Glove"} local sniperBases = {"SSG","Kar98k","AWP","M82A1","M200","DSR1","NTW20","WA2000","Sniper1","Sniper2","Specter","Crossbow"} local function isKnifeBase(base) for _, b in ipairs(knifeBases) do if base == b then return true end end return false end local function swapWeapon(baseKey, exoticKey) local base = WeaponConfig[baseKey] local exotic = WeaponConfig[exoticKey] if not base or not exotic then return end local baseFP = base.FirstPersonModel local exoFP = exotic.FirstPersonModel if typeof(baseFP) ~= "Instance" or typeof(exoFP) ~= "Instance" then return end local baseParent = baseFP.Parent local exoParent = exoFP.Parent local oldFP, oldTP = baseParent:FindFirstChild("FirstPerson"), baseParent:FindFirstChild("ThirdPerson") local newFP, newTP = exoParent:FindFirstChild("FirstPerson"), exoParent:FindFirstChild("ThirdPerson") if not newFP then newFP = exoFP end if oldFP and oldFP ~= newFP then oldFP.Name = "FirstPerson_OLD" end if oldTP and oldTP ~= newTP then oldTP.Name = "ThirdPerson_OLD" end local clonedFP = newFP:Clone(); clonedFP.Name = "FirstPerson"; clonedFP.Parent = baseParent base.FirstPersonModel = clonedFP if newTP then local clonedTP = newTP:Clone(); clonedTP.Name = "ThirdPerson"; clonedTP.Parent = baseParent end for name, anim in pairs(exotic.FakeArmAnims) do if typeof(anim) == "Instance" then base.FakeArmAnims[name] = anim end end for name, anim in pairs(exotic.CharacterAnims) do if typeof(anim) == "Instance" then base.CharacterAnims[name] = anim end end base.Display = exotic.Display base.Image = exotic.Image if exotic.SoundGroup and typeof(exotic.SoundGroup) == "Instance" then base.SoundGroup = exotic.SoundGroup:Clone() end if exotic.MeleeSeq then base.MeleeSeq = exotic.MeleeSeq end if exotic.ControllerComponents then base.ControllerComponents = exotic.ControllerComponents end notify("Done, respawn to see the changes.") end Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/deividcomsono/Obsidian/main/Library.lua", true))() local Window = Library:CreateWindow({ Title = "mspaint", Footer = "hub", AutoShow = true, ToggleKeybind = Enum.KeyCode.RightShift, }) local SkinsTab = Window:AddTab("Skins", "wand") if WeaponConfig then local allBases = {} for k, v in pairs(WeaponConfig) do if type(k) == "string" and not k:find("%.") and v.FirstPersonModel then allBases[k] = true end end local function getBaseKey(skinKey) if allBases[skinKey] then return skinKey end for segment in skinKey:gmatch("[^%.]+") do if allBases[segment] then return segment end end return skinKey:match("^([^%.]+)") end local goodSkins = {knives = {}, snipers = {}} for k, v in pairs(WeaponConfig) do if type(k) ~= "string" then continue end local sec = v.SecondaryRarity or "" if v.Rarity ~= "Mystic" or (sec ~= "Exotic" and sec ~= "Secret" and sec ~= "Souvenir") then continue end local base = getBaseKey(k) if not base or not WeaponConfig[base] then continue end local isKnife = isKnifeBase(base) local isSniper = false if not isKnife then for _, b in ipairs(sniperBases) do if base == b then isSniper = true; break end end end local entry = {key = k, display = v.Display or k, base = base} if isKnife then table.insert(goodSkins.knives, entry) end if isSniper then table.insert(goodSkins.snipers, entry) end end table.sort(goodSkins.knives, function(a, b) return a.display < b.display end) table.sort(goodSkins.snipers, function(a, b) return a.display < b.display end) local backups = {} local function backupBase(baseKey) if backups[baseKey] then return end local base = WeaponConfig[baseKey] if not base then return end local b = {Display = base.Display, Image = base.Image, SoundGroup = base.SoundGroup, MeleeSeq = base.MeleeSeq, ControllerComponents = base.ControllerComponents} local parent = base.FirstPersonModel and base.FirstPersonModel.Parent if parent then b.FP = parent:FindFirstChild("FirstPerson") b.TP = parent:FindFirstChild("ThirdPerson") end b.FakeArmAnims = {} for n, a in pairs(base.FakeArmAnims) do if typeof(a) == "Instance" then b.FakeArmAnims[n] = a end end b.CharacterAnims = {} for n, a in pairs(base.CharacterAnims) do if typeof(a) == "Instance" then b.CharacterAnims[n] = a end end backups[baseKey] = b end local function resetBase(baseKey) local base = WeaponConfig[baseKey] local b = backups[baseKey] if not base or not b then return end local parent = base.FirstPersonModel and base.FirstPersonModel.Parent if parent then local fp = parent:FindFirstChild("FirstPerson") local tp = parent:FindFirstChild("ThirdPerson") if fp and fp ~= b.FP then fp:Destroy() end if tp and tp ~= b.TP then tp:Destroy() end if b.FP then b.FP.Name = "FirstPerson"; b.FP.Parent = parent end if b.TP then b.TP.Name = "ThirdPerson"; b.TP.Parent = parent end end base.FirstPersonModel = b.FP base.Display = b.Display base.Image = b.Image base.SoundGroup = b.SoundGroup base.MeleeSeq = b.MeleeSeq base.ControllerComponents = b.ControllerComponents for n, a in pairs(b.FakeArmAnims) do base.FakeArmAnims[n] = a end for n, a in pairs(b.CharacterAnims) do base.CharacterAnims[n] = a end notify("Restored " .. baseKey) end local function applySkin(skinKey) local baseKey = getBaseKey(skinKey) if not baseKey or not WeaponConfig[baseKey] or not WeaponConfig[skinKey] then return end if isKnifeBase(baseKey) then baseKey = "ClassKnife" end if not WeaponConfig[baseKey] then return end backupBase(baseKey) swapWeapon(baseKey, skinKey) end local function buildDropdown(group, label, skins, defaultText) local names = {defaultText} for _, s in ipairs(skins) do table.insert(names, s.display) end group:AddDropdown(label .. "_Dropdown", { Text = "Select " .. label .. " Skin", Searchable = true, Values = names, Default = defaultText, Callback = function(value) if not value or value == defaultText then for b, _ in pairs(backups) do resetBase(b) end return end for _, s in ipairs(skins) do if s.display == value then applySkin(s.key) break end end end, }) end buildDropdown(SkinsTab:AddLeftGroupbox("Knives"), "Knife", goodSkins.knives, "Default") buildDropdown(SkinsTab:AddRightGroupbox("Snipers"), "Sniper", goodSkins.snipers, "Default") end local ESPTab = Window:AddTab("ESP", "eye") local MainGroup = ESPTab:AddLeftGroupbox("Visuals") local MAX_PLAYERS = 32 local LINES_PER_PLAYER = 17 local AllLines = {} local LineSlots = {} for i = 1, MAX_PLAYERS * LINES_PER_PLAYER do AllLines[i] = Drawing.new("Line") AllLines[i].Visible = false end local slotPool = {} for i = 1, MAX_PLAYERS do slotPool[i] = i end local function takeSlot(plr) if LineSlots[plr] then return end local s = table.remove(slotPool, 1) if s then LineSlots[plr] = s end end local function giveSlot(plr) local s = LineSlots[plr] if s then LineSlots[plr] = nil table.insert(slotPool, s) local o = (s - 1) * LINES_PER_PLAYER for j = 1, LINES_PER_PLAYER do AllLines[o + j].Visible = false end end end local function onCharAdded(plr) giveSlot(plr) takeSlot(plr) end local function onPlayerAdded(plr) if plr == LocalPlayer then return end takeSlot(plr) plr.CharacterAdded:Connect(function() onCharAdded(plr) end) end for _, plr in pairs(Players:GetPlayers()) do onPlayerAdded(plr) end Players.PlayerAdded:Connect(onPlayerAdded) Players.PlayerRemoving:Connect(giveSlot) local espEnabled = false local renderConn renderConn = RunService.RenderStepped:Connect(function() if not espEnabled then for i = 1, #AllLines do AllLines[i].Visible = false end return end local T = Library.Toggles local O = Library.Options local teamCheck = T.ESP_TeamCheck and T.ESP_TeamCheck.Value local maxDist = O.ESP_MaxDistance and O.ESP_MaxDistance.Value local boxColor = O.ESP_BoxColor and O.ESP_BoxColor.Value or Color3.fromRGB(255, 255, 255) local boxTransparency = O.ESP_BoxColor and O.ESP_BoxColor.Transparency or 0 local thickness = O.ESP_Thickness and O.ESP_Thickness.Value or 1 local cornerBox = T.ESP_CornerBox and T.ESP_CornerBox.Value for i = 1, #AllLines do AllLines[i].Visible = false end for plr, slot in pairs(LineSlots) do local char = plr.Character local root = char and char:FindFirstChild("HumanoidRootPart") local hum = char and char:FindFirstChildWhichIsA("Humanoid") local skip = not char or not root or not hum or hum.Health <= 0 if not skip and teamCheck and plr.Team == LocalPlayer.Team then skip = true end if not skip then local pos = root.Position local myRoot = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart") local dist = myRoot and (pos - myRoot.Position).Magnitude or 0 if maxDist and maxDist > 0 and dist > maxDist then skip = true end end if not skip then local viewportPos = Camera:WorldToViewportPoint(root.Position) if viewportPos.Z <= 0 then skip = true end end if skip then local o = (slot - 1) * LINES_PER_PLAYER for j = 1, LINES_PER_PLAYER do AllLines[o + j].Visible = false end else local pos = root.Position local screenPos = Camera:WorldToViewportPoint(pos) local scale = Camera:WorldToViewportPoint(pos + Vector3.new(0, 2.5, 0)).Y - Camera:WorldToViewportPoint(pos - Vector3.new(0, 2.5, 0)).Y local width = scale * 0.6 local height = scale local x, y = screenPos.X, screenPos.Y local left = x - width / 2 local right = x + width / 2 local top = y - height / 2 local bottom = y + height / 2 local o = (slot - 1) * LINES_PER_PLAYER if cornerBox then local cw = width * 0.25 local ch = height * 0.25 AllLines[o + 1].Color = Color3.new(0, 0, 0) AllLines[o + 1].Transparency = 0.8 AllLines[o + 1].Thickness = thickness + 2 AllLines[o + 1].From = Vector2.new(left, top) AllLines[o + 1].To = Vector2.new(left + cw, top) AllLines[o + 1].Visible = true AllLines[o + 2].Color = Color3.new(0, 0, 0) AllLines[o + 2].Transparency = 0.8 AllLines[o + 2].Thickness = thickness + 2 AllLines[o + 2].From = Vector2.new(left, top) AllLines[o + 2].To = Vector2.new(left, top + ch) AllLines[o + 2].Visible = true AllLines[o + 3].Color = Color3.new(0, 0, 0) AllLines[o + 3].Transparency = 0.8 AllLines[o + 3].Thickness = thickness + 2 AllLines[o + 3].From = Vector2.new(right, top) AllLines[o + 3].To = Vector2.new(right - cw, top) AllLines[o + 3].Visible = true AllLines[o + 4].Color = Color3.new(0, 0, 0) AllLines[o + 4].Transparency = 0.8 AllLines[o + 4].Thickness = thickness + 2 AllLines[o + 4].From = Vector2.new(right, top) AllLines[o + 4].To = Vector2.new(right, top + ch) AllLines[o + 4].Visible = true AllLines[o + 5].Color = Color3.new(0, 0, 0) AllLines[o + 5].Transparency = 0.8 AllLines[o + 5].Thickness = thickness + 2 AllLines[o + 5].From = Vector2.new(right, bottom) AllLines[o + 5].To = Vector2.new(right - cw, bottom) AllLines[o + 5].Visible = true AllLines[o + 6].Color = Color3.new(0, 0, 0) AllLines[o + 6].Transparency = 0.8 AllLines[o + 6].Thickness = thickness + 2 AllLines[o + 6].From = Vector2.new(right, bottom) AllLines[o + 6].To = Vector2.new(right, bottom - ch) AllLines[o + 6].Visible = true AllLines[o + 7].Color = Color3.new(0, 0, 0) AllLines[o + 7].Transparency = 0.8 AllLines[o + 7].Thickness = thickness + 2 AllLines[o + 7].From = Vector2.new(left, bottom) AllLines[o + 7].To = Vector2.new(left + cw, bottom) AllLines[o + 7].Visible = true AllLines[o + 8].Color = Color3.new(0, 0, 0) AllLines[o + 8].Transparency = 0.8 AllLines[o + 8].Thickness = thickness + 2 AllLines[o + 8].From = Vector2.new(left, bottom) AllLines[o + 8].To = Vector2.new(left, bottom - ch) AllLines[o + 8].Visible = true AllLines[o + 9].Color = boxColor AllLines[o + 9].Transparency = boxTransparency AllLines[o + 9].Thickness = thickness AllLines[o + 9].From = Vector2.new(left, top) AllLines[o + 9].To = Vector2.new(left + cw, top) AllLines[o + 9].Visible = true AllLines[o + 10].Color = boxColor AllLines[o + 10].Transparency = boxTransparency AllLines[o + 10].Thickness = thickness AllLines[o + 10].From = Vector2.new(left, top) AllLines[o + 10].To = Vector2.new(left, top + ch) AllLines[o + 10].Visible = true AllLines[o + 11].Color = boxColor AllLines[o + 11].Transparency = boxTransparency AllLines[o + 11].Thickness = thickness AllLines[o + 11].From = Vector2.new(right, top) AllLines[o + 11].To = Vector2.new(right - cw, top) AllLines[o + 11].Visible = true AllLines[o + 12].Color = boxColor AllLines[o + 12].Transparency = boxTransparency AllLines[o + 12].Thickness = thickness AllLines[o + 12].From = Vector2.new(right, top) AllLines[o + 12].To = Vector2.new(right, top + ch) AllLines[o + 12].Visible = true AllLines[o + 13].Color = boxColor AllLines[o + 13].Transparency = boxTransparency AllLines[o + 13].Thickness = thickness AllLines[o + 13].From = Vector2.new(right, bottom) AllLines[o + 13].To = Vector2.new(right - cw, bottom) AllLines[o + 13].Visible = true AllLines[o + 14].Color = boxColor AllLines[o + 14].Transparency = boxTransparency AllLines[o + 14].Thickness = thickness AllLines[o + 14].From = Vector2.new(right, bottom) AllLines[o + 14].To = Vector2.new(right, bottom - ch) AllLines[o + 14].Visible = true AllLines[o + 15].Color = boxColor AllLines[o + 15].Transparency = boxTransparency AllLines[o + 15].Thickness = thickness AllLines[o + 15].From = Vector2.new(left, bottom) AllLines[o + 15].To = Vector2.new(left + cw, bottom) AllLines[o + 15].Visible = true AllLines[o + 16].Color = boxColor AllLines[o + 16].Transparency = boxTransparency AllLines[o + 16].Thickness = thickness AllLines[o + 16].From = Vector2.new(left, bottom) AllLines[o + 16].To = Vector2.new(left, bottom - ch) AllLines[o + 16].Visible = true else AllLines[o + 1].Color = Color3.new(0, 0, 0) AllLines[o + 1].Transparency = 0.8 AllLines[o + 1].Thickness = thickness + 2 AllLines[o + 1].From = Vector2.new(left, top) AllLines[o + 1].To = Vector2.new(right, top) AllLines[o + 1].Visible = true AllLines[o + 2].Color = Color3.new(0, 0, 0) AllLines[o + 2].Transparency = 0.8 AllLines[o + 2].Thickness = thickness + 2 AllLines[o + 2].From = Vector2.new(right, top) AllLines[o + 2].To = Vector2.new(right, bottom) AllLines[o + 2].Visible = true AllLines[o + 3].Color = Color3.new(0, 0, 0) AllLines[o + 3].Transparency = 0.8 AllLines[o + 3].Thickness = thickness + 2 AllLines[o + 3].From = Vector2.new(right, bottom) AllLines[o + 3].To = Vector2.new(left, bottom) AllLines[o + 3].Visible = true AllLines[o + 4].Color = Color3.new(0, 0, 0) AllLines[o + 4].Transparency = 0.8 AllLines[o + 4].Thickness = thickness + 2 AllLines[o + 4].From = Vector2.new(left, bottom) AllLines[o + 4].To = Vector2.new(left, top) AllLines[o + 4].Visible = true AllLines[o + 5].Color = boxColor AllLines[o + 5].Transparency = boxTransparency AllLines[o + 5].Thickness = thickness AllLines[o + 5].From = Vector2.new(left, top) AllLines[o + 5].To = Vector2.new(right, top) AllLines[o + 5].Visible = true AllLines[o + 6].Color = boxColor AllLines[o + 6].Transparency = boxTransparency AllLines[o + 6].Thickness = thickness AllLines[o + 6].From = Vector2.new(right, top) AllLines[o + 6].To = Vector2.new(right, bottom) AllLines[o + 6].Visible = true AllLines[o + 7].Color = boxColor AllLines[o + 7].Transparency = boxTransparency AllLines[o + 7].Thickness = thickness AllLines[o + 7].From = Vector2.new(right, bottom) AllLines[o + 7].To = Vector2.new(left, bottom) AllLines[o + 7].Visible = true AllLines[o + 8].Color = boxColor AllLines[o + 8].Transparency = boxTransparency AllLines[o + 8].Thickness = thickness AllLines[o + 8].From = Vector2.new(left, bottom) AllLines[o + 8].To = Vector2.new(left, top) AllLines[o + 8].Visible = true end local tracers = T.ESP_Tracers and T.ESP_Tracers.Value if tracers then local tracerColor = O.ESP_TracerColor and O.ESP_TracerColor.Value or boxColor local tracerTransp = O.ESP_TracerColor and O.ESP_TracerColor.Transparency or 0 local bottom = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y) AllLines[o + 17].Color = tracerColor AllLines[o + 17].Transparency = tracerTransp AllLines[o + 17].Thickness = thickness AllLines[o + 17].From = bottom AllLines[o + 17].To = Vector2.new(x, y + height / 2) AllLines[o + 17].Visible = true end end end end) MainGroup:AddToggle("ESP_Enabled", { Text = "Bounding Box ESP", Default = false, Callback = function(value) espEnabled = value if not value then for i = 1, #AllLines do AllLines[i].Visible = false end end end, }) MainGroup:AddToggle("ESP_CornerBox", { Text = "Corner Box", Default = false, Visible = false }) MainGroup:AddToggle("ESP_Tracers", { Text = "Tracers", Default = false, Visible = false }) Library.Toggles.ESP_Enabled:OnChanged(function(value) Library.Toggles.ESP_CornerBox:SetVisible(value) Library.Toggles.ESP_Tracers:SetVisible(value) end) local ESPOptions = ESPTab:AddRightGroupbox("Options") ESPOptions:AddToggle("ESP_TeamCheck", { Text = "Team Check", Default = false }) ESPOptions:AddSlider("ESP_MaxDistance", { Text = "Max Distance", Default = 500, Min = 0, Max = 1000, Rounding = 0, Suffix = " studs", Compact = false }) ESPOptions:AddSlider("ESP_Thickness", { Text = "Outline Thickness", Default = 1, Min = 1, Max = 6, Rounding = 0, Compact = false }) ESPOptions:AddLabel("Box Color"):AddColorPicker("ESP_BoxColor", { Default = Color3.fromRGB(255, 255, 255), Transparency = 1 }) ESPOptions:AddLabel("Tracer Color"):AddColorPicker("ESP_TracerColor", { Default = Color3.fromRGB(255, 255, 255), Transparency = 1 }) local SettingsTab = Window:AddTab("Settings", "settings") local SettingsGroup = SettingsTab:AddLeftGroupbox("General") SettingsGroup:AddButton({ Text = "Unload Script", Func = function() Library:Unload() end }) Library:OnUnload(function() if renderConn then renderConn:Disconnect() end for i = 1, #AllLines do AllLines[i]:Remove() end table.clear(AllLines) table.clear(LineSlots) end)